fix(i18n): localize provider errors and shared/native UI labels (#34680)

* fix(i18n): localize provider failures and remaining shared UI copy

Translate Linear/Jira failures at the renderer boundary while preserving
English errors and adding optional stable codes for existing clients.
Localize host status, source-control metadata, discard confirmations,
native dialogs, and catalog gaps across all six shipped locales.

Inventory and reproduction paths contributed in #32207.

Co-authored-by: Seiji Kohara <9543980+seijikohara@users.noreply.github.com>
Co-authored-by: Evgenii <413011+smwbev@users.noreply.github.com>

* test(i18n): assert stable task provider failure codes

* test(i18n): exercise goal notice fallback with an older language pack

* fix(i18n): address provider error and live title review findings

Handle missing remote error text, type provider codes and keep codes intact
through connection tests and optimistic edits. Fix the remaining Linear
load fallback and redundant translation calls, apply Japanese wording
corrections, and refresh native titles on language changes.

Co-authored-by: Seiji Kohara <9543980+seijikohara@users.noreply.github.com>

* fix(i18n): finish provider and shared-copy localization for all locales

- Translate the branch's new keys into de, ru, tr and zh-Hant (added to main
  after this branch was cut), with Russian few/many forms.
- Use whole sentences for file deletion failures and the mixed batch notice
  instead of inserting a 'Recycle Bin'/'Trash' word, and count keys for the
  batch titles.
- Translate the workspace/activity options filter count (was a shared
  'N filter(s)' literal) at the renderer call sites.
- Use _one/_other families for MCP server counts, untracked-file discard copy,
  resume-chat counts, discard file counts and visible host counts.
- Localize PR/MR card status labels, the unsupported-agent hint, Linear title/
  description update failures, the Linear 'showing first N' notice and the
  Linear Connect button.

Co-authored-by: Evgenii <413011+smwbev@users.noreply.github.com>

---------

Co-authored-by: Seiji Kohara <9543980+seijikohara@users.noreply.github.com>
Co-authored-by: Evgenii <413011+smwbev@users.noreply.github.com>
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
This commit is contained in:
Jinjing
2026-10-28 14:49:17 -07:00
committed by GitHub
co-authored by Evgenii Seiji Kohara OrcaWin
parent 18b5ee3a4f
commit af14a5b50b
113 changed files with 4537 additions and 583 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ import process from 'node:process'
import { repairTranslatedValue } from './locale-translation-policy.mjs'
const LOCALES_DIR = path.join('src', 'renderer', 'src', 'i18n', 'locales')
const SUPPORTED_LOCALES = new Set(['de', 'es', 'fr', 'ja', 'ko', 'ru', 'zh'])
const SUPPORTED_LOCALES = new Set(['de', 'es', 'fr', 'ja', 'ko', 'pt', 'ru', 'tr', 'zh', 'zh-Hant'])
const PLACEHOLDER_RE = /\{\{[^}]+\}\}/g
function placeholders(value) {
@@ -1,3 +1,4 @@
import { translateMain } from '../../i18n/main-i18n'
import { dialog, session, type BrowserWindow } from 'electron'
import { summarizePartitionSkips } from './browser-cookie-partition-summary'
import type {
@@ -147,10 +148,10 @@ export async function importValidatedCookies(
// Main owns the file picker so a compromised renderer cannot request arbitrary file reads.
export async function pickCookieFile(parentWindow: BrowserWindow | null): Promise<string | null> {
const opts = {
title: 'Import Cookies',
title: translateMain('native.dialog.importCookies', 'Import Cookies'),
filters: [
{ name: 'Cookie Files', extensions: ['json'] },
{ name: 'All Files', extensions: ['*'] }
{ name: translateMain('native.dialog.cookieFiles', 'Cookie Files'), extensions: ['json'] },
{ name: translateMain('native.dialog.allFiles', 'All Files'), extensions: ['*'] }
],
properties: ['openFile' as const]
}
+12 -8
View File
@@ -1,3 +1,4 @@
import { taskProviderFailure } from '../../../shared/task-provider-failure'
import { JiraIssueListFiltersParam } from '../../../shared/rpc-contract/jira-quick-filter-params'
import { JiraFavouriteFilterParams } from '../../../shared/rpc-contract/jira-favourite-filter-params'
import { ipcMain } from 'electron'
@@ -39,7 +40,10 @@ export function registerJiraHandlers(): void {
typeof args?.email !== 'string' ||
typeof args?.apiToken !== 'string'
) {
return { ok: false, error: 'Site URL, email, and API token are required.' }
return taskProviderFailure(
'jira.credentialsRequired',
'Site URL, email, and API token are required.'
)
}
const result = await connect({
siteUrl: args.siteUrl,
@@ -160,13 +164,13 @@ export function registerJiraHandlers(): void {
ipcMain.handle('jira:createIssue', async (_event, args: JiraCreateIssueArgs) => {
if (typeof args?.projectId !== 'string' || !args.projectId.trim()) {
return { ok: false, error: 'Project is required.' }
return taskProviderFailure('jira.projectRequired', 'Project is required.')
}
if (typeof args?.issueTypeId !== 'string' || !args.issueTypeId.trim()) {
return { ok: false, error: 'Issue type is required.' }
return taskProviderFailure('jira.issueTypeRequired', 'Issue type is required.')
}
if (typeof args?.title !== 'string' || !args.title.trim()) {
return { ok: false, error: 'Title is required.' }
return taskProviderFailure('jira.titleRequired', 'Title is required.')
}
return createIssue({
siteId: normalizeJiraSiteId(args.siteId),
@@ -186,11 +190,11 @@ export function registerJiraHandlers(): void {
'jira:updateIssue',
async (_event, args: { key: string; updates: JiraIssueUpdate; siteId?: string }) => {
if (typeof args?.key !== 'string' || !args.key.trim()) {
return { ok: false, error: 'Issue key is required.' }
return taskProviderFailure('jira.issueKeyRequired', 'Issue key is required.')
}
const updates = normalizeJiraIssueUpdate(args.updates)
if (!updates) {
return { ok: false, error: 'Updates object is required.' }
return taskProviderFailure('jira.updatesRequired', 'Updates object is required.')
}
return updateIssue(args.key.trim(), updates, normalizeJiraSiteId(args.siteId))
}
@@ -200,10 +204,10 @@ export function registerJiraHandlers(): void {
'jira:addIssueComment',
async (_event, args: { key: string; body: string; siteId?: string }) => {
if (typeof args?.key !== 'string' || !args.key.trim()) {
return { ok: false, error: 'Issue key is required.' }
return taskProviderFailure('jira.issueKeyRequired', 'Issue key is required.')
}
if (typeof args?.body !== 'string' || !args.body.trim()) {
return { ok: false, error: 'Comment body is required.' }
return taskProviderFailure('jira.commentBodyRequired', 'Comment body is required.')
}
return addIssueComment(args.key.trim(), args.body.trim(), normalizeJiraSiteId(args.siteId))
}
+2 -1
View File
@@ -1,3 +1,4 @@
import { translateMain } from '../i18n/main-i18n'
import { BrowserWindow, dialog } from 'electron'
import { mkdir, readFile, rename, rm, stat } from 'node:fs/promises'
import { randomUUID } from 'node:crypto'
@@ -18,7 +19,7 @@ export async function importPetBundle(
BrowserWindow.fromWebContents(event.sender) ?? BrowserWindow.getFocusedWindow()
// Finder may select pet.json inside the bundle; accept it and use its parent.
const options: Electron.OpenDialogOptions = {
title: 'Pick a .codex-pet bundle',
title: translateMain('native.dialog.importPetBundle', 'Pick a .codex-pet bundle'),
properties: ['openFile', 'openDirectory', 'treatPackageAsDirectory']
}
const result = senderWindow
+3 -2
View File
@@ -1,3 +1,4 @@
import { translateMain } from '../i18n/main-i18n'
import { BrowserWindow, dialog, ipcMain } from 'electron'
import { copyFile, mkdir, readFile, rm, stat } from 'node:fs/promises'
import { randomUUID } from 'node:crypto'
@@ -21,12 +22,12 @@ export function registerPetHandlers(): void {
const senderWindow =
BrowserWindow.fromWebContents(event.sender) ?? BrowserWindow.getFocusedWindow()
const options: Electron.OpenDialogOptions = {
title: 'Pick pet',
title: translateMain('native.dialog.pickPet', 'Pick pet'),
properties: ['openFile'],
// APNG uses .png; its missing macOS UTI can hide other formats when listed separately.
filters: [
{
name: 'Pet image',
name: translateMain('native.dialog.petImage', 'Pet image'),
extensions: ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg']
}
]
+17 -3
View File
@@ -1,3 +1,4 @@
import { translateMain } from '../i18n/main-i18n'
import { validatePathExistenceBatch } from '../../shared/path-existence-batch'
import { ipcMain, shell, dialog } from 'electron'
import { constants, copyFile, readFile, stat } from 'node:fs/promises'
@@ -240,7 +241,10 @@ export function registerShellHandlers(
const result = await dialog.showOpenDialog({
properties: ['openFile'],
filters: [
{ name: 'Images', extensions: ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp', 'ico'] }
{
name: translateMain('native.dialog.images', 'Images'),
extensions: ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp', 'ico']
}
]
})
if (result.canceled || result.filePaths.length === 0) {
@@ -254,7 +258,12 @@ export function registerShellHandlers(
async (): Promise<{ dataUrl: string; fileName: string } | null> => {
const result = await dialog.showOpenDialog({
properties: ['openFile'],
filters: [{ name: 'Repo icon images', extensions: ['png'] }]
filters: [
{
name: translateMain('native.dialog.repoIconImages', 'Repo icon images'),
extensions: ['png']
}
]
})
if (result.canceled || result.filePaths.length === 0) {
return null
@@ -283,7 +292,12 @@ export function registerShellHandlers(
ipcMain.handle('shell:pickAudio', async (): Promise<string | null> => {
const result = await dialog.showOpenDialog({
properties: ['openFile'],
filters: [{ name: 'Audio', extensions: ['ogg', 'mp3', 'wav', 'm4a', 'aac', 'flac'] }]
filters: [
{
name: translateMain('native.dialog.audio', 'Audio'),
extensions: ['ogg', 'mp3', 'wav', 'm4a', 'aac', 'flac']
}
]
})
if (result.canceled || result.filePaths.length === 0) {
return null
+12 -3
View File
@@ -358,7 +358,8 @@ describe('Jira client credential storage', () => {
await expect(jira.testConnection(siteId)).resolves.toEqual({
ok: false,
error: 'Not connected to Jira.'
error: 'Not connected to Jira.',
errorCode: 'jira.notConnected'
})
expect(fetchMock).not.toHaveBeenCalled()
@@ -555,7 +556,11 @@ describe('Jira client credential storage', () => {
apiToken: '',
authType: 'server'
})
).resolves.toEqual({ ok: false, error: 'Personal access token is required.' })
).resolves.toEqual({
ok: false,
error: 'Personal access token is required.',
errorCode: 'jira.personalTokenRequired'
})
expect(netFetchMock).not.toHaveBeenCalled()
})
@@ -569,7 +574,11 @@ describe('Jira client credential storage', () => {
apiToken: '',
authType: 'server'
})
).resolves.toEqual({ ok: false, error: 'Password is required.' })
).resolves.toEqual({
ok: false,
error: 'Password is required.',
errorCode: 'jira.passwordRequired'
})
expect(netFetchMock).not.toHaveBeenCalled()
})
+16 -10
View File
@@ -1,3 +1,4 @@
import { taskProviderFailure } from '../../shared/task-provider-failure'
import { CredentialDecryptionError } from '../integration-credential-file'
import type {
JiraAuthType,
@@ -82,7 +83,7 @@ export async function connect(
try {
siteUrl = normalizeJiraSiteUrl(args.siteUrl)
} catch {
return { ok: false, error: 'Enter a valid Jira site URL.' }
return taskProviderFailure('jira.invalidSiteUrl', 'Enter a valid Jira site URL.')
}
const authType: JiraAuthType = args.authType === 'server' ? 'server' : 'cloud'
@@ -92,13 +93,12 @@ export async function connect(
if (!apiToken) {
// A username present means classic Basic auth (password); its absence
// means the credential is a personal access token sent as Bearer.
return {
ok: false,
error: email ? 'Password is required.' : 'Personal access token is required.'
}
return email
? taskProviderFailure('jira.passwordRequired', 'Password is required.')
: taskProviderFailure('jira.personalTokenRequired', 'Personal access token is required.')
}
} else if (!apiToken) {
return { ok: false, error: 'API token is required.' }
return taskProviderFailure('jira.apiTokenRequired', 'API token is required.')
}
await acquire()
@@ -126,7 +126,9 @@ export async function connect(
})
return { ok: true, viewer }
} catch (error) {
return { ok: false, error: error instanceof Error ? error.message : 'Connection failed.' }
return error instanceof Error
? { ok: false, error: error.message }
: taskProviderFailure('jira.connectionFailed', 'Connection failed.')
} finally {
release()
}
@@ -167,10 +169,12 @@ export async function testConnection(
try {
client = getClients(siteId)[0]
} catch (error) {
return { ok: false, error: error instanceof Error ? error.message : 'Connection failed.' }
return error instanceof Error
? { ok: false, error: error.message }
: taskProviderFailure('jira.connectionFailed', 'Connection failed.')
}
if (!client) {
return { ok: false, error: 'Not connected to Jira.' }
return taskProviderFailure('jira.notConnected', 'Not connected to Jira.')
}
await acquire()
try {
@@ -180,7 +184,9 @@ export async function testConnection(
)
return { ok: true, viewer }
} catch (error) {
return { ok: false, error: error instanceof Error ? error.message : 'Connection failed.' }
return error instanceof Error
? { ok: false, error: error.message }
: taskProviderFailure('jira.connectionFailed', 'Connection failed.')
} finally {
release()
}
+15 -8
View File
@@ -1,3 +1,4 @@
import { taskProviderFailure } from '../../shared/task-provider-failure'
import type {
JiraCreateIssueArgs,
JiraCreateIssueResult,
@@ -31,11 +32,11 @@ function toUserFieldValue(site: JiraSite, value: unknown): unknown {
export async function createIssue(args: JiraCreateIssueArgs): Promise<JiraCreateIssueResult> {
const entry = getClients(args.siteId)[0]
if (!entry) {
return { ok: false, error: 'Not connected to Jira.' }
return taskProviderFailure('jira.notConnected', 'Not connected to Jira.')
}
const title = args.title.trim()
if (!title) {
return { ok: false, error: 'Title is required.' }
return taskProviderFailure('jira.titleRequired', 'Title is required.')
}
await acquire()
@@ -69,7 +70,9 @@ export async function createIssue(args: JiraCreateIssueArgs): Promise<JiraCreate
clearToken(entry.site.id)
throw error
}
return { ok: false, error: error instanceof Error ? error.message : 'Failed to create issue.' }
return error instanceof Error
? { ok: false, error: error.message }
: taskProviderFailure('jira.createFailed', 'Failed to create issue.')
} finally {
release()
}
@@ -82,10 +85,10 @@ export async function updateIssue(
): Promise<JiraMutationResult> {
const entry = getClients(siteId)[0]
if (!entry) {
return { ok: false, error: 'Not connected to Jira.' }
return taskProviderFailure('jira.notConnected', 'Not connected to Jira.')
}
if (updates.labels && updates.labelOperations) {
return { ok: false, error: 'Pass labels or labelOperations, not both.' }
return taskProviderFailure('jira.labelsConflict', 'Pass labels or labelOperations, not both.')
}
await acquire()
try {
@@ -141,7 +144,9 @@ export async function updateIssue(
clearToken(entry.site.id)
throw error
}
return { ok: false, error: error instanceof Error ? error.message : 'Failed to update issue.' }
return error instanceof Error
? { ok: false, error: error.message }
: taskProviderFailure('jira.updateFailed', 'Failed to update issue.')
} finally {
release()
}
@@ -154,7 +159,7 @@ export async function addIssueComment(
): Promise<{ ok: true; id: string } | { ok: false; error: string }> {
const entry = getClients(siteId)[0]
if (!entry) {
return { ok: false, error: 'Not connected to Jira.' }
return taskProviderFailure('jira.notConnected', 'Not connected to Jira.')
}
await acquire()
try {
@@ -172,7 +177,9 @@ export async function addIssueComment(
clearToken(entry.site.id)
throw error
}
return { ok: false, error: error instanceof Error ? error.message : 'Failed to add comment.' }
return error instanceof Error
? { ok: false, error: error.message }
: taskProviderFailure('jira.commentFailed', 'Failed to add comment.')
} finally {
release()
}
+2 -1
View File
@@ -374,7 +374,8 @@ describe('Linear client workspace storage', () => {
await expect(linear.testConnection('legacy')).resolves.toEqual({
ok: false,
error: 'No API key stored.'
error: 'No API key stored.',
errorCode: 'linear.noApiKey'
})
expect(linearClientMock).not.toHaveBeenCalled()
+3 -2
View File
@@ -1,3 +1,4 @@
import { taskProviderFailure } from '../../shared/task-provider-failure'
import type { LinearClient } from '@linear/sdk'
import { createLinearClient, loadLinearSdk } from './linear-sdk'
import { LEGACY_WORKSPACE_ID } from './linear-credential-paths'
@@ -196,7 +197,7 @@ export async function testConnection(
> {
const resolvedWorkspaceId = resolveWorkspaceId(workspaceId)
if (!resolvedWorkspaceId) {
return { ok: false, error: 'No API key stored.' }
return taskProviderFailure('linear.noApiKey', 'No API key stored.')
}
let token: string | null
try {
@@ -206,7 +207,7 @@ export async function testConnection(
return { ok: false, error: message }
}
if (!token) {
return { ok: false, error: 'No API key stored.' }
return taskProviderFailure('linear.noApiKey', 'No API key stored.')
}
try {
+3 -2
View File
@@ -1,3 +1,4 @@
import { taskProviderFailure } from '../../shared/task-provider-failure'
import type { LinearClient } from '@linear/sdk'
import type { LinearComment } from '../../shared/linear/issue-types'
import { acquire, release } from './linear-request-concurrency'
@@ -33,7 +34,7 @@ export async function addIssueComment(
> {
const entry = getClients(workspaceId)[0]
if (!entry) {
return { ok: false, error: 'Not connected to Linear' }
return taskProviderFailure('linear.notConnected', 'Not connected to Linear')
}
await acquire()
@@ -45,7 +46,7 @@ export async function addIssueComment(
...(options?.parentId ? { parentId: options.parentId } : {})
})
if (!result.success) {
return { ok: false, error: 'Failed to create comment' }
return taskProviderFailure('linear.commentFailed', 'Failed to create comment')
}
const comment = await result.comment
return {
+9 -5
View File
@@ -1,3 +1,4 @@
import { taskProviderFailure } from '../../shared/task-provider-failure'
import type { LinearClient } from '@linear/sdk'
import type { LinearIssueUpdate } from '../../shared/issue-mutation-types'
import { acquire, release } from './linear-request-concurrency'
@@ -38,7 +39,7 @@ export async function createIssue(
> {
const entry = getClients(workspaceId)[0]
if (!entry) {
return { ok: false, error: 'Not connected to Linear' }
return taskProviderFailure('linear.notConnected', 'Not connected to Linear')
}
await acquire()
@@ -58,11 +59,14 @@ export async function createIssue(
...(options?.labelIds ? { labelIds: options.labelIds } : {})
})
if (!result.success) {
return { ok: false, error: 'Linear create failed' }
return taskProviderFailure('linear.createFailed', 'Linear create failed')
}
const issue = await result.issue
if (!issue) {
return { ok: false, error: 'Issue was created but could not be retrieved' }
return taskProviderFailure(
'linear.createdButUnavailable',
'Issue was created but could not be retrieved'
)
}
return {
ok: true,
@@ -159,7 +163,7 @@ export async function updateIssue(
): Promise<{ ok: true } | { ok: false; error: string }> {
const entry = getClients(workspaceId)[0]
if (!entry) {
return { ok: false, error: 'Not connected to Linear' }
return taskProviderFailure('linear.notConnected', 'Not connected to Linear')
}
await acquire()
@@ -201,7 +205,7 @@ export async function updateIssue(
const result = await entry.client.updateIssue(id, payload)
if (!result.success) {
return { ok: false, error: 'Linear update failed' }
return taskProviderFailure('linear.updateFailed', 'Linear update failed')
}
return { ok: true }
} catch (error) {
+3 -2
View File
@@ -1,3 +1,4 @@
import { taskProviderFailure } from '../../shared/task-provider-failure'
import type { LinearProjectDetail, LinearProjectSummary } from '../../shared/linear/project-types'
import type {
LinearCollectionResult,
@@ -168,7 +169,7 @@ export async function createProject(
): Promise<{ ok: true; project: LinearProjectDetail } | { ok: false; error: string }> {
const entry = getClients(workspaceId)[0]
if (!entry) {
return { ok: false, error: 'Not connected to Linear' }
return taskProviderFailure('linear.notConnected', 'Not connected to Linear')
}
await acquire()
@@ -180,7 +181,7 @@ export async function createProject(
const payload = result.data?.projectCreate
const project = payload?.project
if (!payload?.success || !project) {
return { ok: false, error: 'Linear project create failed' }
return taskProviderFailure('linear.projectCreateFailed', 'Linear project create failed')
}
return { ok: true, project: mapProjectDetailForWorkspace(entry, project) }
} catch (error) {
+11 -8
View File
@@ -1,3 +1,4 @@
import { translateMain } from '../i18n/main-i18n'
export type GpuAccelerationAboutPanelOptions = {
appName: string
appVersion: string
@@ -11,26 +12,26 @@ export function describeGpuAcceleration(
gpuFallbackActive: boolean
): string {
if (gpuFallbackActive) {
return 'Disabled (Safe Graphics Mode)'
return translateMain('native.about.gpu.safeMode', 'Disabled (Safe Graphics Mode)')
}
const compositing = gpuFeatureStatus?.gpu_compositing.trim().toLowerCase()
if (!compositing || compositing === 'undefined') {
return 'Status unavailable'
return translateMain('native.about.gpu.unknownStatus', 'Status unavailable')
}
if (compositing === 'enabled') {
return 'Enabled'
return translateMain('native.about.gpu.enabled', 'Enabled')
}
if (compositing.includes('software')) {
return 'Software rendering'
return translateMain('native.about.gpu.software', 'Software rendering')
}
if (compositing.startsWith('disabled')) {
return 'Disabled'
return translateMain('native.about.gpu.disabled', 'Disabled')
}
if (compositing.startsWith('unavailable')) {
return 'Unavailable'
return translateMain('native.about.gpu.unavailable', 'Unavailable')
}
return `Unknown (${compositing})`
return translateMain('native.about.gpu.unknown', 'Unknown ({{status}})', { status: compositing })
}
export function createGpuAccelerationAboutPanelOptions({
@@ -40,7 +41,9 @@ export function createGpuAccelerationAboutPanelOptions({
gpuFallbackActive,
gpuFeatureStatus
}: GpuAccelerationAboutPanelOptions): Electron.AboutPanelOptionsOptions {
const status = `GPU acceleration: ${describeGpuAcceleration(gpuFeatureStatus, gpuFallbackActive)}`
const status = translateMain('native.about.gpu.summary', 'GPU acceleration: {{status}}', {
status: describeGpuAcceleration(gpuFeatureStatus, gpuFallbackActive)
})
return {
applicationName: appName,
applicationVersion: appVersion,
@@ -1,3 +1,4 @@
import { translateMain } from '../i18n/main-i18n'
import { createHash } from 'node:crypto'
import path from 'node:path'
import { BrowserWindow, dialog, type OpenDialogOptions, type WebContents } from 'electron'
@@ -39,9 +40,14 @@ export async function chooseManualWarpThemeFiles(webContents?: WebContents): Pro
> {
const ownerWindow = webContents ? BrowserWindow.fromWebContents(webContents) : null
const options: OpenDialogOptions = {
title: 'Import Warp Theme',
title: translateMain('native.dialog.importWarpTheme', 'Import Warp Theme'),
properties: ['openFile', 'multiSelections'],
filters: [{ name: 'Warp theme YAML', extensions: ['yaml', 'yml'] }]
filters: [
{
name: translateMain('native.dialog.warpThemeYaml', 'Warp theme YAML'),
extensions: ['yaml', 'yml']
}
]
}
const result = ownerWindow
? await dialog.showOpenDialog(ownerWindow, options)
@@ -73,7 +79,7 @@ export async function chooseManualWarpThemeFolderPath(
): Promise<string | null> {
const ownerWindow = webContents ? BrowserWindow.fromWebContents(webContents) : null
const options: OpenDialogOptions = {
title: 'Import Warp Theme Folder',
title: translateMain('native.dialog.importWarpFolder', 'Import Warp Theme Folder'),
properties: ['openDirectory']
}
const result = ownerWindow
@@ -1,4 +1,6 @@
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { setMainUiLanguage } from '../i18n/main-i18n'
import es from '../../renderer/src/i18n/locales/es.json'
type Display = { workArea: { x: number; y: number; width: number; height: number } }
@@ -48,6 +50,9 @@ const {
}
}
bounds = { x: 100, y: 100, width: 960, height: 720 }
setTitle = vi.fn((title: string) => {
this.options.title = title
})
focus = vi.fn()
show = vi.fn()
restore = vi.fn(() => {
@@ -201,6 +206,22 @@ describe('createOrFocusDashboardPopout', () => {
vi.clearAllMocks()
})
it('updates the title after language initialization and unsubscribes when closed', async () => {
// SAFETY: The fixture implements the Store methods exercised by the popout.
createOrFocusDashboardPopout(makeStore() as never)
const win = instances[0]
try {
await setMainUiLanguage('es')
expect(win.options.title).toBe(es.native.dialog.dashboardTitle)
closeDashboardPopout()
win.setTitle.mockClear()
await setMainUiLanguage('en')
expect(win.setTitle).not.toHaveBeenCalled()
} finally {
await setMainUiLanguage('en')
}
})
it('lets its preload expose saved WSL hosts in serve-only, and passes nothing otherwise', () => {
vi.stubEnv('ORCA_INTERNAL_WSL_HOSTS', undefined)
createOrFocusDashboardPopout(makeStore() as never)
+13 -1
View File
@@ -1,3 +1,4 @@
import { mainI18n, translateMain } from '../i18n/main-i18n'
import { app, BrowserWindow, nativeTheme, type WebContents, type Event } from 'electron'
import { join } from 'node:path'
import type { Store } from '../persistence'
@@ -148,7 +149,7 @@ export function createOrFocusDashboardPopout(
...(savedBounds ? { x: savedBounds.x, y: savedBounds.y } : {}),
minWidth: MIN_WIDTH,
minHeight: MIN_HEIGHT,
title: 'Orca Agent Dashboard',
title: translateMain('native.dialog.dashboardTitle', 'Orca Agent Dashboard'),
show: false,
autoHideMenuBar: true,
backgroundColor: nativeTheme.shouldUseDarkColors ? '#0a0a0a' : '#ffffff',
@@ -255,7 +256,18 @@ export function createOrFocusDashboardPopout(
window.on('close', freezeBounds)
app.on('before-quit', freezeBounds)
window.on('page-title-updated', (event) => {
event.preventDefault()
})
const updateTitle = (): void => {
if (!window.isDestroyed()) {
window.setTitle(translateMain('native.dialog.dashboardTitle', 'Orca Agent Dashboard'))
}
}
mainI18n.on('languageChanged', updateTitle)
window.on('closed', () => {
mainI18n.off('languageChanged', updateTitle)
app.removeListener('before-quit', freezeBounds)
unsubscribeUIChanged?.()
if (dashboardPopoutWindow === window) {
+13 -1
View File
@@ -1,3 +1,4 @@
import { mainI18n, translateMain } from '../i18n/main-i18n'
import { app, BrowserWindow, nativeTheme, type WebContents } from 'electron'
import { join } from 'node:path'
import { isBackgroundLaunch, showWindowWithoutStealingFocus } from './foreground-activation-policy'
@@ -51,7 +52,7 @@ export function createOrFocusWorkspaceSpaceWindow(store: Store): BrowserWindow {
height: 820,
minWidth: 700,
minHeight: 520,
title: 'Orca Space Beta',
title: translateMain('native.dialog.spaceTitle', 'Orca Space Beta'),
show: false,
autoHideMenuBar: true,
backgroundColor: nativeTheme.shouldUseDarkColors ? '#0a0a0a' : '#ffffff',
@@ -83,7 +84,18 @@ export function createOrFocusWorkspaceSpaceWindow(store: Store): BrowserWindow {
}
})
window.once('ready-to-show', () => showWindowWithoutStealingFocus(window))
window.on('page-title-updated', (event) => {
event.preventDefault()
})
const updateTitle = (): void => {
if (!window.isDestroyed()) {
window.setTitle(translateMain('native.dialog.spaceTitle', 'Orca Space Beta'))
}
}
mainI18n.on('languageChanged', updateTitle)
window.on('closed', () => {
mainI18n.off('languageChanged', updateTitle)
offUIChanged()
if (spaceWindow === window) {
spaceWindow = null
@@ -1,3 +1,4 @@
import { taskProviderErrorMessage } from '@/lib/task-provider-error-copy'
import { ImeTextarea } from '@/lib/ime-text-field'
import React, { useCallback, useRef, useState } from 'react'
import { LoaderCircle } from 'lucide-react'
@@ -102,7 +103,7 @@ export function LinearIssueTextEditor({
try {
const result = await linearUpdateIssue(providerSettings, issue.id, patch, issue.workspaceId)
if (!result.ok) {
throw new Error(result.error)
throw new Error(taskProviderErrorMessage(result))
}
} catch (error) {
const revert =
@@ -124,11 +125,12 @@ export function LinearIssueTextEditor({
toast.error(
error instanceof Error
? error.message
: translate(
'auto.components.LinearIssueTextEditor.e8ff595db3',
'Failed to update {{value0}}',
{ value0: field }
)
: field === 'title'
? translate('taskProviders.linear.titleUpdateFailed', 'Failed to update title')
: translate(
'taskProviders.linear.descriptionUpdateFailed',
'Failed to update description'
)
)
} finally {
if (mountedRef.current && lastIssueIdRef.current === issue.id) {
@@ -337,7 +337,7 @@ export function NativeChatResumeOccurrenceModal({
<span className="block text-xs text-muted-foreground">
{translate(
'auto.components.NativeChatResumeOnRestartModal.dontAskAgainHint',
'You can turn this off in Settings → Experimental → Chat UI.'
'You can turn this off in Settings → Chat → Behavior.'
)}
</span>
</span>
@@ -388,13 +388,14 @@ export function NativeChatResumeOccurrenceModal({
)
: chosen.length === 1
? translate(
'auto.components.NativeChatResumeOnRestartModal.resumeSelectedOne',
'Resume 1 chat'
'auto.components.NativeChatResumeOnRestartModal.resumeChats_one',
'Resume {{count}} chat',
{ count: chosen.length }
)
: translate(
'auto.components.NativeChatResumeOnRestartModal.resumeSelected',
'Resume {{value0}} chats',
{ value0: chosen.length }
'auto.components.NativeChatResumeOnRestartModal.resumeChats_other',
'Resume {{count}} chats',
{ count: chosen.length }
)}
</Button>
</>
@@ -18,7 +18,7 @@ import {
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { translate } from '@/i18n/i18n'
import { OptionsFilterCountBadge } from '@/components/sidebar/options-filter-count-badge'
import { formatActiveFilterLabel } from '../../../../shared/workspace-view/workspace-row-filters'
import { activeFilterCountLabel } from '../sidebar/active-filter-count-label'
import {
ActivityScopeFilterMenuItems,
useActivityScopeFilterCount
@@ -82,7 +82,7 @@ export function ActivityThreadOptionsMenu({
const skipCloseAutoFocusRef = React.useRef(false)
const activeFilterCount =
useActivityScopeFilterCount() + (onUnreadOnlyChange && unreadOnly ? 1 : 0)
const activeFilterLabel = formatActiveFilterLabel(activeFilterCount)
const activeFilterLabel = activeFilterCountLabel(activeFilterCount)
const optionsLabel =
activeFilterCount > 0
? translate(
@@ -1,9 +1,7 @@
import type { Automation } from '../../../../shared/automations-types'
import { getRepoExecutionHostId, parseExecutionHostId } from '../../../../shared/execution-host'
import {
describeRuntimeCompatBlock,
evaluateRuntimeCompat
} from '../../../../shared/protocol-compat'
import { evaluateRuntimeCompat } from '../../../../shared/protocol-compat'
import { describeRuntimeCompatBlock } from '@/lib/runtime-host-copy'
import {
MIN_COMPATIBLE_RUNTIME_SERVER_VERSION,
RUNTIME_PROTOCOL_VERSION
@@ -36,6 +36,7 @@ type DetectedBrowserEntry = {
selectedProfile: string
}
import { BROWSER_VIEWPORT_PRESETS } from '../../../../../shared/browser-viewport-presets'
import { browserViewportPresetLabel } from './browser-viewport-preset-label'
import { translate } from '@/i18n/i18n'
import {
BrowserChromeFoldedMenuItems,
@@ -265,7 +266,7 @@ export function BrowserToolbarMenuDropdown({
<DropdownMenuSeparator />
{BROWSER_VIEWPORT_PRESETS.map((preset) => (
<DropdownMenuRadioItem key={preset.id} value={preset.id}>
<span className="truncate">{preset.label}</span>
<span className="truncate">{browserViewportPresetLabel(preset)}</span>
</DropdownMenuRadioItem>
))}
</DropdownMenuRadioGroup>
@@ -0,0 +1,21 @@
import { translate } from '@/i18n/i18n'
import type { BrowserViewportPreset } from '../../../../../shared/browser-viewport-presets'
export function browserViewportPresetLabel(preset: BrowserViewportPreset): string {
switch (preset.id) {
case 'mobile-s':
return translate('browser.viewport.mobile-s', 'Mobile S — 320 × 568')
case 'mobile-m':
return translate('browser.viewport.mobile-m', 'Mobile M — 375 × 667')
case 'mobile-l':
return translate('browser.viewport.mobile-l', 'Mobile L — 425 × 812')
case 'tablet':
return translate('browser.viewport.tablet', 'Tablet — 768 × 1024')
case 'laptop':
return translate('browser.viewport.laptop', 'Laptop — 1024 × 768')
case 'laptop-l':
return translate('browser.viewport.laptop-l', 'Laptop L — 1440 × 900')
case 'desktop':
return translate('browser.viewport.desktop', 'Desktop — 1920 × 1080')
}
}
@@ -1,3 +1,4 @@
import { sourceControlModelLabel, sourceControlThinkingLabel } from './source-control-model-label'
import type { JSX } from 'react'
import { Terminal } from 'lucide-react'
import { CUSTOM_PROMPT_PLACEHOLDER } from '../../../../shared/commit-message-prompt'
@@ -116,10 +117,10 @@ export function AiCommitPrSettingsFields({
</Select>
{unsupportedAgentLabel ? (
<p className="col-start-2 text-[11px] leading-snug text-muted-foreground">
{unsupportedAgentLabel}{' '}
{translate(
'auto.components.feature.wall.AiCommitPrSettingsCard.4d9b6d84df',
'unsupported. Choose Claude, Codex, or Custom.'
'auto.components.feature.wall.AiCommitPrSettingsCard.unsupportedAgent',
'{{agent}} is not supported. Choose Claude, Codex, or Custom.',
{ agent: unsupportedAgentLabel }
)}
</p>
) : null}
@@ -137,7 +138,7 @@ export function AiCommitPrSettingsFields({
<SelectContent portalContainer={selectPortalRoot} position="popper" align="start">
{activeCapability.models.map((model) => (
<SelectItem key={model.id} value={model.id} className="cursor-pointer">
{model.label}
{sourceControlModelLabel(model)}
</SelectItem>
))}
</SelectContent>
@@ -160,7 +161,7 @@ export function AiCommitPrSettingsFields({
<SelectContent portalContainer={selectPortalRoot} position="popper" align="start">
{activeModel.thinkingLevels.map((level) => (
<SelectItem key={level.id} value={level.id} className="cursor-pointer">
{level.label}
{sourceControlThinkingLabel(level)}
</SelectItem>
))}
</SelectContent>
@@ -0,0 +1,32 @@
import { translate } from '@/i18n/i18n'
export function sourceControlModelLabel(model: { id: string; label: string }): string {
if (model.id === 'default' && model.label === 'Config default') {
return translate('sourceControl.model.configDefault', 'Config default')
}
if (model.id === 'auto' && model.label === 'Auto') {
return translate('sourceControl.model.auto', 'Auto')
}
return model.label
}
export function sourceControlThinkingLabel(level: { id: string; label: string }): string {
switch (level.id) {
case 'off':
return translate('sourceControl.thinking.off', 'Off')
case 'minimal':
return translate('sourceControl.thinking.minimal', 'Minimal')
case 'low':
return translate('sourceControl.thinking.low', 'Low')
case 'medium':
return translate('sourceControl.thinking.medium', 'Medium')
case 'high':
return translate('sourceControl.thinking.high', 'High')
case 'xhigh':
return translate('sourceControl.thinking.xhigh', 'Extra High')
case 'max':
return translate('sourceControl.thinking.max', 'Max')
default:
return level.label
}
}
@@ -8,10 +8,7 @@ import type {
GitHubProjectSummary
} from '../../../../shared/github/project-types'
import type { GitHubProjectViewError } from '../../../../shared/github/project-result-types'
import {
GITHUB_PROJECT_REF_INPUT_TOO_LARGE_ERROR,
isGitHubProjectRefInputTooLarge
} from '../../../../shared/github/project-ref-input'
import { isGitHubProjectRefInputTooLarge } from '../../../../shared/github/project-ref-input'
import {
githubProjectHost,
githubProjectIdentityKey
@@ -216,7 +213,10 @@ function ProjectPasteInput(props: Props): React.JSX.Element {
props.onPasteInputChange(
input,
isGitHubProjectRefInputTooLarge(input)
? GITHUB_PROJECT_REF_INPUT_TOO_LARGE_ERROR
? translate(
'projectViews.error.inputTooLarge',
'Project reference is too large to resolve.'
)
: null
)
}}
@@ -174,7 +174,10 @@ export function ProjectPickerPartialFailures({
{ failureCount: failures.length }
)
const detail = failures
.map((failure) => `${failure.owner === '*' ? 'orgs' : failure.owner}: ${failure.message}`)
.map(
(failure) =>
`${failure.owner === '*' ? translate('projectViews.picker.organizations', 'Organizations') : failure.owner}: ${failure.message}`
)
.join('\n')
return (
<div
@@ -1,3 +1,4 @@
import { translate } from '@/i18n/i18n'
// Store per-device visibility locally without modifying GitHub’s field definition or syncing cosmetic settings.
import type { GitHubProjectField, GitHubProjectView } from '../../../../shared/github/project-types'
@@ -8,7 +9,9 @@ export const TYPE_FIELD_DATA_TYPE = '__TYPE__'
export const TYPE_FIELD: GitHubProjectField = {
kind: 'field',
id: TYPE_FIELD_ID,
name: 'Type',
get name() {
return translate('projectViews.columns.type', 'Type')
},
dataType: TYPE_FIELD_DATA_TYPE
}
@@ -80,7 +80,11 @@ export function SlugDialogBody({
if (rid !== requestIdRef.current) {
return
}
setError(err instanceof Error ? err.message : 'Failed to load details')
setError(
err instanceof Error
? err.message
: translate('projectViews.picker.detailsFailed', 'Failed to load details')
)
})
.finally(() => {
if (rid !== requestIdRef.current) {
@@ -1,3 +1,4 @@
import { translate } from '@/i18n/i18n'
import type { RuntimeClientTarget } from '../../../../shared/runtime-client-target'
import { useCallback, useLayoutEffect, useRef, useState } from 'react'
import { useMountedRef } from '@/hooks/useMountedRef'
@@ -73,7 +74,10 @@ export function useProjectPickerBrowse(
if (mountedRef.current && activeCacheKeyRef.current === cacheKey) {
setBrowseError({
type: 'unknown',
message: error instanceof Error ? error.message : 'Failed to list projects'
message:
error instanceof Error
? error.message
: translate('projectViews.picker.listFailed', 'Failed to list projects')
})
}
} finally {
@@ -1,3 +1,5 @@
import { jiraCredentialStorageCopy } from './jira-credential-storage-copy'
import { taskProviderErrorMessage, taskProviderErrorText } from '@/lib/task-provider-error-copy'
import { useId, useLayoutEffect, useState } from 'react'
import { LoaderCircle, Lock } from 'lucide-react'
import { useAppStore } from '@/store'
@@ -90,9 +92,7 @@ export function JiraConnectDialog({
(!requiresIdentity || Boolean(email.trim())) &&
Boolean(apiToken.trim()) &&
connectState !== 'connecting'
const credentialStorageCopy = remoteRuntime
? 'Your token is sent to the selected remote runtime and stored there with runtime-supported encryption.'
: 'Your token is stored locally and encrypted when local runtime storage supports it.'
const credentialStorageCopy = jiraCredentialStorageCopy(remoteRuntime)
const clearErrorOnEdit = (): void => {
if (connectState === 'error') {
@@ -155,11 +155,15 @@ export function JiraConnectDialog({
return
}
setConnectState('error')
setConnectError(result.error)
setConnectError(taskProviderErrorMessage(result))
} catch (error) {
if (mountedRef.current) {
setConnectState('error')
setConnectError(error instanceof Error ? error.message : 'Connection failed')
setConnectError(
error instanceof Error
? taskProviderErrorText(error.message)
: translate('taskProviders.jira.connectionFailed', 'Connection failed')
)
}
}
}
@@ -0,0 +1,13 @@
import { translate } from '@/i18n/i18n'
export function jiraCredentialStorageCopy(remoteRuntime: boolean): string {
return remoteRuntime
? translate(
'taskProviders.jira.remoteTokenStorage',
'Your token is sent to the selected remote runtime and stored there with runtime-supported encryption.'
)
: translate(
'taskProviders.jira.localTokenStorage',
'Your token is stored locally and encrypted when local runtime storage supports it.'
)
}
@@ -1,3 +1,4 @@
import { taskProviderErrorMessage } from '@/lib/task-provider-error-copy'
import type { JiraIssue, JiraMutationResult } from '../../../shared/jira/jira-types'
import type { GlobalSettings } from '../../../shared/global-settings-types'
import type { TaskSourceContext } from '../../../shared/task-source-context'
@@ -113,7 +114,7 @@ export function enqueueJiraIssueMutation({
try {
const result = await update()
if (!result.ok) {
throw new Error(result.error)
throw new Error(taskProviderErrorMessage(result))
}
saved = true
write.confirmed = { ...write.confirmed, ...optimistic }
@@ -1,3 +1,4 @@
import { taskProviderErrorMessage, taskProviderErrorText } from '@/lib/task-provider-error-copy'
import { useState } from 'react'
import { ChevronDown, CircleAlert, ExternalLink, Loader2 } from 'lucide-react'
import { Button } from '@/components/ui/button'
@@ -53,12 +54,12 @@ export function JiraIssueTransitionControl({
setOpen(false)
reset()
} else {
setSubmitError(result.error)
setSubmitError(taskProviderErrorMessage(result))
}
} catch (error) {
setSubmitError(
error instanceof Error
? error.message
? taskProviderErrorText(error.message)
: translate(
'auto.components.JiraIssueWorkspace.ea21952aa3',
'Failed to update Jira issue.'
@@ -1,3 +1,4 @@
import { taskProviderErrorMessage, taskProviderErrorText } from '@/lib/task-provider-error-copy'
import { useId, useMemo, useState } from 'react'
import { ExternalLink, LoaderCircle, Lock } from 'lucide-react'
import type { LinearWorkspace } from '../../../shared/linear/workspace-types'
@@ -61,7 +62,11 @@ export function LinearApiKeyDialog({
const runtimeTarget = useMemo(() => defaultScopeHost(settings), [settings])
const personalKeyUrl = buildLinearPersonalApiKeySettingsUrl(workspace?.organizationUrlKey)
const workspaceApiUrl = buildLinearWorkspaceApiSettingsUrl(workspace?.organizationUrlKey)
const submitLabel = connectLabel ?? (workspace ? 'Update access' : 'Connect')
const submitLabel =
connectLabel ??
(workspace
? translate('taskProviders.linear.updateAccess', 'Update access')
: translate('taskProviders.linear.connect', 'Connect'))
const resolvedDialogState = resolveLinearApiKeyDialogState(dialogState, open)
if (resolvedDialogState !== dialogState) {
// Reset hidden drafts/errors before paint because parent closure can race a connect request.
@@ -99,14 +104,17 @@ export function LinearApiKeyDialog({
setDialogState((current) => ({
...current,
connectState: 'error',
connectError: result.error
connectError: taskProviderErrorMessage(result)
}))
} catch (error) {
if (mountedRef.current) {
setDialogState((current) => ({
...current,
connectState: 'error',
connectError: error instanceof Error ? error.message : 'Connection failed'
connectError:
error instanceof Error
? taskProviderErrorText(error.message)
: translate('taskProviders.linear.connectionFailed', 'Connection failed')
}))
}
}
@@ -114,16 +122,35 @@ export function LinearApiKeyDialog({
const resolvedTitle =
title ??
(workspace ? `Update Linear access for ${workspace.organizationName}` : 'Add Linear access')
(workspace
? translate(
'taskProviders.linear.updateWorkspaceAccess',
'Update Linear access for {{workspace}}',
{ workspace: workspace.organizationName }
)
: translate('taskProviders.linear.addAccess', 'Add Linear access'))
const resolvedDescription =
description ??
(workspace
? `Paste a Personal API key for ${workspace.organizationName}. If this workspace is already connected, Orca replaces its stored key.`
: 'Paste a Personal API key for the Linear workspace you want Orca to use. If that workspace is already connected, Orca replaces its stored key.')
? translate(
'taskProviders.linear.workspaceApiKeyHint',
'Paste a Personal API key for {{workspace}}. If this workspace is already connected, Orca replaces its stored key.',
{ workspace: workspace.organizationName }
)
: translate(
'taskProviders.linear.apiKeyHint',
'Paste a Personal API key for the Linear workspace you want Orca to use. If that workspace is already connected, Orca replaces its stored key.'
))
const storageCopy =
runtimeTarget.kind === 'environment'
? 'This key is stored by the active remote runtime.'
: 'Local runtime keys are stored on this device using Electron encrypted storage when available.'
? translate(
'taskProviders.linear.remoteKeyStorage',
'This key is stored by the active remote runtime.'
)
: translate(
'taskProviders.linear.localKeyStorage',
'Local runtime keys are stored on this device using Electron encrypted storage when available.'
)
return (
<Dialog open={open} onOpenChange={handleOpenChange}>
@@ -1,3 +1,4 @@
import { taskProviderErrorMessage, taskProviderErrorText } from '@/lib/task-provider-error-copy'
import React, { useCallback, useEffect, useRef, useState } from 'react'
import { Check, ChevronDown, FolderKanban, LoaderCircle } from 'lucide-react'
import { toast } from 'sonner'
@@ -56,7 +57,7 @@ export function LinearIssueProjectSelector({
if (mountedRef.current && requestId === searchRequestIdRef.current) {
toast.error(
error instanceof Error
? error.message
? taskProviderErrorText(error.message)
: translate(
'auto.components.LinearIssueWorkspace.38b80780c2',
'Failed to load projects'
@@ -94,12 +95,12 @@ export function LinearIssueProjectSelector({
)
setOpen(false)
} else {
toast.error(result.error)
toast.error(taskProviderErrorMessage(result))
}
} catch (error) {
toast.error(
error instanceof Error
? error.message
? taskProviderErrorText(error.message)
: translate(
'auto.components.LinearIssueWorkspace.8b5b593053',
'Failed to update project'
@@ -1,3 +1,4 @@
import { taskProviderErrorMessage, taskProviderErrorText } from '@/lib/task-provider-error-copy'
import { ImeInput } from '@/lib/ime-text-field'
import React, { useCallback, useMemo, useRef, useState } from 'react'
import { ArrowRight, LoaderCircle, Plus } from 'lucide-react'
@@ -71,7 +72,7 @@ export function LinearIssueSubIssues({
if (mountedRef.current && requestId === openRequestIdRef.current) {
toast.error(
error instanceof Error
? error.message
? taskProviderErrorText(error.message)
: translate(
'auto.components.LinearIssueWorkspace.9a1317cdd3',
'Failed to load sub-issue'
@@ -129,14 +130,14 @@ export function LinearIssueSubIssues({
setTitle('')
setOpen(false)
} else {
toast.error(result.error)
toast.error(taskProviderErrorMessage(result))
}
})
.catch((error) => {
if (mountedRef.current && requestId === createRequestIdRef.current) {
toast.error(
error instanceof Error
? error.message
? taskProviderErrorText(error.message)
: translate(
'auto.components.LinearIssueWorkspace.b25e453c9d',
'Failed to create sub-issue'
@@ -1,3 +1,5 @@
import { translate } from '@/i18n/i18n'
import { taskProviderErrorText } from '@/lib/task-provider-error-copy'
import { useCallback, useEffect, useRef, useState } from 'react'
import { createBrowserUuid } from '@/lib/browser-uuid'
@@ -126,7 +128,11 @@ export function useLinearIssueWorkspaceDetail({
})
.catch((error) => {
if (mountedRef.current && requestId === commentsRequestIdRef.current) {
setCommentsError(error instanceof Error ? error.message : 'Failed to load comments.')
setCommentsError(
error instanceof Error
? taskProviderErrorText(error.message)
: translate('taskProviders.linear.commentsLoadFailed', 'Failed to load comments.')
)
}
})
.finally(() => {
@@ -1,3 +1,4 @@
import { taskProviderErrorText } from '@/lib/task-provider-error-copy'
import { ImeTextarea } from '@/lib/ime-text-field'
import React, { useCallback, useRef, useState } from 'react'
import { LoaderCircle, Send } from 'lucide-react'
@@ -96,7 +97,7 @@ export function LinearIssueCommentFooter({
if (mountedRef.current) {
toast.error(
err instanceof Error
? err.message
? taskProviderErrorText(err.message)
: translate('auto.components.LinearItemDrawer.6ab35eafd5', 'Failed to add comment')
)
}
@@ -1,3 +1,4 @@
import { taskProviderErrorMessage, taskProviderErrorText } from '@/lib/task-provider-error-copy'
import { useCallback, useState } from 'react'
import { toast } from 'sonner'
@@ -77,7 +78,8 @@ export function useLinearIssueEditController({
useAppStore.getState().invalidateLinearIssueLists({ sourceContext })
useAppStore.getState().recordFeatureInteraction('linear-tasks')
},
onError: (err) => toast.error(err)
formatError: taskProviderErrorMessage,
onError: (err) => toast.error(taskProviderErrorText(err))
})
},
[
@@ -112,7 +114,8 @@ export function useLinearIssueEditController({
useAppStore.getState().invalidateLinearIssueLists({ sourceContext })
useAppStore.getState().recordFeatureInteraction('linear-tasks')
},
onError: (err) => toast.error(err)
formatError: taskProviderErrorMessage,
onError: (err) => toast.error(taskProviderErrorText(err))
})
},
[
@@ -145,7 +148,8 @@ export function useLinearIssueEditController({
onSuccess: () => {
useAppStore.getState().recordFeatureInteraction('linear-tasks')
},
onError: (err) => toast.error(err)
formatError: taskProviderErrorMessage,
onError: (err) => toast.error(taskProviderErrorText(err))
})
},
[
@@ -204,7 +208,8 @@ export function useLinearIssueEditController({
useAppStore.getState().invalidateLinearIssueLists({ sourceContext })
useAppStore.getState().recordFeatureInteraction('linear-tasks')
},
onError: (err) => toast.error(err)
formatError: taskProviderErrorMessage,
onError: (err) => toast.error(taskProviderErrorText(err))
})
},
[
@@ -260,7 +265,8 @@ export function useLinearIssueEditController({
useAppStore.getState().invalidateLinearIssueLists({ sourceContext })
useAppStore.getState().recordFeatureInteraction('linear-tasks')
},
onError: (err) => toast.error(err)
formatError: taskProviderErrorMessage,
onError: (err) => toast.error(taskProviderErrorText(err))
})
},
[
@@ -65,7 +65,7 @@ describe('Linear project view surfaces', () => {
]}
hasMore
count={50}
label="projects"
kind="projects"
onLoadMore={onLoadMore}
/>
)
@@ -1,3 +1,4 @@
import { taskProviderErrorText } from '@/lib/task-provider-error-copy'
import React from 'react'
import { ArrowLeft, ArrowRight, ExternalLink, Layers3, LoaderCircle, RefreshCw } from 'lucide-react'
@@ -31,11 +32,80 @@ type LinearProjectOverviewProps = {
onOpenIssues?: () => void
}
type LinearCollectionKind = 'views' | 'projects' | 'projectIssues' | 'viewIssues' | 'issues'
function linearCollectionTruncatedText(kind: LinearCollectionKind, count: number): string {
const values = { count }
const one = count === 1
switch (kind) {
case 'views':
return one
? translate(
'taskProviders.linear.truncated.views_one',
'Showing the first {{count}} view. Search or open Linear for the full set.',
values
)
: translate(
'taskProviders.linear.truncated.views_other',
'Showing the first {{count}} views. Search or open Linear for the full set.',
values
)
case 'projects':
return one
? translate(
'taskProviders.linear.truncated.projects_one',
'Showing the first {{count}} project. Search or open Linear for the full set.',
values
)
: translate(
'taskProviders.linear.truncated.projects_other',
'Showing the first {{count}} projects. Search or open Linear for the full set.',
values
)
case 'projectIssues':
return one
? translate(
'taskProviders.linear.truncated.projectIssues_one',
'Showing the first {{count}} project issue. Search or open Linear for the full set.',
values
)
: translate(
'taskProviders.linear.truncated.projectIssues_other',
'Showing the first {{count}} project issues. Search or open Linear for the full set.',
values
)
case 'viewIssues':
return one
? translate(
'taskProviders.linear.truncated.viewIssues_one',
'Showing the first {{count}} view issue. Search or open Linear for the full set.',
values
)
: translate(
'taskProviders.linear.truncated.viewIssues_other',
'Showing the first {{count}} view issues. Search or open Linear for the full set.',
values
)
case 'issues':
return one
? translate(
'taskProviders.linear.truncated.issues_one',
'Showing the first {{count}} issue. Search or open Linear for the full set.',
values
)
: translate(
'taskProviders.linear.truncated.issues_other',
'Showing the first {{count}} issues. Search or open Linear for the full set.',
values
)
}
}
type LinearCollectionNoticeProps = {
errors?: LinearWorkspaceError[]
hasMore?: boolean
count: number
label: string
kind: LinearCollectionKind
onLoadMore?: () => void
loading?: boolean
loadMoreLabel?: string
@@ -45,7 +115,7 @@ export function LinearCollectionNotice({
errors,
hasMore,
count,
label,
kind,
onLoadMore,
loading = false,
loadMoreLabel = 'Load more'
@@ -61,31 +131,19 @@ export function LinearCollectionNotice({
{errors.map((error) => (
<Badge key={`${error.workspaceId}-${error.type}`} variant="outline">
{error.workspaceName ?? error.workspaceId}:{' '}
{isIntegrationCredentialDecryptionError(error.message)
{isIntegrationCredentialDecryptionError(taskProviderErrorText(error.message))
? translate(
'auto.components.linear.project.view.surfaces.linearLoginUnreadable',
'Unable to read saved Linear login. Reconnect it in Settings.'
)
: error.message}
: taskProviderErrorText(error.message)}
</Badge>
))}
</div>
) : null}
{hasMore ? (
<div className="flex flex-wrap items-center justify-center gap-2 px-4 py-3">
{onLoadMore ? null : (
<span>
{translate(
'auto.components.linear.project.view.surfaces.06b887d622',
'Showing first'
)}{' '}
{count} {label}
{translate(
'auto.components.linear.project.view.surfaces.98730088a6',
'. Search or open Linear for the full set.'
)}
</span>
)}
{onLoadMore ? null : <span>{linearCollectionTruncatedText(kind, count)}</span>}
{onLoadMore ? (
<Button
type="button"
@@ -8,6 +8,7 @@ import {
CommandItem,
CommandList
} from '@/components/ui/command'
import { nativeChatModelDescription } from './native-chat-model-description'
import { translate } from '@/i18n/i18n'
import type { SessionOptionSelectChoice } from '../../../../shared/native-chat/input/native-chat-session-options'
import { nativeChatSessionChoiceLabel } from '../../../../shared/native-chat-session-option-labels'
@@ -93,7 +94,7 @@ export function NativeChatModelCombobox({
>
<NativeChatSessionOptionChoiceBody
label={label}
description={choice.description}
description={nativeChatModelDescription(choice.value, choice.description)}
/>
{/* Reserve the check slot so selecting a model cannot rewrap its label. */}
<span className="ml-auto flex size-3.5 shrink-0 items-center justify-center">
@@ -15,7 +15,22 @@ afterEach(async () => {
describe('desktop words for a write that did not happen', () => {
it('does not promise the old goal survived a refused replacement, including older translations', async () => {
for (const language of ['en', 'fr']) {
const id = 'plugin:example.older-french/fr' as const
const resourceLanguage = pluginLanguageResourceId(id)
setRendererPluginLanguagePacks([
{
id,
resourceLanguage,
pluginKey: 'example.older-french',
locale: 'fr',
catalog: {}
}
])
for (const [language, expected] of [
['en', "Couldn't finish changing the goal. Check the chat."],
['fr', 'Impossible de terminer la modification de l’objectif. Consultez le chat.'],
[resourceLanguage, "Couldn't finish changing the goal. Check the chat."]
]) {
await i18n.changeLanguage(language)
expect(
agentSessionWriteFailureText(
@@ -26,7 +41,7 @@ describe('desktop words for a write that did not happen', () => {
},
'goal'
)
).toContain("Couldn't finish changing the goal. Check the chat.")
).toContain(expected)
}
})
@@ -0,0 +1,57 @@
import { translate } from '@/i18n/i18n'
export function nativeChatModelDescription(
value: string,
description: string | undefined
): string | undefined {
switch (value) {
case 'grok-4.7':
return description === "xAI's latest frontier model"
? translate(
'components.native-chat.modelDescriptions.grok_4_7',
"xAI's latest frontier model"
)
: description
case 'grok-4.6':
return description === "xAI's previous frontier model"
? translate(
'components.native-chat.modelDescriptions.grok_4_6',
"xAI's previous frontier model"
)
: description
case 'grok-4.5':
return description === 'An earlier xAI frontier model'
? translate(
'components.native-chat.modelDescriptions.grok_4_5',
'An earlier xAI frontier model'
)
: description
case 'fable':
return description === 'Most capable for the hardest, longest-running tasks'
? translate(
'components.native-chat.modelDescriptions.fable',
'Most capable for the hardest, longest-running tasks'
)
: description
case 'opus':
return description === 'Best for everyday, complex tasks'
? translate(
'components.native-chat.modelDescriptions.opus',
'Best for everyday, complex tasks'
)
: description
case 'sonnet':
return description === 'Efficient for routine tasks'
? translate(
'components.native-chat.modelDescriptions.sonnet',
'Efficient for routine tasks'
)
: description
case 'haiku':
return description === 'Fastest for quick answers'
? translate('components.native-chat.modelDescriptions.haiku', 'Fastest for quick answers')
: description
default:
return description
}
}
@@ -1,3 +1,4 @@
import { translate } from '@/i18n/i18n'
import { useCallback, useEffect, useMemo, useRef } from 'react'
import { useAppStore } from '@/store'
import { getHasAnyWorktreesFromState } from '@/store/selectors'
@@ -114,7 +115,16 @@ export function WorkspacePortScanner({ enabled = true }: { enabled?: boolean }):
return { key, result }
} catch (error) {
const message = error instanceof Error ? error.message : String(error)
return { key, result: makeUnavailableScan(message || 'Workspace port scan failed.') }
return {
key,
result: makeUnavailableScan(
message ||
translate(
'auto.components.right.sidebar.PortsPanel.740aca88ab',
'Workspace port scan failed.'
)
)
}
}
})
)
@@ -51,3 +51,40 @@ export function confirmRemoteDelete(
confirmVariant: 'destructive'
})
}
export function fileDeleteFailedMessage(
name: string,
isRemote: boolean,
isWindows: boolean
): string {
if (isRemote) {
return translate(
'auto.components.right.sidebar.useFileDeletion.deleteFailed',
"Failed to delete '{{name}}'.",
{ name }
)
}
return isWindows
? translate(
'auto.components.right.sidebar.useFileDeletion.recycleBinFailed',
"Failed to move '{{name}}' to the Recycle Bin.",
{ name }
)
: translate(
'auto.components.right.sidebar.useFileDeletion.trashFailed',
"Failed to move '{{name}}' to the Trash.",
{ name }
)
}
export function mixedBatchDeleteDescription(isWindows: boolean): string {
return isWindows
? translate(
'auto.components.right.sidebar.useFileDeletion.mixedRecycleBin',
'Remote items are permanently deleted and cannot be undone. Local items move to the Recycle Bin.'
)
: translate(
'auto.components.right.sidebar.useFileDeletion.mixedTrash',
'Remote items are permanently deleted and cannot be undone. Local items move to the Trash.'
)
}
@@ -55,7 +55,12 @@ export function HostScopedPortsPanel({
platform: 'unknown',
scannedAt: Date.now(),
ports: [],
unavailableReason: message || 'Workspace port scan failed.'
unavailableReason:
message ||
translate(
'auto.components.right.sidebar.PortsPanel.740aca88ab',
'Workspace port scan failed.'
)
}
})
} finally {
@@ -22,7 +22,8 @@ describe('getDiscardEntryConfirmationCopy', () => {
).toEqual({
title: 'Delete "new-file.ts"?',
description: 'This will permanently delete this file. This cannot be undone.',
confirmLabel: 'Delete'
confirmLabel: 'Delete',
deleteAction: true
})
})
@@ -34,7 +35,8 @@ describe('getDiscardEntryConfirmationCopy', () => {
).toEqual({
title: 'Discard changes to "added.ts"?',
description: 'This will revert the unstaged changes to this file. This cannot be undone.',
confirmLabel: 'Discard'
confirmLabel: 'Discard',
deleteAction: false
})
})
@@ -47,7 +49,8 @@ describe('getDiscardEntryConfirmationCopy', () => {
title: 'Restore "removed.ts"?',
description:
'This will restore the last staged version and discard the deletion. This cannot be undone.',
confirmLabel: 'Restore'
confirmLabel: 'Restore',
deleteAction: false
})
})
})
@@ -58,7 +61,8 @@ describe('getDiscardAreaConfirmationCopy', () => {
title: 'Discard all staged changes?',
description:
'This will unstage and revert all staged changes. Staged new files will be deleted. This cannot be undone.',
confirmLabel: 'Discard all'
confirmLabel: 'Discard all',
deleteAction: false
})
})
@@ -67,7 +71,8 @@ describe('getDiscardAreaConfirmationCopy', () => {
title: 'Discard all unstaged changes?',
description:
'This will revert unstaged changes and permanently delete any untracked files among these 2 files. This cannot be undone.',
confirmLabel: 'Discard all'
confirmLabel: 'Discard all',
deleteAction: false
})
})
})
@@ -1,6 +1,8 @@
import { renderToStaticMarkup } from 'react-dom/server'
import type { ButtonHTMLAttributes, ReactNode } from 'react'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { i18n } from '@/i18n/i18n'
import es from '@/i18n/locales/es.json'
import type { GitStatusEntry } from '../../../../shared/git-status-types'
type CapturedButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {
@@ -73,12 +75,32 @@ function textContent(node: ReactNode): string {
return ''
}
afterEach(async () => {
await i18n.changeLanguage('en')
})
describe('SourceControlDiscardDialog', () => {
beforeEach(() => {
mocks.buttons = []
mocks.dialogContentProps = []
})
it('keeps the delete icon when its label is translated', async () => {
i18n.addResourceBundle('es', 'translation', es)
await i18n.changeLanguage('es')
const { SourceControlDiscardDialog } = await import('./source-control/commit/discard-dialog')
const markup = renderToStaticMarkup(
<SourceControlDiscardDialog
pendingDiscard={{ kind: 'area', area: 'untracked', paths: ['a.ts', 'b.ts'] }}
onCancel={vi.fn()}
onConfirm={vi.fn()}
/>
)
expect(markup).toContain('lucide-trash')
expect(markup).not.toContain('lucide-undo-2')
expect(markup).toContain(es.sourceControl.discard.deleteCount.replace('{{count}}', '2'))
})
it('makes the discard button the dialog default action', async () => {
const { SourceControlDiscardDialog } = await import('./source-control/commit/discard-dialog')
@@ -7,6 +7,7 @@ export type DiscardConfirmationCopy = {
title: string
description: string
confirmLabel: string
deleteAction: boolean
}
/** Discard deletes untracked files; staged additions retain their index version. */
@@ -30,7 +31,8 @@ export function getDiscardEntryConfirmationCopy(
'auto.components.right.sidebar.source.control.discard.confirmation.d97bf697c9',
'This will permanently delete this file. This cannot be undone.'
),
confirmLabel: 'Delete'
deleteAction: true,
confirmLabel: translate('sourceControl.discard.delete', 'Delete')
}
}
@@ -45,7 +47,8 @@ export function getDiscardEntryConfirmationCopy(
'sourceControl.discard.restoreStagedVersionDescription',
'This will restore the last staged version and discard the deletion. This cannot be undone.'
),
confirmLabel: 'Restore'
deleteAction: false,
confirmLabel: translate('sourceControl.discard.restore', 'Restore')
}
}
@@ -59,7 +62,8 @@ export function getDiscardEntryConfirmationCopy(
'sourceControl.discard.unstagedChangesDescription',
'This will revert the unstaged changes to this file. This cannot be undone.'
),
confirmLabel: 'Discard'
deleteAction: false,
confirmLabel: translate('sourceControl.discard.discard', 'Discard')
}
}
@@ -70,7 +74,18 @@ export function getDiscardAreaConfirmationCopy(
switch (area) {
case 'untracked':
return {
title: count === 1 ? 'Delete 1 untracked file?' : `Delete ${count} untracked files?`,
title:
count === 1
? translate(
'sourceControl.discard.deleteUntrackedTitle_one',
'Delete {{count}} untracked file?',
{ count }
)
: translate(
'sourceControl.discard.deleteUntrackedTitle_other',
'Delete {{count}} untracked files?',
{ count }
),
description:
count === 1
? translate(
@@ -78,11 +93,15 @@ export function getDiscardAreaConfirmationCopy(
'This will permanently delete this untracked file. This cannot be undone.'
)
: translate(
'sourceControl.discard.deleteUntrackedFilesDescription',
'sourceControl.discard.deleteUntrackedFilesDescription_other',
'This will permanently delete these {{count}} untracked files. This cannot be undone.',
{ count }
),
confirmLabel: count === 1 ? 'Delete' : `Delete ${count}`
deleteAction: true,
confirmLabel:
count === 1
? translate('sourceControl.discard.delete', 'Delete')
: translate('sourceControl.discard.deleteCount', 'Delete {{count}}', { count })
}
case 'staged':
return {
@@ -94,7 +113,8 @@ export function getDiscardAreaConfirmationCopy(
'auto.components.right.sidebar.source.control.discard.confirmation.ddf36f291c',
'This will unstage and revert all staged changes. Staged new files will be deleted. This cannot be undone.'
),
confirmLabel: 'Discard all'
deleteAction: false,
confirmLabel: translate('sourceControl.discard.discardAll', 'Discard all')
}
case 'unstaged':
return {
@@ -109,11 +129,12 @@ export function getDiscardAreaConfirmationCopy(
'This will revert unstaged changes and permanently delete any untracked files in this selection. This cannot be undone.'
)
: translate(
'sourceControl.discard.unstagedFilesIncludingUntrackedDescription',
'sourceControl.discard.unstagedFilesIncludingUntrackedDescription_other',
'This will revert unstaged changes and permanently delete any untracked files among these {{count}} files. This cannot be undone.',
{ count }
),
confirmLabel: 'Discard all'
deleteAction: false,
confirmLabel: translate('sourceControl.discard.discardAll', 'Discard all')
}
}
}
@@ -53,7 +53,7 @@ export function SourceControlDiscardDialog({
}
return getDiscardAreaConfirmationCopy(pendingDiscard.area, pendingDiscard.paths.length)
}, [pendingDiscard])
const PendingDiscardIcon = pendingDiscardCopy?.confirmLabel.startsWith('Delete') ? Trash : Undo2
const PendingDiscardIcon = pendingDiscardCopy?.deleteAction ? Trash : Undo2
return (
<Dialog
@@ -88,15 +88,16 @@ export function SourceControlDiscardDialog({
</DialogHeader>
{pendingDiscard?.kind === 'area' ? (
<div className="rounded-md border border-border/70 bg-muted/35 px-3 py-2 text-xs text-muted-foreground">
{pendingDiscard.paths.length}{' '}
{pendingDiscard.paths.length === 1
? translate(
'auto.components.right.sidebar.source.control.discard.dialog.e7611dca35',
'file'
'auto.components.right.sidebar.source.control.discard.dialog.fileCount_one',
'{{count}} file',
{ count: pendingDiscard.paths.length }
)
: translate(
'auto.components.right.sidebar.source.control.discard.dialog.42f89dd030',
'files'
'auto.components.right.sidebar.source.control.discard.dialog.fileCount_other',
'{{count}} files',
{ count: pendingDiscard.paths.length }
)}
</div>
) : pendingDiscard?.kind === 'entry' ? (
@@ -14,8 +14,10 @@ import {
} from './file-explorer-deletion-editors'
import {
confirmRemoteDelete,
fileDeleteFailedMessage,
getFileDeleteErrorMessage,
isLocalDeleteNode,
mixedBatchDeleteDescription,
needsRemoteDeleteConfirmation
} from './file-explorer-delete-classification'
import {
@@ -214,16 +216,9 @@ export function useFileDeletion({
return true
} catch (error) {
const action = isRemote ? 'delete' : isWindows ? 'move to Recycle Bin' : 'move to Trash'
const errorMessage = getFileDeleteErrorMessage(error)
toast.error(
errorMessage
? errorMessage
: translate(
'auto.components.right.sidebar.useFileDeletion.72691dfebc',
"Failed to {{value0}} '{{value1}}'.",
{ value0: action, value1: node.name }
)
getFileDeleteErrorMessage(error) ||
fileDeleteFailedMessage(node.name, isRemote, isWindows)
)
return false
} finally {
@@ -257,7 +252,6 @@ export function useFileDeletion({
const roots = selectDeletionRoots(nodes)
// Mixed batches must distinguish permanent remote deletion from local Trash.
const hasLocalDelete = roots.some(isLocalDeleteNode)
const trashName = isWindows ? 'Recycle Bin' : 'Trash'
// Clear selection after the whole batch so concurrent completions cannot restore stale partial sets.
void (async () => {
const deletedRoots = await runBatchDeletion({
@@ -269,25 +263,21 @@ export function useFileDeletion({
// Count selected children even when ancestor roots subsume their deletes.
title: hasLocalDelete
? translate(
'auto.components.right.sidebar.useFileDeletion.77fdc36183',
'auto.components.right.sidebar.useFileDeletion.deleteItems_other',
'Delete {{count}} items?',
{ count: nodes.length }
)
: translate(
'auto.components.right.sidebar.useFileDeletion.af1270b90d',
'auto.components.right.sidebar.useFileDeletion.permanentlyDeleteItems_other',
'Permanently delete {{count}} items?',
{ count: nodes.length }
),
description: hasLocalDelete
description: !hasLocalDelete
? translate(
'auto.components.right.sidebar.useFileDeletion.fca915a67a',
'Remote items are permanently deleted and cannot be undone. Local items move to the {{value0}}.',
{ value0: trashName }
)
: translate(
'auto.components.right.sidebar.useFileDeletion.dd029aa5cd',
'This permanently deletes the selected items and any directory contents on the remote host. This cannot be undone.'
),
)
: mixedBatchDeleteDescription(isWindows),
confirmLabel: translate(
'auto.components.right.sidebar.useFileDeletion.92276aceb7',
'Delete'
@@ -15,18 +15,24 @@ type McpConfigFileRowProps = {
function statusLabel(config: LoadedMcpConfigInspection): string {
if (config.readError) {
return 'Unreadable'
return translate('settings.mcp.unreadable', 'Unreadable')
}
if (config.status === 'missing') {
return 'Not found'
return translate('settings.mcp.notFound', 'Not found')
}
if (config.status === 'invalid') {
return 'Invalid JSON'
return translate('settings.mcp.invalidJson', 'Invalid JSON')
}
if (config.servers.length === 0) {
return 'No servers'
return translate('settings.mcp.noServers', 'No servers')
}
return `${config.servers.length} server${config.servers.length === 1 ? '' : 's'}`
return config.servers.length === 1
? translate('settings.mcp.serverCount_one', '{{count}} server', {
count: config.servers.length
})
: translate('settings.mcp.serverCount_other', '{{count}} servers', {
count: config.servers.length
})
}
function statusClassName(config: LoadedMcpConfigInspection): string {
@@ -41,12 +47,12 @@ function statusClassName(config: LoadedMcpConfigInspection): string {
function serverDetailLabel(server: LoadedMcpConfigInspection['servers'][number]): string {
if (server.transport === 'http') {
return server.url ?? 'HTTP server'
return server.url ?? translate('settings.mcp.httpServer', 'HTTP server')
}
if (server.transport === 'stdio') {
return server.command ?? 'stdio server'
return server.command ?? translate('settings.mcp.stdioServer', 'stdio server')
}
return server.issue ?? 'Invalid server'
return server.issue ?? translate('settings.mcp.invalidServer', 'Invalid server')
}
export function McpConfigFileRow({ config, onOpen }: McpConfigFileRowProps): React.JSX.Element {
@@ -60,7 +66,13 @@ export function McpConfigFileRow({ config, onOpen }: McpConfigFileRowProps): Rea
)}
<div className="min-w-0 flex-1">
<div className="flex min-w-0 items-center gap-2">
<p className="truncate text-sm font-medium">{config.candidate.label}</p>
<p className="truncate text-sm font-medium">
{config.candidate.relativePath === '.mcp.json'
? translate('settings.mcp.workspace', 'Workspace')
: config.candidate.relativePath === '.claude/mcp.json'
? translate('settings.mcp.claudeWorkspace', 'Claude workspace')
: config.candidate.label}
</p>
<p className="truncate font-mono text-[11px] text-muted-foreground">
{config.candidate.relativePath}
</p>
@@ -162,7 +162,9 @@ export function ShortcutsPane(): React.JSX.Element {
if (!Array.isArray(normalizedResult)) {
setErrors((prev) => ({
...prev,
[actionId]: normalizedResult.ok ? 'Unable to parse shortcut.' : normalizedResult.error
[actionId]: normalizedResult.ok
? translate('settings.shortcuts.parseFailed', 'Unable to parse shortcut.')
: normalizedResult.error
}))
return false
}
@@ -28,13 +28,27 @@ import { translate } from '@/i18n/i18n'
import { cn } from '@/lib/utils'
export const STATUS_LABELS: Record<SshConnectionStatus, string> = {
disconnected: 'Disconnected',
connecting: 'Connecting…',
'auth-failed': 'Auth failed',
'deploying-relay': 'Deploying relay…',
connected: 'Connected',
reconnecting: 'Reconnecting…',
'reconnection-failed': 'Reconnection failed',
get disconnected() {
return translate('settings.ssh.status.disconnected', 'Disconnected')
},
get connecting() {
return translate('settings.ssh.status.connecting', 'Connecting…')
},
get 'auth-failed'() {
return translate('settings.ssh.status.auth-failed', 'Auth failed')
},
get 'deploying-relay'() {
return translate('settings.ssh.status.deploying-relay', 'Deploying relay…')
},
get connected() {
return translate('settings.ssh.status.connected', 'Connected')
},
get reconnecting() {
return translate('settings.ssh.status.reconnecting', 'Reconnecting…')
},
get 'reconnection-failed'() {
return translate('settings.ssh.status.reconnection-failed', 'Reconnection failed')
},
get error() {
return translate('auto.components.settings.SshTargetCard.18968ede9e', 'Error')
}
@@ -1,3 +1,4 @@
import { taskProviderErrorMessage } from '@/lib/task-provider-error-copy'
import { UnsealedCredentialNotice } from './UnsealedCredentialNotice'
import { useState } from 'react'
import { AlertCircle, CheckCircle2, LoaderCircle, Unlink } from 'lucide-react'
@@ -71,7 +72,9 @@ export function JiraIntegrationCard(): React.JSX.Element {
}
setTestResultBySite((prev) => ({
...prev,
[siteId]: result.ok ? { state: 'ok' } : { state: 'error', error: result.error }
[siteId]: result.ok
? { state: 'ok' }
: { state: 'error', error: taskProviderErrorMessage(result) }
}))
setTestingSiteId(null)
}
@@ -1,3 +1,4 @@
import { translate } from '@/i18n/i18n'
import {
getMcpConfigCandidateParentDir,
getMcpConfigParentDirs,
@@ -41,7 +42,12 @@ export async function loadMcpConfigInspections(
} catch (error) {
unreadableParentDirMessages.set(
relativeDir,
extractIpcErrorMessage(error, `Unable to inspect ${relativeDir}.`)
extractIpcErrorMessage(
error,
translate('settings.mcp.inspectFailed', 'Unable to inspect {{directory}}.', {
directory: relativeDir
})
)
)
}
})
@@ -1,9 +1,9 @@
import { translate } from '@/i18n/i18n'
import {
describeRuntimeCompatBlock,
evaluateRuntimeCompat,
type RuntimeCompatVerdict
} from '../../../../shared/protocol-compat'
import { describeRuntimeCompatBlock } from '@/lib/runtime-host-copy'
import {
MIN_COMPATIBLE_RUNTIME_SERVER_VERSION,
PROJECT_HOST_SETUP_RUNTIME_CAPABILITY,
@@ -4,7 +4,8 @@ import { act } from 'react'
import { createRoot, type Root } from 'react-dom/client'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { getExecutionHostLabel } from '../../../../shared/execution-host'
import { setRendererUiLanguage } from '@/i18n/i18n'
import es from '@/i18n/locales/es.json'
import { setRendererUiLanguage, translate } from '@/i18n/i18n'
import { getProviderRuntimeContextKey } from '@/lib/provider-runtime-context'
import { TooltipProvider } from '../ui/tooltip'
import { LinearIntegrationCard } from './task-tracker-integration-cards'
@@ -155,6 +156,30 @@ describe('LinearIntegrationCard account scope', () => {
}
)
it('translates a coded connection failure at the display site', async () => {
await setRendererUiLanguage('es')
const state = installStore(true)
state.testLinearConnection = vi.fn(async () => ({
ok: false,
error: 'Wire detail from the host',
errorCode: 'linear.noApiKey'
}))
const rendered = await renderCard()
const label = translate(
'auto.components.settings.task.tracker.integration.cards.c24e56c532',
'Test'
)
const button = Array.from(rendered.querySelectorAll('button')).find(
(button) => button.textContent === label
)
expect(button).toBeDefined()
await act(async () => {
button?.dispatchEvent(new MouseEvent('click', { bubbles: true }))
})
expect(rendered.textContent).toContain(es.taskProviders.errors.linear.noApiKey)
expect(rendered.textContent).not.toContain('Wire detail from the host')
})
it('shows local-client account ownership when Linear is disconnected', async () => {
const state = installStore(false)
@@ -1,3 +1,4 @@
import { taskProviderErrorMessage } from '@/lib/task-provider-error-copy'
import { UnsealedCredentialNotice } from './UnsealedCredentialNotice'
import { useState } from 'react'
import { AlertCircle, CheckCircle2, LoaderCircle, Unlink } from 'lucide-react'
@@ -62,7 +63,9 @@ export function LinearIntegrationCard(): React.JSX.Element {
}
setTestResultByWorkspace((prev) => ({
...prev,
[workspaceId]: result.ok ? { state: 'ok' } : { state: 'error', error: result.error }
[workspaceId]: result.ok
? { state: 'ok' }
: { state: 'error', error: taskProviderErrorMessage(result) }
}))
setTestingWorkspaceId(null)
}
@@ -4,7 +4,8 @@ import { translate } from '@/i18n/i18n'
import { unwrapRuntimeRpcResult } from '@/runtime/runtime-rpc-result'
import { extractRuntimeTransportDiagnostics } from '@/runtime/runtime-status-probe-diagnostics'
import { useAppStore } from '@/store'
import { describeRuntimeCompatBlock } from '../../../../shared/protocol-compat'
import { describeRuntimeCompatBlock } from '@/lib/runtime-host-copy'
import type { PublicKnownRuntimeEnvironment } from '../../../../shared/runtime-environments'
import type { RuntimeStatus } from '../../../../shared/runtime-types'
import { evaluateHostDetails, type RuntimeHostDetails } from './runtime-environment-host-details'
@@ -10,7 +10,8 @@ import { cn } from '@/lib/utils'
import type { SidebarHostOption } from './sidebar-host-options'
import { getSidebarHostHealthLabel, shouldShowHostScopeControls } from './sidebar-host-options'
import type { ExecutionHostId } from '../../../../shared/execution-host'
import { describeRuntimeCompatBlock } from '../../../../shared/protocol-compat'
import { describeRuntimeCompatBlock } from '@/lib/runtime-host-copy'
import { translate } from '@/i18n/i18n'
import { canConnectAddRepoHost, canSelectAddRepoHost } from './add-repo-host-availability'
@@ -28,7 +28,8 @@ import { translate } from '@/i18n/i18n'
import { sshConnectVerb } from '@/ssh/ssh-connect-verb'
import { parseExecutionHostId } from '../../../../shared/execution-host'
import { runtimePairingRepairRoute } from '../../../../shared/runtime-environments'
import { describeRuntimeCompatBlock } from '../../../../shared/protocol-compat'
import { describeRuntimeCompatBlock } from '@/lib/runtime-host-copy'
import { clearRuntimeCompatibilityCache } from '@/runtime/runtime-rpc-client'
import { unwrapRuntimeRpcResult } from '@/runtime/runtime-rpc-result'
import type { RuntimeStatus } from '../../../../shared/runtime-types'
@@ -75,26 +75,26 @@ function overlayNewCardUnreadStatus(
}
function getReviewStatusLabel(review: WorktreeCardPrDisplay): string {
const label = getReviewLabel(review)
const values = { review: getReviewLabel(review) }
if (review.state === 'merged') {
return `${label}: Merged`
return translate('workspace.reviewStatus.merged', '{{review}}: Merged', values)
}
if (review.state === 'closed') {
return `${label}: Closed`
return translate('workspace.reviewStatus.closed', '{{review}}: Closed', values)
}
if (review.state === 'draft') {
return `${label}: Draft`
return translate('workspace.reviewStatus.draft', '{{review}}: Draft', values)
}
if (review.status === 'failure') {
return `${label} checks: Failed`
return translate('workspace.reviewStatus.checksFailed', '{{review}} checks: Failed', values)
}
if (review.status === 'pending') {
return `${label} checks: Pending`
return translate('workspace.reviewStatus.checksPending', '{{review}} checks: Pending', values)
}
if (review.status === 'success') {
return `${label} checks: Passing`
return translate('workspace.reviewStatus.checksPassing', '{{review}} checks: Passing', values)
}
return `${label}: Open`
return translate('workspace.reviewStatus.open', '{{review}}: Open', values)
}
export function WorktreeCardStatusSlot({
@@ -148,7 +148,9 @@ export function WorktreeCardStatusSlot({
? `${passiveStatusLabel} · ${translate('workspace.links.lastKnownStatus', 'Last known status')}`
: passiveStatusLabel
const passiveStatusAnnouncement =
newCardStyle && isUnread ? `${reviewLabel} · Unread` : reviewLabel
newCardStyle && isUnread
? translate('workspace.activity.unreadLabel', '{{status}} · Unread', { status: reviewLabel })
: reviewLabel
// Working/permission own the lane; retain unread in accessible copy and restore its dot afterward.
const showNewCardUnreadAlert =
newCardStyle && isUnread && showStatus && status !== 'working' && status !== 'permission'
@@ -0,0 +1,7 @@
import { translate } from '@/i18n/i18n'
export function activeFilterCountLabel(count: number): string {
return count === 1
? translate('workspaceOptions.activeFilterCount_one', '{{count}} filter', { count })
: translate('workspaceOptions.activeFilterCount_other', '{{count}} filters', { count })
}
@@ -13,7 +13,8 @@ import {
type ExecutionHostHealth,
type ExecutionHostRegistryEntry
} from '../../../../shared/execution-host-registry'
import { getExecutionHostHealthLabel } from '../../../../shared/execution-host-health'
import { getExecutionHostHealthLabel } from '@/lib/runtime-host-copy'
import { pickerExecutionHosts } from '../../../../shared/managed-orcad-execution-host'
import { getCheckedHostRows } from '../../../../shared/workspace-view/workspace-host-visibility'
import type { RuntimeCompatVerdict } from '../../../../shared/protocol-compat'
@@ -201,12 +202,14 @@ export function getSidebarHostVisibilityLabel(
return checkedRows[0].label
}
if (checkedRows.length === 0) {
return 'Hosts'
return translate('auto.components.sidebar.sidebarHostOptions.hosts', 'Hosts')
}
return translate(
'auto.components.sidebar.sidebarHostOptions.visibleHostsCount',
'{{value0}} hosts',
{ value0: checkedRows.length }
'auto.components.sidebar.sidebarHostOptions.visibleHosts_other',
'{{count}} hosts',
{
count: checkedRows.length
}
)
}
@@ -214,7 +217,9 @@ export function getSidebarHostHealthLabel(
health: SidebarHostScopeOption['health'],
blockedReason?: RuntimeHostBlockedReason
): string {
return health === 'mixed' ? 'Mixed' : getExecutionHostHealthLabel(health, blockedReason)
return health === 'mixed'
? translate('runtime.health.mixed', 'Mixed')
: getExecutionHostHealthLabel(health, blockedReason)
}
// Diagnostics do not change host choices; retain every other exposed registry field.
@@ -10,10 +10,8 @@ import {
DropdownMenuSubTrigger
} from '@/components/ui/dropdown-menu'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import {
countActiveWorkspaceFilters,
formatActiveFilterLabel
} from '../../../../shared/workspace-view/workspace-row-filters'
import { countActiveWorkspaceFilters } from '../../../../shared/workspace-view/workspace-row-filters'
import { activeFilterCountLabel } from './active-filter-count-label'
import { useShallow } from 'zustand/react/shallow'
import { selectSidebarFilterState, sidebarWorkspaceRowFilters } from './sidebar-filter-actions'
import SidebarRepositoryFilterSection from './SidebarRepositoryFilterSection'
@@ -57,7 +55,7 @@ export function useWorkspaceOptionsFilterBadge(): {
return {
hasAnyFilter: activeFilterCount > 0,
activeFilterCount,
activeFilterLabel: formatActiveFilterLabel(activeFilterCount)
activeFilterLabel: activeFilterCountLabel(activeFilterCount)
}
}
@@ -1,4 +1,5 @@
import type React from 'react'
import { sourceControlVariableDescription } from './source-control-variable-description'
import { Braces } from 'lucide-react'
import {
SOURCE_CONTROL_ACTION_VARIABLE_INFO,
@@ -77,7 +78,7 @@ function SourceControlVariableDetails({
<div className="max-w-80 space-y-2 text-left leading-relaxed">
<div className="space-y-0.5">
<div className="font-mono text-[11px]">{`{${variable}}`}</div>
<div className="text-muted-foreground">{info.description}</div>
<div className="text-muted-foreground">{sourceControlVariableDescription(variable)}</div>
</div>
<SourceControlVariableSample
label={translate(
@@ -0,0 +1,69 @@
import { translate } from '@/i18n/i18n'
import type { SourceControlActionVariable } from '../../../../shared/source-control-ai-action-variables'
export function sourceControlVariableDescription(variable: SourceControlActionVariable): string {
switch (variable) {
case 'basePrompt':
return translate(
'sourceControl.variables.basePrompt',
'Orca’s built-in prompt for this action, including the context Orca knows how to gather safely.'
)
case 'branch':
return translate('sourceControl.variables.branch', 'The current source-control branch name.')
case 'stagedFiles':
return translate(
'sourceControl.variables.stagedFiles',
'A newline-separated list of staged files for commit-message generation.'
)
case 'stagedPatch':
return translate(
'sourceControl.variables.stagedPatch',
'The staged git patch used for commit-message generation.'
)
case 'baseBranch':
return translate(
'sourceControl.variables.baseBranch',
'The target branch selected in the Create PR composer.'
)
case 'currentTitle':
return translate(
'sourceControl.variables.currentTitle',
'The PR title currently typed in the composer before generation starts.'
)
case 'currentBody':
return translate(
'sourceControl.variables.currentBody',
'The PR description currently typed in the composer before generation starts.'
)
case 'commitSummary':
return translate(
'sourceControl.variables.commitSummary',
'A newline-separated list of commits on the branch compared to the base.'
)
case 'changedFiles':
return translate(
'sourceControl.variables.changedFiles',
'A summary of files changed between the branch and the base branch.'
)
case 'patch':
return translate(
'sourceControl.variables.patch',
'The branch diff against the base branch used for PR-details generation.'
)
case 'firstPrompt':
return translate(
'sourceControl.variables.firstPrompt',
'The first user request for this workspace or chat.'
)
case 'assistantMessage':
return translate(
'sourceControl.variables.assistantMessage',
'The initial agent response, when Orca has one available.'
)
case 'linkedIssue':
return translate(
'sourceControl.variables.linkedIssue',
'The GitHub issue number linked to this workspace. Empty when no GitHub issue is linked (including GitLab-linked workspaces). Prefer instructional templates: a bare "Fixes #{linkedIssue}" becomes "Fixes #" when unlinked.'
)
}
}
@@ -3,10 +3,8 @@ import type { SshConnectionStatus } from '../../../../shared/ssh-types'
import type { RemoteRuntimeSharedConnectionDiagnostics } from '../../../../shared/remote-runtime/control/remote-runtime-shared-control-types'
import type { RuntimeHostBlockedReason } from '../../../../shared/runtime-host-status'
import type { RuntimePairingRepairRoute } from '../../../../shared/runtime-environments'
import {
describeRuntimeCompatBlock,
type RuntimeCompatVerdict
} from '../../../../shared/protocol-compat'
import type { RuntimeCompatVerdict } from '../../../../shared/protocol-compat'
import { describeRuntimeCompatBlock } from '@/lib/runtime-host-copy'
import {
runtimeStatusForOverall,
type HostStatus,
@@ -1,3 +1,4 @@
import { taskProviderErrorMessage, taskProviderErrorText } from '@/lib/task-provider-error-copy'
import type { TaskPageLinearIssueCreationModel } from '../linear/use-task-page-linear-issue-creation'
import { useCallback } from 'react'
import {
@@ -68,7 +69,7 @@ export function useTaskPageJiraIssueCreation(model: TaskPageLinearIssueCreationM
}
if (!result.ok) {
toast.error(
result.error ||
taskProviderErrorMessage(result) ||
translate('auto.components.TaskPage.aec5feeb69', 'Failed to create Jira issue.')
)
return
@@ -113,7 +114,7 @@ export function useTaskPageJiraIssueCreation(model: TaskPageLinearIssueCreationM
if (submitProviderRuntimeContextKey === providerRuntimeContextKeyRef.current) {
toast.error(
error instanceof Error
? error.message
? taskProviderErrorText(error.message)
: translate('auto.components.TaskPage.aec5feeb69', 'Failed to create Jira issue.')
)
}
@@ -1,3 +1,4 @@
import { taskProviderErrorMessage, taskProviderErrorText } from '@/lib/task-provider-error-copy'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { createNonSecureContextUuid as createBrowserUuid } from '../../../../../shared/non-secure-context-uuid'
import { isWebClientLocation } from '@/lib/web-client-location'
@@ -166,7 +167,7 @@ export function useTaskPageJiraSummaryGeneration<T extends SummaryGenerationMode
setGenerationError({
draftKey,
message:
result.error ||
taskProviderErrorMessage(result) ||
translate(
'components.jiraIssueTitleField.failed',
'Failed to generate a summary from the description.'
@@ -185,7 +186,7 @@ export function useTaskPageJiraSummaryGeneration<T extends SummaryGenerationMode
draftKey,
message:
error instanceof Error
? error.message
? taskProviderErrorText(error.message)
: translate(
'components.jiraIssueTitleField.failed',
'Failed to generate a summary from the description.'
@@ -1,3 +1,4 @@
import { translate } from '@/i18n/i18n'
import type { TaskPageComposerActionsModel } from '../use-task-page-composer-actions'
import { LinearApiKeyDialog } from '@/components/linear-api-key-dialog'
export function TaskPageLinearConnectDialog({
@@ -16,7 +17,11 @@ export function TaskPageLinearConnectDialog({
open={linearConnectOpen}
onOpenChange={setLinearConnectOpen}
workspace={selectedLinearWorkspace}
connectLabel={selectedLinearWorkspace ? 'Update access' : 'Add Linear access'}
connectLabel={
selectedLinearWorkspace
? translate('taskProviders.linear.updateAccess', 'Update access')
: translate('taskProviders.linear.addAccess', 'Add Linear access')
}
onConnected={handleLinearAccessConnected}
/>
)
@@ -34,7 +34,9 @@ export function TaskPageLinearContent({
<LinearIssueWorkspace
issue={selectedLinearIssue}
variant="page"
backLabel={activeLinearIssueContextLabel ?? 'Linear list'}
backLabel={
activeLinearIssueContextLabel ?? translate('taskProviders.linear.listLabel', 'Linear list')
}
onUse={handleUseLinearItem}
onOpenIssue={openRelatedLinearIssue}
onClose={closeTaskDetailPage}
@@ -49,7 +49,7 @@ export function TaskPageLinearCustomViewList({
errors={linearCustomViewsResult.errors}
hasMore={linearCustomViewsResult.hasMore}
count={linearCustomViewsResult.items.length}
label={translate('auto.components.TaskPage.3cb855080f', 'views')}
kind="views"
/>
</div>
)
@@ -95,7 +95,7 @@ export function TaskPageLinearCustomViewProjects({
errors={linearCustomViewProjectsResult.errors}
hasMore={linearCustomViewProjectsResult.hasMore}
count={linearCustomViewProjectsResult.items.length}
label={translate('auto.components.TaskPage.b39fe6511d', 'projects')}
kind="projects"
/>
</div>
)
@@ -68,10 +68,10 @@ export function TaskPageLinearIssueList({
errors={linearProjectIssuesResult.errors}
hasMore={showLinearEmptyFilteredLoadMore}
count={linearProjectIssuesResult.items.length}
label={translate('auto.components.TaskPage.67662ade50', 'project issues')}
kind="projectIssues"
onLoadMore={handleLinearEmptyFilteredLoadMore}
loading={activeLinearIssueLoading}
loadMoreLabel="Fetch more"
loadMoreLabel={translate('taskProviders.linear.fetchMore', 'Fetch more')}
/>
{showLinearIssuePagination ? (
<div className="flex-none border-t border-border/50 bg-muted/50">
@@ -90,10 +90,10 @@ export function TaskPageLinearIssueList({
errors={linearCustomViewIssuesResult.errors}
hasMore={showLinearEmptyFilteredLoadMore}
count={linearCustomViewIssuesResult.items.length}
label={translate('auto.components.TaskPage.be8cf68d9f', 'view issues')}
kind="viewIssues"
onLoadMore={handleLinearEmptyFilteredLoadMore}
loading={activeLinearIssueLoading}
loadMoreLabel="Fetch more"
loadMoreLabel={translate('taskProviders.linear.fetchMore', 'Fetch more')}
/>
{showLinearIssuePagination ? (
<div className="flex-none border-t border-border/50 bg-muted/50">
@@ -111,10 +111,10 @@ export function TaskPageLinearIssueList({
<LinearCollectionNotice
hasMore={showLinearEmptyFilteredLoadMore}
count={linearIssues.length}
label={translate('auto.components.TaskPage.d1e243795c', 'issues')}
kind="issues"
onLoadMore={handleLinearEmptyFilteredLoadMore}
loading={activeLinearIssueLoading}
loadMoreLabel="Fetch more"
loadMoreLabel={translate('taskProviders.linear.fetchMore', 'Fetch more')}
/>
{showLinearIssuePagination ? (
<div className="flex-none border-t border-border/50 bg-muted/50">
@@ -56,7 +56,7 @@ export function TaskPageLinearProjectList({
errors={linearProjectsResult.errors}
hasMore={linearProjectsResult.hasMore}
count={linearProjectsResult.items.length}
label={translate('auto.components.TaskPage.b39fe6511d', 'projects')}
kind="projects"
/>
</div>
)
@@ -1,3 +1,4 @@
import { taskProviderErrorMessage } from '@/lib/task-provider-error-copy'
import type { LinearIssue } from '../../../../../shared/linear/issue-types'
import type { LinearCustomViewModel } from '../../../../../shared/linear/project-types'
import type {
@@ -141,7 +142,7 @@ export function LinearStateCell({
}
)
toast.error(
result.error ??
taskProviderErrorMessage(result) ||
translate('auto.components.TaskPage.6775c05483', 'Failed to update Linear state')
)
return
@@ -1,3 +1,4 @@
import { taskProviderErrorMessage } from '@/lib/task-provider-error-copy'
import type { TaskPageLinearListProjectionModel } from './use-task-page-linear-list-projection'
import React, { useMemo, useCallback } from 'react'
import type { LinearIssue } from '../../../../../shared/linear/issue-types'
@@ -174,7 +175,7 @@ export function useTaskPageLinearBoard(model: TaskPageLinearListProjectionModel)
})
applyFallbackState(previousState)
toast.error(
result.error ??
taskProviderErrorMessage(result) ||
translate('auto.components.TaskPage.6775c05483', 'Failed to update Linear state')
)
return
@@ -1,3 +1,5 @@
import { taskProviderErrorText } from '@/lib/task-provider-error-copy'
import { translate } from '@/i18n/i18n'
import type { TaskPageLinearInOrcaEffectsModel } from './use-task-page-linear-in-orca-effects'
import { useEffect } from 'react'
import { LINEAR_ITEM_LIMIT } from '../task-page-source-context'
@@ -73,7 +75,9 @@ export function useTaskPageLinearCollectionEffectsPrelude(model: TaskPageLinearI
.catch((error) => {
if (!cancelled) {
setLinearProjectsError(
error instanceof Error ? error.message : 'Failed to load projects.'
error instanceof Error
? taskProviderErrorText(error.message)
: translate('taskProviders.linear.projectsLoadFailed', 'Failed to load projects.')
)
setLinearProjectsLoading(false)
}
@@ -117,7 +121,9 @@ export function useTaskPageLinearCollectionEffectsPrelude(model: TaskPageLinearI
setSelectedLinearProject(null)
setLinearProjectParentView(null)
setLinearProjectDetailError(null)
setLinearProjectsError('Project was not found.')
setLinearProjectsError(
translate('taskProviders.linear.projectNotFound', 'Project was not found.')
)
setTaskResumeState({
linearContext: undefined
})
@@ -127,7 +133,9 @@ export function useTaskPageLinearCollectionEffectsPrelude(model: TaskPageLinearI
.catch((error) => {
if (!cancelled) {
setLinearProjectDetailError(
error instanceof Error ? error.message : 'Failed to load project.'
error instanceof Error
? taskProviderErrorText(error.message)
: translate('taskProviders.linear.projectLoadFailed', 'Failed to load project.')
)
setLinearProjectDetailLoading(false)
}
@@ -174,7 +182,12 @@ export function useTaskPageLinearCollectionEffectsPrelude(model: TaskPageLinearI
.catch((error) => {
if (!cancelled) {
setLinearProjectIssuesError(
error instanceof Error ? error.message : 'Failed to load project issues.'
error instanceof Error
? taskProviderErrorText(error.message)
: translate(
'taskProviders.linear.projectIssuesLoadFailed',
'Failed to load project issues.'
)
)
setLinearProjectIssuesLoading(false)
}
@@ -1,3 +1,5 @@
import { taskProviderErrorText } from '@/lib/task-provider-error-copy'
import { translate } from '@/i18n/i18n'
import type { TaskPageLinearInOrcaEffectsModel } from './use-task-page-linear-in-orca-effects'
import { useEffect } from 'react'
import {
@@ -79,7 +81,9 @@ export function useTaskPageLinearCustomViewEffects(model: TaskPageLinearInOrcaEf
.catch((error) => {
if (!cancelled) {
setLinearCustomViewsError(
error instanceof Error ? error.message : 'Failed to load views.'
error instanceof Error
? taskProviderErrorText(error.message)
: translate('taskProviders.linear.viewsLoadFailed', 'Failed to load views.')
)
setLinearCustomViewsLoading(false)
}
@@ -151,7 +155,12 @@ export function useTaskPageLinearCustomViewEffects(model: TaskPageLinearInOrcaEf
.catch((error) => {
if (!cancelled) {
setLinearCustomViewContentsError(
error instanceof Error ? error.message : 'Failed to load view contents.'
error instanceof Error
? taskProviderErrorText(error.message)
: translate(
'taskProviders.linear.viewContentsLoadFailed',
'Failed to load view contents.'
)
)
setLinearCustomViewContentsLoading(false)
}
@@ -1,3 +1,4 @@
import { taskProviderErrorText } from '@/lib/task-provider-error-copy'
import type { TaskPageLinearListEffectsModel } from './use-task-page-linear-list-effects'
import { useEffect } from 'react'
import {
@@ -110,7 +111,11 @@ export function useTaskPageLinearInOrcaEffects(model: TaskPageLinearListEffectsM
) {
return
}
setLinearError(err instanceof Error ? err.message : 'Failed to load Linear issues.')
setLinearError(
err instanceof Error
? taskProviderErrorText(err.message)
: taskProviderErrorText('Failed to load Linear issues.')
)
setLinearLoading(false)
})
return () => {
@@ -1,3 +1,4 @@
import { taskProviderErrorMessage } from '@/lib/task-provider-error-copy'
import type { TaskPageLinearProjectCreationModel } from './use-task-page-linear-project-creation'
import { useCallback } from 'react'
import { toast } from 'sonner'
@@ -77,7 +78,7 @@ export function useTaskPageLinearIssueCreation(model: TaskPageLinearProjectCreat
}
if (!result.ok) {
toast.error(
result.error ||
taskProviderErrorMessage(result) ||
translate('auto.components.TaskPage.7437e340b4', 'Failed to create issue.')
)
return
@@ -1,3 +1,4 @@
import { taskProviderErrorText } from '@/lib/task-provider-error-copy'
import type { TaskPageGlobalEffectsModel } from '../use-task-page-global-effects'
import { useEffect } from 'react'
import { isIntegrationCredentialDecryptionError } from '../../../../../shared/integration-credential-errors'
@@ -266,7 +267,11 @@ export function useTaskPageLinearListEffects(model: TaskPageGlobalEffectsModel)
setLinearIssues([])
setLinearIssuesHasMore(false)
}
setLinearError(err instanceof Error ? err.message : 'Failed to load Linear issues.')
setLinearError(
err instanceof Error
? taskProviderErrorText(err.message)
: taskProviderErrorText('Failed to load Linear issues.')
)
setLinearLoading(false)
})
return () => {
@@ -1,3 +1,4 @@
import { taskProviderErrorMessage, taskProviderErrorText } from '@/lib/task-provider-error-copy'
import type { TaskPageGitHubIssueCreationModel } from '../github/use-task-page-github-issue-creation'
import { useCallback } from 'react'
import { linearCreateProject } from '@/runtime/runtime-linear-project-client'
@@ -66,7 +67,7 @@ export function useTaskPageLinearProjectCreation(model: TaskPageGitHubIssueCreat
)
if (!result.ok) {
toast.error(
result.error ||
taskProviderErrorMessage(result) ||
translate('auto.components.TaskPage.3ca9b424a3', 'Failed to create project.')
)
return
@@ -107,7 +108,7 @@ export function useTaskPageLinearProjectCreation(model: TaskPageGitHubIssueCreat
} catch (error) {
toast.error(
error instanceof Error
? error.message
? taskProviderErrorText(error.message)
: translate('auto.components.TaskPage.3ca9b424a3', 'Failed to create project.')
)
} finally {
@@ -0,0 +1,32 @@
// @vitest-environment happy-dom
import { act, cleanup, renderHook } from '@testing-library/react'
import { afterEach, expect, it, vi } from 'vitest'
import { i18n } from '@/i18n/i18n'
import es from '@/i18n/locales/es.json'
import { taskProviderErrorMessage } from '@/lib/task-provider-error-copy'
import { useImmediateMutation } from './useImmediateMutation'
afterEach(async () => {
cleanup()
await i18n.changeLanguage('en')
})
it('reverts a failed edit and delivers its coded error in the UI language', async () => {
i18n.addResourceBundle('es', 'translation', es)
await i18n.changeLanguage('es')
const { result } = renderHook(() => useImmediateMutation())
const onRevert = vi.fn()
const onError = vi.fn()
await act(async () => {
await result.current.run('status', {
mutate: async () => ({ ok: false, error: 'Host detail', errorCode: 'linear.updateFailed' }),
formatError: taskProviderErrorMessage,
onRevert,
onError
})
})
expect(onRevert).toHaveBeenCalledOnce()
expect(onError).toHaveBeenCalledWith(es.taskProviders.errors.linear.updateFailed)
expect(result.current.isPending('status')).toBe(false)
})
@@ -19,6 +19,7 @@ export function useImmediateMutation() {
onSuccess?: (result: T) => void
onRevert?: () => void
onError?: (error: string) => void
formatError?: (result: { error?: unknown; errorCode?: unknown }) => string
}
) => {
if (pendingRef.current.has(key)) {
@@ -28,10 +29,11 @@ export function useImmediateMutation() {
opts.onOptimistic?.()
try {
const result = await opts.mutate()
const asResult = result as { ok?: boolean; error?: string }
if (asResult && asResult.ok === false) {
if (result && typeof result === 'object' && 'ok' in result && result.ok === false) {
const error = 'error' in result && typeof result.error === 'string' ? result.error : ''
const errorCode = 'errorCode' in result ? result.errorCode : undefined
opts.onRevert?.()
opts.onError?.(asResult.error ?? 'Update failed')
opts.onError?.(opts.formatError?.({ error, errorCode }) || error || 'Update failed')
} else {
opts.onSuccess?.(result)
}
+53 -1
View File
@@ -9,6 +9,8 @@
"auto": {
"components": {
"NativeChatResumeOnRestartModal": {
"resumeChats_one": "Resume {{count}} chat",
"resumeChats_other": "Resume {{count}} chats",
"serverResumeHere": "Resume {{count}} chats started here",
"serverResumeHereOne": "Resume 1 chat started here"
},
@@ -237,6 +239,12 @@
},
"source": {
"control": {
"discard": {
"dialog": {
"fileCount_one": "{{count}} file",
"fileCount_other": "{{count}} files"
}
},
"dropdown": {
"items": {
"fastForwardCount_one": "Fast-forward {{count}} commit",
@@ -256,6 +264,10 @@
}
}
}
},
"useFileDeletion": {
"deleteItems_other": "Delete {{count}} items?",
"permanentlyDeleteItems_other": "Permanently delete {{count}} items?"
}
}
},
@@ -472,6 +484,9 @@
}
}
},
"sidebarHostOptions": {
"visibleHosts_other": "{{count}} hosts"
},
"workspaceBatchActionLabels": {
"deleteCount_one": "Delete {{count}} Workspace",
"deleteCount_other": "Delete {{count}} Workspaces",
@@ -691,7 +706,6 @@
"editSavedArguments": "Edit them in Settings > Agents > Arguments.",
"emptyMessage": "This message is empty, so it was not sent.",
"fullAccessAsRoot": "{{agent}} won't use Full access while it runs as root. Choose another permission for {{agent}} in Settings → Agents for the computer running this chat, then start a new chat.",
"launchPreparationFailed": "Orca couldn't prepare {{agent}} to start on the computer running this chat.",
"historyInOtherAccount": "This chat's history is in another Claude account. Switch back to that account to continue it.",
"historyTooLarge": "This conversation's history is too large to restore here.",
"hostFault": "Orca ran into a problem, so this didn't go through.",
@@ -700,6 +714,7 @@
"hostStopped": "{{agent}} never finished starting, so Orca stopped it.",
"interactiveAgentNotSignedIn": "Sign in to {{agent}} by running `{{loginCommand}}` and using `{{slashCommand}}` on the computer running this chat.",
"launchFolderMissing": "The folder this chat ran in no longer exists. Restore it to continue this chat.",
"launchPreparationFailed": "Orca couldn't prepare {{agent}} to start on the computer running this chat.",
"managedAccountEnvOverride": "This Claude launch sets its own Anthropic sign-in variables. Remove them to use a managed Claude account.",
"managedAccountUnsupported": "While a Claude account is added in WSL, Claude chats need a Windows Claude account.",
"noTurnToStop": "{{agent}} had no turn running to stop.",
@@ -994,12 +1009,41 @@
},
"settings": {
"agents": {
"approveForMe": "approve for me",
"permissionOverrideMore_one": "and {{count}} more",
"permissionOverrideMore_other": "and {{count}} more",
"permissionOverridesFollow_one": "{{count}} agent now follows {{mode}}",
"permissionOverridesFollow_other": "{{count}} agents now follow {{mode}}",
"permissionOverridesKept_one": "{{count}} agent still uses their own permission setting:",
"permissionOverridesKept_other": "{{count}} agents still use their own permission setting:"
},
"mcp": {
"serverCount_one": "{{count}} server",
"serverCount_other": "{{count}} servers"
}
},
"sourceControl": {
"discard": {
"deleteUntrackedFilesDescription_other": "This will permanently delete these {{count}} untracked files. This cannot be undone.",
"deleteUntrackedTitle_one": "Delete {{count}} untracked file?",
"deleteUntrackedTitle_other": "Delete {{count}} untracked files?",
"unstagedFilesIncludingUntrackedDescription_other": "This will revert unstaged changes and permanently delete any untracked files among these {{count}} files. This cannot be undone."
}
},
"taskProviders": {
"linear": {
"truncated": {
"issues_one": "Showing the first {{count}} issue. Search or open Linear for the full set.",
"issues_other": "Showing the first {{count}} issues. Search or open Linear for the full set.",
"projectIssues_one": "Showing the first {{count}} project issue. Search or open Linear for the full set.",
"projectIssues_other": "Showing the first {{count}} project issues. Search or open Linear for the full set.",
"projects_one": "Showing the first {{count}} project. Search or open Linear for the full set.",
"projects_other": "Showing the first {{count}} projects. Search or open Linear for the full set.",
"viewIssues_one": "Showing the first {{count}} view issue. Search or open Linear for the full set.",
"viewIssues_other": "Showing the first {{count}} view issues. Search or open Linear for the full set.",
"views_one": "Showing the first {{count}} view. Search or open Linear for the full set.",
"views_other": "Showing the first {{count}} views. Search or open Linear for the full set."
}
}
},
"terminal": {
@@ -1010,6 +1054,14 @@
"reopened_other": "Reopened {{count}} terminals",
"resumed_one": "{{count}} agent session resumed.",
"resumed_other": "{{count}} agent sessions resumed."
},
"severedDaemonBanner": {
"count_one": "{{count}} running terminal",
"count_other": "{{count}} running terminals"
}
},
"workspaceOptions": {
"activeFilterCount_one": "{{count}} filter",
"activeFilterCount_other": "{{count}} filters"
}
}
+279 -26
View File
@@ -258,6 +258,15 @@
"title": "Verlauf",
"today": "Heute",
"yesterday": "Gestern"
},
"viewport": {
"desktop": "Desktop — 1920 × 1080",
"laptop": "Laptop — 1024 × 768",
"laptop-l": "Laptop L — 1440 × 900",
"mobile-l": "Mobil L — 425 × 812",
"mobile-m": "Mobil M — 375 × 667",
"mobile-s": "Mobil S — 320 × 568",
"tablet": "Tablet — 768 × 1024"
}
},
"editor": {
@@ -621,7 +630,8 @@
"permissionOverrideMore": "und {{count}} weitere",
"permissionOverrideMore_one": "und {{count}} weiterer",
"permissionOverrideMore_other": "und {{count}} weitere",
"permissionOverridesUse": "{{mode}} verwenden"
"permissionOverridesUse": "{{mode}} verwenden",
"approveForMe": "für mich genehmigen"
},
"followSymlinkedDirectoriesKeywords": {
"symlink": "Symbolischer Link",
@@ -666,6 +676,34 @@
"preset": {
"devinDesktop": "Devin Desktop"
}
},
"mcp": {
"claudeWorkspace": "Claude-Arbeitsbereich",
"httpServer": "HTTP-Server",
"inspectFailed": "{{directory}} konnte nicht geprüft werden.",
"invalidJson": "Ungültiges JSON",
"invalidServer": "Ungültiger Server",
"noServers": "Keine Server",
"notFound": "Nicht gefunden",
"serverCount_one": "{{count}} Server",
"serverCount_other": "{{count}} Server",
"stdioServer": "stdio-Server",
"unreadable": "Nicht lesbar",
"workspace": "Arbeitsbereich"
},
"shortcuts": {
"parseFailed": "Tastenkürzel konnte nicht ausgewertet werden."
},
"ssh": {
"status": {
"auth-failed": "Authentifizierung fehlgeschlagen",
"connected": "Verbunden",
"connecting": "Verbindung wird hergestellt…",
"deploying-relay": "Relay wird bereitgestellt…",
"disconnected": "Getrennt",
"reconnecting": "Verbindung wird wiederhergestellt…",
"reconnection-failed": "Wiederherstellen der Verbindung fehlgeschlagen"
}
}
},
"menu": {
@@ -2073,7 +2111,6 @@
"LinearIssueTextEditor": {
"947ba2d6f4": "zum Speichern",
"04d73b72dc": "Issue-Titel",
"e8ff595db3": "{{value0}} konnte nicht aktualisiert werden",
"1e08a1ec80": "Titel ist erforderlich"
},
"LinearIssueWorkspace": {
@@ -2425,8 +2462,6 @@
"continuedOne": "1 Chat fortgesetzt",
"continuedMany": "{{value0}} Chats fortgesetzt",
"selectAgent": "{{value0}}-Chat „{{value1}}“ in {{value2}} fortsetzen",
"resumeSelected": "{{value0}} Chats fortsetzen",
"resumeSelectedOne": "1 Chat fortsetzen",
"dismissAll": "Alle verwerfen",
"notContinuedOne": "1 Chat konnte nicht fortgesetzt werden",
"notContinuedMany": "{{value0}} Chats konnten nicht fortgesetzt werden",
@@ -2455,7 +2490,9 @@
"selectMachine": "Alle Chats auf {{value0}} auswählen",
"sshHost": "SSH",
"done": "Abschließen",
"resultListLabel": "Chats dieses Fortsetzungsvorgangs"
"resultListLabel": "Chats dieses Fortsetzungsvorgangs",
"resumeChats_one": "{{count}} Chat fortsetzen",
"resumeChats_other": "{{count}} Chats fortsetzen"
},
"StarNagCard": {
"30c36231c1": "Orca ist Open Source. Wenn es heute hilfreich war, hilft ein Stern auf GitHub anderen Entwicklern, Orca zu finden.",
@@ -2520,9 +2557,6 @@
"7f3f7b4c18": "Beschreibung (optional, Markdown)",
"9f2b4c03a6": "Erstellen in",
"d3d0998b7d": "Neues GitHub-Issue",
"d1e243795c": "Issues",
"be8cf68d9f": "Issues der Ansicht",
"67662ade50": "Projekt-Issues",
"6244a02f46": "In Linear öffnen",
"606a85c774": "Offen",
"5e8061b088": "Arbeitsbereich aus {{value0}} {{value1}} starten",
@@ -2542,11 +2576,9 @@
"af377b13b1": "{{value0}}-Ansicht",
"d47248df4d": "Linear-Ansichtsmodus",
"f397d513e3": "Zurück",
"b39fe6511d": "Projekte",
"8675cd6188": "Linear",
"733b8f2421": "Linear / Ansichten",
"bc06ed0fb0": "Zurück zu den Ansichten",
"3cb855080f": "Ansichten",
"b4e10f096e": "Eigentümer",
"a04fe7ba73": "Sichtbarkeit",
"0aa8525950": "Modell",
@@ -3217,8 +3249,6 @@
"7616c986c6": "{{value0}} Issues öffnen",
"openInLinear": "{{value0}} in Linear öffnen",
"93e1f6bfca": "Wird geladen",
"98730088a6": ". Für die vollständige Liste suchen oder Linear öffnen.",
"06b887d622": "Angezeigt werden die ersten",
"linearLoginUnreadable": "Die gespeicherten Linear-Anmeldedaten konnten nicht gelesen werden. Linear in den Einstellungen erneut verbinden.",
"f2cc1e0ff6": "Linear / Projekte",
"906b5e4cb8": "Linear / Projekte / {{value0}}",
@@ -5674,7 +5704,9 @@
},
"sidebarHostOptions": {
"3e102f111c": "Alle Hosts",
"visibleHostsCount": "{{value0}} Hosts"
"hosts": "Hosts",
"visibleHosts_one": "{{count}} Host",
"visibleHosts_other": "{{count}} Hosts"
},
"SidebarWorkspaceOptionsMenu": {
"hosts": "Hosts",
@@ -13292,10 +13324,10 @@
"dialog": {
"3bc61dc989": "Abbrechen",
"15efa778e3": "Verwerfen",
"42f89dd030": "Dateien",
"e7611dca35": "Datei",
"0d2d88cba5": "Dies kann nicht rückgängig gemacht werden.",
"1551c14668": "Änderungen verwerfen?"
"1551c14668": "Änderungen verwerfen?",
"fileCount_one": "{{count}} Datei",
"fileCount_other": "{{count}} Dateien"
}
},
"dropdown": {
@@ -13522,16 +13554,21 @@
"unresolved": "Der zuständige Host für diesen Arbeitsbereich konnte nicht ermittelt werden. Verbindung prüfen und erneut versuchen."
},
"useFileDeletion": {
"72691dfebc": "Aktion „{{value0}}“ für „{{value1}}“ fehlgeschlagen.",
"d979a4fbb5": "„{{value0}}“ dauerhaft löschen?",
"92276aceb7": "Löschen",
"7fb9435c86": "Das Verzeichnis und sein Inhalt werden auf dem Remote-Host dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden.",
"23e98f192f": "Die Datei wird auf dem Remote-Host dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden.",
"8b8ee9d22f": "Der zuständige Host für diese Datei konnte nicht ermittelt werden. Verbindung des Arbeitsbereichs prüfen und erneut versuchen.",
"af1270b90d": "{{count}} Elemente dauerhaft löschen?",
"dd029aa5cd": "Die ausgewählten Elemente und sämtliche Verzeichnisinhalte werden auf dem Remote-Host dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden.",
"77fdc36183": "{{count}} Elemente löschen?",
"fca915a67a": "Entfernte Elemente werden dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden. Lokale Elemente werden in den {{value0}} verschoben."
"deleteFailed": "„{{name}}“ konnte nicht gelöscht werden.",
"deleteItems_one": "{{count}} Element löschen?",
"deleteItems_other": "{{count}} Elemente löschen?",
"mixedRecycleBin": "Entfernte Elemente werden dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden. Lokale Elemente werden in den Papierkorb verschoben.",
"mixedTrash": "Entfernte Elemente werden dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden. Lokale Elemente werden in den Papierkorb verschoben.",
"permanentlyDeleteItems_one": "{{count}} Element dauerhaft löschen?",
"permanentlyDeleteItems_other": "{{count}} Elemente dauerhaft löschen?",
"recycleBinFailed": "„{{name}}“ konnte nicht in den Papierkorb verschoben werden.",
"trashFailed": "„{{name}}“ konnte nicht in den Papierkorb verschoben werden."
},
"useFileExplorerHandlers": {
"32cd9fd991": "Ziel des symbolischen Links kann nicht geöffnet werden",
@@ -14506,13 +14543,13 @@
"9ee54037a4": "Benutzerdefinierter Befehl",
"4b2fc4b80c": "Denkaufwand",
"be8917699e": "Modell",
"4d9b6d84df": "nicht unterstützt. Claude, Codex oder Benutzerdefiniert auswählen.",
"560d4feb00": "Benutzerdefiniert",
"29d119fe95": "Agent",
"f9382b48a1": "KI-Autor aktivieren",
"1c0cb4fabb": "KI-Autor",
"bd14e9c42a": "Nicht konfiguriert",
"1f9468c5c9": "{{value0}} nicht unterstützt"
"1f9468c5c9": "{{value0}} nicht unterstützt",
"unsupportedAgent": "{{agent}} wird nicht unterstützt. Claude, Codex oder „Benutzerdefiniert“ auswählen."
},
"BrowserAnimatedVisual": {
"46df009982": "Kostenlose Testphase starten",
@@ -18594,6 +18631,15 @@
"settings": "Einstellungen im Terminal öffnen",
"extensions": "Erweiterungs-Dashboard im Terminal öffnen",
"hotkeys": "Tastenkürzel im Terminal anzeigen"
},
"modelDescriptions": {
"fable": "Am leistungsfähigsten für die schwierigsten und am längsten dauernden Aufgaben",
"grok_4_5": "Ein früheres Spitzenmodell von xAI",
"grok_4_6": "Das vorherige Spitzenmodell von xAI",
"grok_4_7": "Das neueste Spitzenmodell von xAI",
"haiku": "Schnellstes Modell für schnelle Antworten",
"opus": "Am besten für komplexe Aufgaben im Alltag",
"sonnet": "Effizient für Routineaufgaben"
}
},
"tab": {
@@ -19271,11 +19317,20 @@
"actionSaveFailed": "Diese Aktion konnte nicht gespeichert werden. In den Einstellungen erneut speichern.",
"discard": {
"deleteUntrackedFileDescription": "Diese nicht versionierte Datei wird dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden.",
"deleteUntrackedFilesDescription": "Diese {{count}} nicht versionierten Dateien werden dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden.",
"deleteUntrackedFilesDescription_other": "Diese {{count}} nicht versionierten Dateien werden dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden.",
"restoreStagedVersionDescription": "Die zuletzt vorgemerkte Version wird wiederhergestellt und die Löschung verworfen. Dies kann nicht rückgängig gemacht werden.",
"unstagedChangesDescription": "Die nicht vorgemerkten Änderungen an dieser Datei werden zurückgesetzt. Dies kann nicht rückgängig gemacht werden.",
"unstagedSelectionIncludingUntrackedDescription": "Nicht vorgemerkte Änderungen werden zurückgesetzt und alle nicht versionierten Dateien in dieser Auswahl dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden.",
"unstagedFilesIncludingUntrackedDescription": "Nicht vorgemerkte Änderungen werden zurückgesetzt und alle nicht versionierten Dateien unter diesen {{count}} Dateien dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden."
"unstagedFilesIncludingUntrackedDescription_other": "Nicht vorgemerkte Änderungen werden zurückgesetzt und alle nicht versionierten Dateien unter diesen {{count}} Dateien dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden.",
"delete": "Löschen",
"deleteCount": "{{count}} löschen",
"deleteUntrackedFilesDescription_one": "{{count}} nicht versionierte Datei wird dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden.",
"deleteUntrackedTitle_one": "{{count}} nicht versionierte Datei löschen?",
"deleteUntrackedTitle_other": "{{count}} nicht versionierte Dateien löschen?",
"discard": "Verwerfen",
"discardAll": "Alle verwerfen",
"restore": "Wiederherstellen",
"unstagedFilesIncludingUntrackedDescription_one": "Nicht vorgemerkte Änderungen an {{count}} Datei werden zurückgesetzt. Ist die Datei nicht versioniert, wird sie dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden."
},
"unlinkedPr": {
"status": "Verknüpfung mit PR #{{number}} aufgehoben"
@@ -19309,6 +19364,34 @@
"creationUnconfirmed": "{{shortLabel}} wurde möglicherweise erstellt. Der Review-Status des Branches wird aktualisiert…",
"withDetail": "Erstellen von {{shortLabel}} fehlgeschlagen: {{detail}}",
"pushFailed": "Push fehlgeschlagen. Den Push-Fehler beheben und erneut versuchen."
},
"model": {
"auto": "Automatisch",
"configDefault": "Standard der Konfiguration"
},
"thinking": {
"high": "Hoch",
"low": "Niedrig",
"max": "Maximal",
"medium": "Mittel",
"minimal": "Minimal",
"off": "Aus",
"xhigh": "Sehr hoch"
},
"variables": {
"assistantMessage": "Die erste Antwort des Agenten, sofern sie Orca vorliegt.",
"baseBranch": "Der im Editor „PR erstellen“ ausgewählte Ziel-Branch.",
"basePrompt": "Orcas integrierter Prompt für diese Aktion, einschließlich des Kontexts, den Orca sicher erfassen kann.",
"branch": "Der aktuelle Branch-Name in der Quellcodeverwaltung.",
"changedFiles": "Eine Zusammenfassung der zwischen dem Branch und dem Basis-Branch geänderten Dateien.",
"commitSummary": "Eine durch Zeilenumbrüche getrennte Liste der Commits auf dem Branch im Vergleich zum Basis-Branch.",
"currentBody": "Die aktuell im Editor eingegebene PR-Beschreibung vor Beginn der Generierung.",
"currentTitle": "Der aktuell im Editor eingegebene PR-Titel vor Beginn der Generierung.",
"firstPrompt": "Die erste Nutzeranfrage für diesen Arbeitsbereich oder Chat.",
"linkedIssue": "Die Nummer des mit diesem Arbeitsbereich verknüpften GitHub-Issues. Leer, wenn kein GitHub-Issue verknüpft ist (auch bei mit GitLab verknüpften Arbeitsbereichen). Vorlagen mit Anweisungen bevorzugen: Ein bloßes „Fixes #{linkedIssue}“ wird ohne Verknüpfung zu „Fixes #“.",
"patch": "Der Diff zwischen dem Branch und dem Basis-Branch für die Generierung der PR-Details.",
"stagedFiles": "Eine durch Zeilenumbrüche getrennte Liste der vorgemerkten Dateien für die Generierung der Commit-Nachricht.",
"stagedPatch": "Der vorgemerkte Git-Patch für die Generierung der Commit-Nachricht."
}
},
"agentsSidebarIntro": {
@@ -19571,7 +19654,9 @@
"confirmTitle": "Terminal-Daemon neu starten?",
"confirmBody": "Ein Neustart beendet alle Prozesse, die über {{sessions}} laufen. Agenten, die das Fortsetzen unterstützen, können danach fortgesetzt werden. Shells und andere Aufgaben können nicht fortgesetzt werden und müssen neu gestartet werden. Den Neustart durchführen, wenn die Agenten inaktiv sind.",
"cancel": "Abbrechen",
"confirm": "Neu starten und Prozesse beenden"
"confirm": "Neu starten und Prozesse beenden",
"count_one": "{{count}} laufendes Terminal",
"count_other": "{{count}} laufende Terminals"
},
"restartedInputNotSent": "Das Terminal wurde während der Eingabe neu gestartet. Daher hat es möglicherweise einen Teil der Eingabe nicht erhalten. Die neue Shell prüfen, bevor die Eingabe wiederholt wird."
},
@@ -19851,7 +19936,11 @@
"picker": {
"pasteUnparseable": "Projekt-URL oder owner/number erwartet",
"ownerLoadFailed": "Projekte von {{owner}} konnten nicht geladen werden.",
"organizationsLoadFailed": "Einige Organisationen konnten nicht geladen werden ({{failureCount}})."
"organizationsLoadFailed": "Einige Organisationen konnten nicht geladen werden ({{failureCount}}).",
"detailsFailed": "Laden der Details fehlgeschlagen",
"listFailed": "Auflisten der Projekte fehlgeschlagen",
"organizations": "Organisationen",
"viewFailed": "Abrufen der Projektansicht fehlgeschlagen"
},
"error": {
"notFoundState": "Dieses Projekt oder diese Ansicht konnte nicht gefunden werden.",
@@ -19886,6 +19975,9 @@
"tooLargeUnknownCount": "Diese Ansicht enthält zu viele Einträge, um in Orca dargestellt zu werden. Den Filter der Ansicht auf GitHub einschränken.",
"tooLarge": "Diese Ansicht enthält {{itemCount}} Einträge — zu viele für die Darstellung in Orca. Den Filter der Ansicht auf GitHub einschränken.",
"schemaDriftDetail": "Diese Projektansicht konnte nicht gelesen werden: {{detail}}."
},
"columns": {
"type": "Typ"
}
},
"projectField": {
@@ -19968,6 +20060,27 @@
"attachments": {
"updateRuntime": "Die entfernte Laufzeitumgebung aktualisieren, um Verknüpfungen des Arbeitsbereichs zu ändern",
"updateRuntimeSafely": "Die entfernte Laufzeitumgebung aktualisieren, um Verknüpfungen des Arbeitsbereichs sicher zu ändern"
},
"activity": {
"active": "Aktiv",
"done": "Abgeschlossen",
"failed": "Fehlgeschlagen",
"inactive": "Inaktiv",
"interrupted": "Unterbrochen",
"monitoring": "Hintergrundaufgaben werden überwacht",
"permission": "Genehmigung erforderlich",
"unconfirmed": "Bestätigung nicht möglich",
"unreadLabel": "{{status}} · ungelesen",
"working": "In Arbeit"
},
"reviewStatus": {
"checksFailed": "{{review}}-Checks: fehlgeschlagen",
"checksPassing": "{{review}}-Checks: erfolgreich",
"checksPending": "{{review}}-Checks: ausstehend",
"closed": "{{review}}: geschlossen",
"draft": "{{review}}: Entwurf",
"merged": "{{review}}: gemergt",
"open": "{{review}}: offen"
}
},
"tabHoverCard": {
@@ -20680,5 +20793,145 @@
},
"startupFailure": {
"title": "Orca konnte nicht gestartet werden"
},
"native": {
"about": {
"gpu": {
"disabled": "Deaktiviert",
"enabled": "Aktiviert",
"safeMode": "Deaktiviert (sicherer Grafikmodus)",
"software": "Software-Rendering",
"summary": "GPU-Beschleunigung: {{status}}",
"unavailable": "Nicht verfügbar",
"unknown": "Unbekannt ({{status}})",
"unknownStatus": "Status nicht verfügbar"
}
},
"dialog": {
"allFiles": "Alle Dateien",
"audio": "Audio",
"cookieFiles": "Cookie-Dateien",
"dashboardTitle": "Orca-Agenten-Dashboard",
"images": "Bilder",
"importCookies": "Cookies importieren",
"importPetBundle": "Ein .codex-pet-Paket auswählen",
"importWarpFolder": "Warp-Designordner importieren",
"importWarpTheme": "Warp-Design importieren",
"petImage": "Haustierbild",
"pickPet": "Haustier auswählen",
"repoIconImages": "Bilder für Repository-Symbole",
"spaceTitle": "Orca Space Beta",
"warpThemeYaml": "Warp-Design-YAML"
}
},
"runtime": {
"compat": {
"clientTooOld": "Dieser Orca-Client ist für den ausgewählten Server zu alt. Orca auf diesem Computer aktualisieren. Client-Protokoll: {{clientProtocol}}; der Server benötigt Client-Protokoll {{requiredProtocol}}.",
"compatible": "Client und Server der Laufzeitumgebung sind kompatibel.",
"serverTooOld": "Der ausgewählte Orca-Server ist für diesen Client zu alt. Orca auf dem Server aktualisieren. Server-Protokoll: {{serverProtocol}}; der Client benötigt Server-Protokoll {{requiredProtocol}}."
},
"health": {
"available": "Verbunden",
"connecting": "Verbindung wird hergestellt",
"disconnected": "Getrennt",
"error": "Aufmerksamkeit erforderlich",
"local": "Lokal",
"mixed": "Gemischt",
"repair": "Erneute Kopplung erforderlich",
"update": "Update erforderlich"
}
},
"taskProviders": {
"errors": {
"jira": {
"apiTokenRequired": "Ein API-Token ist erforderlich.",
"commentBodyRequired": "Ein Kommentartext ist erforderlich.",
"commentFailed": "Der Kommentar konnte nicht hinzugefügt werden.",
"connectionFailed": "Verbindung konnte nicht hergestellt werden.",
"createFailed": "Issue konnte nicht erstellt werden.",
"credentialsRequired": "Website-URL, E-Mail-Adresse und API-Token sind erforderlich.",
"incompleteIssuePage": "Jira hat eine unvollständige Issue-Seite zurückgegeben.",
"incompleteProjectPage": "Jira hat eine unvollständige Projektseite zurückgegeben.",
"invalidCloudId": "Die Website hat keine gültige Atlassian-Cloud-ID gemeldet.",
"invalidIssuePage": "Jira hat eine ungültige Issue-Seite zurückgegeben.",
"invalidProjectPage": "Jira hat eine ungültige Projektseite zurückgegeben.",
"invalidSiteIdentity": "Eine HTTP- oder HTTPS-URL einer Jira-Website ohne Zugangsdaten eingeben.",
"invalidSiteUrl": "Eine gültige URL einer Jira-Website eingeben.",
"issueKeyRequired": "Ein Issue-Schlüssel ist erforderlich.",
"issueSearchLimit": "Die Jira-Issue-Suche hat das Seitenlimit überschritten. Stattdessen ein Projekt mit JQL auswählen.",
"issueTypeRequired": "Ein Issue-Typ ist erforderlich.",
"labelsConflict": "labels oder labelOperations übergeben, nicht beides.",
"missingProjectIdentity": "Jira hat ein Projekt ohne ID oder Schlüssel zurückgegeben.",
"notConnected": "Nicht mit Jira verbunden.",
"passwordRequired": "Ein Passwort ist erforderlich.",
"personalTokenRequired": "Ein persönlicher Zugriffstoken ist erforderlich.",
"projectListLimit": "Die Jira-Projektliste hat das Seitenlimit überschritten. Stattdessen ein Projekt mit JQL auswählen.",
"projectRequired": "Ein Projekt ist erforderlich.",
"repeatedIssueToken": "Jira hat einen ungültigen oder wiederholt verwendeten Token für eine Issue-Seite zurückgegeben.",
"titleRequired": "Ein Titel ist erforderlich.",
"updateFailed": "Issue konnte nicht aktualisiert werden.",
"updatesRequired": "Ein Objekt mit Aktualisierungen ist erforderlich."
},
"linear": {
"commentFailed": "Der Kommentar konnte nicht erstellt werden.",
"createFailed": "Erstellen in Linear fehlgeschlagen",
"createdButUnavailable": "Das Issue wurde erstellt, konnte aber nicht abgerufen werden.",
"noApiKey": "Kein API-Schlüssel gespeichert.",
"notConnected": "Nicht mit Linear verbunden",
"projectCreateFailed": "Erstellen des Linear-Projekts fehlgeschlagen",
"projectIdRequired": "Eine Projekt-ID ist erforderlich.",
"projectNameRequired": "Ein Projektname ist erforderlich.",
"projectNotFound": "Das Projekt wurde nicht gefunden.",
"updateFailed": "Aktualisierung in Linear fehlgeschlagen",
"viewHasNoIssues": "Die benutzerdefinierte Ansicht enthält keine Issues.",
"viewHasNoProjects": "Die benutzerdefinierte Ansicht enthält keine Projekte.",
"viewIdRequired": "Die ID der benutzerdefinierten Ansicht ist erforderlich.",
"workspaceAuthExpired": "Die Linear-Authentifizierung für diesen Arbeitsbereich ist abgelaufen."
}
},
"jira": {
"connectionFailed": "Verbindung fehlgeschlagen",
"localTokenStorage": "Der Token wird lokal gespeichert und verschlüsselt, sofern der lokale Laufzeitspeicher dies unterstützt.",
"remoteTokenStorage": "Der Token wird an die ausgewählte entfernte Laufzeitumgebung gesendet und dort mit der von ihr unterstützten Verschlüsselung gespeichert."
},
"linear": {
"addAccess": "Linear-Zugriff hinzufügen",
"apiKeyHint": "Einen persönlichen API-Schlüssel für den Linear-Arbeitsbereich einfügen, den Orca verwenden soll. Ist dieser Arbeitsbereich bereits verbunden, ersetzt Orca den gespeicherten Schlüssel.",
"commentsLoadFailed": "Kommentare konnten nicht geladen werden.",
"connect": "Verbinden",
"connectionFailed": "Verbindung fehlgeschlagen",
"descriptionUpdateFailed": "Die Beschreibung konnte nicht aktualisiert werden.",
"fetchMore": "Weitere abrufen",
"issuesLoadFailed": "Linear-Issues konnten nicht geladen werden.",
"listLabel": "Linear-Liste",
"localKeyStorage": "Schlüssel der lokalen Laufzeitumgebung werden auf diesem Gerät gespeichert, nach Möglichkeit im verschlüsselten Speicher von Electron.",
"projectIssuesLoadFailed": "Projekt-Issues konnten nicht geladen werden.",
"projectLoadFailed": "Projekt konnte nicht geladen werden.",
"projectNotFound": "Das Projekt wurde nicht gefunden.",
"projectsLoadFailed": "Projekte konnten nicht geladen werden.",
"remoteKeyStorage": "Dieser Schlüssel wird von der aktiven entfernten Laufzeitumgebung gespeichert.",
"titleUpdateFailed": "Der Titel konnte nicht aktualisiert werden.",
"truncated": {
"issues_one": "Es wird nur {{count}} Issue vom Anfang der Liste angezeigt. Für die vollständige Liste die Suche nutzen oder Linear öffnen.",
"issues_other": "Die ersten {{count}} Issues werden angezeigt. Für die vollständige Liste die Suche nutzen oder Linear öffnen.",
"projectIssues_one": "Es wird nur {{count}} Projekt-Issue vom Anfang der Liste angezeigt. Für die vollständige Liste die Suche nutzen oder Linear öffnen.",
"projectIssues_other": "Die ersten {{count}} Projekt-Issues werden angezeigt. Für die vollständige Liste die Suche nutzen oder Linear öffnen.",
"projects_one": "Es wird nur {{count}} Projekt vom Anfang der Liste angezeigt. Für die vollständige Liste die Suche nutzen oder Linear öffnen.",
"projects_other": "Die ersten {{count}} Projekte werden angezeigt. Für die vollständige Liste die Suche nutzen oder Linear öffnen.",
"viewIssues_one": "Es wird nur {{count}} Issue vom Anfang der Ansicht angezeigt. Für die vollständige Liste die Suche nutzen oder Linear öffnen.",
"viewIssues_other": "Die ersten {{count}} Issues der Ansicht werden angezeigt. Für die vollständige Liste die Suche nutzen oder Linear öffnen.",
"views_one": "Es wird nur {{count}} Ansicht vom Anfang der Liste angezeigt. Für die vollständige Liste die Suche nutzen oder Linear öffnen.",
"views_other": "Die ersten {{count}} Ansichten werden angezeigt. Für die vollständige Liste die Suche nutzen oder Linear öffnen."
},
"updateAccess": "Zugriff aktualisieren",
"updateWorkspaceAccess": "Linear-Zugriff für {{workspace}} aktualisieren",
"viewContentsLoadFailed": "Inhalte der Ansicht konnten nicht geladen werden.",
"viewsLoadFailed": "Ansichten konnten nicht geladen werden.",
"workspaceApiKeyHint": "Einen persönlichen API-Schlüssel für {{workspace}} einfügen. Ist dieser Arbeitsbereich bereits verbunden, ersetzt Orca den gespeicherten Schlüssel."
}
},
"workspaceOptions": {
"activeFilterCount_one": "{{count}} Filter",
"activeFilterCount_other": "{{count}} Filter"
}
}
+275 -27
View File
@@ -276,6 +276,15 @@
"title": "History",
"today": "Today",
"yesterday": "Yesterday"
},
"viewport": {
"mobile-s": "Mobile S — 320 × 568",
"mobile-m": "Mobile M — 375 × 667",
"mobile-l": "Mobile L — 425 × 812",
"tablet": "Tablet — 768 × 1024",
"laptop": "Laptop — 1024 × 768",
"laptop-l": "Laptop L — 1440 × 900",
"desktop": "Desktop — 1920 × 1080"
}
},
"editor": {
@@ -639,7 +648,8 @@
"permissionOverrideMore": "and {{count}} more",
"permissionOverrideMore_one": "and {{count}} more",
"permissionOverrideMore_other": "and {{count}} more",
"permissionOverridesUse": "Use {{mode}}"
"permissionOverridesUse": "Use {{mode}}",
"approveForMe": "approve for me"
},
"followSymlinkedDirectoriesKeywords": {
"symlink": "symlink",
@@ -671,6 +681,34 @@
"sameAsAgent": "Same as {{agent}}"
}
},
"ssh": {
"status": {
"disconnected": "Disconnected",
"connecting": "Connecting…",
"auth-failed": "Auth failed",
"deploying-relay": "Deploying relay…",
"connected": "Connected",
"reconnecting": "Reconnecting…",
"reconnection-failed": "Reconnection failed"
}
},
"shortcuts": {
"parseFailed": "Unable to parse shortcut."
},
"mcp": {
"inspectFailed": "Unable to inspect {{directory}}.",
"unreadable": "Unreadable",
"notFound": "Not found",
"invalidJson": "Invalid JSON",
"noServers": "No servers",
"httpServer": "HTTP server",
"stdioServer": "stdio server",
"invalidServer": "Invalid server",
"serverCount_one": "{{count}} server",
"serverCount_other": "{{count}} servers",
"workspace": "Workspace",
"claudeWorkspace": "Claude workspace"
},
"general": {
"openInMenu": {
"keyword": {
@@ -2091,7 +2129,6 @@
"LinearIssueTextEditor": {
"947ba2d6f4": "to save",
"04d73b72dc": "Issue title",
"e8ff595db3": "Failed to update {{value0}}",
"1e08a1ec80": "Title is required"
},
"LinearIssueWorkspace": {
@@ -2439,12 +2476,10 @@
"untitled": "Untitled chat",
"listLabel": "Chats that would be resumed",
"dontAskAgain": "Don't ask again (resume automatically)",
"dontAskAgainHint": "You can turn this off in Settings → Experimental → Chat UI.",
"dontAskAgainHint": "You can turn this off in Settings → Chat → Behavior.",
"continuedOne": "Resumed 1 chat",
"continuedMany": "Resumed {{value0}} chats",
"selectAgent": "Resume {{value0}} chat \"{{value1}}\" in {{value2}}",
"resumeSelected": "Resume {{value0}} chats",
"resumeSelectedOne": "Resume 1 chat",
"dismissAll": "Dismiss all",
"notContinuedOne": "1 chat couldn’t be resumed",
"notContinuedMany": "{{value0}} chats couldn’t be resumed",
@@ -2473,7 +2508,9 @@
"selectMachine": "Select all chats on {{value0}}",
"sshHost": "SSH",
"done": "Done",
"resultListLabel": "Chats in this resume"
"resultListLabel": "Chats in this resume",
"resumeChats_one": "Resume {{count}} chat",
"resumeChats_other": "Resume {{count}} chats"
},
"StarNagCard": {
"30c36231c1": "Orca is open source. If it helped today, a GitHub star helps other developers find it.",
@@ -2538,9 +2575,6 @@
"7f3f7b4c18": "Description (optional, markdown)",
"9f2b4c03a6": "Filing in",
"d3d0998b7d": "New GitHub issue",
"d1e243795c": "issues",
"be8cf68d9f": "view issues",
"67662ade50": "project issues",
"6244a02f46": "Open in Linear",
"606a85c774": "Open",
"5e8061b088": "Start workspace from {{value0}} {{value1}}",
@@ -2560,11 +2594,9 @@
"af377b13b1": "{{value0}} view",
"d47248df4d": "Linear view mode",
"f397d513e3": "Back",
"b39fe6511d": "projects",
"8675cd6188": "Linear",
"733b8f2421": "Linear / Views",
"bc06ed0fb0": "Back to views",
"3cb855080f": "views",
"b4e10f096e": "Owner",
"a04fe7ba73": "Visibility",
"0aa8525950": "Model",
@@ -3235,8 +3267,6 @@
"7616c986c6": "Open {{value0}} issues",
"openInLinear": "Open {{value0}} in Linear",
"93e1f6bfca": "Loading",
"98730088a6": ". Search or open Linear for the full set.",
"06b887d622": "Showing first",
"linearLoginUnreadable": "Unable to read saved Linear login. Reconnect it in Settings.",
"f2cc1e0ff6": "Linear / Projects",
"906b5e4cb8": "Linear / Projects / {{value0}}",
@@ -5705,7 +5735,8 @@
},
"sidebarHostOptions": {
"3e102f111c": "All hosts",
"visibleHostsCount": "{{value0}} hosts"
"hosts": "Hosts",
"visibleHosts_other": "{{count}} hosts"
},
"SidebarWorkspaceOptionsMenu": {
"hosts": "Hosts",
@@ -13329,10 +13360,10 @@
"dialog": {
"3bc61dc989": "Cancel",
"15efa778e3": "Discard",
"42f89dd030": "files",
"e7611dca35": "file",
"0d2d88cba5": "This cannot be undone.",
"1551c14668": "Discard changes?"
"1551c14668": "Discard changes?",
"fileCount_one": "{{count}} file",
"fileCount_other": "{{count}} files"
}
},
"dropdown": {
@@ -13559,16 +13590,19 @@
"unresolved": "Couldn't determine which host owns this workspace. Check the connection and try again."
},
"useFileDeletion": {
"72691dfebc": "Failed to {{value0}} '{{value1}}'.",
"d979a4fbb5": "Permanently delete '{{value0}}'?",
"92276aceb7": "Delete",
"7fb9435c86": "This permanently deletes the directory and its contents on the remote host. This cannot be undone.",
"23e98f192f": "This permanently deletes the file on the remote host. This cannot be undone.",
"8b8ee9d22f": "Couldn't determine which host owns this file. Check the workspace connection and try again.",
"af1270b90d": "Permanently delete {{count}} items?",
"dd029aa5cd": "This permanently deletes the selected items and any directory contents on the remote host. This cannot be undone.",
"77fdc36183": "Delete {{count}} items?",
"fca915a67a": "Remote items are permanently deleted and cannot be undone. Local items move to the {{value0}}."
"deleteFailed": "Failed to delete '{{name}}'.",
"recycleBinFailed": "Failed to move '{{name}}' to the Recycle Bin.",
"trashFailed": "Failed to move '{{name}}' to the Trash.",
"deleteItems_other": "Delete {{count}} items?",
"permanentlyDeleteItems_other": "Permanently delete {{count}} items?",
"mixedRecycleBin": "Remote items are permanently deleted and cannot be undone. Local items move to the Recycle Bin.",
"mixedTrash": "Remote items are permanently deleted and cannot be undone. Local items move to the Trash."
},
"useFileExplorerHandlers": {
"32cd9fd991": "Cannot open symlink target",
@@ -14543,13 +14577,13 @@
"9ee54037a4": "Custom command",
"4b2fc4b80c": "Thinking effort",
"be8917699e": "Model",
"4d9b6d84df": "unsupported. Choose Claude, Codex, or Custom.",
"560d4feb00": "Custom",
"29d119fe95": "Agent",
"f9382b48a1": "Enable AI author",
"1c0cb4fabb": "AI author",
"bd14e9c42a": "Not configured",
"1f9468c5c9": "{{value0}} unsupported"
"1f9468c5c9": "{{value0}} unsupported",
"unsupportedAgent": "{{agent}} is not supported. Choose Claude, Codex, or Custom."
},
"BrowserAnimatedVisual": {
"46df009982": "Start your free trial",
@@ -18632,6 +18666,15 @@
"settings": "Open settings in Terminal",
"extensions": "Open the extension dashboard in Terminal",
"hotkeys": "Show keyboard shortcuts in Terminal"
},
"modelDescriptions": {
"grok_4_7": "xAI's latest frontier model",
"grok_4_6": "xAI's previous frontier model",
"grok_4_5": "An earlier xAI frontier model",
"fable": "Most capable for the hardest, longest-running tasks",
"opus": "Best for everyday, complex tasks",
"sonnet": "Efficient for routine tasks",
"haiku": "Fastest for quick answers"
}
},
"tab": {
@@ -19309,11 +19352,18 @@
"actionSaveFailed": "Could not save this action. Try saving it again in Settings.",
"discard": {
"deleteUntrackedFileDescription": "This will permanently delete this untracked file. This cannot be undone.",
"deleteUntrackedFilesDescription": "This will permanently delete these {{count}} untracked files. This cannot be undone.",
"deleteUntrackedFilesDescription_other": "This will permanently delete these {{count}} untracked files. This cannot be undone.",
"restoreStagedVersionDescription": "This will restore the last staged version and discard the deletion. This cannot be undone.",
"unstagedChangesDescription": "This will revert the unstaged changes to this file. This cannot be undone.",
"unstagedSelectionIncludingUntrackedDescription": "This will revert unstaged changes and permanently delete any untracked files in this selection. This cannot be undone.",
"unstagedFilesIncludingUntrackedDescription": "This will revert unstaged changes and permanently delete any untracked files among these {{count}} files. This cannot be undone."
"unstagedFilesIncludingUntrackedDescription_other": "This will revert unstaged changes and permanently delete any untracked files among these {{count}} files. This cannot be undone.",
"delete": "Delete",
"restore": "Restore",
"discard": "Discard",
"discardAll": "Discard all",
"deleteUntrackedTitle_one": "Delete {{count}} untracked file?",
"deleteUntrackedTitle_other": "Delete {{count}} untracked files?",
"deleteCount": "Delete {{count}}"
},
"unlinkedPr": {
"status": "PR #{{number}} unlinked"
@@ -19347,6 +19397,34 @@
"creationUnconfirmed": "{{shortLabel}} creation may have completed. Refreshing branch review state...",
"withDetail": "Create {{shortLabel}} failed: {{detail}}",
"pushFailed": "Push failed. Resolve the push error, then try again."
},
"variables": {
"basePrompt": "Orca’s built-in prompt for this action, including the context Orca knows how to gather safely.",
"branch": "The current source-control branch name.",
"stagedFiles": "A newline-separated list of staged files for commit-message generation.",
"stagedPatch": "The staged git patch used for commit-message generation.",
"baseBranch": "The target branch selected in the Create PR composer.",
"currentTitle": "The PR title currently typed in the composer before generation starts.",
"currentBody": "The PR description currently typed in the composer before generation starts.",
"commitSummary": "A newline-separated list of commits on the branch compared to the base.",
"changedFiles": "A summary of files changed between the branch and the base branch.",
"patch": "The branch diff against the base branch used for PR-details generation.",
"firstPrompt": "The first user request for this workspace or chat.",
"assistantMessage": "The initial agent response, when Orca has one available.",
"linkedIssue": "The GitHub issue number linked to this workspace. Empty when no GitHub issue is linked (including GitLab-linked workspaces). Prefer instructional templates: a bare \"Fixes #{linkedIssue}\" becomes \"Fixes #\" when unlinked."
},
"model": {
"configDefault": "Config default",
"auto": "Auto"
},
"thinking": {
"off": "Off",
"minimal": "Minimal",
"low": "Low",
"medium": "Medium",
"high": "High",
"xhigh": "Extra High",
"max": "Max"
}
},
"agentsSidebarIntro": {
@@ -19609,7 +19687,9 @@
"confirmTitle": "Restart the terminal daemon?",
"confirmBody": "Restarting ends every process running in {{sessions}}. Agents that support resume can be resumed afterwards; shells and other jobs cannot and must be started again. Do this when your agents are idle.",
"cancel": "Cancel",
"confirm": "Restart and end processes"
"confirm": "Restart and end processes",
"count_one": "{{count}} running terminal",
"count_other": "{{count}} running terminals"
},
"restartedInputNotSent": "The terminal restarted while you were typing, so some input may not have reached it. Check the new shell before typing it again."
},
@@ -19889,7 +19969,11 @@
"picker": {
"pasteUnparseable": "Expected a project URL or owner/number",
"ownerLoadFailed": "Couldn't load projects from {{owner}}.",
"organizationsLoadFailed": "Some organizations didn't load ({{failureCount}})."
"organizationsLoadFailed": "Some organizations didn't load ({{failureCount}}).",
"organizations": "Organizations",
"listFailed": "Failed to list projects",
"detailsFailed": "Failed to load details",
"viewFailed": "Failed to fetch project view"
},
"error": {
"notFoundState": "Could not find this project or view.",
@@ -19924,6 +20008,9 @@
"tooLargeUnknownCount": "This view has too many items to render in Orca. Narrow the view's filter on GitHub.",
"tooLarge": "This view has {{itemCount}} items — too large to render in Orca. Narrow the view's filter on GitHub.",
"schemaDriftDetail": "Could not read this project view: {{detail}}."
},
"columns": {
"type": "Type"
}
},
"projectField": {
@@ -20006,6 +20093,27 @@
"attachments": {
"updateRuntime": "Update the remote runtime to change workspace links",
"updateRuntimeSafely": "Update the remote runtime to safely change workspace links"
},
"activity": {
"active": "Active",
"working": "Working",
"monitoring": "Monitoring background tasks",
"permission": "Needs permission",
"failed": "Failed",
"interrupted": "Interrupted",
"unconfirmed": "Couldn’t confirm",
"done": "Done",
"inactive": "Inactive",
"unreadLabel": "{{status}} · Unread"
},
"reviewStatus": {
"merged": "{{review}}: Merged",
"closed": "{{review}}: Closed",
"draft": "{{review}}: Draft",
"checksFailed": "{{review}} checks: Failed",
"checksPending": "{{review}} checks: Pending",
"checksPassing": "{{review}} checks: Passing",
"open": "{{review}}: Open"
}
},
"tabHoverCard": {
@@ -20718,5 +20826,145 @@
},
"startupFailure": {
"title": "Orca could not start"
},
"runtime": {
"health": {
"mixed": "Mixed",
"local": "Local",
"available": "Connected",
"connecting": "Connecting",
"disconnected": "Disconnected",
"error": "Needs attention",
"repair": "Re-pair needed",
"update": "Update needed"
},
"compat": {
"compatible": "Runtime client and server are compatible.",
"clientTooOld": "This Orca client is too old for the selected server. Update Orca on this machine. Client protocol {{clientProtocol}}, server requires client protocol {{requiredProtocol}}.",
"serverTooOld": "The selected Orca server is too old for this client. Update Orca on the server. Server protocol {{serverProtocol}}, client requires server protocol {{requiredProtocol}}."
}
},
"native": {
"about": {
"gpu": {
"safeMode": "Disabled (Safe Graphics Mode)",
"unknownStatus": "Status unavailable",
"enabled": "Enabled",
"software": "Software rendering",
"disabled": "Disabled",
"unavailable": "Unavailable",
"unknown": "Unknown ({{status}})",
"summary": "GPU acceleration: {{status}}"
}
},
"dialog": {
"spaceTitle": "Orca Space Beta",
"dashboardTitle": "Orca Agent Dashboard",
"importCookies": "Import Cookies",
"cookieFiles": "Cookie Files",
"allFiles": "All Files",
"importPetBundle": "Pick a .codex-pet bundle",
"pickPet": "Pick pet",
"petImage": "Pet image",
"importWarpTheme": "Import Warp Theme",
"warpThemeYaml": "Warp theme YAML",
"importWarpFolder": "Import Warp Theme Folder",
"images": "Images",
"repoIconImages": "Repo icon images",
"audio": "Audio"
}
},
"taskProviders": {
"linear": {
"updateAccess": "Update access",
"addAccess": "Add Linear access",
"listLabel": "Linear list",
"fetchMore": "Fetch more",
"projectsLoadFailed": "Failed to load projects.",
"projectNotFound": "Project was not found.",
"projectLoadFailed": "Failed to load project.",
"projectIssuesLoadFailed": "Failed to load project issues.",
"viewsLoadFailed": "Failed to load views.",
"viewContentsLoadFailed": "Failed to load view contents.",
"issuesLoadFailed": "Failed to load Linear issues.",
"connectionFailed": "Connection failed",
"apiKeyHint": "Paste a Personal API key for the Linear workspace you want Orca to use. If that workspace is already connected, Orca replaces its stored key.",
"remoteKeyStorage": "This key is stored by the active remote runtime.",
"localKeyStorage": "Local runtime keys are stored on this device using Electron encrypted storage when available.",
"commentsLoadFailed": "Failed to load comments.",
"updateWorkspaceAccess": "Update Linear access for {{workspace}}",
"workspaceApiKeyHint": "Paste a Personal API key for {{workspace}}. If this workspace is already connected, Orca replaces its stored key.",
"connect": "Connect",
"titleUpdateFailed": "Failed to update title",
"descriptionUpdateFailed": "Failed to update description",
"truncated": {
"views_one": "Showing the first {{count}} view. Search or open Linear for the full set.",
"views_other": "Showing the first {{count}} views. Search or open Linear for the full set.",
"projects_one": "Showing the first {{count}} project. Search or open Linear for the full set.",
"projects_other": "Showing the first {{count}} projects. Search or open Linear for the full set.",
"projectIssues_one": "Showing the first {{count}} project issue. Search or open Linear for the full set.",
"projectIssues_other": "Showing the first {{count}} project issues. Search or open Linear for the full set.",
"viewIssues_one": "Showing the first {{count}} view issue. Search or open Linear for the full set.",
"viewIssues_other": "Showing the first {{count}} view issues. Search or open Linear for the full set.",
"issues_one": "Showing the first {{count}} issue. Search or open Linear for the full set.",
"issues_other": "Showing the first {{count}} issues. Search or open Linear for the full set."
}
},
"jira": {
"remoteTokenStorage": "Your token is sent to the selected remote runtime and stored there with runtime-supported encryption.",
"localTokenStorage": "Your token is stored locally and encrypted when local runtime storage supports it.",
"connectionFailed": "Connection failed"
},
"errors": {
"linear": {
"notConnected": "Not connected to Linear",
"createFailed": "Linear create failed",
"createdButUnavailable": "Issue was created but could not be retrieved",
"updateFailed": "Linear update failed",
"commentFailed": "Failed to create comment",
"projectCreateFailed": "Linear project create failed",
"noApiKey": "No API key stored.",
"workspaceAuthExpired": "Linear authentication expired for this workspace.",
"projectNameRequired": "Project name is required",
"projectIdRequired": "Project ID is required",
"projectNotFound": "Project was not found",
"viewIdRequired": "Custom view ID is required",
"viewHasNoIssues": "Custom view does not contain issues",
"viewHasNoProjects": "Custom view does not contain projects"
},
"jira": {
"notConnected": "Not connected to Jira.",
"titleRequired": "Title is required.",
"labelsConflict": "Pass labels or labelOperations, not both.",
"createFailed": "Failed to create issue.",
"updateFailed": "Failed to update issue.",
"commentFailed": "Failed to add comment.",
"credentialsRequired": "Site URL, email, and API token are required.",
"projectRequired": "Project is required.",
"issueTypeRequired": "Issue type is required.",
"issueKeyRequired": "Issue key is required.",
"updatesRequired": "Updates object is required.",
"commentBodyRequired": "Comment body is required.",
"invalidSiteUrl": "Enter a valid Jira site URL.",
"passwordRequired": "Password is required.",
"personalTokenRequired": "Personal access token is required.",
"apiTokenRequired": "API token is required.",
"connectionFailed": "Connection failed.",
"invalidSiteIdentity": "Enter an HTTP or HTTPS Jira site URL without credentials.",
"missingProjectIdentity": "Jira returned a project without an ID or key.",
"invalidIssuePage": "Jira returned an invalid issue page.",
"incompleteIssuePage": "Jira returned an incomplete issue page.",
"repeatedIssueToken": "Jira returned an invalid or repeated issue page token.",
"issueSearchLimit": "Jira issue search exceeded the page limit. Select a project with JQL instead.",
"invalidProjectPage": "Jira returned an invalid project page.",
"incompleteProjectPage": "Jira returned an incomplete project page.",
"projectListLimit": "Jira project list exceeded the page limit. Select a project with JQL instead.",
"invalidCloudId": "The site did not report a valid Atlassian cloud ID."
}
}
},
"workspaceOptions": {
"activeFilterCount_one": "{{count}} filter",
"activeFilterCount_other": "{{count}} filters"
}
}
+282 -28
View File
@@ -350,7 +350,8 @@
"permissionOverrideMore": "y {{count}} más",
"permissionOverrideMore_one": "y {{count}} más",
"permissionOverrideMore_other": "y {{count}} más",
"permissionOverridesUse": "Usar {{mode}}"
"permissionOverridesUse": "Usar {{mode}}",
"approveForMe": "aprobar por mí"
},
"followSymlinkedDirectoriesKeywords": {
"symlink": "enlace simbólico",
@@ -381,6 +382,34 @@
"actionPermissions": {
"sameAsAgent": "Igual que {{agent}}"
}
},
"ssh": {
"status": {
"disconnected": "Desconectado",
"connecting": "Conectando…",
"auth-failed": "Error de autenticación",
"connected": "Conectado",
"reconnection-failed": "Error de reconexión",
"deploying-relay": "Desplegando relay…",
"reconnecting": "Reconectando…"
}
},
"mcp": {
"workspace": "Espacio de trabajo",
"inspectFailed": "No se pudo inspeccionar {{directory}}.",
"unreadable": "No se puede leer",
"notFound": "No se encontró",
"invalidJson": "JSON no válido",
"noServers": "Sin servidores",
"httpServer": "Servidor HTTP",
"stdioServer": "Servidor stdio",
"invalidServer": "Servidor no válido",
"serverCount_one": "{{count}} servidor",
"serverCount_other": "{{count}} servidores",
"claudeWorkspace": "Espacio de trabajo de Claude"
},
"shortcuts": {
"parseFailed": "No se pudo interpretar el atajo."
}
},
"menu": {
@@ -1799,7 +1828,6 @@
"LinearIssueTextEditor": {
"947ba2d6f4": "guardar",
"04d73b72dc": "Título del issue",
"e8ff595db3": "No se pudo actualizar {{value0}}",
"1e08a1ec80": "El título es obligatorio"
},
"LinearIssueWorkspace": {
@@ -2196,9 +2224,6 @@
"7f3f7b4c18": "Descripción (opcional, markdown)",
"9f2b4c03a6": "Creando en",
"d3d0998b7d": "Nuevo issue de GitHub",
"d1e243795c": "issues",
"be8cf68d9f": "ver issues",
"67662ade50": "issues del proyecto",
"6244a02f46": "Abrir en Linear",
"606a85c774": "Abierto",
"5e8061b088": "Iniciar espacio de trabajo desde {{value0}} {{value1}}",
@@ -2218,11 +2243,9 @@
"af377b13b1": "Vista {{value0}}",
"d47248df4d": "Modo de vista de Linear",
"f397d513e3": "Atrás",
"b39fe6511d": "proyectos",
"8675cd6188": "Linear",
"733b8f2421": "Linear / Vistas",
"bc06ed0fb0": "Volver a vistas",
"3cb855080f": "vistas",
"b4e10f096e": "Propietario",
"a04fe7ba73": "Visibilidad",
"0aa8525950": "Modelo",
@@ -2893,8 +2916,6 @@
"7616c986c6": "Abrir issues de {{value0}}",
"openInLinear": "Abrir {{value0}} en Linear",
"93e1f6bfca": "Cargando",
"98730088a6": ". Busca o abre Linear para ver el conjunto completo.",
"06b887d622": "Mostrando primero",
"linearLoginUnreadable": "No se puede leer el inicio de sesión guardado de Linear. Vuelve a conectarlo en Configuración.",
"f2cc1e0ff6": "Linear / Proyectos",
"906b5e4cb8": "Linear / Proyectos / {{value0}}",
@@ -5915,7 +5936,9 @@
},
"sidebarHostOptions": {
"3e102f111c": "Todos los hosts",
"visibleHostsCount": "{{value0}} hosts"
"hosts": "Hosts",
"visibleHosts_one": "{{count}} host",
"visibleHosts_other": "{{count}} hosts"
},
"HostRemoveDialog": {
"1a2b3c4d5e": "Se quitó {{value0}}",
@@ -12984,10 +13007,10 @@
"dialog": {
"3bc61dc989": "Cancelar",
"15efa778e3": "Descartar",
"42f89dd030": "archivos",
"e7611dca35": "archivo",
"0d2d88cba5": "Esto no se puede deshacer.",
"1551c14668": "¿Descartar cambios?"
"1551c14668": "¿Descartar cambios?",
"fileCount_one": "{{count}} archivo",
"fileCount_other": "{{count}} archivos"
}
},
"dropdown": {
@@ -13214,16 +13237,21 @@
"unresolved": "No se pudo determinar qué host posee este espacio de trabajo. Comprueba la conexión e inténtalo de nuevo."
},
"useFileDeletion": {
"72691dfebc": "No se pudo {{value0}} '{{value1}}'.",
"d979a4fbb5": "¿Eliminar '{{value0}}' permanentemente?",
"92276aceb7": "Eliminar",
"7fb9435c86": "Esto elimina permanentemente el directorio y su contenido en el host remoto. Esto no se puede deshacer.",
"23e98f192f": "Esto elimina permanentemente el archivo en el host remoto. Esto no se puede deshacer.",
"8b8ee9d22f": "No se pudo determinar qué host posee este archivo. Comprueba la conexión del espacio de trabajo e inténtalo de nuevo.",
"af1270b90d": "¿Eliminar {{count}} elementos permanentemente?",
"dd029aa5cd": "Esto elimina permanentemente los elementos seleccionados y el contenido de cualquier directorio en el host remoto. Esto no se puede deshacer.",
"77fdc36183": "Delete {{count}} items?",
"fca915a67a": "Los elementos remotos se eliminan permanentemente y esta acción no se puede deshacer. Los elementos locales se mueven a {{value0}}."
"deleteFailed": "No se pudo eliminar '{{name}}'.",
"deleteItems_one": "¿Eliminar {{count}} elemento?",
"deleteItems_other": "¿Eliminar {{count}} elementos?",
"mixedRecycleBin": "Los elementos remotos se eliminan permanentemente y esta acción no se puede deshacer. Los elementos locales se mueven a la Papelera de reciclaje.",
"mixedTrash": "Los elementos remotos se eliminan permanentemente y esta acción no se puede deshacer. Los elementos locales se mueven a la Papelera.",
"permanentlyDeleteItems_one": "¿Eliminar {{count}} elemento permanentemente?",
"permanentlyDeleteItems_other": "¿Eliminar {{count}} elementos permanentemente?",
"recycleBinFailed": "No se pudo mover '{{name}}' a la Papelera de reciclaje.",
"trashFailed": "No se pudo mover '{{name}}' a la Papelera."
},
"useFileExplorerHandlers": {
"32cd9fd991": "No se puede abrir el destino del enlace simbólico",
@@ -14181,13 +14209,13 @@
"9ee54037a4": "Comando personalizado",
"4b2fc4b80c": "Esfuerzo de razonamiento",
"be8917699e": "Modelo",
"4d9b6d84df": "no compatible. Elige Claude, Codex o Personalizado.",
"560d4feb00": "Personalizado",
"29d119fe95": "Agente",
"f9382b48a1": "Habilitar autor de IA",
"1c0cb4fabb": "Autor de IA",
"bd14e9c42a": "No configurado",
"1f9468c5c9": "{{value0}} no compatible"
"1f9468c5c9": "{{value0}} no compatible",
"unsupportedAgent": "{{agent}} no es compatible. Elige Claude, Codex o Personalizado."
},
"BrowserAnimatedVisual": {
"46df009982": "Comienza tu prueba gratuita",
@@ -17032,12 +17060,10 @@
"untitled": "Chat sin título",
"listLabel": "Chats que se reanudarían",
"dontAskAgain": "No volver a preguntar (reanudar automáticamente)",
"dontAskAgainHint": "Puedes desactivarlo en Ajustes → Experimental → Interfaz de chat.",
"dontAskAgainHint": "Puedes desactivarlo en Ajustes → Chat → Comportamiento.",
"continuedOne": "Se reanudó 1 chat",
"continuedMany": "Se reanudaron {{value0}} chats",
"selectAgent": "Reanudar {{value0}} chat \"{{value1}}\" en {{value2}}",
"resumeSelected": "Reanudar {{value0}} chats",
"resumeSelectedOne": "Reanudar 1 chat",
"dismissAll": "Descartar todo",
"selectWorkspace": "Seleccionar todos los chats en {{value0}}",
"workspaceSelectedCount": "{{value0}} de {{value1}}",
@@ -17056,7 +17082,9 @@
"serverDismiss": "Descartar",
"serverResumeAll": "Reanudar los {{count}} en {{machine}}",
"serverResumeHereOne": "Reanudar 1 chat iniciado aquí",
"serverResumeHere": "Reanudar {{count}} chats iniciados aquí"
"serverResumeHere": "Reanudar {{count}} chats iniciados aquí",
"resumeChats_one": "Reanudar {{count}} chat",
"resumeChats_other": "Reanudar {{count}} chats"
},
"NativeChatResumeOutcomeRow": {
"openChat": "Abrir chat",
@@ -17588,7 +17616,8 @@
"compactAfterRetry": "Reintente su mensaje anterior y luego ejecute /compact.",
"clearAfterSending": "Su mensaje anterior todavía se está enviando. Ejecute /clear cuando se haya enviado.",
"compactAfterSending": "Su mensaje anterior todavía se está enviando. Ejecute /compact cuando se haya enviado.",
"pendingWork": "Espera a que terminen el trabajo y los mensajes pendientes antes de usar este comando."
"pendingWork": "Espera a que terminen el trabajo y los mensajes pendientes antes de usar este comando.",
"notDoneGoalChangeIncomplete": "No se pudo terminar de cambiar el objetivo. Revisa el chat."
},
"composer": {
"imageUnavailable": "Vista previa no disponible",
@@ -18257,6 +18286,15 @@
"settings": "Abrir la configuración en la terminal",
"extensions": "Abrir el panel de extensiones en la terminal",
"hotkeys": "Mostrar los atajos de teclado en la terminal"
},
"modelDescriptions": {
"grok_4_7": "El modelo de vanguardia más reciente de xAI",
"grok_4_6": "El modelo de vanguardia anterior de xAI",
"grok_4_5": "Un modelo de vanguardia anterior de xAI",
"fable": "El más capaz para las tareas más difíciles y largas",
"opus": "Ideal para tareas cotidianas y complejas",
"sonnet": "Eficiente para tareas rutinarias",
"haiku": "El más rápido para respuestas breves"
}
},
"tab": {
@@ -19046,6 +19084,15 @@
"empty": "No hay extensiones activadas para este perfil",
"visitWebStore": "Visitar Chrome Web Store",
"manage": "Administrar extensiones"
},
"viewport": {
"mobile-s": "Móvil S — 320 × 568",
"mobile-m": "Móvil M — 375 × 667",
"mobile-l": "Móvil L — 425 × 812",
"tablet": "Tableta — 768 × 1024",
"laptop": "Portátil — 1024 × 768",
"laptop-l": "Portátil L — 1440 × 900",
"desktop": "Escritorio — 1920 × 1080"
}
},
"runtimeRpc": {
@@ -19627,7 +19674,9 @@
"confirmTitle": "¿Reiniciar el daemon de terminal?",
"confirmBody": "Reiniciar termina todos los procesos que se ejecutan en {{sessions}}. Los agentes que admiten reanudación pueden reanudarse después; los shells y otros trabajos no, y deben iniciarse de nuevo. Hazlo cuando tus agentes estén inactivos.",
"cancel": "Cancelar",
"confirm": "Reiniciar y terminar procesos"
"confirm": "Reiniciar y terminar procesos",
"count_other": "{{count}} terminales en ejecución",
"count_one": "{{count}} terminal en ejecución"
},
"restartedInputNotSent": "El terminal se reinició mientras escribías, así que parte de la entrada puede no haberle llegado. Revisa el nuevo shell antes de volver a escribirla.",
"stalledDaemonBanner": {
@@ -19656,11 +19705,20 @@
"actionSaveFailed": "No se pudo guardar esta acción. Intenta guardarla de nuevo en Ajustes.",
"discard": {
"deleteUntrackedFileDescription": "Esto eliminará permanentemente este archivo sin seguimiento. No se puede deshacer.",
"deleteUntrackedFilesDescription": "Esto eliminará permanentemente estos {{count}} archivos sin seguimiento. No se puede deshacer.",
"deleteUntrackedFilesDescription_other": "Esto eliminará permanentemente estos {{count}} archivos sin seguimiento. No se puede deshacer.",
"restoreStagedVersionDescription": "Esto restaurará la última versión preparada y descartará la eliminación. No se puede deshacer.",
"unstagedChangesDescription": "Esto revertirá los cambios no preparados de este archivo. No se puede deshacer.",
"unstagedSelectionIncludingUntrackedDescription": "Esto revertirá los cambios no preparados y eliminará permanentemente cualquier archivo sin seguimiento de esta selección. No se puede deshacer.",
"unstagedFilesIncludingUntrackedDescription": "Esto revertirá los cambios no preparados y eliminará permanentemente cualquier archivo sin seguimiento entre estos {{count}} archivos. No se puede deshacer."
"unstagedFilesIncludingUntrackedDescription_other": "Esto revertirá los cambios no preparados y eliminará permanentemente cualquier archivo sin seguimiento entre estos {{count}} archivos. No se puede deshacer.",
"delete": "Eliminar",
"restore": "Restaurar",
"discard": "Descartar",
"discardAll": "Descartar todo",
"deleteUntrackedTitle_one": "¿Eliminar {{count}} archivo sin seguimiento?",
"deleteUntrackedTitle_other": "¿Eliminar {{count}} archivos sin seguimiento?",
"deleteCount": "Eliminar {{count}}",
"deleteUntrackedFilesDescription_one": "Esto eliminará permanentemente {{count}} archivo sin seguimiento. No se puede deshacer.",
"unstagedFilesIncludingUntrackedDescription_one": "Esto revertirá los cambios no preparados de {{count}} archivo y lo eliminará permanentemente si no tiene seguimiento. No se puede deshacer."
},
"unlinkedPr": {
"status": "PR #{{number}} desvinculada"
@@ -19694,6 +19752,34 @@
"creationUnconfirmed": "Puede que la creación de {{shortLabel}} se haya completado. Actualizando el estado de revisión de la rama...",
"withDetail": "No se pudo crear {{shortLabel}}: {{detail}}",
"pushFailed": "El push falló. Resuelve el error de push y vuelve a intentarlo."
},
"model": {
"auto": "Automático",
"configDefault": "Predeterminado de la configuración"
},
"thinking": {
"off": "Desactivado",
"minimal": "Mínimo",
"low": "Bajo",
"medium": "Medio",
"high": "Alto",
"max": "Máximo",
"xhigh": "Muy alto"
},
"variables": {
"basePrompt": "El prompt integrado de Orca para esta acción, incluido el contexto que Orca puede recopilar de forma segura.",
"branch": "El nombre de la rama actual del control de versiones.",
"stagedFiles": "Una lista de archivos en staging, separados por saltos de línea, para generar el mensaje de commit.",
"stagedPatch": "El parche de Git en staging usado para generar el mensaje de commit.",
"baseBranch": "La rama de destino seleccionada al crear el PR.",
"currentTitle": "El título del PR introducido en el editor antes de iniciar la generación.",
"currentBody": "La descripción del PR introducida en el editor antes de iniciar la generación.",
"commitSummary": "Una lista de commits de la rama respecto a la base, separados por saltos de línea.",
"changedFiles": "Un resumen de los archivos modificados entre la rama y su base.",
"patch": "El diff de la rama respecto a su base usado para generar los detalles del PR.",
"firstPrompt": "La primera solicitud del usuario en este espacio de trabajo o chat.",
"assistantMessage": "La respuesta inicial del agente, cuando Orca dispone de ella.",
"linkedIssue": "El número del issue de GitHub vinculado a este espacio de trabajo. Vacío si no hay un issue de GitHub vinculado (también en espacios vinculados a GitLab). Usa plantillas con instrucciones: \"Fixes #{linkedIssue}\" por sí solo se convierte en \"Fixes #\" si no hay vínculo."
}
},
"aiVault": {
@@ -19870,7 +19956,11 @@
"picker": {
"pasteUnparseable": "Se esperaba una URL de proyecto o owner/number",
"ownerLoadFailed": "No se pudieron cargar los proyectos de {{owner}}.",
"organizationsLoadFailed": "Algunas organizaciones no se cargaron ({{failureCount}})."
"organizationsLoadFailed": "Algunas organizaciones no se cargaron ({{failureCount}}).",
"organizations": "Organizaciones",
"listFailed": "No se pudieron listar los proyectos",
"detailsFailed": "No se pudieron cargar los detalles",
"viewFailed": "No se pudo obtener la vista del proyecto"
},
"error": {
"notFoundState": "No se pudo encontrar este proyecto o vista.",
@@ -19905,6 +19995,9 @@
"tooLargeUnknownCount": "Esta vista tiene demasiados elementos para mostrarla en Orca. Restringe el filtro de la vista en GitHub.",
"tooLarge": "Esta vista tiene {{itemCount}} elementos, demasiados para mostrarla en Orca. Restringe el filtro de la vista en GitHub.",
"schemaDriftDetail": "No se pudo leer esta vista del proyecto: {{detail}}."
},
"columns": {
"type": "Tipo"
}
},
"projectField": {
@@ -19991,6 +20084,27 @@
"attachments": {
"updateRuntime": "Actualiza el tiempo de ejecución remoto para cambiar los enlaces del espacio de trabajo",
"updateRuntimeSafely": "Actualiza el tiempo de ejecución remoto para cambiar de forma segura los enlaces del espacio de trabajo"
},
"activity": {
"active": "Activo",
"working": "Trabajando",
"monitoring": "Supervisando tareas en segundo plano",
"failed": "Fallido",
"interrupted": "Interrumpido",
"unconfirmed": "No se pudo confirmar",
"done": "Listo",
"inactive": "Inactivo",
"permission": "Necesita permiso",
"unreadLabel": "{{status}} · Sin leer"
},
"reviewStatus": {
"checksFailed": "Checks de {{review}}: Fallidos",
"checksPassing": "Checks de {{review}}: Correctos",
"checksPending": "Checks de {{review}}: Pendientes",
"closed": "{{review}}: Cerrada",
"draft": "{{review}}: Borrador",
"merged": "{{review}}: Fusionada",
"open": "{{review}}: Abierta"
}
},
"tabHoverCard": {
@@ -20490,5 +20604,145 @@
"math": {
"scrollDisplayEquation": "Desplazar ecuación en bloque"
}
},
"runtime": {
"health": {
"available": "Conectado",
"connecting": "Conectando",
"disconnected": "Desconectado",
"error": "Requiere atención",
"mixed": "Mixto",
"local": "Local",
"repair": "Requiere volver a emparejar",
"update": "Requiere actualización"
},
"compat": {
"compatible": "El cliente y el servidor del entorno de ejecución son compatibles.",
"clientTooOld": "Este cliente de Orca es demasiado antiguo para el servidor seleccionado. Actualiza Orca en este equipo. Protocolo del cliente: {{clientProtocol}}; el servidor requiere el protocolo de cliente {{requiredProtocol}}.",
"serverTooOld": "El servidor de Orca seleccionado es demasiado antiguo para este cliente. Actualiza Orca en el servidor. Protocolo del servidor: {{serverProtocol}}; el cliente requiere el protocolo de servidor {{requiredProtocol}}."
}
},
"native": {
"about": {
"gpu": {
"unknownStatus": "Estado no disponible",
"enabled": "Activado",
"disabled": "Desactivado",
"unavailable": "No disponible",
"safeMode": "Desactivada (modo gráfico seguro)",
"software": "Renderizado por software",
"unknown": "Desconocido ({{status}})",
"summary": "Aceleración GPU: {{status}}"
}
},
"dialog": {
"importCookies": "Importar cookies",
"spaceTitle": "Espacio de Orca (beta)",
"dashboardTitle": "Panel de agentes de Orca",
"cookieFiles": "Archivos de cookies",
"allFiles": "Todos los archivos",
"importPetBundle": "Seleccionar un paquete .codex-pet",
"pickPet": "Seleccionar mascota",
"petImage": "Imagen de mascota",
"importWarpTheme": "Importar tema de Warp",
"warpThemeYaml": "YAML de tema de Warp",
"importWarpFolder": "Importar carpeta de temas de Warp",
"images": "Imágenes",
"repoIconImages": "Imágenes de icono del repositorio",
"audio": "Audio"
}
},
"taskProviders": {
"linear": {
"updateAccess": "Actualizar acceso",
"addAccess": "Agregar acceso Linear",
"fetchMore": "Cargar más",
"connectionFailed": "La conexión falló",
"listLabel": "Lista de Linear",
"projectsLoadFailed": "No se pudieron cargar los proyectos.",
"projectNotFound": "No se encontró el proyecto.",
"projectLoadFailed": "No se pudo cargar el proyecto.",
"projectIssuesLoadFailed": "No se pudieron cargar los issues del proyecto.",
"viewsLoadFailed": "No se pudieron cargar las vistas.",
"viewContentsLoadFailed": "No se pudo cargar el contenido de la vista.",
"issuesLoadFailed": "No se pudieron cargar los issues de Linear.",
"apiKeyHint": "Pega una clave API personal del espacio de trabajo de Linear que quieras usar en Orca. Si ya está conectado, Orca sustituirá la clave guardada.",
"remoteKeyStorage": "Esta clave se guarda en el entorno de ejecución remoto activo.",
"localKeyStorage": "Las claves del entorno de ejecución local se guardan en este dispositivo con el almacenamiento cifrado de Electron cuando está disponible.",
"commentsLoadFailed": "No se pudieron cargar los comentarios.",
"updateWorkspaceAccess": "Actualizar el acceso a Linear para {{workspace}}",
"workspaceApiKeyHint": "Pega una clave API personal de {{workspace}}. Si ya está conectado, Orca sustituirá la clave guardada.",
"connect": "Conectar",
"descriptionUpdateFailed": "No se pudo actualizar la descripción",
"titleUpdateFailed": "No se pudo actualizar el título",
"truncated": {
"issues_one": "Se muestra {{count}} issue, el primero de la lista. Busca o abre Linear para ver la lista completa.",
"issues_other": "Se muestran los primeros {{count}} issues. Busca o abre Linear para ver la lista completa.",
"projectIssues_one": "Se muestra {{count}} issue del proyecto, el primero de la lista. Busca o abre Linear para ver la lista completa.",
"projectIssues_other": "Se muestran los primeros {{count}} issues del proyecto. Busca o abre Linear para ver la lista completa.",
"projects_one": "Se muestra {{count}} proyecto, el primero de la lista. Busca o abre Linear para ver la lista completa.",
"projects_other": "Se muestran los primeros {{count}} proyectos. Busca o abre Linear para ver la lista completa.",
"viewIssues_one": "Se muestra {{count}} issue de la vista, el primero de la lista. Busca o abre Linear para ver la lista completa.",
"viewIssues_other": "Se muestran los primeros {{count}} issues de la vista. Busca o abre Linear para ver la lista completa.",
"views_one": "Se muestra {{count}} vista, la primera de la lista. Busca o abre Linear para ver la lista completa.",
"views_other": "Se muestran las primeras {{count}} vistas. Busca o abre Linear para ver la lista completa."
}
},
"jira": {
"connectionFailed": "La conexión falló",
"remoteTokenStorage": "Tu token se envía al entorno de ejecución remoto seleccionado y se almacena allí con el cifrado que admita.",
"localTokenStorage": "Tu token se almacena localmente y se cifra si el almacenamiento del entorno de ejecución local lo admite."
},
"errors": {
"jira": {
"createFailed": "No se pudo crear el issue.",
"commentFailed": "No se pudo agregar el comentario.",
"notConnected": "Sin conexión a Jira.",
"titleRequired": "El título es obligatorio.",
"labelsConflict": "Proporciona labels o labelOperations, pero no ambos.",
"updateFailed": "No se pudo actualizar el issue.",
"credentialsRequired": "La URL del sitio, el correo y el token de API son obligatorios.",
"projectRequired": "El proyecto es obligatorio.",
"issueTypeRequired": "El tipo de issue es obligatorio.",
"issueKeyRequired": "La clave del issue es obligatoria.",
"updatesRequired": "El objeto de actualización es obligatorio.",
"commentBodyRequired": "El contenido del comentario es obligatorio.",
"invalidSiteUrl": "Introduce una URL válida del sitio de Jira.",
"passwordRequired": "La contraseña es obligatoria.",
"personalTokenRequired": "El token de acceso personal es obligatorio.",
"apiTokenRequired": "El token de API es obligatorio.",
"connectionFailed": "Error de conexión.",
"invalidSiteIdentity": "Introduce una URL de Jira HTTP o HTTPS sin credenciales.",
"missingProjectIdentity": "Jira devolvió un proyecto sin ID o clave.",
"invalidIssuePage": "Jira devolvió una página de issues no válida.",
"incompleteIssuePage": "Jira devolvió una página de issues incompleta.",
"repeatedIssueToken": "Jira devolvió un token de página de issues no válido o repetido.",
"issueSearchLimit": "La búsqueda de issues de Jira superó el límite de páginas. Selecciona un proyecto mediante JQL.",
"invalidProjectPage": "Jira devolvió una página de proyectos no válida.",
"incompleteProjectPage": "Jira devolvió una página de proyectos incompleta.",
"projectListLimit": "La lista de proyectos de Jira superó el límite de páginas. Selecciona un proyecto mediante JQL.",
"invalidCloudId": "El sitio no proporcionó un ID válido de Atlassian Cloud."
},
"linear": {
"notConnected": "Sin conexión a Linear",
"createFailed": "Error al crear en Linear",
"createdButUnavailable": "El issue se creó, pero no se pudo recuperar",
"updateFailed": "Error al actualizar en Linear",
"commentFailed": "No se pudo crear el comentario",
"projectCreateFailed": "Error al crear el proyecto de Linear",
"noApiKey": "No hay ninguna clave API guardada.",
"workspaceAuthExpired": "La autenticación de Linear ha caducado para este espacio de trabajo.",
"projectNameRequired": "El nombre del proyecto es obligatorio",
"projectIdRequired": "El ID del proyecto es obligatorio",
"projectNotFound": "No se encontró el proyecto",
"viewIdRequired": "El ID de la vista personalizada es obligatorio",
"viewHasNoIssues": "La vista personalizada no contiene issues",
"viewHasNoProjects": "La vista personalizada no contiene proyectos"
}
}
},
"workspaceOptions": {
"activeFilterCount_one": "{{count}} filtro",
"activeFilterCount_other": "{{count}} filtros"
}
}
+282 -28
View File
@@ -189,6 +189,15 @@
"empty": "Aucune extension n'est activée pour ce profil",
"visitWebStore": "Visiter le Chrome Web Store",
"manage": "Gérer les extensions"
},
"viewport": {
"mobile-s": "Mobile S — 320 × 568",
"mobile-m": "Mobile M — 375 × 667",
"mobile-l": "Mobile L — 425 × 812",
"tablet": "Tablette — 768 × 1024",
"laptop": "Ordinateur portable — 1024 × 768",
"laptop-l": "Grand ordinateur portable — 1440 × 900",
"desktop": "Ordinateur de bureau — 1920 × 1080"
}
},
"githubChecks": {
@@ -523,7 +532,8 @@
"permissionOverrideMore": "et {{count}} de plus",
"permissionOverrideMore_one": "et {{count}} de plus",
"permissionOverrideMore_other": "et {{count}} de plus",
"permissionOverridesUse": "Utiliser {{mode}}"
"permissionOverridesUse": "Utiliser {{mode}}",
"approveForMe": "approuver pour moi"
},
"followSymlinkedDirectoriesKeywords": {
"symlink": "lien symbolique",
@@ -554,6 +564,34 @@
"actionPermissions": {
"sameAsAgent": "Comme {{agent}}"
}
},
"ssh": {
"status": {
"disconnected": "Déconnecté",
"connecting": "Connexion…",
"auth-failed": "Échec de l'authentification",
"connected": "Connecté",
"reconnection-failed": "Échec de la reconnexion",
"deploying-relay": "Déploiement du relais…",
"reconnecting": "Reconnexion…"
}
},
"mcp": {
"workspace": "Espace de travail",
"inspectFailed": "Impossible d’inspecter {{directory}}.",
"unreadable": "Illisible",
"notFound": "Introuvable",
"invalidJson": "JSON invalide",
"noServers": "Aucun serveur",
"httpServer": "Serveur HTTP",
"stdioServer": "Serveur stdio",
"invalidServer": "Serveur invalide",
"serverCount_one": "{{count}} serveur",
"serverCount_other": "{{count}} serveurs",
"claudeWorkspace": "Espace de travail Claude"
},
"shortcuts": {
"parseFailed": "Impossible d’analyser le raccourci."
}
},
"menu": {
@@ -1976,7 +2014,6 @@
"LinearIssueTextEditor": {
"947ba2d6f4": "pour enregistrer",
"04d73b72dc": "Titre du ticket",
"e8ff595db3": "Échec de la mise à jour de {{value0}}",
"1e08a1ec80": "Le titre est obligatoire"
},
"LinearIssueWorkspace": {
@@ -2373,9 +2410,6 @@
"7f3f7b4c18": "Description (facultatif, markdown)",
"9f2b4c03a6": "Création dans",
"d3d0998b7d": "Nouveau ticket GitHub",
"d1e243795c": "tickets",
"be8cf68d9f": "voir les tickets",
"67662ade50": "tickets du projet",
"6244a02f46": "Ouvrir dans Linear",
"606a85c774": "Ouvert",
"5e8061b088": "Démarrer un espace de travail depuis {{value0}} {{value1}}",
@@ -2395,11 +2429,9 @@
"af377b13b1": "Vue {{value0}}",
"d47248df4d": "Mode d'affichage Linear",
"f397d513e3": "Retour",
"b39fe6511d": "projets",
"8675cd6188": "Linear",
"733b8f2421": "Linear / Vues",
"bc06ed0fb0": "Retour aux vues",
"3cb855080f": "vues",
"b4e10f096e": "Propriétaire",
"a04fe7ba73": "Visibilité",
"0aa8525950": "Modèle",
@@ -3070,8 +3102,6 @@
"7616c986c6": "Ouvrir {{value0}} issues",
"openInLinear": "Ouvrir {{value0}} dans Linear",
"93e1f6bfca": "Chargement",
"98730088a6": ". Recherchez ou ouvrez Linear pour voir l'ensemble complet.",
"06b887d622": "Affichage des premières",
"linearLoginUnreadable": "Impossible de lire la connexion Linear enregistrée. Reconnectez-la dans les réglages.",
"f2cc1e0ff6": "Linear / Projets",
"906b5e4cb8": "Linear / Projets / {{value0}}",
@@ -5526,7 +5556,9 @@
},
"sidebarHostOptions": {
"3e102f111c": "Tous les hôtes",
"visibleHostsCount": "{{value0}} hôtes"
"hosts": "Hôtes",
"visibleHosts_one": "{{count}} hôte",
"visibleHosts_other": "{{count}} hôtes"
},
"SidebarWorkspaceOptionsMenu": {
"hosts": "Hôtes",
@@ -13161,10 +13193,10 @@
"dialog": {
"3bc61dc989": "Annuler",
"15efa778e3": "Abandonner",
"42f89dd030": "fichiers",
"e7611dca35": "fichier",
"0d2d88cba5": "Cette action est irréversible.",
"1551c14668": "Abandonner les modifications ?"
"1551c14668": "Abandonner les modifications ?",
"fileCount_one": "{{count}} fichier",
"fileCount_other": "{{count}} fichiers"
}
},
"dropdown": {
@@ -13391,16 +13423,21 @@
"unresolved": "Impossible de déterminer quel hôte possède cet espace de travail. Vérifiez la connexion et réessayez."
},
"useFileDeletion": {
"72691dfebc": "Échec : {{value0}} « {{value1}} ».",
"d979a4fbb5": "Supprimer définitivement « {{value0}} » ?",
"92276aceb7": "Supprimer",
"7fb9435c86": "Cette action supprime définitivement le répertoire et son contenu sur l'hôte distant. Elle est irréversible.",
"23e98f192f": "Cette action supprime définitivement le fichier sur l'hôte distant. Elle est irréversible.",
"8b8ee9d22f": "Impossible de déterminer quel hôte possède ce fichier. Vérifiez la connexion de l'espace de travail et réessayez.",
"af1270b90d": "Supprimer définitivement {{count}} éléments ?",
"dd029aa5cd": "Cette action supprime définitivement les éléments sélectionnés ainsi que le contenu des répertoires sur l'hôte distant. Elle est irréversible.",
"77fdc36183": "Supprimer {{count}} éléments ?",
"fca915a67a": "Les éléments distants sont définitivement supprimés, sans retour arrière. Les éléments locaux sont déplacés dans {{value0}}."
"deleteFailed": "Impossible de supprimer « {{name}} ».",
"deleteItems_one": "Supprimer {{count}} élément ?",
"deleteItems_other": "Supprimer {{count}} éléments ?",
"mixedRecycleBin": "Les éléments distants sont supprimés définitivement. Cette action est irréversible. Les éléments locaux sont déplacés vers la Corbeille.",
"mixedTrash": "Les éléments distants sont supprimés définitivement. Cette action est irréversible. Les éléments locaux sont déplacés vers la Corbeille.",
"permanentlyDeleteItems_one": "Supprimer définitivement {{count}} élément ?",
"permanentlyDeleteItems_other": "Supprimer définitivement {{count}} éléments ?",
"recycleBinFailed": "Impossible de déplacer « {{name}} » vers la Corbeille.",
"trashFailed": "Impossible de déplacer « {{name}} » vers la Corbeille."
},
"useFileExplorerHandlers": {
"32cd9fd991": "Impossible d'ouvrir la cible du symlink",
@@ -14358,13 +14395,13 @@
"9ee54037a4": "Commande personnalisée",
"4b2fc4b80c": "Effort de réflexion",
"be8917699e": "Modèle",
"4d9b6d84df": "non pris en charge. Choisissez Claude, Codex ou Personnalisé.",
"560d4feb00": "Personnalisé",
"29d119fe95": "Agent",
"f9382b48a1": "Activer l'auteur IA",
"1c0cb4fabb": "Auteur IA",
"bd14e9c42a": "Non configuré",
"1f9468c5c9": "{{value0}} non pris en charge"
"1f9468c5c9": "{{value0}} non pris en charge",
"unsupportedAgent": "{{agent}} n'est pas pris en charge. Choisissez Claude, Codex ou Personnalisé."
},
"BrowserAnimatedVisual": {
"46df009982": "Démarrer l'essai gratuit",
@@ -17209,12 +17246,10 @@
"untitled": "Discussion sans titre",
"listLabel": "Des discussions qui reprendraient",
"dontAskAgain": "Ne plus demander (reprendre automatiquement)",
"dontAskAgainHint": "Vous pouvez désactiver cette option dans Paramètres → Expérimental → Chat UI.",
"dontAskAgainHint": "Vous pouvez désactiver cette option dans Paramètres → Chat → Comportement.",
"continuedOne": "1 chat a été repris",
"continuedMany": "{{value0}} chats ont été repris",
"selectAgent": "Reprendre le chat {{value0}} \"{{value1}}\" dans {{value2}}",
"resumeSelected": "Reprendre les discussions {{value0}}",
"resumeSelectedOne": "Reprendre 1 discussion",
"dismissAll": "Tout rejeter",
"notContinuedOne": "1 chat n'a pas pu reprendre",
"notContinuedMany": "{{value0}} chats n'ont pas pu reprendre",
@@ -17249,7 +17284,9 @@
"serverDismiss": "Ignorer",
"serverResumeAll": "Reprendre les {{count}} sur {{machine}}",
"serverResumeHereOne": "Reprendre 1 chat démarré ici",
"serverResumeHere": "Reprendre {{count}} chats démarrés ici"
"serverResumeHere": "Reprendre {{count}} chats démarrés ici",
"resumeChats_one": "Reprendre {{count}} discussion",
"resumeChats_other": "Reprendre {{count}} discussions"
},
"linear-issue-attribute-filter-coverage-notice": {
"statusPartialTeamCoverage": "Filtrage des statuts des équipes {{value0}} sur {{value1}} : les problèmes des équipes restantes ne sont pas inclus.",
@@ -17761,7 +17798,8 @@
"compactAfterRetry": "Réessayez votre message précédent, puis lancez /compact.",
"clearAfterSending": "Votre message précédent est encore en cours d'envoi. Lancez /clear une fois qu'il est parti.",
"compactAfterSending": "Votre message précédent est encore en cours d'envoi. Lancez /compact une fois qu'il est parti.",
"pendingWork": "Attendez la fin du travail et des messages en attente avant d'utiliser cette commande."
"pendingWork": "Attendez la fin du travail et des messages en attente avant d'utiliser cette commande.",
"notDoneGoalChangeIncomplete": "Impossible de terminer la modification de l’objectif. Consultez le chat."
},
"composer": {
"imageUnavailable": "Aperçu indisponible",
@@ -18430,6 +18468,15 @@
"settings": "Ouvrir les paramètres dans le terminal",
"extensions": "Ouvrir le tableau de bord des extensions dans le terminal",
"hotkeys": "Afficher les raccourcis clavier dans le terminal"
},
"modelDescriptions": {
"grok_4_7": "Le dernier modèle de pointe de xAI",
"grok_4_6": "Le précédent modèle de pointe de xAI",
"grok_4_5": "Un ancien modèle de pointe de xAI",
"fable": "Le plus performant pour les tâches les plus difficiles et longues",
"opus": "Idéal pour les tâches complexes du quotidien",
"sonnet": "Efficace pour les tâches courantes",
"haiku": "Le plus rapide pour des réponses immédiates"
}
},
"tab": {
@@ -19237,11 +19284,20 @@
},
"discard": {
"deleteUntrackedFileDescription": "Cela supprimera définitivement ce fichier non suivi. Cette action est irréversible.",
"deleteUntrackedFilesDescription": "Cela supprimera définitivement ces {{count}} fichiers non suivis. Cette action est irréversible.",
"deleteUntrackedFilesDescription_other": "Cela supprimera définitivement ces {{count}} fichiers non suivis. Cette action est irréversible.",
"restoreStagedVersionDescription": "Cela restaurera la dernière version intermédiaire et annulera la suppression. Cela ne peut pas être annulé.",
"unstagedChangesDescription": "Cela annulera les modifications non planifiées apportées à ce fichier. Cela ne peut pas être annulé.",
"unstagedSelectionIncludingUntrackedDescription": "Cela annulera les modifications non indexées et supprimera définitivement tous les fichiers non suivis de cette sélection. Cette action est irréversible.",
"unstagedFilesIncludingUntrackedDescription": "Cela annulera les modifications non indexées et supprimera définitivement tous les fichiers non suivis parmi ces {{count}} fichiers. Cette action est irréversible."
"unstagedFilesIncludingUntrackedDescription_other": "Cela annulera les modifications non indexées et supprimera définitivement tous les fichiers non suivis parmi ces {{count}} fichiers. Cette action est irréversible.",
"delete": "Supprimer",
"restore": "Restaurer",
"discard": "Abandonner",
"discardAll": "Tout abandonner",
"deleteUntrackedTitle_one": "Supprimer {{count}} fichier non suivi ?",
"deleteUntrackedTitle_other": "Supprimer {{count}} fichiers non suivis ?",
"deleteCount": "Supprimer {{count}}",
"deleteUntrackedFilesDescription_one": "Cela supprimera définitivement {{count}} fichier non suivi. Cette action est irréversible.",
"unstagedFilesIncludingUntrackedDescription_one": "Cela annulera les modifications non indexées apportées à {{count}} fichier et le supprimera définitivement s'il n'est pas suivi. Cette action est irréversible."
},
"createReviewFailure": {
"authRequiredCommand": "{{providerName}} n'est pas authentifié. Étape suivante : exécutez {{command}} dans cet environnement.",
@@ -19272,6 +19328,34 @@
"creationUnconfirmed": "La création de {{shortLabel}} est peut-être terminée. Actualisation de l'état de revue de la branche...",
"withDetail": "La création de {{shortLabel}} a échoué : {{detail}}",
"pushFailed": "Le push a échoué. Résolvez l'erreur de push, puis réessayez."
},
"thinking": {
"off": "Désactivé",
"low": "Basse",
"medium": "Moyenne",
"high": "Haute",
"minimal": "Minimal",
"xhigh": "Très élevé",
"max": "Maximum"
},
"variables": {
"basePrompt": "Le prompt intégré d’Orca pour cette action, avec le contexte qu’Orca sait recueillir en toute sécurité.",
"branch": "Le nom de la branche actuelle du contrôle de version.",
"stagedFiles": "La liste des fichiers indexés, séparés par des sauts de ligne, pour générer le message de commit.",
"stagedPatch": "Le patch Git indexé utilisé pour générer le message de commit.",
"baseBranch": "La branche cible sélectionnée dans l’éditeur de création de PR.",
"currentTitle": "Le titre du PR saisi dans l’éditeur avant le début de la génération.",
"currentBody": "La description du PR saisie dans l’éditeur avant le début de la génération.",
"commitSummary": "La liste des commits de la branche par rapport à la base, séparés par des sauts de ligne.",
"changedFiles": "Un résumé des fichiers modifiés entre la branche et sa base.",
"patch": "Le diff de la branche par rapport à sa base utilisé pour générer les détails du PR.",
"firstPrompt": "La première demande de l’utilisateur dans cet espace de travail ou ce chat.",
"assistantMessage": "La réponse initiale de l’agent, lorsqu’Orca en dispose.",
"linkedIssue": "Le numéro de l’issue GitHub liée à cet espace de travail. Vide si aucune issue GitHub n’est liée (y compris pour les espaces liés à GitLab). Préférez les modèles avec instructions : « Fixes #{linkedIssue} » seul devient « Fixes # » sans lien."
},
"model": {
"configDefault": "Valeur par défaut de la configuration",
"auto": "Automatique"
}
},
"agentsSidebarIntro": {
@@ -19695,7 +19779,9 @@
"confirmTitle": "Redémarrer le daemon de terminal ?",
"confirmBody": "Le redémarrage met fin à tous les processus en cours d'exécution dans {{sessions}}. Les agents qui prennent en charge la reprise peuvent être repris ensuite ; les shells et autres tâches ne le peuvent pas et doivent être redémarrés. Faites-le lorsque vos agents sont inactifs.",
"cancel": "Annuler",
"confirm": "Redémarrer et arrêter les processus"
"confirm": "Redémarrer et arrêter les processus",
"count_other": "{{count}} terminaux en cours d'exécution",
"count_one": "{{count}} terminal en cours d’exécution"
},
"restartedInputNotSent": "Le terminal a redémarré pendant votre saisie, une partie ne lui est peut-être pas parvenue. Vérifiez le nouveau shell avant de la saisir à nouveau.",
"stalledDaemonBanner": {
@@ -19870,7 +19956,11 @@
"picker": {
"pasteUnparseable": "URL de projet ou owner/number attendu",
"ownerLoadFailed": "Impossible de charger les projets de {{owner}}.",
"organizationsLoadFailed": "Certaines organisations n'ont pas été chargées ({{failureCount}})."
"organizationsLoadFailed": "Certaines organisations n'ont pas été chargées ({{failureCount}}).",
"organizations": "Organisations",
"listFailed": "Impossible de lister les projets",
"detailsFailed": "Impossible de charger les détails",
"viewFailed": "Impossible de récupérer la vue du projet"
},
"error": {
"notFoundState": "Impossible de trouver ce projet ou cette vue.",
@@ -19905,6 +19995,9 @@
"tooLargeUnknownCount": "Cette vue contient trop d'éléments pour être affichée dans Orca. Restreignez le filtre de la vue sur GitHub.",
"tooLarge": "Cette vue contient {{itemCount}} éléments, trop pour être affichée dans Orca. Restreignez le filtre de la vue sur GitHub.",
"schemaDriftDetail": "Impossible de lire cette vue de projet : {{detail}}."
},
"columns": {
"type": "Tapez"
}
},
"projectField": {
@@ -19991,6 +20084,27 @@
"attachments": {
"updateRuntime": "Mettez à jour le runtime distant pour modifier les liens de l'espace de travail",
"updateRuntimeSafely": "Mettez à jour le runtime distant pour modifier les liens de l'espace de travail en toute sécurité"
},
"activity": {
"active": "Actif",
"working": "Fonctionnement",
"monitoring": "Surveillance des tâches en arrière-plan",
"failed": "Échec",
"interrupted": "Interrompu",
"unconfirmed": "Impossible de confirmer",
"done": "Terminé",
"inactive": "Inactif",
"permission": "Autorisation requise",
"unreadLabel": "{{status}} · Non lu"
},
"reviewStatus": {
"checksFailed": "{{review}} : vérifications en échec",
"checksPassing": "{{review}} : vérifications réussies",
"checksPending": "{{review}} : vérifications en attente",
"closed": "{{review}} : fermée",
"draft": "{{review}} : brouillon",
"merged": "{{review}} : fusionnée",
"open": "{{review}} : ouverte"
}
},
"tabHoverCard": {
@@ -20490,5 +20604,145 @@
"math": {
"scrollDisplayEquation": "Faire défiler l'équation affichée"
}
},
"runtime": {
"health": {
"local": "Local",
"available": "Connecté",
"connecting": "Connexion",
"disconnected": "Déconnecté",
"error": "Demande votre attention",
"mixed": "Mixte",
"repair": "Nouvel appairage requis",
"update": "Mise à jour requise"
},
"compat": {
"compatible": "Le client et le serveur d’exécution sont compatibles.",
"clientTooOld": "Ce client Orca est trop ancien pour le serveur sélectionné. Mettez Orca à jour sur cette machine. Protocole du client : {{clientProtocol}} ; le serveur exige le protocole client {{requiredProtocol}}.",
"serverTooOld": "Le serveur Orca sélectionné est trop ancien pour ce client. Mettez Orca à jour sur le serveur. Protocole du serveur : {{serverProtocol}} ; le client exige le protocole serveur {{requiredProtocol}}."
}
},
"native": {
"about": {
"gpu": {
"unknownStatus": "Statut indisponible",
"enabled": "Activé",
"disabled": "Désactivé",
"unavailable": "Indisponible",
"safeMode": "Désactivée (mode graphique sécurisé)",
"software": "Rendu logiciel",
"unknown": "Inconnu ({{status}})",
"summary": "Accélération GPU : {{status}}"
}
},
"dialog": {
"importCookies": "Importer des cookies",
"spaceTitle": "Espace Orca bêta",
"dashboardTitle": "Tableau de bord des agents Orca",
"cookieFiles": "Fichiers de cookies",
"allFiles": "Tous les fichiers",
"importPetBundle": "Choisir un paquet .codex-pet",
"pickPet": "Choisir une mascotte",
"petImage": "Image de mascotte",
"importWarpTheme": "Importer un thème Warp",
"warpThemeYaml": "YAML de thème Warp",
"importWarpFolder": "Importer un dossier de thèmes Warp",
"images": "Images",
"repoIconImages": "Images d’icône du dépôt",
"audio": "Audio"
}
},
"taskProviders": {
"linear": {
"updateAccess": "Accès aux mises à jour",
"addAccess": "Ajouter l'accès Linear",
"fetchMore": "Charger plus",
"connectionFailed": "Échec de la connexion",
"listLabel": "Liste Linear",
"projectsLoadFailed": "Impossible de charger les projets.",
"projectNotFound": "Le projet est introuvable.",
"projectLoadFailed": "Impossible de charger le projet.",
"projectIssuesLoadFailed": "Impossible de charger les issues du projet.",
"viewsLoadFailed": "Impossible de charger les vues.",
"viewContentsLoadFailed": "Impossible de charger le contenu de la vue.",
"issuesLoadFailed": "Impossible de charger les issues Linear.",
"apiKeyHint": "Collez une clé API personnelle de l’espace de travail Linear à utiliser dans Orca. Si cet espace est déjà connecté, Orca remplace la clé enregistrée.",
"remoteKeyStorage": "Cette clé est stockée par l’environnement d’exécution distant actif.",
"localKeyStorage": "Les clés de l’environnement d’exécution local sont stockées sur cet appareil avec le stockage chiffré d’Electron lorsqu’il est disponible.",
"commentsLoadFailed": "Impossible de charger les commentaires.",
"updateWorkspaceAccess": "Mettre à jour l’accès Linear pour {{workspace}}",
"workspaceApiKeyHint": "Collez une clé API personnelle pour {{workspace}}. Si cet espace est déjà connecté, Orca remplace la clé enregistrée.",
"connect": "Se connecter",
"descriptionUpdateFailed": "Échec de la mise à jour de la description",
"titleUpdateFailed": "Échec de la mise à jour du titre",
"truncated": {
"issues_one": "Affichage de {{count}} issue en tête de liste. Faites une recherche ou ouvrez Linear pour consulter la liste complète.",
"issues_other": "Affichage des {{count}} premières issues. Faites une recherche ou ouvrez Linear pour consulter la liste complète.",
"projectIssues_one": "Affichage de {{count}} issue du projet en tête de liste. Faites une recherche ou ouvrez Linear pour consulter la liste complète.",
"projectIssues_other": "Affichage des {{count}} premières issues du projet. Faites une recherche ou ouvrez Linear pour consulter la liste complète.",
"projects_one": "Affichage de {{count}} projet en tête de liste. Faites une recherche ou ouvrez Linear pour consulter la liste complète.",
"projects_other": "Affichage des {{count}} premiers projets. Faites une recherche ou ouvrez Linear pour consulter la liste complète.",
"viewIssues_one": "Affichage de {{count}} issue de la vue en tête de liste. Faites une recherche ou ouvrez Linear pour consulter la liste complète.",
"viewIssues_other": "Affichage des {{count}} premières issues de la vue. Faites une recherche ou ouvrez Linear pour consulter la liste complète.",
"views_one": "Affichage de {{count}} vue en tête de liste. Faites une recherche ou ouvrez Linear pour consulter la liste complète.",
"views_other": "Affichage des {{count}} premières vues. Faites une recherche ou ouvrez Linear pour consulter la liste complète."
}
},
"jira": {
"connectionFailed": "Échec de la connexion",
"remoteTokenStorage": "Votre jeton est envoyé à l’environnement d’exécution distant sélectionné et y est stocké avec le chiffrement pris en charge.",
"localTokenStorage": "Votre jeton est stocké localement et chiffré si le stockage de l’environnement d’exécution local le permet."
},
"errors": {
"jira": {
"createFailed": "Échec de la création de l'issue.",
"commentFailed": "Échec de l'ajout du commentaire.",
"notConnected": "Non connecté à Jira.",
"titleRequired": "Le titre est requis.",
"labelsConflict": "Fournissez labels ou labelOperations, mais pas les deux.",
"updateFailed": "Impossible de mettre à jour l’issue.",
"credentialsRequired": "L’URL du site, l’adresse e-mail et le jeton API sont requis.",
"projectRequired": "Le projet est requis.",
"issueTypeRequired": "Le type d’issue est requis.",
"issueKeyRequired": "La clé de l’issue est requise.",
"updatesRequired": "L’objet de mise à jour est requis.",
"commentBodyRequired": "Le contenu du commentaire est requis.",
"invalidSiteUrl": "Saisissez une URL de site Jira valide.",
"passwordRequired": "Le mot de passe est requis.",
"personalTokenRequired": "Le jeton d’accès personnel est requis.",
"apiTokenRequired": "Le jeton API est requis.",
"connectionFailed": "Échec de la connexion.",
"invalidSiteIdentity": "Saisissez une URL de site Jira HTTP ou HTTPS sans identifiants.",
"missingProjectIdentity": "Jira a renvoyé un projet sans ID ni clé.",
"invalidIssuePage": "Jira a renvoyé une page d’issues invalide.",
"incompleteIssuePage": "Jira a renvoyé une page d’issues incomplète.",
"repeatedIssueToken": "Jira a renvoyé un jeton de page d’issues invalide ou répété.",
"issueSearchLimit": "La recherche d’issues Jira a dépassé la limite de pages. Sélectionnez plutôt un projet avec JQL.",
"invalidProjectPage": "Jira a renvoyé une page de projets invalide.",
"incompleteProjectPage": "Jira a renvoyé une page de projets incomplète.",
"projectListLimit": "La liste des projets Jira a dépassé la limite de pages. Sélectionnez plutôt un projet avec JQL.",
"invalidCloudId": "Le site n’a pas fourni d’ID Atlassian Cloud valide."
},
"linear": {
"notConnected": "Non connecté à Linear",
"createFailed": "Échec de la création dans Linear",
"createdButUnavailable": "L’issue a été créée, mais n’a pas pu être récupérée",
"updateFailed": "Échec de la mise à jour dans Linear",
"commentFailed": "Impossible de créer le commentaire",
"projectCreateFailed": "Échec de la création du projet Linear",
"noApiKey": "Aucune clé API n’est enregistrée.",
"workspaceAuthExpired": "L’authentification Linear a expiré pour cet espace de travail.",
"projectNameRequired": "Le nom du projet est requis",
"projectIdRequired": "L’ID du projet est requis",
"projectNotFound": "Le projet est introuvable",
"viewIdRequired": "L’ID de la vue personnalisée est requis",
"viewHasNoIssues": "La vue personnalisée ne contient pas d’issues",
"viewHasNoProjects": "La vue personnalisée ne contient pas de projets"
}
}
},
"workspaceOptions": {
"activeFilterCount_one": "{{count}} filtre",
"activeFilterCount_other": "{{count}} filtres"
}
}
+277 -28
View File
@@ -350,7 +350,8 @@
"permissionOverrideMore": "ほか {{count}} 件",
"permissionOverrideMore_one": "ほか {{count}} 件",
"permissionOverrideMore_other": "ほか {{count}} 件",
"permissionOverridesUse": "{{mode}} を使用"
"permissionOverridesUse": "{{mode}} を使用",
"approveForMe": "代わりに承認"
},
"followSymlinkedDirectoriesKeywords": {
"symlink": "シンボリックリンク",
@@ -381,6 +382,34 @@
"actionPermissions": {
"sameAsAgent": "{{agent}} と同じ"
}
},
"ssh": {
"status": {
"disconnected": "切断済み",
"connecting": "接続中…",
"auth-failed": "認証に失敗しました",
"connected": "接続済み",
"reconnection-failed": "再接続に失敗しました",
"deploying-relay": "リレーをデプロイ中…",
"reconnecting": "再接続中…"
}
},
"mcp": {
"workspace": "ワークスペース",
"inspectFailed": "{{directory}} を確認できません。",
"unreadable": "読み取り不可",
"notFound": "見つかりません",
"invalidJson": "無効な JSON",
"noServers": "サーバーなし",
"httpServer": "HTTP サーバー",
"stdioServer": "stdio サーバー",
"invalidServer": "無効なサーバー",
"serverCount_one": "サーバー {{count}} 件",
"serverCount_other": "サーバー {{count}} 件",
"claudeWorkspace": "Claude ワークスペース"
},
"shortcuts": {
"parseFailed": "ショートカットを解析できません。"
}
},
"menu": {
@@ -1784,7 +1813,6 @@
"LinearIssueTextEditor": {
"947ba2d6f4": "保存する",
"04d73b72dc": "Issue のタイトル",
"e8ff595db3": "{{value0}} を更新できませんでした",
"1e08a1ec80": "タイトルは必須です"
},
"LinearIssueWorkspace": {
@@ -2181,9 +2209,6 @@
"7f3f7b4c18": "説明 (オプション、markdown)",
"9f2b4c03a6": "提出する",
"d3d0998b7d": "GitHub の新規 Issue",
"d1e243795c": "Issue",
"be8cf68d9f": "Issue を表示",
"67662ade50": "プロジェクトの Issue",
"6244a02f46": "Linear で開く",
"606a85c774": "オープン",
"5e8061b088": "{{value0}} {{value1}} からワークスペースを開始します",
@@ -2203,11 +2228,9 @@
"af377b13b1": "{{value0}} ビュー",
"d47248df4d": "Linear ビューモード",
"f397d513e3": "戻る",
"b39fe6511d": "プロジェクト",
"8675cd6188": "Linear",
"733b8f2421": "Linear / ビュー",
"bc06ed0fb0": "ビューに戻る",
"3cb855080f": "ビュー",
"b4e10f096e": "オーナー",
"a04fe7ba73": "可視性",
"0aa8525950": "モデル",
@@ -2878,8 +2901,6 @@
"7616c986c6": "{{value0}} Issue を開く",
"openInLinear": "Linear で {{value0}} を開く",
"93e1f6bfca": "読み込み中",
"98730088a6": "。フルセットについては、Linear を検索するか開きます。",
"06b887d622": "最初に表示しています",
"linearLoginUnreadable": "保存された Linear のログイン情報を読み取れません。設定で再接続してください。",
"f2cc1e0ff6": "Linear / プロジェクト",
"906b5e4cb8": "Linear / プロジェクト / {{value0}}",
@@ -5913,7 +5934,8 @@
},
"sidebarHostOptions": {
"3e102f111c": "すべてのホスト",
"visibleHostsCount": "{{value0}} 台のホスト"
"hosts": "ホスト",
"visibleHosts_other": "{{count}} 台のホスト"
},
"HostRemoveDialog": {
"1a2b3c4d5e": "{{value0}} を削除しました",
@@ -12951,10 +12973,10 @@
"dialog": {
"3bc61dc989": "キャンセル",
"15efa778e3": "破棄",
"42f89dd030": "ファイル",
"e7611dca35": "ファイル",
"0d2d88cba5": "これを元に戻すことはできません。",
"1551c14668": "変更を破棄しますか?"
"1551c14668": "変更を破棄しますか?",
"fileCount_one": "{{count}} 個のファイル",
"fileCount_other": "{{count}} 個のファイル"
}
},
"dropdown": {
@@ -13181,16 +13203,19 @@
"unresolved": "このワークスペースを所有しているホストを特定できませんでした。接続を確認して、もう一度お試しください。"
},
"useFileDeletion": {
"72691dfebc": "{{value0}} '{{value1}}' に失敗しました。",
"d979a4fbb5": "「{{value0}}」を完全に削除しますか?",
"92276aceb7": "削除",
"7fb9435c86": "リモートホスト上のディレクトリとその内容を完全に削除します。この操作は取り消せません。",
"23e98f192f": "リモートホスト上のファイルを完全に削除します。この操作は取り消せません。",
"8b8ee9d22f": "このファイルを所有しているホストを特定できませんでした。ワークスペースの接続を確認して、もう一度お試しください。",
"af1270b90d": "{{count}}個の項目を完全に削除しますか?",
"dd029aa5cd": "選択した項目とディレクトリの内容がリモートホスト上で完全に削除されます。この操作は元に戻せません。",
"77fdc36183": "{{count}} 個の項目を削除しますか?",
"fca915a67a": "リモートの項目は完全に削除され、取り消せません。ローカルの項目は {{value0}} に移動します。"
"deleteFailed": "「{{name}}」を削除できませんでした。",
"deleteItems_other": "{{count}} 件の項目を削除しますか?",
"mixedRecycleBin": "リモートの項目は完全に削除され、元に戻せません。ローカルの項目はごみ箱に移動します。",
"mixedTrash": "リモートの項目は完全に削除され、元に戻せません。ローカルの項目はごみ箱に移動します。",
"permanentlyDeleteItems_other": "{{count}} 件の項目を完全に削除しますか?",
"recycleBinFailed": "「{{name}}」をごみ箱に移動できませんでした。",
"trashFailed": "「{{name}}」をごみ箱に移動できませんでした。"
},
"useFileExplorerHandlers": {
"32cd9fd991": "シンボリックリンクターゲットを開けません",
@@ -14165,13 +14190,13 @@
"9ee54037a4": "カスタムコマンド",
"4b2fc4b80c": "考える努力",
"be8917699e": "モデル",
"4d9b6d84df": "サポートされていません。Claude、Codex、またはカスタムを選択します。",
"560d4feb00": "カスタム",
"29d119fe95": "Agent",
"f9382b48a1": "AI 著者を有効にする",
"1c0cb4fabb": "AI作者",
"bd14e9c42a": "未設定",
"1f9468c5c9": "{{value0}} はサポートされていません"
"1f9468c5c9": "{{value0}} はサポートされていません",
"unsupportedAgent": "{{agent}} はサポートされていません。Claude、Codex、カスタムのいずれかを選択してください。"
},
"BrowserAnimatedVisual": {
"46df009982": "無料トライアルを開始する",
@@ -17004,12 +17029,10 @@
"untitled": "無題のチャット",
"listLabel": "再開されるチャット",
"dontAskAgain": "二度と質問しないでください (自動的に再開します)",
"dontAskAgainHint": "これは、「設定」→「実験的機能」→「チャット UI」でオフにできます。",
"dontAskAgainHint": "設定 → チャット → 動作でオフにできます。",
"continuedOne": "1 件のチャットを再開しました",
"continuedMany": "{{value0}} 件のチャットを再開しました",
"selectAgent": "{{value0}} チャット「{{value1}}」を {{value2}} で再開します",
"resumeSelected": "{{value0}} チャットを再開",
"resumeSelectedOne": "1 チャットを再開",
"dismissAll": "すべて閉じる",
"notContinuedOne": "1 件のチャットを再開できませんでした",
"notContinuedMany": "{{value0}} 件のチャットを再開できませんでした",
@@ -17044,7 +17067,9 @@
"serverDismiss": "閉じる",
"serverResumeAll": "{{machine}} の {{count}} 件をすべて再開",
"serverResumeHereOne": "ここで開始したチャット 1 件を再開",
"serverResumeHere": "ここで開始したチャット {{count}} 件を再開"
"serverResumeHere": "ここで開始したチャット {{count}} 件を再開",
"resumeChats_one": "{{count}} 件のチャットを再開",
"resumeChats_other": "{{count}} 件のチャットを再開"
},
"linear-issue-attribute-filter-coverage-notice": {
"statusPartialTeamCoverage": "{{value0}}/{{value1}} チームステータスをフィルタリングしています。残りのチームからの問題は含まれません。",
@@ -17618,7 +17643,8 @@
"compactAfterRetry": "以前のメッセージを再試行してから、/compact を実行してください。",
"clearAfterSending": "以前のメッセージはまだ送信中です。送信が終わったら /clear を実行してください。",
"compactAfterSending": "以前のメッセージはまだ送信中です。送信が終わったら /compact を実行してください。",
"pendingWork": "このコマンドを使用する前に、保留中の作業とメッセージが完了するまで待ってください。"
"pendingWork": "このコマンドを使用する前に、保留中の作業とメッセージが完了するまで待ってください。",
"notDoneGoalChangeIncomplete": "目標の変更を完了できませんでした。チャットを確認してください。"
},
"composer": {
"send": "送信",
@@ -18291,6 +18317,15 @@
"settings": "ターミナルで設定を開く",
"extensions": "ターミナルで拡張機能ダッシュボードを開く",
"hotkeys": "ターミナルでキーボードショートカットを表示"
},
"modelDescriptions": {
"grok_4_7": "xAI の最新のフロンティアモデル",
"grok_4_6": "xAI の前世代のフロンティアモデル",
"grok_4_5": "xAI の以前のフロンティアモデル",
"fable": "最も難しく、長時間かかるタスクに最適",
"opus": "日常の複雑なタスクに最適",
"sonnet": "日常のタスクを効率的に処理",
"haiku": "素早い回答に最適"
}
},
"tab": {
@@ -19045,6 +19080,15 @@
"empty": "このプロファイルで有効な拡張機能はありません",
"visitWebStore": "Chrome ウェブストアにアクセス",
"manage": "拡張機能を管理"
},
"viewport": {
"mobile-s": "モバイル S — 320 × 568",
"mobile-m": "モバイル M — 375 × 667",
"mobile-l": "モバイル L — 425 × 812",
"tablet": "タブレット — 768 × 1024",
"laptop": "ノートパソコン — 1024 × 768",
"laptop-l": "ノートパソコン L — 1440 × 900",
"desktop": "デスクトップ — 1920 × 1080"
}
},
"runtimeRpc": {
@@ -19243,11 +19287,18 @@
},
"discard": {
"deleteUntrackedFileDescription": "この未追跡ファイルは完全に削除されます。この操作は元に戻せません。",
"deleteUntrackedFilesDescription": "これらの {{count}} 個の未追跡ファイルは完全に削除されます。この操作は元に戻せません。",
"deleteUntrackedFilesDescription_other": "これらの {{count}} 個の未追跡ファイルは完全に削除されます。この操作は元に戻せません。",
"restoreStagedVersionDescription": "これにより、最後にステージングされたバージョンが復元され、削除が破棄されます。これを元に戻すことはできません。",
"unstagedChangesDescription": "これにより、このファイルに対するステージングされていない変更が元に戻ります。これを元に戻すことはできません。",
"unstagedSelectionIncludingUntrackedDescription": "ステージングされていない変更を元に戻し、この選択内の未追跡ファイルを完全に削除します。この操作は元に戻せません。",
"unstagedFilesIncludingUntrackedDescription": "ステージングされていない変更を元に戻し、これらの {{count}} 個のファイルに含まれる未追跡ファイルを完全に削除します。この操作は元に戻せません。"
"unstagedFilesIncludingUntrackedDescription_other": "ステージングされていない変更を元に戻し、これらの {{count}} 個のファイルに含まれる未追跡ファイルを完全に削除します。この操作は元に戻せません。",
"delete": "削除",
"restore": "復元",
"discard": "破棄",
"discardAll": "すべて破棄",
"deleteUntrackedTitle_one": "未追跡のファイル {{count}} 個を削除しますか?",
"deleteUntrackedTitle_other": "未追跡のファイル {{count}} 個を削除しますか?",
"deleteCount": "{{count}} 個を削除"
},
"createReviewFailure": {
"authRequiredCommand": "{{providerName}} が認証されていません。次の手順: この環境で {{command}} を実行してください。",
@@ -19278,6 +19329,34 @@
"creationUnconfirmed": "{{shortLabel}} の作成は完了している可能性があります。ブランチのレビュー状態を更新しています…",
"withDetail": "{{shortLabel}} の作成に失敗しました: {{detail}}",
"pushFailed": "プッシュに失敗しました。プッシュのエラーを解決してから、もう一度お試しください。"
},
"model": {
"auto": "自動",
"configDefault": "設定のデフォルト"
},
"thinking": {
"off": "オフ",
"minimal": "最小",
"low": "低",
"medium": "中",
"high": "高",
"max": "最大",
"xhigh": "最高"
},
"variables": {
"basePrompt": "Orca が安全に収集できるコンテキストを含む、この操作用の組み込みプロンプトです。",
"branch": "現在のソース管理ブランチ名です。",
"stagedFiles": "コミットメッセージの生成に使う、ステージ済みファイルの改行区切りリストです。",
"stagedPatch": "コミットメッセージの生成に使う、ステージ済みの Git パッチです。",
"baseBranch": "PR 作成画面で選択したターゲットブランチです。",
"currentTitle": "生成開始前に入力されている PR のタイトルです。",
"currentBody": "生成開始前に入力されている PR の説明です。",
"commitSummary": "ベースブランチと比較した、このブランチのコミットの改行区切りリストです。",
"changedFiles": "このブランチとベースブランチの間で変更されたファイルの概要です。",
"patch": "PR の詳細の生成に使う、このブランチとベースブランチの差分です。",
"firstPrompt": "このワークスペースまたはチャットでの最初のユーザーの依頼です。",
"assistantMessage": "Orca が取得できる場合の、Agent の最初の応答です。",
"linkedIssue": "このワークスペースにリンクされた GitHub Issue の番号です。GitHub Issue がリンクされていない場合は空です(GitLab にリンクされたワークスペースを含む)。指示を含むテンプレートを使ってください。リンクがない場合、単独の「Fixes #{linkedIssue}」は「Fixes #」になります。"
}
},
"rendererRecovery": {
@@ -19694,7 +19773,9 @@
"confirmTitle": "ターミナルデーモンを再起動しますか?",
"confirmBody": "再起動すると、{{sessions}} で実行中のすべてのプロセスが終了します。再開に対応している Agent は後で再開できますが、シェルなどのジョブは再開できず、再度開始する必要があります。Agent がアイドル状態のときに行ってください。",
"cancel": "キャンセル",
"confirm": "再起動してプロセスを終了"
"confirm": "再起動してプロセスを終了",
"count_other": "実行中のターミナル {{count}} 個",
"count_one": "実行中のターミナル {{count}} 個"
},
"restartedInputNotSent": "入力中にターミナルが再起動したため、一部の入力が届いていない可能性があります。もう一度入力する前に新しいシェルを確認してください。",
"stalledDaemonBanner": {
@@ -19811,7 +19892,11 @@
"picker": {
"pasteUnparseable": "プロジェクトの URL または owner/number を入力してください",
"ownerLoadFailed": "{{owner}} のプロジェクトを読み込めませんでした。",
"organizationsLoadFailed": "一部の組織を読み込めませんでした({{failureCount}})。"
"organizationsLoadFailed": "一部の組織を読み込めませんでした({{failureCount}})。",
"organizations": "組織",
"listFailed": "プロジェクト一覧を取得できませんでした",
"detailsFailed": "詳細を読み込めませんでした",
"viewFailed": "プロジェクトビューを取得できませんでした"
},
"error": {
"notFoundState": "このプロジェクトまたはビューが見つかりませんでした。",
@@ -19846,6 +19931,9 @@
"tooLargeUnknownCount": "このビューはアイテムが多すぎて Orca で表示できません。GitHub でビューのフィルターを絞り込んでください。",
"tooLarge": "このビューには {{itemCount}} 件のアイテムがあり、Orca で表示するには多すぎます。GitHub でビューのフィルターを絞り込んでください。",
"schemaDriftDetail": "このプロジェクトビューを読み取れませんでした: {{detail}}。"
},
"columns": {
"type": "タイプ"
}
},
"projectField": {
@@ -19932,6 +20020,27 @@
"attachments": {
"updateRuntime": "ワークスペースのリンクを変更するには、リモートランタイムを更新してください",
"updateRuntimeSafely": "ワークスペースのリンクを安全に変更するには、リモートランタイムを更新してください"
},
"activity": {
"active": "アクティブ",
"working": "作業中",
"monitoring": "バックグラウンドタスクを監視中",
"failed": "失敗",
"interrupted": "中断",
"unconfirmed": "確認できませんでした",
"done": "完了",
"inactive": "非アクティブ",
"permission": "許可が必要",
"unreadLabel": "{{status}} · 未読"
},
"reviewStatus": {
"checksFailed": "{{review}} のチェック: 失敗",
"checksPassing": "{{review}} のチェック: 成功",
"checksPending": "{{review}} のチェック: 保留中",
"closed": "{{review}}: クローズ",
"draft": "{{review}}: 下書き",
"merged": "{{review}}: マージ済み",
"open": "{{review}}: オープン"
}
},
"tabHoverCard": {
@@ -20489,5 +20598,145 @@
"math": {
"scrollDisplayEquation": "数式ブロックをスクロール"
}
},
"runtime": {
"health": {
"local": "ローカル",
"available": "接続済み",
"connecting": "接続中",
"disconnected": "切断済み",
"error": "対応が必要",
"mixed": "混在",
"repair": "再ペアリングが必要",
"update": "更新が必要"
},
"compat": {
"compatible": "ランタイムのクライアントとサーバーは互換性があります。",
"clientTooOld": "この Orca クライアントは古すぎるため、選択したサーバーに接続できません。このマシンの Orca を更新してください。クライアントのプロトコルは {{clientProtocol}}、サーバーが要求するクライアントのプロトコルは {{requiredProtocol}} です。",
"serverTooOld": "選択した Orca サーバーは古すぎるため、このクライアントと互換性がありません。サーバーの Orca を更新してください。サーバーのプロトコルは {{serverProtocol}}、クライアントが要求するサーバーのプロトコルは {{requiredProtocol}} です。"
}
},
"native": {
"about": {
"gpu": {
"unknownStatus": "ステータスを取得できません",
"enabled": "有効",
"disabled": "無効",
"unavailable": "利用不可",
"safeMode": "無効(セーフグラフィックスモード)",
"software": "ソフトウェアレンダリング",
"unknown": "不明({{status}})",
"summary": "GPU アクセラレーション:{{status}}"
}
},
"dialog": {
"importCookies": "Cookie のインポート",
"spaceTitle": "Orca スペースベータ",
"dashboardTitle": "Orca Agent ダッシュボード",
"cookieFiles": "Cookie ファイル",
"allFiles": "すべてのファイル",
"importPetBundle": ".codex-pet バンドルを選択",
"pickPet": "ペットを選択",
"petImage": "ペットの画像",
"importWarpTheme": "Warp テーマをインポート",
"warpThemeYaml": "Warp テーマ YAML",
"importWarpFolder": "Warp テーマフォルダーをインポート",
"images": "画像",
"repoIconImages": "リポジトリアイコン画像",
"audio": "音声"
}
},
"taskProviders": {
"linear": {
"updateAccess": "アクセスを更新",
"addAccess": "Linear アクセスを追加",
"fetchMore": "さらに読み込む",
"connectionFailed": "接続に失敗しました",
"listLabel": "Linear リスト",
"projectsLoadFailed": "プロジェクトを読み込めませんでした。",
"projectNotFound": "プロジェクトが見つかりませんでした。",
"projectLoadFailed": "プロジェクトを読み込めませんでした。",
"projectIssuesLoadFailed": "プロジェクトの Issue を読み込めませんでした。",
"viewsLoadFailed": "ビューを読み込めませんでした。",
"viewContentsLoadFailed": "ビューの内容を読み込めませんでした。",
"issuesLoadFailed": "Linear の Issue を読み込めませんでした。",
"apiKeyHint": "Orca で使う Linear ワークスペースの個人 API キーを貼り付けてください。すでに接続済みの場合、保存されたキーを置き換えます。",
"remoteKeyStorage": "このキーは現在のリモートランタイムに保存されます。",
"localKeyStorage": "ローカルランタイムのキーはこのデバイスに保存され、利用可能な場合は Electron の暗号化ストレージを使います。",
"commentsLoadFailed": "コメントを読み込めませんでした。",
"updateWorkspaceAccess": "{{workspace}} の Linear アクセスを更新",
"workspaceApiKeyHint": "{{workspace}} の個人 API キーを貼り付けてください。すでに接続済みの場合、保存されたキーを置き換えます。",
"connect": "接続",
"descriptionUpdateFailed": "説明の更新に失敗しました。",
"titleUpdateFailed": "タイトルの更新に失敗しました。",
"truncated": {
"issues_one": "最初の {{count}} 件の Issue を表示しています。全件を確認するには、検索するか Linear を開いてください。",
"issues_other": "最初の {{count}} 件の Issue を表示しています。全件を確認するには、検索するか Linear を開いてください。",
"projectIssues_one": "プロジェクトの Issue を最初の {{count}} 件表示しています。全件を確認するには、検索するか Linear を開いてください。",
"projectIssues_other": "プロジェクトの Issue を最初の {{count}} 件表示しています。全件を確認するには、検索するか Linear を開いてください。",
"projects_one": "最初の {{count}} 件のプロジェクトを表示しています。全件を確認するには、検索するか Linear を開いてください。",
"projects_other": "最初の {{count}} 件のプロジェクトを表示しています。全件を確認するには、検索するか Linear を開いてください。",
"viewIssues_one": "ビューの Issue を最初の {{count}} 件表示しています。全件を確認するには、検索するか Linear を開いてください。",
"viewIssues_other": "ビューの Issue を最初の {{count}} 件表示しています。全件を確認するには、検索するか Linear を開いてください。",
"views_one": "最初の {{count}} 件のビューを表示しています。全件を確認するには、検索するか Linear を開いてください。",
"views_other": "最初の {{count}} 件のビューを表示しています。全件を確認するには、検索するか Linear を開いてください。"
}
},
"jira": {
"connectionFailed": "接続に失敗しました",
"remoteTokenStorage": "トークンは選択したリモートランタイムに送信され、そのランタイムがサポートする暗号化方式で保存されます。",
"localTokenStorage": "トークンはローカルに保存され、ローカルランタイムのストレージが対応している場合は暗号化されます。"
},
"errors": {
"jira": {
"createFailed": "Issue の作成に失敗しました。",
"commentFailed": "コメントの追加に失敗しました。",
"notConnected": "Jira に接続されていません。",
"titleRequired": "タイトルが必要です。",
"labelsConflict": "labels または labelOperations のどちらか一方を指定してください。",
"updateFailed": "Issue を更新できませんでした。",
"credentialsRequired": "サイト URL、メールアドレス、API トークンが必要です。",
"projectRequired": "プロジェクトが必要です。",
"issueTypeRequired": "Issue の種類が必要です。",
"issueKeyRequired": "Issue キーが必要です。",
"updatesRequired": "更新オブジェクトが必要です。",
"commentBodyRequired": "コメント本文が必要です。",
"invalidSiteUrl": "有効な Jira サイト URL を入力してください。",
"passwordRequired": "パスワードが必要です。",
"personalTokenRequired": "個人アクセストークンが必要です。",
"apiTokenRequired": "API トークンが必要です。",
"connectionFailed": "接続に失敗しました。",
"invalidSiteIdentity": "認証情報を含まない HTTP または HTTPS の Jira サイト URL を入力してください。",
"missingProjectIdentity": "Jira が ID またはキーのないプロジェクトを返しました。",
"invalidIssuePage": "Jira が無効な Issue ページを返しました。",
"incompleteIssuePage": "Jira が不完全な Issue ページを返しました。",
"repeatedIssueToken": "Jira が無効または重複した Issue ページトークンを返しました。",
"issueSearchLimit": "Jira の Issue 検索がページ数の上限を超えました。代わりに JQL でプロジェクトを選択してください。",
"invalidProjectPage": "Jira が無効なプロジェクトページを返しました。",
"incompleteProjectPage": "Jira が不完全なプロジェクトページを返しました。",
"projectListLimit": "Jira のプロジェクト一覧がページ数の上限を超えました。代わりに JQL でプロジェクトを選択してください。",
"invalidCloudId": "サイトが有効な Atlassian Cloud ID を返しませんでした。"
},
"linear": {
"notConnected": "Linear に接続されていません",
"createFailed": "Linear での作成に失敗しました",
"createdButUnavailable": "Issue は作成されましたが、取得できませんでした",
"updateFailed": "Linear での更新に失敗しました",
"commentFailed": "コメントを作成できませんでした",
"projectCreateFailed": "Linear プロジェクトを作成できませんでした",
"noApiKey": "API キーが保存されていません。",
"workspaceAuthExpired": "このワークスペースの Linear 認証は期限切れです。",
"projectNameRequired": "プロジェクト名が必要です",
"projectIdRequired": "プロジェクト ID が必要です",
"projectNotFound": "プロジェクトが見つかりませんでした",
"viewIdRequired": "カスタムビュー ID が必要です",
"viewHasNoIssues": "カスタムビューに Issue が含まれていません",
"viewHasNoProjects": "カスタムビューにプロジェクトが含まれていません"
}
}
},
"workspaceOptions": {
"activeFilterCount_one": "{{count}} 件のフィルター",
"activeFilterCount_other": "{{count}} 件のフィルター"
}
}
+277 -28
View File
@@ -350,7 +350,8 @@
"permissionOverrideMore": "외 {{count}}개",
"permissionOverrideMore_one": "외 {{count}}개",
"permissionOverrideMore_other": "외 {{count}}개",
"permissionOverridesUse": "{{mode}} 사용"
"permissionOverridesUse": "{{mode}} 사용",
"approveForMe": "대신 승인"
},
"followSymlinkedDirectoriesKeywords": {
"symlink": "심볼릭 링크",
@@ -381,6 +382,34 @@
"actionPermissions": {
"sameAsAgent": "{{agent}}와(과) 동일"
}
},
"ssh": {
"status": {
"disconnected": "연결 끊김",
"connecting": "연결 중…",
"auth-failed": "인증 실패",
"connected": "연결됨",
"reconnection-failed": "재연결 실패",
"deploying-relay": "릴레이 배포 중…",
"reconnecting": "다시 연결 중…"
}
},
"mcp": {
"workspace": "워크스페이스",
"inspectFailed": "{{directory}}을(를) 검사할 수 없습니다.",
"unreadable": "읽을 수 없음",
"notFound": "찾을 수 없음",
"invalidJson": "잘못된 JSON",
"noServers": "서버 없음",
"httpServer": "HTTP 서버",
"stdioServer": "stdio 서버",
"invalidServer": "잘못된 서버",
"serverCount_one": "서버 {{count}}개",
"serverCount_other": "서버 {{count}}개",
"claudeWorkspace": "Claude 워크스페이스"
},
"shortcuts": {
"parseFailed": "단축키를 해석할 수 없습니다."
}
},
"menu": {
@@ -1784,7 +1813,6 @@
"LinearIssueTextEditor": {
"947ba2d6f4": "저장",
"04d73b72dc": "이슈 제목",
"e8ff595db3": "{{value0}}을(를) 업데이트하지 못했습니다.",
"1e08a1ec80": "제목은 필수 항목입니다."
},
"LinearIssueWorkspace": {
@@ -2181,9 +2209,6 @@
"7f3f7b4c18": "설명(선택사항, markdown)",
"9f2b4c03a6": "등록 위치: ",
"d3d0998b7d": "새 GitHub 이슈",
"d1e243795c": "이슈",
"be8cf68d9f": "이슈 보기",
"67662ade50": "프로젝트 이슈",
"6244a02f46": "Linear에서 열기",
"606a85c774": "열기",
"5e8061b088": "{{value0}} {{value1}}에서 워크스페이스 시작",
@@ -2203,11 +2228,9 @@
"af377b13b1": "{{value0}} 보기",
"d47248df4d": "Linear 보기 모드",
"f397d513e3": "뒤로",
"b39fe6511d": "프로젝트",
"8675cd6188": "Linear",
"733b8f2421": "Linear / 보기",
"bc06ed0fb0": "보기로 돌아가기",
"3cb855080f": "보기",
"b4e10f096e": "소유자",
"a04fe7ba73": "공개 범위",
"0aa8525950": "모델",
@@ -2878,8 +2901,6 @@
"7616c986c6": "열린 이슈 {{value0}}개",
"openInLinear": "Linear에서 {{value0}} 열기",
"93e1f6bfca": "로드 중",
"98730088a6": ". 전체 세트를 보려면 Linear를 검색하거나 엽니다.",
"06b887d622": "처음 표시",
"linearLoginUnreadable": "저장된 Linear 로그인을 읽을 수 없습니다. 설정에서 다시 연결하세요.",
"f2cc1e0ff6": "Linear / 프로젝트",
"906b5e4cb8": "Linear / 프로젝트 / {{value0}}",
@@ -5913,7 +5934,8 @@
},
"sidebarHostOptions": {
"3e102f111c": "모든 호스트",
"visibleHostsCount": "호스트 {{value0}}개"
"hosts": "호스트",
"visibleHosts_other": "호스트 {{count}}개"
},
"HostRemoveDialog": {
"1a2b3c4d5e": "{{value0}} 제거됨",
@@ -12951,10 +12973,10 @@
"dialog": {
"3bc61dc989": "취소",
"15efa778e3": "버리기",
"42f89dd030": "파일",
"e7611dca35": "파일",
"0d2d88cba5": "이 작업은 취소할 수 없습니다.",
"1551c14668": "변경사항을 삭제하시겠습니까?"
"1551c14668": "변경사항을 삭제하시겠습니까?",
"fileCount_one": "파일 {{count}}개",
"fileCount_other": "파일 {{count}}개"
}
},
"dropdown": {
@@ -13181,16 +13203,19 @@
"unresolved": "이 워크스페이스를 소유한 호스트를 확인할 수 없습니다. 연결을 확인한 후 다시 시도하세요."
},
"useFileDeletion": {
"72691dfebc": "{{value0}} '{{value1}}'에 실패했습니다.",
"d979a4fbb5": "'{{value0}}'을(를) 영구적으로 삭제하시겠습니까?",
"92276aceb7": "삭제",
"7fb9435c86": "원격 호스트의 디렉터리와 그 안의 내용을 영구적으로 삭제합니다. 이 작업은 되돌릴 수 없습니다.",
"23e98f192f": "원격 호스트의 파일을 영구적으로 삭제합니다. 이 작업은 되돌릴 수 없습니다.",
"8b8ee9d22f": "이 파일을 소유한 호스트를 확인할 수 없습니다. 워크스페이스 연결을 확인한 후 다시 시도하세요.",
"af1270b90d": "{{count}}개 항목을 영구적으로 삭제하시겠습니까?",
"dd029aa5cd": "원격 호스트의 선택한 항목과 디렉터리 내용을 영구적으로 삭제합니다. 이 작업은 되돌릴 수 없습니다.",
"77fdc36183": "{{count}}개 항목을 삭제하시겠습니까?",
"fca915a67a": "원격 항목은 영구적으로 삭제되며 되돌릴 수 없습니다. 로컬 항목은 {{value0}}(으)로 이동합니다."
"deleteFailed": "'{{name}}'을(를) 삭제하지 못했습니다.",
"deleteItems_other": "항목 {{count}}개를 삭제하시겠습니까?",
"mixedRecycleBin": "원격 항목은 영구적으로 삭제되며 되돌릴 수 없습니다. 로컬 항목은 휴지통으로 이동합니다.",
"mixedTrash": "원격 항목은 영구적으로 삭제되며 되돌릴 수 없습니다. 로컬 항목은 휴지통으로 이동합니다.",
"permanentlyDeleteItems_other": "항목 {{count}}개를 영구적으로 삭제하시겠습니까?",
"recycleBinFailed": "'{{name}}'을(를) 휴지통으로 이동하지 못했습니다.",
"trashFailed": "'{{name}}'을(를) 휴지통으로 이동하지 못했습니다."
},
"useFileExplorerHandlers": {
"32cd9fd991": "심볼릭 링크 대상을 열 수 없습니다",
@@ -14165,13 +14190,13 @@
"9ee54037a4": "사용자 지정 명령",
"4b2fc4b80c": "사고 강도",
"be8917699e": "모델",
"4d9b6d84df": "지원되지 않습니다. Claude, Codex 또는 Custom을 선택하세요.",
"560d4feb00": "사용자 정의",
"29d119fe95": "에이전트",
"f9382b48a1": "AI author 활성화",
"1c0cb4fabb": "AI 작성자",
"bd14e9c42a": "구성되지 않음",
"1f9468c5c9": "{{value0}} 지원되지 않음"
"1f9468c5c9": "{{value0}} 지원되지 않음",
"unsupportedAgent": "{{agent}}은(는) 지원되지 않습니다. Claude, Codex 또는 사용자 정의를 선택하세요."
},
"BrowserAnimatedVisual": {
"46df009982": "무료 평가판을 시작하세요",
@@ -17004,12 +17029,10 @@
"untitled": "제목 없는 채팅",
"listLabel": "재개될 채팅",
"dontAskAgain": "다시 묻지 않음(자동으로 재개)",
"dontAskAgainHint": "설정 → 실험적 → 채팅 UI에서 이 기능을 끌 수 있습니다.",
"dontAskAgainHint": "설정 → 채팅 → 동작에서 이 기능을 끌 수 있습니다.",
"continuedOne": "채팅 1개를 재개했습니다",
"continuedMany": "{{value0}}개의 채팅을 재개했습니다",
"selectAgent": "{{value2}}에서 {{value0}} 채팅 \"{{value1}}\" 재개",
"resumeSelected": "{{value0}} 채팅 재개",
"resumeSelectedOne": "채팅 1개 재개",
"dismissAll": "모두 닫기",
"notContinuedOne": "채팅 1개를 재개하지 못했습니다",
"notContinuedMany": "{{value0}}개의 채팅을 재개하지 못했습니다",
@@ -17044,7 +17067,9 @@
"serverDismiss": "닫기",
"serverResumeAll": "{{machine}}에서 {{count}}개 모두 재개",
"serverResumeHereOne": "여기에서 시작한 채팅 1개 재개",
"serverResumeHere": "여기에서 시작한 채팅 {{count}}개 재개"
"serverResumeHere": "여기에서 시작한 채팅 {{count}}개 재개",
"resumeChats_one": "채팅 {{count}}개 재개",
"resumeChats_other": "채팅 {{count}}개 재개"
},
"linear-issue-attribute-filter-coverage-notice": {
"statusPartialTeamCoverage": "{{value1}} 팀 상태 중 {{value0}} 필터링 중 - 나머지 팀의 문제는 포함되지 않습니다.",
@@ -17618,7 +17643,8 @@
"compactAfterRetry": "이전 메시지를 다시 시도한 다음 /compact를 실행하세요.",
"clearAfterSending": "이전 메시지를 아직 보내는 중입니다. 전송이 끝나면 /clear를 실행하세요.",
"compactAfterSending": "이전 메시지를 아직 보내는 중입니다. 전송이 끝나면 /compact를 실행하세요.",
"pendingWork": "이 명령을 사용하기 전에 보류 중인 작업과 메시지가 완료될 때까지 기다리십시오."
"pendingWork": "이 명령을 사용하기 전에 보류 중인 작업과 메시지가 완료될 때까지 기다리십시오.",
"notDoneGoalChangeIncomplete": "목표 변경을 완료하지 못했습니다. 채팅을 확인하세요."
},
"composer": {
"send": "보내기",
@@ -18291,6 +18317,15 @@
"settings": "터미널에서 설정 열기",
"extensions": "터미널에서 확장 대시보드 열기",
"hotkeys": "터미널에서 키보드 단축키 표시"
},
"modelDescriptions": {
"grok_4_7": "xAI의 최신 프런티어 모델",
"grok_4_6": "xAI의 이전 프런티어 모델",
"grok_4_5": "xAI의 초기 프런티어 모델",
"fable": "가장 어렵고 오래 걸리는 작업에 가장 적합",
"opus": "일상적인 복잡한 작업에 가장 적합",
"sonnet": "일상 작업에 효율적",
"haiku": "빠른 답변에 가장 빠름"
}
},
"tab": {
@@ -19045,6 +19080,15 @@
"empty": "이 프로필에 켜진 확장 프로그램이 없습니다",
"visitWebStore": "Chrome 웹 스토어 방문",
"manage": "확장 프로그램 관리"
},
"viewport": {
"mobile-s": "소형 모바일 — 320 × 568",
"mobile-m": "중형 모바일 — 375 × 667",
"mobile-l": "대형 모바일 — 425 × 812",
"tablet": "태블릿 — 768 × 1024",
"laptop": "노트북 — 1024 × 768",
"laptop-l": "대형 노트북 — 1440 × 900",
"desktop": "데스크톱 — 1920 × 1080"
}
},
"runtimeRpc": {
@@ -19243,11 +19287,18 @@
},
"discard": {
"deleteUntrackedFileDescription": "이 추적되지 않은 파일은 영구적으로 삭제됩니다. 이 작업은 취소할 수 없습니다.",
"deleteUntrackedFilesDescription": "이 {{count}}개의 추적되지 않은 파일은 영구적으로 삭제됩니다. 이 작업은 취소할 수 없습니다.",
"deleteUntrackedFilesDescription_other": "이 {{count}}개의 추적되지 않은 파일은 영구적으로 삭제됩니다. 이 작업은 취소할 수 없습니다.",
"restoreStagedVersionDescription": "이렇게 하면 마지막 단계 버전이 복원되고 삭제가 취소됩니다. 이 작업은 취소할 수 없습니다.",
"unstagedChangesDescription": "이렇게 하면 단계가 지정되지 않은 변경 사항이 이 파일로 되돌아갑니다. 이 작업은 취소할 수 없습니다.",
"unstagedSelectionIncludingUntrackedDescription": "스테이징되지 않은 변경 사항을 되돌리고 이 선택 항목의 추적되지 않은 파일을 영구적으로 삭제합니다. 이 작업은 취소할 수 없습니다.",
"unstagedFilesIncludingUntrackedDescription": "스테이징되지 않은 변경 사항을 되돌리고 이 {{count}}개 파일 중 추적되지 않은 파일을 영구적으로 삭제합니다. 이 작업은 취소할 수 없습니다."
"unstagedFilesIncludingUntrackedDescription_other": "스테이징되지 않은 변경 사항을 되돌리고 이 {{count}}개 파일 중 추적되지 않은 파일을 영구적으로 삭제합니다. 이 작업은 취소할 수 없습니다.",
"delete": "삭제",
"restore": "복원",
"discard": "버리기",
"discardAll": "모두 폐기",
"deleteUntrackedTitle_one": "추적되지 않은 파일 {{count}}개를 삭제할까요?",
"deleteUntrackedTitle_other": "추적되지 않은 파일 {{count}}개를 삭제할까요?",
"deleteCount": "{{count}}개 삭제"
},
"createReviewFailure": {
"authRequiredCommand": "{{providerName}}이(가) 인증되지 않았습니다. 다음 단계: 이 환경에서 {{command}}을(를) 실행하세요.",
@@ -19278,6 +19329,34 @@
"creationUnconfirmed": "{{shortLabel}} 생성이 완료되었을 수 있습니다. 브랜치 리뷰 상태를 새로고침하는 중...",
"withDetail": "{{shortLabel}} 생성에 실패했습니다: {{detail}}",
"pushFailed": "푸시에 실패했습니다. 푸시 오류를 해결한 후 다시 시도하세요."
},
"model": {
"auto": "자동",
"configDefault": "설정 기본값"
},
"thinking": {
"off": "꺼짐",
"minimal": "최소",
"low": "낮음",
"medium": "중간",
"high": "높음",
"max": "최대",
"xhigh": "매우 높음"
},
"variables": {
"basePrompt": "Orca가 안전하게 수집할 수 있는 컨텍스트를 포함한 이 작업의 기본 프롬프트입니다.",
"branch": "현재 소스 제어 브랜치 이름입니다.",
"stagedFiles": "커밋 메시지 생성에 사용할 스테이징된 파일 목록입니다. 파일은 줄바꿈으로 구분됩니다.",
"stagedPatch": "커밋 메시지 생성에 사용할 스테이징된 Git 패치입니다.",
"baseBranch": "PR 생성 편집기에서 선택한 대상 브랜치입니다.",
"currentTitle": "생성을 시작하기 전에 편집기에 입력한 현재 PR 제목입니다.",
"currentBody": "생성을 시작하기 전에 편집기에 입력한 현재 PR 설명입니다.",
"commitSummary": "기준 브랜치와 비교한 현재 브랜치의 커밋 목록입니다. 커밋은 줄바꿈으로 구분됩니다.",
"changedFiles": "현재 브랜치와 기준 브랜치 간에 변경된 파일의 요약입니다.",
"patch": "PR 세부 정보 생성에 사용할 현재 브랜치와 기준 브랜치 간의 diff입니다.",
"firstPrompt": "이 워크스페이스 또는 채팅의 첫 번째 사용자 요청입니다.",
"assistantMessage": "Orca에서 사용할 수 있는 경우 에이전트의 첫 번째 응답입니다.",
"linkedIssue": "이 워크스페이스에 연결된 GitHub 이슈 번호입니다. GitHub 이슈가 연결되지 않으면 비어 있습니다(GitLab에 연결된 워크스페이스 포함). 지시문이 있는 템플릿을 사용하세요. 연결이 없으면 단독 \"Fixes #{linkedIssue}\"는 \"Fixes #\"가 됩니다."
}
},
"rendererRecovery": {
@@ -19694,7 +19773,9 @@
"confirmTitle": "터미널 데몬을 다시 시작하시겠습니까?",
"confirmBody": "다시 시작하면 {{sessions}}에서 실행 중인 모든 프로세스가 종료됩니다. 재개를 지원하는 에이전트는 나중에 재개할 수 있지만, 셸과 기타 작업은 재개할 수 없으므로 다시 시작해야 합니다. 에이전트가 유휴 상태일 때 실행하세요.",
"cancel": "취소",
"confirm": "다시 시작하고 프로세스 종료"
"confirm": "다시 시작하고 프로세스 종료",
"count_other": "실행 중인 터미널 {{count}}개",
"count_one": "실행 중인 터미널 {{count}}개"
},
"restartedInputNotSent": "입력하는 동안 터미널이 다시 시작되어 일부 입력이 전달되지 않았을 수 있습니다. 다시 입력하기 전에 새 셸을 확인하세요.",
"stalledDaemonBanner": {
@@ -19811,7 +19892,11 @@
"picker": {
"pasteUnparseable": "프로젝트 URL 또는 owner/number 형식이어야 합니다",
"ownerLoadFailed": "{{owner}}의 프로젝트를 불러올 수 없습니다.",
"organizationsLoadFailed": "일부 조직을 불러오지 못했습니다({{failureCount}})."
"organizationsLoadFailed": "일부 조직을 불러오지 못했습니다({{failureCount}}).",
"organizations": "조직",
"listFailed": "프로젝트 목록을 가져오지 못했습니다",
"detailsFailed": "세부 정보를 불러오지 못했습니다",
"viewFailed": "프로젝트 보기를 가져오지 못했습니다"
},
"error": {
"notFoundState": "이 프로젝트 또는 보기를 찾을 수 없습니다.",
@@ -19846,6 +19931,9 @@
"tooLargeUnknownCount": "이 보기는 항목이 너무 많아 Orca에서 렌더링할 수 없습니다. GitHub에서 보기 필터를 좁히세요.",
"tooLarge": "이 보기에는 항목이 {{itemCount}}개 있어 Orca에서 렌더링하기에는 너무 많습니다. GitHub에서 보기 필터를 좁히세요.",
"schemaDriftDetail": "이 프로젝트 보기를 읽을 수 없습니다: {{detail}}."
},
"columns": {
"type": "유형"
}
},
"projectField": {
@@ -19932,6 +20020,27 @@
"attachments": {
"updateRuntime": "워크스페이스 링크를 변경하려면 원격 런타임을 업데이트하세요",
"updateRuntimeSafely": "워크스페이스 링크를 안전하게 변경하려면 원격 런타임을 업데이트하세요"
},
"activity": {
"active": "활성",
"working": "작업 중",
"monitoring": "백그라운드 작업 모니터링 중",
"failed": "실패",
"interrupted": "중단됨",
"unconfirmed": "확인하지 못함",
"done": "완료",
"inactive": "비활성",
"permission": "권한 필요",
"unreadLabel": "{{status}} · 읽지 않음"
},
"reviewStatus": {
"checksFailed": "{{review}} 체크: 실패",
"checksPassing": "{{review}} 체크: 통과",
"checksPending": "{{review}} 체크: 대기 중",
"closed": "{{review}}: 닫힘",
"draft": "{{review}}: 초안",
"merged": "{{review}}: 병합됨",
"open": "{{review}}: 열림"
}
},
"tabHoverCard": {
@@ -20489,5 +20598,145 @@
"math": {
"scrollDisplayEquation": "수식 블록 스크롤"
}
},
"runtime": {
"health": {
"local": "로컬",
"available": "연결됨",
"connecting": "연결 중",
"disconnected": "연결 끊김",
"error": "확인 필요",
"mixed": "혼합 상태",
"repair": "다시 페어링 필요",
"update": "업데이트 필요"
},
"compat": {
"compatible": "런타임 클라이언트와 서버가 호환됩니다.",
"clientTooOld": "이 Orca 클라이언트가 너무 오래되어 선택한 서버와 호환되지 않습니다. 이 기기의 Orca를 업데이트하세요. 클라이언트 프로토콜은 {{clientProtocol}}이며 서버에는 클라이언트 프로토콜 {{requiredProtocol}}이(가) 필요합니다.",
"serverTooOld": "선택한 Orca 서버가 너무 오래되어 이 클라이언트와 호환되지 않습니다. 서버의 Orca를 업데이트하세요. 서버 프로토콜은 {{serverProtocol}}이며 클라이언트에는 서버 프로토콜 {{requiredProtocol}}이(가) 필요합니다."
}
},
"native": {
"about": {
"gpu": {
"unknownStatus": "상태를 사용할 수 없음",
"enabled": "활성",
"disabled": "비활성",
"unavailable": "사용할 수 없음",
"safeMode": "비활성화됨(안전 그래픽 모드)",
"software": "소프트웨어 렌더링",
"unknown": "알 수 없음({{status}})",
"summary": "GPU 가속: {{status}}"
}
},
"dialog": {
"importCookies": "쿠키 가져오기",
"spaceTitle": "Orca 스페이스 베타",
"dashboardTitle": "Orca 에이전트 대시보드",
"cookieFiles": "쿠키 파일",
"allFiles": "모든 파일",
"importPetBundle": ".codex-pet 번들 선택",
"pickPet": "펫 선택",
"petImage": "펫 이미지",
"importWarpTheme": "Warp 테마 가져오기",
"warpThemeYaml": "Warp 테마 YAML",
"importWarpFolder": "Warp 테마 폴더 가져오기",
"images": "이미지",
"repoIconImages": "저장소 아이콘 이미지",
"audio": "오디오"
}
},
"taskProviders": {
"linear": {
"updateAccess": "액세스 업데이트",
"addAccess": "Linear 액세스 추가",
"fetchMore": "더 불러오기",
"connectionFailed": "연결 실패",
"listLabel": "Linear 목록",
"projectsLoadFailed": "프로젝트를 불러오지 못했습니다.",
"projectNotFound": "프로젝트를 찾을 수 없습니다.",
"projectLoadFailed": "프로젝트를 불러오지 못했습니다.",
"projectIssuesLoadFailed": "프로젝트 이슈를 불러오지 못했습니다.",
"viewsLoadFailed": "보기를 불러오지 못했습니다.",
"viewContentsLoadFailed": "보기 내용을 불러오지 못했습니다.",
"issuesLoadFailed": "Linear 이슈를 불러오지 못했습니다.",
"apiKeyHint": "Orca에서 사용할 Linear 워크스페이스의 개인 API 키를 붙여넣으세요. 이미 연결된 워크스페이스라면 저장된 키가 교체됩니다.",
"remoteKeyStorage": "이 키는 활성 원격 런타임에 저장됩니다.",
"localKeyStorage": "로컬 런타임 키는 이 기기에 저장되며, 사용 가능한 경우 Electron 암호화 저장소를 사용합니다.",
"commentsLoadFailed": "댓글을 불러오지 못했습니다.",
"updateWorkspaceAccess": "{{workspace}}의 Linear 액세스 업데이트",
"workspaceApiKeyHint": "{{workspace}}의 개인 API 키를 붙여넣으세요. 이미 연결된 워크스페이스라면 저장된 키가 교체됩니다.",
"connect": "연결",
"descriptionUpdateFailed": "설명을 업데이트하지 못했습니다.",
"titleUpdateFailed": "제목을 업데이트하지 못했습니다.",
"truncated": {
"issues_one": "처음 {{count}}개의 이슈를 표시합니다. 전체 목록을 보려면 검색하거나 Linear를 여세요.",
"issues_other": "처음 {{count}}개의 이슈를 표시합니다. 전체 목록을 보려면 검색하거나 Linear를 여세요.",
"projectIssues_one": "프로젝트의 이슈 중 처음 {{count}}개를 표시합니다. 전체 목록을 보려면 검색하거나 Linear를 여세요.",
"projectIssues_other": "프로젝트의 이슈 중 처음 {{count}}개를 표시합니다. 전체 목록을 보려면 검색하거나 Linear를 여세요.",
"projects_one": "처음 {{count}}개의 프로젝트를 표시합니다. 전체 목록을 보려면 검색하거나 Linear를 여세요.",
"projects_other": "처음 {{count}}개의 프로젝트를 표시합니다. 전체 목록을 보려면 검색하거나 Linear를 여세요.",
"viewIssues_one": "보기에 포함된 이슈 중 처음 {{count}}개를 표시합니다. 전체 목록을 보려면 검색하거나 Linear를 여세요.",
"viewIssues_other": "보기에 포함된 이슈 중 처음 {{count}}개를 표시합니다. 전체 목록을 보려면 검색하거나 Linear를 여세요.",
"views_one": "처음 {{count}}개의 보기를 표시합니다. 전체 목록을 보려면 검색하거나 Linear를 여세요.",
"views_other": "처음 {{count}}개의 보기를 표시합니다. 전체 목록을 보려면 검색하거나 Linear를 여세요."
}
},
"jira": {
"connectionFailed": "연결 실패",
"remoteTokenStorage": "토큰은 선택한 원격 런타임으로 전송되며 런타임에서 지원하는 암호화 방식으로 저장됩니다.",
"localTokenStorage": "토큰은 로컬에 저장되며 로컬 런타임 저장소에서 지원하는 경우 암호화됩니다."
},
"errors": {
"jira": {
"createFailed": "이슈를 생성하지 못했습니다.",
"commentFailed": "댓글을 추가하지 못했습니다.",
"notConnected": "Jira에 연결되지 않았습니다.",
"titleRequired": "제목이 필요합니다.",
"labelsConflict": "labels 또는 labelOperations 중 하나만 전달하세요.",
"updateFailed": "이슈를 업데이트하지 못했습니다.",
"credentialsRequired": "사이트 URL, 이메일 및 API 토큰이 필요합니다.",
"projectRequired": "프로젝트가 필요합니다.",
"issueTypeRequired": "이슈 유형이 필요합니다.",
"issueKeyRequired": "이슈 키가 필요합니다.",
"updatesRequired": "업데이트 객체가 필요합니다.",
"commentBodyRequired": "댓글 내용이 필요합니다.",
"invalidSiteUrl": "올바른 Jira 사이트 URL을 입력하세요.",
"passwordRequired": "비밀번호가 필요합니다.",
"personalTokenRequired": "개인 액세스 토큰이 필요합니다.",
"apiTokenRequired": "API 토큰이 필요합니다.",
"connectionFailed": "연결하지 못했습니다.",
"invalidSiteIdentity": "인증 정보가 포함되지 않은 HTTP 또는 HTTPS Jira 사이트 URL을 입력하세요.",
"missingProjectIdentity": "Jira가 ID 또는 키가 없는 프로젝트를 반환했습니다.",
"invalidIssuePage": "Jira가 잘못된 이슈 페이지를 반환했습니다.",
"incompleteIssuePage": "Jira가 불완전한 이슈 페이지를 반환했습니다.",
"repeatedIssueToken": "Jira가 잘못되었거나 반복된 이슈 페이지 토큰을 반환했습니다.",
"issueSearchLimit": "Jira 이슈 검색이 페이지 제한을 초과했습니다. JQL로 프로젝트를 선택하세요.",
"invalidProjectPage": "Jira가 잘못된 프로젝트 페이지를 반환했습니다.",
"incompleteProjectPage": "Jira가 불완전한 프로젝트 페이지를 반환했습니다.",
"projectListLimit": "Jira 프로젝트 목록이 페이지 제한을 초과했습니다. JQL로 프로젝트를 선택하세요.",
"invalidCloudId": "사이트에서 올바른 Atlassian 클라우드 ID를 제공하지 않았습니다."
},
"linear": {
"notConnected": "Linear에 연결되지 않음",
"createFailed": "Linear 생성 실패",
"createdButUnavailable": "이슈가 생성되었지만 가져올 수 없습니다",
"updateFailed": "Linear 업데이트 실패",
"commentFailed": "댓글을 작성하지 못했습니다",
"projectCreateFailed": "Linear 프로젝트 생성 실패",
"noApiKey": "저장된 API 키가 없습니다.",
"workspaceAuthExpired": "이 워크스페이스의 Linear 인증이 만료되었습니다.",
"projectNameRequired": "프로젝트 이름이 필요합니다",
"projectIdRequired": "프로젝트 ID가 필요합니다",
"projectNotFound": "프로젝트를 찾을 수 없습니다",
"viewIdRequired": "사용자 지정 보기 ID가 필요합니다",
"viewHasNoIssues": "사용자 지정 보기에 이슈가 없습니다",
"viewHasNoProjects": "사용자 지정 보기에 프로젝트가 없습니다"
}
}
},
"workspaceOptions": {
"activeFilterCount_one": "필터 {{count}}개",
"activeFilterCount_other": "필터 {{count}}개"
}
}
+283 -29
View File
@@ -20,11 +20,20 @@
},
"discard": {
"deleteUntrackedFileDescription": "Isso excluirá permanentemente este arquivo não rastreado. Essa ação não pode ser desfeita.",
"deleteUntrackedFilesDescription": "Isso excluirá permanentemente estes {{count}} arquivos não rastreados. Essa ação não pode ser desfeita.",
"deleteUntrackedFilesDescription_other": "Isso excluirá permanentemente estes {{count}} arquivos não rastreados. Essa ação não pode ser desfeita.",
"restoreStagedVersionDescription": "Isso restaurará a última versão preparada e descartará a exclusão. Essa ação não pode ser desfeita.",
"unstagedChangesDescription": "Isso reverterá as alterações não preparadas neste arquivo. Essa ação não pode ser desfeita.",
"unstagedSelectionIncludingUntrackedDescription": "Isso reverterá as alterações não preparadas e excluirá permanentemente quaisquer arquivos não rastreados nesta seleção. Essa ação não pode ser desfeita.",
"unstagedFilesIncludingUntrackedDescription": "Isso reverterá as alterações não preparadas e excluirá permanentemente quaisquer arquivos não rastreados entre estes {{count}} arquivos. Essa ação não pode ser desfeita."
"unstagedFilesIncludingUntrackedDescription_other": "Isso reverterá as alterações não preparadas e excluirá permanentemente quaisquer arquivos não rastreados entre estes {{count}} arquivos. Essa ação não pode ser desfeita.",
"delete": "Excluir",
"restore": "Restaurar",
"discard": "Descartar",
"discardAll": "Descartar tudo",
"deleteUntrackedTitle_one": "Excluir {{count}} arquivo não rastreado?",
"deleteUntrackedTitle_other": "Excluir {{count}} arquivos não rastreados?",
"deleteCount": "Excluir {{count}}",
"deleteUntrackedFilesDescription_one": "Isso excluirá permanentemente {{count}} arquivo não rastreado. Essa ação não pode ser desfeita.",
"unstagedFilesIncludingUntrackedDescription_one": "Isso reverterá as alterações não preparadas em {{count}} arquivo e o excluirá permanentemente se ele não for rastreado. Essa ação não pode ser desfeita."
},
"createReviewFailure": {
"authRequiredCommand": "{{providerName}} não está autenticado. Próximo passo: execute {{command}} neste ambiente.",
@@ -56,7 +65,35 @@
"withDetail": "Falha ao criar {{shortLabel}}: {{detail}}",
"pushFailed": "O push falhou. Resolva o erro de push e tente novamente."
},
"actionSaveFailed": "Não foi possível salvar esta ação. Tente salvá-la novamente em Configurações."
"actionSaveFailed": "Não foi possível salvar esta ação. Tente salvá-la novamente em Configurações.",
"model": {
"auto": "Automático",
"configDefault": "Padrão da configuração"
},
"thinking": {
"off": "Desativado",
"minimal": "Mínimo",
"low": "Baixa",
"medium": "Média",
"high": "Alta",
"max": "Máximo",
"xhigh": "Muito alto"
},
"variables": {
"basePrompt": "O prompt integrado do Orca para esta ação, incluindo o contexto que o Orca sabe coletar com segurança.",
"branch": "O nome da branch atual do controle de versão.",
"stagedFiles": "Uma lista de arquivos em staging, separados por quebras de linha, para gerar a mensagem de commit.",
"stagedPatch": "O patch do Git em staging usado para gerar a mensagem de commit.",
"baseBranch": "A branch de destino selecionada no editor de criação de PR.",
"currentTitle": "O título do PR digitado no editor antes do início da geração.",
"currentBody": "A descrição do PR digitada no editor antes do início da geração.",
"commitSummary": "Uma lista de commits da branch em relação à base, separados por quebras de linha.",
"changedFiles": "Um resumo dos arquivos alterados entre a branch e sua base.",
"patch": "O diff da branch em relação à base usado para gerar os detalhes do PR.",
"firstPrompt": "A primeira solicitação do usuário neste espaço de trabalho ou chat.",
"assistantMessage": "A resposta inicial do agente, quando disponível no Orca.",
"linkedIssue": "O número da issue do GitHub vinculada a este espaço de trabalho. Fica vazio quando não há issue do GitHub vinculada (incluindo espaços vinculados ao GitLab). Prefira modelos com instruções: \"Fixes #{linkedIssue}\" isolado vira \"Fixes #\" quando não há vínculo."
}
},
"githubChecks": {
"retrying": "Tentando novamente…",
@@ -716,6 +753,15 @@
"empty": "Nenhuma extensão está ativada para este perfil",
"visitWebStore": "Visitar a Chrome Web Store",
"manage": "Gerenciar extensões"
},
"viewport": {
"mobile-s": "Celular P — 320 × 568",
"mobile-m": "Celular M — 375 × 667",
"mobile-l": "Celular G — 425 × 812",
"tablet": "Tablet — 768 × 1024",
"laptop": "Notebook — 1024 × 768",
"laptop-l": "Notebook G — 1440 × 900",
"desktop": "Desktop — 1920 × 1080"
}
},
"settings": {
@@ -1040,7 +1086,8 @@
"permissionOverrideMore": "e mais {{count}}",
"permissionOverrideMore_one": "e mais {{count}}",
"permissionOverrideMore_other": "e mais {{count}}",
"permissionOverridesUse": "Usar {{mode}}"
"permissionOverridesUse": "Usar {{mode}}",
"approveForMe": "aprovar por mim"
},
"followSymlinkedDirectoriesKeywords": {
"symlink": "link simbólico",
@@ -1071,6 +1118,34 @@
"actionPermissions": {
"sameAsAgent": "Igual a {{agent}}"
}
},
"ssh": {
"status": {
"disconnected": "Desconectado",
"connecting": "Conectando…",
"auth-failed": "Falha na autenticação",
"connected": "Conectado",
"reconnection-failed": "Falha na reconexão",
"deploying-relay": "Implantando relay…",
"reconnecting": "Reconectando…"
}
},
"mcp": {
"workspace": "Espaço de Trabalho",
"inspectFailed": "Não foi possível inspecionar {{directory}}.",
"unreadable": "Não foi possível ler",
"notFound": "Não encontrado",
"invalidJson": "JSON inválido",
"noServers": "Nenhum servidor",
"httpServer": "Servidor HTTP",
"stdioServer": "Servidor stdio",
"invalidServer": "Servidor inválido",
"serverCount_one": "{{count}} servidor",
"serverCount_other": "{{count}} servidores",
"claudeWorkspace": "Espaço de trabalho do Claude"
},
"shortcuts": {
"parseFailed": "Não foi possível interpretar o atalho."
}
},
"auto": {
@@ -9049,10 +9124,10 @@
"dialog": {
"3bc61dc989": "Cancelar",
"15efa778e3": "Descartar",
"42f89dd030": "arquivos",
"e7611dca35": "arquivo",
"0d2d88cba5": "Isso não pode ser desfeito.",
"1551c14668": "Descartar alterações?"
"1551c14668": "Descartar alterações?",
"fileCount_one": "{{count}} arquivo",
"fileCount_other": "{{count}} arquivos"
}
},
"dropdown": {
@@ -9701,16 +9776,21 @@
"525259fa17": "Os detalhes da pilha estão temporariamente indisponíveis."
},
"useFileDeletion": {
"72691dfebc": "Falha ao {{value0}} '{{value1}}'.",
"d979a4fbb5": "Excluir '{{value0}}' permanentemente?",
"92276aceb7": "Excluir",
"7fb9435c86": "Isso exclui permanentemente o diretório e seu conteúdo no host remoto. Isso não pode ser desfeito.",
"23e98f192f": "Isso exclui permanentemente o arquivo no host remoto. Isso não pode ser desfeito.",
"8b8ee9d22f": "Não foi possível determinar qual host possui este arquivo. Verifique a conexão do espaço de trabalho e tente novamente.",
"af1270b90d": "Excluir {{count}} itens permanentemente?",
"dd029aa5cd": "Isso exclui permanentemente os itens selecionados e qualquer conteúdo de diretório no host remoto. Isso não pode ser desfeito.",
"77fdc36183": "Excluir {{count}} itens?",
"fca915a67a": "Itens remotos são excluídos permanentemente e não podem ser desfeitos. Itens locais são movidos para {{value0}}."
"deleteFailed": "Falha ao excluir '{{name}}'.",
"deleteItems_one": "Excluir {{count}} item?",
"deleteItems_other": "Excluir {{count}} itens?",
"mixedRecycleBin": "Os itens remotos são excluídos permanentemente, e isso não pode ser desfeito. Os itens locais são movidos para a Lixeira.",
"mixedTrash": "Os itens remotos são excluídos permanentemente, e isso não pode ser desfeito. Os itens locais são movidos para a Lixeira.",
"permanentlyDeleteItems_one": "Excluir {{count}} item permanentemente?",
"permanentlyDeleteItems_other": "Excluir {{count}} itens permanentemente?",
"recycleBinFailed": "Não foi possível mover '{{name}}' para a Lixeira.",
"trashFailed": "Não foi possível mover '{{name}}' para a Lixeira."
},
"GitHistoryPanel": {
"cf7cad58d2": "Ainda sem commits",
@@ -11216,7 +11296,9 @@
},
"sidebarHostOptions": {
"3e102f111c": "Todos os hosts",
"visibleHostsCount": "{{value0}} hosts"
"hosts": "Hosts",
"visibleHosts_one": "{{count}} host",
"visibleHosts_other": "{{count}} hosts"
},
"SshTargetRow": {
"4677394048": "Conectando…",
@@ -13147,9 +13229,6 @@
"7f3f7b4c18": "Descrição (opcional, markdown)",
"9f2b4c03a6": "Registrando em",
"d3d0998b7d": "Nova issue do GitHub",
"d1e243795c": "issues",
"be8cf68d9f": "ver issues",
"67662ade50": "issues do projeto",
"6244a02f46": "Abrir no Linear",
"606a85c774": "Abrir",
"5e8061b088": "Iniciar espaço de trabalho a partir de {{value0}} {{value1}}",
@@ -13169,11 +13248,9 @@
"af377b13b1": "Visualização de {{value0}}",
"d47248df4d": "Modo de visualização do Linear",
"f397d513e3": "Voltar",
"b39fe6511d": "projetos",
"8675cd6188": "Linear",
"733b8f2421": "Linear / Visualizações",
"bc06ed0fb0": "Voltar para visualizações",
"3cb855080f": "visualizações",
"b4e10f096e": "Proprietário",
"a04fe7ba73": "Visibilidade",
"0aa8525950": "Modelo",
@@ -13594,13 +13671,13 @@
"9ee54037a4": "Comando personalizado",
"4b2fc4b80c": "Esforço de raciocínio",
"be8917699e": "Modelo",
"4d9b6d84df": "não suportado. Escolha Claude, Codex, ou Personalizado.",
"560d4feb00": "Personalizado",
"29d119fe95": "Agente",
"f9382b48a1": "Ativar autor de IA",
"1c0cb4fabb": "Autor de IA",
"bd14e9c42a": "Não configurado",
"1f9468c5c9": "{{value0}} não suportado"
"1f9468c5c9": "{{value0}} não suportado",
"unsupportedAgent": "{{agent}} não é suportado. Escolha Claude, Codex ou Personalizado."
},
"ConnectIntegrationsList": {
"3dddb2d565": "conectado para tarefas",
@@ -16217,8 +16294,6 @@
"7616c986c6": "Abrir {{value0}} issues",
"openInLinear": "Abrir {{value0}} no Linear",
"93e1f6bfca": "Carregando",
"98730088a6": ". Busque ou abra o Linear para o conjunto completo.",
"06b887d622": "Mostrando os primeiros",
"f2cc1e0ff6": "Linear / Projetos",
"906b5e4cb8": "Linear / Projetos / {{value0}}",
"85607ff793": "Projeto",
@@ -16770,12 +16845,10 @@
"untitled": "Chat sem título",
"listLabel": "Chats que seriam reconectados",
"dontAskAgain": "Não perguntar novamente — reconectar automaticamente na próxima vez",
"dontAskAgainHint": "Os chats qualificados serão reconectados automaticamente após uma reinicialização, e o Orca vai avisar você quando isso acontecer. Você pode desativar isso em Configurações → Experimental → Interface de Chat.",
"dontAskAgainHint": "Você pode desativar isso em Configurações → Chat → Comportamento.",
"continuedOne": "1 chat reconectado e solicitado a continuar",
"continuedMany": "{{value0}} chats reconectados e solicitados a continuar",
"selectAgent": "Reconectar chat de {{value0}} \"{{value1}}\" em {{value2}}",
"resumeSelected": "Reconectar {{value0}}",
"resumeSelectedOne": "Retomar 1 chat",
"dismissAll": "Dispensar todos",
"notContinuedOne": "Não foi possível retomar 1 chat",
"notContinuedMany": "Não foi possível retomar {{value0}} chats",
@@ -16810,7 +16883,9 @@
"serverDismiss": "Descartar",
"serverResumeAll": "Retomar todos os {{count}} em {{machine}}",
"serverResumeHereOne": "Retomar 1 chat iniciado aqui",
"serverResumeHere": "Retomar {{count}} chats iniciados aqui"
"serverResumeHere": "Retomar {{count}} chats iniciados aqui",
"resumeChats_one": "Retomar {{count}} chat",
"resumeChats_other": "Retomar {{count}} chats"
},
"LinearItemDrawer": {
"04008e6c46": "Iniciar espaço de trabalho a partir da issue",
@@ -17665,7 +17740,6 @@
"LinearIssueTextEditor": {
"947ba2d6f4": "para salvar",
"04d73b72dc": "Título da issue",
"e8ff595db3": "Falha ao atualizar {{value0}}",
"1e08a1ec80": "O título é obrigatório"
},
"pluginCatalog": {
@@ -18632,7 +18706,8 @@
"compactAfterRetry": "Tente enviar sua mensagem anterior novamente e execute /compact.",
"clearAfterSending": "Sua mensagem anterior ainda está sendo enviada. Execute /clear após o envio.",
"compactAfterSending": "Sua mensagem anterior ainda está sendo enviada. Execute /compact após o envio.",
"pendingWork": "Aguarde a conclusão do trabalho e das mensagens pendentes antes de usar este comando."
"pendingWork": "Aguarde a conclusão do trabalho e das mensagens pendentes antes de usar este comando.",
"notDoneGoalChangeIncomplete": "Não foi possível concluir a alteração do objetivo. Verifique o chat."
},
"newRowsAnnouncement": "Novas mensagens chegaram enquanto você estava ausente",
"newRowsMarker": "Novas",
@@ -18900,6 +18975,15 @@
"settings": "Abrir as configurações no terminal",
"extensions": "Abrir o painel de extensões no terminal",
"hotkeys": "Mostrar os atalhos de teclado no terminal"
},
"modelDescriptions": {
"grok_4_7": "O modelo de ponta mais recente da xAI",
"grok_4_6": "O modelo de ponta anterior da xAI",
"grok_4_5": "Um modelo de ponta mais antigo da xAI",
"fable": "O mais capaz para as tarefas mais difíceis e demoradas",
"opus": "Ideal para tarefas complexas do dia a dia",
"sonnet": "Eficiente para tarefas rotineiras",
"haiku": "O mais rápido para respostas rápidas"
}
},
"tab": {
@@ -19531,7 +19615,9 @@
"confirmTitle": "Reiniciar o daemon de terminais?",
"confirmBody": "Reiniciar encerra todos os processos em execução em {{sessions}}. Agentes que permitem retomar sessões poderão ser retomados depois; shells e outras tarefas precisarão ser iniciados novamente. Faça isso quando seus agentes estiverem ociosos.",
"cancel": "Cancelar",
"confirm": "Reiniciar e encerrar processos"
"confirm": "Reiniciar e encerrar processos",
"count_other": "{{count}} terminais em execução",
"count_one": "{{count}} terminal em execução"
},
"restartedInputNotSent": "O terminal reiniciou enquanto você digitava, então parte da entrada pode não ter chegado a ele. Verifique o novo shell antes de digitar novamente."
},
@@ -19811,7 +19897,11 @@
"picker": {
"pasteUnparseable": "Esperava-se uma URL de projeto ou owner/number",
"ownerLoadFailed": "Não foi possível carregar os projetos de {{owner}}.",
"organizationsLoadFailed": "Algumas organizações não foram carregadas ({{failureCount}})."
"organizationsLoadFailed": "Algumas organizações não foram carregadas ({{failureCount}}).",
"organizations": "Organizações",
"listFailed": "Não foi possível listar os projetos",
"detailsFailed": "Não foi possível carregar os detalhes",
"viewFailed": "Não foi possível buscar a visualização do projeto"
},
"error": {
"notFoundState": "Não foi possível encontrar este projeto ou visualização.",
@@ -19846,6 +19936,9 @@
"tooLargeUnknownCount": "Esta visualização tem itens demais para ser exibida no Orca. Restrinja o filtro da visualização no GitHub.",
"tooLarge": "Esta visualização tem {{itemCount}} itens, demais para ser exibida no Orca. Restrinja o filtro da visualização no GitHub.",
"schemaDriftDetail": "Não foi possível ler esta visualização do projeto: {{detail}}."
},
"columns": {
"type": "Digite"
}
},
"projectField": {
@@ -19928,6 +20021,27 @@
"attachments": {
"updateRuntime": "Atualize o runtime remoto para alterar os links do espaço de trabalho",
"updateRuntimeSafely": "Atualize o runtime remoto para alterar com segurança os links do espaço de trabalho"
},
"activity": {
"active": "Ativo",
"working": "Trabalhando",
"monitoring": "Monitorando tarefas em segundo plano",
"failed": "Falhou",
"interrupted": "Interrompido",
"unconfirmed": "Não foi possível confirmar",
"done": "Concluído",
"inactive": "Inativo",
"permission": "Precisa de permissão",
"unreadLabel": "{{status}} · Não lido"
},
"reviewStatus": {
"checksFailed": "Verificações do {{review}}: com falha",
"checksPassing": "Verificações do {{review}}: aprovadas",
"checksPending": "Verificações do {{review}}: pendentes",
"closed": "{{review}}: Fechado",
"draft": "{{review}}: Rascunho",
"merged": "{{review}}: Mergeado",
"open": "{{review}}: Aberto"
}
},
"tabHoverCard": {
@@ -20485,5 +20599,145 @@
"math": {
"scrollDisplayEquation": "Rolar equação em bloco"
}
},
"runtime": {
"health": {
"available": "Conectado",
"connecting": "Conectando",
"disconnected": "Desconectado",
"error": "Precisa de atenção",
"mixed": "Misto",
"local": "Local",
"repair": "Precisa parear novamente",
"update": "Precisa de atualização"
},
"compat": {
"compatible": "O cliente e o servidor do ambiente de execução são compatíveis.",
"clientTooOld": "Este cliente Orca é antigo demais para o servidor selecionado. Atualize o Orca nesta máquina. Protocolo do cliente: {{clientProtocol}}; o servidor exige o protocolo de cliente {{requiredProtocol}}.",
"serverTooOld": "O servidor Orca selecionado é antigo demais para este cliente. Atualize o Orca no servidor. Protocolo do servidor: {{serverProtocol}}; o cliente exige o protocolo de servidor {{requiredProtocol}}."
}
},
"native": {
"about": {
"gpu": {
"unknownStatus": "Status indisponível",
"enabled": "Ativado",
"disabled": "Desativado",
"unavailable": "Indisponível",
"safeMode": "Desativada (modo gráfico seguro)",
"software": "Renderização por software",
"unknown": "Desconhecido ({{status}})",
"summary": "Aceleração de GPU: {{status}}"
}
},
"dialog": {
"importCookies": "Importar Cookies",
"spaceTitle": "Espaço Orca Beta",
"dashboardTitle": "Painel de agentes do Orca",
"cookieFiles": "Arquivos de cookies",
"allFiles": "Todos os arquivos",
"importPetBundle": "Selecionar um pacote .codex-pet",
"pickPet": "Selecionar mascote",
"petImage": "Imagem do mascote",
"importWarpTheme": "Importar tema do Warp",
"warpThemeYaml": "YAML de tema do Warp",
"importWarpFolder": "Importar pasta de temas do Warp",
"images": "Imagens",
"repoIconImages": "Imagens de ícone do repositório",
"audio": "Áudio"
}
},
"taskProviders": {
"linear": {
"updateAccess": "Atualizar acesso",
"addAccess": "Adicionar acesso ao Linear",
"fetchMore": "Buscar mais",
"connectionFailed": "Falha na conexão",
"listLabel": "Lista do Linear",
"projectsLoadFailed": "Não foi possível carregar os projetos.",
"projectNotFound": "O projeto não foi encontrado.",
"projectLoadFailed": "Não foi possível carregar o projeto.",
"projectIssuesLoadFailed": "Não foi possível carregar as issues do projeto.",
"viewsLoadFailed": "Não foi possível carregar as visualizações.",
"viewContentsLoadFailed": "Não foi possível carregar o conteúdo da visualização.",
"issuesLoadFailed": "Não foi possível carregar as issues do Linear.",
"apiKeyHint": "Cole uma chave de API pessoal do espaço de trabalho do Linear que deseja usar no Orca. Se ele já estiver conectado, o Orca substituirá a chave armazenada.",
"remoteKeyStorage": "Esta chave é armazenada pelo ambiente de execução remoto ativo.",
"localKeyStorage": "As chaves do ambiente de execução local são armazenadas neste dispositivo com o armazenamento criptografado do Electron quando disponível.",
"commentsLoadFailed": "Não foi possível carregar os comentários.",
"updateWorkspaceAccess": "Atualizar acesso ao Linear para {{workspace}}",
"workspaceApiKeyHint": "Cole uma chave de API pessoal de {{workspace}}. Se ele já estiver conectado, o Orca substituirá a chave armazenada.",
"connect": "Conectar",
"descriptionUpdateFailed": "Falha ao atualizar a descrição",
"titleUpdateFailed": "Falha ao atualizar o título",
"truncated": {
"issues_one": "Mostrando {{count}} issue do início da lista. Pesquise ou abra o Linear para ver a lista completa.",
"issues_other": "Mostrando as primeiras {{count}} issues. Pesquise ou abra o Linear para ver a lista completa.",
"projectIssues_one": "Mostrando {{count}} issue do início da lista do projeto. Pesquise ou abra o Linear para ver a lista completa.",
"projectIssues_other": "Mostrando as primeiras {{count}} issues do projeto. Pesquise ou abra o Linear para ver a lista completa.",
"projects_one": "Mostrando {{count}} projeto do início da lista. Pesquise ou abra o Linear para ver a lista completa.",
"projects_other": "Mostrando os primeiros {{count}} projetos. Pesquise ou abra o Linear para ver a lista completa.",
"viewIssues_one": "Mostrando {{count}} issue do início da lista da visualização. Pesquise ou abra o Linear para ver a lista completa.",
"viewIssues_other": "Mostrando as primeiras {{count}} issues da visualização. Pesquise ou abra o Linear para ver a lista completa.",
"views_one": "Mostrando {{count}} visualização do início da lista. Pesquise ou abra o Linear para ver a lista completa.",
"views_other": "Mostrando as primeiras {{count}} visualizações. Pesquise ou abra o Linear para ver a lista completa."
}
},
"jira": {
"connectionFailed": "Falha na conexão",
"remoteTokenStorage": "Seu token é enviado ao ambiente de execução remoto selecionado e armazenado lá com a criptografia compatível com esse ambiente.",
"localTokenStorage": "Seu token é armazenado localmente e criptografado quando o armazenamento do ambiente de execução local oferece suporte."
},
"errors": {
"jira": {
"createFailed": "Falha ao criar a issue.",
"commentFailed": "Falha ao adicionar o comentário.",
"notConnected": "Não conectado ao Jira.",
"titleRequired": "O título é obrigatório.",
"labelsConflict": "Forneça labels ou labelOperations, não ambos.",
"updateFailed": "Não foi possível atualizar a issue.",
"credentialsRequired": "A URL do site, o e-mail e o token de API são obrigatórios.",
"projectRequired": "O projeto é obrigatório.",
"issueTypeRequired": "O tipo de issue é obrigatório.",
"issueKeyRequired": "A chave da issue é obrigatória.",
"updatesRequired": "O objeto de atualização é obrigatório.",
"commentBodyRequired": "O conteúdo do comentário é obrigatório.",
"invalidSiteUrl": "Insira uma URL válida do site do Jira.",
"passwordRequired": "A senha é obrigatória.",
"personalTokenRequired": "O token de acesso pessoal é obrigatório.",
"apiTokenRequired": "O token de API é obrigatório.",
"connectionFailed": "Falha na conexão.",
"invalidSiteIdentity": "Insira uma URL HTTP ou HTTPS do site do Jira sem credenciais.",
"missingProjectIdentity": "O Jira retornou um projeto sem ID ou chave.",
"invalidIssuePage": "O Jira retornou uma página de issues inválida.",
"incompleteIssuePage": "O Jira retornou uma página de issues incompleta.",
"repeatedIssueToken": "O Jira retornou um token de página de issues inválido ou repetido.",
"issueSearchLimit": "A busca de issues do Jira excedeu o limite de páginas. Selecione um projeto usando JQL.",
"invalidProjectPage": "O Jira retornou uma página de projetos inválida.",
"incompleteProjectPage": "O Jira retornou uma página de projetos incompleta.",
"projectListLimit": "A lista de projetos do Jira excedeu o limite de páginas. Selecione um projeto usando JQL.",
"invalidCloudId": "O site não informou um ID válido do Atlassian Cloud."
},
"linear": {
"notConnected": "Não conectado ao Linear",
"createFailed": "Falha ao criar no Linear",
"createdButUnavailable": "A issue foi criada, mas não foi possível recuperá-la",
"updateFailed": "Falha ao atualizar no Linear",
"commentFailed": "Não foi possível criar o comentário",
"projectCreateFailed": "Falha ao criar o projeto do Linear",
"noApiKey": "Nenhuma chave de API armazenada.",
"workspaceAuthExpired": "A autenticação do Linear expirou para este espaço de trabalho.",
"projectNameRequired": "O nome do projeto é obrigatório",
"projectIdRequired": "O ID do projeto é obrigatório",
"projectNotFound": "O projeto não foi encontrado",
"viewIdRequired": "O ID da visualização personalizada é obrigatório",
"viewHasNoIssues": "A visualização personalizada não contém issues",
"viewHasNoProjects": "A visualização personalizada não contém projetos"
}
}
},
"workspaceOptions": {
"activeFilterCount_one": "{{count}} filtro",
"activeFilterCount_other": "{{count}} filtros"
}
}
+307 -26
View File
@@ -237,6 +237,15 @@
"title": "История",
"today": "Сегодня",
"yesterday": "Вчера"
},
"viewport": {
"desktop": "Настольный компьютер — 1920 × 1080",
"laptop": "Ноутбук — 1024 × 768",
"laptop-l": "Ноутбук L — 1440 × 900",
"mobile-l": "Мобильное устройство L — 425 × 812",
"mobile-m": "Мобильное устройство M — 375 × 667",
"mobile-s": "Мобильное устройство S — 320 × 568",
"tablet": "Планшет — 768 × 1024"
}
},
"editor": {
@@ -598,7 +607,8 @@
"permissionOverrideMore_few": "и ещё {{count}}",
"permissionOverrideMore_many": "и ещё {{count}}",
"permissionOverrideMore_other": "и ещё {{count}}",
"permissionOverridesUse": "Использовать настройки «{{mode}}»"
"permissionOverridesUse": "Использовать настройки «{{mode}}»",
"approveForMe": "одобрять за меня"
},
"followSymlinkedDirectoriesKeywords": {
"symlink": "символическая ссылка",
@@ -629,6 +639,36 @@
"actionPermissions": {
"sameAsAgent": "Как у {{agent}}"
}
},
"mcp": {
"claudeWorkspace": "Рабочее пространство Claude",
"httpServer": "HTTP-сервер",
"inspectFailed": "Не удалось проверить {{directory}}.",
"invalidJson": "Некорректный JSON",
"invalidServer": "Некорректный сервер",
"noServers": "Нет серверов",
"notFound": "Не найдено",
"serverCount_one": "{{count}} сервер",
"serverCount_other": "{{count}} сервера",
"stdioServer": "Сервер stdio",
"unreadable": "Не удалось прочитать",
"workspace": "Рабочее пространство",
"serverCount_few": "{{count}} сервера",
"serverCount_many": "{{count}} серверов"
},
"shortcuts": {
"parseFailed": "Не удалось распознать сочетание клавиш."
},
"ssh": {
"status": {
"auth-failed": "Ошибка аутентификации",
"connected": "Подключён",
"connecting": "Подключение…",
"deploying-relay": "Развёртывание ретранслятора…",
"disconnected": "Отключён",
"reconnecting": "Повторное подключение…",
"reconnection-failed": "Не удалось восстановить подключение"
}
}
},
"menu": {
@@ -2042,7 +2082,6 @@
"LinearIssueTextEditor": {
"947ba2d6f4": "для сохранения",
"04d73b72dc": "Название задачи",
"e8ff595db3": "Не удалось обновить {{value0}}",
"1e08a1ec80": "Укажите название"
},
"LinearIssueWorkspace": {
@@ -2394,8 +2433,6 @@
"continuedOne": "Возобновлён 1 чат",
"continuedMany": "Возобновлено чатов: {{value0}}",
"selectAgent": "Возобновить чат {{value0}} «{{value1}}» в {{value2}}",
"resumeSelected": "Возобновить чаты: {{value0}}",
"resumeSelectedOne": "Возобновить 1 чат",
"dismissAll": "Отклонить все",
"notContinuedOne": "Не удалось возобновить 1 чат",
"notContinuedMany": "Не удалось возобновить чаты: {{value0}}",
@@ -2424,7 +2461,11 @@
"selectMachine": "Выбрать все чаты на {{value0}}",
"sshHost": "SSH",
"done": "Готово",
"resultListLabel": "Чаты для этого возобновления"
"resultListLabel": "Чаты для этого возобновления",
"resumeChats_one": "Возобновить {{count}} чат",
"resumeChats_other": "Возобновить {{count}} чата",
"resumeChats_few": "Возобновить {{count}} чата",
"resumeChats_many": "Возобновить {{count}} чатов"
},
"StarNagCard": {
"30c36231c1": "Orca — проект с открытым исходным кодом. Если он помог вам сегодня, звезда на GitHub поможет другим разработчикам найти его.",
@@ -2489,9 +2530,6 @@
"7f3f7b4c18": "Описание (необязательно, Markdown)",
"9f2b4c03a6": "Создать в",
"d3d0998b7d": "Новая задача GitHub",
"d1e243795c": "задачи",
"be8cf68d9f": "задачи представления",
"67662ade50": "задачи проекта",
"6244a02f46": "Открыть в Linear",
"606a85c774": "Открыта",
"5e8061b088": "Создать рабочее пространство из {{value0}} {{value1}}",
@@ -2511,11 +2549,9 @@
"af377b13b1": "Представление {{value0}}",
"d47248df4d": "Режим представлений Linear",
"f397d513e3": "Назад",
"b39fe6511d": "проекты",
"8675cd6188": "Linear",
"733b8f2421": "Linear / Представления",
"bc06ed0fb0": "К представлениям",
"3cb855080f": "представления",
"b4e10f096e": "Владелец",
"a04fe7ba73": "Видимость",
"0aa8525950": "Модель",
@@ -3185,8 +3221,6 @@
"aac9a4afc6": "Открыть в Linear",
"7616c986c6": "Открыть задачи: {{value0}}",
"93e1f6bfca": "Загрузка",
"98730088a6": ". Для полного списка используйте поиск или откройте Linear.",
"06b887d622": "Показаны первые",
"linearLoginUnreadable": "Не удалось прочитать сохранённые данные входа в Linear. Подключите учётную запись заново в настройках.",
"f2cc1e0ff6": "Linear / Проекты",
"906b5e4cb8": "Linear / Проекты / {{value0}}",
@@ -5671,7 +5705,11 @@
},
"sidebarHostOptions": {
"3e102f111c": "Все серверы",
"visibleHostsCount": "Компьютеров: {{value0}}"
"hosts": "Серверы",
"visibleHosts_one": "{{count}} сервер",
"visibleHosts_other": "{{count}} сервера",
"visibleHosts_few": "{{count}} сервера",
"visibleHosts_many": "{{count}} серверов"
},
"SidebarWorkspaceOptionsMenu": {
"hosts": "Серверы",
@@ -13338,10 +13376,12 @@
"dialog": {
"3bc61dc989": "Отмена",
"15efa778e3": "Отменить изменения",
"42f89dd030": "файлов",
"e7611dca35": "файл",
"0d2d88cba5": "Это действие нельзя отменить.",
"1551c14668": "Отменить изменения?"
"1551c14668": "Отменить изменения?",
"fileCount_one": "{{count}} файл",
"fileCount_other": "{{count}} файла",
"fileCount_few": "{{count}} файла",
"fileCount_many": "{{count}} файлов"
}
},
"dropdown": {
@@ -13582,16 +13622,25 @@
"unresolved": "Не удалось определить хост этого рабочего пространства. Проверьте соединение и попробуйте снова."
},
"useFileDeletion": {
"72691dfebc": "Не удалось выполнить {{value0}} для «{{value1}}».",
"d979a4fbb5": "Безвозвратно удалить «{{value0}}»?",
"92276aceb7": "Удалить",
"7fb9435c86": "Папка и всё её содержимое будут безвозвратно удалены на удалённом хосте. Это действие нельзя отменить.",
"23e98f192f": "Файл будет безвозвратно удалён на удалённом хосте. Это действие нельзя отменить.",
"8b8ee9d22f": "Не удалось определить хост этого файла. Проверьте подключение рабочего пространства и попробуйте снова.",
"af1270b90d": "Безвозвратно удалить элементы ({{count}})?",
"dd029aa5cd": "Выбранные элементы и всё содержимое папок будут безвозвратно удалены на удалённом хосте. Это действие нельзя отменить.",
"77fdc36183": "Удалить элементы ({{count}})?",
"fca915a67a": "Удалённые элементы будут удалены безвозвратно. Локальные элементы будут перемещены в {{value0}}."
"deleteFailed": "Не удалось удалить «{{name}}».",
"deleteItems_one": "Удалить {{count}} элемент?",
"deleteItems_other": "Удалить {{count}} элемента?",
"mixedRecycleBin": "Элементы на удалённом сервере будут безвозвратно удалены. Это действие нельзя отменить. Локальные элементы будут перемещены в корзину.",
"mixedTrash": "Элементы на удалённом сервере будут безвозвратно удалены. Это действие нельзя отменить. Локальные элементы будут перемещены в корзину.",
"permanentlyDeleteItems_one": "Безвозвратно удалить {{count}} элемент?",
"permanentlyDeleteItems_other": "Безвозвратно удалить {{count}} элемента?",
"recycleBinFailed": "Не удалось переместить «{{name}}» в корзину.",
"trashFailed": "Не удалось переместить «{{name}}» в корзину.",
"deleteItems_few": "Удалить {{count}} элемента?",
"deleteItems_many": "Удалить {{count}} элементов?",
"permanentlyDeleteItems_few": "Безвозвратно удалить {{count}} элемента?",
"permanentlyDeleteItems_many": "Безвозвратно удалить {{count}} элементов?"
},
"useFileExplorerHandlers": {
"32cd9fd991": "Не удалось открыть цель символической ссылки",
@@ -14570,13 +14619,13 @@
"9ee54037a4": "Своя команда",
"4b2fc4b80c": "Глубина рассуждений",
"be8917699e": "Модель",
"4d9b6d84df": "не поддерживается. Выберите Claude, Codex или «Свой».",
"560d4feb00": "Свой",
"29d119fe95": "Агент",
"f9382b48a1": "Включить ИИ-автора",
"1c0cb4fabb": "ИИ-автор",
"bd14e9c42a": "Не настроено",
"1f9468c5c9": "{{value0}} не поддерживается"
"1f9468c5c9": "{{value0}} не поддерживается",
"unsupportedAgent": "{{agent}} не поддерживается. Выберите Claude, Codex или «Свой»."
},
"BrowserAnimatedVisual": {
"46df009982": "Начните бесплатный пробный период",
@@ -18666,6 +18715,15 @@
"usageAccount": "Просмотреть статистику использования учётной записи",
"usageProvider": "Показать использование и лимиты провайдера",
"vim": "Включить или выключить режим Vim"
},
"modelDescriptions": {
"fable": "Самая мощная для самых сложных и длительных задач",
"grok_4_5": "Одна из прежних передовых моделей xAI",
"grok_4_6": "Предыдущая передовая модель xAI",
"grok_4_7": "Новейшая передовая модель xAI",
"haiku": "Для максимально быстрых ответов",
"opus": "Лучший выбор для сложных повседневных задач",
"sonnet": "Эффективна для типовых задач"
}
},
"tab": {
@@ -19350,11 +19408,22 @@
"actionSaveFailed": "Не удалось сохранить действие. Повторите сохранение в настройках.",
"discard": {
"deleteUntrackedFileDescription": "Этот неотслеживаемый файл будет безвозвратно удалён. Это действие нельзя отменить.",
"deleteUntrackedFilesDescription": "Неотслеживаемые файлы ({{count}}) будут безвозвратно удалены. Это действие нельзя отменить.",
"deleteUntrackedFilesDescription_other": "Неотслеживаемые файлы ({{count}}) будут безвозвратно удалены. Это действие нельзя отменить.",
"restoreStagedVersionDescription": "Будет восстановлена последняя версия из индекса, а удаление отменено. Это действие нельзя отменить.",
"unstagedChangesDescription": "Изменения этого файла вне индекса будут отменены. Это действие нельзя отменить.",
"unstagedSelectionIncludingUntrackedDescription": "Изменения вне индекса будут отменены, а неотслеживаемые файлы среди выбранных — безвозвратно удалены. Это действие нельзя отменить.",
"unstagedFilesIncludingUntrackedDescription": "Изменения вне индекса будут отменены, а неотслеживаемые файлы среди выбранных ({{count}}) — безвозвратно удалены. Это действие нельзя отменить."
"unstagedFilesIncludingUntrackedDescription_other": "Изменения вне индекса будут отменены, а неотслеживаемые файлы среди выбранных ({{count}}) — безвозвратно удалены. Это действие нельзя отменить.",
"delete": "Удалить",
"deleteCount": "Удалить {{count}}",
"deleteUntrackedFilesDescription_one": "Будет безвозвратно удалён {{count}} неотслеживаемый файл. Это действие нельзя отменить.",
"deleteUntrackedTitle_one": "Удалить {{count}} неотслеживаемый файл?",
"deleteUntrackedTitle_other": "Удалить {{count}} неотслеживаемого файла?",
"discard": "Отменить изменения",
"discardAll": "Отменить все изменения",
"restore": "Восстановить",
"unstagedFilesIncludingUntrackedDescription_one": "Изменения не в индексе будут отменены, а неотслеживаемые файлы среди выбранных ({{count}}) — безвозвратно удалены. Это действие нельзя отменить.",
"deleteUntrackedTitle_few": "Удалить {{count}} неотслеживаемых файла?",
"deleteUntrackedTitle_many": "Удалить {{count}} неотслеживаемых файлов?"
},
"unlinkedPr": {
"status": "Связь с PR №{{number}} удалена"
@@ -19388,6 +19457,34 @@
"signInHintVariable": "Задайте {{variable}} в этом окружении",
"unsupportedProvider": "Чтобы создать {{reviewLabel}}, нужен удалённый репозиторий на {{providerName}}.",
"withDetail": "Не удалось создать {{shortLabel}}: {{detail}}"
},
"model": {
"auto": "Автоматически",
"configDefault": "По умолчанию из конфигурации"
},
"thinking": {
"high": "Высокий",
"low": "Низкий",
"max": "Максимальный",
"medium": "Средний",
"minimal": "Минимальный",
"off": "Выключено",
"xhigh": "Очень высокий"
},
"variables": {
"assistantMessage": "Первый ответ агента, если он доступен в Orca.",
"baseBranch": "Целевая ветка, выбранная в форме создания PR.",
"basePrompt": "Встроенный запрос Orca для этого действия, включая контекст, который Orca может безопасно собрать.",
"branch": "Имя текущей ветки.",
"changedFiles": "Сводка о файлах, изменённых в ветке относительно базовой ветки.",
"commitSummary": "Список коммитов ветки относительно базовой ветки, по одному в строке.",
"currentBody": "Описание PR, введённое в форме до начала генерации.",
"currentTitle": "Заголовок PR, введённый в форме до начала генерации.",
"firstPrompt": "Первый запрос пользователя в этом рабочем пространстве или чате.",
"linkedIssue": "Номер задачи GitHub, связанной с этим рабочим пространством. Пустое значение, если задача GitHub не связана (в том числе для рабочих пространств, связанных с GitLab). Предпочитайте шаблоны с инструкциями: строка «Fixes #{linkedIssue}» без связанной задачи превращается в «Fixes #».",
"patch": "Различия ветки относительно базовой ветки для генерации сведений о PR.",
"stagedFiles": "Список файлов в индексе, по одному в строке, для создания сообщения коммита.",
"stagedPatch": "Патч Git с изменениями в индексе для создания сообщения коммита."
}
},
"agentsSidebarIntro": {
@@ -19656,7 +19753,11 @@
"confirmTitle": "Перезапустить службу терминалов?",
"confirmBody": "Перезапуск остановит {{sessions}} и все процессы в них. Агентов с поддержкой продолжения можно возобновить позже; оболочки и другие задания придётся запустить заново. Делайте это, когда агенты не заняты.",
"cancel": "Отмена",
"confirm": "Перезапустить и завершить процессы"
"confirm": "Перезапустить и завершить процессы",
"count_one": "{{count}} работающий терминал",
"count_other": "{{count}} работающего терминала",
"count_few": "{{count}} работающих терминала",
"count_many": "{{count}} работающих терминалов"
},
"restartedInputNotSent": "Терминал перезапустился во время ввода, поэтому часть текста могла не дойти. Проверьте новую оболочку, прежде чем вводить текст снова."
},
@@ -19970,7 +20071,14 @@
"picker": {
"organizationsLoadFailed": "Не удалось загрузить некоторые организации ({{failureCount}}).",
"ownerLoadFailed": "Не удалось загрузить проекты {{owner}}.",
"pasteUnparseable": "Ожидался URL проекта или owner/number"
"pasteUnparseable": "Ожидался URL проекта или owner/number",
"detailsFailed": "Не удалось загрузить сведения",
"listFailed": "Не удалось получить список проектов",
"organizations": "Организации",
"viewFailed": "Не удалось получить представление проекта"
},
"columns": {
"type": "Тип"
}
},
"projectField": {
@@ -20053,6 +20161,27 @@
"attachments": {
"updateRuntime": "Обновите удалённую среду выполнения, чтобы менять ссылки рабочего пространства",
"updateRuntimeSafely": "Обновите удалённую среду выполнения, чтобы безопасно менять ссылки рабочего пространства"
},
"activity": {
"active": "Активно",
"done": "Готово",
"failed": "Ошибка",
"inactive": "Неактивно",
"interrupted": "Прервано",
"monitoring": "Наблюдение за фоновыми задачами",
"permission": "Требуется разрешение",
"unconfirmed": "Не удалось подтвердить",
"unreadLabel": "{{status}} · Непрочитанное",
"working": "В работе"
},
"reviewStatus": {
"checksFailed": "{{review}}: проверки завершились с ошибками",
"checksPassing": "{{review}}: проверки пройдены",
"checksPending": "{{review}}: проверки ожидаются",
"closed": "{{review}}: закрыт",
"draft": "{{review}}: черновик",
"merged": "{{review}}: слит",
"open": "{{review}}: открыт"
}
},
"tabHoverCard": {
@@ -20614,5 +20743,157 @@
},
"startupFailure": {
"title": "Не удалось запустить Orca"
},
"native": {
"about": {
"gpu": {
"disabled": "Выключено",
"enabled": "Включено",
"safeMode": "Выключено (безопасный режим графики)",
"software": "Программная отрисовка",
"summary": "Ускорение GPU: {{status}}",
"unavailable": "Недоступно",
"unknown": "Неизвестно ({{status}})",
"unknownStatus": "Статус недоступен"
}
},
"dialog": {
"allFiles": "Все файлы",
"audio": "Аудио",
"cookieFiles": "Файлы cookie",
"dashboardTitle": "Панель агентов Orca",
"images": "Изображения",
"importCookies": "Импортировать файлы cookie",
"importPetBundle": "Выбрать пакет .codex-pet",
"importWarpFolder": "Импортировать папку с темами Warp",
"importWarpTheme": "Импортировать тему Warp",
"petImage": "Изображение питомца",
"pickPet": "Выбрать питомца",
"repoIconImages": "Изображения для значка репозитория",
"spaceTitle": "Orca Space Beta",
"warpThemeYaml": "YAML темы Warp"
}
},
"runtime": {
"compat": {
"clientTooOld": "Этот клиент Orca устарел для выбранного сервера. Обновите Orca на этом компьютере. Протокол клиента: {{clientProtocol}}, серверу требуется протокол клиента {{requiredProtocol}}.",
"compatible": "Клиент и сервер среды выполнения совместимы.",
"serverTooOld": "Выбранный сервер Orca устарел для этого клиента. Обновите Orca на сервере. Протокол сервера: {{serverProtocol}}, клиенту требуется протокол сервера {{requiredProtocol}}."
},
"health": {
"available": "Подключён",
"connecting": "Подключение",
"disconnected": "Отключён",
"error": "Требует внимания",
"local": "Локально",
"mixed": "Разные состояния",
"repair": "Требуется повторное сопряжение",
"update": "Требуется обновление"
}
},
"taskProviders": {
"errors": {
"jira": {
"apiTokenRequired": "Необходимо указать API-токен.",
"commentBodyRequired": "Необходимо ввести текст комментария.",
"commentFailed": "Не удалось добавить комментарий.",
"connectionFailed": "Не удалось подключиться.",
"createFailed": "Не удалось создать задачу.",
"credentialsRequired": "Необходимо указать URL сайта, адрес электронной почты и API-токен.",
"incompleteIssuePage": "Jira вернула неполную страницу задач.",
"incompleteProjectPage": "Jira вернула неполную страницу проектов.",
"invalidCloudId": "Сайт не вернул корректный идентификатор облака Atlassian.",
"invalidIssuePage": "Jira вернула некорректную страницу задач.",
"invalidProjectPage": "Jira вернула некорректную страницу проектов.",
"invalidSiteIdentity": "Введите URL сайта Jira с протоколом HTTP или HTTPS, не содержащий учётных данных.",
"invalidSiteUrl": "Введите корректный URL сайта Jira.",
"issueKeyRequired": "Необходимо указать ключ задачи.",
"issueSearchLimit": "При поиске задач Jira превышен лимит страниц. Выберите проект с помощью JQL.",
"issueTypeRequired": "Необходимо указать тип задачи.",
"labelsConflict": "Передайте либо labels, либо labelOperations.",
"missingProjectIdentity": "Jira вернула проект без идентификатора или ключа.",
"notConnected": "Нет подключения к Jira.",
"passwordRequired": "Необходимо указать пароль.",
"personalTokenRequired": "Необходимо указать личный токен доступа.",
"projectListLimit": "При загрузке списка проектов Jira превышен лимит страниц. Выберите проект с помощью JQL.",
"projectRequired": "Необходимо указать проект.",
"repeatedIssueToken": "Jira вернула некорректный или повторяющийся токен страницы задач.",
"titleRequired": "Необходимо указать заголовок.",
"updateFailed": "Не удалось обновить задачу.",
"updatesRequired": "Необходимо указать объект updates."
},
"linear": {
"commentFailed": "Не удалось создать комментарий",
"createFailed": "Не удалось создать задачу в Linear",
"createdButUnavailable": "Задача создана, но получить её не удалось",
"noApiKey": "API-ключ не сохранён.",
"notConnected": "Нет подключения к Linear",
"projectCreateFailed": "Не удалось создать проект в Linear",
"projectIdRequired": "Необходимо указать идентификатор проекта",
"projectNameRequired": "Необходимо указать название проекта",
"projectNotFound": "Проект не найден",
"updateFailed": "Не удалось обновить задачу в Linear",
"viewHasNoIssues": "Пользовательское представление не содержит задач",
"viewHasNoProjects": "Пользовательское представление не содержит проектов",
"viewIdRequired": "Необходимо указать идентификатор пользовательского представления",
"workspaceAuthExpired": "Срок действия авторизации в Linear для этого рабочего пространства истёк."
}
},
"jira": {
"connectionFailed": "Не удалось подключиться",
"localTokenStorage": "Ваш токен хранится локально и шифруется, если хранилище локальной среды выполнения поддерживает шифрование.",
"remoteTokenStorage": "Ваш токен отправляется в выбранную удалённую среду выполнения и хранится там с поддерживаемым ею шифрованием."
},
"linear": {
"addAccess": "Подключить Linear",
"apiKeyHint": "Вставьте личный API-ключ рабочего пространства Linear, которое Orca должна использовать. Если это рабочее пространство уже подключено, Orca заменит его сохранённый ключ.",
"commentsLoadFailed": "Не удалось загрузить комментарии.",
"connect": "Подключить",
"connectionFailed": "Не удалось подключиться",
"descriptionUpdateFailed": "Не удалось обновить описание",
"fetchMore": "Загрузить ещё",
"issuesLoadFailed": "Не удалось загрузить задачи Linear.",
"listLabel": "Список Linear",
"localKeyStorage": "Ключи локальной среды выполнения хранятся на этом устройстве с использованием зашифрованного хранилища Electron, если оно доступно.",
"projectIssuesLoadFailed": "Не удалось загрузить задачи проекта.",
"projectLoadFailed": "Не удалось загрузить проект.",
"projectNotFound": "Проект не найден.",
"projectsLoadFailed": "Не удалось загрузить проекты.",
"remoteKeyStorage": "Этот ключ хранится в активной удалённой среде выполнения.",
"titleUpdateFailed": "Не удалось обновить заголовок",
"truncated": {
"issues_one": "Показана {{count}} задача с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"issues_other": "Показано {{count}} задачи с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"projectIssues_one": "Показана {{count}} задача проекта с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"projectIssues_other": "Показано {{count}} задачи проекта с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"projects_one": "Показан {{count}} проект с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"projects_other": "Показано {{count}} проекта с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"viewIssues_one": "Показана {{count}} задача представления с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"viewIssues_other": "Показано {{count}} задачи представления с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"views_one": "Показано {{count}} представление с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"views_other": "Показано {{count}} представления с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"issues_few": "Показаны {{count}} задачи с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"issues_many": "Показано {{count}} задач с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"projectIssues_few": "Показаны {{count}} задачи проекта с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"projectIssues_many": "Показано {{count}} задач проекта с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"projects_few": "Показаны {{count}} проекта с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"projects_many": "Показано {{count}} проектов с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"viewIssues_few": "Показаны {{count}} задачи представления с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"viewIssues_many": "Показано {{count}} задач представления с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"views_few": "Показаны {{count}} представления с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear.",
"views_many": "Показано {{count}} представлений с начала списка. Для полного списка воспользуйтесь поиском или откройте Linear."
},
"updateAccess": "Обновить доступ",
"updateWorkspaceAccess": "Обновить доступ к Linear для {{workspace}}",
"viewContentsLoadFailed": "Не удалось загрузить содержимое представления.",
"viewsLoadFailed": "Не удалось загрузить представления.",
"workspaceApiKeyHint": "Вставьте личный API-ключ для {{workspace}}. Если это рабочее пространство уже подключено, Orca заменит его сохранённый ключ."
}
},
"workspaceOptions": {
"activeFilterCount_one": "{{count}} фильтр",
"activeFilterCount_other": "{{count}} фильтра",
"activeFilterCount_few": "{{count}} фильтра",
"activeFilterCount_many": "{{count}} фильтров"
}
}

Some files were not shown because too many files have changed in this diff Show More