From 39d52f767e4488c127b69f857a5ba23b4e617ef2 Mon Sep 17 00:00:00 2001 From: Douglas Date: Tue, 5 May 2026 13:32:03 +0100 Subject: [PATCH] add i18n translation automation --- .gitignore | 1 + .husky/pre-commit | 2 + package.json | 4 +- scripts/check-i18n-locale-parity.js | 122 ------ scripts/check-i18n-schema.js | 482 ++++++++++++++++++++++++ scripts/lib/i18n-locales.js | 474 +++++++++++++++++++++++ scripts/sync-i18n-translations.js | 474 +++++++++++++++++++++++ src/i18n/locales/ar/chat.json | 4 +- src/i18n/locales/ar/dashboard.json | 4 +- src/i18n/locales/ar/folder.json | 8 + src/i18n/locales/ar/index.ts | 2 + src/i18n/locales/ar/layout.json | 62 ++- src/i18n/locales/ar/setting.json | 186 +-------- src/i18n/locales/ar/triggers.json | 344 ++++++++--------- src/i18n/locales/de/chat.json | 4 +- src/i18n/locales/de/dashboard.json | 4 +- src/i18n/locales/de/folder.json | 8 + src/i18n/locales/de/index.ts | 2 + src/i18n/locales/de/layout.json | 62 ++- src/i18n/locales/de/setting.json | 101 +---- src/i18n/locales/de/triggers.json | 340 ++++++++--------- src/i18n/locales/en-us/chat.json | 4 +- src/i18n/locales/en-us/dashboard.json | 4 +- src/i18n/locales/en-us/folder.json | 8 + src/i18n/locales/en-us/index.ts | 2 + src/i18n/locales/en-us/layout.json | 36 +- src/i18n/locales/en-us/setting.json | 215 +---------- src/i18n/locales/en-us/triggers.json | 2 + src/i18n/locales/es/chat.json | 4 +- src/i18n/locales/es/dashboard.json | 4 +- src/i18n/locales/es/folder.json | 8 + src/i18n/locales/es/index.ts | 2 + src/i18n/locales/es/layout.json | 64 +++- src/i18n/locales/es/setting.json | 105 +----- src/i18n/locales/es/triggers.json | 340 ++++++++--------- src/i18n/locales/fr/chat.json | 4 +- src/i18n/locales/fr/dashboard.json | 4 +- src/i18n/locales/fr/folder.json | 8 + src/i18n/locales/fr/index.ts | 2 + src/i18n/locales/fr/layout.json | 64 +++- src/i18n/locales/fr/setting.json | 209 ++++------ src/i18n/locales/fr/triggers.json | 340 ++++++++--------- src/i18n/locales/it/chat.json | 4 +- src/i18n/locales/it/dashboard.json | 4 +- src/i18n/locales/it/folder.json | 8 + src/i18n/locales/it/index.ts | 2 + src/i18n/locales/it/layout.json | 62 ++- src/i18n/locales/it/setting.json | 97 +---- src/i18n/locales/it/triggers.json | 342 ++++++++--------- src/i18n/locales/ja/chat.json | 4 +- src/i18n/locales/ja/dashboard.json | 4 +- src/i18n/locales/ja/folder.json | 8 + src/i18n/locales/ja/index.ts | 2 + src/i18n/locales/ja/layout.json | 62 ++- src/i18n/locales/ja/setting.json | 100 +---- src/i18n/locales/ja/triggers.json | 166 ++++---- src/i18n/locales/ko/chat.json | 4 +- src/i18n/locales/ko/dashboard.json | 4 +- src/i18n/locales/ko/folder.json | 8 + src/i18n/locales/ko/index.ts | 2 + src/i18n/locales/ko/layout.json | 62 ++- src/i18n/locales/ko/setting.json | 98 +---- src/i18n/locales/ko/triggers.json | 168 +++++---- src/i18n/locales/ru/chat.json | 4 +- src/i18n/locales/ru/dashboard.json | 4 +- src/i18n/locales/ru/folder.json | 8 + src/i18n/locales/ru/index.ts | 2 + src/i18n/locales/ru/layout.json | 102 +++-- src/i18n/locales/ru/setting.json | 95 +---- src/i18n/locales/ru/triggers.json | 338 ++++++++--------- src/i18n/locales/zh-Hans/chat.json | 4 +- src/i18n/locales/zh-Hans/dashboard.json | 4 +- src/i18n/locales/zh-Hans/folder.json | 8 + src/i18n/locales/zh-Hans/index.ts | 2 + src/i18n/locales/zh-Hans/layout.json | 45 ++- src/i18n/locales/zh-Hans/setting.json | 28 +- src/i18n/locales/zh-Hans/triggers.json | 166 ++++---- src/i18n/locales/zh-Hant/chat.json | 4 +- src/i18n/locales/zh-Hant/dashboard.json | 4 +- src/i18n/locales/zh-Hant/folder.json | 8 + src/i18n/locales/zh-Hant/index.ts | 2 + src/i18n/locales/zh-Hant/layout.json | 62 ++- src/i18n/locales/zh-Hant/setting.json | 24 +- src/i18n/locales/zh-Hant/triggers.json | 168 +++++---- 84 files changed, 3784 insertions(+), 2628 deletions(-) delete mode 100644 scripts/check-i18n-locale-parity.js create mode 100644 scripts/check-i18n-schema.js create mode 100644 scripts/lib/i18n-locales.js create mode 100644 scripts/sync-i18n-translations.js create mode 100644 src/i18n/locales/ar/folder.json create mode 100644 src/i18n/locales/de/folder.json create mode 100644 src/i18n/locales/en-us/folder.json create mode 100644 src/i18n/locales/es/folder.json create mode 100644 src/i18n/locales/fr/folder.json create mode 100644 src/i18n/locales/it/folder.json create mode 100644 src/i18n/locales/ja/folder.json create mode 100644 src/i18n/locales/ko/folder.json create mode 100644 src/i18n/locales/ru/folder.json create mode 100644 src/i18n/locales/zh-Hans/folder.json create mode 100644 src/i18n/locales/zh-Hant/folder.json diff --git a/.gitignore b/.gitignore index a77e24f08..8458e67a3 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ yarn.lock /playwright/.cache/ .env +# Never commit API keys (i18n sync, local dev). Use shell exports instead of committing .env.local. .env.local .env.production .env.development diff --git a/.husky/pre-commit b/.husky/pre-commit index 33832262b..8777bd016 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,6 +1,8 @@ #!/usr/bin/env sh npx lint-staged +npm run check:i18n + # Run Python pre-commit checks if backend files are staged if git diff --cached --name-only | grep -q "^backend/"; then echo "Running backend pre-commit checks..." diff --git a/package.json b/package.json index 53d0c2863..436744845 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,9 @@ "test:watch": "vitest", "test:e2e": "vitest run --config vitest.config.ts", "test:coverage": "vitest run --coverage", - "check:i18n": "node scripts/check-i18n-locale-parity.js", + "check:i18n": "node scripts/check-i18n-schema.js", + "check:i18n:strict": "node scripts/check-i18n-schema.js --fail-on-unused --fail-on-untranslated", + "i18n:sync": "node scripts/sync-i18n-translations.js", "check:design-token-usage": "node scripts/check-design-token-usage.mjs", "check:design-tokens": "npm run verify:theme && npm run check:design-token-usage", "verify:theme": "vite-node scripts/verify-theme-tokens.ts", diff --git a/scripts/check-i18n-locale-parity.js b/scripts/check-i18n-locale-parity.js deleted file mode 100644 index b0e85e8b4..000000000 --- a/scripts/check-i18n-locale-parity.js +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env node -// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. ========= -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. ========= - -/* global console, process */ - -/** - * Ensures every locale has the same JSON keys as `en-us` for every namespace JSON under `src/i18n/locales//`. - * Run from repo root: `node scripts/check-i18n-locale-parity.js` - */ - -import fs from 'fs'; -import path from 'path'; -import { fileURLToPath } from 'url'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); -const projectRoot = path.resolve(__dirname, '..'); -const localesDir = path.join(projectRoot, 'src', 'i18n', 'locales'); -const referenceLocale = 'en-us'; - -function collectJsonFiles(dir) { - const out = []; - const entries = fs.readdirSync(dir, { withFileTypes: true }); - for (const e of entries) { - const full = path.join(dir, e.name); - if (e.isDirectory()) { - out.push(...collectJsonFiles(full)); - } else if (e.isFile() && e.name.endsWith('.json')) { - out.push(full); - } - } - return out; -} - -function flattenKeys(obj, prefix = '') { - const keys = []; - for (const [k, v] of Object.entries(obj)) { - const p = prefix ? `${prefix}.${k}` : k; - if (v !== null && typeof v === 'object' && !Array.isArray(v)) { - keys.push(...flattenKeys(v, p)); - } else { - keys.push(p); - } - } - return keys; -} - -function main() { - const refPath = path.join(localesDir, referenceLocale); - if (!fs.existsSync(refPath)) { - console.error(`Reference locale not found: ${refPath}`); - process.exit(1); - } - - const refFiles = collectJsonFiles(refPath); - const refRelative = refFiles.map((f) => path.relative(refPath, f)); - - const localeDirs = fs - .readdirSync(localesDir, { withFileTypes: true }) - .filter((d) => d.isDirectory()) - .map((d) => d.name) - .filter((name) => name !== referenceLocale); - - let failed = false; - - for (const locale of localeDirs) { - const locPath = path.join(localesDir, locale); - for (const rel of refRelative) { - const refFile = path.join(refPath, rel); - const targetFile = path.join(locPath, rel); - if (!fs.existsSync(targetFile)) { - console.error(`Missing file [${locale}]: ${rel}`); - failed = true; - continue; - } - let refJson; - let tgtJson; - try { - refJson = JSON.parse(fs.readFileSync(refFile, 'utf8')); - tgtJson = JSON.parse(fs.readFileSync(targetFile, 'utf8')); - } catch (e) { - console.error(`Invalid JSON (${locale}/${rel}):`, e.message); - failed = true; - continue; - } - const refKeys = new Set(flattenKeys(refJson)); - const tgtKeys = new Set(flattenKeys(tgtJson)); - for (const k of refKeys) { - if (!tgtKeys.has(k)) { - console.error(`Missing key [${locale}] ${rel}: ${k}`); - failed = true; - } - } - for (const k of tgtKeys) { - if (!refKeys.has(k)) { - console.error(`Extra key [${locale}] ${rel}: ${k}`); - failed = true; - } - } - } - } - - if (failed) { - console.error('\ncheck-i18n-locale-parity: FAILED'); - process.exit(1); - } - console.log('check-i18n-locale-parity: OK'); -} - -main(); diff --git a/scripts/check-i18n-schema.js b/scripts/check-i18n-schema.js new file mode 100644 index 000000000..b40b9e3e9 --- /dev/null +++ b/scripts/check-i18n-schema.js @@ -0,0 +1,482 @@ +#!/usr/bin/env node +// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. ========= +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. ========= + +/* global console, process */ + +/** + * Validates i18n: code keys vs English JSON, duplicate JSON keys / values, cross-locale key parity, + * placeholder parity vs en-us, stale-English detection, unused keys, optional JSX raw-text scan. + * Run from repo root: `node scripts/check-i18n-schema.js` or `npm run check:i18n`. + * + * Flags: + * --strict-dynamic treat non-literal t() / i18n.t() first args as errors + * --fail-on-unused unused English keys fail the run (default: warn) + * --fail-on-untranslated non-en strings identical to English fail (default: warn for long English-like copy) + * --check-jsx-text flag JSX text nodes that look like user-visible copy + * --apply-prune --yes remove unused keys from all locale JSON (destructive) + * --fail-on-untranslated non-English locale strings identical to English fail the run (default: warn) + */ + +import fs from 'fs'; +import path from 'path'; +import ts from 'typescript'; +import { fileURLToPath } from 'url'; +import { + REFERENCE_LOCALE_DIR, + checkLocaleParity, + collectJsonFiles, + compareNonEnLocalesToEnglish, + findDuplicateKeysInJson, + flattenMergedTranslation, + getLocalesDir, + listLocaleFolders, + loadEnUsFlat, + pruneKeysInLocale, +} from './lib/i18n-locales.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const projectRoot = path.resolve(__dirname, '..'); + +/** @typedef {{ file: string, line: number, col: number, detail: string }} ScanHit */ + +/** + * @param {string} dir + * @returns {string[]} + */ +function collectTsSources(dir) { + /** @type {string[]} */ + const out = []; + function walk(d) { + const entries = fs.readdirSync(d, { withFileTypes: true }); + for (const e of entries) { + const full = path.join(d, e.name); + if (e.isDirectory()) { + if ( + e.name === 'node_modules' || + e.name === 'dist' || + e.name === 'dist-electron' + ) + continue; + walk(full); + } else if ( + (e.name.endsWith('.tsx') || e.name.endsWith('.ts')) && + !e.name.endsWith('.d.ts') + ) { + out.push(full); + } + } + } + walk(dir); + return out; +} + +/** + * @param {ts.SourceFile} sf + * @param {number} pos + */ +function lineColInFile(sf, pos) { + const lc = sf.getLineAndCharacterOfPosition(pos); + return { line: lc.line + 1, col: lc.character + 1 }; +} + +function getJsxAttrName(attr) { + if (ts.isIdentifier(attr.name)) return attr.name.text; + if (ts.isJsxNamespacedName(attr.name)) { + return `${attr.name.namespace.text}:${attr.name.name.text}`; + } + return ''; +} + +function jsxAttrStringValue(init) { + if (!init) return null; + if (ts.isStringLiteral(init) || ts.isNoSubstitutionTemplateLiteral(init)) + return init.text; + if (ts.isJsxExpression(init) && init.expression) { + const ex = init.expression; + if (ts.isStringLiteral(ex) || ts.isNoSubstitutionTemplateLiteral(ex)) + return ex.text; + } + return null; +} + +function hasI18nIgnoreComment(sf, pos) { + const fullStart = pos; + const text = sf.getFullText(); + const ranges = ts.getLeadingCommentRanges(text, fullStart); + if (!ranges) return false; + for (const r of ranges) { + const c = text.slice(r.pos, r.end); + if (c.includes('i18n-ignore')) return true; + } + return false; +} + +/** + * @param {ts.Node} call + * @returns {boolean} + */ +function isTranslationCall(call) { + if (!ts.isCallExpression(call)) return false; + const callee = call.expression; + if (ts.isIdentifier(callee) && callee.text === 't') return true; + if (ts.isPropertyAccessExpression(callee) && ts.isIdentifier(callee.name)) { + return callee.name.text === 't'; + } + return false; +} + +function firstArgStringOrDynamic(arg) { + if (!arg) return { kind: 'none' }; + if (ts.isStringLiteral(arg) || ts.isNoSubstitutionTemplateLiteral(arg)) { + return { kind: 'static', value: arg.text }; + } + if (ts.isTemplateLiteral(arg)) { + if (arg.templateSpans.length === 0) { + return { kind: 'static', value: arg.head.text }; // shouldn't happen + } + return { kind: 'dynamic' }; + } + return { kind: 'dynamic' }; +} + +function objectHasDefaultValue(arg) { + if (!arg || !ts.isObjectLiteralExpression(arg)) return false; + for (const prop of arg.properties) { + if (!ts.isPropertyAssignment(prop)) continue; + if (!ts.isIdentifier(prop.name)) continue; + if (prop.name.text === 'defaultValue') return true; + } + return false; +} + +/** + * @param {string} filePath + * @param {ts.SourceFile} sf + * @param {Set} usedKeys + * @param {ScanHit[]} dynamicHits + * @param {ScanHit[]} defaultValueWarns + * @param {ScanHit[]} jsxTextHits + * @param {boolean} checkJsxText + */ +function scanSourceFile( + filePath, + sf, + usedKeys, + dynamicHits, + defaultValueWarns, + jsxTextHits, + checkJsxText +) { + function visit(node) { + if (checkJsxText) { + if ( + ts.isJsxText(node) && + node.getFullText().trim().length > 0 && + looksLikeUserVisibleText(node.getText()) + ) { + const lc = lineColInFile(sf, node.getStart()); + let ignored = hasI18nIgnoreComment(sf, node.getFullStart()); + if (!ignored) { + let parent = node.parent; + while ( + parent && + !ts.isJsxElement(parent) && + !ts.isJsxFragment(parent) + ) { + parent = parent.parent; + } + if (parent && ts.isJsxElement(parent)) { + ignored = hasI18nIgnoreComment( + sf, + parent.openingElement.getFullStart() + ); + } + } + if (!ignored) { + jsxTextHits.push({ + file: filePath, + line: lc.line, + col: lc.col, + detail: `JSX text (wrap with t() or Trans): ${JSON.stringify(node.getText().trim().slice(0, 80))}`, + }); + } + } + } + + if (isTranslationCall(node)) { + const arg0 = node.arguments[0]; + const res = firstArgStringOrDynamic(arg0); + const lc = lineColInFile(sf, node.getStart()); + if (res.kind === 'static' && res.value) { + usedKeys.add(res.value); + const arg1 = node.arguments[1]; + if (objectHasDefaultValue(arg1)) { + defaultValueWarns.push({ + file: filePath, + line: lc.line, + col: lc.col, + detail: `t('${keySnippet(res.value)}') uses defaultValue — prefer defining the key in en-us JSON`, + }); + } + } else if (res.kind === 'dynamic' || res.kind === 'none') { + dynamicHits.push({ + file: filePath, + line: lc.line, + col: lc.col, + detail: 'non-literal translation key (cannot verify against schema)', + }); + } + } + + if (ts.isJsxOpeningElement(node) || ts.isJsxSelfClosingElement(node)) { + const tag = node.tagName; + if (ts.isIdentifier(tag) && tag.text === 'Trans') { + const attrs = node.attributes; + for (const prop of attrs.properties) { + if (!ts.isJsxAttribute(prop)) continue; + if (getJsxAttrName(prop) !== 'i18nKey') continue; + const v = jsxAttrStringValue(prop.initializer); + const lc = lineColInFile(sf, prop.getStart()); + if (v) usedKeys.add(v); + else { + dynamicHits.push({ + file: filePath, + line: lc.line, + col: lc.col, + detail: 'Trans i18nKey is not a string literal', + }); + } + } + } + } + + ts.forEachChild(node, visit); + } + visit(sf); +} + +function keySnippet(k) { + return k.length > 60 ? `${k.slice(0, 57)}…` : k; +} + +function looksLikeUserVisibleText(s) { + const t = s.trim(); + if (t.length < 3) return false; + if (/^https?:\/\//i.test(t)) return false; + if (/^\d+([.,:]\d+)?$/.test(t)) return false; + if (/^[\d\s./|:\\\-–—:]+$/.test(t)) return false; + return /[a-zA-Z]{3,}/.test(t); +} + +function parseArgs(argv) { + return { + strictDynamic: argv.includes('--strict-dynamic'), + failOnUnused: argv.includes('--fail-on-unused'), + failOnUntranslated: argv.includes('--fail-on-untranslated'), + checkJsxText: argv.includes('--check-jsx-text'), + applyPrune: argv.includes('--apply-prune'), + yes: argv.includes('--yes'), + help: argv.includes('--help') || argv.includes('-h'), + }; +} + +function printHelp() { + console.log(`check-i18n-schema.js — verify i18n keys, locale parity, JSON hygiene + +Usage: + node scripts/check-i18n-schema.js [options] + +Options: + --strict-dynamic error on non-literal t() / i18n.t() keys + --fail-on-unused fail when English has keys not referenced in src/ + --fail-on-untranslated fail when a non-en value is still identical to English (long strings) + --check-jsx-text warn on raw JSX text that looks user-visible (use // i18n-ignore to suppress) + --apply-prune with --yes, delete unused keys from all locale *.json files + --yes confirm destructive prune + -h, --help +`); +} + +function main() { + const opts = parseArgs(process.argv.slice(2)); + if (opts.help) { + printHelp(); + process.exit(0); + } + + let failed = false; + let warned = false; + + const { merged, errors } = loadEnUsFlat(projectRoot); + if (errors.length) { + for (const e of errors) console.error(e); + process.exit(1); + } + + const localesDir = getLocalesDir(projectRoot); + const enPath = path.join(localesDir, REFERENCE_LOCALE_DIR); + + for (const rel of collectJsonFiles(enPath)) { + const raw = fs.readFileSync(rel, 'utf8'); + const dupList = findDuplicateKeysInJson(raw); + if (dupList.length) { + failed = true; + const fileRel = path.relative(enPath, rel); + for (const d of dupList) { + console.error( + `Duplicate key in en-us/${fileRel} line ${d.line}: "${d.key}"` + ); + } + } + } + + const flatEn = flattenMergedTranslation(merged); + const valueToKeys = new Map(); + for (const [k, v] of flatEn) { + if (typeof v !== 'string') continue; + const list = valueToKeys.get(v) ?? []; + list.push(k); + valueToKeys.set(v, list); + } + for (const [, keys] of valueToKeys) { + if (keys.length > 1) { + console.warn(`[duplicate English value] ${keys.join(' | ')}`); + } + } + + const srcRoot = path.join(projectRoot, 'src'); + const sources = collectTsSources(srcRoot); + /** @type {Set} */ + const usedKeys = new Set(); + /** @type {ScanHit[]} */ + const dynamicHits = []; + /** @type {ScanHit[]} */ + const defaultValueWarns = []; + /** @type {ScanHit[]} */ + const jsxTextHits = []; + + for (const filePath of sources) { + const text = fs.readFileSync(filePath, 'utf8'); + const sf = ts.createSourceFile( + filePath, + text, + ts.ScriptTarget.Latest, + true, + filePath.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS + ); + scanSourceFile( + path.relative(projectRoot, filePath), + sf, + usedKeys, + dynamicHits, + defaultValueWarns, + jsxTextHits, + opts.checkJsxText + ); + } + + for (const h of defaultValueWarns) { + console.warn(`[defaultValue] ${h.file}:${h.line}:${h.col} ${h.detail}`); + warned = true; + } + + for (const h of dynamicHits) { + const msg = `[dynamic key] ${h.file}:${h.line}:${h.col} ${h.detail}`; + if (opts.strictDynamic) { + console.error(msg); + failed = true; + } else { + console.warn(msg); + warned = true; + } + } + + for (const h of jsxTextHits) { + console.warn(`[jsx text] ${h.file}:${h.line}:${h.col} ${h.detail}`); + warned = true; + } + + for (const key of usedKeys) { + if (!flatEn.has(key)) { + console.error(`Missing key in en-us JSON (referenced in code): ${key}`); + failed = true; + } + } + + /** @type {Set} */ + const unused = new Set(); + for (const key of flatEn.keys()) { + if (!usedKeys.has(key)) unused.add(key); + } + for (const u of [...unused].sort()) { + const line = opts.failOnUnused ? console.error : console.warn; + line(`[unused key] ${u}`); + if (opts.failOnUnused) failed = true; + else warned = true; + } + + const parity = checkLocaleParity(projectRoot); + if (!parity.ok) { + failed = true; + for (const m of parity.messages) console.error(m); + } + + const { placeholderMismatches, untranslatedCopies } = + compareNonEnLocalesToEnglish(projectRoot); + for (const line of placeholderMismatches) { + console.error(`[schema placeholder mismatch] ${line}`); + failed = true; + } + for (const line of untranslatedCopies) { + if (opts.failOnUntranslated) { + console.error(`[untranslated] ${line}`); + failed = true; + } else { + console.warn(`[untranslated] ${line}`); + warned = true; + } + } + + if (opts.applyPrune) { + if (!opts.yes) { + console.error( + '--apply-prune requires --yes (destructive: removes keys from all locales)' + ); + failed = true; + } else if (!failed && unused.size > 0) { + const folders = [REFERENCE_LOCALE_DIR, ...listLocaleFolders(projectRoot)]; + for (const loc of folders) { + const lp = path.join(localesDir, loc); + pruneKeysInLocale(lp, unused, null, false); + console.log(`Pruned unused keys in ${loc}`); + } + } else if (unused.size === 0) { + console.log('No unused keys to prune.'); + } + } + + if (failed) { + console.error('\ncheck-i18n-schema: FAILED'); + process.exit(1); + } + if (warned) { + console.log('check-i18n-schema: OK (with warnings)'); + process.exit(0); + } + console.log('check-i18n-schema: OK'); +} + +main(); diff --git a/scripts/lib/i18n-locales.js b/scripts/lib/i18n-locales.js new file mode 100644 index 000000000..1f15007ff --- /dev/null +++ b/scripts/lib/i18n-locales.js @@ -0,0 +1,474 @@ +// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. ========= +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. ========= + +/** + * Shared helpers for i18n locale JSON under `src/i18n/locales/`. + * Mirrors merge order in each locale's `index.ts` (e.g. en-us/index.ts). + */ + +import fs from 'fs'; +import path from 'path'; + +/** Same order and set as `src/i18n/locales/en-us/index.ts` default export keys. */ +export const EN_US_NAMESPACE_ORDER = [ + 'agents', + 'layout', + 'dashboard', + 'folder', + 'workforce', + 'chat', + 'setting', + 'update', + 'triggers', +]; + +export const REFERENCE_LOCALE_DIR = 'en-us'; + +export function getLocalesDir(projectRoot) { + return path.join(projectRoot, 'src', 'i18n', 'locales'); +} + +export function collectJsonFiles(dir) { + if (!fs.existsSync(dir)) return []; + const out = []; + const entries = fs.readdirSync(dir, { withFileTypes: true }); + for (const e of entries) { + const full = path.join(dir, e.name); + if (e.isDirectory()) { + out.push(...collectJsonFiles(full)); + } else if (e.isFile() && e.name.endsWith('.json')) { + out.push(full); + } + } + return out; +} + +export function flattenLeaves(obj, prefix = '') { + /** @type {string[]} */ + const keys = []; + for (const [k, v] of Object.entries(obj)) { + const p = prefix ? `${prefix}.${k}` : k; + if (v !== null && typeof v === 'object' && !Array.isArray(v)) { + keys.push(...flattenLeaves(v, p)); + } else { + keys.push(p); + } + } + return keys; +} + +/** + * @param {Record} merged - e.g. { layout: {...}, chat: {...} } + * @returns {Map} dotted keys like `layout.foo` -> leaf value + */ +export function flattenMergedTranslation(merged) { + /** @type {Map} */ + const map = new Map(); + for (const ns of Object.keys(merged)) { + const block = merged[ns]; + if (block === null || typeof block !== 'object' || Array.isArray(block)) + continue; + const inner = flattenLeaves(/** @type {Record} */ (block)); + for (const k of inner) { + map.set( + `${ns}.${k}`, + getLeaf(/** @type {Record} */ (block), k.split('.')) + ); + } + } + return map; +} + +function getLeaf(obj, parts) { + let cur = obj; + for (const p of parts) { + if (cur == null || typeof cur !== 'object') return undefined; + cur = /** @type {Record} */ (cur)[p]; + } + return cur; +} + +/** + * Load namespace JSON files for a locale directory (not using index.ts). + * @param {string} localePath absolute path to `locales//` + */ +export function loadLocaleNamespaces(localePath) { + /** @type {Record>} */ + const merged = {}; + for (const ns of EN_US_NAMESPACE_ORDER) { + const fp = path.join(localePath, `${ns}.json`); + if (!fs.existsSync(fp)) { + merged[ns] = {}; + continue; + } + const text = fs.readFileSync(fp, 'utf8'); + merged[ns] = JSON.parse(text); + } + return merged; +} + +/** + * i18next-style placeholders: `{{name}}`, `{{ count }}`. + * @param {string} s + * @returns {Set} normalized placeholder names (trimmed) + */ +export function extractI18nPlaceholders(s) { + const set = new Set(); + if (typeof s !== 'string') return set; + const re = /\{\{\s*([^}]+?)\s*\}\}/g; + let m; + while ((m = re.exec(s))) { + set.add(m[1].trim()); + } + return set; +} + +function placeholderSetsEqual(a, b) { + if (a.size !== b.size) return false; + for (const x of a) { + if (!b.has(x)) return false; + } + return true; +} + +/** + * Longer English-looking strings that are still byte-identical to en-us in another locale are likely not translated yet. + * @param {string} enVal + */ +export function isLikelyUntranslatedEnglishCopy(enVal) { + if (enVal.length < 12) return false; + if (!/[a-zA-Z]{4,}/.test(enVal)) return false; + return true; +} + +/** + * Per-key placeholder parity with en-us; optional detection of copy-paste English in non-reference locales. + * @param {string} projectRoot + * @returns {{ placeholderMismatches: string[], untranslatedCopies: string[] }} + */ +export function compareNonEnLocalesToEnglish(projectRoot) { + const localesDir = getLocalesDir(projectRoot); + const { merged: enMerged, errors } = loadEnUsFlat(projectRoot); + /** @type {string[]} */ + const placeholderMismatches = []; + /** @type {string[]} */ + const untranslatedCopies = []; + + if (errors.length) { + return { placeholderMismatches: errors, untranslatedCopies: [] }; + } + + const flatEn = flattenMergedTranslation(enMerged); + + for (const loc of listLocaleFolders(projectRoot)) { + const merged = loadLocaleNamespaces(path.join(localesDir, loc)); + const flatLoc = flattenMergedTranslation(merged); + for (const [key, enVal] of flatEn) { + if (typeof enVal !== 'string') continue; + const locVal = flatLoc.get(key); + if (typeof locVal !== 'string') continue; + + const enPh = extractI18nPlaceholders(enVal); + const locPh = extractI18nPlaceholders(locVal); + if (!placeholderSetsEqual(enPh, locPh)) { + const enStr = [...enPh].sort().join(', ') || '(none)'; + const loStr = [...locPh].sort().join(', ') || '(none)'; + placeholderMismatches.push( + `[${loc}] ${key}: placeholders [${loStr}] do not match en-us [${enStr}]` + ); + } + + if (locVal === enVal && isLikelyUntranslatedEnglishCopy(enVal)) { + untranslatedCopies.push( + `[${loc}] ${key}: string still identical to English (untranslated)` + ); + } + } + } + + return { placeholderMismatches, untranslatedCopies }; +} + +/** + * Detect duplicate keys inside a single JSON object (same nesting level). + * `JSON.parse` would silently keep the last value — this surfaces mistakes. + * @returns {{ line: number, key: string }[]} diagnostics (line is 1-based, best-effort) + */ +export function findDuplicateKeysInJson(text) { + /** @type {{ line: number, key: string }[]} */ + const dups = []; + let i = 0; + const lineOf = (idx) => { + let line = 1; + for (let j = 0; j < idx && j < text.length; j++) { + if (text[j] === '\n') line++; + } + return line; + }; + const skipWs = () => { + while (i < text.length && /\s/.test(text[i])) i++; + }; + /** @returns {string|null} decoded string, or null */ + const parseJsonStringToken = () => { + if (text[i] !== '"') return null; + const start = i; + i++; + while (i < text.length) { + const c = text[i]; + if (c === '\\') { + i += 2; + continue; + } + if (c === '"') { + i++; + try { + return JSON.parse(text.slice(start, i)); + } catch { + return null; + } + } + i++; + } + return null; + }; + const walkValue = () => { + skipWs(); + if (i >= text.length) return; + const c = text[i]; + if (c === '{') { + walkObject(); + return; + } + if (c === '[') { + walkArray(); + return; + } + if (c === '"') { + parseJsonStringToken(); + return; + } + if ( + c === 't' || + c === 'f' || + c === 'n' || + c === '-' || + (c >= '0' && c <= '9') + ) { + while (i < text.length && !',]}'.includes(text[i])) i++; + return; + } + i++; + }; + const walkArray = () => { + if (text[i] !== '[') return; + i++; + while (true) { + skipWs(); + if (i < text.length && text[i] === ']') { + i++; + return; + } + walkValue(); + skipWs(); + if (i < text.length && text[i] === ',') { + i++; + continue; + } + if (i < text.length && text[i] === ']') { + i++; + return; + } + break; + } + }; + const walkObject = () => { + if (text[i] !== '{') return; + i++; + /** @type {Map} */ + const seen = new Map(); + while (true) { + skipWs(); + if (i < text.length && text[i] === '}') { + i++; + return; + } + if (text[i] !== '"') return; + const keyStart = i; + const key = parseJsonStringToken(); + if (key === null) return; + const line = lineOf(keyStart); + if (seen.has(key)) { + dups.push({ line, key }); + } else { + seen.set(key, line); + } + skipWs(); + if (i >= text.length || text[i] !== ':') return; + i++; + walkValue(); + skipWs(); + if (i < text.length && text[i] === ',') { + i++; + continue; + } + if (i < text.length && text[i] === '}') { + i++; + return; + } + return; + } + }; + skipWs(); + if (i < text.length && text[i] === '{') { + walkObject(); + } + return dups; +} + +/** + * @param {string} projectRoot + * @returns {{ errors: string[], merged: Record> }} + */ +export function loadEnUsFlat(projectRoot) { + const localesDir = getLocalesDir(projectRoot); + const enPath = path.join(localesDir, REFERENCE_LOCALE_DIR); + const errors = []; + if (!fs.existsSync(enPath)) { + errors.push(`Reference locale not found: ${enPath}`); + return { errors, merged: {} }; + } + const merged = loadLocaleNamespaces(enPath); + return { errors: errors.length ? errors : [], merged }; +} + +/** + * @returns {{ ok: boolean, messages: string[] }} + */ +export function checkLocaleParity(projectRoot) { + const localesDir = getLocalesDir(projectRoot); + const refPath = path.join(localesDir, REFERENCE_LOCALE_DIR); + /** @type {string[]} */ + const messages = []; + if (!fs.existsSync(refPath)) { + return { ok: false, messages: [`Reference locale not found: ${refPath}`] }; + } + + const refFiles = collectJsonFiles(refPath); + const refRelative = refFiles.map((f) => path.relative(refPath, f)); + + const localeDirs = fs + .readdirSync(localesDir, { withFileTypes: true }) + .filter((d) => d.isDirectory()) + .map((d) => d.name) + .filter((name) => name !== REFERENCE_LOCALE_DIR); + + let ok = true; + for (const locale of localeDirs) { + const locPath = path.join(localesDir, locale); + for (const rel of refRelative) { + const refFile = path.join(refPath, rel); + const targetFile = path.join(locPath, rel); + if (!fs.existsSync(targetFile)) { + messages.push(`Missing file [${locale}]: ${rel}`); + ok = false; + continue; + } + let refJson; + let tgtJson; + try { + refJson = JSON.parse(fs.readFileSync(refFile, 'utf8')); + tgtJson = JSON.parse(fs.readFileSync(targetFile, 'utf8')); + } catch (e) { + messages.push( + `Invalid JSON (${locale}/${rel}): ${/** @type {Error} */ (e).message}` + ); + ok = false; + continue; + } + const refKeys = new Set(flattenLeaves(refJson)); + const tgtKeys = new Set(flattenLeaves(tgtJson)); + for (const k of refKeys) { + if (!tgtKeys.has(k)) { + messages.push(`Missing key [${locale}] ${rel}: ${k}`); + ok = false; + } + } + for (const k of tgtKeys) { + if (!refKeys.has(k)) { + messages.push(`Extra key [${locale}] ${rel}: ${k}`); + ok = false; + } + } + } + } + return { ok, messages }; +} + +/** + * Remove dotted keys `ns.leaf` from namespace JSON objects; writes pretty JSON. + * @param {string} localePath + * @param {Set} fullKeysToRemove dotted `namespace.rest` + * @param {Set|null} namespacesFilter + */ +export function pruneKeysInLocale( + localePath, + fullKeysToRemove, + namespacesFilter = null, + dryRun = true +) { + /** @type {string[]} */ + const changed = []; + for (const ns of EN_US_NAMESPACE_ORDER) { + if (namespacesFilter && !namespacesFilter.has(ns)) continue; + const toStrip = [...fullKeysToRemove].filter((fk) => + fk.startsWith(`${ns}.`) + ); + if (toStrip.length === 0) continue; + const fp = path.join(localePath, `${ns}.json`); + if (!fs.existsSync(fp)) continue; + const obj = JSON.parse(fs.readFileSync(fp, 'utf8')); + for (const fk of toStrip) { + const rest = fk.slice(ns.length + 1); + if (!rest) continue; + deleteNestedKey(obj, rest.split('.')); + } + if (!dryRun) { + fs.writeFileSync(fp, `${JSON.stringify(obj, null, 2)}\n`, 'utf8'); + } + changed.push(ns); + } + return changed; +} + +function deleteNestedKey(obj, parts) { + if (parts.length === 0) return; + const [head, ...tail] = parts; + if (tail.length === 0) { + delete obj[head]; + return; + } + const next = obj[head]; + if (next && typeof next === 'object' && !Array.isArray(next)) { + deleteNestedKey(/** @type {Record} */ (next), tail); + } +} + +export function listLocaleFolders(projectRoot) { + const localesDir = getLocalesDir(projectRoot); + return fs + .readdirSync(localesDir, { withFileTypes: true }) + .filter((d) => d.isDirectory()) + .map((d) => d.name) + .filter((name) => name !== REFERENCE_LOCALE_DIR); +} diff --git a/scripts/sync-i18n-translations.js b/scripts/sync-i18n-translations.js new file mode 100644 index 000000000..f19e77c02 --- /dev/null +++ b/scripts/sync-i18n-translations.js @@ -0,0 +1,474 @@ +#!/usr/bin/env node +// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. ========= +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. ========= + +/* global console, process, fetch, setTimeout */ + +/** + * Sync non-English locale JSON to match English (en-us) keys. + * + * Loads **`.env`** then **`.env.local`** from the repo root when present (only fills vars that are + * not already set in the environment, so shell `export …` still wins). **Never commit** secrets; + * `.env.local` is gitignored. + * + * **AiHubMix** (OpenAI-compatible): set `AIHUBMIX_API_KEY` + `AIHUBMIX_BASE_URL` in `.env.local` or export them. + * + * ```bash + * # .env.local (example) + * AIHUBMIX_API_KEY=... + * AIHUBMIX_BASE_URL=https://aihubmix.com/v1 + * OPENAI_MODEL=gpt-4o-mini + * + * npm run i18n:sync -- --write --locales=ja + * ``` + * + * Usage: + * node scripts/sync-i18n-translations.js --dry-run + * node scripts/sync-i18n-translations.js --write --locales=ja,de + * node scripts/sync-i18n-translations.js --write --fill-missing-from-en + * node scripts/sync-i18n-translations.js --write --translate-stale-english --locales=zh-Hant --namespaces=triggers + * + * Env (optional defaults): `OPENAI_BASE_URL` or `AIHUBMIX_BASE_URL` (default https://api.openai.com/v1); `OPENAI_MODEL` (default gpt-4o-mini). Key: `OPENAI_API_KEY` or `AIHUBMIX_API_KEY`. + */ + +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import { + EN_US_NAMESPACE_ORDER, + flattenLeaves, + getLocalesDir, + isLikelyUntranslatedEnglishCopy, + listLocaleFolders, + loadEnUsFlat, + loadLocaleNamespaces, +} from './lib/i18n-locales.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const projectRoot = path.resolve(__dirname, '..'); + +/** + * Merge `.env` then `.env.local` (later file overrides for duplicate keys). Assign only when + * `process.env[key]` is unset so the shell always wins. + * @param {string} root + */ +function applyLocalEnvFiles(root) { + /** @param {string} fp */ + function parseFile(fp) { + if (!fs.existsSync(fp)) return {}; + /** @type {Record} */ + const out = {}; + const text = fs.readFileSync(fp, 'utf8'); + for (const line of text.split('\n')) { + const t = line.trim(); + if (!t || t.startsWith('#')) continue; + const eq = t.indexOf('='); + if (eq <= 0) continue; + const key = t.slice(0, eq).trim(); + if (!key) continue; + let val = t.slice(eq + 1).trim(); + if ( + (val.startsWith('"') && val.endsWith('"')) || + (val.startsWith("'") && val.endsWith("'")) + ) { + val = val.slice(1, -1); + } + out[key] = val; + } + return out; + } + const merged = { + ...parseFile(path.join(root, '.env')), + ...parseFile(path.join(root, '.env.local')), + }; + for (const [k, v] of Object.entries(merged)) { + if (process.env[k] === undefined) { + process.env[k] = v; + } + } +} + +/** OpenAI-compatible API (OpenAI or AiHubMix). Key from env / .env.local (see applyLocalEnvFiles). */ +function translationApiKey() { + return process.env.OPENAI_API_KEY || process.env.AIHUBMIX_API_KEY || ''; +} + +function translationApiBaseUrl() { + const raw = + process.env.OPENAI_BASE_URL || + process.env.AIHUBMIX_BASE_URL || + 'https://api.openai.com/v1'; + return raw.replace(/\/$/, ''); +} + +const LOCALE_LABEL = { + ar: 'Arabic', + de: 'German', + es: 'Spanish', + fr: 'French', + it: 'Italian', + ja: 'Japanese', + ko: 'Korean', + ru: 'Russian', + 'zh-Hans': 'Simplified Chinese', + 'zh-Hant': 'Traditional Chinese', +}; + +function parseArgs(argv) { + /** @type {Record} */ + const o = { + dryRun: argv.includes('--dry-run'), + write: argv.includes('--write'), + retranslate: argv.includes('--retranslate'), + fillMissingFromEn: argv.includes('--fill-missing-from-en'), + translateStaleEnglish: argv.includes('--translate-stale-english'), + help: argv.includes('--help') || argv.includes('-h'), + }; + for (const a of argv) { + if (a.startsWith('--locales=')) o.locales = a.slice('--locales='.length); + if (a.startsWith('--namespaces=')) + o.namespaces = a.slice('--namespaces='.length); + } + return o; +} + +function printHelp() { + console.log(`sync-i18n-translations.js — align locale JSON with en-us + +Options: + --dry-run show planned work (no API, no writes) + --write write locale JSON files + --locales=ja,de comma-separated folders under src/i18n/locales/ + --namespaces=layout,chat limit to these namespaces + --fill-missing-from-en copy English text for keys missing in target (no OpenAI) + --translate-stale-english re-translate keys whose value still matches English (same heuristic as check:i18n [untranslated]) + --retranslate replace all string values using OpenAI from English (destructive) + -h, --help + +API: use OPENAI_API_KEY or AIHUBMIX_API_KEY plus optional *_BASE_URL in repo root .env / .env.local (gitignored), or export in the shell (exports win). Or --fill-missing-from-en (no API). +`); +} + +function setDeep(obj, dotted, value) { + const parts = dotted.split('.'); + let cur = obj; + for (let i = 0; i < parts.length - 1; i++) { + const p = parts[i]; + if (cur[p] == null || typeof cur[p] !== 'object' || Array.isArray(cur[p])) { + cur[p] = {}; + } + cur = cur[p]; + } + cur[parts[parts.length - 1]] = value; +} + +function getLeaf(obj, parts) { + let cur = obj; + for (const p of parts) { + if (cur == null || typeof cur !== 'object') return undefined; + cur = cur[p]; + } + return cur; +} + +function deleteMissingLeavesSync(targetObj, refObj) { + const refKeys = new Set(flattenLeaves(refObj)); + const tgtKeys = [...flattenLeaves(targetObj)]; + for (const k of tgtKeys) { + if (!refKeys.has(k)) { + const parts = k.split('.'); + let cur = targetObj; + for (let i = 0; i < parts.length - 1; i++) { + cur = cur?.[parts[i]]; + } + if (cur && typeof cur === 'object') delete cur[parts[parts.length - 1]]; + } + } +} + +function stripEmptyContainers(obj) { + if (obj === null || typeof obj !== 'object' || Array.isArray(obj)) return; + for (const k of Object.keys(obj)) { + stripEmptyContainers(obj[k]); + const v = obj[k]; + if ( + v && + typeof v === 'object' && + !Array.isArray(v) && + Object.keys(v).length === 0 + ) { + delete obj[k]; + } + } +} + +async function translateBatch(strings, targetLangName) { + const apiKey = translationApiKey(); + const base = translationApiBaseUrl(); + const model = process.env.OPENAI_MODEL || 'gpt-4o-mini'; + const payload = { + model, + messages: [ + { + role: 'system', + content: `You are a professional UI translator. Translate JSON values from English to ${targetLangName}. Preserve placeholders exactly: {{name}}, {{count}}, and similar. Return only valid JSON: one object with the same keys as input and translated string values.`, + }, + { + role: 'user', + content: JSON.stringify(strings, null, 2), + }, + ], + temperature: 0.3, + }; + const res = await fetch(`${base}/chat/completions`, { + method: 'POST', + headers: { + Authorization: `Bearer ${apiKey}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), + }); + if (!res.ok) { + const t = await res.text(); + throw new Error(`OpenAI error ${res.status}: ${t}`); + } + const data = await res.json(); + let raw = data.choices?.[0]?.message?.content?.trim(); + if (!raw) throw new Error('Empty OpenAI response'); + raw = raw.replace(/^```(?:json)?\s*/i, '').replace(/\s*```$/i, ''); + return JSON.parse(raw); +} + +async function sleep(ms) { + return new Promise((r) => setTimeout(r, ms)); +} + +function computeOpenAiPlanned( + opts, + localeList, + localesDir, + enMerged, + nsFilter +) { + if ( + opts.fillMissingFromEn && + !opts.translateStaleEnglish && + !opts.retranslate + ) + return false; + if (opts.retranslate) return true; + + for (const loc of localeList) { + const tgt = loadLocaleNamespaces(path.join(localesDir, loc)); + for (const ns of EN_US_NAMESPACE_ORDER) { + if (nsFilter && !nsFilter.has(ns)) continue; + const enObj = /** @type {Record} */ (enMerged[ns] || {}); + const tObj = /** @type {Record} */ (tgt[ns] || {}); + const enKeys = flattenLeaves(enObj); + const tFlat = new Set(flattenLeaves(tObj)); + for (const k of enKeys) { + if (!tFlat.has(k)) { + if (!opts.fillMissingFromEn) return true; + } else if (opts.translateStaleEnglish) { + const v = getLeaf(enObj, k.split('.')); + const locV = getLeaf(tObj, k.split('.')); + if ( + typeof v === 'string' && + typeof locV === 'string' && + locV === v && + isLikelyUntranslatedEnglishCopy(v) + ) { + return true; + } + } + } + } + } + return false; +} + +async function main() { + applyLocalEnvFiles(projectRoot); + + const opts = parseArgs(process.argv.slice(2)); + if (opts.help) { + printHelp(); + process.exit(0); + } + + if (opts.dryRun === opts.write) { + console.error('Specify exactly one of: --dry-run or --write'); + process.exit(1); + } + + const { merged: enMerged, errors } = loadEnUsFlat(projectRoot); + if (errors.length) { + console.error(errors.join('\n')); + process.exit(1); + } + + const localesDir = getLocalesDir(projectRoot); + let localeList = listLocaleFolders(projectRoot); + if (typeof opts.locales === 'string' && opts.locales.trim()) { + const want = new Set( + opts.locales + .split(',') + .map((s) => s.trim()) + .filter(Boolean) + ); + localeList = localeList.filter((l) => want.has(l)); + } + + /** @type {Set | null} */ + let nsFilter = null; + if (typeof opts.namespaces === 'string' && opts.namespaces.trim()) { + nsFilter = new Set( + opts.namespaces + .split(',') + .map((s) => s.trim()) + .filter(Boolean) + ); + } + + if (opts.retranslate && opts.fillMissingFromEn) { + console.error('Use only one of --retranslate or --fill-missing-from-en'); + process.exit(1); + } + + const openAiPlanned = computeOpenAiPlanned( + opts, + localeList, + localesDir, + enMerged, + nsFilter + ); + + if (opts.write && openAiPlanned && !translationApiKey()) { + console.error( + 'OPENAI_API_KEY or AIHUBMIX_API_KEY is required (set in `.env.local`, `.env`, or export). Or use --fill-missing-from-en only.' + ); + process.exit(1); + } + + for (const loc of localeList) { + const label = LOCALE_LABEL[loc] || loc; + const locPath = path.join(localesDir, loc); + + for (const ns of EN_US_NAMESPACE_ORDER) { + if (nsFilter && !nsFilter.has(ns)) continue; + const enObj = /** @type {Record} */ ( + JSON.parse(JSON.stringify(enMerged[ns] || {})) + ); + const enKeys = flattenLeaves(enObj); + + /** @type {Record} */ + let tObj; + if (opts.retranslate) { + tObj = JSON.parse(JSON.stringify(enObj)); + } else { + tObj = JSON.parse( + JSON.stringify(loadLocaleNamespaces(locPath)[ns] || {}) + ); + } + + /** @type {Map} */ + const toTranslate = new Map(); + + if (opts.retranslate) { + for (const k of enKeys) { + const v = getLeaf(enObj, k.split('.')); + if (typeof v === 'string') toTranslate.set(k, v); + } + } else { + const tFlat = new Set(flattenLeaves(tObj)); + for (const k of enKeys) { + if (!tFlat.has(k)) { + const v = getLeaf(enObj, k.split('.')); + if (opts.fillMissingFromEn || typeof v !== 'string') { + setDeep(tObj, k, v); + } else { + toTranslate.set(k, v); + } + } else if (opts.translateStaleEnglish) { + const v = getLeaf(enObj, k.split('.')); + const locV = getLeaf(tObj, k.split('.')); + if ( + typeof v === 'string' && + typeof locV === 'string' && + locV === v && + isLikelyUntranslatedEnglishCopy(v) + ) { + toTranslate.set(k, v); + } + } + } + } + + if ( + toTranslate.size > 0 && + (!opts.fillMissingFromEn || + opts.translateStaleEnglish || + opts.retranslate) + ) { + const chunkSize = 35; + const entries = [...toTranslate.entries()]; + for (let i = 0; i < entries.length; i += chunkSize) { + const slice = entries.slice(i, i + chunkSize); + const obj = Object.fromEntries(slice); + if (opts.dryRun) { + console.log( + `[dry-run] ${loc}/${ns}: OpenAI translate ${slice.length} keys` + ); + } else { + const out = await translateBatch(obj, label); + for (const [k, v] of Object.entries(out)) { + if (typeof v === 'string') setDeep(tObj, k, v); + } + await sleep(350); + } + } + } + + if (opts.dryRun && opts.fillMissingFromEn) { + const baseT = JSON.parse( + JSON.stringify(loadLocaleNamespaces(locPath)[ns] || {}) + ); + const tFlat = new Set(flattenLeaves(baseT)); + let n = 0; + for (const k of enKeys) { + if (!tFlat.has(k)) n++; + } + if (n) + console.log( + `[dry-run] ${loc}/${ns}: copy ${n} missing keys from English` + ); + } + + deleteMissingLeavesSync(tObj, enObj); + stripEmptyContainers(tObj); + + if (opts.write) { + const fp = path.join(locPath, `${ns}.json`); + fs.writeFileSync(fp, `${JSON.stringify(tObj, null, 2)}\n`, 'utf8'); + console.log(`Wrote ${path.relative(projectRoot, fp)}`); + } + } + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/src/i18n/locales/ar/chat.json b/src/i18n/locales/ar/chat.json index a75cce553..b1ffe6710 100644 --- a/src/i18n/locales/ar/chat.json +++ b/src/i18n/locales/ar/chat.json @@ -91,5 +91,7 @@ "input-attach-manage-connectors": "إدارة الموصلات", "input-attach-open-browser": "فتح متصفح", "input-attach-manage-browsers": "إدارة المتصفحات", - "input-attach-menu-trigger": "إضافة ملفات أو صور، أو فتح المهارات أو الموصلات أو المتصفح من القائمة" + "input-attach-menu-trigger": "إضافة ملفات أو صور، أو فتح المهارات أو الموصلات أو المتصفح من القائمة", + "hide-file-sidebar": "إخفاء الشريط الجانبي للملف", + "show-file-sidebar": "إظهار الشريط الجانبي للملف" } diff --git a/src/i18n/locales/ar/dashboard.json b/src/i18n/locales/ar/dashboard.json index c5108da1c..6c9f814ef 100644 --- a/src/i18n/locales/ar/dashboard.json +++ b/src/i18n/locales/ar/dashboard.json @@ -23,5 +23,7 @@ "document-agent": "وكيل المستندات", "multi-modal-agent": "وكيل متعدد الوسائط", "social-media-agent": "وكيل وسائل التواصل الاجتماعي", - "no-projects-found": "لا توجد مشاريع" + "no-projects-found": "لا توجد مشاريع", + "no-projects-match-search": "لا توجد مشاريع تطابق بحثك", + "try-different-search": "جرّب بحثًا مختلفًا" } diff --git a/src/i18n/locales/ar/folder.json b/src/i18n/locales/ar/folder.json new file mode 100644 index 000000000..f5a0f375d --- /dev/null +++ b/src/i18n/locales/ar/folder.json @@ -0,0 +1,8 @@ +{ + "file-path-remote-root": "Remote", + "files-scope-all": "All files", + "files-scope-new": "New files", + "file-path-breadcrumb": "File path", + "download-file": "تنزيل الملف", + "zip-file-is-not-supported-yet": "معاينة ZIP غير مدعومة بعد." +} diff --git a/src/i18n/locales/ar/index.ts b/src/i18n/locales/ar/index.ts index efa753446..4e23f35ac 100644 --- a/src/i18n/locales/ar/index.ts +++ b/src/i18n/locales/ar/index.ts @@ -15,6 +15,7 @@ import agents from './agents.json'; import chat from './chat.json'; import dashboard from './dashboard.json'; +import folder from './folder.json'; import layout from './layout.json'; import setting from './setting.json'; import triggers from './triggers.json'; @@ -24,6 +25,7 @@ export default { agents, layout, dashboard, + folder, workforce, chat, setting, diff --git a/src/i18n/locales/ar/layout.json b/src/i18n/locales/ar/layout.json index 79cbe403b..935833be5 100644 --- a/src/i18n/locales/ar/layout.json +++ b/src/i18n/locales/ar/layout.json @@ -307,5 +307,65 @@ "cookie-count": "{{count}} من ملفات تعريف الارتباط", "add-new-mcp": "إضافة MCP جديد", "browse-mcps": "تصفح MCPs", - "browser-settings": "إعدادات المتصفح" + "browser-settings": "إعدادات المتصفح", + "report-bug-dialog-title": "الإبلاغ عن خطأ", + "report-bug-footer-hint": "سنحفظ ملف ZIP لسجلات التطبيق، ثم نفتح تطبيق البريد الإلكتروني. أرفق ملف ZIP المحفوظ في الرسالة قبل الإرسال.", + "report-bug-field-description": "ما الذي حدث؟", + "report-bug-field-description-placeholder": "صف المشكلة…", + "report-bug-field-steps": "خطوات إعادة الإنتاج (اختياري)", + "report-bug-field-steps-placeholder": "1. … 2. …", + "report-bug-meta": "الإصدار {{version}} · {{os}} ({{arch}})", + "report-bug-description-required": "يرجى وصف ما الذي حدث.", + "report-bug-submit": "حفظ البيانات التشخيصية وفتح البريد الإلكتروني", + "report-bug-diagnostics-saved": "تم حفظ البيانات التشخيصية. أرفق ملف ZIP في بريدك الإلكتروني ثم أرسله.", + "report-bug-mail-subject": "[Eigent] تقرير خطأ", + "report-bug-mail-body-intro": "يرجى إرفاق ملف ZIP للبيانات التشخيصية الذي حفظته للتو بهذه الرسالة.", + "report-bug-mail-body-path": "تم حفظ ملف ZIP في: {{path}}", + "report-bug-mail-body-meta": "إصدار التطبيق: {{version}} | نظام التشغيل: {{os}} ({{arch}})", + "report-bug-mail-body-desc": "الوصف:", + "report-bug-mail-body-steps": "خطوات إعادة الإنتاج:", + "report-bug-mail-body-truncated": "تم اختصار نص البريد الإلكتروني بسبب حدود الطول. راجع ملف bug_report.txt داخل ملف ZIP للحصول على النص الكامل.", + "project-page-tab-project": "Project", + "project-page-tab-tasks": "Tasks", + "project-page-all-tasks": "All tasks", + "project-page-status-pending": "Pending", + "no-tasks": "No tasks", + "workspace-select-project": "اختر مشروعًا", + "workspace-cowork-single-agent": "التعاون مع وكيل واحد", + "workspace-cowork-workforce": "التعاون مع فريق العمل", + "execution-context": "سياق التنفيذ", + "no-results": "No results", + "notification-panel-dismiss": "Dismiss", + "instructions": "التعليمات", + "instructions-rules-tone": "القواعد والنبرة", + "memory": "Memory", + "memory-on": "On", + "memory-off": "Off", + "workforce-setting": "إعدادات فريق العمل", + "select": "Select", + "edit-instructions": "تعديل التعليمات", + "sessions-start-new": "بدء جلسة جديدة", + "sessions-full-title": "جميع الجلسات", + "sessions-create-task-hint": "أنشئ مهمة لبدء جلسة", + "workforce-progress": "Progress", + "workforce-agent-folder": "مجلد الوكيل", + "workforce-agent-pool": "Agent Pool", + "expand-project-sidebar": "توسيع الشريط الجانبي", + "fold-project-sidebar": "طي الشريط الجانبي", + "update": "Update", + "workspace-start-from-scratch": "البدء من الصفر", + "workspace-project-submenu": "Project", + "workspace-recent-session-now": "Now", + "workspace-recent-session-minutes": "{{count}} دقيقة", + "workspace-recent-session-hours": "{{count}}h", + "workspace-recent-session-days": "{{count}}d", + "workspace-recent-sessions-heading": "Recent", + "workspace-session-mode-label": "وضع الجلسة", + "workspace-session-mode-cycle-hint": "انقر لتبديل وضع الجلسة", + "failed-to-start-task": "فشل بدء المهمة. يرجى التحقق من إعدادات النموذج.", + "workspace-work-with-panel-hide": "إخفاء لوحة العمل مع", + "workspace-work-with-panel-show": "إظهار لوحة العمل مع", + "workspace-work-with-dismiss-overlay": "Dismiss", + "workspace-work-with-title": "Work with", + "workspace-work-with-remote-control": "التحكم عن بُعد" } diff --git a/src/i18n/locales/ar/setting.json b/src/i18n/locales/ar/setting.json index a2598b1db..60e7c398d 100644 --- a/src/i18n/locales/ar/setting.json +++ b/src/i18n/locales/ar/setting.json @@ -18,7 +18,7 @@ "default": "افتراضي", "profile": "الملف الشخصي", "account": "حساب", - "you-are-currently-signed-in-with": "{{email}} أنت مسجل الدخول حاليًا باستخدام", + "you-are-currently-signed-in-with": "{{email}} أنت مسجل الدخول حاليًا باستخدام", "manage": "إدارة", "log-out": "تسجيل الخروج", "language": "اللغة", @@ -28,7 +28,6 @@ "dark": "غامق", "light": "فاتح", "transparent": "شفاف", - "workspace-main-background": "خلفية مساحة العمل", "workspace-main-background-description": "تُطبَّق على لوحتي Workforce وSession الرئيسيتين فقط.", "workspace-main-background-empty": "فارغ", @@ -37,14 +36,12 @@ "workspace-main-background-ruled": "أسطر كاملة", "workspace-main-background-dotted": "أسطر منقطة", "workspace-main-background-dashed": "أسطر مُقطّعة", - "appearance-tab": "المظهر", "color-mode": "وضع الألوان", "accent-palette": "لوحة الألوان المميزة", "accent-palette-description": "سمات ألوان جاهزة للواجهة. تُحفظ بشكل منفصل للوضعين الفاتح والداكن.", "accent-for-light": "الوضع الفاتح", "accent-for-dark": "الوضع الداكن", - "data-privacy": "خصوصية البيانات", "data-privacy-description": "يعتمد أيجنت على الوضع المحلي الجديد ويضمن خصوصيتك. تبقى بياناتك على جهازك افتراضيًا. أذونات السحابة اختيارية، ويُستخدم حد البيانات لأغراض العمل فقط", "privacy-policy": "سياسة الخصوصية", @@ -93,7 +90,6 @@ "url": "عنوان URL", "enter-your-model-type": "أدخل نوع النموذج الخاص بك", "verifying": "جارٍ التحقق...", - "mcp-and-tools": "MCP الأدوات", "add-mcp-server": "MCP إضافة خادم", "market": "السوق", @@ -123,7 +119,7 @@ "are-you-sure-you-want-to-delete": "هل أنت متأكد أنك تريد حذف", "deleting": "جارٍ الحذف...", "delete": "حذف", - "configure {name} Toolkit": "{name} تكوين مجموعة أدوات", + "configure {name} Toolkit": "{{name}} تكوين مجموعة أدوات", "get-it-from": "احصل عليها من", "google-custom-search-api": "Google واجهة برمجة تطبيقات البحث المخصص من", "google-cloud-console": "Google Cloud وحدة تحكم", @@ -183,7 +179,6 @@ "proxy-save-failed": "فشل حفظ تكوين الوكيل.", "proxy-invalid-url": "عنوان URL للوكيل غير صالح. يجب أن يبدأ بـ http:// أو https:// أو socks4:// أو socks5://.", "proxy-restart-hint": "يجب إعادة التشغيل لتطبيق تغييرات الوكيل.", - "cloud-not-available-in-local-proxy": "إصدار السحابة غير متاح في وضع الوكيل المحلي", "set-as-default": "تعيين كافتراضي", "api-key-setting": "إعداد مفتاح API", @@ -191,11 +186,9 @@ "model-type-setting": "إعداد نوع النموذج", "please-select": "يرجى الاختيار", "configuring": "جارٍ التكوين...", - "models-default-setting-title": "الإعداد الافتراضي", "models-default-setting-description": "اختر أحد النماذج المكوّنة ليكون النموذج الافتراضي لـ Eigent، وسيتم تطبيقه عالميًا عبر مساحة العمل الخاصة بك.", "models-configuration": "التكوين", - "gemini-3-pro-preview-name": "Gemini 3 Pro Preview", "gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview", "gemini-3-flash-preview-name": "Gemini 3 Flash Preview", @@ -209,173 +202,6 @@ "claude-opus-4-7-name": "Claude Opus 4.7", "deepseek-v4-pro-name": "DeepSeek V4 Pro", "minimax-m2-7-name": "Minimax M2.7", - - "account": "حساب", - "you-are-currently-signed-in-with": "{{email}} أنت مسجل الدخول حاليًا باستخدام", - "manage": "إدارة", - "log-out": "تسجيل الخروج", - "language": "اللغة", - "select-language": "اختر اللغة", - "system-default": "النظام الافتراضي", - "appearance": "المظهر", - "dark": "غامق", - "light": "فاتح", - "transparent": "شفاف", - - "workspace-main-background": "خلفية مساحة العمل", - "workspace-main-background-description": "تُطبَّق على لوحتي Workforce وSession الرئيسيتين فقط.", - "workspace-main-background-empty": "فارغ", - "workspace-main-background-dots": "نقاط", - "workspace-main-background-blocks": "شبكة", - "workspace-main-background-ruled": "أسطر كاملة", - "workspace-main-background-dotted": "أسطر منقطة", - "workspace-main-background-dashed": "أسطر مُقطّعة", - - "appearance-tab": "المظهر", - "color-mode": "وضع الألوان", - "accent-palette": "لوحة الألوان المميزة", - "accent-palette-description": "سمات ألوان جاهزة للواجهة. تُحفظ بشكل منفصل للوضعين الفاتح والداكن.", - "accent-for-light": "الوضع الفاتح", - "accent-for-dark": "الوضع الداكن", - - "data-privacy": "خصوصية البيانات", - "data-privacy-description": "يعتمد أيجنت على الوضع المحلي الجديد ويضمن خصوصيتك. تبقى بياناتك على جهازك افتراضيًا. أذونات السحابة اختيارية، ويُستخدم حد البيانات لأغراض العمل فقط", - "privacy-policy": "سياسة الخصوصية", - "how-we-handle-your-data": "كيف نتعامل مع بياناتك", - "we-only-use-the-essential-data-needed-to-run-your-tasks": "نحن نستخدم فقط البيانات الأساسية اللازمة لتنفيذ مهامك", - "how-we-handle-your-data-line-1": "نحن نستخدم فقط البيانات الأساسية اللازمة لتنفيذ مهامك", - "how-we-handle-your-data-line-1-line-1": ".يمكنك اختيار لقطات شاشة أيجنت لتحليل عناصر واجهة المستخدم وقراءة النص وتحديد الإجراء التالي، تمامًا كما تفعل", - "how-we-handle-your-data-line-1-line-2": ".يمكن استخدام الماوس ولوحة المفاتيح المحلية للوصول إلى البرامج والملفات المحلية التي تم تنشيطها", - "how-we-handle-your-data-line-1-line-3": "لا يتم توفير سوى الحد الأدنى من البيانات ذات الصلة لنماذج الذكاء الاصطناعي أو عمليات التكامل مع جهات خارجية التي تمكنها؛ وليس لدينا أي احتفاظ بالبيانات", - "how-we-handle-your-data-line-2": ".تبقى ملفات المهام والمخرجات ولقطات الشاشة في مجلد المهمة المخصص لك محليًا", - "how-we-handle-your-data-line-3": ".يتم تخزين بيانات الاعتماد محليًا، وتشفيرها، ولا تُستخدم إلا للخطوات المعتمدة", - "how-we-handle-your-data-line-4": ".لا تُستخدم بياناتك أبدًا لتدريب نماذج الذكاء الاصطناعي الخاصة بنا دون موافقتك الصريحة", - "how-we-handle-your-data-line-5": ".نحن لا نبيع بياناتك لأطراف ثالثة", - "api-key-can-not-be-empty": "!لا يمكن أن يكون مفتاح واجهة برمجة التطبيقات فارغًا", - "api-host-can-not-be-empty": "!لا يمكن أن يكون مضيف واجهة برمجة التطبيقات فارغًا", - "model-type-can-not-be-empty": "!لا يمكن أن يكون نوع النموذج فارغًا", - "validate-success": "التحقق ناجح", - "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "ِ.تم التحقق من أن النموذج يدعم استدعاء الوظيفة، وهو أمر مطلوب للاستخدام", - "validate-failed": "فشل التحقق", - "copy": "نسخ", - "copied-to-clipboard": "تم النسخ إلى الحافظة", - "endpoint-url-can-not-be-empty": "!لا يمكن أن يكون عنوان يورل لنقطة النهاية فارغًا", - "verification-failed-please-check-endpoint-url": "فشل التحقق، يرجى المراجعة على النقطة النهائية يورل", - "eigent-cloud-version": "إصدار أيجنت السحابي", - "you-are-currently-subscribed-to-the": "أنت مشترك حاليًا في", - "discover-more-about-our": "اكتشف المزيد حول", - "pricing-options": "خيارات التسعير", - "credits": "رصيد", - "select-model-type": "اختر نوع النموذج", - "custom-model": "نموذج مخصص", - "use-your-own-api-keys-or-set-up-a-local-model": ".استخدم مفاتيح واجهة برمجة التطبيقات الخاصة بك أو قم بإعداد نموذج محلي", - "verify": "تحقق", - "local-model": "نموذج محلي", - "model-platform": "منصة النموذج", - "model-endpoint-url": "للنموذج URL النقطة نهاية", - "model-type": "نوع النموذج", - "enter-your-local-model-type": "أدخل نوع نموذجك المحلي", - "you-are-on-selft-host-mode": "أنت في وضع الاستضافة الذاتية", - "you-are-using-self-hosted-mode": ".أنت تستخدم وضع الاستضافة الذاتية. للحصول على أفضل أداء لهذا المنتج، يرجى إدخال مفتاح بحث Google في \"MCP والأدوات\" لضمان عمل Eigent بشكل صحيح", - "the-google-search-key-is-essential-for-delivering-accurate-search-results": ".مفتاح بحث Google ضروري لتقديم نتائج بحث دقيقة. مفتاح بحث Exa اختياري ولكنه موصى به بشدة للحصول على أداء أفضل", - "close": "إغلاق", - "enter-your-api-key": "أدخل مفتاح واجهة برمجة التطبيقات الخاص بك", - "key": "مفتاح", - "enter-your-api-host": "أدخل مضيف واجهة برمجة التطبيقات الخاص بك", - "url": "عنوان URL", - "enter-your-model-type": "أدخل نوع النموذج الخاص بك", - "verifying": "جارٍ التحقق...", - - "mcp-and-tools": "MCP الأدوات", - "add-mcp-server": "MCP إضافة خادم", - "market": "السوق", - "tools": "الأدوات", - "added-external-servers": "تمت إضافة خوادم خارجية", - "loading": "جارٍ التحميل...", - "no-mcp-servers": "MCP لا توجد خوادم", - "environmental-variables-required": "المتغيرات البيئية مطلوبة", - "load-failed": "فشل التحميل", - "save-failed": "فشل الحفظ", - "invalid-json": "غير صالح JSON", - "coming-soon": "قريبًا", - "uninstall": "إلغاء التثبيت", - "install": "تثبيت", - "add-your-agent": "أضف وكيلك", - "add-a-local-mcp-server-by-providing-a-valid-json-configuration": ".أضف مضيف مسيبي محليًا عن طريق توفير جسون صارم صالح", - "learn-more": "اتعلم اكثر", - "installing": "جارٍ التثبيت...", - "edit-mcp-config": "MCP تعديل تكوين", - "name": "الاسم", - "description": "الوصف", - "command": "الأمر", - "args-one-per-line": "الوسائط (واحد في كل سطر)", - "cancel": "إلغاء", - "save": "حفظ", - "confirm-delete": "تأكيد الحذف", - "are-you-sure-you-want-to-delete": "هل أنت متأكد أنك تريد حذف", - "deleting": "جارٍ الحذف...", - "delete": "حذف", - "configure {name} Toolkit": "{name} تكوين مجموعة أدوات", - "get-it-from": "احصل عليها من", - "google-custom-search-api": "Google واجهة برمجة تطبيقات البحث المخصص من", - "google-cloud-console": "Google Cloud وحدة تحكم", - "connect": "اتصال", - "setting": "إعداد", - "all": "الكل", - "mcp-market": "MCP سوق", - "no-mcp-services": "MCP لا توجد خدمات", - "loading-more": "جارٍ تحميل المزيد...", - "no-more-mcp-servers": "MCP لا مزيد من خوادم", - "search-mcp": "MCP بحث", - "installed": "مثبت", - "worker-name-cannot-be-empty": "لا يمكن أن يكون اسم العامل فارغًا", - "worker-name-already-exists": "اسم العامل موجود بالفعل", - "warning-google-search-not-configured": "تحذير: بحث Google غير مكوّن", - "search-functionality-may-be-limited-without-google-api": "قد تكون وظائف البحث محدودة بدون مفتاح Google API ومعرف محرك البحث. يمكنك تكوين هذه في إعدادات MCP والأدوات.", - "search-engine": "محرك البحث", - "password-storage": "تخزين كلمة المرور", - "notion-mcp-installed-successfully": "تم تثبيت Notion MCP بنجاح", - "failed-to-install-notion-mcp": "فشل في تثبيت Notion MCP", - "google-calendar-installed-successfully": "تم تثبيت Google Calendar بنجاح", - "failed-to-install-google-calendar": "فشل في تثبيت Google Calendar", - "notion-workspace-integration": "تكامل مساحة عمل Notion لقراءة وإدارة صفحات Notion", - "google-calendar-integration": "تكامل Google Calendar لإدارة الأحداث والجداول الزمنية", - "mcp-server-already-exists": "خادم MCP \"{{name}}\" موجود بالفعل", - "google-search": "بحث Google", - "select-default-search-engine": "اختر محرك البحث الافتراضي", - "your-own-mcps": "MCPs الخاصة بك", - "get-google-search-api": "احصل على Google Search API", - "get-exa-api": "احصل على Exa API", - "exa-ai": "Exa AI", - "search-engine-integrations": "تكاملات محرك البحث", - "configured": "مكوّن", - "incomplete": "غير مكتمل", - "not-configured": "غير مكوّن", - "saving": "جارٍ الحفظ...", - "save-changes": "حفظ التغييرات", - "enable": "تفعيل", - "search": "بحث", - "test-connection": "اختبار الاتصال", - "your-api-keys-are-stored-securely-and-never-shared-externally": "مفاتيح واجهة برمجة التطبيقات الخاصة بك محفوظة بأمان ولا يتم مشاركتها خارجيًا أبدًا.", - "this-service-is-public-and-does-not-require-credentials": "هذه الخدمة عامة ولا تتطلب بيانات اعتماد.", - "this-service-does-not-require-an-api-key": "هذه الخدمة لا تتطلب مفتاح واجهة برمجة تطبيقات.", - "connection-test-successful": "اختبار الاتصال ناجح!", - "connection-test-failed": "فشل اختبار الاتصال.", - "configuration-saved-successfully": "تم حفظ التكوين بنجاح!", - "failed-to-save-configuration": "فشل في حفظ التكوين.", - "recommended": "موصى به", - "reset": "إعادة تعيين", - "reset-success": "تمت إعادة التعيين بنجاح!", - "reset-failed": "فشل إعادة التعيين!", - - "network-proxy": "وكيل الشبكة", - "network-proxy-description": "قم بتكوين خادم وكيل لطلبات الشبكة. هذا مفيد إذا كنت بحاجة إلى الوصول إلى واجهات برمجة التطبيقات الخارجية عبر وكيل.", - "proxy-placeholder": "http://127.0.0.1:7890", - "proxy-saved-restart-required": "تم حفظ تكوين الوكيل. أعد تشغيل التطبيق لتطبيق التغييرات.", - "proxy-save-failed": "فشل حفظ تكوين الوكيل.", - "proxy-invalid-url": "عنوان URL للوكيل غير صالح. يجب أن يبدأ بـ http:// أو https:// أو socks4:// أو socks5://.", - "proxy-restart-hint": "يجب إعادة التشغيل لتطبيق تغييرات الوكيل.", - "browser-login": "تسجيل الدخول عبر المتصفح", "browser-login-description": "افتح متصفح Chrome لتسجيل الدخول إلى حساباتك. سيتم حفظ بيانات تسجيل الدخول محليًا في ملف شخصي آمن.", "open-browser-login": "فتح المتصفح لتسجيل الدخول", @@ -400,11 +226,15 @@ "confirm-delete-all-cookies": "هل أنت متأكد أنك تريد حذف جميع ملفات تعريف الارتباط؟ لا يمكن التراجع عن هذا الإجراء.", "all-cookies-deleted": "تم حذف جميع ملفات تعريف الارتباط بنجاح.", "cookie-delete-warning": "ملاحظة: سيؤدي حذف ملفات تعريف الارتباط إلى تسجيل خروجك من المواقع المرتبطة. قد تحتاج إلى إعادة تشغيل المتصفح لتطبيق التغييرات.", - "preferred-ide": "IDE المفضل", "preferred-ide-description": "اختر التطبيق الذي سيتم استخدامه عند فتح مجلدات مشاريع الوكيل.", "system-file-manager": "مدير ملفات النظام", "agents": "الوكلاء", "help-improve-eigent": "ساعد في تحسين Eigent", - "help-improve-eigent-description": "اسمح لـ Eigent بجمع سجلات الأخطاء المجهولة وبيانات الاستخدام لتحسين الخدمة. هذا اختياري ويمكن تغييره في أي وقت." + "help-improve-eigent-description": "اسمح لـ Eigent بجمع سجلات الأخطاء المجهولة وبيانات الاستخدام لتحسين الخدمة. هذا اختياري ويمكن تغييره في أي وقت.", + "please-complete-authorization-in-browser": "يرجى إكمال المصادقة في متصفحك", + "authorization-cancelled": "تم إلغاء المصادقة", + "authorization-failed": "فشلت المصادقة", + "this-service-is-already-enabled-by-default": "هذه الخدمة مفعلة بالفعل بشكل افتراضي", + "version": "Version" } diff --git a/src/i18n/locales/ar/triggers.json b/src/i18n/locales/ar/triggers.json index 1f1d6beae..930929cf5 100644 --- a/src/i18n/locales/ar/triggers.json +++ b/src/i18n/locales/ar/triggers.json @@ -2,19 +2,19 @@ "name": "Name", "description": "Description", "trigger-type": "Type", - "create-new": "Create New Trigger", - "trigger-details": "Trigger Details", - "no-trigger-selected": "No Trigger Selected", - "select-trigger-hint": "Click on a trigger from the list to view its details", - "no-triggers": "No triggers yet", - "name-placeholder": "Enter trigger name", - "description-placeholder": "Enter trigger description", + "create-new": "إنشاء مشغّل جديد", + "trigger-details": "تفاصيل المشغّل", + "no-trigger-selected": "لم يتم تحديد مشغّل", + "select-trigger-hint": "انقر على مشغّل من القائمة لعرض تفاصيله", + "no-triggers": "لا توجد مشغّلات بعد", + "name-placeholder": "أدخل اسم المشغّل", + "description-placeholder": "أدخل وصف المشغّل", "schedule-trigger": "Schedule", "webhook-trigger": "Webhook", "slack-trigger": "Slack", "app-trigger": "App Trigger", - "cron-expression": "Cron Expression", - "cron-help": "Format: minute hour day month weekday (e.g., 0 */1 * * * = every hour)", + "cron-expression": "تعبير Cron", + "cron-help": "الصيغة: الدقيقة الساعة اليوم الشهر اليوم_من_الأسبوع (مثال: 0 */1 * * * = كل ساعة)", "cron-empty": "لا يمكن أن يكون تعبير Cron فارغًا", "cron-invalid-format": "تنسيق Cron غير صالح. المتوقع: دقيقة ساعة يوم شهر يوم الأسبوع (مثل: 0 */1 * * *)", "cron-invalid-minute": "قيمة الدقيقة غير صالحة. يجب أن تكون 0-59 أو تعبير cron صالح", @@ -22,23 +22,23 @@ "cron-invalid-day": "قيمة اليوم غير صالحة. يجب أن تكون 1-31 أو تعبير cron صالح", "cron-invalid-month": "قيمة الشهر غير صالحة. يجب أن تكون 1-12 أو تعبير cron صالح", "cron-invalid-weekday": "قيمة يوم الأسبوع غير صالحة. يجب أن تكون 0-6 (0=الأحد) أو تعبير cron صالح", - "listener-type": "Listener Type", - "select-listener": "Select listener type", + "listener-type": "نوع المستمع", + "select-listener": "اختر نوع المستمع", "chat-agent": "Chat Agent", "workforce": "Workforce", "agent-model": "Agent Model", "task-prompt": "Task Prompt", - "task-prompt-placeholder": "Enter the task prompt for this trigger", - "max-per-hour": "Max Per Hour", + "task-prompt-placeholder": "أدخل موجه المهمة لهذا المشغّل", + "max-per-hour": "الحد الأقصى في الساعة", "max-per-day": "Max Per Day", - "single-execution": "Single Execution", + "single-execution": "تنفيذ واحد", "webhook-url": "Webhook URL", "executions": "Executions", "errors": "Errors", "view-runs": "View Runs", "activate": "Activate", "deactivate": "Deactivate", - "execution-id": "Execution ID", + "execution-id": "معرّف التنفيذ", "started": "Started", "duration": "Duration", "tokens": "Tokens", @@ -46,29 +46,29 @@ "failed": "Failed", "running": "Running", "pending": "Pending", - "no-executions": "No executions found", - "executions-for": "Executions for", - "name-required": "Trigger name is required", - "created-successfully": "Trigger created successfully", - "failed-to-create": "Failed to create trigger", - "failed-to-load": "Failed to load triggers", - "activated": "Trigger activated", - "deactivated": "Trigger deactivated", - "failed-to-toggle": "Failed to toggle trigger status", - "webhook-created-title": "Webhook Created Successfully", - "webhook-created-subtitle": "Your new webhook trigger is ready to receive requests", - "webhook-ready": "Webhook Ready!", - "webhook-instructions": "Use the URL below to trigger this agent. Send a request with any JSON body.", - "your-webhook-url": "Your Webhook URL", - "webhook-tip-title": "Did you know?", - "webhook-tip-description": "You can include custom data in your JSON payload and reference it in your task prompt using {{variable_name}}.", - "webhook-url-copied": "Webhook URL copied to clipboard", - "confirm-delete": "Are you sure you want to delete this trigger?", - "deleted": "Trigger deleted", - "failed-to-delete": "Failed to delete trigger", - "webhook-copied": "Webhook URL copied to clipboard", - "failed-to-copy": "Failed to copy webhook URL", - "trigger-task": "Trigger Task", + "no-executions": "لم يتم العثور على عمليات تنفيذ", + "executions-for": "عمليات التنفيذ لـ", + "name-required": "اسم المشغّل مطلوب", + "created-successfully": "تم إنشاء المشغّل بنجاح", + "failed-to-create": "فشل إنشاء المشغّل", + "failed-to-load": "فشل تحميل المشغّلات", + "activated": "تم تفعيل المشغّل", + "deactivated": "تم إلغاء تفعيل المشغّل", + "failed-to-toggle": "فشل تغيير حالة المشغّل", + "webhook-created-title": "تم إنشاء Webhook بنجاح", + "webhook-created-subtitle": "المشغّل الجديد من نوع Webhook جاهز لتلقي الطلبات", + "webhook-ready": "Webhook جاهز!", + "webhook-instructions": "استخدم الرابط أدناه لتشغيل هذا الوكيل. أرسل طلبًا بأي جسم JSON.", + "your-webhook-url": "رابط Webhook الخاص بك", + "webhook-tip-title": "هل تعلم؟", + "webhook-tip-description": "يمكنك تضمين بيانات مخصصة في حمولة JSON الخاصة بك والإشارة إليها في موجه المهمة باستخدام {{variable_name}}.", + "webhook-url-copied": "تم نسخ رابط Webhook إلى الحافظة", + "confirm-delete": "هل أنت متأكد أنك تريد حذف هذا المشغّل؟", + "deleted": "تم حذف المشغّل", + "failed-to-delete": "فشل حذف المشغّل", + "webhook-copied": "تم نسخ رابط الـWebhook إلى الحافظة", + "failed-to-copy": "فشل نسخ رابط الـWebhook", + "trigger-task": "تشغيل المهمة", "task-mode-text": "Text", "task-mode-json": "JSON", "schedule-frequency": "Frequency", @@ -81,44 +81,44 @@ "weekday-thursday": "Thursday", "weekday-friday": "Friday", "weekday-saturday": "Saturday", - "webhook-function": "Webhook Function", + "webhook-function": "وظيفة الـWebhook", "frequency-hourly": "Every Hour", "frequency-daily": "Daily", "frequency-weekly": "Weekly", "frequency-monthly": "Monthly", "frequency-one-time": "One Time", "frequency-custom": "Custom", - "invalid-time-format": "Invalid time format. Use HH:MM (e.g., 09:30)", - "schedule-day-of-month-note": "If the selected day doesn’t exist in that month (e.g., the 31st), the task will be skipped.", + "invalid-time-format": "تنسيق الوقت غير صالح. استخدم HH:MM (مثل 09:30)", + "schedule-day-of-month-note": "إذا كان اليوم المحدد غير موجود في ذلك الشهر (مثل اليوم 31)، فسيتم تخطي المهمة.", "schedule-hour": "ساعة", "schedule-minute": "دقيقة", "schedule-date": "Date", "select-date": "Select date", - "schedule-day-of-month": "Day of Month", + "schedule-day-of-month": "يوم من الشهر", "select-day": "Select day", "day-of-month": "Day {{day}}", - "schedule-weekdays": "Days of Week", - "expiration-date": "Expiration Date", - "no-expiration": "No expiration", - "select-expiration": "Select expiration date", - "no-upcoming-one-time": "Select a future date and time", - "no-upcoming-executions": "No upcoming executions", - "date-required": "Date is required", - "weekday-required": "At least one weekday is required", - "schedule-required-fields": "Please fill in all required fields for the schedule", - "create-trigger-agent": "Automate task with trigger", - "trigger-overview": "Trigger Overview", + "schedule-weekdays": "أيام الأسبوع", + "expiration-date": "تاريخ الانتهاء", + "no-expiration": "بدون انتهاء", + "select-expiration": "اختر تاريخ الانتهاء", + "no-upcoming-one-time": "حدد تاريخًا ووقتًا في المستقبل", + "no-upcoming-executions": "لا توجد عمليات تنفيذ قادمة", + "date-required": "التاريخ مطلوب", + "weekday-required": "يلزم اختيار يوم واحد على الأقل من أيام الأسبوع", + "schedule-required-fields": "يرجى ملء جميع الحقول المطلوبة للجدولة", + "create-trigger-agent": "أتمتة المهمة باستخدام المشغّل", + "trigger-overview": "نظرة عامة على المشغّل", "edit": "Edit", "delete": "Delete", "period": "Period", "created-at": "Created At", - "execution-history": "Execution History", + "execution-history": "سجل التنفيذ", "run-time": "Run Time", "success": "Success", - "output-tasks": "Output Tasks", + "output-tasks": "مهام الإخراج", "logs": "Logs", "close": "Close", - "confirm-delete-trigger": "Are you sure you want to delete this trigger?", + "confirm-delete-trigger": "هل أنت متأكد أنك تريد حذف هذا المشغّل؟", "status": { "active": "Active", "inactive": "Inactive", @@ -126,66 +126,66 @@ "completed": "Completed", "unknown": "Unknown" }, - "webhook-url-after-creation": "You can find your webhook URL in the trigger details after creation.", - "webhook-method": "Request Method", - "created-time": "Created Time", - "last-execution-label": "Last Execution", + "webhook-url-after-creation": "يمكنك العثور على رابط الـWebhook في تفاصيل المشغّل بعد الإنشاء.", + "webhook-method": "طريقة الطلب", + "created-time": "وقت الإنشاء", + "last-execution-label": "آخر تنفيذ", "token-cost": "Token Cost", - "updated-successfully": "Trigger updated successfully", + "updated-successfully": "تم تحديث المشغّل بنجاح", "title": "Triggers", - "create-hint": "Create a trigger to automate your tasks", - "live-activity": "Live Activity", - "no-activity": "No activity yet", - "activity-hint": "Activity will appear here", - "execution-logs": "Execution Logs", + "create-hint": "أنشئ مشغّلًا لأتمتة مهامك", + "live-activity": "النشاط المباشر", + "no-activity": "لا يوجد نشاط حتى الآن", + "activity-hint": "سيظهر النشاط هنا", + "execution-logs": "سجلات التنفيذ", "fold-execution-logs": "طي سجلات التنفيذ", "open-execution-logs": "فتح سجلات التنفيذ", - "delete-trigger": "Delete Trigger", + "delete-trigger": "حذف المشغّل", "cancel": "Cancel", "deleting": "Deleting...", - "duplicated-successfully": "Trigger duplicated as \"{{name}}\"", - "confirm-delete-message": "Are you sure you want to delete \"{{name}}\"? This action cannot be undone.", + "duplicated-successfully": "تمت مضاعفة المشغّل باسم \"{{name}}\"", + "confirm-delete-message": "هل أنت متأكد أنك تريد حذف \"{{name}}\"؟ لا يمكن التراجع عن هذا الإجراء.", "workspace": "Workspace", - "agent-folder": "Agent Folder", + "agent-folder": "مجلد الوكيل", "add": "Add", "upload": "Upload", "create": "Create", "loading": "Loading...", - "loading-executions": "Loading execution data...", - "failed-to-load-executions": "Failed to load execution data", - "no-execution-data": "No execution data available", + "loading-executions": "جارٍ تحميل بيانات التنفيذ...", + "failed-to-load-executions": "فشل في تحميل بيانات التنفيذ", + "no-execution-data": "لا توجد بيانات تنفيذ متاحة", "total-runs": "Total Runs", - "success-rate": "Success Rate", - "no-executions-yet": "No executions yet", + "success-rate": "معدل النجاح", + "no-executions-yet": "لا توجد عمليات تنفيذ بعد", "last-run-label": "Last run", - "execution-completed-success": "Execution completed successfully", - "execution-failed-message": "Execution failed", - "execution-in-progress": "Execution in progress...", - "waiting-to-execute": "Waiting to execute...", - "execution-cancelled": "Execution was cancelled", - "execution-missed": "Execution was missed", - "unknown-status": "Unknown status", + "execution-completed-success": "اكتمل التنفيذ بنجاح", + "execution-failed-message": "فشل التنفيذ", + "execution-in-progress": "التنفيذ جارٍ...", + "waiting-to-execute": "في انتظار التنفيذ...", + "execution-cancelled": "تم إلغاء التنفيذ", + "execution-missed": "تم تفويت التنفيذ", + "unknown-status": "حالة غير معروفة", "trigger-label": "Trigger", "status-created": "Created", "status-updated": "Updated", "status-activated": "Activated", "status-deleted": "Deleted", "status-deactivated": "Deactivated", - "status-execution-started": "Execution started", - "status-execution-completed": "Execution completed", + "status-execution-started": "بدأ التنفيذ", + "status-execution-completed": "اكتمل التنفيذ", "status-error": "Error", - "status-webhook-triggered": "Webhook triggered", + "status-webhook-triggered": "تم تشغيل Webhook", "status-activity": "Activity", - "upcoming-executions": "Upcoming Executions", - "preview-scheduled-times": "Preview Scheduled Times", - "task-prompt-required": "Task prompt is required", - "project-id-required": "Project ID is required", - "execution-settings": "Execution Settings", - "extra-settings": "Extra Settings", + "upcoming-executions": "عمليات التنفيذ القادمة", + "preview-scheduled-times": "معاينة الأوقات المجدولة", + "task-prompt-required": "مطلوب نص المهمة", + "project-id-required": "مطلوب معرّف المشروع", + "execution-settings": "إعدادات التنفيذ", + "extra-settings": "إعدادات إضافية", "max-per-hour-placeholder": "0", "max-per-day-placeholder": "0", "copy": "Copy", - "edit-trigger-agent": "Edit Trigger Agent", + "edit-trigger-agent": "تعديل وكيل المشغل", "updating": "Updating...", "creating": "Creating...", "update": "Update", @@ -195,102 +195,102 @@ "activation-limit-reached": "تم بلوغ حد التفعيل: 5 محفزات نشطة كحد أقصى لكل مشروع، و25 لكل مستخدم", "never": "Never", "duplicate": "Duplicate", - "no-task-prompt": "No task prompt", + "no-task-prompt": "لا يوجد نص مهمة", "select-app": "اختر تطبيق", "change-app": "Change", "dynamic": { "credentials": "Credentials", - "credentials-notice": "Your credentials are stored securely and used to authenticate with the service.", - "credentials-saved": "Credentials configured successfully", - "configuration": "Configuration", - "behavior-settings": "Behavior Settings", - "enter-value": "Please enter a value", + "credentials-notice": "تُخزَّن بيانات الاعتماد الخاصة بك بشكل آمن وتُستخدم للمصادقة مع الخدمة.", + "credentials-saved": "تم إعداد بيانات الاعتماد بنجاح", + "configuration": "التهيئة", + "behavior-settings": "إعدادات السلوك", + "enter-value": "يرجى إدخال قيمة", "add": "Add", "update": "Update", - "config-saved": "Configuration saved successfully", - "config-updated": "Configuration updated successfully", - "config-save-error": "Failed to save configuration", + "config-saved": "تم حفظ التهيئة بنجاح", + "config-updated": "تم تحديث التهيئة بنجاح", + "config-save-error": "فشل في حفظ التهيئة", "loading": "Loading...", - "loading-config": "Loading configuration...", - "no-config-available": "No configuration available for this trigger type", - "failed-to-load-schema": "Failed to load configuration schema", - "select-options": "Select options...", + "loading-config": "جارٍ تحميل التهيئة...", + "no-config-available": "لا توجد تهيئة متاحة لهذا النوع من المشغلات", + "failed-to-load-schema": "فشل في تحميل مخطط التهيئة", + "select-options": "اختر الخيارات...", "selected": "selected", - "save-credentials-first": "Save credentials first", + "save-credentials-first": "احفظ بيانات الاعتماد أولاً", "search": "Search...", - "no-options": "No options found", + "no-options": "لم يتم العثور على خيارات", "validation": { - "required": "{{field}} is required", - "invalid-regex": "Invalid regular expression pattern", - "invalid-email": "Invalid email address", - "invalid-url": "Invalid URL format", - "min-length": "Must be at least {{min}} characters", - "max-length": "Must be no more than {{max}} characters", - "pattern-mismatch": "Value does not match required pattern", - "min-value": "Must be at least {{min}}", - "max-value": "Must be no more than {{max}}" + "required": "‏{{field}} مطلوب", + "invalid-regex": "نمط التعبير النمطي غير صالح", + "invalid-email": "عنوان البريد الإلكتروني غير صالح", + "invalid-url": "تنسيق عنوان URL غير صالح", + "min-length": "يجب ألا يقل عن {{min}} أحرف", + "max-length": "يجب ألا يزيد عن {{max}} أحرف", + "pattern-mismatch": "القيمة لا تطابق النمط المطلوب", + "min-value": "يجب ألا يقل عن {{min}}", + "max-value": "يجب ألا يزيد عن {{max}}" }, - "validation-failed": "Please fix validation errors: {{errors}}" + "validation-failed": "يرجى تصحيح أخطاء التحقق: {{errors}}" }, "slack": { - "credentials-saved": "Slack credentials configured successfully", - "enter-bot-token": "Please enter a bot token", - "bot-token-saved": "Bot token saved successfully", - "bot-token-updated": "Bot token updated successfully", - "bot-token-save-error": "Failed to save bot token", - "signing-secret-saved": "Signing secret saved successfully", - "signing-secret-updated": "Signing secret updated successfully", - "signing-secret-save-error": "Failed to save signing secret", + "credentials-saved": "تم إعداد بيانات اعتماد Slack بنجاح", + "enter-bot-token": "يرجى إدخال رمز bot", + "bot-token-saved": "تم حفظ رمز bot بنجاح", + "bot-token-updated": "تم تحديث رمز bot بنجاح", + "bot-token-save-error": "فشل حفظ رمز bot", + "signing-secret-saved": "تم حفظ السرّ التوقيعي بنجاح", + "signing-secret-updated": "تم تحديث السرّ التوقيعي بنجاح", + "signing-secret-save-error": "فشل حفظ السرّ التوقيعي", "add": "Add", "update": "Update", - "event-configuration": "Event Configuration", + "event-configuration": "إعدادات الأحداث", "event-types": "Event Types", - "select-events": "Select events to trigger on...", - "search-events": "Search events...", - "no-events-found": "No events found", - "events-selected": "events selected", - "channel-filter": "Channel Filter", - "select-channels": "All channels (no filter)", - "search-channels": "Search channels...", - "no-channels-found": "No channels found", - "channels-selected": "channels selected", - "save-credentials-first": "Save credentials first to load channels", - "loading-channels": "Loading channels...", - "channels-fetch-error": "Failed to fetch channels. Please check your credentials.", - "behavior-settings": "Behavior Settings", + "select-events": "اختر الأحداث التي سيتم التشغيل عليها...", + "search-events": "ابحث في الأحداث...", + "no-events-found": "لم يتم العثور على أحداث", + "events-selected": "تم اختيار أحداث", + "channel-filter": "تصفية القنوات", + "select-channels": "جميع القنوات (بدون تصفية)", + "search-channels": "ابحث في القنوات...", + "no-channels-found": "لم يتم العثور على قنوات", + "channels-selected": "تم اختيار قنوات", + "save-credentials-first": "احفظ بيانات الاعتماد أولاً لتحميل القنوات", + "loading-channels": "جارٍ تحميل القنوات...", + "channels-fetch-error": "فشل جلب القنوات. يرجى التحقق من بيانات الاعتماد الخاصة بك.", + "behavior-settings": "إعدادات السلوك", "authentication_required": { - "label": "Require Authentication", - "notice": "Slack triggers require authentication to verify webhook signatures (Slack Signing Secret required). Verify webhook endpoint at https://api.slack.com/apps to activate trigger." + "label": "اشتراط المصادقة", + "notice": "تتطلب مشغلات Slack المصادقة للتحقق من توقيعات الويب هوك (مطلوب Slack Signing Secret). تحقّق من نقطة نهاية الويب هوك على https://api.slack.com/apps لتفعيل المشغّل." }, "bot_token": { - "label": "Slack Bot Token", + "label": "رمز Slack Bot", "placeholder": "xoxb-...", - "notice": "Your Slack Bot User OAuth Token (starts with xoxb-)" + "notice": "رمز OAuth الخاص بمستخدم Slack Bot (يبدأ بـ xoxb-)" }, "signing_secret": { - "label": "Slack Signing Secret", - "placeholder": "Enter your Slack signing secret...", - "notice": "Your Slack app's signing secret used to verify requests" + "label": "سر توقيع Slack", + "placeholder": "أدخل سر توقيع Slack الخاص بك...", + "notice": "سر التوقيع لتطبيق Slack الخاص بك والمستخدم للتحقق من الطلبات" }, "events": { "label": "Event Types", - "notice": "Select which Slack events should trigger this workflow" + "notice": "اختر أحداث Slack التي يجب أن تُفعِّل هذه العملية" }, "channel_id": { "label": "Channel ID", - "placeholder": "Select a channel...", - "notice": "Specific channel to watch (leave empty to watch all channels)" + "placeholder": "اختر قناة...", + "notice": "القناة المحددة التي ستتم مراقبتها (اتركه فارغًا لمراقبة جميع القنوات)" }, "ignore_bot_messages": { - "label": "Ignore Bot Messages" + "label": "تجاهل رسائل البوت" }, "ignore_users": { - "label": "Ignore Users", - "placeholder": "Enter Slack user IDs (e.g., U1234567890)...", - "notice": "Slack user IDs to ignore messages from" + "label": "تجاهل المستخدمين", + "placeholder": "أدخل معرّفات مستخدمي Slack (مثل U1234567890)...", + "notice": "معرّفات مستخدمي Slack التي سيتم تجاهل الرسائل القادمة منها" } }, - "verification-required": "Pending Verification. A valid event message is required for Trigger Activation or disable trigger Authentication.", + "verification-required": "التحقق قيد الانتظار. يلزم وجود رسالة حدث صالحة لتفعيل المشغّل أو تعطيل مصادقة المشغّل.", "base": { "authentication_required": { "label": "المصادقة مطلوبة", @@ -309,34 +309,36 @@ }, "webhook": { "authentication_required": { - "label": "Require Authentication", - "notice": "Whether authentication is required for this webhook trigger" + "label": "اشتراط المصادقة", + "notice": "ما إذا كانت المصادقة مطلوبة لهذا المشغّل الويب هوك" }, "body_contains": { - "label": "Body Contains", - "placeholder": "Enter text that must be in request body...", - "notice": "Only trigger if the request body contains this string" + "label": "يحتوي الجسم على", + "placeholder": "أدخل النص الذي يجب أن يكون موجودًا في نص الطلب...", + "notice": "فعِّل فقط إذا كان نص الطلب يحتوي على هذه السلسلة" }, "required_headers": { - "label": "Required Headers", - "placeholder": "Enter header names (e.g., Content-Type, Authorization)...", - "notice": "List of HTTP headers that must be present in the request" + "label": "الترويسات المطلوبة", + "placeholder": "أدخل أسماء الترويسات (مثل Content-Type, Authorization)...", + "notice": "قائمة ترويسات HTTP التي يجب أن تكون موجودة في الطلب" }, "header_match": { - "label": "Header Match (Regex)", - "placeholder": "Header-Name: regex pattern", - "notice": "Match request headers against a regex pattern (format: Header-Name: pattern)" + "label": "مطابقة الترويسة (Regex)", + "placeholder": "Header-Name: نمط regex", + "notice": "طابق ترويسات الطلب مع نمط regex (الصيغة: Header-Name: pattern)" }, "include_headers": { - "label": "Include Headers", - "notice": "Include request headers in the workflow execution input" + "label": "تضمين الترويسات", + "notice": "تضمين ترويسات الطلب في إدخال تنفيذ سير العمل" }, "include_query_params": { - "label": "Include Query Parameters" + "label": "تضمين معاملات الاستعلام" }, "include_request_metadata": { - "label": "Include Request Metadata", - "notice": "Include request metadata (method, URL, client IP) in execution input" + "label": "تضمين بيانات تعريف الطلب", + "notice": "تضمين بيانات تعريف الطلب (الطريقة، الرابط، عنوان IP للعميل) في إدخال التنفيذ" } - } + }, + "status-cancelled": "Cancelled", + "select-method": "اختر الطريقة" } diff --git a/src/i18n/locales/de/chat.json b/src/i18n/locales/de/chat.json index fecf7364c..4328d818a 100644 --- a/src/i18n/locales/de/chat.json +++ b/src/i18n/locales/de/chat.json @@ -91,5 +91,7 @@ "input-attach-manage-connectors": "Connectors verwalten", "input-attach-open-browser": "Browser öffnen", "input-attach-manage-browsers": "Browser verwalten", - "input-attach-menu-trigger": "Dateien oder Fotos hinzufügen oder Skills, Connectors oder Browser über das Menü öffnen" + "input-attach-menu-trigger": "Dateien oder Fotos hinzufügen oder Skills, Connectors oder Browser über das Menü öffnen", + "hide-file-sidebar": "Datei-Seitenleiste ausblenden", + "show-file-sidebar": "Datei-Seitenleiste anzeigen" } diff --git a/src/i18n/locales/de/dashboard.json b/src/i18n/locales/de/dashboard.json index b31f92fcf..5853cfbda 100644 --- a/src/i18n/locales/de/dashboard.json +++ b/src/i18n/locales/de/dashboard.json @@ -23,5 +23,7 @@ "document-agent": "Dokument-Agent", "multi-modal-agent": "Multi-Modal-Agent", "social-media-agent": "Social-Media-Agent", - "no-projects-found": "Keine Projekte gefunden." + "no-projects-found": "Keine Projekte gefunden.", + "no-projects-match-search": "Keine Projekte entsprechen Ihrer Suche", + "try-different-search": "Versuchen Sie eine andere Suche" } diff --git a/src/i18n/locales/de/folder.json b/src/i18n/locales/de/folder.json new file mode 100644 index 000000000..c850cdc51 --- /dev/null +++ b/src/i18n/locales/de/folder.json @@ -0,0 +1,8 @@ +{ + "file-path-remote-root": "Remote", + "files-scope-all": "All files", + "files-scope-new": "New files", + "file-path-breadcrumb": "File path", + "download-file": "Datei herunterladen", + "zip-file-is-not-supported-yet": "ZIP-Vorschau wird noch nicht unterstützt." +} diff --git a/src/i18n/locales/de/index.ts b/src/i18n/locales/de/index.ts index efa753446..4e23f35ac 100644 --- a/src/i18n/locales/de/index.ts +++ b/src/i18n/locales/de/index.ts @@ -15,6 +15,7 @@ import agents from './agents.json'; import chat from './chat.json'; import dashboard from './dashboard.json'; +import folder from './folder.json'; import layout from './layout.json'; import setting from './setting.json'; import triggers from './triggers.json'; @@ -24,6 +25,7 @@ export default { agents, layout, dashboard, + folder, workforce, chat, setting, diff --git a/src/i18n/locales/de/layout.json b/src/i18n/locales/de/layout.json index 5116fe990..4ad7cfacd 100644 --- a/src/i18n/locales/de/layout.json +++ b/src/i18n/locales/de/layout.json @@ -307,5 +307,65 @@ "cookie-count": "{{count}} Cookies", "add-new-mcp": "Neuen MCP hinzufügen", "browse-mcps": "MCPs durchsuchen", - "browser-settings": "Browsereinstellungen" + "browser-settings": "Browsereinstellungen", + "report-bug-dialog-title": "Einen Fehler melden", + "report-bug-footer-hint": "Wir speichern ein ZIP mit App-Protokollen und öffnen dann Ihre E-Mail-App. Hängen Sie das gespeicherte ZIP vor dem Senden an die Nachricht an.", + "report-bug-field-description": "Was ist schiefgelaufen?", + "report-bug-field-description-placeholder": "Beschreiben Sie das Problem…", + "report-bug-field-steps": "Schritte zum Reproduzieren (optional)", + "report-bug-field-steps-placeholder": "1. … 2. …", + "report-bug-meta": "Version {{version}} · {{os}} ({{arch}})", + "report-bug-description-required": "Bitte beschreiben Sie, was schiefgelaufen ist.", + "report-bug-submit": "Diagnosedaten speichern und E-Mail öffnen", + "report-bug-diagnostics-saved": "Diagnosedaten gespeichert. Hängen Sie das ZIP in Ihrer E-Mail an und senden Sie es dann ab.", + "report-bug-mail-subject": "[Eigent] Fehlerbericht", + "report-bug-mail-body-intro": "Bitte hängen Sie die gerade gespeicherte ZIP-Datei mit den Diagnosedaten an diese Nachricht an.", + "report-bug-mail-body-path": "ZIP gespeichert unter: {{path}}", + "report-bug-mail-body-meta": "App-Version: {{version}} | OS: {{os}} ({{arch}})", + "report-bug-mail-body-desc": "Beschreibung:", + "report-bug-mail-body-steps": "Schritte zum Reproduzieren:", + "report-bug-mail-body-truncated": "Der Text der E-Mail wurde aufgrund von Längenbeschränkungen gekürzt. Den vollständigen Text finden Sie in bug_report.txt innerhalb des ZIPs.", + "project-page-tab-project": "Project", + "project-page-tab-tasks": "Tasks", + "project-page-all-tasks": "All tasks", + "project-page-status-pending": "Pending", + "no-tasks": "No tasks", + "workspace-select-project": "Ein Projekt auswählen", + "workspace-cowork-single-agent": "Mit Single Agent zusammenarbeiten", + "workspace-cowork-workforce": "Mit Workforce zusammenarbeiten", + "execution-context": "Ausführungskontext", + "no-results": "No results", + "notification-panel-dismiss": "Dismiss", + "instructions": "Anweisungen", + "instructions-rules-tone": "Regeln & Ton", + "memory": "Memory", + "memory-on": "On", + "memory-off": "Off", + "workforce-setting": "Workforce-Einstellung", + "select": "Select", + "edit-instructions": "Anweisungen bearbeiten", + "sessions-start-new": "Neue Sitzung starten", + "sessions-full-title": "Alle Sitzungen", + "sessions-create-task-hint": "Erstellen Sie eine Aufgabe, um eine Sitzung zu starten", + "workforce-progress": "Progress", + "workforce-agent-folder": "Agentenordner", + "workforce-agent-pool": "Agent Pool", + "expand-project-sidebar": "Seitenleiste erweitern", + "fold-project-sidebar": "Seitenleiste einklappen", + "update": "Update", + "workspace-start-from-scratch": "Von Grund auf neu starten", + "workspace-project-submenu": "Project", + "workspace-recent-session-now": "Now", + "workspace-recent-session-minutes": "{{count}} Min.", + "workspace-recent-session-hours": "{{count}}h", + "workspace-recent-session-days": "{{count}}d", + "workspace-recent-sessions-heading": "Recent", + "workspace-session-mode-label": "Sitzungsmodus", + "workspace-session-mode-cycle-hint": "Klicken, um den Sitzungsmodus zu wechseln", + "failed-to-start-task": "Aufgabe konnte nicht gestartet werden. Bitte überprüfen Sie Ihre Modellkonfiguration.", + "workspace-work-with-panel-hide": "Bereich „Work with“ ausblenden", + "workspace-work-with-panel-show": "Bereich „Work with“ anzeigen", + "workspace-work-with-dismiss-overlay": "Dismiss", + "workspace-work-with-title": "Work with", + "workspace-work-with-remote-control": "Fernsteuerung" } diff --git a/src/i18n/locales/de/setting.json b/src/i18n/locales/de/setting.json index fc3b1e410..2d624c4e5 100644 --- a/src/i18n/locales/de/setting.json +++ b/src/i18n/locales/de/setting.json @@ -17,83 +17,6 @@ "eigent-cloud": "Eigent Cloud", "default": "Standard", "profile": "Profil", - "account": "Konto", - "you-are-currently-signed-in-with": "Sie sind derzeit angemeldet mit {{email}}", - "manage": "Verwalten", - "log-out": "Abmelden", - "language": "Sprache", - "select-language": "Sprache auswählen", - "system-default": "Systemstandard", - "appearance": "Erscheinungsbild", - "dark": "Dunkel", - "light": "Hell", - "transparent": "Transparent", - - "workspace-main-background": "Arbeitsbereich-Hintergrund", - "workspace-main-background-description": "Nur für die Hauptbereiche von Workforce und Session.", - "workspace-main-background-empty": "Leer", - "workspace-main-background-dots": "Punktmuster", - "workspace-main-background-blocks": "Raster", - "workspace-main-background-ruled": "Liniert", - "workspace-main-background-dotted": "Gestrichelte Linien", - "workspace-main-background-dashed": "Strichlinien", - - "appearance-tab": "Darstellung", - "color-mode": "Farbmodus", - "accent-palette": "Akzentfarben", - "accent-palette-description": "Vordefinierte Farbthemen für die Oberfläche. Getrennt gespeichert für Hell- und Dunkelmodus.", - "accent-for-light": "Hellmodus", - "accent-for-dark": "Dunkelmodus", - - "data-privacy": "Datenschutz", - "data-privacy-description": "Eigent basiert auf einem Local-First-Prinzip, um Ihre Privatsphäre zu gewährleisten. Ihre Daten verbleiben standardmäßig auf Ihrem Gerät. Cloud-Funktionen sind optional und verwenden nur die minimal erforderlichen Daten, um zu funktionieren. Für vollständige Details besuchen Sie bitte unsere", - "privacy-policy": "Datenschutzrichtlinie", - "how-we-handle-your-data": "Wie wir Ihre Daten behandeln", - "we-only-use-the-essential-data-needed-to-run-your-tasks": "Wir verwenden nur die für die Ausführung Ihrer Aufgaben erforderlichen Daten", - "how-we-handle-your-data-line-1": "Wir verwenden nur die für die Ausführung Ihrer Aufgaben erforderlichen Daten", - "how-we-handle-your-data-line-1-line-1": "Eigent kann Screenshots erfassen, um UI-Elemente zu analysieren, Text zu lesen und die nächste Aktion zu bestimmen, genau wie Sie es tun würden.", - "how-we-handle-your-data-line-1-line-2": "Eigent kann Ihre Maus und Tastatur verwenden, um auf von Ihnen angegebene lokale Software und Dateien zuzugreifen.", - "how-we-handle-your-data-line-1-line-3": "Nur minimale Aufgabendaten werden an KI-Modellanbieter oder von Ihnen aktivierte Drittanbieter-Integrationen gesendet; wir speichern keine Daten.", - "how-we-handle-your-data-line-2": "Aufgabendateien, Ausgaben und Screenshots verbleiben lokal in Ihrem angegebenen Aufgabenordner.", - "how-we-handle-your-data-line-3": "Anmeldeinformationen werden lokal, verschlüsselt gespeichert und nur für genehmigte Schritte verwendet.", - "how-we-handle-your-data-line-4": "Ihre Daten werden ohne Ihre ausdrückliche Zustimmung niemals zum Trainieren unserer KI-Modelle verwendet.", - "how-we-handle-your-data-line-5": "Wir verkaufen Ihre Daten nicht an Dritte.", - "api-key-can-not-be-empty": "API-Schlüssel darf nicht leer sein!", - "api-host-can-not-be-empty": "API-Host darf nicht leer sein!", - "model-type-can-not-be-empty": "Modelltyp darf nicht leer sein!", - "validate-success": "Validierung erfolgreich", - "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "Das Modell wurde verifiziert und unterstützt Function Calling, was für die Verwendung von Eigent erforderlich ist.", - "validate-failed": "Validierung fehlgeschlagen", - "copy": "Kopieren", - "copied-to-clipboard": "In die Zwischenablage kopiert", - "failed-to-copy-to-clipboard": "Kopieren in die Zwischenablage fehlgeschlagen", - "endpoint-url-can-not-be-empty": "Endpunkt-URL darf nicht leer sein!", - "verification-failed-please-check-endpoint-url": "Verifizierung fehlgeschlagen, bitte überprüfen Sie die Endpunkt-URL", - "eigent-cloud-version": "Eigent Cloud-Version", - "you-are-currently-subscribed-to-the": "Sie sind derzeit abonniert für das", - "discover-more-about-our": "Entdecken Sie mehr über unsere", - "pricing-options": "Preismodelle", - "credits": "Credits", - "select-model-type": "Modelltyp auswählen", - "custom-model": "Benutzerdefiniertes Modell", - "use-your-own-api-keys-or-set-up-a-local-model": "Verwenden Sie Ihre eigenen API-Schlüssel oder richten Sie ein lokales Modell ein.", - "verify": "Überprüfen", - "local-model": "Lokales Modell", - "model-platform": "Modellplattform", - "model-endpoint-url": "Modell-Endpunkt-URL", - "model-type": "Modelltyp", - "enter-your-local-model-type": "Geben Sie Ihren lokalen Modelltyp ein", - "you-are-on-selft-host-mode": "Sie befinden sich im Self-Host-Modus", - "you-are-using-self-hosted-mode": "Sie verwenden den Self-hosted-Modus. Um die beste Leistung dieses Produkts zu erzielen, geben Sie bitte den Google Search Key unter „MCP und Tools“ ein, um sicherzustellen, dass Eigent ordnungsgemäß funktioniert.", - "the-google-search-key-is-essential-for-delivering-accurate-search-results": "Der Google Search Key ist unerlässlich für die Bereitstellung genauer Suchergebnisse. Der Exa Search Key ist optional, aber für eine bessere Leistung sehr empfehlenswert.", - "close": "Schließen", - "enter-your-api-key": "Geben Sie Ihren API-", - "key": "Schlüssel ein", - "enter-your-api-host": "Geben Sie Ihren API-Host ein", - "url": "URL", - "enter-your-model-type": "Geben Sie Ihren Modelltyp ein", - "verifying": "Wird überprüft...", - "account": "Konto", "you-are-currently-signed-in-with": "Sie sind derzeit angemeldet mit {{email}}", "manage": "Verwalten", @@ -105,7 +28,6 @@ "dark": "Dunkel", "light": "Hell", "transparent": "Transparent", - "workspace-main-background": "Arbeitsbereich-Hintergrund", "workspace-main-background-description": "Nur für die Hauptbereiche von Workforce und Session.", "workspace-main-background-empty": "Leer", @@ -114,14 +36,12 @@ "workspace-main-background-ruled": "Liniert", "workspace-main-background-dotted": "Gestrichelte Linien", "workspace-main-background-dashed": "Strichlinien", - "appearance-tab": "Darstellung", "color-mode": "Farbmodus", "accent-palette": "Akzentfarben", "accent-palette-description": "Vordefinierte Farbthemen für die Oberfläche. Getrennt gespeichert für Hell- und Dunkelmodus.", "accent-for-light": "Hellmodus", "accent-for-dark": "Dunkelmodus", - "data-privacy": "Datenschutz", "data-privacy-description": "Eigent basiert auf einem Local-First-Prinzip, um Ihre Privatsphäre zu gewährleisten. Ihre Daten verbleiben standardmäßig auf Ihrem Gerät. Cloud-Funktionen sind optional und verwenden nur die minimal erforderlichen Daten, um zu funktionieren. Für vollständige Details besuchen Sie bitte unsere", "privacy-policy": "Datenschutzrichtlinie", @@ -143,6 +63,7 @@ "validate-failed": "Validierung fehlgeschlagen", "copy": "Kopieren", "copied-to-clipboard": "In die Zwischenablage kopiert", + "failed-to-copy-to-clipboard": "Kopieren in die Zwischenablage fehlgeschlagen", "endpoint-url-can-not-be-empty": "Endpunkt-URL darf nicht leer sein!", "verification-failed-please-check-endpoint-url": "Verifizierung fehlgeschlagen, bitte überprüfen Sie die Endpunkt-URL", "eigent-cloud-version": "Eigent Cloud-Version", @@ -169,7 +90,6 @@ "url": "URL", "enter-your-model-type": "Geben Sie Ihren Modelltyp ein", "verifying": "Wird überprüft...", - "mcp-and-tools": "MCP & Tools", "add-mcp-server": "MCP-Server hinzufügen", "market": "Markt", @@ -225,7 +145,7 @@ "notion-workspace-integration": "Notion-Arbeitsbereich-Integration zum Lesen und Verwalten von Notion-Seiten", "google-calendar-integration": "Google Calendar-Integration zum Verwalten von Ereignissen und Zeitplänen", "mcp-server-already-exists": "MCP-Server \"{{name}}\" existiert bereits", - "google-search": "Google Search", + "google-search": "Google Suche", "select-default-search-engine": "Standard-Suchmaschine auswählen", "your-own-mcps": "Ihre eigenen MCPs", "get-google-search-api": "Google Search API erhalten", @@ -252,7 +172,6 @@ "reset-success": "Zurücksetzen erfolgreich!", "reset-failed": "Zurücksetzen fehlgeschlagen!", "select-default-model": "Standardmodell auswählen", - "browser-login": "Browser-Anmeldung", "browser-login-description": "Öffnen Sie Chrome, um sich bei Ihren Konten anzumelden. Ihre Anmeldedaten werden lokal in einem sicheren Profil gespeichert.", "open-browser-login": "Browser zur Anmeldung öffnen", @@ -277,7 +196,6 @@ "confirm-delete-all-cookies": "Alle Cookies wirklich löschen? Dies kann nicht rückgängig gemacht werden.", "all-cookies-deleted": "Alle Cookies wurden erfolgreich gelöscht.", "cookie-delete-warning": "Hinweis: Beim Löschen von Cookies werden Sie von den betreffenden Websites abgemeldet. Möglicherweise müssen Sie den Browser neu starten.", - "network-proxy": "Netzwerk-Proxy", "network-proxy-description": "Konfigurieren Sie einen Proxy-Server für Netzwerkanfragen. Dies ist nützlich, wenn Sie über einen Proxy auf externe APIs zugreifen müssen.", "proxy-placeholder": "http://127.0.0.1:7890", @@ -285,7 +203,6 @@ "proxy-save-failed": "Proxy-Konfiguration konnte nicht gespeichert werden.", "proxy-invalid-url": "Ungültige Proxy-URL. Muss mit http://, https://, socks4:// oder socks5:// beginnen.", "proxy-restart-hint": "Neustart erforderlich, um Proxy-Änderungen anzuwenden.", - "cloud-not-available-in-local-proxy": "Cloud-Version ist im lokalen Proxy-Modus nicht verfügbar", "set-as-default": "Als Standard festlegen", "api-key-setting": "API-Schlüssel-Einstellung", @@ -293,14 +210,12 @@ "model-type-setting": "Modelltyp-Einstellung", "please-select": "Bitte auswählen", "configuring": "Wird konfiguriert...", - "models-default-setting-title": "Standard-Einstellung", "models-default-setting-description": "Wähle eines deiner konfigurierten Modelle als Standardmodell für Eigent. Es wird global in deinem Arbeitsbereich angewendet.", "models-configuration": "Konfiguration", - - "gemini-3-pro-preview-name": "Gemini 3 Pro Preview", + "gemini-3-pro-preview-name": "Gemini 3 Pro Vorschau", "gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview", - "gemini-3-flash-preview-name": "Gemini 3 Flash Preview", + "gemini-3-flash-preview-name": "Gemini 3 Flash Vorschau", "gpt-5.4-name": "GPT-5.4", "gpt-5.5-name": "GPT-5.5", "gpt-5-mini-name": "GPT-5 Mini", @@ -311,11 +226,15 @@ "claude-opus-4-7-name": "Claude Opus 4.7", "deepseek-v4-pro-name": "DeepSeek V4 Pro", "minimax-m2-7-name": "Minimax M2.7", - "preferred-ide": "Bevorzugte IDE", "preferred-ide-description": "Wählen Sie die Anwendung aus, die beim Öffnen von Agent-Projektordnern verwendet werden soll.", "system-file-manager": "System-Dateimanager", "agents": "Agenten", "help-improve-eigent": "Helfen Sie, Eigent zu verbessern", - "help-improve-eigent-description": "Erlauben Sie Eigent, anonyme Fehlerprotokolle und Nutzungsdaten zu sammeln, um den Dienst zu verbessern. Dies ist optional und kann jederzeit geändert werden." + "help-improve-eigent-description": "Erlauben Sie Eigent, anonyme Fehlerprotokolle und Nutzungsdaten zu sammeln, um den Dienst zu verbessern. Dies ist optional und kann jederzeit geändert werden.", + "please-complete-authorization-in-browser": "Bitte schließen Sie die Autorisierung in Ihrem Browser ab", + "authorization-cancelled": "Autorisierung abgebrochen", + "authorization-failed": "Autorisierung fehlgeschlagen", + "this-service-is-already-enabled-by-default": "Dieser Dienst ist standardmäßig bereits aktiviert", + "version": "Version" } diff --git a/src/i18n/locales/de/triggers.json b/src/i18n/locales/de/triggers.json index 1f3ef165c..a3a02c781 100644 --- a/src/i18n/locales/de/triggers.json +++ b/src/i18n/locales/de/triggers.json @@ -2,19 +2,19 @@ "name": "Name", "description": "Description", "trigger-type": "Type", - "create-new": "Create New Trigger", - "trigger-details": "Trigger Details", - "no-trigger-selected": "No Trigger Selected", - "select-trigger-hint": "Click on a trigger from the list to view its details", - "no-triggers": "No triggers yet", - "name-placeholder": "Enter trigger name", - "description-placeholder": "Enter trigger description", + "create-new": "Neuen Trigger erstellen", + "trigger-details": "Triggerdetails", + "no-trigger-selected": "Kein Trigger ausgewählt", + "select-trigger-hint": "Klicken Sie in der Liste auf einen Trigger, um seine Details anzuzeigen", + "no-triggers": "Noch keine Trigger", + "name-placeholder": "Triggernamen eingeben", + "description-placeholder": "Triggerbeschreibung eingeben", "schedule-trigger": "Schedule", "webhook-trigger": "Webhook", "slack-trigger": "Slack", "app-trigger": "App Trigger", - "cron-expression": "Cron Expression", - "cron-help": "Format: minute hour day month weekday (e.g., 0 */1 * * * = every hour)", + "cron-expression": "Cron-Ausdruck", + "cron-help": "Format: Minute Stunde Tag Monat Wochentag (z. B. 0 */1 * * * = jede Stunde)", "cron-empty": "Cron-Ausdruck darf nicht leer sein", "cron-invalid-format": "Ungültiges Cron-Format. Erwartet: Minute Stunde Tag Monat Wochentag (z.B. 0 */1 * * *)", "cron-invalid-minute": "Ungültiger Minutenwert. Muss 0-59 oder gültiger Cron-Ausdruck sein", @@ -22,23 +22,23 @@ "cron-invalid-day": "Ungültiger Tageswert. Muss 1-31 oder gültiger Cron-Ausdruck sein", "cron-invalid-month": "Ungültiger Monatswert. Muss 1-12 oder gültiger Cron-Ausdruck sein", "cron-invalid-weekday": "Ungültiger Wochentagwert. Muss 0-6 (0=Sonntag) oder gültiger Cron-Ausdruck sein", - "listener-type": "Listener Type", - "select-listener": "Select listener type", + "listener-type": "Listener-Typ", + "select-listener": "Listener-Typ auswählen", "chat-agent": "Chat Agent", "workforce": "Workforce", "agent-model": "Agent Model", "task-prompt": "Task Prompt", - "task-prompt-placeholder": "Enter the task prompt for this trigger", - "max-per-hour": "Max Per Hour", + "task-prompt-placeholder": "Geben Sie die Aufgabenaufforderung für diesen Trigger ein", + "max-per-hour": "Max. pro Stunde", "max-per-day": "Max Per Day", - "single-execution": "Single Execution", + "single-execution": "Einzelausführung", "webhook-url": "Webhook URL", "executions": "Executions", "errors": "Errors", "view-runs": "View Runs", "activate": "Activate", "deactivate": "Deactivate", - "execution-id": "Execution ID", + "execution-id": "Ausführungs-ID", "started": "Started", "duration": "Duration", "tokens": "Tokens", @@ -46,29 +46,29 @@ "failed": "Failed", "running": "Running", "pending": "Pending", - "no-executions": "No executions found", - "executions-for": "Executions for", - "name-required": "Trigger name is required", - "created-successfully": "Trigger created successfully", - "failed-to-create": "Failed to create trigger", - "failed-to-load": "Failed to load triggers", - "activated": "Trigger activated", - "deactivated": "Trigger deactivated", - "failed-to-toggle": "Failed to toggle trigger status", - "webhook-created-title": "Webhook Created Successfully", - "webhook-created-subtitle": "Your new webhook trigger is ready to receive requests", - "webhook-ready": "Webhook Ready!", - "webhook-instructions": "Use the URL below to trigger this agent. Send a request with any JSON body.", - "your-webhook-url": "Your Webhook URL", - "webhook-tip-title": "Did you know?", - "webhook-tip-description": "You can include custom data in your JSON payload and reference it in your task prompt using {{variable_name}}.", - "webhook-url-copied": "Webhook URL copied to clipboard", - "confirm-delete": "Are you sure you want to delete this trigger?", - "deleted": "Trigger deleted", - "failed-to-delete": "Failed to delete trigger", - "webhook-copied": "Webhook URL copied to clipboard", - "failed-to-copy": "Failed to copy webhook URL", - "trigger-task": "Trigger Task", + "no-executions": "Keine Ausführungen gefunden", + "executions-for": "Ausführungen für", + "name-required": "Triggername ist erforderlich", + "created-successfully": "Trigger erfolgreich erstellt", + "failed-to-create": "Trigger konnte nicht erstellt werden", + "failed-to-load": "Trigger konnten nicht geladen werden", + "activated": "Trigger aktiviert", + "deactivated": "Trigger deaktiviert", + "failed-to-toggle": "Triggerstatus konnte nicht geändert werden", + "webhook-created-title": "Webhook erfolgreich erstellt", + "webhook-created-subtitle": "Ihr neuer Webhook-Trigger ist bereit, Anfragen zu empfangen", + "webhook-ready": "Webhook bereit!", + "webhook-instructions": "Verwenden Sie die untenstehende URL, um diesen Agenten auszulösen. Senden Sie eine Anfrage mit einem beliebigen JSON-Body.", + "your-webhook-url": "Ihre Webhook-URL", + "webhook-tip-title": "Wussten Sie schon?", + "webhook-tip-description": "Sie können benutzerdefinierte Daten in Ihre JSON-Nutzlast einfügen und in Ihrer Aufgabenaufforderung mit {{variable_name}} darauf verweisen.", + "webhook-url-copied": "Webhook-URL in die Zwischenablage kopiert", + "confirm-delete": "Sind Sie sicher, dass Sie diesen Trigger löschen möchten?", + "deleted": "Trigger gelöscht", + "failed-to-delete": "Trigger konnte nicht gelöscht werden", + "webhook-copied": "Webhook-URL in die Zwischenablage kopiert", + "failed-to-copy": "Webhook-URL konnte nicht kopiert werden", + "trigger-task": "Aufgabe auslösen", "task-mode-text": "Text", "task-mode-json": "JSON", "schedule-frequency": "Frequency", @@ -81,44 +81,44 @@ "weekday-thursday": "Thursday", "weekday-friday": "Friday", "weekday-saturday": "Saturday", - "webhook-function": "Webhook Function", + "webhook-function": "Webhook-Funktion", "frequency-hourly": "Every Hour", "frequency-daily": "Daily", "frequency-weekly": "Weekly", "frequency-monthly": "Monthly", "frequency-one-time": "One Time", "frequency-custom": "Custom", - "invalid-time-format": "Invalid time format. Use HH:MM (e.g., 09:30)", - "schedule-day-of-month-note": "If the selected day doesn’t exist in that month (e.g., the 31st), the task will be skipped.", + "invalid-time-format": "Ungültiges Zeitformat. Verwenden Sie HH:MM (z. B. 09:30)", + "schedule-day-of-month-note": "Wenn der ausgewählte Tag in diesem Monat nicht existiert (z. B. der 31.), wird die Aufgabe übersprungen.", "schedule-hour": "Stunde", "schedule-minute": "Minute", "schedule-date": "Date", "select-date": "Select date", - "schedule-day-of-month": "Day of Month", + "schedule-day-of-month": "Tag des Monats", "select-day": "Select day", "day-of-month": "Day {{day}}", - "schedule-weekdays": "Days of Week", - "expiration-date": "Expiration Date", - "no-expiration": "No expiration", - "select-expiration": "Select expiration date", - "no-upcoming-one-time": "Select a future date and time", - "no-upcoming-executions": "No upcoming executions", - "date-required": "Date is required", - "weekday-required": "At least one weekday is required", - "schedule-required-fields": "Please fill in all required fields for the schedule", - "create-trigger-agent": "Automate task with trigger", - "trigger-overview": "Trigger Overview", + "schedule-weekdays": "Wochentage", + "expiration-date": "Ablaufdatum", + "no-expiration": "Kein Ablaufdatum", + "select-expiration": "Ablaufdatum auswählen", + "no-upcoming-one-time": "Wählen Sie ein zukünftiges Datum und eine Uhrzeit aus", + "no-upcoming-executions": "Keine bevorstehenden Ausführungen", + "date-required": "Datum ist erforderlich", + "weekday-required": "Mindestens ein Wochentag ist erforderlich", + "schedule-required-fields": "Bitte füllen Sie alle erforderlichen Felder für den Zeitplan aus", + "create-trigger-agent": "Aufgabe mit Trigger automatisieren", + "trigger-overview": "Trigger-Übersicht", "edit": "Edit", "delete": "Delete", "period": "Period", "created-at": "Created At", - "execution-history": "Execution History", + "execution-history": "Ausführungsverlauf", "run-time": "Run Time", "success": "Success", - "output-tasks": "Output Tasks", + "output-tasks": "Ausgabeaufgaben", "logs": "Logs", "close": "Close", - "confirm-delete-trigger": "Are you sure you want to delete this trigger?", + "confirm-delete-trigger": "Möchten Sie diesen Trigger wirklich löschen?", "status": { "active": "Active", "inactive": "Inactive", @@ -126,66 +126,66 @@ "completed": "Completed", "unknown": "Unknown" }, - "webhook-url-after-creation": "You can find your webhook URL in the trigger details after creation.", - "webhook-method": "Request Method", - "created-time": "Created Time", - "last-execution-label": "Last Execution", + "webhook-url-after-creation": "Sie finden Ihre Webhook-URL nach der Erstellung in den Trigger-Details.", + "webhook-method": "Anfragemethode", + "created-time": "Erstellungszeit", + "last-execution-label": "Letzte Ausführung", "token-cost": "Token Cost", - "updated-successfully": "Trigger updated successfully", + "updated-successfully": "Trigger erfolgreich aktualisiert", "title": "Triggers", - "create-hint": "Create a trigger to automate your tasks", - "live-activity": "Live Activity", - "no-activity": "No activity yet", - "activity-hint": "Activity will appear here", - "execution-logs": "Execution Logs", + "create-hint": "Erstellen Sie einen Trigger, um Ihre Aufgaben zu automatisieren", + "live-activity": "Live-Aktivität", + "no-activity": "Noch keine Aktivität", + "activity-hint": "Aktivitäten werden hier angezeigt", + "execution-logs": "Ausführungsprotokolle", "fold-execution-logs": "Ausführungsprotokolle einklappen", "open-execution-logs": "Ausführungsprotokolle öffnen", - "delete-trigger": "Delete Trigger", + "delete-trigger": "Trigger löschen", "cancel": "Cancel", "deleting": "Deleting...", - "duplicated-successfully": "Trigger duplicated as \"{{name}}\"", - "confirm-delete-message": "Are you sure you want to delete \"{{name}}\"? This action cannot be undone.", + "duplicated-successfully": "Trigger als \"{{name}}\" dupliziert", + "confirm-delete-message": "Möchten Sie \"{{name}}\" wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.", "workspace": "Workspace", - "agent-folder": "Agent Folder", + "agent-folder": "Agentenordner", "add": "Add", "upload": "Upload", "create": "Create", "loading": "Loading...", - "loading-executions": "Loading execution data...", - "failed-to-load-executions": "Failed to load execution data", - "no-execution-data": "No execution data available", + "loading-executions": "Ausführungsdaten werden geladen...", + "failed-to-load-executions": "Ausführungsdaten konnten nicht geladen werden", + "no-execution-data": "Keine Ausführungsdaten verfügbar", "total-runs": "Total Runs", - "success-rate": "Success Rate", - "no-executions-yet": "No executions yet", + "success-rate": "Erfolgsrate", + "no-executions-yet": "Noch keine Ausführungen", "last-run-label": "Last run", - "execution-completed-success": "Execution completed successfully", - "execution-failed-message": "Execution failed", - "execution-in-progress": "Execution in progress...", - "waiting-to-execute": "Waiting to execute...", - "execution-cancelled": "Execution was cancelled", - "execution-missed": "Execution was missed", - "unknown-status": "Unknown status", + "execution-completed-success": "Ausführung erfolgreich abgeschlossen", + "execution-failed-message": "Ausführung fehlgeschlagen", + "execution-in-progress": "Ausführung läuft...", + "waiting-to-execute": "Warten auf Ausführung...", + "execution-cancelled": "Ausführung wurde abgebrochen", + "execution-missed": "Ausführung wurde verpasst", + "unknown-status": "Unbekannter Status", "trigger-label": "Trigger", "status-created": "Created", "status-updated": "Updated", "status-activated": "Activated", "status-deleted": "Deleted", "status-deactivated": "Deactivated", - "status-execution-started": "Execution started", - "status-execution-completed": "Execution completed", + "status-execution-started": "Ausführung gestartet", + "status-execution-completed": "Ausführung abgeschlossen", "status-error": "Error", - "status-webhook-triggered": "Webhook triggered", + "status-webhook-triggered": "Webhook ausgelöst", "status-activity": "Activity", - "upcoming-executions": "Upcoming Executions", + "upcoming-executions": "Anstehende Ausführungen", "preview-scheduled-times": "Vorschau Geplanter Zeiten", - "task-prompt-required": "Task prompt is required", - "project-id-required": "Project ID is required", - "execution-settings": "Execution Settings", - "extra-settings": "Extra Settings", + "task-prompt-required": "Aufgaben-Prompt ist erforderlich", + "project-id-required": "Projekt-ID ist erforderlich", + "execution-settings": "Ausführungseinstellungen", + "extra-settings": "Zusätzliche Einstellungen", "max-per-hour-placeholder": "0", "max-per-day-placeholder": "0", "copy": "Copy", - "edit-trigger-agent": "Edit Trigger Agent", + "edit-trigger-agent": "Trigger-Agent bearbeiten", "updating": "Updating...", "creating": "Creating...", "update": "Update", @@ -195,102 +195,102 @@ "activation-limit-reached": "Aktivierungslimit erreicht: Maximal 5 aktive Trigger pro Projekt, 25 pro Benutzer", "never": "Never", "duplicate": "Duplicate", - "no-task-prompt": "No task prompt", + "no-task-prompt": "Kein Aufgaben-Prompt", "select-app": "App auswählen", "change-app": "Change", "dynamic": { "credentials": "Credentials", - "credentials-notice": "Your credentials are stored securely and used to authenticate with the service.", - "credentials-saved": "Credentials configured successfully", - "configuration": "Configuration", - "behavior-settings": "Behavior Settings", - "enter-value": "Please enter a value", + "credentials-notice": "Ihre Anmeldedaten werden sicher gespeichert und zur Authentifizierung beim Dienst verwendet.", + "credentials-saved": "Anmeldedaten erfolgreich konfiguriert", + "configuration": "Konfiguration", + "behavior-settings": "Verhaltenseinstellungen", + "enter-value": "Bitte einen Wert eingeben", "add": "Add", "update": "Update", - "config-saved": "Configuration saved successfully", - "config-updated": "Configuration updated successfully", - "config-save-error": "Failed to save configuration", + "config-saved": "Konfiguration erfolgreich gespeichert", + "config-updated": "Konfiguration erfolgreich aktualisiert", + "config-save-error": "Konfiguration konnte nicht gespeichert werden", "loading": "Loading...", - "loading-config": "Loading configuration...", - "no-config-available": "No configuration available for this trigger type", - "failed-to-load-schema": "Failed to load configuration schema", - "select-options": "Select options...", + "loading-config": "Konfiguration wird geladen...", + "no-config-available": "Für diesen Trigger-Typ ist keine Konfiguration verfügbar", + "failed-to-load-schema": "Konfigurationsschema konnte nicht geladen werden", + "select-options": "Optionen auswählen...", "selected": "selected", - "save-credentials-first": "Save credentials first", + "save-credentials-first": "Speichern Sie zuerst die Anmeldedaten", "search": "Search...", - "no-options": "No options found", + "no-options": "Keine Optionen gefunden", "validation": { - "required": "{{field}} is required", - "invalid-regex": "Invalid regular expression pattern", - "invalid-email": "Invalid email address", - "invalid-url": "Invalid URL format", - "min-length": "Must be at least {{min}} characters", - "max-length": "Must be no more than {{max}} characters", - "pattern-mismatch": "Value does not match required pattern", - "min-value": "Must be at least {{min}}", - "max-value": "Must be no more than {{max}}" + "required": "{{field}} ist erforderlich", + "invalid-regex": "Ungültiges Muster für regulären Ausdruck", + "invalid-email": "Ungültige E-Mail-Adresse", + "invalid-url": "Ungültiges URL-Format", + "min-length": "Muss mindestens {{min}} Zeichen lang sein", + "max-length": "Darf nicht mehr als {{max}} Zeichen lang sein", + "pattern-mismatch": "Der Wert stimmt nicht mit dem erforderlichen Muster überein", + "min-value": "Muss mindestens {{min}} sein", + "max-value": "Darf nicht größer als {{max}} sein" }, - "validation-failed": "Please fix validation errors: {{errors}}" + "validation-failed": "Bitte beheben Sie die Validierungsfehler: {{errors}}" }, "slack": { - "credentials-saved": "Slack credentials configured successfully", - "enter-bot-token": "Please enter a bot token", - "bot-token-saved": "Bot token saved successfully", - "bot-token-updated": "Bot token updated successfully", - "bot-token-save-error": "Failed to save bot token", - "signing-secret-saved": "Signing secret saved successfully", - "signing-secret-updated": "Signing secret updated successfully", - "signing-secret-save-error": "Failed to save signing secret", + "credentials-saved": "Slack-Anmeldedaten erfolgreich konfiguriert", + "enter-bot-token": "Bitte geben Sie einen Bot-Token ein", + "bot-token-saved": "Bot-Token erfolgreich gespeichert", + "bot-token-updated": "Bot-Token erfolgreich aktualisiert", + "bot-token-save-error": "Bot-Token konnte nicht gespeichert werden", + "signing-secret-saved": "Signing Secret erfolgreich gespeichert", + "signing-secret-updated": "Signing Secret erfolgreich aktualisiert", + "signing-secret-save-error": "Signing Secret konnte nicht gespeichert werden", "add": "Add", "update": "Update", - "event-configuration": "Event Configuration", + "event-configuration": "Ereigniskonfiguration", "event-types": "Event Types", - "select-events": "Select events to trigger on...", - "search-events": "Search events...", - "no-events-found": "No events found", - "events-selected": "events selected", - "channel-filter": "Channel Filter", - "select-channels": "All channels (no filter)", - "search-channels": "Search channels...", - "no-channels-found": "No channels found", - "channels-selected": "channels selected", - "save-credentials-first": "Save credentials first to load channels", - "loading-channels": "Loading channels...", - "channels-fetch-error": "Failed to fetch channels. Please check your credentials.", - "behavior-settings": "Behavior Settings", + "select-events": "Zu auslösende Ereignisse auswählen...", + "search-events": "Ereignisse suchen...", + "no-events-found": "Keine Ereignisse gefunden", + "events-selected": "Ereignisse ausgewählt", + "channel-filter": "Kanalfilter", + "select-channels": "Alle Kanäle (kein Filter)", + "search-channels": "Kanäle suchen...", + "no-channels-found": "Keine Kanäle gefunden", + "channels-selected": "Kanäle ausgewählt", + "save-credentials-first": "Speichern Sie zuerst die Anmeldedaten, um Kanäle zu laden", + "loading-channels": "Kanäle werden geladen...", + "channels-fetch-error": "Kanäle konnten nicht abgerufen werden. Bitte überprüfen Sie Ihre Anmeldedaten.", + "behavior-settings": "Verhaltenseinstellungen", "authentication_required": { - "label": "Require Authentication", - "notice": "Slack triggers require authentication to verify webhook signatures (Slack Signing Secret required). Verify webhook endpoint at https://api.slack.com/apps to activate trigger." + "label": "Authentifizierung erforderlich", + "notice": "Slack-Trigger erfordern eine Authentifizierung, um Webhook-Signaturen zu verifizieren (Slack Signing Secret erforderlich). Verifizieren Sie den Webhook-Endpunkt unter https://api.slack.com/apps, um den Trigger zu aktivieren." }, "bot_token": { - "label": "Slack Bot Token", + "label": "Slack Bot-Token", "placeholder": "xoxb-...", - "notice": "Your Slack Bot User OAuth Token (starts with xoxb-)" + "notice": "Ihr Slack Bot User OAuth Token (beginnt mit xoxb-)" }, "signing_secret": { "label": "Slack Signing Secret", - "placeholder": "Enter your Slack signing secret...", - "notice": "Your Slack app's signing secret used to verify requests" + "placeholder": "Geben Sie Ihr Slack Signing Secret ein...", + "notice": "Das Signing Secret Ihrer Slack-App, das zur Verifizierung von Anfragen verwendet wird" }, "events": { "label": "Event Types", - "notice": "Select which Slack events should trigger this workflow" + "notice": "Wählen Sie aus, welche Slack-Ereignisse diesen Workflow auslösen sollen" }, "channel_id": { "label": "Channel ID", - "placeholder": "Select a channel...", - "notice": "Specific channel to watch (leave empty to watch all channels)" + "placeholder": "Wählen Sie einen Kanal aus...", + "notice": "Bestimmten Kanal überwachen (leer lassen, um alle Kanäle zu überwachen)" }, "ignore_bot_messages": { - "label": "Ignore Bot Messages" + "label": "Bot-Nachrichten ignorieren" }, "ignore_users": { - "label": "Ignore Users", - "placeholder": "Enter Slack user IDs (e.g., U1234567890)...", - "notice": "Slack user IDs to ignore messages from" + "label": "Benutzer ignorieren", + "placeholder": "Slack-Benutzer-IDs eingeben (z. B. U1234567890)...", + "notice": "Slack-Benutzer-IDs, deren Nachrichten ignoriert werden sollen" } }, - "verification-required": "Pending Verification. A valid event message is required for Trigger Activation or disable trigger Authentication.", + "verification-required": "Verifizierung ausstehend. Eine gültige Ereignisnachricht ist für die Trigger-Aktivierung erforderlich oder deaktivieren Sie die Trigger-Authentifizierung.", "base": { "authentication_required": { "label": "Authentifizierung erforderlich", @@ -309,34 +309,36 @@ }, "webhook": { "authentication_required": { - "label": "Require Authentication", - "notice": "Whether authentication is required for this webhook trigger" + "label": "Authentifizierung erforderlich", + "notice": "Gibt an, ob für diesen Webhook-Trigger eine Authentifizierung erforderlich ist" }, "body_contains": { - "label": "Body Contains", - "placeholder": "Enter text that must be in request body...", - "notice": "Only trigger if the request body contains this string" + "label": "Body enthält", + "placeholder": "Geben Sie Text ein, der im Request-Body enthalten sein muss...", + "notice": "Nur auslösen, wenn der Request-Body diesen String enthält" }, "required_headers": { - "label": "Required Headers", - "placeholder": "Enter header names (e.g., Content-Type, Authorization)...", - "notice": "List of HTTP headers that must be present in the request" + "label": "Erforderliche Header", + "placeholder": "Header-Namen eingeben (z. B. Content-Type, Authorization)...", + "notice": "Liste der HTTP-Header, die in der Anfrage vorhanden sein müssen" }, "header_match": { - "label": "Header Match (Regex)", - "placeholder": "Header-Name: regex pattern", - "notice": "Match request headers against a regex pattern (format: Header-Name: pattern)" + "label": "Header-Abgleich (Regex)", + "placeholder": "Header-Name: Regex-Muster", + "notice": "Request-Header anhand eines Regex-Musters abgleichen (Format: Header-Name: Muster)" }, "include_headers": { - "label": "Include Headers", - "notice": "Include request headers in the workflow execution input" + "label": "Header einschließen", + "notice": "Request-Header in die Eingabe der Workflow-Ausführung einschließen" }, "include_query_params": { - "label": "Include Query Parameters" + "label": "Query-Parameter einschließen" }, "include_request_metadata": { - "label": "Include Request Metadata", - "notice": "Include request metadata (method, URL, client IP) in execution input" + "label": "Request-Metadaten einschließen", + "notice": "Request-Metadaten (Methode, URL, Client-IP) in die Ausführungseingabe einschließen" } - } + }, + "status-cancelled": "Cancelled", + "select-method": "Methode auswählen" } diff --git a/src/i18n/locales/en-us/chat.json b/src/i18n/locales/en-us/chat.json index e86423679..a80b12c54 100644 --- a/src/i18n/locales/en-us/chat.json +++ b/src/i18n/locales/en-us/chat.json @@ -91,5 +91,7 @@ "input-attach-manage-connectors": "Manage connectors", "input-attach-open-browser": "Open a browser", "input-attach-manage-browsers": "Manage browsers", - "input-attach-menu-trigger": "Add files or photos, or open Skills, Connectors, or Browser from the menu" + "input-attach-menu-trigger": "Add files or photos, or open Skills, Connectors, or Browser from the menu", + "hide-file-sidebar": "Hide file sidebar", + "show-file-sidebar": "Show file sidebar" } diff --git a/src/i18n/locales/en-us/dashboard.json b/src/i18n/locales/en-us/dashboard.json index ff5ecbbc4..7041c1feb 100644 --- a/src/i18n/locales/en-us/dashboard.json +++ b/src/i18n/locales/en-us/dashboard.json @@ -23,5 +23,7 @@ "document-agent": "Document Agent", "multi-modal-agent": "Multi Modal Agent", "social-media-agent": "Social Media Agent", - "no-projects-found": "No projects found." + "no-projects-found": "No projects found.", + "no-projects-match-search": "No projects match your search", + "try-different-search": "Try a different search" } diff --git a/src/i18n/locales/en-us/folder.json b/src/i18n/locales/en-us/folder.json new file mode 100644 index 000000000..f3b301418 --- /dev/null +++ b/src/i18n/locales/en-us/folder.json @@ -0,0 +1,8 @@ +{ + "file-path-remote-root": "Remote", + "files-scope-all": "All files", + "files-scope-new": "New files", + "file-path-breadcrumb": "File path", + "download-file": "Download file", + "zip-file-is-not-supported-yet": "ZIP preview is not supported yet." +} diff --git a/src/i18n/locales/en-us/index.ts b/src/i18n/locales/en-us/index.ts index efa753446..4e23f35ac 100644 --- a/src/i18n/locales/en-us/index.ts +++ b/src/i18n/locales/en-us/index.ts @@ -15,6 +15,7 @@ import agents from './agents.json'; import chat from './chat.json'; import dashboard from './dashboard.json'; +import folder from './folder.json'; import layout from './layout.json'; import setting from './setting.json'; import triggers from './triggers.json'; @@ -24,6 +25,7 @@ export default { agents, layout, dashboard, + folder, workforce, chat, setting, diff --git a/src/i18n/locales/en-us/layout.json b/src/i18n/locales/en-us/layout.json index d358352e3..29dd5d5a9 100644 --- a/src/i18n/locales/en-us/layout.json +++ b/src/i18n/locales/en-us/layout.json @@ -333,5 +333,39 @@ "workspace-cowork-single-agent": "Cowork with Single Agent", "workspace-cowork-workforce": "Cowork with Workforce", "execution-context": "Execution Context", - "project-task-placeholder": "Describe what you want to accomplish..." + "project-task-placeholder": "Describe what you want to accomplish...", + "no-results": "No results", + "notification-panel-dismiss": "Dismiss", + "instructions": "Instructions", + "instructions-rules-tone": "Rules & Tone", + "memory": "Memory", + "memory-on": "On", + "memory-off": "Off", + "workforce-setting": "Workforce Setting", + "select": "Select", + "edit-instructions": "Edit instructions", + "sessions-start-new": "Start new session", + "sessions-full-title": "All sessions", + "sessions-create-task-hint": "Create a task to start a session", + "workforce-progress": "Progress", + "workforce-agent-folder": "Agent Folder", + "workforce-agent-pool": "Agent Pool", + "expand-project-sidebar": "Expand sidebar", + "fold-project-sidebar": "Fold sidebar", + "update": "Update", + "workspace-start-from-scratch": "Start from scratch", + "workspace-project-submenu": "Project", + "workspace-recent-session-now": "Now", + "workspace-recent-session-minutes": "{{count}} min", + "workspace-recent-session-hours": "{{count}}h", + "workspace-recent-session-days": "{{count}}d", + "workspace-recent-sessions-heading": "Recent", + "workspace-session-mode-label": "Session mode", + "workspace-session-mode-cycle-hint": "Click to switch session mode", + "failed-to-start-task": "Failed to start task. Please check your model configuration.", + "workspace-work-with-panel-hide": "Hide Work with panel", + "workspace-work-with-panel-show": "Show Work with panel", + "workspace-work-with-dismiss-overlay": "Dismiss", + "workspace-work-with-title": "Work with", + "workspace-work-with-remote-control": "Remote control" } diff --git a/src/i18n/locales/en-us/setting.json b/src/i18n/locales/en-us/setting.json index 5a66ae527..8a3f0bc1f 100644 --- a/src/i18n/locales/en-us/setting.json +++ b/src/i18n/locales/en-us/setting.json @@ -18,7 +18,7 @@ "default": "Default", "profile": "Profile", "account": "Account", - "you-are-currently-signed-in-with": "You are currently signed in with {{email}}", + "you-are-currently-signed-in-with": "You are currently signed in with {{email}}", "manage": "Manage", "log-out": "Log out", "language": "Language", @@ -28,7 +28,6 @@ "dark": "Dark", "light": "Light", "transparent": "Transparent", - "workspace-main-background": "Workspace background", "workspace-main-background-description": "Pattern for the Workforce and Session main panels only.", "workspace-main-background-empty": "Empty", @@ -37,14 +36,12 @@ "workspace-main-background-ruled": "Ruled lines", "workspace-main-background-dotted": "Dotted lines", "workspace-main-background-dashed": "Dashed lines", - "appearance-tab": "Appearance", "color-mode": "Color mode", "accent-palette": "Accent palette", "accent-palette-description": "Preset color themes for the interface. Choices are saved separately for light and dark mode.", "accent-for-light": "Light mode", "accent-for-dark": "Dark mode", - "data-privacy": "Data Privacy", "data-privacy-description": "Eigent is built on a local-first principle to ensure your privacy. Your data remains on your device by default. Cloud features are optional and only use the minimum data necessary to function. For full details, visit our", "privacy-policy": "Privacy Policy", @@ -93,7 +90,6 @@ "url": "URL", "enter-your-model-type": "Enter your Model Type", "verifying": "Verifying...", - "mcp-and-tools": "MCP & Tools", "add-mcp-server": "Add MCP Server", "market": "Market", @@ -176,7 +172,6 @@ "reset-success": "Reset successfully!", "reset-failed": "Reset failed!", "select-default-model": "Select Default Model", - "browser-login": "Browser Login", "browser-login-description": "Open a Chrome browser to log in to your accounts. Your login data will be saved locally in a secure profile.", "open-browser-login": "Open Browser for Login", @@ -184,7 +179,6 @@ "browser-opened-successfully": "Browser opened successfully. Please log in to your accounts.", "failed-to-open-browser": "Failed to open browser. Please try again.", "restart-to-apply": "Restart to Apply", - "cookie-manager": "Cookie Manager", "cookie-manager-description": "Manage cookies saved from your browser sessions. Delete cookies for specific sites or all at once.", "refresh": "Refresh", @@ -196,14 +190,12 @@ "login-to-save-cookies": "Use the browser login feature above to save cookies from your accounts.", "cookies-count": "{{count}} cookies", "last-access": "Last access", - "deleting": "Deleting...", "cookies-deleted-successfully": "Successfully deleted cookies for {{domain}}", "failed-to-load-cookies": "Failed to load cookies. Please try again.", "failed-to-delete-cookies": "Failed to delete cookies. Please try again.", "confirm-delete-all-cookies": "Are you sure you want to delete all cookies? This action cannot be undone.", "all-cookies-deleted": "All cookies have been deleted successfully.", "cookie-delete-warning": "Note: Deleting cookies will log you out of the associated websites. You may need to restart the browser to see changes take effect.", - "network-proxy": "Network Proxy", "network-proxy-description": "Configure a proxy server for network requests. This is useful if you need to access external APIs through a proxy.", "proxy-placeholder": "http://127.0.0.1:7890", @@ -211,7 +203,6 @@ "proxy-save-failed": "Failed to save proxy configuration.", "proxy-invalid-url": "Invalid proxy URL. Must start with http://, https://, socks4://, or socks5://.", "proxy-restart-hint": "Restart required to apply proxy changes.", - "cloud-not-available-in-local-proxy": "Cloud version is not available in local proxy mode", "set-as-default": "Set as Default", "api-key-setting": "API Key Setting", @@ -219,11 +210,9 @@ "model-type-setting": "Model Type Setting", "please-select": "Please select", "configuring": "Configuring...", - "models-default-setting-title": "Default setting", "models-default-setting-description": "Pick one of your configured models as the default model for Eigent. It will be applied globally across your workspace.", "models-configuration": "Configuration", - "gemini-3-pro-preview-name": "Gemini 3 Pro Preview", "gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview", "gemini-3-flash-preview-name": "Gemini 3 Flash Preview", @@ -237,205 +226,15 @@ "claude-opus-4-7-name": "Claude Opus 4.7", "deepseek-v4-pro-name": "DeepSeek V4 Pro", "minimax-m2-7-name": "Minimax M2.7", - - "account": "Account", - "you-are-currently-signed-in-with": "You are currently signed in with {{email}}", - "manage": "Manage", - "log-out": "Log out", - "language": "Language", - "select-language": "Select language", - "system-default": "System Default", - "appearance": "Appearance", - "dark": "Dark", - "light": "Light", - "transparent": "Transparent", - - "workspace-main-background": "Workspace background", - "workspace-main-background-description": "Pattern for the Workforce and Session main panels only.", - "workspace-main-background-empty": "Empty", - "workspace-main-background-dots": "Dot pattern", - "workspace-main-background-blocks": "Grid pattern", - "workspace-main-background-ruled": "Ruled lines", - "workspace-main-background-dotted": "Dotted lines", - "workspace-main-background-dashed": "Dashed lines", - - "appearance-tab": "Appearance", - "color-mode": "Color mode", - "accent-palette": "Accent palette", - "accent-palette-description": "Preset color themes for the interface. Choices are saved separately for light and dark mode.", - "accent-for-light": "Light mode", - "accent-for-dark": "Dark mode", - - "data-privacy": "Data Privacy", - "data-privacy-description": "Eigent is built on a local-first principle to ensure your privacy. Your data remains on your device by default. Cloud features are optional and only use the minimum data necessary to function. For full details, visit our", - "privacy-policy": "Privacy Policy", - "how-we-handle-your-data": "How we handle your data", - "we-only-use-the-essential-data-needed-to-run-your-tasks": "We only use the essential data needed to run your tasks", - "how-we-handle-your-data-line-1": "We only use the essential data needed to run your tasks", - "how-we-handle-your-data-line-1-line-1": "Eigent may capture screenshots to analyze UI elements, read text, and determine the next action, just as you would.", - "how-we-handle-your-data-line-1-line-2": "Eigent may use your mouse and keyboard to access local software and files you specify.", - "how-we-handle-your-data-line-1-line-3": "Only the minimum task data is sent to AI model providers or the third-party integrations you enable; we have zero data-retention", - "how-we-handle-your-data-line-2": "Task files, outputs and screenshots remain in your designated task folder locally.", - "how-we-handle-your-data-line-3": "Credentials are stored locally, encrypted, and used only for approved steps.", - "how-we-handle-your-data-line-4": "Your data is never used to train our AI models without your explicit consent.", - "how-we-handle-your-data-line-5": "We don’t sell your data to third parties.", - "api-key-can-not-be-empty": "API Key can not be empty!", - "api-host-can-not-be-empty": "API Host can not be empty!", - "model-type-can-not-be-empty": "Model Type can not be empty!", - "validate-success": "Validate success", - "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "The model has been verified to support function calling, which is required to use Eigent.", - "validate-failed": "Validate failed", - "copy": "Copy", - "copied-to-clipboard": "Copied to clipboard", - "failed-to-copy-to-clipboard": "Failed to copy to clipboard", - "endpoint-url-can-not-be-empty": "Endpoint URL can not be empty!", - "verification-failed-please-check-endpoint-url": "Verification failed, please check Endpoint URL", - "eigent-cloud-version": "Eigent Cloud Version", - "you-are-currently-subscribed-to-the": "You are currently subscribed to the", - "discover-more-about-our": "Discover more about our", - "pricing-options": "pricing options", - "credits": "Credits", - "select-model-type": "Select Model Type", - "custom-model": "Custom Model", - "use-your-own-api-keys-or-set-up-a-local-model": "Use your own API keys or set up a local model.", - "verify": "Verify", - "local-model": "Local Model", - "model-platform": "Model Platform", - "model-endpoint-url": "Model Endpoint URL", - "model-type": "Model Type", - "enter-your-local-model-type": "Enter your local model type", - "you-are-on-selft-host-mode": "You are on Selft Host Mode", - "you-are-using-self-hosted-mode": "You're using Self-hosted mode. To get the best performance from this product, please enter the Google Search Key in \"MCP and Tools\" to ensure Eigent works properly.", - "the-google-search-key-is-essential-for-delivering-accurate-search-results": "The Google Search Key is essential for delivering accurate search results. Exa Search Key is optional but highly recommended for better performance.", - "close": "Close", - "enter-your-api-key": "Enter your API", - "key": "Key", - "enter-your-api-host": "Enter your API Host", - "url": "URL", - "enter-your-model-type": "Enter your Model Type", - "verifying": "Verifying...", - - "mcp-and-tools": "MCP & Tools", - "add-mcp-server": "Add MCP Server", - "market": "Market", - "tools": "Tools", - "added-external-servers": "Added external servers", - "loading": "Loading...", - "no-mcp-servers": "No MCP servers", - "environmental-variables-required": "Environmental variables required", - "load-failed": "Load failed", - "save-failed": "Save failed", - "invalid-json": "Invalid JSON", - "coming-soon": "Coming Soon", - "uninstall": "Uninstall", - "install": "Install", - "add-your-agent": "Add Your Agent", - "add-a-local-mcp-server-by-providing-a-valid-json-configuration": "Add a local MCP server by providing a valid JSON configuration.", - "learn-more": "Learn more", - "installing": "Installing...", - "edit-mcp-config": "Edit MCP Config", - "name": "Name", - "description": "Description", - "command": "Command", - "args-one-per-line": "Args (one per line)", - "cancel": "Cancel", - "save": "Save", - "confirm-delete": "Confirm Delete", - "are-you-sure-you-want-to-delete": "Are you sure you want to delete", - "deleting": "Deleting...", - "delete": "Delete", - "configure {name} Toolkit": "Configure {{name}} Toolkit", - "get-it-from": "Get it from", - "google-custom-search-api": "Google Custom Search API", - "google-cloud-console": "Google Cloud Console", - "connect": "Connect", - "setting": "Setting", - "all": "All", - "mcp-market": "MCP Market", - "no-mcp-services": "No MCP services", - "loading-more": "Loading more...", - "no-more-mcp-servers": "No more MCP servers", - "search-mcp": "Search MCPs", - "installed": "Installed", - "worker-name-cannot-be-empty": "Worker name cannot be empty", - "worker-name-already-exists": "Worker name already exists", - "warning-google-search-not-configured": "Warning: Google Search not configured", - "search-functionality-may-be-limited-without-google-api": "Search functionality may be limited without Google API key and Search Engine ID. You can configure these in MCP & Tools settings.", - "search-engine": "Search Engine", - "password-storage": "Password Storage", - "notion-mcp-installed-successfully": "Notion MCP installed successfully", - "failed-to-install-notion-mcp": "Failed to install Notion MCP", - "google-calendar-installed-successfully": "Google Calendar installed successfully", - "failed-to-install-google-calendar": "Failed to install Google Calendar", - "notion-workspace-integration": "Notion workspace integration for reading and managing Notion pages", - "google-calendar-integration": "Google Calendar integration for managing events and schedules", - "mcp-server-already-exists": "MCP server \"{{name}}\" already exists", - "google-search": "Google Search", - "select-default-search-engine": "Select default search engine", - "your-own-mcps": "Your own MCPs", - "get-google-search-api": "Get Google Search API", - "get-exa-api": "Get Exa API", - "exa-ai": "Exa AI", - "search-engine-integrations": "Search Engine Integrations", - "configured": "Configured", - "incomplete": "Incomplete", - "not-configured": "Not Configured", - "saving": "Saving...", - "save-changes": "Save Changes", - "enable": "Enable", - "search": "Search", - "test-connection": "Test Connection", - "your-api-keys-are-stored-securely-and-never-shared-externally": "Your API keys are stored securely and never shared externally.", - "this-service-is-public-and-does-not-require-credentials": "This service is public and does not require credentials.", - "this-service-does-not-require-an-api-key": "This service does not require an API key.", - "connection-test-successful": "Connection test successful!", - "connection-test-failed": "Connection test failed.", - "configuration-saved-successfully": "Configuration saved successfully!", - "failed-to-save-configuration": "Failed to save configuration.", - "recommended": "Recommended", - "reset": "Reset", - "reset-success": "Reset successfully!", - "reset-failed": "Reset failed!", - - "browser-login": "Browser Login", - "browser-login-description": "Open a Chrome browser to log in to your accounts. Your login data will be saved locally in a secure profile.", - "open-browser-login": "Open Browser for Login", - "opening-browser": "Opening Browser...", - "browser-opened-successfully": "Browser opened successfully. Please log in to your accounts.", - "failed-to-open-browser": "Failed to open browser. Please try again.", - "restart-to-apply": "Restart to Apply", - - "cookie-manager": "Cookie Manager", - "cookie-manager-description": "Manage cookies saved from your browser sessions. Delete cookies for specific sites or all at once.", - "refresh": "Refresh", - "delete-all": "Delete All", - "search-domains": "Search domains...", - "loading-cookies": "Loading cookies...", - "no-cookies-found": "No cookies found", - "no-matching-domains": "No matching domains", - "login-to-save-cookies": "Use the browser login feature above to save cookies from your accounts.", - "cookies-count": "{{count}} cookies", - "last-access": "Last access", - "deleting": "Deleting...", - "cookies-deleted-successfully": "Successfully deleted cookies for {{domain}}", - "failed-to-load-cookies": "Failed to load cookies. Please try again.", - "failed-to-delete-cookies": "Failed to delete cookies. Please try again.", - "confirm-delete-all-cookies": "Are you sure you want to delete all cookies? This action cannot be undone.", - "all-cookies-deleted": "All cookies have been deleted successfully.", - "cookie-delete-warning": "Note: Deleting cookies will log you out of the associated websites. You may need to restart the browser to see changes take effect.", - - "network-proxy": "Network Proxy", - "network-proxy-description": "Configure a proxy server for network requests. This is useful if you need to access external APIs through a proxy.", - "proxy-placeholder": "http://127.0.0.1:7890", - "proxy-saved-restart-required": "Proxy configuration saved. Restart the app to apply changes.", - "proxy-save-failed": "Failed to save proxy configuration.", - "proxy-invalid-url": "Invalid proxy URL. Must start with http://, https://, socks4://, or socks5://.", - "proxy-restart-hint": "Restart required to apply proxy changes.", - "preferred-ide": "Preferred IDE", "preferred-ide-description": "Choose which application to use when opening agent project folders.", "system-file-manager": "System File Manager", "agents": "Agents", "help-improve-eigent": "Help Improve Eigent", - "help-improve-eigent-description": "Allow Eigent to collect anonymous error logs and usage data to improve the service. This is optional and can be changed at any time." + "help-improve-eigent-description": "Allow Eigent to collect anonymous error logs and usage data to improve the service. This is optional and can be changed at any time.", + "please-complete-authorization-in-browser": "Please complete authorization in your browser", + "authorization-cancelled": "Authorization cancelled", + "authorization-failed": "Authorization failed", + "this-service-is-already-enabled-by-default": "This service is already enabled by default", + "version": "Version" } diff --git a/src/i18n/locales/en-us/triggers.json b/src/i18n/locales/en-us/triggers.json index 220b0dd2b..99c6d2c41 100644 --- a/src/i18n/locales/en-us/triggers.json +++ b/src/i18n/locales/en-us/triggers.json @@ -165,6 +165,8 @@ "execution-cancelled": "Execution was cancelled", "execution-missed": "Execution was missed", "unknown-status": "Unknown status", + "status-cancelled": "Cancelled", + "select-method": "Select method", "trigger-label": "Trigger", "status-created": "Created", "status-updated": "Updated", diff --git a/src/i18n/locales/es/chat.json b/src/i18n/locales/es/chat.json index 579e6d8e9..e29def1b6 100644 --- a/src/i18n/locales/es/chat.json +++ b/src/i18n/locales/es/chat.json @@ -91,5 +91,7 @@ "input-attach-manage-connectors": "Gestionar conectores", "input-attach-open-browser": "Abrir un navegador", "input-attach-manage-browsers": "Gestionar navegadores", - "input-attach-menu-trigger": "Añadir archivos o fotos o abrir Habilidades, Conectores o Navegador desde el menú" + "input-attach-menu-trigger": "Añadir archivos o fotos o abrir Habilidades, Conectores o Navegador desde el menú", + "hide-file-sidebar": "Ocultar barra lateral de archivos", + "show-file-sidebar": "Mostrar barra lateral de archivos" } diff --git a/src/i18n/locales/es/dashboard.json b/src/i18n/locales/es/dashboard.json index b4217eec3..d68fe1b2f 100644 --- a/src/i18n/locales/es/dashboard.json +++ b/src/i18n/locales/es/dashboard.json @@ -23,5 +23,7 @@ "document-agent": "Agente de Documentos", "multi-modal-agent": "Agente Multi Modal", "social-media-agent": "Agente de Redes Sociales", - "no-projects-found": "No se encontraron proyectos." + "no-projects-found": "No se encontraron proyectos.", + "no-projects-match-search": "No hay proyectos que coincidan con tu búsqueda", + "try-different-search": "Intenta realizar una búsqueda diferente" } diff --git a/src/i18n/locales/es/folder.json b/src/i18n/locales/es/folder.json new file mode 100644 index 000000000..ecf2aa261 --- /dev/null +++ b/src/i18n/locales/es/folder.json @@ -0,0 +1,8 @@ +{ + "file-path-remote-root": "Remote", + "files-scope-all": "All files", + "files-scope-new": "New files", + "file-path-breadcrumb": "File path", + "download-file": "Descargar archivo", + "zip-file-is-not-supported-yet": "La vista previa de ZIP aún no es compatible." +} diff --git a/src/i18n/locales/es/index.ts b/src/i18n/locales/es/index.ts index efa753446..4e23f35ac 100644 --- a/src/i18n/locales/es/index.ts +++ b/src/i18n/locales/es/index.ts @@ -15,6 +15,7 @@ import agents from './agents.json'; import chat from './chat.json'; import dashboard from './dashboard.json'; +import folder from './folder.json'; import layout from './layout.json'; import setting from './setting.json'; import triggers from './triggers.json'; @@ -24,6 +25,7 @@ export default { agents, layout, dashboard, + folder, workforce, chat, setting, diff --git a/src/i18n/locales/es/layout.json b/src/i18n/locales/es/layout.json index 25966a348..c5237402b 100644 --- a/src/i18n/locales/es/layout.json +++ b/src/i18n/locales/es/layout.json @@ -304,8 +304,68 @@ "restart-required": "Reinicio requerido", "restart-required-message": "Reinicie la aplicación para habilitar los cambios de dominio de cookies.", "restart": "Reiniciar", - "cookie-count": "{{count}} Cookies", + "cookie-count": "{{count}} cookies", "add-new-mcp": "Añadir nuevo MCP", "browse-mcps": "Explorar MCPs", - "browser-settings": "Ajustes del navegador" + "browser-settings": "Ajustes del navegador", + "report-bug-dialog-title": "Reportar un error", + "report-bug-footer-hint": "Guardaremos un ZIP con los registros de la app y luego abriremos tu aplicación de correo. Adjunta el ZIP guardado al mensaje antes de enviarlo.", + "report-bug-field-description": "¿Qué salió mal?", + "report-bug-field-description-placeholder": "Describe el problema…", + "report-bug-field-steps": "Pasos para reproducirlo (opcional)", + "report-bug-field-steps-placeholder": "1. … 2. …", + "report-bug-meta": "Versión {{version}} · {{os}} ({{arch}})", + "report-bug-description-required": "Describe qué salió mal.", + "report-bug-submit": "Guardar diagnósticos y abrir correo", + "report-bug-diagnostics-saved": "Diagnósticos guardados. Adjunta el ZIP en tu correo y luego envíalo.", + "report-bug-mail-subject": "[Eigent] Informe de error", + "report-bug-mail-body-intro": "Adjunta a este mensaje el archivo ZIP de diagnósticos que acabas de guardar.", + "report-bug-mail-body-path": "ZIP guardado en: {{path}}", + "report-bug-mail-body-meta": "Versión de la app: {{version}} | SO: {{os}} ({{arch}})", + "report-bug-mail-body-desc": "Descripción:", + "report-bug-mail-body-steps": "Pasos para reproducir:", + "report-bug-mail-body-truncated": "El contenido del correo se acortó debido a límites de longitud. Consulta bug_report.txt dentro del ZIP para ver el texto completo.", + "project-page-tab-project": "Project", + "project-page-tab-tasks": "Tasks", + "project-page-all-tasks": "All tasks", + "project-page-status-pending": "Pending", + "no-tasks": "No tasks", + "workspace-select-project": "Selecciona un proyecto", + "workspace-cowork-single-agent": "Colabora con un solo agente", + "workspace-cowork-workforce": "Colabora con la fuerza de trabajo", + "execution-context": "Contexto de ejecución", + "no-results": "No results", + "notification-panel-dismiss": "Dismiss", + "instructions": "Instrucciones", + "instructions-rules-tone": "Reglas y tono", + "memory": "Memory", + "memory-on": "On", + "memory-off": "Off", + "workforce-setting": "Configuración de la fuerza de trabajo", + "select": "Select", + "edit-instructions": "Editar instrucciones", + "sessions-start-new": "Iniciar nueva sesión", + "sessions-full-title": "Todas las sesiones", + "sessions-create-task-hint": "Crea una tarea para iniciar una sesión", + "workforce-progress": "Progress", + "workforce-agent-folder": "Carpeta del agente", + "workforce-agent-pool": "Agent Pool", + "expand-project-sidebar": "Expandir barra lateral", + "fold-project-sidebar": "Contraer barra lateral", + "update": "Update", + "workspace-start-from-scratch": "Empezar desde cero", + "workspace-project-submenu": "Project", + "workspace-recent-session-now": "Now", + "workspace-recent-session-minutes": "{{count}} min", + "workspace-recent-session-hours": "{{count}}h", + "workspace-recent-session-days": "{{count}}d", + "workspace-recent-sessions-heading": "Recent", + "workspace-session-mode-label": "Modo de sesión", + "workspace-session-mode-cycle-hint": "Haz clic para cambiar el modo de sesión", + "failed-to-start-task": "No se pudo iniciar la tarea. Por favor, verifique la configuración de su modelo.", + "workspace-work-with-panel-hide": "Ocultar panel Trabajar con", + "workspace-work-with-panel-show": "Mostrar panel Trabajar con", + "workspace-work-with-dismiss-overlay": "Dismiss", + "workspace-work-with-title": "Work with", + "workspace-work-with-remote-control": "Control remoto" } diff --git a/src/i18n/locales/es/setting.json b/src/i18n/locales/es/setting.json index 078fe59d2..d5257091b 100644 --- a/src/i18n/locales/es/setting.json +++ b/src/i18n/locales/es/setting.json @@ -17,83 +17,6 @@ "eigent-cloud": "Eigent Cloud", "default": "Predeterminado", "profile": "Perfil", - "account": "Cuenta", - "you-are-currently-signed-in-with": "Estás actualmente conectado con {{email}}", - "manage": "Gestionar", - "log-out": "Cerrar sesión", - "language": "Idioma", - "select-language": "Seleccionar idioma", - "system-default": "Sistema predeterminado", - "appearance": "Apariencia", - "dark": "Oscuro", - "light": "Claro", - "transparent": "Transparente", - - "workspace-main-background": "Fondo del espacio de trabajo", - "workspace-main-background-description": "Solo para los paneles principales de Workforce y Session.", - "workspace-main-background-empty": "Vacío", - "workspace-main-background-dots": "Puntos", - "workspace-main-background-blocks": "Cuadrícula", - "workspace-main-background-ruled": "Líneas continuas", - "workspace-main-background-dotted": "Líneas punteadas", - "workspace-main-background-dashed": "Líneas a trazos", - - "appearance-tab": "Apariencia", - "color-mode": "Modo de color", - "accent-palette": "Paleta de acento", - "accent-palette-description": "Temas de color predefinidos para la interfaz. Se guardan por separado para los modos claro y oscuro.", - "accent-for-light": "Modo claro", - "accent-for-dark": "Modo oscuro", - - "data-privacy": "Privacidad de datos", - "data-privacy-description": "Eigent está construido sobre un principio local-first para garantizar tu privacidad. Tus datos permanecen en tu dispositivo por defecto. Las características en la nube son opcionales y solo utilizan los datos mínimos necesarios para funcionar. Para obtener más detalles, visita nuestra", - "privacy-policy": "Política de privacidad", - "how-we-handle-your-data": "Cómo manejamos tus datos", - "we-only-use-the-essential-data-needed-to-run-your-tasks": "Solo utilizamos los datos esenciales necesarios para ejecutar tus tareas", - "how-we-handle-your-data-line-1": "Solo utilizamos los datos esenciales necesarios para ejecutar tus tareas", - "how-we-handle-your-data-line-1-line-1": "Eigent puede capturar capturas de pantalla para analizar elementos de la interfaz de usuario, leer texto y determinar la siguiente acción, como tú.", - "how-we-handle-your-data-line-1-line-2": "Eigent puede usar tu mouse y teclado para acceder a software y archivos locales que especifiques.", - "how-we-handle-your-data-line-1-line-3": "Solo se envían los datos mínimos de las tareas a proveedores de modelos de IA o a las integraciones de terceros que activas; no tenemos ninguna retención de datos", - "how-we-handle-your-data-line-2": "Los archivos de tareas, salidas y capturas de pantalla permanecen en tu carpeta de tareas designada localmente.", - "how-we-handle-your-data-line-3": "Las credenciales se almacenan localmente, encriptadas, y solo se utilizan para pasos aprobados.", - "how-we-handle-your-data-line-4": "Tus datos nunca se utilizan para entrenar nuestros modelos de IA sin tu consentimiento explícito.", - "how-we-handle-your-data-line-5": "No vendemos tus datos a terceros.", - "api-key-can-not-be-empty": "API Key no puede estar vacío!", - "api-host-can-not-be-empty": "API Host no puede estar vacío!", - "model-type-can-not-be-empty": "Model Type no puede estar vacío!", - "validate-success": "Validación exitosa", - "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "El modelo ha sido verificado para soportar la llamada de funciones, lo que es necesario para usar Eigent.", - "validate-failed": "Validación fallida", - "copy": "Copiar", - "copied-to-clipboard": "Copiado al portapapeles", - "failed-to-copy-to-clipboard": "Error al copiar al portapapeles", - "endpoint-url-can-not-be-empty": "Endpoint URL no puede estar vacío!", - "verification-failed-please-check-endpoint-url": "Verificación fallida, por favor verifique Endpoint URL", - "eigent-cloud-version": "Eigent Cloud Version", - "you-are-currently-subscribed-to-the": "Actualmente estás suscrito a la", - "discover-more-about-our": "Descubre más sobre nuestra", - "pricing-options": "opciones de precios", - "credits": "Créditos", - "select-model-type": "Seleccionar Model Type", - "custom-model": "Modelo personalizado", - "use-your-own-api-keys-or-set-up-a-local-model": "Usa tus propias API keys o configura un modelo local.", - "verify": "Verificar", - "local-model": "Modelo local", - "model-platform": "Plataforma de modelo", - "model-endpoint-url": "URL de endpoint de modelo", - "model-type": "Tipo de modelo", - "enter-your-local-model-type": "Ingresa tu tipo de modelo local", - "you-are-on-selft-host-mode": "Estás en modo Selft Host", - "you-are-using-self-hosted-mode": "Estás usando modo Self-hosted. Para obtener el mejor rendimiento de este producto, por favor ingresa la Clave de Búsqueda de Google en \"MCP y Herramientas\" para asegurar que Eigent funcione correctamente.", - "the-google-search-key-is-essential-for-delivering-accurate-search-results": "La Clave de Búsqueda de Google es esencial para entregar resultados de búsqueda precisos. La Clave de Búsqueda de Exa es opcional pero altamente recomendada para mejor rendimiento.", - "close": "Cerrar", - "enter-your-api-key": "Ingresa tu API", - "key": "Key", - "enter-your-api-host": "Ingresa tu API Host", - "url": "URL", - "enter-your-model-type": "Ingresa tu Model Type", - "verifying": "Verificando...", - "account": "Cuenta", "you-are-currently-signed-in-with": "Estás actualmente conectado con {{email}}", "manage": "Gestionar", @@ -105,7 +28,6 @@ "dark": "Oscuro", "light": "Claro", "transparent": "Transparente", - "workspace-main-background": "Fondo del espacio de trabajo", "workspace-main-background-description": "Solo para los paneles principales de Workforce y Session.", "workspace-main-background-empty": "Vacío", @@ -114,14 +36,12 @@ "workspace-main-background-ruled": "Líneas continuas", "workspace-main-background-dotted": "Líneas punteadas", "workspace-main-background-dashed": "Líneas a trazos", - "appearance-tab": "Apariencia", "color-mode": "Modo de color", "accent-palette": "Paleta de acento", "accent-palette-description": "Temas de color predefinidos para la interfaz. Se guardan por separado para los modos claro y oscuro.", "accent-for-light": "Modo claro", "accent-for-dark": "Modo oscuro", - "data-privacy": "Privacidad de datos", "data-privacy-description": "Eigent está construido sobre un principio local-first para garantizar tu privacidad. Tus datos permanecen en tu dispositivo por defecto. Las características en la nube son opcionales y solo utilizan los datos mínimos necesarios para funcionar. Para obtener más detalles, visita nuestra", "privacy-policy": "Política de privacidad", @@ -143,9 +63,10 @@ "validate-failed": "Validación fallida", "copy": "Copiar", "copied-to-clipboard": "Copiado al portapapeles", + "failed-to-copy-to-clipboard": "Error al copiar al portapapeles", "endpoint-url-can-not-be-empty": "Endpoint URL no puede estar vacío!", "verification-failed-please-check-endpoint-url": "Verificación fallida, por favor verifique Endpoint URL", - "eigent-cloud-version": "Eigent Cloud Version", + "eigent-cloud-version": "Versión de Eigent Cloud", "you-are-currently-subscribed-to-the": "Actualmente estás suscrito a la", "discover-more-about-our": "Descubre más sobre nuestra", "pricing-options": "opciones de precios", @@ -169,14 +90,13 @@ "url": "URL", "enter-your-model-type": "Ingresa tu Model Type", "verifying": "Verificando...", - "mcp-and-tools": "MCP & Herramientas", "add-mcp-server": "Agregar MCP Server", "market": "Mercado", "tools": "Herramientas", "added-external-servers": "Servidores externos agregados", "loading": "Cargando...", - "no-mcp-servers": "No MCP servers", + "no-mcp-servers": "No hay servidores MCP", "environmental-variables-required": "Variables ambientales requeridas", "load-failed": "Carga fallida", "save-failed": "Guardar fallido", @@ -201,8 +121,8 @@ "delete": "Eliminar", "configure {name} Toolkit": "Configurar {{name}} Toolkit", "get-it-from": "Obtenerlo de", - "google-custom-search-api": "Google Custom Search API", - "google-cloud-console": "Google Cloud Console", + "google-custom-search-api": "API de Google Custom Search", + "google-cloud-console": "Consola de Google Cloud", "connect": "Conectar", "setting": "Configuración", "all": "Todos", @@ -225,7 +145,7 @@ "notion-workspace-integration": "Integración de espacio de trabajo de Notion para leer y gestionar páginas de Notion", "google-calendar-integration": "Integración de Google Calendar para gestionar eventos y horarios", "mcp-server-already-exists": "El servidor MCP \"{{name}}\" ya existe", - "google-search": "Google Search", + "google-search": "Búsqueda de Google", "select-default-search-engine": "Seleccionar motor de búsqueda predeterminado", "your-own-mcps": "Tus propios MCPs", "get-google-search-api": "Obtener Google Search API", @@ -252,7 +172,6 @@ "reset-success": "¡Restablecido correctamente!", "reset-failed": "¡Error al restablecer!", "select-default-model": "Seleccionar modelo predeterminado", - "browser-login": "Inicio de sesión en el navegador", "browser-login-description": "Abra Chrome para iniciar sesión en sus cuentas. Sus datos de acceso se guardarán localmente en un perfil seguro.", "open-browser-login": "Abrir navegador para iniciar sesión", @@ -277,7 +196,6 @@ "confirm-delete-all-cookies": "¿Eliminar todas las cookies? Esta acción no se puede deshacer.", "all-cookies-deleted": "Todas las cookies se eliminaron correctamente.", "cookie-delete-warning": "Nota: Al eliminar cookies se cerrará sesión en los sitios asociados. Es posible que deba reiniciar el navegador para ver los cambios.", - "network-proxy": "Proxy de red", "network-proxy-description": "Configure un servidor proxy para las solicitudes de red. Esto es útil si necesita acceder a APIs externas a través de un proxy.", "proxy-placeholder": "http://127.0.0.1:7890", @@ -285,7 +203,6 @@ "proxy-save-failed": "Error al guardar la configuración del proxy.", "proxy-invalid-url": "URL de proxy no válida. Debe comenzar con http://, https://, socks4:// o socks5://.", "proxy-restart-hint": "Es necesario reiniciar para aplicar los cambios del proxy.", - "cloud-not-available-in-local-proxy": "La versión en la nube no está disponible en modo proxy local", "set-as-default": "Establecer como predeterminado", "api-key-setting": "Configuración de clave API", @@ -293,11 +210,9 @@ "model-type-setting": "Configuración de tipo de modelo", "please-select": "Por favor seleccione", "configuring": "Configurando...", - "models-default-setting-title": "Configuración predeterminada", "models-default-setting-description": "Elige uno de tus modelos configurados como modelo predeterminado para Eigent. Se aplicará globalmente en tu espacio de trabajo.", "models-configuration": "Configuración", - "gemini-3-pro-preview-name": "Gemini 3 Pro Preview", "gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview", "gemini-3-flash-preview-name": "Gemini 3 Flash Preview", @@ -311,11 +226,15 @@ "claude-opus-4-7-name": "Claude Opus 4.7", "deepseek-v4-pro-name": "DeepSeek V4 Pro", "minimax-m2-7-name": "Minimax M2.7", - "preferred-ide": "IDE preferido", "preferred-ide-description": "Elija qué aplicación usar al abrir las carpetas de proyectos del agente.", "system-file-manager": "Administrador de archivos del sistema", "agents": "Agentes", "help-improve-eigent": "Ayuda a mejorar Eigent", - "help-improve-eigent-description": "Permite que Eigent recopile registros de errores anónimos y datos de uso para mejorar el servicio. Esto es opcional y se puede cambiar en cualquier momento." + "help-improve-eigent-description": "Permite que Eigent recopile registros de errores anónimos y datos de uso para mejorar el servicio. Esto es opcional y se puede cambiar en cualquier momento.", + "please-complete-authorization-in-browser": "Por favor, completa la autorización en tu navegador", + "authorization-cancelled": "Autorización cancelada", + "authorization-failed": "La autorización falló", + "this-service-is-already-enabled-by-default": "Este servicio ya está habilitado por defecto", + "version": "Version" } diff --git a/src/i18n/locales/es/triggers.json b/src/i18n/locales/es/triggers.json index bfd7e2da4..015b1ed40 100644 --- a/src/i18n/locales/es/triggers.json +++ b/src/i18n/locales/es/triggers.json @@ -2,19 +2,19 @@ "name": "Name", "description": "Description", "trigger-type": "Type", - "create-new": "Create New Trigger", - "trigger-details": "Trigger Details", - "no-trigger-selected": "No Trigger Selected", - "select-trigger-hint": "Click on a trigger from the list to view its details", - "no-triggers": "No triggers yet", - "name-placeholder": "Enter trigger name", - "description-placeholder": "Enter trigger description", + "create-new": "Crear nuevo disparador", + "trigger-details": "Detalles del disparador", + "no-trigger-selected": "No se seleccionó ningún disparador", + "select-trigger-hint": "Haz clic en un disparador de la lista para ver sus detalles", + "no-triggers": "Aún no hay disparadores", + "name-placeholder": "Ingresa el nombre del disparador", + "description-placeholder": "Ingresa la descripción del disparador", "schedule-trigger": "Schedule", "webhook-trigger": "Webhook", "slack-trigger": "Slack", "app-trigger": "App Trigger", - "cron-expression": "Cron Expression", - "cron-help": "Format: minute hour day month weekday (e.g., 0 */1 * * * = every hour)", + "cron-expression": "Expresión cron", + "cron-help": "Formato: minuto hora día mes día-semana (p. ej., 0 */1 * * * = cada hora)", "cron-empty": "La expresión cron no puede estar vacía", "cron-invalid-format": "Formato cron inválido. Esperado: minuto hora día mes día de la semana (ej., 0 */1 * * *)", "cron-invalid-minute": "Valor de minuto inválido. Debe ser 0-59 o una expresión cron válida", @@ -22,23 +22,23 @@ "cron-invalid-day": "Valor de día inválido. Debe ser 1-31 o una expresión cron válida", "cron-invalid-month": "Valor de mes inválido. Debe ser 1-12 o una expresión cron válida", "cron-invalid-weekday": "Valor de día de la semana inválido. Debe ser 0-6 (0=Domingo) o una expresión cron válida", - "listener-type": "Listener Type", - "select-listener": "Select listener type", + "listener-type": "Tipo de receptor", + "select-listener": "Selecciona el tipo de receptor", "chat-agent": "Chat Agent", "workforce": "Workforce", "agent-model": "Agent Model", "task-prompt": "Task Prompt", - "task-prompt-placeholder": "Enter the task prompt for this trigger", - "max-per-hour": "Max Per Hour", + "task-prompt-placeholder": "Ingresa el prompt de la tarea para este disparador", + "max-per-hour": "Máximo por hora", "max-per-day": "Max Per Day", - "single-execution": "Single Execution", + "single-execution": "Ejecución única", "webhook-url": "Webhook URL", "executions": "Executions", "errors": "Errors", "view-runs": "View Runs", "activate": "Activate", "deactivate": "Deactivate", - "execution-id": "Execution ID", + "execution-id": "ID de ejecución", "started": "Started", "duration": "Duration", "tokens": "Tokens", @@ -46,29 +46,29 @@ "failed": "Failed", "running": "Running", "pending": "Pending", - "no-executions": "No executions found", - "executions-for": "Executions for", - "name-required": "Trigger name is required", - "created-successfully": "Trigger created successfully", - "failed-to-create": "Failed to create trigger", - "failed-to-load": "Failed to load triggers", - "activated": "Trigger activated", - "deactivated": "Trigger deactivated", - "failed-to-toggle": "Failed to toggle trigger status", - "webhook-created-title": "Webhook Created Successfully", - "webhook-created-subtitle": "Your new webhook trigger is ready to receive requests", - "webhook-ready": "Webhook Ready!", - "webhook-instructions": "Use the URL below to trigger this agent. Send a request with any JSON body.", - "your-webhook-url": "Your Webhook URL", - "webhook-tip-title": "Did you know?", - "webhook-tip-description": "You can include custom data in your JSON payload and reference it in your task prompt using {{variable_name}}.", - "webhook-url-copied": "Webhook URL copied to clipboard", - "confirm-delete": "Are you sure you want to delete this trigger?", - "deleted": "Trigger deleted", - "failed-to-delete": "Failed to delete trigger", - "webhook-copied": "Webhook URL copied to clipboard", - "failed-to-copy": "Failed to copy webhook URL", - "trigger-task": "Trigger Task", + "no-executions": "No se encontraron ejecuciones", + "executions-for": "Ejecuciones para", + "name-required": "El nombre del disparador es obligatorio", + "created-successfully": "Disparador creado con éxito", + "failed-to-create": "Error al crear el disparador", + "failed-to-load": "Error al cargar los disparadores", + "activated": "Disparador activado", + "deactivated": "Disparador desactivado", + "failed-to-toggle": "Error al cambiar el estado del disparador", + "webhook-created-title": "Webhook creado con éxito", + "webhook-created-subtitle": "Tu nuevo disparador webhook está listo para recibir solicitudes", + "webhook-ready": "¡Webhook listo!", + "webhook-instructions": "Usa la URL a continuación para activar este agente. Envía una solicitud con cualquier cuerpo JSON.", + "your-webhook-url": "Tu URL de webhook", + "webhook-tip-title": "¿Sabías que?", + "webhook-tip-description": "Puedes incluir datos personalizados en tu carga JSON y referenciarlos en el prompt de tu tarea usando {{variable_name}}.", + "webhook-url-copied": "URL del webhook copiada al portapapeles", + "confirm-delete": "¿Estás seguro de que deseas eliminar este disparador?", + "deleted": "Disparador eliminado", + "failed-to-delete": "Error al eliminar el disparador", + "webhook-copied": "URL del webhook copiada al portapapeles", + "failed-to-copy": "No se pudo copiar la URL del webhook", + "trigger-task": "Disparar tarea", "task-mode-text": "Text", "task-mode-json": "JSON", "schedule-frequency": "Frequency", @@ -81,44 +81,44 @@ "weekday-thursday": "Thursday", "weekday-friday": "Friday", "weekday-saturday": "Saturday", - "webhook-function": "Webhook Function", + "webhook-function": "Función webhook", "frequency-hourly": "Every Hour", "frequency-daily": "Daily", "frequency-weekly": "Weekly", "frequency-monthly": "Monthly", "frequency-one-time": "One Time", "frequency-custom": "Custom", - "invalid-time-format": "Invalid time format. Use HH:MM (e.g., 09:30)", - "schedule-day-of-month-note": "If the selected day doesn’t exist in that month (e.g., the 31st), the task will be skipped.", + "invalid-time-format": "Formato de hora inválido. Usa HH:MM (p. ej., 09:30)", + "schedule-day-of-month-note": "Si el día seleccionado no existe en ese mes (p. ej., el 31), la tarea se omitirá.", "schedule-hour": "Hora", "schedule-minute": "Minuto", "schedule-date": "Date", "select-date": "Select date", - "schedule-day-of-month": "Day of Month", + "schedule-day-of-month": "Día del mes", "select-day": "Select day", "day-of-month": "Day {{day}}", - "schedule-weekdays": "Days of Week", - "expiration-date": "Expiration Date", - "no-expiration": "No expiration", - "select-expiration": "Select expiration date", - "no-upcoming-one-time": "Select a future date and time", - "no-upcoming-executions": "No upcoming executions", - "date-required": "Date is required", - "weekday-required": "At least one weekday is required", - "schedule-required-fields": "Please fill in all required fields for the schedule", - "create-trigger-agent": "Automate task with trigger", - "trigger-overview": "Trigger Overview", + "schedule-weekdays": "Días de la semana", + "expiration-date": "Fecha de expiración", + "no-expiration": "Sin expiración", + "select-expiration": "Seleccionar fecha de expiración", + "no-upcoming-one-time": "Selecciona una fecha y hora futuras", + "no-upcoming-executions": "No hay ejecuciones próximas", + "date-required": "La fecha es obligatoria", + "weekday-required": "Se requiere al menos un día de la semana", + "schedule-required-fields": "Completa todos los campos obligatorios de la programación", + "create-trigger-agent": "Automatizar tarea con disparador", + "trigger-overview": "Resumen del disparador", "edit": "Edit", "delete": "Delete", "period": "Period", "created-at": "Created At", - "execution-history": "Execution History", + "execution-history": "Historial de ejecuciones", "run-time": "Run Time", "success": "Success", - "output-tasks": "Output Tasks", + "output-tasks": "Tareas de salida", "logs": "Logs", "close": "Close", - "confirm-delete-trigger": "Are you sure you want to delete this trigger?", + "confirm-delete-trigger": "¿Seguro que quieres eliminar este disparador?", "status": { "active": "Active", "inactive": "Inactive", @@ -126,66 +126,66 @@ "completed": "Completed", "unknown": "Unknown" }, - "webhook-url-after-creation": "You can find your webhook URL in the trigger details after creation.", - "webhook-method": "Request Method", - "created-time": "Created Time", - "last-execution-label": "Last Execution", + "webhook-url-after-creation": "Puedes encontrar la URL de tu webhook en los detalles del disparador después de crearlo.", + "webhook-method": "Método de solicitud", + "created-time": "Hora de creación", + "last-execution-label": "Última ejecución", "token-cost": "Token Cost", - "updated-successfully": "Trigger updated successfully", + "updated-successfully": "Disparador actualizado correctamente", "title": "Triggers", - "create-hint": "Create a trigger to automate your tasks", - "live-activity": "Live Activity", - "no-activity": "No activity yet", - "activity-hint": "Activity will appear here", - "execution-logs": "Execution Logs", + "create-hint": "Crea un disparador para automatizar tus tareas", + "live-activity": "Actividad en vivo", + "no-activity": "Aún no hay actividad", + "activity-hint": "La actividad aparecerá aquí", + "execution-logs": "Registros de ejecución", "fold-execution-logs": "Contraer registros de ejecución", "open-execution-logs": "Abrir registros de ejecución", - "delete-trigger": "Delete Trigger", + "delete-trigger": "Eliminar disparador", "cancel": "Cancel", "deleting": "Deleting...", - "duplicated-successfully": "Trigger duplicated as \"{{name}}\"", - "confirm-delete-message": "Are you sure you want to delete \"{{name}}\"? This action cannot be undone.", + "duplicated-successfully": "Disparador duplicado como \"{{name}}\"", + "confirm-delete-message": "¿Seguro que quieres eliminar \"{{name}}\"? Esta acción no se puede deshacer.", "workspace": "Workspace", - "agent-folder": "Agent Folder", + "agent-folder": "Carpeta del agente", "add": "Add", "upload": "Upload", "create": "Create", "loading": "Loading...", - "loading-executions": "Loading execution data...", - "failed-to-load-executions": "Failed to load execution data", - "no-execution-data": "No execution data available", + "loading-executions": "Cargando datos de ejecución...", + "failed-to-load-executions": "No se pudieron cargar los datos de ejecución", + "no-execution-data": "No hay datos de ejecución disponibles", "total-runs": "Total Runs", - "success-rate": "Success Rate", - "no-executions-yet": "No executions yet", + "success-rate": "Tasa de éxito", + "no-executions-yet": "Aún no hay ejecuciones", "last-run-label": "Last run", - "execution-completed-success": "Execution completed successfully", - "execution-failed-message": "Execution failed", - "execution-in-progress": "Execution in progress...", - "waiting-to-execute": "Waiting to execute...", - "execution-cancelled": "Execution was cancelled", - "execution-missed": "Execution was missed", - "unknown-status": "Unknown status", + "execution-completed-success": "La ejecución se completó correctamente", + "execution-failed-message": "La ejecución falló", + "execution-in-progress": "Ejecución en curso...", + "waiting-to-execute": "Esperando para ejecutar...", + "execution-cancelled": "La ejecución fue cancelada", + "execution-missed": "La ejecución se omitió", + "unknown-status": "Estado desconocido", "trigger-label": "Trigger", "status-created": "Created", "status-updated": "Updated", "status-activated": "Activated", "status-deleted": "Deleted", "status-deactivated": "Deactivated", - "status-execution-started": "Execution started", - "status-execution-completed": "Execution completed", + "status-execution-started": "La ejecución ha comenzado", + "status-execution-completed": "La ejecución se completó", "status-error": "Error", - "status-webhook-triggered": "Webhook triggered", + "status-webhook-triggered": "Webhook activado", "status-activity": "Activity", - "upcoming-executions": "Upcoming Executions", + "upcoming-executions": "Próximas ejecuciones", "preview-scheduled-times": "Vista Previa de Tiempos Programados", - "task-prompt-required": "Task prompt is required", - "project-id-required": "Project ID is required", - "execution-settings": "Execution Settings", - "extra-settings": "Extra Settings", + "task-prompt-required": "Se requiere el prompt de la tarea", + "project-id-required": "Se requiere el ID del proyecto", + "execution-settings": "Ajustes de ejecución", + "extra-settings": "Ajustes adicionales", "max-per-hour-placeholder": "0", "max-per-day-placeholder": "0", "copy": "Copy", - "edit-trigger-agent": "Edit Trigger Agent", + "edit-trigger-agent": "Editar agente desencadenador", "updating": "Updating...", "creating": "Creating...", "update": "Update", @@ -195,102 +195,102 @@ "activation-limit-reached": "Límite de activación alcanzado: máximo 5 triggers activos por proyecto, 25 por usuario", "never": "Never", "duplicate": "Duplicate", - "no-task-prompt": "No task prompt", + "no-task-prompt": "Sin prompt de tarea", "select-app": "Seleccionar aplicación", "change-app": "Change", "dynamic": { "credentials": "Credentials", - "credentials-notice": "Your credentials are stored securely and used to authenticate with the service.", - "credentials-saved": "Credentials configured successfully", - "configuration": "Configuration", - "behavior-settings": "Behavior Settings", - "enter-value": "Please enter a value", + "credentials-notice": "Tus credenciales se almacenan de forma segura y se usan para autenticarte con el servicio.", + "credentials-saved": "Credenciales configuradas correctamente", + "configuration": "Configuración", + "behavior-settings": "Ajustes de comportamiento", + "enter-value": "Por favor, introduce un valor", "add": "Add", "update": "Update", - "config-saved": "Configuration saved successfully", - "config-updated": "Configuration updated successfully", - "config-save-error": "Failed to save configuration", + "config-saved": "Configuración guardada correctamente", + "config-updated": "Configuración actualizada correctamente", + "config-save-error": "No se pudo guardar la configuración", "loading": "Loading...", - "loading-config": "Loading configuration...", - "no-config-available": "No configuration available for this trigger type", - "failed-to-load-schema": "Failed to load configuration schema", - "select-options": "Select options...", + "loading-config": "Cargando configuración...", + "no-config-available": "No hay configuración disponible para este tipo de desencadenador", + "failed-to-load-schema": "No se pudo cargar el esquema de configuración", + "select-options": "Selecciona opciones...", "selected": "selected", - "save-credentials-first": "Save credentials first", + "save-credentials-first": "Guarde primero las credenciales", "search": "Search...", - "no-options": "No options found", + "no-options": "No se encontraron opciones", "validation": { - "required": "{{field}} is required", - "invalid-regex": "Invalid regular expression pattern", - "invalid-email": "Invalid email address", - "invalid-url": "Invalid URL format", - "min-length": "Must be at least {{min}} characters", - "max-length": "Must be no more than {{max}} characters", - "pattern-mismatch": "Value does not match required pattern", - "min-value": "Must be at least {{min}}", - "max-value": "Must be no more than {{max}}" + "required": "{{field}} es obligatorio", + "invalid-regex": "Patrón de expresión regular no válido", + "invalid-email": "Dirección de correo electrónico no válida", + "invalid-url": "Formato de URL no válido", + "min-length": "Debe tener al menos {{min}} caracteres", + "max-length": "No debe tener más de {{max}} caracteres", + "pattern-mismatch": "El valor no coincide con el patrón requerido", + "min-value": "Debe ser al menos {{min}}", + "max-value": "No debe ser mayor que {{max}}" }, - "validation-failed": "Please fix validation errors: {{errors}}" + "validation-failed": "Corrija los errores de validación: {{errors}}" }, "slack": { - "credentials-saved": "Slack credentials configured successfully", - "enter-bot-token": "Please enter a bot token", - "bot-token-saved": "Bot token saved successfully", - "bot-token-updated": "Bot token updated successfully", - "bot-token-save-error": "Failed to save bot token", - "signing-secret-saved": "Signing secret saved successfully", - "signing-secret-updated": "Signing secret updated successfully", - "signing-secret-save-error": "Failed to save signing secret", + "credentials-saved": "Credenciales de Slack configuradas correctamente", + "enter-bot-token": "Por favor, introduzca un token de bot", + "bot-token-saved": "Token de bot guardado correctamente", + "bot-token-updated": "Token de bot actualizado correctamente", + "bot-token-save-error": "No se pudo guardar el token de bot", + "signing-secret-saved": "Secreto de firma guardado correctamente", + "signing-secret-updated": "Secreto de firma actualizado correctamente", + "signing-secret-save-error": "No se pudo guardar el secreto de firma", "add": "Add", "update": "Update", - "event-configuration": "Event Configuration", + "event-configuration": "Configuración de eventos", "event-types": "Event Types", - "select-events": "Select events to trigger on...", - "search-events": "Search events...", - "no-events-found": "No events found", - "events-selected": "events selected", - "channel-filter": "Channel Filter", - "select-channels": "All channels (no filter)", - "search-channels": "Search channels...", - "no-channels-found": "No channels found", - "channels-selected": "channels selected", - "save-credentials-first": "Save credentials first to load channels", - "loading-channels": "Loading channels...", - "channels-fetch-error": "Failed to fetch channels. Please check your credentials.", - "behavior-settings": "Behavior Settings", + "select-events": "Seleccione los eventos que activarán...", + "search-events": "Buscar eventos...", + "no-events-found": "No se encontraron eventos", + "events-selected": "eventos seleccionados", + "channel-filter": "Filtro de canales", + "select-channels": "Todos los canales (sin filtro)", + "search-channels": "Buscar canales...", + "no-channels-found": "No se encontraron canales", + "channels-selected": "canales seleccionados", + "save-credentials-first": "Guarde primero las credenciales para cargar los canales", + "loading-channels": "Cargando canales...", + "channels-fetch-error": "No se pudieron obtener los canales. Por favor, verifique sus credenciales.", + "behavior-settings": "Configuración de comportamiento", "authentication_required": { - "label": "Require Authentication", - "notice": "Slack triggers require authentication to verify webhook signatures (Slack Signing Secret required). Verify webhook endpoint at https://api.slack.com/apps to activate trigger." + "label": "Requerir autenticación", + "notice": "Los disparadores de Slack requieren autenticación para verificar las firmas de webhook (se requiere Slack Signing Secret). Verifica el endpoint del webhook en https://api.slack.com/apps para activar el disparador." }, "bot_token": { - "label": "Slack Bot Token", + "label": "Token de Bot de Slack", "placeholder": "xoxb-...", - "notice": "Your Slack Bot User OAuth Token (starts with xoxb-)" + "notice": "Tu token OAuth de usuario bot de Slack (comienza con xoxb-)" }, "signing_secret": { "label": "Slack Signing Secret", - "placeholder": "Enter your Slack signing secret...", - "notice": "Your Slack app's signing secret used to verify requests" + "placeholder": "Ingresa tu Slack signing secret...", + "notice": "El signing secret de tu app de Slack utilizado para verificar solicitudes" }, "events": { "label": "Event Types", - "notice": "Select which Slack events should trigger this workflow" + "notice": "Selecciona qué eventos de Slack deben activar este flujo de trabajo" }, "channel_id": { "label": "Channel ID", - "placeholder": "Select a channel...", - "notice": "Specific channel to watch (leave empty to watch all channels)" + "placeholder": "Selecciona un canal...", + "notice": "Canal específico a supervisar (deja vacío para supervisar todos los canales)" }, "ignore_bot_messages": { - "label": "Ignore Bot Messages" + "label": "Ignorar mensajes de bots" }, "ignore_users": { - "label": "Ignore Users", - "placeholder": "Enter Slack user IDs (e.g., U1234567890)...", - "notice": "Slack user IDs to ignore messages from" + "label": "Ignorar usuarios", + "placeholder": "Ingresa IDs de usuario de Slack (por ejemplo, U1234567890)...", + "notice": "IDs de usuario de Slack de los que se ignorarán mensajes" } }, - "verification-required": "Pending Verification. A valid event message is required for Trigger Activation or disable trigger Authentication.", + "verification-required": "Verificación pendiente. Se requiere un mensaje de evento válido para activar el disparador o deshabilitar la autenticación del disparador.", "base": { "authentication_required": { "label": "Requiere Autenticación", @@ -309,34 +309,36 @@ }, "webhook": { "authentication_required": { - "label": "Require Authentication", - "notice": "Whether authentication is required for this webhook trigger" + "label": "Requerir autenticación", + "notice": "Indica si la autenticación es requerida para este disparador de webhook" }, "body_contains": { - "label": "Body Contains", - "placeholder": "Enter text that must be in request body...", - "notice": "Only trigger if the request body contains this string" + "label": "El cuerpo contiene", + "placeholder": "Ingresa texto que debe estar en el cuerpo de la solicitud...", + "notice": "Activar solo si el cuerpo de la solicitud contiene esta cadena" }, "required_headers": { - "label": "Required Headers", - "placeholder": "Enter header names (e.g., Content-Type, Authorization)...", - "notice": "List of HTTP headers that must be present in the request" + "label": "Encabezados requeridos", + "placeholder": "Ingresa nombres de encabezados (por ejemplo, Content-Type, Authorization)...", + "notice": "Lista de encabezados HTTP que deben estar presentes en la solicitud" }, "header_match": { - "label": "Header Match (Regex)", - "placeholder": "Header-Name: regex pattern", - "notice": "Match request headers against a regex pattern (format: Header-Name: pattern)" + "label": "Coincidencia de encabezados (Regex)", + "placeholder": "Nombre-Encabezado: patrón regex", + "notice": "Hacer coincidir los encabezados de la solicitud con un patrón regex (formato: Nombre-Encabezado: patrón)" }, "include_headers": { - "label": "Include Headers", - "notice": "Include request headers in the workflow execution input" + "label": "Incluir encabezados", + "notice": "Incluir los encabezados de la solicitud en la entrada de ejecución del flujo de trabajo" }, "include_query_params": { - "label": "Include Query Parameters" + "label": "Incluir parámetros de consulta" }, "include_request_metadata": { - "label": "Include Request Metadata", - "notice": "Include request metadata (method, URL, client IP) in execution input" + "label": "Incluir metadatos de la solicitud", + "notice": "Incluir metadatos de la solicitud (método, URL, IP del cliente) en la entrada de ejecución" } - } + }, + "status-cancelled": "Cancelled", + "select-method": "Seleccionar método" } diff --git a/src/i18n/locales/fr/chat.json b/src/i18n/locales/fr/chat.json index fba570cee..35200d3d0 100644 --- a/src/i18n/locales/fr/chat.json +++ b/src/i18n/locales/fr/chat.json @@ -91,5 +91,7 @@ "input-attach-manage-connectors": "Gérer les connecteurs", "input-attach-open-browser": "Ouvrir un navigateur", "input-attach-manage-browsers": "Gérer les navigateurs", - "input-attach-menu-trigger": "Ajouter fichiers ou photos ou ouvrir Compétences, Connecteurs ou Navigateur depuis le menu" + "input-attach-menu-trigger": "Ajouter fichiers ou photos ou ouvrir Compétences, Connecteurs ou Navigateur depuis le menu", + "hide-file-sidebar": "Masquer la barre latérale des fichiers", + "show-file-sidebar": "Afficher la barre latérale des fichiers" } diff --git a/src/i18n/locales/fr/dashboard.json b/src/i18n/locales/fr/dashboard.json index b309db4e1..c1c077600 100644 --- a/src/i18n/locales/fr/dashboard.json +++ b/src/i18n/locales/fr/dashboard.json @@ -23,5 +23,7 @@ "document-agent": "Agent de Documents", "multi-modal-agent": "Agent Multi Modal", "social-media-agent": "Agent de Médias Sociaux", - "no-projects-found": "Aucun projet trouvé." + "no-projects-found": "Aucun projet trouvé.", + "no-projects-match-search": "Aucun projet ne correspond à votre recherche", + "try-different-search": "Essayez une autre recherche" } diff --git a/src/i18n/locales/fr/folder.json b/src/i18n/locales/fr/folder.json new file mode 100644 index 000000000..20ca889a6 --- /dev/null +++ b/src/i18n/locales/fr/folder.json @@ -0,0 +1,8 @@ +{ + "file-path-remote-root": "Remote", + "files-scope-all": "All files", + "files-scope-new": "New files", + "file-path-breadcrumb": "File path", + "download-file": "Télécharger le fichier", + "zip-file-is-not-supported-yet": "L'aperçu ZIP n'est pas encore pris en charge." +} diff --git a/src/i18n/locales/fr/index.ts b/src/i18n/locales/fr/index.ts index efa753446..4e23f35ac 100644 --- a/src/i18n/locales/fr/index.ts +++ b/src/i18n/locales/fr/index.ts @@ -15,6 +15,7 @@ import agents from './agents.json'; import chat from './chat.json'; import dashboard from './dashboard.json'; +import folder from './folder.json'; import layout from './layout.json'; import setting from './setting.json'; import triggers from './triggers.json'; @@ -24,6 +25,7 @@ export default { agents, layout, dashboard, + folder, workforce, chat, setting, diff --git a/src/i18n/locales/fr/layout.json b/src/i18n/locales/fr/layout.json index 1a86785de..cd3372122 100644 --- a/src/i18n/locales/fr/layout.json +++ b/src/i18n/locales/fr/layout.json @@ -304,8 +304,68 @@ "restart-required": "Redémarrage requis", "restart-required-message": "Redémarrez l'application pour activer vos modifications de domaine de cookies.", "restart": "Redémarrer", - "cookie-count": "{{count}} Cookies", + "cookie-count": "{{count}} cookies", "add-new-mcp": "Ajouter un nouveau MCP", "browse-mcps": "Parcourir les MCP", - "browser-settings": "Paramètres du navigateur" + "browser-settings": "Paramètres du navigateur", + "report-bug-dialog-title": "Signaler un bug", + "report-bug-footer-hint": "Nous enregistrerons une archive ZIP des journaux de l’application, puis nous ouvrirons votre application de messagerie. Joignez l’archive ZIP enregistrée au message avant de l’envoyer.", + "report-bug-field-description": "Que s’est-il passé ?", + "report-bug-field-description-placeholder": "Décrivez le problème…", + "report-bug-field-steps": "Étapes pour reproduire (facultatif)", + "report-bug-field-steps-placeholder": "1. … 2. …", + "report-bug-meta": "Version {{version}} · {{os}} ({{arch}})", + "report-bug-description-required": "Veuillez décrire ce qui s’est passé.", + "report-bug-submit": "Enregistrer les diagnostics et ouvrir l’e-mail", + "report-bug-diagnostics-saved": "Diagnostics enregistrés. Joignez le ZIP dans votre e-mail, puis envoyez-le.", + "report-bug-mail-subject": "[Eigent] Rapport de bug", + "report-bug-mail-body-intro": "Veuillez joindre à ce message le fichier ZIP de diagnostics que vous venez d’enregistrer.", + "report-bug-mail-body-path": "ZIP enregistré dans : {{path}}", + "report-bug-mail-body-meta": "Version de l’application : {{version}} | OS : {{os}} ({{arch}})", + "report-bug-mail-body-desc": "Description :", + "report-bug-mail-body-steps": "Étapes pour reproduire :", + "report-bug-mail-body-truncated": "Le corps de l’e-mail a été raccourci en raison des limites de longueur. Consultez bug_report.txt dans le ZIP pour le texte complet.", + "project-page-tab-project": "Project", + "project-page-tab-tasks": "Tasks", + "project-page-all-tasks": "All tasks", + "project-page-status-pending": "Pending", + "no-tasks": "No tasks", + "workspace-select-project": "Sélectionner un projet", + "workspace-cowork-single-agent": "Co-travailler avec un agent unique", + "workspace-cowork-workforce": "Co-travailler avec une équipe", + "execution-context": "Contexte d’exécution", + "no-results": "No results", + "notification-panel-dismiss": "Dismiss", + "instructions": "Instructions", + "instructions-rules-tone": "Règles et ton", + "memory": "Memory", + "memory-on": "On", + "memory-off": "Off", + "workforce-setting": "Paramètre de l’équipe", + "select": "Select", + "edit-instructions": "Modifier les instructions", + "sessions-start-new": "Démarrer une nouvelle session", + "sessions-full-title": "Toutes les sessions", + "sessions-create-task-hint": "Créez une tâche pour démarrer une session", + "workforce-progress": "Progress", + "workforce-agent-folder": "Dossier de l’agent", + "workforce-agent-pool": "Agent Pool", + "expand-project-sidebar": "Développer la barre latérale", + "fold-project-sidebar": "Réduire la barre latérale", + "update": "Update", + "workspace-start-from-scratch": "Commencer de zéro", + "workspace-project-submenu": "Project", + "workspace-recent-session-now": "Now", + "workspace-recent-session-minutes": "{{count}} min", + "workspace-recent-session-hours": "{{count}}h", + "workspace-recent-session-days": "{{count}}d", + "workspace-recent-sessions-heading": "Recent", + "workspace-session-mode-label": "Mode de session", + "workspace-session-mode-cycle-hint": "Cliquez pour changer le mode de session", + "failed-to-start-task": "Échec du démarrage de la tâche. Veuillez vérifier la configuration de votre modèle.", + "workspace-work-with-panel-hide": "Masquer le panneau Travailler avec", + "workspace-work-with-panel-show": "Afficher le panneau Travailler avec", + "workspace-work-with-dismiss-overlay": "Dismiss", + "workspace-work-with-title": "Work with", + "workspace-work-with-remote-control": "Contrôle à distance" } diff --git a/src/i18n/locales/fr/setting.json b/src/i18n/locales/fr/setting.json index 3c7c81e31..fb0553826 100644 --- a/src/i18n/locales/fr/setting.json +++ b/src/i18n/locales/fr/setting.json @@ -18,17 +18,16 @@ "default": "Par défaut", "profile": "Profil", "account": "Account", - "you-are-currently-signed-in-with": "You are currently signed in with {{email}}", + "you-are-currently-signed-in-with": "Vous êtes actuellement connecté avec {{email}}", "manage": "Manage", "log-out": "Log out", "language": "Language", - "select-language": "Select language", - "system-default": "System Default", + "select-language": "Sélectionner la langue", + "system-default": "Par défaut du système", "appearance": "Appearance", "dark": "Dark", "light": "Light", "transparent": "Transparent", - "workspace-main-background": "Arrière-plan de l’espace de travail", "workspace-main-background-description": "Motif appliqué uniquement aux panneaux principaux Workforce et Session.", "workspace-main-background-empty": "Vide", @@ -37,179 +36,100 @@ "workspace-main-background-ruled": "Lignes pleines", "workspace-main-background-dotted": "Lignes pointillées", "workspace-main-background-dashed": "Lignes en tirets", - "appearance-tab": "Apparence", "color-mode": "Mode couleur", "accent-palette": "Palette d'accentuation", "accent-palette-description": "Thèmes de couleur prédéfinis pour l'interface. Enregistrés séparément pour les modes clair et sombre.", "accent-for-light": "Mode clair", "accent-for-dark": "Mode sombre", - - "data-privacy": "Data Privacy", - "data-privacy-description": "Eigent is built on a local-first principle to ensure your privacy. Your data remains on your device by default. Cloud features are optional and only use the minimum data necessary to function. For full details, visit our", - "privacy-policy": "Privacy Policy", - "how-we-handle-your-data": "How we handle your data", - "we-only-use-the-essential-data-needed-to-run-your-tasks": "We only use the essential data needed to run your tasks", - "how-we-handle-your-data-line-1": "We only use the essential data needed to run your tasks", - "how-we-handle-your-data-line-1-line-1": "Eigent may capture screenshots to analyze UI elements, read text, and determine the next action, just as you would.", - "how-we-handle-your-data-line-1-line-2": "Eigent may use your mouse and keyboard to access local software and files you specify.", - "how-we-handle-your-data-line-1-line-3": "Only the minimum task data is sent to AI model providers or the third-party integrations you enable; we have zero data-retention", - "how-we-handle-your-data-line-2": "Task files, outputs and screenshots remain in your designated task folder locally.", - "how-we-handle-your-data-line-3": "Credentials are stored locally, encrypted, and used only for approved steps.", - "how-we-handle-your-data-line-4": "Your data is never used to train our AI models without your explicit consent.", - "how-we-handle-your-data-line-5": "We don’t sell your data to third parties.", - "api-key-can-not-be-empty": "API Key can not be empty!", - "api-host-can-not-be-empty": "API Host can not be empty!", - "model-type-can-not-be-empty": "Model Type can not be empty!", - "validate-success": "Validate success", - "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "The model has been verified to support function calling, which is required to use Eigent.", - "validate-failed": "Validate failed", + "data-privacy": "Confidentialité des données", + "data-privacy-description": "Eigent est conçu selon un principe local-first afin de garantir votre confidentialité. Vos données restent par défaut sur votre appareil. Les fonctionnalités cloud sont facultatives et n'utilisent que les données minimales nécessaires à leur fonctionnement. Pour plus de détails, consultez notre", + "privacy-policy": "Politique de confidentialité", + "how-we-handle-your-data": "Comment nous traitons vos données", + "we-only-use-the-essential-data-needed-to-run-your-tasks": "Nous utilisons uniquement les données essentielles nécessaires pour exécuter vos tâches", + "how-we-handle-your-data-line-1": "Nous utilisons uniquement les données essentielles nécessaires pour exécuter vos tâches", + "how-we-handle-your-data-line-1-line-1": "Eigent peut capturer des captures d’écran pour analyser les éléments de l’interface, lire le texte et déterminer la prochaine action, tout comme vous le feriez.", + "how-we-handle-your-data-line-1-line-2": "Eigent peut utiliser votre souris et votre clavier pour accéder aux logiciels et fichiers locaux que vous spécifiez.", + "how-we-handle-your-data-line-1-line-3": "Seules les données minimales de la tâche sont envoyées aux fournisseurs de modèles d’IA ou aux intégrations tierces que vous ակտիվez ; nous n’avons aucune conservation des données", + "how-we-handle-your-data-line-2": "Les fichiers de tâche, les résultats et les captures d’écran restent localement dans votre dossier de tâche désigné.", + "how-we-handle-your-data-line-3": "Les identifiants sont stockés localement, chiffrés et utilisés uniquement pour les étapes approuvées.", + "how-we-handle-your-data-line-4": "Vos données ne sont jamais utilisées pour entraîner nos modèles d’IA sans votre consentement explicite.", + "how-we-handle-your-data-line-5": "Nous ne vendons pas vos données à des tiers.", + "api-key-can-not-be-empty": "La clé API ne peut pas être vide !", + "api-host-can-not-be-empty": "L'hôte API ne peut pas être vide !", + "model-type-can-not-be-empty": "Le type de modèle ne peut pas être vide !", + "validate-success": "Validation réussie", + "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "Le modèle a été vérifié comme prenant en charge l'appel de fonctions, ce qui est requis pour utiliser Eigent.", + "validate-failed": "Validation échouée", "copy": "Copy", - "copied-to-clipboard": "Copied to clipboard", + "copied-to-clipboard": "Copié dans le presse-papiers", "failed-to-copy-to-clipboard": "Échec de la copie dans le presse-papiers", - "endpoint-url-can-not-be-empty": "Endpoint URL can not be empty!", - "verification-failed-please-check-endpoint-url": "Verification failed, please check Endpoint URL", - "eigent-cloud-version": "Eigent Cloud Version", - "you-are-currently-subscribed-to-the": "You are currently subscribed to the", - "discover-more-about-our": "Discover more about our", - "pricing-options": "pricing options", + "endpoint-url-can-not-be-empty": "L'URL du point de terminaison ne peut pas être vide !", + "verification-failed-please-check-endpoint-url": "Vérification échouée, veuillez vérifier l'URL du point de terminaison", + "eigent-cloud-version": "Version Eigent Cloud", + "you-are-currently-subscribed-to-the": "Vous êtes actuellement abonné au", + "discover-more-about-our": "Découvrez-en plus sur nos", + "pricing-options": "options tarifaires", "credits": "Credits", - "select-model-type": "Select Model Type", - "custom-model": "Custom Model", - "use-your-own-api-keys-or-set-up-a-local-model": "Use your own API keys or set up a local model.", + "select-model-type": "Sélectionner le type de modèle", + "custom-model": "Modèle personnalisé", + "use-your-own-api-keys-or-set-up-a-local-model": "Utilisez vos propres clés API ou configurez un modèle local.", "verify": "Verify", "local-model": "Local Model", - "model-platform": "Model Platform", - "model-endpoint-url": "Model Endpoint URL", + "model-platform": "Plateforme du modèle", + "model-endpoint-url": "URL du point de terminaison du modèle", "model-type": "Model Type", - "enter-your-local-model-type": "Enter your local model type", - "you-are-on-selft-host-mode": "You are on Selft Host Mode", - "you-are-using-self-hosted-mode": "You're using Self-hosted mode. To get the best performance from this product, please enter the Google Search Key in \"MCP and Tools\" to ensure Eigent works properly.", - "the-google-search-key-is-essential-for-delivering-accurate-search-results": "The Google Search Key is essential for delivering accurate search results. Exa Search Key is optional but highly recommended for better performance.", + "enter-your-local-model-type": "Entrez votre type de modèle local", + "you-are-on-selft-host-mode": "Vous êtes en mode d’auto-hébergement", + "you-are-using-self-hosted-mode": "Vous utilisez le mode auto-hébergé. Pour obtenir les meilleures performances de ce produit, veuillez saisir la clé de recherche Google dans « MCP and Tools » afin de garantir le bon fonctionnement d’Eigent.", + "the-google-search-key-is-essential-for-delivering-accurate-search-results": "La clé de recherche Google est essentielle pour fournir des résultats de recherche précis. La clé de recherche Exa est facultative mais fortement recommandée pour de meilleures performances.", "close": "Close", - "enter-your-api-key": "Enter your API", + "enter-your-api-key": "Entrez votre API", "key": "Key", - "enter-your-api-host": "Enter your API Host", + "enter-your-api-host": "Entrez l’hôte de votre API", "url": "URL", - "enter-your-model-type": "Enter your Model Type", - "verifying": "Verifying...", - - "account": "Account", - "you-are-currently-signed-in-with": "You are currently signed in with {{email}}", - "manage": "Manage", - "log-out": "Log out", - "language": "Language", - "select-language": "Select language", - "system-default": "System Default", - "appearance": "Appearance", - "dark": "Dark", - "light": "Light", - "transparent": "Transparent", - - "workspace-main-background": "Arrière-plan de l’espace de travail", - "workspace-main-background-description": "Motif appliqué uniquement aux panneaux principaux Workforce et Session.", - "workspace-main-background-empty": "Vide", - "workspace-main-background-dots": "Points", - "workspace-main-background-blocks": "Grille", - "workspace-main-background-ruled": "Lignes pleines", - "workspace-main-background-dotted": "Lignes pointillées", - "workspace-main-background-dashed": "Lignes en tirets", - - "appearance-tab": "Apparence", - "color-mode": "Mode couleur", - "accent-palette": "Palette d'accentuation", - "accent-palette-description": "Thèmes de couleur prédéfinis pour l'interface. Enregistrés séparément pour les modes clair et sombre.", - "accent-for-light": "Mode clair", - "accent-for-dark": "Mode sombre", - - "data-privacy": "Data Privacy", - "data-privacy-description": "Eigent is built on a local-first principle to ensure your privacy. Your data remains on your device by default. Cloud features are optional and only use the minimum data necessary to function. For full details, visit our", - "privacy-policy": "Privacy Policy", - "how-we-handle-your-data": "How we handle your data", - "we-only-use-the-essential-data-needed-to-run-your-tasks": "We only use the essential data needed to run your tasks", - "how-we-handle-your-data-line-1": "We only use the essential data needed to run your tasks", - "how-we-handle-your-data-line-1-line-1": "Eigent may capture screenshots to analyze UI elements, read text, and determine the next action, just as you would.", - "how-we-handle-your-data-line-1-line-2": "Eigent may use your mouse and keyboard to access local software and files you specify.", - "how-we-handle-your-data-line-1-line-3": "Only the minimum task data is sent to AI model providers or the third-party integrations you enable; we have zero data-retention", - "how-we-handle-your-data-line-2": "Task files, outputs and screenshots remain in your designated task folder locally.", - "how-we-handle-your-data-line-3": "Credentials are stored locally, encrypted, and used only for approved steps.", - "how-we-handle-your-data-line-4": "Your data is never used to train our AI models without your explicit consent.", - "how-we-handle-your-data-line-5": "We don’t sell your data to third parties.", - "api-key-can-not-be-empty": "API Key can not be empty!", - "api-host-can-not-be-empty": "API Host can not be empty!", - "model-type-can-not-be-empty": "Model Type can not be empty!", - "validate-success": "Validate success", - "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "The model has been verified to support function calling, which is required to use Eigent.", - "validate-failed": "Validate failed", - "copy": "Copy", - "copied-to-clipboard": "Copied to clipboard", - "endpoint-url-can-not-be-empty": "Endpoint URL can not be empty!", - "verification-failed-please-check-endpoint-url": "Verification failed, please check Endpoint URL", - "eigent-cloud-version": "Eigent Cloud Version", - "you-are-currently-subscribed-to-the": "You are currently subscribed to the", - "discover-more-about-our": "Discover more about our", - "pricing-options": "pricing options", - "credits": "Credits", - "select-model-type": "Select Model Type", - "custom-model": "Custom Model", - "use-your-own-api-keys-or-set-up-a-local-model": "Use your own API keys or set up a local model.", - "verify": "Verify", - "local-model": "Local Model", - "model-platform": "Model Platform", - "model-endpoint-url": "Model Endpoint URL", - "model-type": "Model Type", - "enter-your-local-model-type": "Enter your local model type", - "you-are-on-selft-host-mode": "You are on Selft Host Mode", - "you-are-using-self-hosted-mode": "You're using Self-hosted mode. To get the best performance from this product, please enter the Google Search Key in \"MCP and Tools\" to ensure Eigent works properly.", - "the-google-search-key-is-essential-for-delivering-accurate-search-results": "The Google Search Key is essential for delivering accurate search results. Exa Search Key is optional but highly recommended for better performance.", - "close": "Close", - "enter-your-api-key": "Enter your API", - "key": "Key", - "enter-your-api-host": "Enter your API Host", - "url": "URL", - "enter-your-model-type": "Enter your Model Type", - "verifying": "Verifying...", - + "enter-your-model-type": "Entrez votre type de modèle", + "verifying": "Vérification...", "mcp-and-tools": "MCP & Tools", - "add-mcp-server": "Add MCP Server", + "add-mcp-server": "Ajouter un serveur MCP", "market": "Market", "tools": "Tools", - "added-external-servers": "Added external servers", + "added-external-servers": "Serveurs externes ajoutés", "loading": "Loading...", - "no-mcp-servers": "No MCP servers", - "environmental-variables-required": "Environmental variables required", + "no-mcp-servers": "Aucun serveur MCP", + "environmental-variables-required": "Variables d’environnement requises", "load-failed": "Load failed", "save-failed": "Save failed", - "invalid-json": "Invalid JSON", + "invalid-json": "JSON invalide", "coming-soon": "Coming Soon", "uninstall": "Uninstall", "install": "Installer", "add-your-agent": "Ajoutez votre Agent", "add-a-local-mcp-server-by-providing-a-valid-json-configuration": "Ajoutez un serveur MCP local en fournissant une configuration JSON valide.", "learn-more": "En savoir plus", - "installing": "Installing...", - "edit-mcp-config": "Edit MCP Config", + "installing": "Installation...", + "edit-mcp-config": "Modifier la configuration MCP", "name": "Name", "description": "Description", "command": "Command", - "args-one-per-line": "Args (one per line)", + "args-one-per-line": "Arguments (un par ligne)", "cancel": "Cancel", "save": "Save", - "confirm-delete": "Confirm Delete", - "are-you-sure-you-want-to-delete": "Are you sure you want to delete", + "confirm-delete": "Confirmer la suppression", + "are-you-sure-you-want-to-delete": "Êtes-vous sûr de vouloir supprimer", "deleting": "Deleting...", "delete": "Delete", - "configure {name} Toolkit": "Configure {{name}} Toolkit", + "configure {name} Toolkit": "Configurer la boîte à outils {{name}}", "get-it-from": "Get it from", - "google-custom-search-api": "Google Custom Search API", - "google-cloud-console": "Google Cloud Console", + "google-custom-search-api": "API de recherche personnalisée Google", + "google-cloud-console": "Console Google Cloud", "connect": "Connect", "setting": "Setting", "all": "All", "mcp-market": "MCP Market", - "no-mcp-services": "No MCP services", - "loading-more": "Loading more...", - "no-more-mcp-servers": "No more MCP servers", + "no-mcp-services": "Aucun service MCP", + "loading-more": "Chargement supplémentaire...", + "no-more-mcp-servers": "Plus de serveurs MCP", "search-mcp": "Search MCPs", "installed": "Installed", "worker-name-cannot-be-empty": "Le nom du worker ne peut pas être vide", @@ -252,7 +172,6 @@ "reset-success": "Réinitialisation réussie !", "reset-failed": "Échec de la réinitialisation !", "select-default-model": "Sélectionner le modèle par défaut", - "browser-login": "Connexion navigateur", "browser-login-description": "Ouvrez Chrome pour vous connecter à vos comptes. Vos données de connexion sont enregistrées localement dans un profil sécurisé.", "open-browser-login": "Ouvrir le navigateur pour la connexion", @@ -277,7 +196,6 @@ "confirm-delete-all-cookies": "Supprimer tous les cookies ? Cette action est irréversible.", "all-cookies-deleted": "Tous les cookies ont été supprimés avec succès.", "cookie-delete-warning": "Remarque : la suppression des cookies vous déconnectera des sites associés. Un redémarrage du navigateur peut être nécessaire.", - "network-proxy": "Proxy réseau", "network-proxy-description": "Configurez un serveur proxy pour les requêtes réseau. Utile si vous devez accéder à des API externes via un proxy.", "proxy-placeholder": "http://127.0.0.1:7890", @@ -285,7 +203,6 @@ "proxy-save-failed": "Échec de l'enregistrement de la configuration du proxy.", "proxy-invalid-url": "URL de proxy invalide. Doit commencer par http://, https://, socks4:// ou socks5://.", "proxy-restart-hint": "Redémarrage nécessaire pour appliquer les modifications du proxy.", - "cloud-not-available-in-local-proxy": "La version cloud n'est pas disponible en mode proxy local", "set-as-default": "Définir comme défaut", "api-key-setting": "Paramètre de clé API", @@ -293,11 +210,9 @@ "model-type-setting": "Paramètre de type de modèle", "please-select": "Veuillez sélectionner", "configuring": "Configuration...", - "models-default-setting-title": "Paramètre par défaut", "models-default-setting-description": "Choisissez l'un de vos modèles configurés comme modèle par défaut pour Eigent. Il sera appliqué globalement dans votre espace de travail.", "models-configuration": "Configuration", - "gemini-3-pro-preview-name": "Gemini 3 Pro Preview", "gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview", "gemini-3-flash-preview-name": "Gemini 3 Flash Preview", @@ -311,11 +226,15 @@ "claude-opus-4-7-name": "Claude Opus 4.7", "deepseek-v4-pro-name": "DeepSeek V4 Pro", "minimax-m2-7-name": "Minimax M2.7", - "preferred-ide": "IDE préféré", "preferred-ide-description": "Choisissez l'application à utiliser lors de l'ouverture des dossiers de projets d'agent.", "system-file-manager": "Gestionnaire de fichiers système", "agents": "Agents", "help-improve-eigent": "Aidez à améliorer Eigent", - "help-improve-eigent-description": "Autorisez Eigent à collecter des journaux d'erreurs anonymes et des données d'utilisation pour améliorer le service. Ceci est facultatif et peut être modifié à tout moment." + "help-improve-eigent-description": "Autorisez Eigent à collecter des journaux d'erreurs anonymes et des données d'utilisation pour améliorer le service. Ceci est facultatif et peut être modifié à tout moment.", + "please-complete-authorization-in-browser": "Veuillez terminer l'autorisation dans votre navigateur", + "authorization-cancelled": "Autorisation annulée", + "authorization-failed": "Échec de l'autorisation", + "this-service-is-already-enabled-by-default": "Ce service est déjà activé par défaut", + "version": "Version" } diff --git a/src/i18n/locales/fr/triggers.json b/src/i18n/locales/fr/triggers.json index 2c341b06d..8df4a7f0b 100644 --- a/src/i18n/locales/fr/triggers.json +++ b/src/i18n/locales/fr/triggers.json @@ -2,19 +2,19 @@ "name": "Name", "description": "Description", "trigger-type": "Type", - "create-new": "Create New Trigger", - "trigger-details": "Trigger Details", - "no-trigger-selected": "No Trigger Selected", - "select-trigger-hint": "Click on a trigger from the list to view its details", - "no-triggers": "No triggers yet", - "name-placeholder": "Enter trigger name", - "description-placeholder": "Enter trigger description", + "create-new": "Créer un nouveau déclencheur", + "trigger-details": "Détails du déclencheur", + "no-trigger-selected": "Aucun déclencheur sélectionné", + "select-trigger-hint": "Cliquez sur un déclencheur dans la liste pour voir ses détails", + "no-triggers": "Aucun déclencheur pour le moment", + "name-placeholder": "Saisissez le nom du déclencheur", + "description-placeholder": "Saisissez la description du déclencheur", "schedule-trigger": "Schedule", "webhook-trigger": "Webhook", "slack-trigger": "Slack", "app-trigger": "App Trigger", - "cron-expression": "Cron Expression", - "cron-help": "Format: minute hour day month weekday (e.g., 0 */1 * * * = every hour)", + "cron-expression": "Expression Cron", + "cron-help": "Format : minute heure jour mois jour-semaine (ex. : 0 */1 * * * = toutes les heures)", "cron-empty": "L'expression cron ne peut pas être vide", "cron-invalid-format": "Format cron invalide. Attendu : minute heure jour mois jour de la semaine (ex. : 0 */1 * * *)", "cron-invalid-minute": "Valeur de minute invalide. Doit être 0-59 ou une expression cron valide", @@ -22,23 +22,23 @@ "cron-invalid-day": "Valeur de jour invalide. Doit être 1-31 ou une expression cron valide", "cron-invalid-month": "Valeur de mois invalide. Doit être 1-12 ou une expression cron valide", "cron-invalid-weekday": "Valeur de jour de la semaine invalide. Doit être 0-6 (0=Dimanche) ou une expression cron valide", - "listener-type": "Listener Type", - "select-listener": "Select listener type", + "listener-type": "Type d'écouteur", + "select-listener": "Sélectionnez le type d'écouteur", "chat-agent": "Chat Agent", "workforce": "Workforce", "agent-model": "Agent Model", "task-prompt": "Task Prompt", - "task-prompt-placeholder": "Enter the task prompt for this trigger", - "max-per-hour": "Max Per Hour", + "task-prompt-placeholder": "Saisissez l'invite de tâche pour ce déclencheur", + "max-per-hour": "Maximum par heure", "max-per-day": "Max Per Day", - "single-execution": "Single Execution", + "single-execution": "Exécution unique", "webhook-url": "Webhook URL", "executions": "Executions", "errors": "Errors", "view-runs": "View Runs", "activate": "Activate", "deactivate": "Deactivate", - "execution-id": "Execution ID", + "execution-id": "ID d'exécution", "started": "Started", "duration": "Duration", "tokens": "Tokens", @@ -46,29 +46,29 @@ "failed": "Failed", "running": "Running", "pending": "Pending", - "no-executions": "No executions found", - "executions-for": "Executions for", - "name-required": "Trigger name is required", - "created-successfully": "Trigger created successfully", - "failed-to-create": "Failed to create trigger", - "failed-to-load": "Failed to load triggers", - "activated": "Trigger activated", - "deactivated": "Trigger deactivated", - "failed-to-toggle": "Failed to toggle trigger status", - "webhook-created-title": "Webhook Created Successfully", - "webhook-created-subtitle": "Your new webhook trigger is ready to receive requests", - "webhook-ready": "Webhook Ready!", - "webhook-instructions": "Use the URL below to trigger this agent. Send a request with any JSON body.", - "your-webhook-url": "Your Webhook URL", - "webhook-tip-title": "Did you know?", - "webhook-tip-description": "You can include custom data in your JSON payload and reference it in your task prompt using {{variable_name}}.", - "webhook-url-copied": "Webhook URL copied to clipboard", - "confirm-delete": "Are you sure you want to delete this trigger?", - "deleted": "Trigger deleted", - "failed-to-delete": "Failed to delete trigger", - "webhook-copied": "Webhook URL copied to clipboard", - "failed-to-copy": "Failed to copy webhook URL", - "trigger-task": "Trigger Task", + "no-executions": "Aucune exécution trouvée", + "executions-for": "Exécutions pour", + "name-required": "Le nom du déclencheur est requis", + "created-successfully": "Déclencheur créé avec succès", + "failed-to-create": "Échec de la création du déclencheur", + "failed-to-load": "Échec du chargement des déclencheurs", + "activated": "Déclencheur activé", + "deactivated": "Déclencheur désactivé", + "failed-to-toggle": "Échec du changement d'état du déclencheur", + "webhook-created-title": "Webhook créé avec succès", + "webhook-created-subtitle": "Votre nouveau déclencheur webhook est prêt à recevoir des requêtes", + "webhook-ready": "Webhook prêt !", + "webhook-instructions": "Utilisez l'URL ci-dessous pour déclencher cet agent. Envoyez une requête avec n'importe quel corps JSON.", + "your-webhook-url": "Votre URL de webhook", + "webhook-tip-title": "Le saviez-vous ?", + "webhook-tip-description": "Vous pouvez inclure des données personnalisées dans votre charge utile JSON et y faire référence dans votre invite de tâche à l'aide de {{variable_name}}.", + "webhook-url-copied": "URL du webhook copiée dans le presse-papiers", + "confirm-delete": "Êtes-vous sûr de vouloir supprimer ce déclencheur ?", + "deleted": "Déclencheur supprimé", + "failed-to-delete": "Échec de la suppression du déclencheur", + "webhook-copied": "URL du webhook copiée dans le presse-papiers", + "failed-to-copy": "Échec de la copie de l'URL du webhook", + "trigger-task": "Déclencher la tâche", "task-mode-text": "Text", "task-mode-json": "JSON", "schedule-frequency": "Frequency", @@ -81,44 +81,44 @@ "weekday-thursday": "Thursday", "weekday-friday": "Friday", "weekday-saturday": "Saturday", - "webhook-function": "Webhook Function", + "webhook-function": "Fonction webhook", "frequency-hourly": "Every Hour", "frequency-daily": "Daily", "frequency-weekly": "Weekly", "frequency-monthly": "Monthly", "frequency-one-time": "One Time", "frequency-custom": "Custom", - "invalid-time-format": "Invalid time format. Use HH:MM (e.g., 09:30)", - "schedule-day-of-month-note": "If the selected day doesn’t exist in that month (e.g., the 31st), the task will be skipped.", + "invalid-time-format": "Format d'heure invalide. Utilisez HH:MM (par exemple, 09:30)", + "schedule-day-of-month-note": "Si le jour sélectionné n'existe pas dans ce mois (par exemple, le 31), la tâche sera ignorée.", "schedule-hour": "Heure", "schedule-minute": "Minute", "schedule-date": "Date", "select-date": "Select date", - "schedule-day-of-month": "Day of Month", + "schedule-day-of-month": "Jour du mois", "select-day": "Select day", "day-of-month": "Day {{day}}", - "schedule-weekdays": "Days of Week", - "expiration-date": "Expiration Date", - "no-expiration": "No expiration", - "select-expiration": "Select expiration date", - "no-upcoming-one-time": "Select a future date and time", - "no-upcoming-executions": "No upcoming executions", - "date-required": "Date is required", - "weekday-required": "At least one weekday is required", - "schedule-required-fields": "Please fill in all required fields for the schedule", - "create-trigger-agent": "Automate task with trigger", - "trigger-overview": "Trigger Overview", + "schedule-weekdays": "Jours de la semaine", + "expiration-date": "Date d'expiration", + "no-expiration": "Aucune expiration", + "select-expiration": "Sélectionnez une date d'expiration", + "no-upcoming-one-time": "Sélectionnez une date et une heure futures", + "no-upcoming-executions": "Aucune exécution à venir", + "date-required": "La date est requise", + "weekday-required": "Au moins un jour de la semaine est requis", + "schedule-required-fields": "Veuillez remplir tous les champs obligatoires du planning", + "create-trigger-agent": "Automatiser la tâche avec un déclencheur", + "trigger-overview": "Vue d'ensemble du déclencheur", "edit": "Edit", "delete": "Delete", "period": "Period", "created-at": "Created At", - "execution-history": "Execution History", + "execution-history": "Historique d'exécution", "run-time": "Run Time", "success": "Success", - "output-tasks": "Output Tasks", + "output-tasks": "Tâches de sortie", "logs": "Logs", "close": "Close", - "confirm-delete-trigger": "Are you sure you want to delete this trigger?", + "confirm-delete-trigger": "Êtes-vous sûr de vouloir supprimer ce déclencheur ?", "status": { "active": "Active", "inactive": "Inactive", @@ -126,66 +126,66 @@ "completed": "Completed", "unknown": "Unknown" }, - "webhook-url-after-creation": "You can find your webhook URL in the trigger details after creation.", - "webhook-method": "Request Method", - "created-time": "Created Time", - "last-execution-label": "Last Execution", + "webhook-url-after-creation": "Vous trouverez l'URL de votre webhook dans les détails du déclencheur après sa création.", + "webhook-method": "Méthode de requête", + "created-time": "Heure de création", + "last-execution-label": "Dernière exécution", "token-cost": "Token Cost", - "updated-successfully": "Trigger updated successfully", + "updated-successfully": "Déclencheur mis à jour avec succès", "title": "Triggers", - "create-hint": "Create a trigger to automate your tasks", - "live-activity": "Live Activity", - "no-activity": "No activity yet", - "activity-hint": "Activity will appear here", - "execution-logs": "Execution Logs", + "create-hint": "Créez un déclencheur pour automatiser vos tâches", + "live-activity": "Activité en direct", + "no-activity": "Aucune activité pour le moment", + "activity-hint": "L'activité apparaîtra ici", + "execution-logs": "Journaux d'exécution", "fold-execution-logs": "Replier les journaux d'exécution", "open-execution-logs": "Ouvrir les journaux d'exécution", - "delete-trigger": "Delete Trigger", + "delete-trigger": "Supprimer le déclencheur", "cancel": "Cancel", "deleting": "Deleting...", - "duplicated-successfully": "Trigger duplicated as \"{{name}}\"", - "confirm-delete-message": "Are you sure you want to delete \"{{name}}\"? This action cannot be undone.", + "duplicated-successfully": "Déclencheur dupliqué sous le nom « {{name}} »", + "confirm-delete-message": "Êtes-vous sûr de vouloir supprimer « {{name}} » ? Cette action est irréversible.", "workspace": "Workspace", - "agent-folder": "Agent Folder", + "agent-folder": "Dossier de l'agent", "add": "Add", "upload": "Upload", "create": "Create", "loading": "Loading...", - "loading-executions": "Loading execution data...", - "failed-to-load-executions": "Failed to load execution data", - "no-execution-data": "No execution data available", + "loading-executions": "Chargement des données d'exécution...", + "failed-to-load-executions": "Échec du chargement des données d'exécution", + "no-execution-data": "Aucune donnée d'exécution disponible", "total-runs": "Total Runs", - "success-rate": "Success Rate", - "no-executions-yet": "No executions yet", + "success-rate": "Taux de réussite", + "no-executions-yet": "Aucune exécution pour le moment", "last-run-label": "Last run", - "execution-completed-success": "Execution completed successfully", - "execution-failed-message": "Execution failed", - "execution-in-progress": "Execution in progress...", - "waiting-to-execute": "Waiting to execute...", - "execution-cancelled": "Execution was cancelled", - "execution-missed": "Execution was missed", - "unknown-status": "Unknown status", + "execution-completed-success": "Exécution terminée avec succès", + "execution-failed-message": "L'exécution a échoué", + "execution-in-progress": "Exécution en cours...", + "waiting-to-execute": "En attente d'exécution...", + "execution-cancelled": "L'exécution a été annulée", + "execution-missed": "L'exécution a été manquée", + "unknown-status": "Statut inconnu", "trigger-label": "Trigger", "status-created": "Created", "status-updated": "Updated", "status-activated": "Activated", "status-deleted": "Deleted", "status-deactivated": "Deactivated", - "status-execution-started": "Execution started", - "status-execution-completed": "Execution completed", + "status-execution-started": "Exécution démarrée", + "status-execution-completed": "Exécution terminée", "status-error": "Error", - "status-webhook-triggered": "Webhook triggered", + "status-webhook-triggered": "Webhook déclenché", "status-activity": "Activity", - "upcoming-executions": "Upcoming Executions", + "upcoming-executions": "Exécutions à venir", "preview-scheduled-times": "Aperçu des Heures Planifiées", - "task-prompt-required": "Task prompt is required", - "project-id-required": "Project ID is required", - "execution-settings": "Execution Settings", - "extra-settings": "Extra Settings", + "task-prompt-required": "L'invite de tâche est requise", + "project-id-required": "L'ID du projet est requis", + "execution-settings": "Paramètres d'exécution", + "extra-settings": "Paramètres supplémentaires", "max-per-hour-placeholder": "0", "max-per-day-placeholder": "0", "copy": "Copy", - "edit-trigger-agent": "Edit Trigger Agent", + "edit-trigger-agent": "Modifier l'agent déclencheur", "updating": "Updating...", "creating": "Creating...", "update": "Update", @@ -195,102 +195,102 @@ "activation-limit-reached": "Limite d'activation atteinte : 5 déclencheurs actifs maximum par projet, 25 par utilisateur", "never": "Never", "duplicate": "Duplicate", - "no-task-prompt": "No task prompt", + "no-task-prompt": "Aucune invite de tâche", "select-app": "Sélectionner l'application", "change-app": "Change", "dynamic": { "credentials": "Credentials", - "credentials-notice": "Your credentials are stored securely and used to authenticate with the service.", - "credentials-saved": "Credentials configured successfully", + "credentials-notice": "Vos identifiants sont stockés en toute sécurité et utilisés pour l'authentification auprès du service.", + "credentials-saved": "Identifiants configurés avec succès", "configuration": "Configuration", - "behavior-settings": "Behavior Settings", - "enter-value": "Please enter a value", + "behavior-settings": "Paramètres de comportement", + "enter-value": "Veuillez saisir une valeur", "add": "Add", "update": "Update", - "config-saved": "Configuration saved successfully", - "config-updated": "Configuration updated successfully", - "config-save-error": "Failed to save configuration", + "config-saved": "Configuration enregistrée avec succès", + "config-updated": "Configuration mise à jour avec succès", + "config-save-error": "Échec de l'enregistrement de la configuration", "loading": "Loading...", - "loading-config": "Loading configuration...", - "no-config-available": "No configuration available for this trigger type", - "failed-to-load-schema": "Failed to load configuration schema", - "select-options": "Select options...", + "loading-config": "Chargement de la configuration...", + "no-config-available": "Aucune configuration disponible pour ce type de déclencheur", + "failed-to-load-schema": "Échec du chargement du schéma de configuration", + "select-options": "Sélectionner des options...", "selected": "selected", - "save-credentials-first": "Save credentials first", + "save-credentials-first": "Enregistrez d'abord les identifiants", "search": "Search...", - "no-options": "No options found", + "no-options": "Aucune option trouvée", "validation": { - "required": "{{field}} is required", - "invalid-regex": "Invalid regular expression pattern", - "invalid-email": "Invalid email address", - "invalid-url": "Invalid URL format", - "min-length": "Must be at least {{min}} characters", - "max-length": "Must be no more than {{max}} characters", - "pattern-mismatch": "Value does not match required pattern", - "min-value": "Must be at least {{min}}", - "max-value": "Must be no more than {{max}}" + "required": "{{field}} est requis", + "invalid-regex": "Motif d'expression régulière invalide", + "invalid-email": "Adresse e-mail invalide", + "invalid-url": "Format d'URL invalide", + "min-length": "Doit comporter au moins {{min}} caractères", + "max-length": "Ne doit pas dépasser {{max}} caractères", + "pattern-mismatch": "La valeur ne correspond pas au motif requis", + "min-value": "Doit être au moins {{min}}", + "max-value": "Ne doit pas être supérieur à {{max}}" }, - "validation-failed": "Please fix validation errors: {{errors}}" + "validation-failed": "Veuillez corriger les erreurs de validation : {{errors}}" }, "slack": { - "credentials-saved": "Slack credentials configured successfully", - "enter-bot-token": "Please enter a bot token", - "bot-token-saved": "Bot token saved successfully", - "bot-token-updated": "Bot token updated successfully", - "bot-token-save-error": "Failed to save bot token", - "signing-secret-saved": "Signing secret saved successfully", - "signing-secret-updated": "Signing secret updated successfully", - "signing-secret-save-error": "Failed to save signing secret", + "credentials-saved": "Identifiants Slack configurés avec succès", + "enter-bot-token": "Veuillez saisir un jeton de bot", + "bot-token-saved": "Jeton de bot enregistré avec succès", + "bot-token-updated": "Jeton de bot mis à jour avec succès", + "bot-token-save-error": "Échec de l'enregistrement du jeton de bot", + "signing-secret-saved": "Secret de signature enregistré avec succès", + "signing-secret-updated": "Secret de signature mis à jour avec succès", + "signing-secret-save-error": "Échec de l'enregistrement du secret de signature", "add": "Add", "update": "Update", - "event-configuration": "Event Configuration", + "event-configuration": "Configuration des événements", "event-types": "Event Types", - "select-events": "Select events to trigger on...", - "search-events": "Search events...", - "no-events-found": "No events found", - "events-selected": "events selected", - "channel-filter": "Channel Filter", - "select-channels": "All channels (no filter)", - "search-channels": "Search channels...", - "no-channels-found": "No channels found", - "channels-selected": "channels selected", - "save-credentials-first": "Save credentials first to load channels", - "loading-channels": "Loading channels...", - "channels-fetch-error": "Failed to fetch channels. Please check your credentials.", - "behavior-settings": "Behavior Settings", + "select-events": "Sélectionnez les événements à déclencher...", + "search-events": "Rechercher des événements...", + "no-events-found": "Aucun événement trouvé", + "events-selected": "événements sélectionnés", + "channel-filter": "Filtre de canal", + "select-channels": "Tous les canaux (aucun filtre)", + "search-channels": "Rechercher des canaux...", + "no-channels-found": "Aucun canal trouvé", + "channels-selected": "canaux sélectionnés", + "save-credentials-first": "Enregistrez d'abord les identifiants pour charger les canaux", + "loading-channels": "Chargement des canaux...", + "channels-fetch-error": "Échec de la récupération des canaux. Veuillez vérifier vos identifiants.", + "behavior-settings": "Paramètres de comportement", "authentication_required": { - "label": "Require Authentication", - "notice": "Slack triggers require authentication to verify webhook signatures (Slack Signing Secret required). Verify webhook endpoint at https://api.slack.com/apps to activate trigger." + "label": "Exiger l'authentification", + "notice": "Les déclencheurs Slack nécessitent une authentification pour vérifier les signatures du webhook (Slack Signing Secret requis). Vérifiez le point de terminaison du webhook sur https://api.slack.com/apps pour activer le déclencheur." }, "bot_token": { - "label": "Slack Bot Token", + "label": "Jeton Slack Bot", "placeholder": "xoxb-...", - "notice": "Your Slack Bot User OAuth Token (starts with xoxb-)" + "notice": "Votre jeton OAuth du bot Slack (commence par xoxb-)" }, "signing_secret": { - "label": "Slack Signing Secret", - "placeholder": "Enter your Slack signing secret...", - "notice": "Your Slack app's signing secret used to verify requests" + "label": "Secret de signature Slack", + "placeholder": "Entrez votre secret de signature Slack...", + "notice": "Le secret de signature de votre application Slack, utilisé pour vérifier les requêtes" }, "events": { "label": "Event Types", - "notice": "Select which Slack events should trigger this workflow" + "notice": "Sélectionnez les événements Slack qui doivent déclencher ce workflow" }, "channel_id": { "label": "Channel ID", - "placeholder": "Select a channel...", - "notice": "Specific channel to watch (leave empty to watch all channels)" + "placeholder": "Sélectionnez un canal...", + "notice": "Canal spécifique à surveiller (laissez vide pour surveiller tous les canaux)" }, "ignore_bot_messages": { - "label": "Ignore Bot Messages" + "label": "Ignorer les messages des bots" }, "ignore_users": { - "label": "Ignore Users", - "placeholder": "Enter Slack user IDs (e.g., U1234567890)...", - "notice": "Slack user IDs to ignore messages from" + "label": "Ignorer des utilisateurs", + "placeholder": "Entrez les identifiants des utilisateurs Slack (par ex., U1234567890)...", + "notice": "Identifiants des utilisateurs Slack dont les messages doivent être ignorés" } }, - "verification-required": "Pending Verification. A valid event message is required for Trigger Activation or disable trigger Authentication.", + "verification-required": "Vérification en attente. Un message d'événement valide est requis pour activer le déclencheur ou désactiver l'authentification du déclencheur.", "base": { "authentication_required": { "label": "Authentification requise", @@ -309,34 +309,36 @@ }, "webhook": { "authentication_required": { - "label": "Require Authentication", - "notice": "Whether authentication is required for this webhook trigger" + "label": "Exiger une authentification", + "notice": "Indique si une authentification est requise pour ce déclencheur de webhook" }, "body_contains": { - "label": "Body Contains", - "placeholder": "Enter text that must be in request body...", - "notice": "Only trigger if the request body contains this string" + "label": "Le corps contient", + "placeholder": "Entrez le texte qui doit figurer dans le corps de la requête...", + "notice": "Déclencher uniquement si le corps de la requête contient cette chaîne" }, "required_headers": { - "label": "Required Headers", - "placeholder": "Enter header names (e.g., Content-Type, Authorization)...", - "notice": "List of HTTP headers that must be present in the request" + "label": "En-têtes requis", + "placeholder": "Entrez les noms des en-têtes (par ex., Content-Type, Authorization)...", + "notice": "Liste des en-têtes HTTP qui doivent être présents dans la requête" }, "header_match": { - "label": "Header Match (Regex)", - "placeholder": "Header-Name: regex pattern", - "notice": "Match request headers against a regex pattern (format: Header-Name: pattern)" + "label": "Correspondance des en-têtes (Regex)", + "placeholder": "Nom-Du-En-Tête : motif regex", + "notice": "Faire correspondre les en-têtes de la requête à un motif regex (format : Nom-Du-En-Tête : motif)" }, "include_headers": { - "label": "Include Headers", - "notice": "Include request headers in the workflow execution input" + "label": "Inclure les en-têtes", + "notice": "Inclure les en-têtes de la requête dans l'entrée d'exécution du workflow" }, "include_query_params": { - "label": "Include Query Parameters" + "label": "Inclure les paramètres de requête" }, "include_request_metadata": { - "label": "Include Request Metadata", - "notice": "Include request metadata (method, URL, client IP) in execution input" + "label": "Inclure les métadonnées de la requête", + "notice": "Inclure les métadonnées de la requête (méthode, URL, IP client) dans l'entrée d'exécution" } - } + }, + "status-cancelled": "Cancelled", + "select-method": "Sélectionner une méthode" } diff --git a/src/i18n/locales/it/chat.json b/src/i18n/locales/it/chat.json index 695dc066d..2b129f7c3 100644 --- a/src/i18n/locales/it/chat.json +++ b/src/i18n/locales/it/chat.json @@ -91,5 +91,7 @@ "input-attach-manage-connectors": "Gestisci i connettori", "input-attach-open-browser": "Apri un browser", "input-attach-manage-browsers": "Gestisci i browser", - "input-attach-menu-trigger": "Aggiungi file o foto o apri Skill, Connettori o Browser dal menu" + "input-attach-menu-trigger": "Aggiungi file o foto o apri Skill, Connettori o Browser dal menu", + "hide-file-sidebar": "Nascondi la barra laterale dei file", + "show-file-sidebar": "Mostra la barra laterale dei file" } diff --git a/src/i18n/locales/it/dashboard.json b/src/i18n/locales/it/dashboard.json index 73b303687..8b42183d4 100644 --- a/src/i18n/locales/it/dashboard.json +++ b/src/i18n/locales/it/dashboard.json @@ -23,5 +23,7 @@ "document-agent": "Agente Documenti", "multi-modal-agent": "Agente Multi Modale", "social-media-agent": "Agente Social Media", - "no-projects-found": "Nessun progetto trovato." + "no-projects-found": "Nessun progetto trovato.", + "no-projects-match-search": "Nessun progetto corrisponde alla tua ricerca", + "try-different-search": "Prova una ricerca diversa" } diff --git a/src/i18n/locales/it/folder.json b/src/i18n/locales/it/folder.json new file mode 100644 index 000000000..af2f90ee4 --- /dev/null +++ b/src/i18n/locales/it/folder.json @@ -0,0 +1,8 @@ +{ + "file-path-remote-root": "Remote", + "files-scope-all": "All files", + "files-scope-new": "New files", + "file-path-breadcrumb": "File path", + "download-file": "Scarica file", + "zip-file-is-not-supported-yet": "L'anteprima ZIP non è ancora supportata." +} diff --git a/src/i18n/locales/it/index.ts b/src/i18n/locales/it/index.ts index efa753446..4e23f35ac 100644 --- a/src/i18n/locales/it/index.ts +++ b/src/i18n/locales/it/index.ts @@ -15,6 +15,7 @@ import agents from './agents.json'; import chat from './chat.json'; import dashboard from './dashboard.json'; +import folder from './folder.json'; import layout from './layout.json'; import setting from './setting.json'; import triggers from './triggers.json'; @@ -24,6 +25,7 @@ export default { agents, layout, dashboard, + folder, workforce, chat, setting, diff --git a/src/i18n/locales/it/layout.json b/src/i18n/locales/it/layout.json index bb0e9b074..ba7515f5d 100644 --- a/src/i18n/locales/it/layout.json +++ b/src/i18n/locales/it/layout.json @@ -307,5 +307,65 @@ "cookie-count": "{{count}} Cookie", "add-new-mcp": "Aggiungi nuovo MCP", "browse-mcps": "Sfoglia MCP", - "browser-settings": "Impostazioni browser" + "browser-settings": "Impostazioni browser", + "report-bug-dialog-title": "Segnala un bug", + "report-bug-footer-hint": "Salveremo un file ZIP con i log dell'app, quindi apriremo la tua app email. Allega il file ZIP salvato al messaggio prima di inviarlo.", + "report-bug-field-description": "Cosa è andato storto?", + "report-bug-field-description-placeholder": "Descrivi il problema…", + "report-bug-field-steps": "Passi per riprodurre (facoltativo)", + "report-bug-field-steps-placeholder": "1. … 2. …", + "report-bug-meta": "Versione {{version}} · {{os}} ({{arch}})", + "report-bug-description-required": "Descrivi cosa è andato storto.", + "report-bug-submit": "Salva i diagnostici e apri l'email", + "report-bug-diagnostics-saved": "Diagnostica salvata. Allega il file ZIP nella tua email, quindi invia.", + "report-bug-mail-subject": "[Eigent] Segnalazione bug", + "report-bug-mail-body-intro": "Allega a questo messaggio il file ZIP di diagnostica che hai appena salvato.", + "report-bug-mail-body-path": "ZIP salvato in: {{path}}", + "report-bug-mail-body-meta": "Versione app: {{version}} | OS: {{os}} ({{arch}})", + "report-bug-mail-body-desc": "Descrizione:", + "report-bug-mail-body-steps": "Passi per riprodurre:", + "report-bug-mail-body-truncated": "Il corpo dell'email è stato abbreviato a causa dei limiti di lunghezza. Consulta bug_report.txt all'interno dello ZIP per il testo completo.", + "project-page-tab-project": "Project", + "project-page-tab-tasks": "Tasks", + "project-page-all-tasks": "All tasks", + "project-page-status-pending": "Pending", + "no-tasks": "No tasks", + "workspace-select-project": "Seleziona un progetto", + "workspace-cowork-single-agent": "Collabora con un singolo agente", + "workspace-cowork-workforce": "Collabora con la forza lavoro", + "execution-context": "Contesto di esecuzione", + "no-results": "No results", + "notification-panel-dismiss": "Dismiss", + "instructions": "Istruzioni", + "instructions-rules-tone": "Regole e tono", + "memory": "Memory", + "memory-on": "On", + "memory-off": "Off", + "workforce-setting": "Impostazione della forza lavoro", + "select": "Select", + "edit-instructions": "Modifica istruzioni", + "sessions-start-new": "Avvia una nuova sessione", + "sessions-full-title": "Tutte le sessioni", + "sessions-create-task-hint": "Crea un'attività per avviare una sessione", + "workforce-progress": "Progress", + "workforce-agent-folder": "Cartella agente", + "workforce-agent-pool": "Agent Pool", + "expand-project-sidebar": "Espandi barra laterale", + "fold-project-sidebar": "Comprimi barra laterale", + "update": "Update", + "workspace-start-from-scratch": "Inizia da zero", + "workspace-project-submenu": "Project", + "workspace-recent-session-now": "Now", + "workspace-recent-session-minutes": "{{count}} min", + "workspace-recent-session-hours": "{{count}}h", + "workspace-recent-session-days": "{{count}}d", + "workspace-recent-sessions-heading": "Recent", + "workspace-session-mode-label": "Modalità sessione", + "workspace-session-mode-cycle-hint": "Fai clic per cambiare modalità sessione", + "failed-to-start-task": "Impossibile avviare l'attività. Controlla la configurazione del modello.", + "workspace-work-with-panel-hide": "Nascondi il pannello Lavora con", + "workspace-work-with-panel-show": "Mostra il pannello Lavora con", + "workspace-work-with-dismiss-overlay": "Dismiss", + "workspace-work-with-title": "Work with", + "workspace-work-with-remote-control": "Controllo remoto" } diff --git a/src/i18n/locales/it/setting.json b/src/i18n/locales/it/setting.json index b84ae0247..414ed77eb 100644 --- a/src/i18n/locales/it/setting.json +++ b/src/i18n/locales/it/setting.json @@ -17,83 +17,6 @@ "eigent-cloud": "Eigent Cloud", "default": "Predefinito", "profile": "Profilo", - "account": "Account", - "you-are-currently-signed-in-with": "Sei attualmente connesso con {{email}}", - "manage": "Gestisci", - "log-out": "Esci", - "language": "Lingua", - "select-language": "Seleziona lingua", - "system-default": "Predefinito di sistema", - "appearance": "Aspetto", - "dark": "Scuro", - "light": "Chiaro", - "transparent": "Trasparente", - - "workspace-main-background": "Sfondo dell’area di lavoro", - "workspace-main-background-description": "Solo per i pannelli principali Workforce e Session.", - "workspace-main-background-empty": "Vuoto", - "workspace-main-background-dots": "Punti", - "workspace-main-background-blocks": "Griglia", - "workspace-main-background-ruled": "Righe continue", - "workspace-main-background-dotted": "Righe puntinate", - "workspace-main-background-dashed": "Righe a tratti", - - "appearance-tab": "Aspetto", - "color-mode": "Modalità colore", - "accent-palette": "Palette di accento", - "accent-palette-description": "Temi colore predefiniti per l'interfaccia. Salvati separatamente per le modalità chiara e scura.", - "accent-for-light": "Modalità chiara", - "accent-for-dark": "Modalità scura", - - "data-privacy": "Privacy dei dati", - "data-privacy-description": "Eigent è costruito su un principio local-first per garantire la tua privacy. I tuoi dati rimangono sul tuo dispositivo per impostazione predefinita. Le funzionalità cloud sono opzionali e utilizzano solo i dati minimi necessari per funzionare. Per tutti i dettagli, visita la nostra", - "privacy-policy": "Informativa sulla privacy", - "how-we-handle-your-data": "Come gestiamo i tuoi dati", - "we-only-use-the-essential-data-needed-to-run-your-tasks": "Utilizziamo solo i dati essenziali necessari per eseguire le tue attività", - "how-we-handle-your-data-line-1": "Utilizziamo solo i dati essenziali necessari per eseguire le tue attività", - "how-we-handle-your-data-line-1-line-1": "Eigent può acquisire screenshot per analizzare elementi dell'interfaccia utente, leggere testo e determinare l'azione successiva, proprio come faresti tu.", - "how-we-handle-your-data-line-1-line-2": "Eigent può utilizzare il tuo mouse e la tua tastiera per accedere a software e file locali da te specificati.", - "how-we-handle-your-data-line-1-line-3": "Solo i dati minimi necessari per l'attività vengono inviati ai fornitori di modelli AI o alle integrazioni di terze parti da te abilitate; non abbiamo alcuna conservazione dei dati", - "how-we-handle-your-data-line-2": "I file delle attività, gli output e gli screenshot rimangono nella tua cartella attività designata localmente.", - "how-we-handle-your-data-line-3": "Le credenziali sono archiviate localmente, crittografate e utilizzate solo per i passaggi approvati.", - "how-we-handle-your-data-line-4": "I tuoi dati non vengono mai utilizzati per addestrare i nostri modelli AI senza il tuo esplicito consenso.", - "how-we-handle-your-data-line-5": "Non vendiamo i tuoi dati a terzi.", - "api-key-can-not-be-empty": "La chiave API non può essere vuota!", - "api-host-can-not-be-empty": "L'host API non può essere vuoto!", - "model-type-can-not-be-empty": "Il tipo di modello non può essere vuoto!", - "validate-success": "Validazione riuscita", - "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "Il modello è stato verificato per supportare la chiamata di funzione, necessaria per utilizzare Eigent.", - "validate-failed": "Validazione fallita", - "copy": "Copia", - "copied-to-clipboard": "Copiato negli appunti", - "failed-to-copy-to-clipboard": "Impossibile copiare negli appunti", - "endpoint-url-can-not-be-empty": "L'URL dell'endpoint non può essere vuoto!", - "verification-failed-please-check-endpoint-url": "Verifica fallita, controlla l'URL dell'endpoint", - "eigent-cloud-version": "Versione cloud di Eigent", - "you-are-currently-subscribed-to-the": "Sei attualmente iscritto al", - "discover-more-about-our": "Scopri di più sulle nostre", - "pricing-options": "opzioni di prezzo", - "credits": "Crediti", - "select-model-type": "Seleziona tipo di modello", - "custom-model": "Modello personalizzato", - "use-your-own-api-keys-or-set-up-a-local-model": "Usa le tue chiavi API o imposta un modello locale.", - "verify": "Verifica", - "local-model": "Modello locale", - "model-platform": "Piattaforma modello", - "model-endpoint-url": "URL endpoint modello", - "model-type": "Tipo modello", - "enter-your-local-model-type": "Inserisci il tuo tipo di modello locale", - "you-are-on-selft-host-mode": "Sei in modalità Self Host", - "you-are-using-self-hosted-mode": "Stai usando la modalità Self-hosted. Per ottenere le migliori prestazioni da questo prodotto, inserisci la chiave di ricerca Google in \"MCP e Strumenti\" per garantire il corretto funzionamento di Eigent.", - "the-google-search-key-is-essential-for-delivering-accurate-search-results": "La chiave di ricerca Google è essenziale per fornire risultati di ricerca accurati. La chiave di ricerca Exa è opzionale ma altamente raccomandata per prestazioni migliori.", - "close": "Chiudi", - "enter-your-api-key": "Inserisci la tua API", - "key": "Chiave", - "enter-your-api-host": "Inserisci il tuo host API", - "url": "URL", - "enter-your-model-type": "Inserisci il tuo tipo di modello", - "verifying": "Verifica in corso...", - "account": "Account", "you-are-currently-signed-in-with": "Sei attualmente connesso con {{email}}", "manage": "Gestisci", @@ -105,7 +28,6 @@ "dark": "Scuro", "light": "Chiaro", "transparent": "Trasparente", - "workspace-main-background": "Sfondo dell’area di lavoro", "workspace-main-background-description": "Solo per i pannelli principali Workforce e Session.", "workspace-main-background-empty": "Vuoto", @@ -114,14 +36,12 @@ "workspace-main-background-ruled": "Righe continue", "workspace-main-background-dotted": "Righe puntinate", "workspace-main-background-dashed": "Righe a tratti", - "appearance-tab": "Aspetto", "color-mode": "Modalità colore", "accent-palette": "Palette di accento", "accent-palette-description": "Temi colore predefiniti per l'interfaccia. Salvati separatamente per le modalità chiara e scura.", "accent-for-light": "Modalità chiara", "accent-for-dark": "Modalità scura", - "data-privacy": "Privacy dei dati", "data-privacy-description": "Eigent è costruito su un principio local-first per garantire la tua privacy. I tuoi dati rimangono sul tuo dispositivo per impostazione predefinita. Le funzionalità cloud sono opzionali e utilizzano solo i dati minimi necessari per funzionare. Per tutti i dettagli, visita la nostra", "privacy-policy": "Informativa sulla privacy", @@ -143,6 +63,7 @@ "validate-failed": "Validazione fallita", "copy": "Copia", "copied-to-clipboard": "Copiato negli appunti", + "failed-to-copy-to-clipboard": "Impossibile copiare negli appunti", "endpoint-url-can-not-be-empty": "L'URL dell'endpoint non può essere vuoto!", "verification-failed-please-check-endpoint-url": "Verifica fallita, controlla l'URL dell'endpoint", "eigent-cloud-version": "Versione cloud di Eigent", @@ -169,7 +90,6 @@ "url": "URL", "enter-your-model-type": "Inserisci il tuo tipo di modello", "verifying": "Verifica in corso...", - "mcp-and-tools": "MCP e Strumenti", "add-mcp-server": "Aggiungi server MCP", "market": "Mercato", @@ -225,7 +145,7 @@ "notion-workspace-integration": "Integrazione workspace Notion per leggere e gestire le pagine Notion", "google-calendar-integration": "Integrazione Google Calendar per gestire eventi e programmi", "mcp-server-already-exists": "Il server MCP \"{{name}}\" esiste già", - "google-search": "Google Search", + "google-search": "Ricerca Google", "select-default-search-engine": "Seleziona motore di ricerca predefinito", "your-own-mcps": "I tuoi MCP", "get-google-search-api": "Ottieni Google Search API", @@ -252,7 +172,6 @@ "reset-success": "Reimpostazione riuscita!", "reset-failed": "Reimpostazione non riuscita!", "select-default-model": "Seleziona modello predefinito", - "browser-login": "Accesso browser", "browser-login-description": "Apri Chrome per accedere ai tuoi account. I dati di accesso vengono salvati localmente in un profilo sicuro.", "open-browser-login": "Apri browser per l'accesso", @@ -277,7 +196,6 @@ "confirm-delete-all-cookies": "Eliminare tutti i cookie? Questa azione non può essere annullata.", "all-cookies-deleted": "Tutti i cookie sono stati eliminati correttamente.", "cookie-delete-warning": "Nota: l'eliminazione dei cookie disconnette dai siti associati. Potrebbe essere necessario riavviare il browser.", - "network-proxy": "Proxy di rete", "network-proxy-description": "Configura un server proxy per le richieste di rete. Utile se devi accedere ad API esterne tramite un proxy.", "proxy-placeholder": "http://127.0.0.1:7890", @@ -285,7 +203,6 @@ "proxy-save-failed": "Impossibile salvare la configurazione del proxy.", "proxy-invalid-url": "URL proxy non valido. Deve iniziare con http://, https://, socks4:// o socks5://.", "proxy-restart-hint": "Riavvio necessario per applicare le modifiche del proxy.", - "cloud-not-available-in-local-proxy": "La versione cloud non è disponibile in modalità proxy locale", "set-as-default": "Imposta come predefinito", "api-key-setting": "Impostazione chiave API", @@ -293,11 +210,9 @@ "model-type-setting": "Impostazione tipo di modello", "please-select": "Seleziona", "configuring": "Configurazione in corso...", - "models-default-setting-title": "Impostazione predefinita", "models-default-setting-description": "Seleziona uno dei modelli configurati come modello predefinito per Eigent. Verrà applicato globalmente nel tuo spazio di lavoro.", "models-configuration": "Configurazione", - "gemini-3-pro-preview-name": "Gemini 3 Pro Preview", "gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview", "gemini-3-flash-preview-name": "Gemini 3 Flash Preview", @@ -311,11 +226,15 @@ "claude-opus-4-7-name": "Claude Opus 4.7", "deepseek-v4-pro-name": "DeepSeek V4 Pro", "minimax-m2-7-name": "Minimax M2.7", - "preferred-ide": "IDE preferito", "preferred-ide-description": "Scegli quale applicazione utilizzare per aprire le cartelle dei progetti dell'agente.", "system-file-manager": "Gestione file di sistema", "agents": "Agenti", "help-improve-eigent": "Aiuta a migliorare Eigent", - "help-improve-eigent-description": "Consenti a Eigent di raccogliere log di errori anonimi e dati di utilizzo per migliorare il servizio. Questo è facoltativo e può essere modificato in qualsiasi momento." + "help-improve-eigent-description": "Consenti a Eigent di raccogliere log di errori anonimi e dati di utilizzo per migliorare il servizio. Questo è facoltativo e può essere modificato in qualsiasi momento.", + "please-complete-authorization-in-browser": "Completa l'autorizzazione nel browser", + "authorization-cancelled": "Autorizzazione annullata", + "authorization-failed": "Autorizzazione non riuscita", + "this-service-is-already-enabled-by-default": "Questo servizio è già abilitato per impostazione predefinita", + "version": "Version" } diff --git a/src/i18n/locales/it/triggers.json b/src/i18n/locales/it/triggers.json index 07f008a50..81fec12c7 100644 --- a/src/i18n/locales/it/triggers.json +++ b/src/i18n/locales/it/triggers.json @@ -2,19 +2,19 @@ "name": "Name", "description": "Description", "trigger-type": "Type", - "create-new": "Create New Trigger", - "trigger-details": "Trigger Details", - "no-trigger-selected": "No Trigger Selected", - "select-trigger-hint": "Click on a trigger from the list to view its details", - "no-triggers": "No triggers yet", - "name-placeholder": "Enter trigger name", - "description-placeholder": "Enter trigger description", + "create-new": "Crea nuovo trigger", + "trigger-details": "Dettagli del trigger", + "no-trigger-selected": "Nessun trigger selezionato", + "select-trigger-hint": "Fai clic su un trigger nell'elenco per visualizzarne i dettagli", + "no-triggers": "Nessun trigger ancora", + "name-placeholder": "Inserisci il nome del trigger", + "description-placeholder": "Inserisci la descrizione del trigger", "schedule-trigger": "Schedule", "webhook-trigger": "Webhook", "slack-trigger": "Slack", "app-trigger": "App Trigger", - "cron-expression": "Cron Expression", - "cron-help": "Format: minute hour day month weekday (e.g., 0 */1 * * * = every hour)", + "cron-expression": "Espressione Cron", + "cron-help": "Formato: minuto ora giorno mese giorno_settimana (es., 0 */1 * * * = ogni ora)", "cron-empty": "L'espressione cron non può essere vuota", "cron-invalid-format": "Formato cron non valido. Previsto: minuto ora giorno mese giorno della settimana (es. 0 */1 * * *)", "cron-invalid-minute": "Valore minuto non valido. Deve essere 0-59 o un'espressione cron valida", @@ -22,23 +22,23 @@ "cron-invalid-day": "Valore giorno non valido. Deve essere 1-31 o un'espressione cron valida", "cron-invalid-month": "Valore mese non valido. Deve essere 1-12 o un'espressione cron valida", "cron-invalid-weekday": "Valore giorno della settimana non valido. Deve essere 0-6 (0=Domenica) o un'espressione cron valida", - "listener-type": "Listener Type", - "select-listener": "Select listener type", + "listener-type": "Tipo di listener", + "select-listener": "Seleziona il tipo di listener", "chat-agent": "Chat Agent", "workforce": "Workforce", "agent-model": "Agent Model", "task-prompt": "Task Prompt", - "task-prompt-placeholder": "Enter the task prompt for this trigger", - "max-per-hour": "Max Per Hour", + "task-prompt-placeholder": "Inserisci il prompt dell'attività per questo trigger", + "max-per-hour": "Massimo per ora", "max-per-day": "Max Per Day", - "single-execution": "Single Execution", + "single-execution": "Esecuzione singola", "webhook-url": "Webhook URL", "executions": "Executions", "errors": "Errors", "view-runs": "View Runs", "activate": "Activate", "deactivate": "Deactivate", - "execution-id": "Execution ID", + "execution-id": "ID esecuzione", "started": "Started", "duration": "Duration", "tokens": "Tokens", @@ -46,29 +46,29 @@ "failed": "Failed", "running": "Running", "pending": "Pending", - "no-executions": "No executions found", - "executions-for": "Executions for", - "name-required": "Trigger name is required", - "created-successfully": "Trigger created successfully", - "failed-to-create": "Failed to create trigger", - "failed-to-load": "Failed to load triggers", - "activated": "Trigger activated", - "deactivated": "Trigger deactivated", - "failed-to-toggle": "Failed to toggle trigger status", - "webhook-created-title": "Webhook Created Successfully", - "webhook-created-subtitle": "Your new webhook trigger is ready to receive requests", - "webhook-ready": "Webhook Ready!", - "webhook-instructions": "Use the URL below to trigger this agent. Send a request with any JSON body.", - "your-webhook-url": "Your Webhook URL", - "webhook-tip-title": "Did you know?", - "webhook-tip-description": "You can include custom data in your JSON payload and reference it in your task prompt using {{variable_name}}.", - "webhook-url-copied": "Webhook URL copied to clipboard", - "confirm-delete": "Are you sure you want to delete this trigger?", - "deleted": "Trigger deleted", - "failed-to-delete": "Failed to delete trigger", - "webhook-copied": "Webhook URL copied to clipboard", - "failed-to-copy": "Failed to copy webhook URL", - "trigger-task": "Trigger Task", + "no-executions": "Nessuna esecuzione trovata", + "executions-for": "Esecuzioni per", + "name-required": "Il nome del trigger è obbligatorio", + "created-successfully": "Trigger creato con successo", + "failed-to-create": "Creazione del trigger non riuscita", + "failed-to-load": "Caricamento dei trigger non riuscito", + "activated": "Trigger attivato", + "deactivated": "Trigger disattivato", + "failed-to-toggle": "Impossibile modificare lo stato del trigger", + "webhook-created-title": "Webhook creato con successo", + "webhook-created-subtitle": "Il tuo nuovo trigger webhook è pronto a ricevere richieste", + "webhook-ready": "Webhook pronto!", + "webhook-instructions": "Usa l'URL qui sotto per attivare questo agente. Invia una richiesta con qualsiasi corpo JSON.", + "your-webhook-url": "Il tuo URL webhook", + "webhook-tip-title": "Lo sapevi?", + "webhook-tip-description": "Puoi includere dati personalizzati nel tuo payload JSON e farvi riferimento nel prompt dell'attività usando {{variable_name}}.", + "webhook-url-copied": "URL webhook copiato negli appunti", + "confirm-delete": "Sei sicuro di voler eliminare questo trigger?", + "deleted": "Trigger eliminato", + "failed-to-delete": "Eliminazione del trigger non riuscita", + "webhook-copied": "URL webhook copiata negli appunti", + "failed-to-copy": "Impossibile copiare l'URL webhook", + "trigger-task": "Attiva attività", "task-mode-text": "Text", "task-mode-json": "JSON", "schedule-frequency": "Frequency", @@ -81,44 +81,44 @@ "weekday-thursday": "Thursday", "weekday-friday": "Friday", "weekday-saturday": "Saturday", - "webhook-function": "Webhook Function", + "webhook-function": "Funzione webhook", "frequency-hourly": "Every Hour", "frequency-daily": "Daily", "frequency-weekly": "Weekly", "frequency-monthly": "Monthly", "frequency-one-time": "One Time", "frequency-custom": "Custom", - "invalid-time-format": "Invalid time format. Use HH:MM (e.g., 09:30)", - "schedule-day-of-month-note": "If the selected day doesn’t exist in that month (e.g., the 31st), the task will be skipped.", + "invalid-time-format": "Formato orario non valido. Usa HH:MM (es. 09:30)", + "schedule-day-of-month-note": "Se il giorno selezionato non esiste in quel mese (ad es. il 31), l'attività verrà saltata.", "schedule-hour": "Ora", "schedule-minute": "Minuto", "schedule-date": "Date", "select-date": "Select date", - "schedule-day-of-month": "Day of Month", + "schedule-day-of-month": "Giorno del mese", "select-day": "Select day", "day-of-month": "Day {{day}}", - "schedule-weekdays": "Days of Week", - "expiration-date": "Expiration Date", - "no-expiration": "No expiration", - "select-expiration": "Select expiration date", - "no-upcoming-one-time": "Select a future date and time", - "no-upcoming-executions": "No upcoming executions", - "date-required": "Date is required", - "weekday-required": "At least one weekday is required", - "schedule-required-fields": "Please fill in all required fields for the schedule", - "create-trigger-agent": "Automate task with trigger", - "trigger-overview": "Trigger Overview", + "schedule-weekdays": "Giorni della settimana", + "expiration-date": "Data di scadenza", + "no-expiration": "Nessuna scadenza", + "select-expiration": "Seleziona la data di scadenza", + "no-upcoming-one-time": "Seleziona una data e un'ora future", + "no-upcoming-executions": "Nessuna esecuzione imminente", + "date-required": "La data è obbligatoria", + "weekday-required": "È richiesto almeno un giorno della settimana", + "schedule-required-fields": "Compila tutti i campi obbligatori della pianificazione", + "create-trigger-agent": "Automatizza l'attività con un trigger", + "trigger-overview": "Panoramica del trigger", "edit": "Edit", "delete": "Delete", "period": "Period", "created-at": "Created At", - "execution-history": "Execution History", + "execution-history": "Cronologia delle esecuzioni", "run-time": "Run Time", "success": "Success", - "output-tasks": "Output Tasks", + "output-tasks": "Attività di output", "logs": "Logs", "close": "Close", - "confirm-delete-trigger": "Are you sure you want to delete this trigger?", + "confirm-delete-trigger": "Sei sicuro di voler eliminare questo trigger?", "status": { "active": "Active", "inactive": "Inactive", @@ -126,66 +126,66 @@ "completed": "Completed", "unknown": "Unknown" }, - "webhook-url-after-creation": "You can find your webhook URL in the trigger details after creation.", - "webhook-method": "Request Method", - "created-time": "Created Time", - "last-execution-label": "Last Execution", + "webhook-url-after-creation": "Puoi trovare l'URL webhook nei dettagli del trigger dopo la creazione.", + "webhook-method": "Metodo della richiesta", + "created-time": "Ora di creazione", + "last-execution-label": "Ultima esecuzione", "token-cost": "Token Cost", - "updated-successfully": "Trigger updated successfully", + "updated-successfully": "Trigger aggiornato con successo", "title": "Triggers", - "create-hint": "Create a trigger to automate your tasks", - "live-activity": "Live Activity", - "no-activity": "No activity yet", - "activity-hint": "Activity will appear here", - "execution-logs": "Execution Logs", + "create-hint": "Crea un trigger per automatizzare le tue attività", + "live-activity": "Attività in tempo reale", + "no-activity": "Nessuna attività per ora", + "activity-hint": "L'attività apparirà qui", + "execution-logs": "Log di esecuzione", "fold-execution-logs": "Comprimi log di esecuzione", "open-execution-logs": "Apri log di esecuzione", - "delete-trigger": "Delete Trigger", + "delete-trigger": "Elimina trigger", "cancel": "Cancel", "deleting": "Deleting...", - "duplicated-successfully": "Trigger duplicated as \"{{name}}\"", - "confirm-delete-message": "Are you sure you want to delete \"{{name}}\"? This action cannot be undone.", + "duplicated-successfully": "Trigger duplicato come \"{{name}}\"", + "confirm-delete-message": "Sei sicuro di voler eliminare \"{{name}}\"? Questa azione non può essere annullata.", "workspace": "Workspace", - "agent-folder": "Agent Folder", + "agent-folder": "Cartella dell'agente", "add": "Add", "upload": "Upload", "create": "Create", "loading": "Loading...", - "loading-executions": "Loading execution data...", - "failed-to-load-executions": "Failed to load execution data", - "no-execution-data": "No execution data available", + "loading-executions": "Caricamento dei dati di esecuzione...", + "failed-to-load-executions": "Impossibile caricare i dati di esecuzione", + "no-execution-data": "Nessun dato di esecuzione disponibile", "total-runs": "Total Runs", - "success-rate": "Success Rate", - "no-executions-yet": "No executions yet", + "success-rate": "Tasso di successo", + "no-executions-yet": "Nessuna esecuzione ancora", "last-run-label": "Last run", - "execution-completed-success": "Execution completed successfully", - "execution-failed-message": "Execution failed", - "execution-in-progress": "Execution in progress...", - "waiting-to-execute": "Waiting to execute...", - "execution-cancelled": "Execution was cancelled", - "execution-missed": "Execution was missed", - "unknown-status": "Unknown status", + "execution-completed-success": "Esecuzione completata con successo", + "execution-failed-message": "Esecuzione fallita", + "execution-in-progress": "Esecuzione in corso...", + "waiting-to-execute": "In attesa di esecuzione...", + "execution-cancelled": "Esecuzione annullata", + "execution-missed": "Esecuzione mancata", + "unknown-status": "Stato sconosciuto", "trigger-label": "Trigger", "status-created": "Created", "status-updated": "Updated", "status-activated": "Activated", "status-deleted": "Deleted", "status-deactivated": "Deactivated", - "status-execution-started": "Execution started", - "status-execution-completed": "Execution completed", + "status-execution-started": "Esecuzione avviata", + "status-execution-completed": "Esecuzione completata", "status-error": "Error", - "status-webhook-triggered": "Webhook triggered", + "status-webhook-triggered": "Webhook attivato", "status-activity": "Activity", - "upcoming-executions": "Upcoming Executions", + "upcoming-executions": "Esecuzioni imminenti", "preview-scheduled-times": "Anteprima Orari Pianificati", - "task-prompt-required": "Task prompt is required", - "project-id-required": "Project ID is required", - "execution-settings": "Execution Settings", - "extra-settings": "Extra Settings", + "task-prompt-required": "Il prompt del task è obbligatorio", + "project-id-required": "L'ID del progetto è obbligatorio", + "execution-settings": "Impostazioni di esecuzione", + "extra-settings": "Impostazioni extra", "max-per-hour-placeholder": "0", "max-per-day-placeholder": "0", "copy": "Copy", - "edit-trigger-agent": "Edit Trigger Agent", + "edit-trigger-agent": "Modifica agente trigger", "updating": "Updating...", "creating": "Creating...", "update": "Update", @@ -195,102 +195,102 @@ "activation-limit-reached": "Limite di attivazione raggiunto: massimo 5 trigger attivi per progetto, 25 per utente", "never": "Never", "duplicate": "Duplicate", - "no-task-prompt": "No task prompt", + "no-task-prompt": "Nessun prompt del task", "select-app": "Seleziona app", "change-app": "Change", "dynamic": { "credentials": "Credentials", - "credentials-notice": "Your credentials are stored securely and used to authenticate with the service.", - "credentials-saved": "Credentials configured successfully", - "configuration": "Configuration", - "behavior-settings": "Behavior Settings", - "enter-value": "Please enter a value", + "credentials-notice": "Le tue credenziali sono archiviate in modo sicuro e utilizzate per autenticarsi con il servizio.", + "credentials-saved": "Credenziali configurate con successo", + "configuration": "Configurazione", + "behavior-settings": "Impostazioni di comportamento", + "enter-value": "Inserisci un valore", "add": "Add", "update": "Update", - "config-saved": "Configuration saved successfully", - "config-updated": "Configuration updated successfully", - "config-save-error": "Failed to save configuration", + "config-saved": "Configurazione salvata con successo", + "config-updated": "Configurazione aggiornata con successo", + "config-save-error": "Impossibile salvare la configurazione", "loading": "Loading...", - "loading-config": "Loading configuration...", - "no-config-available": "No configuration available for this trigger type", - "failed-to-load-schema": "Failed to load configuration schema", - "select-options": "Select options...", + "loading-config": "Caricamento della configurazione...", + "no-config-available": "Nessuna configurazione disponibile per questo tipo di trigger", + "failed-to-load-schema": "Impossibile caricare lo schema di configurazione", + "select-options": "Seleziona opzioni...", "selected": "selected", - "save-credentials-first": "Save credentials first", + "save-credentials-first": "Salva prima le credenziali", "search": "Search...", - "no-options": "No options found", + "no-options": "Nessuna opzione trovata", "validation": { - "required": "{{field}} is required", - "invalid-regex": "Invalid regular expression pattern", - "invalid-email": "Invalid email address", - "invalid-url": "Invalid URL format", - "min-length": "Must be at least {{min}} characters", - "max-length": "Must be no more than {{max}} characters", - "pattern-mismatch": "Value does not match required pattern", - "min-value": "Must be at least {{min}}", - "max-value": "Must be no more than {{max}}" + "required": "{{field}} è obbligatorio", + "invalid-regex": "Pattern di espressione regolare non valido", + "invalid-email": "Indirizzo email non valido", + "invalid-url": "Formato URL non valido", + "min-length": "Deve essere lungo almeno {{min}} caratteri", + "max-length": "Non deve superare {{max}} caratteri", + "pattern-mismatch": "Il valore non corrisponde al pattern richiesto", + "min-value": "Deve essere almeno {{min}}", + "max-value": "Non deve essere superiore a {{max}}" }, - "validation-failed": "Please fix validation errors: {{errors}}" + "validation-failed": "Correggi gli errori di validazione: {{errors}}" }, "slack": { - "credentials-saved": "Slack credentials configured successfully", - "enter-bot-token": "Please enter a bot token", - "bot-token-saved": "Bot token saved successfully", - "bot-token-updated": "Bot token updated successfully", - "bot-token-save-error": "Failed to save bot token", - "signing-secret-saved": "Signing secret saved successfully", - "signing-secret-updated": "Signing secret updated successfully", - "signing-secret-save-error": "Failed to save signing secret", + "credentials-saved": "Credenziali Slack configurate con successo", + "enter-bot-token": "Inserisci un token bot", + "bot-token-saved": "Token bot salvato con successo", + "bot-token-updated": "Token bot aggiornato con successo", + "bot-token-save-error": "Impossibile salvare il token bot", + "signing-secret-saved": "Secret di firma salvato con successo", + "signing-secret-updated": "Secret di firma aggiornato con successo", + "signing-secret-save-error": "Impossibile salvare il secret di firma", "add": "Add", "update": "Update", - "event-configuration": "Event Configuration", + "event-configuration": "Configurazione eventi", "event-types": "Event Types", - "select-events": "Select events to trigger on...", - "search-events": "Search events...", - "no-events-found": "No events found", - "events-selected": "events selected", - "channel-filter": "Channel Filter", - "select-channels": "All channels (no filter)", - "search-channels": "Search channels...", - "no-channels-found": "No channels found", - "channels-selected": "channels selected", - "save-credentials-first": "Save credentials first to load channels", - "loading-channels": "Loading channels...", - "channels-fetch-error": "Failed to fetch channels. Please check your credentials.", - "behavior-settings": "Behavior Settings", + "select-events": "Seleziona gli eventi da attivare...", + "search-events": "Cerca eventi...", + "no-events-found": "Nessun evento trovato", + "events-selected": "eventi selezionati", + "channel-filter": "Filtro canale", + "select-channels": "Tutti i canali (nessun filtro)", + "search-channels": "Cerca canali...", + "no-channels-found": "Nessun canale trovato", + "channels-selected": "canali selezionati", + "save-credentials-first": "Salva prima le credenziali per caricare i canali", + "loading-channels": "Caricamento dei canali...", + "channels-fetch-error": "Impossibile recuperare i canali. Controlla le tue credenziali.", + "behavior-settings": "Impostazioni comportamento", "authentication_required": { - "label": "Require Authentication", - "notice": "Slack triggers require authentication to verify webhook signatures (Slack Signing Secret required). Verify webhook endpoint at https://api.slack.com/apps to activate trigger." + "label": "Richiedi autenticazione", + "notice": "I trigger di Slack richiedono l'autenticazione per verificare le firme del webhook (è richiesto il Signing Secret di Slack). Verifica l'endpoint del webhook su https://api.slack.com/apps per attivare il trigger." }, "bot_token": { - "label": "Slack Bot Token", + "label": "Token Bot di Slack", "placeholder": "xoxb-...", - "notice": "Your Slack Bot User OAuth Token (starts with xoxb-)" + "notice": "Il tuo token OAuth del bot utente Slack (inizia con xoxb-)" }, "signing_secret": { - "label": "Slack Signing Secret", - "placeholder": "Enter your Slack signing secret...", - "notice": "Your Slack app's signing secret used to verify requests" + "label": "Signing Secret di Slack", + "placeholder": "Inserisci il tuo signing secret di Slack...", + "notice": "Il signing secret della tua app Slack usato per verificare le richieste" }, "events": { "label": "Event Types", - "notice": "Select which Slack events should trigger this workflow" + "notice": "Seleziona quali eventi Slack devono attivare questo workflow" }, "channel_id": { "label": "Channel ID", - "placeholder": "Select a channel...", - "notice": "Specific channel to watch (leave empty to watch all channels)" + "placeholder": "Seleziona un canale...", + "notice": "Canale specifico da monitorare (lascia vuoto per monitorare tutti i canali)" }, "ignore_bot_messages": { - "label": "Ignore Bot Messages" + "label": "Ignora i messaggi dei bot" }, "ignore_users": { - "label": "Ignore Users", - "placeholder": "Enter Slack user IDs (e.g., U1234567890)...", - "notice": "Slack user IDs to ignore messages from" + "label": "Ignora utenti", + "placeholder": "Inserisci gli ID utente Slack (ad es., U1234567890)...", + "notice": "ID utente Slack di cui ignorare i messaggi" } }, - "verification-required": "Pending Verification. A valid event message is required for Trigger Activation or disable trigger Authentication.", + "verification-required": "Verifica in sospeso. È richiesto un messaggio evento valido per l'attivazione del trigger oppure disattiva l'autenticazione del trigger.", "base": { "authentication_required": { "label": "Richiede Autenticazione", @@ -309,34 +309,36 @@ }, "webhook": { "authentication_required": { - "label": "Require Authentication", - "notice": "Whether authentication is required for this webhook trigger" + "label": "Richiedi autenticazione", + "notice": "Indica se l'autenticazione è richiesta per questo trigger webhook" }, "body_contains": { - "label": "Body Contains", - "placeholder": "Enter text that must be in request body...", - "notice": "Only trigger if the request body contains this string" + "label": "Il corpo contiene", + "placeholder": "Inserisci il testo che deve essere presente nel corpo della richiesta...", + "notice": "Attiva solo se il corpo della richiesta contiene questa stringa" }, "required_headers": { - "label": "Required Headers", - "placeholder": "Enter header names (e.g., Content-Type, Authorization)...", - "notice": "List of HTTP headers that must be present in the request" + "label": "Header richiesti", + "placeholder": "Inserisci i nomi degli header (ad es., Content-Type, Authorization)...", + "notice": "Elenco degli header HTTP che devono essere presenti nella richiesta" }, "header_match": { - "label": "Header Match (Regex)", - "placeholder": "Header-Name: regex pattern", - "notice": "Match request headers against a regex pattern (format: Header-Name: pattern)" + "label": "Corrispondenza header (Regex)", + "placeholder": "Nome-Header: pattern regex", + "notice": "Confronta gli header della richiesta con un pattern regex (formato: Nome-Header: pattern)" }, "include_headers": { - "label": "Include Headers", - "notice": "Include request headers in the workflow execution input" + "label": "Includi header", + "notice": "Includi gli header della richiesta nell'input di esecuzione del workflow" }, "include_query_params": { - "label": "Include Query Parameters" + "label": "Includi i parametri di query" }, "include_request_metadata": { - "label": "Include Request Metadata", - "notice": "Include request metadata (method, URL, client IP) in execution input" + "label": "Includi i metadati della richiesta", + "notice": "Includi i metadati della richiesta (metodo, URL, IP client) nell'input di esecuzione" } - } + }, + "status-cancelled": "Cancelled", + "select-method": "Seleziona metodo" } diff --git a/src/i18n/locales/ja/chat.json b/src/i18n/locales/ja/chat.json index 525e520eb..c6a847cfa 100644 --- a/src/i18n/locales/ja/chat.json +++ b/src/i18n/locales/ja/chat.json @@ -91,5 +91,7 @@ "input-attach-manage-connectors": "コネクタを管理", "input-attach-open-browser": "ブラウザを開く", "input-attach-manage-browsers": "ブラウザを管理", - "input-attach-menu-trigger": "ファイル・写真の追加、またはメニューからスキル・コネクタ・ブラウザを開く" + "input-attach-menu-trigger": "ファイル・写真の追加、またはメニューからスキル・コネクタ・ブラウザを開く", + "hide-file-sidebar": "ファイルサイドバーを非表示にする", + "show-file-sidebar": "ファイルサイドバーを表示する" } diff --git a/src/i18n/locales/ja/dashboard.json b/src/i18n/locales/ja/dashboard.json index 6585d3b83..53749107e 100644 --- a/src/i18n/locales/ja/dashboard.json +++ b/src/i18n/locales/ja/dashboard.json @@ -23,5 +23,7 @@ "document-agent": "ドキュメントエージェント", "multi-modal-agent": "マルチモーダルエージェント", "social-media-agent": "ソーシャルメディアエージェント", - "no-projects-found": "プロジェクトが見つかりませんでした。" + "no-projects-found": "プロジェクトが見つかりませんでした。", + "no-projects-match-search": "検索に一致するプロジェクトはありません", + "try-different-search": "別の検索を試してください" } diff --git a/src/i18n/locales/ja/folder.json b/src/i18n/locales/ja/folder.json new file mode 100644 index 000000000..8a52b7105 --- /dev/null +++ b/src/i18n/locales/ja/folder.json @@ -0,0 +1,8 @@ +{ + "file-path-remote-root": "Remote", + "files-scope-all": "All files", + "files-scope-new": "New files", + "file-path-breadcrumb": "File path", + "download-file": "ファイルをダウンロード", + "zip-file-is-not-supported-yet": "ZIPプレビューはまだサポートされていません。" +} diff --git a/src/i18n/locales/ja/index.ts b/src/i18n/locales/ja/index.ts index efa753446..4e23f35ac 100644 --- a/src/i18n/locales/ja/index.ts +++ b/src/i18n/locales/ja/index.ts @@ -15,6 +15,7 @@ import agents from './agents.json'; import chat from './chat.json'; import dashboard from './dashboard.json'; +import folder from './folder.json'; import layout from './layout.json'; import setting from './setting.json'; import triggers from './triggers.json'; @@ -24,6 +25,7 @@ export default { agents, layout, dashboard, + folder, workforce, chat, setting, diff --git a/src/i18n/locales/ja/layout.json b/src/i18n/locales/ja/layout.json index 1fe6fa319..b0640b3cb 100644 --- a/src/i18n/locales/ja/layout.json +++ b/src/i18n/locales/ja/layout.json @@ -307,5 +307,65 @@ "cookie-count": "{{count}} 個の Cookie", "add-new-mcp": "新しい MCP を追加", "browse-mcps": "MCP を参照", - "browser-settings": "ブラウザ設定" + "browser-settings": "ブラウザ設定", + "report-bug-dialog-title": "バグを報告する", + "report-bug-footer-hint": "アプリのログをZIPに保存し、その後メールアプリを開きます。送信前に保存されたZIPをメッセージに添付してください。", + "report-bug-field-description": "何が問題でしたか?", + "report-bug-field-description-placeholder": "問題を説明してください…", + "report-bug-field-steps": "再現手順(任意)", + "report-bug-field-steps-placeholder": "1. … 2. …", + "report-bug-meta": "バージョン {{version}} · {{os}} ({{arch}})", + "report-bug-description-required": "何が問題だったのかを説明してください。", + "report-bug-submit": "診断情報を保存してメールを開く", + "report-bug-diagnostics-saved": "診断情報を保存しました。メールにZIPを添付して送信してください。", + "report-bug-mail-subject": "[Eigent] バグ報告", + "report-bug-mail-body-intro": "このメッセージに、先ほど保存した診断ZIPファイルを添付してください。", + "report-bug-mail-body-path": "ZIPの保存先: {{path}}", + "report-bug-mail-body-meta": "アプリのバージョン: {{version}} | OS: {{os}} ({{arch}})", + "report-bug-mail-body-desc": "説明:", + "report-bug-mail-body-steps": "再現手順:", + "report-bug-mail-body-truncated": "文字数制限のため、メール本文は短縮されました。完全なテキストはZIP内の bug_report.txt をご確認ください。", + "project-page-tab-project": "Project", + "project-page-tab-tasks": "Tasks", + "project-page-all-tasks": "All tasks", + "project-page-status-pending": "Pending", + "no-tasks": "No tasks", + "workspace-select-project": "プロジェクトを選択", + "workspace-cowork-single-agent": "単一エージェントと共同作業", + "workspace-cowork-workforce": "ワークフォースと共同作業", + "execution-context": "実行コンテキスト", + "no-results": "No results", + "notification-panel-dismiss": "Dismiss", + "instructions": "指示", + "instructions-rules-tone": "ルールとトーン", + "memory": "Memory", + "memory-on": "On", + "memory-off": "Off", + "workforce-setting": "ワークフォース設定", + "select": "Select", + "edit-instructions": "指示を編集", + "sessions-start-new": "新しいセッションを開始", + "sessions-full-title": "すべてのセッション", + "sessions-create-task-hint": "セッションを開始するにはタスクを作成してください", + "workforce-progress": "Progress", + "workforce-agent-folder": "エージェントフォルダ", + "workforce-agent-pool": "Agent Pool", + "expand-project-sidebar": "サイドバーを展開", + "fold-project-sidebar": "サイドバーを折りたたむ", + "update": "Update", + "workspace-start-from-scratch": "ゼロから始める", + "workspace-project-submenu": "Project", + "workspace-recent-session-now": "Now", + "workspace-recent-session-minutes": "{{count}}分", + "workspace-recent-session-hours": "{{count}}h", + "workspace-recent-session-days": "{{count}}d", + "workspace-recent-sessions-heading": "Recent", + "workspace-session-mode-label": "セッションモード", + "workspace-session-mode-cycle-hint": "クリックしてセッションモードを切り替え", + "failed-to-start-task": "タスクの開始に失敗しました。モデル設定を確認してください。", + "workspace-work-with-panel-hide": "Work withパネルを非表示にする", + "workspace-work-with-panel-show": "Work withパネルを表示する", + "workspace-work-with-dismiss-overlay": "Dismiss", + "workspace-work-with-title": "Work with", + "workspace-work-with-remote-control": "リモートコントロール" } diff --git a/src/i18n/locales/ja/setting.json b/src/i18n/locales/ja/setting.json index 49edbce60..bbb3bd6b8 100644 --- a/src/i18n/locales/ja/setting.json +++ b/src/i18n/locales/ja/setting.json @@ -17,83 +17,6 @@ "eigent-cloud": "Eigent Cloud", "default": "デフォルト", "profile": "プロフィール", - "account": "アカウント", - "you-are-currently-signed-in-with": "{{email}}で現在サインインしています", - "manage": "管理", - "log-out": "ログアウト", - "language": "言語", - "select-language": "言語を選択", - "system-default": "システムデフォルト", - "appearance": "外観", - "dark": "ダーク", - "light": "ライト", - "transparent": "透明", - - "workspace-main-background": "ワークスペースの背景", - "workspace-main-background-description": "Workforce と Session のメインパネルにのみ適用されます。", - "workspace-main-background-empty": "なし", - "workspace-main-background-dots": "ドット", - "workspace-main-background-blocks": "グリッド", - "workspace-main-background-ruled": "罫線", - "workspace-main-background-dotted": "点線", - "workspace-main-background-dashed": "破線", - - "appearance-tab": "外観", - "color-mode": "カラーモード", - "accent-palette": "アクセントの配色", - "accent-palette-description": "UIのプリセット配色です。ライトモードとダークモードで別々に保存されます。", - "accent-for-light": "ライトモード", - "accent-for-dark": "ダークモード", - - "data-privacy": "データプライバシー", - "data-privacy-description": "Eigentはプライバシーを確保するためにローカルファーストの原則に基づいて構築されています。デフォルトでは、データはお客様のデバイスに残ります。クラウド機能はオプションであり、機能するために必要な最小限のデータのみを使用します。詳細については、当社の", - "privacy-policy": "プライバシーポリシー", - "how-we-handle-your-data": "データの取り扱い方法", - "we-only-use-the-essential-data-needed-to-run-your-tasks": "タスクを実行するために必要な最小限のデータのみを使用します", - "how-we-handle-your-data-line-1": "タスクを実行するために必要な最小限のデータのみを使用します", - "how-we-handle-your-data-line-1-line-1": "Eigentは、UI要素を分析し、テキストを読み取り、次のアクションを決定するために、お客様が行うのと同じようにスクリーンショットをキャプチャする場合があります。", - "how-we-handle-your-data-line-1-line-2": "Eigentは、指定したローカルソフトウェアおよびファイルにアクセスするために、マウスとキーボードを使用する場合があります。", - "how-we-handle-your-data-line-1-line-3": "有効にしたAIモデルプロバイダーまたはサードパーティ統合に送信されるのは、タスクの最小限のデータのみです。データ保持はありません。", - "how-we-handle-your-data-line-2": "タスクファイル、出力、およびスクリーンショットは、ローカルの指定されたタスクフォルダに残ります。", - "how-we-handle-your-data-line-3": "認証情報はローカルに保存され、暗号化され、承認されたステップにのみ使用されます。", - "how-we-handle-your-data-line-4": "お客様の明示的な同意なしに、お客様のデータが当社のAIモデルのトレーニングに使用されることはありません。", - "how-we-handle-your-data-line-5": "お客様のデータを第三者に販売することはありません。", - "api-key-can-not-be-empty": "APIキーは空にできません!", - "api-host-can-not-be-empty": "APIホストは空にできません!", - "model-type-can-not-be-empty": "モデルタイプは空にできません!", - "validate-success": "検証成功", - "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "モデルは関数呼び出しをサポートしていることが確認されました。これはEigentの使用に必要です。", - "validate-failed": "検証失敗", - "copy": "コピー", - "copied-to-clipboard": "クリップボードにコピーしました", - "failed-to-copy-to-clipboard": "クリップボードへのコピーに失敗しました", - "endpoint-url-can-not-be-empty": "エンドポイントURLは空にできません!", - "verification-failed-please-check-endpoint-url": "検証に失敗しました。エンドポイントURLを確認してください", - "eigent-cloud-version": "Eigentクラウドバージョン", - "you-are-currently-subscribed-to-the": "現在、次のプランに登録しています", - "discover-more-about-our": "当社の", - "pricing-options": "料金オプション", - "credits": "クレジット", - "select-model-type": "モデルタイプを選択", - "custom-model": "カスタムモデル", - "use-your-own-api-keys-or-set-up-a-local-model": "独自のAPIキーを使用するか、ローカルモデルを設定します。", - "verify": "検証", - "local-model": "ローカルモデル", - "model-platform": "モデルプラットフォーム", - "model-endpoint-url": "モデルエンドポイントURL", - "model-type": "モデルタイプ", - "enter-your-local-model-type": "ローカルモデルタイプを入力", - "you-are-on-selft-host-mode": "セルフホストモードです", - "you-are-using-self-hosted-mode": "セルフホストモードを使用しています。この製品を最大限に活用するには、「MCP & ツール」にGoogle検索キーを入力して、Eigentが正しく機能するようにしてください。", - "the-google-search-key-is-essential-for-delivering-accurate-search-results": "Google検索キーは、正確な検索結果を提供するために不可欠です。Exa検索キーはオプションですが、パフォーマンス向上のために強く推奨されます。", - "close": "閉じる", - "enter-your-api-key": "APIキーを入力", - "key": "キー", - "enter-your-api-host": "APIホストを入力", - "url": "URL", - "enter-your-model-type": "モデルタイプを入力", - "verifying": "検証中...", - "account": "アカウント", "you-are-currently-signed-in-with": "{{email}}で現在サインインしています", "manage": "管理", @@ -105,7 +28,6 @@ "dark": "ダーク", "light": "ライト", "transparent": "透明", - "workspace-main-background": "ワークスペースの背景", "workspace-main-background-description": "Workforce と Session のメインパネルにのみ適用されます。", "workspace-main-background-empty": "なし", @@ -114,14 +36,12 @@ "workspace-main-background-ruled": "罫線", "workspace-main-background-dotted": "点線", "workspace-main-background-dashed": "破線", - "appearance-tab": "外観", "color-mode": "カラーモード", "accent-palette": "アクセントの配色", "accent-palette-description": "UIのプリセット配色です。ライトモードとダークモードで別々に保存されます。", "accent-for-light": "ライトモード", "accent-for-dark": "ダークモード", - "data-privacy": "データプライバシー", "data-privacy-description": "Eigentはプライバシーを確保するためにローカルファーストの原則に基づいて構築されています。デフォルトでは、データはお客様のデバイスに残ります。クラウド機能はオプションであり、機能するために必要な最小限のデータのみを使用します。詳細については、当社の", "privacy-policy": "プライバシーポリシー", @@ -170,7 +90,6 @@ "url": "URL", "enter-your-model-type": "モデルタイプを入力", "verifying": "検証中...", - "mcp-and-tools": "MCP & ツール", "add-mcp-server": "MCPサーバーを追加", "market": "マーケット", @@ -200,7 +119,7 @@ "are-you-sure-you-want-to-delete": "本当に削除しますか", "deleting": "削除中...", "delete": "削除", - "configure {name} Toolkit": "{name}ツールキットを構成", + "configure {name} Toolkit": "{{name}}ツールキットを構成", "get-it-from": "から入手", "google-custom-search-api": "Googleカスタム検索API", "google-cloud-console": "Google Cloud Console", @@ -253,7 +172,6 @@ "reset-success": "リセットに成功しました!", "reset-failed": "リセットに失敗しました!", "select-default-model": "デフォルトモデルを選択", - "browser-login": "ブラウザでログイン", "browser-login-description": "Chrome でアカウントにログインします。ログインデータは安全なプロファイルにローカル保存されます。", "open-browser-login": "ログイン用にブラウザを開く", @@ -278,7 +196,6 @@ "confirm-delete-all-cookies": "すべての Cookie を削除しますか?この操作は元に戻せません。", "all-cookies-deleted": "すべての Cookie を削除しました。", "cookie-delete-warning": "注意: Cookie を削除すると関連サイトからログアウトします。変更を反映するにはブラウザの再起動が必要な場合があります。", - "network-proxy": "ネットワークプロキシ", "network-proxy-description": "ネットワークリクエスト用のプロキシサーバーを設定します。プロキシ経由で外部APIにアクセスする必要がある場合に便利です。", "proxy-placeholder": "http://127.0.0.1:7890", @@ -286,7 +203,6 @@ "proxy-save-failed": "プロキシ設定の保存に失敗しました。", "proxy-invalid-url": "無効なプロキシURLです。http://、https://、socks4://、またはsocks5://で始まる必要があります。", "proxy-restart-hint": "プロキシの変更を適用するには再起動が必要です。", - "cloud-not-available-in-local-proxy": "ローカルプロキシモードではクラウド版は利用できません", "set-as-default": "デフォルトに設定", "api-key-setting": "APIキー設定", @@ -294,14 +210,12 @@ "model-type-setting": "モデルタイプ設定", "please-select": "選択してください", "configuring": "設定中...", - "models-default-setting-title": "デフォルト設定", "models-default-setting-description": "設定済みモデルの中から、Eigent のデフォルトモデルを1つ選択します。ワークスペース全体にグローバルに適用されます。", "models-configuration": "構成", - - "gemini-3-pro-preview-name": "Gemini 3 Pro Preview", + "gemini-3-pro-preview-name": "Gemini 3 Pro プレビュー", "gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview", - "gemini-3-flash-preview-name": "Gemini 3 Flash Preview", + "gemini-3-flash-preview-name": "Gemini 3 Flash プレビュー", "gpt-5.4-name": "GPT-5.4", "gpt-5.5-name": "GPT-5.5", "gpt-5-mini-name": "GPT-5 Mini", @@ -312,11 +226,15 @@ "claude-opus-4-7-name": "Claude Opus 4.7", "deepseek-v4-pro-name": "DeepSeek V4 Pro", "minimax-m2-7-name": "Minimax M2.7", - "preferred-ide": "優先IDE", "preferred-ide-description": "エージェントプロジェクトフォルダを開くときに使用するアプリケーションを選択します。", "system-file-manager": "システムファイルマネージャー", "agents": "エージェント", "help-improve-eigent": "Eigentの改善に協力する", - "help-improve-eigent-description": "サービス向上のため、Eigentが匿名のエラーログと使用状況データを収集することを許可します。これは任意であり、いつでも変更できます。" + "help-improve-eigent-description": "サービス向上のため、Eigentが匿名のエラーログと使用状況データを収集することを許可します。これは任意であり、いつでも変更できます。", + "please-complete-authorization-in-browser": "ブラウザで認証を完了してください", + "authorization-cancelled": "認証がキャンセルされました", + "authorization-failed": "認証に失敗しました", + "this-service-is-already-enabled-by-default": "このサービスはすでにデフォルトで有効になっています", + "version": "Version" } diff --git a/src/i18n/locales/ja/triggers.json b/src/i18n/locales/ja/triggers.json index 7402c6f1d..3e78d2542 100644 --- a/src/i18n/locales/ja/triggers.json +++ b/src/i18n/locales/ja/triggers.json @@ -89,7 +89,7 @@ "frequency-one-time": "1回のみ", "frequency-custom": "カスタム", "invalid-time-format": "無効な時間形式です。HH:MM を使用してください (例: 09:30)", - "schedule-day-of-month-note": "If the selected day doesn’t exist in that month (e.g., the 31st), the task will be skipped.", + "schedule-day-of-month-note": "選択した日がその月に存在しない場合(例:31日)、そのタスクはスキップされます。", "schedule-hour": "時", "schedule-minute": "分", "schedule-date": "日付", @@ -103,9 +103,9 @@ "select-expiration": "有効期限を選択", "no-upcoming-one-time": "将来の日時を選択してください", "no-upcoming-executions": "予定されている実行はありません", - "date-required": "Date is required", - "weekday-required": "At least one weekday is required", - "schedule-required-fields": "Please fill in all required fields for the schedule", + "date-required": "日付は必須です", + "weekday-required": "少なくとも1つの曜日を指定してください", + "schedule-required-fields": "スケジュールに必要な項目をすべて入力してください", "create-trigger-agent": "トリガーでタスクを自動化", "trigger-overview": "トリガーの概要", "edit": "編集", @@ -181,7 +181,7 @@ "task-prompt-required": "タスクプロンプトは必須です", "project-id-required": "プロジェクト ID は必須です", "execution-settings": "実行設定", - "extra-settings": "Extra Settings", + "extra-settings": "追加設定", "max-per-hour-placeholder": "0", "max-per-day-placeholder": "0", "copy": "コピー", @@ -200,97 +200,97 @@ "change-app": "Change", "dynamic": { "credentials": "Credentials", - "credentials-notice": "Your credentials are stored securely and used to authenticate with the service.", - "credentials-saved": "Credentials configured successfully", - "configuration": "Configuration", - "behavior-settings": "Behavior Settings", - "enter-value": "Please enter a value", + "credentials-notice": "認証情報は安全に保存され、サービスへの認証に使用されます。", + "credentials-saved": "認証情報が正常に設定されました", + "configuration": "設定", + "behavior-settings": "動作設定", + "enter-value": "値を入力してください", "add": "Add", "update": "Update", - "config-saved": "Configuration saved successfully", - "config-updated": "Configuration updated successfully", - "config-save-error": "Failed to save configuration", + "config-saved": "設定が正常に保存されました", + "config-updated": "設定が正常に更新されました", + "config-save-error": "設定の保存に失敗しました", "loading": "Loading...", - "loading-config": "Loading configuration...", - "no-config-available": "No configuration available for this trigger type", - "failed-to-load-schema": "Failed to load configuration schema", - "select-options": "Select options...", + "loading-config": "設定を読み込んでいます...", + "no-config-available": "このトリガータイプに利用可能な設定はありません", + "failed-to-load-schema": "設定スキーマの読み込みに失敗しました", + "select-options": "オプションを選択...", "selected": "selected", - "save-credentials-first": "Save credentials first", + "save-credentials-first": "先に認証情報を保存してください", "search": "Search...", - "no-options": "No options found", + "no-options": "オプションが見つかりません", "validation": { - "required": "{{field}} is required", - "invalid-regex": "Invalid regular expression pattern", - "invalid-email": "Invalid email address", - "invalid-url": "Invalid URL format", - "min-length": "Must be at least {{min}} characters", - "max-length": "Must be no more than {{max}} characters", - "pattern-mismatch": "Value does not match required pattern", - "min-value": "Must be at least {{min}}", - "max-value": "Must be no more than {{max}}" + "required": "{{field}} は必須です", + "invalid-regex": "正規表現パターンが無効です", + "invalid-email": "メールアドレスが無効です", + "invalid-url": "URLの形式が無効です", + "min-length": "少なくとも{{min}}文字である必要があります", + "max-length": "{{max}}文字以下である必要があります", + "pattern-mismatch": "値が必要なパターンと一致しません", + "min-value": "少なくとも{{min}}である必要があります", + "max-value": "{{max}}以下である必要があります" }, - "validation-failed": "Please fix validation errors: {{errors}}" + "validation-failed": "検証エラーを修正してください: {{errors}}" }, "slack": { - "credentials-saved": "Slack credentials configured successfully", - "enter-bot-token": "Please enter a bot token", - "bot-token-saved": "Bot token saved successfully", - "bot-token-updated": "Bot token updated successfully", - "bot-token-save-error": "Failed to save bot token", - "signing-secret-saved": "Signing secret saved successfully", - "signing-secret-updated": "Signing secret updated successfully", - "signing-secret-save-error": "Failed to save signing secret", + "credentials-saved": "Slackの認証情報が正常に設定されました", + "enter-bot-token": "ボットトークンを入力してください", + "bot-token-saved": "ボットトークンが正常に保存されました", + "bot-token-updated": "ボットトークンが正常に更新されました", + "bot-token-save-error": "ボットトークンの保存に失敗しました", + "signing-secret-saved": "署名シークレットが正常に保存されました", + "signing-secret-updated": "署名シークレットが正常に更新されました", + "signing-secret-save-error": "署名シークレットの保存に失敗しました", "add": "Add", "update": "Update", - "event-configuration": "Event Configuration", + "event-configuration": "イベント設定", "event-types": "Event Types", - "select-events": "Select events to trigger on...", - "search-events": "Search events...", - "no-events-found": "No events found", - "events-selected": "events selected", - "channel-filter": "Channel Filter", - "select-channels": "All channels (no filter)", - "search-channels": "Search channels...", - "no-channels-found": "No channels found", - "channels-selected": "channels selected", - "save-credentials-first": "Save credentials first to load channels", - "loading-channels": "Loading channels...", - "channels-fetch-error": "Failed to fetch channels. Please check your credentials.", - "behavior-settings": "Behavior Settings", + "select-events": "トリガーするイベントを選択...", + "search-events": "イベントを検索...", + "no-events-found": "イベントが見つかりませんでした", + "events-selected": "件のイベントが選択されました", + "channel-filter": "チャンネルフィルター", + "select-channels": "すべてのチャンネル(フィルターなし)", + "search-channels": "チャンネルを検索...", + "no-channels-found": "チャンネルが見つかりませんでした", + "channels-selected": "件のチャンネルが選択されました", + "save-credentials-first": "チャンネルを読み込むには先に認証情報を保存してください", + "loading-channels": "チャンネルを読み込み中...", + "channels-fetch-error": "チャンネルの取得に失敗しました。認証情報を確認してください。", + "behavior-settings": "動作設定", "authentication_required": { - "label": "Require Authentication", - "notice": "Slack triggers require authentication to verify webhook signatures (Slack Signing Secret required). Verify webhook endpoint at https://api.slack.com/apps to activate trigger." + "label": "認証を必須にする", + "notice": "Slackトリガーでは、Webhook署名を検証するために認証が必要です(Slack Signing Secret が必要)。トリガーを有効にするには、https://api.slack.com/apps でWebhookエンドポイントを確認してください。" }, "bot_token": { - "label": "Slack Bot Token", + "label": "Slack Botトークン", "placeholder": "xoxb-...", - "notice": "Your Slack Bot User OAuth Token (starts with xoxb-)" + "notice": "SlackのBot User OAuth Token(xoxb- で始まります)" }, "signing_secret": { "label": "Slack Signing Secret", - "placeholder": "Enter your Slack signing secret...", - "notice": "Your Slack app's signing secret used to verify requests" + "placeholder": "SlackのSigning Secretを入力してください...", + "notice": "リクエストを検証するために使用されるSlackアプリのSigning Secret" }, "events": { "label": "Event Types", - "notice": "Select which Slack events should trigger this workflow" + "notice": "このワークフローでトリガーするSlackイベントを選択してください" }, "channel_id": { "label": "Channel ID", - "placeholder": "Select a channel...", - "notice": "Specific channel to watch (leave empty to watch all channels)" + "placeholder": "チャンネルを選択...", + "notice": "監視する特定のチャンネル(空欄の場合はすべてのチャンネルを監視)" }, "ignore_bot_messages": { - "label": "Ignore Bot Messages" + "label": "Botメッセージを無視する" }, "ignore_users": { - "label": "Ignore Users", - "placeholder": "Enter Slack user IDs (e.g., U1234567890)...", - "notice": "Slack user IDs to ignore messages from" + "label": "無視するユーザー", + "placeholder": "SlackのユーザーIDを入力してください(例: U1234567890)...", + "notice": "メッセージを無視するSlackユーザーID" } }, - "verification-required": "Pending Verification. A valid event message is required for Trigger Activation or disable trigger Authentication.", + "verification-required": "保留中の確認があります。トリガーを有効化するには、有効なイベントメッセージが必要です。またはトリガー認証を無効にしてください。", "base": { "authentication_required": { "label": "認証が必要", @@ -309,34 +309,36 @@ }, "webhook": { "authentication_required": { - "label": "Require Authentication", - "notice": "Whether authentication is required for this webhook trigger" + "label": "認証を必須にする", + "notice": "このWebhookトリガーで認証が必要かどうか" }, "body_contains": { - "label": "Body Contains", - "placeholder": "Enter text that must be in request body...", - "notice": "Only trigger if the request body contains this string" + "label": "本文に含まれる", + "placeholder": "リクエスト本文に含まれている必要があるテキストを入力してください...", + "notice": "リクエスト本文にこの文字列が含まれている場合のみトリガーします" }, "required_headers": { - "label": "Required Headers", - "placeholder": "Enter header names (e.g., Content-Type, Authorization)...", - "notice": "List of HTTP headers that must be present in the request" + "label": "必須ヘッダー", + "placeholder": "ヘッダー名を入力してください(例: Content-Type, Authorization)...", + "notice": "リクエストに含まれている必要があるHTTPヘッダーの一覧" }, "header_match": { - "label": "Header Match (Regex)", - "placeholder": "Header-Name: regex pattern", - "notice": "Match request headers against a regex pattern (format: Header-Name: pattern)" + "label": "ヘッダー一致(正規表現)", + "placeholder": "ヘッダー名: 正規表現パターン", + "notice": "正規表現パターンでリクエストヘッダーを照合します(形式: Header-Name: パターン)" }, "include_headers": { - "label": "Include Headers", - "notice": "Include request headers in the workflow execution input" + "label": "ヘッダーを含める", + "notice": "ワークフロー実行入力にリクエストヘッダーを含めます" }, "include_query_params": { - "label": "Include Query Parameters" + "label": "クエリパラメータを含める" }, "include_request_metadata": { - "label": "Include Request Metadata", - "notice": "Include request metadata (method, URL, client IP) in execution input" + "label": "リクエストメタデータを含める", + "notice": "リクエストメタデータ(メソッド、URL、クライアントIP)を実行入力に含めます" } - } + }, + "status-cancelled": "Cancelled", + "select-method": "方法を選択" } diff --git a/src/i18n/locales/ko/chat.json b/src/i18n/locales/ko/chat.json index 76be551b9..730f31546 100644 --- a/src/i18n/locales/ko/chat.json +++ b/src/i18n/locales/ko/chat.json @@ -91,5 +91,7 @@ "input-attach-manage-connectors": "커넥터 관리", "input-attach-open-browser": "브라우저 열기", "input-attach-manage-browsers": "브라우저 관리", - "input-attach-menu-trigger": "파일·사진 추가 또는 메뉴에서 스킬, 커넥터, 브라우저 열기" + "input-attach-menu-trigger": "파일·사진 추가 또는 메뉴에서 스킬, 커넥터, 브라우저 열기", + "hide-file-sidebar": "파일 사이드바 숨기기", + "show-file-sidebar": "파일 사이드바 표시" } diff --git a/src/i18n/locales/ko/dashboard.json b/src/i18n/locales/ko/dashboard.json index 83ff00445..375d4d028 100644 --- a/src/i18n/locales/ko/dashboard.json +++ b/src/i18n/locales/ko/dashboard.json @@ -23,5 +23,7 @@ "document-agent": "문서 에이전트", "multi-modal-agent": "멀티모달 에이전트", "social-media-agent": "소셜미디어 에이전트", - "no-projects-found": "프로젝트를 찾을 수 없습니다." + "no-projects-found": "프로젝트를 찾을 수 없습니다.", + "no-projects-match-search": "검색과 일치하는 프로젝트가 없습니다", + "try-different-search": "다른 검색어를 사용해 보세요" } diff --git a/src/i18n/locales/ko/folder.json b/src/i18n/locales/ko/folder.json new file mode 100644 index 000000000..93709bba1 --- /dev/null +++ b/src/i18n/locales/ko/folder.json @@ -0,0 +1,8 @@ +{ + "file-path-remote-root": "Remote", + "files-scope-all": "All files", + "files-scope-new": "New files", + "file-path-breadcrumb": "File path", + "download-file": "파일 다운로드", + "zip-file-is-not-supported-yet": "ZIP 미리보기는 아직 지원되지 않습니다." +} diff --git a/src/i18n/locales/ko/index.ts b/src/i18n/locales/ko/index.ts index efa753446..4e23f35ac 100644 --- a/src/i18n/locales/ko/index.ts +++ b/src/i18n/locales/ko/index.ts @@ -15,6 +15,7 @@ import agents from './agents.json'; import chat from './chat.json'; import dashboard from './dashboard.json'; +import folder from './folder.json'; import layout from './layout.json'; import setting from './setting.json'; import triggers from './triggers.json'; @@ -24,6 +25,7 @@ export default { agents, layout, dashboard, + folder, workforce, chat, setting, diff --git a/src/i18n/locales/ko/layout.json b/src/i18n/locales/ko/layout.json index a8b07ba90..148772175 100644 --- a/src/i18n/locales/ko/layout.json +++ b/src/i18n/locales/ko/layout.json @@ -307,5 +307,65 @@ "cookie-count": "{{count}}개 쿠키", "add-new-mcp": "새 MCP 추가", "browse-mcps": "MCP 찾아보기", - "browser-settings": "브라우저 설정" + "browser-settings": "브라우저 설정", + "report-bug-dialog-title": "버그 신고", + "report-bug-footer-hint": "앱 로그의 ZIP 파일을 저장한 다음 이메일 앱을 엽니다. 전송하기 전에 저장된 ZIP 파일을 메시지에 첨부하세요.", + "report-bug-field-description": "무슨 문제가 발생했나요?", + "report-bug-field-description-placeholder": "문제를 설명하세요…", + "report-bug-field-steps": "재현 단계(선택 사항)", + "report-bug-field-steps-placeholder": "1. … 2. …", + "report-bug-meta": "버전 {{version}} · {{os}} ({{arch}})", + "report-bug-description-required": "무슨 문제가 발생했는지 설명해 주세요.", + "report-bug-submit": "진단 정보를 저장하고 이메일 열기", + "report-bug-diagnostics-saved": "진단 정보가 저장되었습니다. 이메일에 ZIP 파일을 첨부한 다음 전송하세요.", + "report-bug-mail-subject": "[Eigent] 버그 신고", + "report-bug-mail-body-intro": "방금 저장한 진단 ZIP 파일을 이 메시지에 첨부해 주세요.", + "report-bug-mail-body-path": "ZIP 저장 위치: {{path}}", + "report-bug-mail-body-meta": "앱 버전: {{version}} | OS: {{os}} ({{arch}})", + "report-bug-mail-body-desc": "설명:", + "report-bug-mail-body-steps": "재현 단계:", + "report-bug-mail-body-truncated": "길이 제한으로 인해 이메일 본문이 줄어들었습니다. 전체 내용은 ZIP 파일 안의 bug_report.txt를 확인하세요.", + "project-page-tab-project": "Project", + "project-page-tab-tasks": "Tasks", + "project-page-all-tasks": "All tasks", + "project-page-status-pending": "Pending", + "no-tasks": "No tasks", + "workspace-select-project": "프로젝트를 선택하세요", + "workspace-cowork-single-agent": "단일 에이전트와 협업", + "workspace-cowork-workforce": "워크포스와 협업", + "execution-context": "실행 컨텍스트", + "no-results": "No results", + "notification-panel-dismiss": "Dismiss", + "instructions": "지침", + "instructions-rules-tone": "규칙 및 어조", + "memory": "Memory", + "memory-on": "On", + "memory-off": "Off", + "workforce-setting": "워크포스 설정", + "select": "Select", + "edit-instructions": "지침 편집", + "sessions-start-new": "새 세션 시작", + "sessions-full-title": "모든 세션", + "sessions-create-task-hint": "세션을 시작하려면 작업을 생성하세요", + "workforce-progress": "Progress", + "workforce-agent-folder": "에이전트 폴더", + "workforce-agent-pool": "Agent Pool", + "expand-project-sidebar": "사이드바 펼치기", + "fold-project-sidebar": "사이드바 접기", + "update": "Update", + "workspace-start-from-scratch": "처음부터 시작", + "workspace-project-submenu": "Project", + "workspace-recent-session-now": "Now", + "workspace-recent-session-minutes": "{{count}}분", + "workspace-recent-session-hours": "{{count}}h", + "workspace-recent-session-days": "{{count}}d", + "workspace-recent-sessions-heading": "Recent", + "workspace-session-mode-label": "세션 모드", + "workspace-session-mode-cycle-hint": "클릭하여 세션 모드 전환", + "failed-to-start-task": "작업 시작에 실패했습니다. 모델 구성을 확인해 주세요.", + "workspace-work-with-panel-hide": "Work with 패널 숨기기", + "workspace-work-with-panel-show": "Work with 패널 표시하기", + "workspace-work-with-dismiss-overlay": "Dismiss", + "workspace-work-with-title": "Work with", + "workspace-work-with-remote-control": "원격 제어" } diff --git a/src/i18n/locales/ko/setting.json b/src/i18n/locales/ko/setting.json index 4eed71009..ef0c0e2c4 100644 --- a/src/i18n/locales/ko/setting.json +++ b/src/i18n/locales/ko/setting.json @@ -17,83 +17,6 @@ "eigent-cloud": "Eigent Cloud", "default": "기본값", "profile": "프로필", - "account": "계정", - "you-are-currently-signed-in-with": "{{email}} 계정으로 로그인되어 있습니다.", - "manage": "관리", - "log-out": "로그아웃", - "language": "언어", - "select-language": "언어 선택", - "system-default": "시스템 기본값", - "appearance": "테마", - "dark": "다크", - "light": "라이트", - "transparent": "투명", - - "workspace-main-background": "작업 영역 배경", - "workspace-main-background-description": "Workforce 및 Session 메인 패널에만 적용됩니다.", - "workspace-main-background-empty": "빈 화면", - "workspace-main-background-dots": "도트", - "workspace-main-background-blocks": "격자", - "workspace-main-background-ruled": "줄 눈금", - "workspace-main-background-dotted": "점선", - "workspace-main-background-dashed": "대시선", - - "appearance-tab": "모양", - "color-mode": "색상 모드", - "accent-palette": "강조 색상 테마", - "accent-palette-description": "인터페이스용 사전 정의 색상 테마입니다. 라이트 모드와 다크 모드에 각각 저장됩니다.", - "accent-for-light": "라이트 모드", - "accent-for-dark": "다크 모드", - - "data-privacy": "데이터 개인정보 보호", - "data-privacy-description": "Eigent는 개인정보 보호를 위해 로컬 우선 원칙을 기반으로 구축되었습니다. 기본적으로 데이터는 사용자의 기기에 남아 있습니다. 클라우드 기능은 선택 사항이며 작동에 필요한 최소한의 데이터만 사용합니다. 자세한 내용은 당사의", - "privacy-policy": "개인정보 처리방침", - "how-we-handle-your-data": "데이터 처리 방식", - "we-only-use-the-essential-data-needed-to-run-your-tasks": "작업 실행에 필요한 필수 데이터만 사용합니다", - "how-we-handle-your-data-line-1": "작업 실행에 필요한 필수 데이터만 사용합니다", - "how-we-handle-your-data-line-1-line-1": "Eigent는 UI 요소를 분석하고 텍스트를 읽고 다음 작업을 결정하기 위해 스크린샷을 캡처할 수 있습니다. 사용자가 하는 방식과 같습니다.", - "how-we-handle-your-data-line-1-line-2": "Eigent는 사용자가 지정한 로컬 소프트웨어 및 파일에 액세스하기 위해 마우스와 키보드를 사용할 수 있습니다.", - "how-we-handle-your-data-line-1-line-3": "AI 모델 제공업체 또는 사용자가 활성화한 타사 통합에 전송되는 데이터는 최소한의 작업 데이터뿐이며, 데이터 보존은 전혀 없습니다.", - "how-we-handle-your-data-line-2": "작업 파일, 출력 및 스크린샷은 로컬의 지정된 작업 폴더에 유지됩니다.", - "how-we-handle-your-data-line-3": "자격 증명은 로컬에 암호화되어 저장되며 승인된 단계에만 사용됩니다.", - "how-we-handle-your-data-line-4": "귀하의 명시적인 동의 없이 귀하의 데이터는 당사 AI 모델을 학습시키는 데 사용되지 않습니다.", - "how-we-handle-your-data-line-5": "귀하의 데이터를 제3자에게 판매하지 않습니다.", - "api-key-can-not-be-empty": "API 키는 비워둘 수 없습니다!", - "api-host-can-not-be-empty": "API 호스트는 비워둘 수 없습니다!", - "model-type-can-not-be-empty": "모델 유형은 비워둘 수 없습니다!", - "validate-success": "유효성 검사 성공", - "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "모델이 함수 호출을 지원하는 것으로 확인되었습니다. 이는 Eigent를 사용하는 데 필요합니다.", - "validate-failed": "유효성 검사 실패", - "copy": "복사", - "copied-to-clipboard": "클립보드에 복사됨", - "failed-to-copy-to-clipboard": "클립보드로 복사하지 못했습니다", - "endpoint-url-can-not-be-empty": "엔드포인트 URL은 비워둘 수 없습니다!", - "verification-failed-please-check-endpoint-url": "확인 실패, 엔드포인트 URL을 확인하세요", - "eigent-cloud-version": "Eigent 클라우드 버전", - "you-are-currently-subscribed-to-the": "현재 다음 플랜을 구독 중입니다.", - "discover-more-about-our": "당사의", - "pricing-options": "가격 옵션", - "credits": "크레딧", - "select-model-type": "모델 유형 선택", - "custom-model": "사용자 정의 모델", - "use-your-own-api-keys-or-set-up-a-local-model": "자신의 API 키를 사용하거나 로컬 모델을 설정하십시오.", - "verify": "확인", - "local-model": "로컬 모델", - "model-platform": "모델 플랫폼", - "model-endpoint-url": "모델 엔드포인트 URL", - "model-type": "모델 유형", - "enter-your-local-model-type": "로컬 모델 유형 입력", - "you-are-on-selft-host-mode": "셀프 호스트 모드입니다.", - "you-are-using-self-hosted-mode": "셀프 호스트 모드를 사용 중입니다. 이 제품의 최적 성능을 얻으려면 \"MCP 및 도구\"에 Google 검색 키를 입력하여 Eigent가 올바르게 작동하도록 하세요.", - "the-google-search-key-is-essential-for-delivering-accurate-search-results": "Google 검색 키는 정확한 검색 결과를 제공하는 데 필수적입니다. Exa 검색 키는 선택 사항이지만 더 나은 성능을 위해 강력히 권장됩니다.", - "close": "닫기", - "enter-your-api-key": "API 키 입력", - "key": "키", - "enter-your-api-host": "API 호스트 입력", - "url": "URL", - "enter-your-model-type": "모델 유형 입력", - "verifying": "확인 중...", - "account": "계정", "you-are-currently-signed-in-with": "{{email}} 계정으로 로그인되어 있습니다.", "manage": "관리", @@ -105,7 +28,6 @@ "dark": "다크", "light": "라이트", "transparent": "투명", - "workspace-main-background": "작업 영역 배경", "workspace-main-background-description": "Workforce 및 Session 메인 패널에만 적용됩니다.", "workspace-main-background-empty": "빈 화면", @@ -114,14 +36,12 @@ "workspace-main-background-ruled": "줄 눈금", "workspace-main-background-dotted": "점선", "workspace-main-background-dashed": "대시선", - "appearance-tab": "모양", "color-mode": "색상 모드", "accent-palette": "강조 색상 테마", "accent-palette-description": "인터페이스용 사전 정의 색상 테마입니다. 라이트 모드와 다크 모드에 각각 저장됩니다.", "accent-for-light": "라이트 모드", "accent-for-dark": "다크 모드", - "data-privacy": "데이터 개인정보 보호", "data-privacy-description": "Eigent는 개인정보 보호를 위해 로컬 우선 원칙을 기반으로 구축되었습니다. 기본적으로 데이터는 사용자의 기기에 남아 있습니다. 클라우드 기능은 선택 사항이며 작동에 필요한 최소한의 데이터만 사용합니다. 자세한 내용은 당사의", "privacy-policy": "개인정보 처리방침", @@ -170,7 +90,6 @@ "url": "URL", "enter-your-model-type": "모델 유형 입력", "verifying": "확인 중...", - "mcp-and-tools": "MCP 및 도구", "add-mcp-server": "MCP 서버 추가", "market": "마켓", @@ -253,7 +172,6 @@ "reset-success": "초기화 완료!", "reset-failed": "초기화 실패!", "select-default-model": "기본 모델 선택", - "browser-login": "브라우저 로그인", "browser-login-description": "Chrome을 열어 계정에 로그인하세요. 로그인 정보는 안전한 프로필에 로컬로 저장됩니다.", "open-browser-login": "로그인용 브라우저 열기", @@ -278,7 +196,6 @@ "confirm-delete-all-cookies": "모든 쿠키를 삭제할까요? 이 작업은 취소할 수 없습니다.", "all-cookies-deleted": "모든 쿠키가 삭제되었습니다.", "cookie-delete-warning": "참고: 쿠키를 삭제하면 연결된 사이트에서 로그아웃됩니다. 변경 사항을 보려면 브라우저를 다시 시작해야 할 수 있습니다.", - "network-proxy": "네트워크 프록시", "network-proxy-description": "네트워크 요청을 위한 프록시 서버를 구성합니다. 프록시를 통해 외부 API에 접근해야 하는 경우 유용합니다.", "proxy-placeholder": "http://127.0.0.1:7890", @@ -286,7 +203,6 @@ "proxy-save-failed": "프록시 설정 저장에 실패했습니다.", "proxy-invalid-url": "잘못된 프록시 URL입니다. http://, https://, socks4://, 또는 socks5://로 시작해야 합니다.", "proxy-restart-hint": "프록시 변경 사항을 적용하려면 다시 시작해야 합니다.", - "cloud-not-available-in-local-proxy": "로컬 프록시 모드에서는 클라우드 버전을 사용할 수 없습니다", "set-as-default": "기본값으로 설정", "api-key-setting": "API 키 설정", @@ -294,14 +210,12 @@ "model-type-setting": "모델 타입 설정", "please-select": "선택하세요", "configuring": "구성 중...", - "models-default-setting-title": "기본 설정", "models-default-setting-description": "구성된 모델 중 하나를 Eigent의 기본 모델로 선택하세요. 워크스페이스 전체에 전역으로 적용됩니다.", "models-configuration": "구성", - - "gemini-3-pro-preview-name": "Gemini 3 Pro Preview", + "gemini-3-pro-preview-name": "Gemini 3 Pro 미리보기", "gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview", - "gemini-3-flash-preview-name": "Gemini 3 Flash Preview", + "gemini-3-flash-preview-name": "Gemini 3 Flash 미리보기", "gpt-5.4-name": "GPT-5.4", "gpt-5.5-name": "GPT-5.5", "gpt-5-mini-name": "GPT-5 Mini", @@ -312,11 +226,15 @@ "claude-opus-4-7-name": "Claude Opus 4.7", "deepseek-v4-pro-name": "DeepSeek V4 Pro", "minimax-m2-7-name": "Minimax M2.7", - "preferred-ide": "선호 IDE", "preferred-ide-description": "에이전트 프로젝트 폴더를 열 때 사용할 애플리케이션을 선택합니다.", "system-file-manager": "시스템 파일 관리자", "agents": "에이전트", "help-improve-eigent": "Eigent 개선에 도움주기", - "help-improve-eigent-description": "서비스 개선을 위해 Eigent가 익명의 오류 로그와 사용 데이터를 수집하도록 허용합니다. 이는 선택 사항이며 언제든지 변경할 수 있습니다." + "help-improve-eigent-description": "서비스 개선을 위해 Eigent가 익명의 오류 로그와 사용 데이터를 수집하도록 허용합니다. 이는 선택 사항이며 언제든지 변경할 수 있습니다.", + "please-complete-authorization-in-browser": "브라우저에서 인증을 완료해 주세요", + "authorization-cancelled": "인증이 취소되었습니다", + "authorization-failed": "인증에 실패했습니다", + "this-service-is-already-enabled-by-default": "이 서비스는 이미 기본적으로 활성화되어 있습니다", + "version": "Version" } diff --git a/src/i18n/locales/ko/triggers.json b/src/i18n/locales/ko/triggers.json index d2467633b..ef39789e2 100644 --- a/src/i18n/locales/ko/triggers.json +++ b/src/i18n/locales/ko/triggers.json @@ -89,7 +89,7 @@ "frequency-one-time": "1회", "frequency-custom": "사용자 정의", "invalid-time-format": "잘못된 시간 형식입니다. HH:MM을 사용하세요 (예: 09:30)", - "schedule-day-of-month-note": "If the selected day doesn’t exist in that month (e.g., the 31st), the task will be skipped.", + "schedule-day-of-month-note": "선택한 날짜가 해당 월에 존재하지 않으면(예: 31일), 작업은 건너뜁니다.", "schedule-hour": "시", "schedule-minute": "분", "schedule-date": "날짜", @@ -103,9 +103,9 @@ "select-expiration": "만료 날짜 선택", "no-upcoming-one-time": "미래 날짜와 시간을 선택하세요", "no-upcoming-executions": "예정된 실행 없음", - "date-required": "Date is required", - "weekday-required": "At least one weekday is required", - "schedule-required-fields": "Please fill in all required fields for the schedule", + "date-required": "날짜는 필수입니다", + "weekday-required": "최소한 하나의 요일이 필요합니다", + "schedule-required-fields": "일정에 필요한 모든 필드를 입력해 주세요", "create-trigger-agent": "트리거로 작업 자동화", "trigger-overview": "트리거 개요", "edit": "편집", @@ -181,7 +181,7 @@ "task-prompt-required": "작업 프롬프트는 필수입니다", "project-id-required": "프로젝트 ID는 필수입니다", "execution-settings": "실행 설정", - "extra-settings": "Extra Settings", + "extra-settings": "추가 설정", "max-per-hour-placeholder": "0", "max-per-day-placeholder": "0", "copy": "복사", @@ -200,97 +200,97 @@ "change-app": "Change", "dynamic": { "credentials": "Credentials", - "credentials-notice": "Your credentials are stored securely and used to authenticate with the service.", - "credentials-saved": "Credentials configured successfully", - "configuration": "Configuration", - "behavior-settings": "Behavior Settings", - "enter-value": "Please enter a value", + "credentials-notice": "자격 증명은 안전하게 저장되며 서비스 인증에 사용됩니다.", + "credentials-saved": "자격 증명이 성공적으로 구성되었습니다", + "configuration": "구성", + "behavior-settings": "동작 설정", + "enter-value": "값을 입력해 주세요", "add": "Add", "update": "Update", - "config-saved": "Configuration saved successfully", - "config-updated": "Configuration updated successfully", - "config-save-error": "Failed to save configuration", + "config-saved": "구성이 성공적으로 저장되었습니다", + "config-updated": "구성이 성공적으로 업데이트되었습니다", + "config-save-error": "구성 저장에 실패했습니다", "loading": "Loading...", - "loading-config": "Loading configuration...", - "no-config-available": "No configuration available for this trigger type", - "failed-to-load-schema": "Failed to load configuration schema", - "select-options": "Select options...", + "loading-config": "구성을 불러오는 중...", + "no-config-available": "이 트리거 유형에 사용할 수 있는 구성이 없습니다", + "failed-to-load-schema": "구성 스키마를 불러오지 못했습니다", + "select-options": "옵션 선택...", "selected": "selected", - "save-credentials-first": "Save credentials first", + "save-credentials-first": "먼저 자격 증명을 저장하세요", "search": "Search...", - "no-options": "No options found", + "no-options": "옵션을 찾을 수 없습니다", "validation": { - "required": "{{field}} is required", - "invalid-regex": "Invalid regular expression pattern", - "invalid-email": "Invalid email address", - "invalid-url": "Invalid URL format", - "min-length": "Must be at least {{min}} characters", - "max-length": "Must be no more than {{max}} characters", - "pattern-mismatch": "Value does not match required pattern", - "min-value": "Must be at least {{min}}", - "max-value": "Must be no more than {{max}}" + "required": "{{field}}은(는) 필수입니다", + "invalid-regex": "유효하지 않은 정규식 패턴입니다", + "invalid-email": "유효하지 않은 이메일 주소입니다", + "invalid-url": "유효하지 않은 URL 형식입니다", + "min-length": "최소 {{min}}자 이상이어야 합니다", + "max-length": "최대 {{max}}자 이하여야 합니다", + "pattern-mismatch": "값이 필요한 패턴과 일치하지 않습니다", + "min-value": "최소 {{min}} 이상이어야 합니다", + "max-value": "최대 {{max}} 이하여야 합니다" }, - "validation-failed": "Please fix validation errors: {{errors}}" + "validation-failed": "다음 유효성 검사 오류를 수정해 주세요: {{errors}}" }, "slack": { - "credentials-saved": "Slack credentials configured successfully", - "enter-bot-token": "Please enter a bot token", - "bot-token-saved": "Bot token saved successfully", - "bot-token-updated": "Bot token updated successfully", - "bot-token-save-error": "Failed to save bot token", - "signing-secret-saved": "Signing secret saved successfully", - "signing-secret-updated": "Signing secret updated successfully", - "signing-secret-save-error": "Failed to save signing secret", + "credentials-saved": "Slack 자격 증명이 성공적으로 구성되었습니다", + "enter-bot-token": "봇 토큰을 입력해 주세요", + "bot-token-saved": "봇 토큰이 성공적으로 저장되었습니다", + "bot-token-updated": "봇 토큰이 성공적으로 업데이트되었습니다", + "bot-token-save-error": "봇 토큰 저장에 실패했습니다", + "signing-secret-saved": "서명 시크릿이 성공적으로 저장되었습니다", + "signing-secret-updated": "서명 시크릿이 성공적으로 업데이트되었습니다", + "signing-secret-save-error": "서명 시크릿 저장에 실패했습니다", "add": "Add", "update": "Update", - "event-configuration": "Event Configuration", + "event-configuration": "이벤트 구성", "event-types": "Event Types", - "select-events": "Select events to trigger on...", - "search-events": "Search events...", - "no-events-found": "No events found", - "events-selected": "events selected", - "channel-filter": "Channel Filter", - "select-channels": "All channels (no filter)", - "search-channels": "Search channels...", - "no-channels-found": "No channels found", - "channels-selected": "channels selected", - "save-credentials-first": "Save credentials first to load channels", - "loading-channels": "Loading channels...", - "channels-fetch-error": "Failed to fetch channels. Please check your credentials.", - "behavior-settings": "Behavior Settings", + "select-events": "트리거할 이벤트를 선택하세요...", + "search-events": "이벤트 검색...", + "no-events-found": "이벤트를 찾을 수 없습니다", + "events-selected": "개의 이벤트가 선택됨", + "channel-filter": "채널 필터", + "select-channels": "모든 채널(필터 없음)", + "search-channels": "채널 검색...", + "no-channels-found": "채널을 찾을 수 없습니다", + "channels-selected": "개의 채널이 선택됨", + "save-credentials-first": "채널을 불러오려면 먼저 자격 증명을 저장하세요", + "loading-channels": "채널 불러오는 중...", + "channels-fetch-error": "채널을 가져오지 못했습니다. 자격 증명을 확인하세요.", + "behavior-settings": "동작 설정", "authentication_required": { - "label": "Require Authentication", - "notice": "Slack triggers require authentication to verify webhook signatures (Slack Signing Secret required). Verify webhook endpoint at https://api.slack.com/apps to activate trigger." + "label": "인증 필요", + "notice": "Slack 트리거는 웹훅 서명을 확인하기 위해 인증이 필요합니다(Slack 서명 시크릿 필요). 트리거를 활성화하려면 https://api.slack.com/apps에서 웹훅 엔드포인트를 확인하세요." }, "bot_token": { - "label": "Slack Bot Token", + "label": "Slack 봇 토큰", "placeholder": "xoxb-...", - "notice": "Your Slack Bot User OAuth Token (starts with xoxb-)" + "notice": "Slack Bot User OAuth 토큰(xoxb-로 시작)" }, "signing_secret": { - "label": "Slack Signing Secret", - "placeholder": "Enter your Slack signing secret...", - "notice": "Your Slack app's signing secret used to verify requests" + "label": "Slack 서명 시크릿", + "placeholder": "Slack 서명 시크릿을 입력하세요...", + "notice": "요청을 검증하는 데 사용되는 Slack 앱의 서명 시크릿" }, "events": { "label": "Event Types", - "notice": "Select which Slack events should trigger this workflow" + "notice": "이 워크플로를 트리거할 Slack 이벤트를 선택하세요" }, "channel_id": { "label": "Channel ID", - "placeholder": "Select a channel...", - "notice": "Specific channel to watch (leave empty to watch all channels)" + "placeholder": "채널을 선택하세요...", + "notice": "감시할 특정 채널(비워두면 모든 채널 감시)" }, "ignore_bot_messages": { - "label": "Ignore Bot Messages" + "label": "봇 메시지 무시" }, "ignore_users": { - "label": "Ignore Users", - "placeholder": "Enter Slack user IDs (e.g., U1234567890)...", - "notice": "Slack user IDs to ignore messages from" + "label": "사용자 무시", + "placeholder": "무시할 Slack 사용자 ID를 입력하세요(예: U1234567890)...", + "notice": "메시지를 무시할 Slack 사용자 ID" } }, - "verification-required": "Pending Verification. A valid event message is required for Trigger Activation or disable trigger Authentication.", + "verification-required": "보류 중인 확인입니다. 트리거 활성화에는 유효한 이벤트 메시지가 필요하며, 또는 트리거 인증을 비활성화하세요.", "base": { "authentication_required": { "label": "인증 필요", @@ -309,34 +309,36 @@ }, "webhook": { "authentication_required": { - "label": "Require Authentication", - "notice": "Whether authentication is required for this webhook trigger" + "label": "인증 필요", + "notice": "이 웹훅 트리거에 인증이 필요한지 여부" }, "body_contains": { - "label": "Body Contains", - "placeholder": "Enter text that must be in request body...", - "notice": "Only trigger if the request body contains this string" + "label": "본문에 포함", + "placeholder": "요청 본문에 포함되어야 하는 텍스트를 입력하세요...", + "notice": "요청 본문에 이 문자열이 포함된 경우에만 트리거됩니다" }, "required_headers": { - "label": "Required Headers", - "placeholder": "Enter header names (e.g., Content-Type, Authorization)...", - "notice": "List of HTTP headers that must be present in the request" + "label": "필수 헤더", + "placeholder": "헤더 이름을 입력하세요(예: Content-Type, Authorization)...", + "notice": "요청에 반드시 포함되어야 하는 HTTP 헤더 목록" }, "header_match": { - "label": "Header Match (Regex)", - "placeholder": "Header-Name: regex pattern", - "notice": "Match request headers against a regex pattern (format: Header-Name: pattern)" + "label": "헤더 일치(정규식)", + "placeholder": "헤더-이름: 정규식 패턴", + "notice": "정규식 패턴과 요청 헤더를 일치시킵니다(형식: 헤더-이름: 패턴)" }, "include_headers": { - "label": "Include Headers", - "notice": "Include request headers in the workflow execution input" + "label": "헤더 포함", + "notice": "워크플로 실행 입력에 요청 헤더를 포함합니다" }, "include_query_params": { - "label": "Include Query Parameters" + "label": "쿼리 매개변수 포함" }, "include_request_metadata": { - "label": "Include Request Metadata", - "notice": "Include request metadata (method, URL, client IP) in execution input" + "label": "요청 메타데이터 포함", + "notice": "실행 입력에 요청 메타데이터(메서드, URL, 클라이언트 IP)를 포함합니다" } - } + }, + "status-cancelled": "Cancelled", + "select-method": "방법 선택" } diff --git a/src/i18n/locales/ru/chat.json b/src/i18n/locales/ru/chat.json index 5c3957a03..348ab8b33 100644 --- a/src/i18n/locales/ru/chat.json +++ b/src/i18n/locales/ru/chat.json @@ -91,5 +91,7 @@ "input-attach-manage-connectors": "Управлять коннекторами", "input-attach-open-browser": "Открыть браузер", "input-attach-manage-browsers": "Управлять браузерами", - "input-attach-menu-trigger": "Добавить файлы или фото или открыть Навыки, Коннекторы или Браузер из меню" + "input-attach-menu-trigger": "Добавить файлы или фото или открыть Навыки, Коннекторы или Браузер из меню", + "hide-file-sidebar": "Скрыть боковую панель файлов", + "show-file-sidebar": "Показать боковую панель файлов" } diff --git a/src/i18n/locales/ru/dashboard.json b/src/i18n/locales/ru/dashboard.json index 9db40b54e..3a876e3f5 100644 --- a/src/i18n/locales/ru/dashboard.json +++ b/src/i18n/locales/ru/dashboard.json @@ -23,5 +23,7 @@ "document-agent": "Агент документов", "multi-modal-agent": "Мультимодальный агент", "social-media-agent": "Агент социальных сетей", - "no-projects-found": "Проекты не найдены" + "no-projects-found": "Проекты не найдены", + "no-projects-match-search": "По вашему запросу не найдено ни одного проекта", + "try-different-search": "Попробуйте другой поисковый запрос" } diff --git a/src/i18n/locales/ru/folder.json b/src/i18n/locales/ru/folder.json new file mode 100644 index 000000000..0850de87d --- /dev/null +++ b/src/i18n/locales/ru/folder.json @@ -0,0 +1,8 @@ +{ + "file-path-remote-root": "Remote", + "files-scope-all": "All files", + "files-scope-new": "New files", + "file-path-breadcrumb": "File path", + "download-file": "Скачать файл", + "zip-file-is-not-supported-yet": "Предварительный просмотр ZIP пока не поддерживается." +} diff --git a/src/i18n/locales/ru/index.ts b/src/i18n/locales/ru/index.ts index efa753446..4e23f35ac 100644 --- a/src/i18n/locales/ru/index.ts +++ b/src/i18n/locales/ru/index.ts @@ -15,6 +15,7 @@ import agents from './agents.json'; import chat from './chat.json'; import dashboard from './dashboard.json'; +import folder from './folder.json'; import layout from './layout.json'; import setting from './setting.json'; import triggers from './triggers.json'; @@ -24,6 +25,7 @@ export default { agents, layout, dashboard, + folder, workforce, chat, setting, diff --git a/src/i18n/locales/ru/layout.json b/src/i18n/locales/ru/layout.json index 0f67b841d..f2df9afea 100644 --- a/src/i18n/locales/ru/layout.json +++ b/src/i18n/locales/ru/layout.json @@ -1,31 +1,31 @@ { - "report-bug": "Report a bug", - "refer-friends": "Refer friends", + "report-bug": "Сообщить об ошибке", + "refer-friends": "Пригласить друзей", "retry": "Retry", - "please-enter-email-address": "Please enter email address", - "please-enter-a-valid-email-address": "Please enter a valid email address", - "please-enter-password": "Please enter password", - "password-must-be-at-least-8-characters": "Password must be at least 8 characters", - "sign-up-failed-please-try-again": "Sign up failed, please try again", - "sign-up-failed-please-check-your-email-and-password": "Sign up failed, please check your email and password", - "login-failed-please-try-again": "Login failed, please try again", - "login-failed-please-check-your-email-and-password": "Login failed, please check your email and password", + "please-enter-email-address": "Пожалуйста, введите адрес электронной почты", + "please-enter-a-valid-email-address": "Пожалуйста, введите действительный адрес электронной почты", + "please-enter-password": "Пожалуйста, введите пароль", + "password-must-be-at-least-8-characters": "Пароль должен содержать не менее 8 символов", + "sign-up-failed-please-try-again": "Регистрация не удалась, пожалуйста, попробуйте ещё раз", + "sign-up-failed-please-check-your-email-and-password": "Регистрация не удалась, пожалуйста, проверьте адрес электронной почты и пароль", + "login-failed-please-try-again": "Вход не удался, пожалуйста, попробуйте ещё раз", + "login-failed-please-check-your-email-and-password": "Вход не удался, пожалуйста, проверьте адрес электронной почты и пароль", "or": "Or", "sign-up": "Sign up", "login": "Login", - "general-error": "General error", + "general-error": "Общая ошибка", "email": "Email", - "enter-your-email": "Enter your email", + "enter-your-email": "Введите ваш адрес электронной почты", "password": "Password", - "enter-your-password": "Enter your password", - "invitation-code-optional": "Invitation Code (optional)", - "signing-up": "Signing up...", - "privacy-policy": "Privacy Policy", - "logging-in": "Logging in...", + "enter-your-password": "Введите ваш пароль", + "invitation-code-optional": "Код приглашения (необязательно)", + "signing-up": "Регистрация...", + "privacy-policy": "Политика конфиденциальности", + "logging-in": "Вход в систему...", "log-in": "Log in", - "enter-your-invite-code": "Enter your invite code", - "continue-with-google-sign-up": "Continue with Google", - "continue-with-github-sign-up": "Continue with Github", + "enter-your-invite-code": "Введите код приглашения", + "continue-with-google-sign-up": "Продолжить с Google", + "continue-with-github-sign-up": "Продолжить с Github", "continue-with-google-login": "Продолжить с Google", "continue-with-github-login": "Продолжить с Github", "installation-failed": "Установка не удалась", @@ -307,5 +307,65 @@ "cookie-count": "{{count}} Cookie", "add-new-mcp": "Добавить новый MCP", "browse-mcps": "Обзор MCP", - "browser-settings": "Настройки браузера" + "browser-settings": "Настройки браузера", + "report-bug-dialog-title": "Сообщить об ошибке", + "report-bug-footer-hint": "Мы сохраним ZIP-файл с журналами приложения, затем откроем ваше почтовое приложение. Прикрепите сохранённый ZIP к сообщению перед отправкой.", + "report-bug-field-description": "Что пошло не так?", + "report-bug-field-description-placeholder": "Опишите проблему…", + "report-bug-field-steps": "Шаги для воспроизведения (необязательно)", + "report-bug-field-steps-placeholder": "1. … 2. …", + "report-bug-meta": "Версия {{version}} · {{os}} ({{arch}})", + "report-bug-description-required": "Пожалуйста, опишите, что пошло не так.", + "report-bug-submit": "Сохранить диагностику и открыть почту", + "report-bug-diagnostics-saved": "Диагностика сохранена. Прикрепите ZIP в письме и отправьте его.", + "report-bug-mail-subject": "[Eigent] Сообщение об ошибке", + "report-bug-mail-body-intro": "Пожалуйста, прикрепите к этому сообщению ZIP-файл с диагностикой, который вы только что сохранили.", + "report-bug-mail-body-path": "ZIP сохранён в: {{path}}", + "report-bug-mail-body-meta": "Версия приложения: {{version}} | ОС: {{os}} ({{arch}})", + "report-bug-mail-body-desc": "Описание:", + "report-bug-mail-body-steps": "Шаги для воспроизведения:", + "report-bug-mail-body-truncated": "Текст письма был сокращён из-за ограничений длины. Полный текст см. в bug_report.txt внутри ZIP.", + "project-page-tab-project": "Project", + "project-page-tab-tasks": "Tasks", + "project-page-all-tasks": "All tasks", + "project-page-status-pending": "Pending", + "no-tasks": "No tasks", + "workspace-select-project": "Выберите проект", + "workspace-cowork-single-agent": "Работать вместе с одним агентом", + "workspace-cowork-workforce": "Работать вместе с командой", + "execution-context": "Контекст выполнения", + "no-results": "No results", + "notification-panel-dismiss": "Dismiss", + "instructions": "Инструкции", + "instructions-rules-tone": "Правила и тон", + "memory": "Memory", + "memory-on": "On", + "memory-off": "Off", + "workforce-setting": "Настройка команды", + "select": "Select", + "edit-instructions": "Редактировать инструкции", + "sessions-start-new": "Начать новую сессию", + "sessions-full-title": "Все сессии", + "sessions-create-task-hint": "Создайте задачу, чтобы начать сессию", + "workforce-progress": "Progress", + "workforce-agent-folder": "Папка агента", + "workforce-agent-pool": "Agent Pool", + "expand-project-sidebar": "Развернуть боковую панель", + "fold-project-sidebar": "Свернуть боковую панель", + "update": "Update", + "workspace-start-from-scratch": "Начать с нуля", + "workspace-project-submenu": "Project", + "workspace-recent-session-now": "Now", + "workspace-recent-session-minutes": "{{count}} мин", + "workspace-recent-session-hours": "{{count}}h", + "workspace-recent-session-days": "{{count}}d", + "workspace-recent-sessions-heading": "Recent", + "workspace-session-mode-label": "Режим сессии", + "workspace-session-mode-cycle-hint": "Нажмите, чтобы переключить режим сессии", + "failed-to-start-task": "Не удалось начать задачу. Проверьте конфигурацию модели.", + "workspace-work-with-panel-hide": "Скрыть панель Work with", + "workspace-work-with-panel-show": "Показать панель Work with", + "workspace-work-with-dismiss-overlay": "Dismiss", + "workspace-work-with-title": "Work with", + "workspace-work-with-remote-control": "Удалённое управление" } diff --git a/src/i18n/locales/ru/setting.json b/src/i18n/locales/ru/setting.json index c188f9da7..b9661f277 100644 --- a/src/i18n/locales/ru/setting.json +++ b/src/i18n/locales/ru/setting.json @@ -17,83 +17,6 @@ "eigent-cloud": "Eigent Cloud", "default": "По умолчанию", "profile": "Профиль", - "account": "Аккаунт", - "you-are-currently-signed-in-with": "Вы вошли с аккаунтом {{email}}", - "manage": "Управление", - "log-out": "Выйти", - "language": "Язык", - "select-language": "Выберите язык", - "system-default": "По умолчанию в системе", - "appearance": "Внешний вид", - "dark": "Тёмный", - "light": "Светлый", - "transparent": "Прозрачный", - - "workspace-main-background": "Фон рабочей области", - "workspace-main-background-description": "Только для основных панелей Workforce и Session.", - "workspace-main-background-empty": "Пусто", - "workspace-main-background-dots": "Точки", - "workspace-main-background-blocks": "Сетка", - "workspace-main-background-ruled": "Линейка", - "workspace-main-background-dotted": "Пунктирные линии", - "workspace-main-background-dashed": "Штриховые линии", - - "appearance-tab": "Оформление", - "color-mode": "Цветовой режим", - "accent-palette": "Акцентная палитра", - "accent-palette-description": "Предустановленные цветовые темы интерфейса. Сохраняются отдельно для светлого и тёмного режима.", - "accent-for-light": "Светлый режим", - "accent-for-dark": "Тёмный режим", - - "data-privacy": "Конфиденциальность данных", - "data-privacy-description": "Eigent построен по принципу \"сначала локально\", чтобы обеспечить вашу конфиденциальность. Ваши данные по умолчанию остаются на вашем устройстве. Облачные функции являются необязательными и используют только минимальные необходимые данные для функционирования. Полные сведения см. в нашей", - "privacy-policy": "Политике конфиденциальности", - "how-we-handle-your-data": "Как мы обрабатываем ваши данные", - "we-only-use-the-essential-data-needed-to-run-your-tasks": "Мы используем только необходимые данные для выполнения ваших задач", - "how-we-handle-your-data-line-1": "Мы используем только необходимые данные для выполнения ваших задач", - "how-we-handle-your-data-line-1-line-1": "Eigent может делать снимки экрана для анализа элементов пользовательского интерфейса, чтения текста и определения следующего действия, точно так же, как это сделали бы вы.", - "how-we-handle-your-data-line-1-line-2": "Eigent может использовать вашу мышь и клавиатуру для доступа к локальному программному обеспечению и файлам, которые вы указываете.", - "how-we-handle-your-data-line-1-line-3": "Только минимальные данные задачи отправляются поставщикам моделей ИИ или сторонним интеграциям, которые вы включаете; мы не храним данные.", - "how-we-handle-your-data-line-2": "Файлы задач, результаты и снимки экрана остаются в вашей целевой папке задач локально.", - "how-we-handle-your-data-line-3": "Учетные данные хранятся локально, зашифрованы и используются только для одобренных шагов.", - "how-we-handle-your-data-line-4": "Ваши данные никогда не используются для обучения наших моделей ИИ без вашего явного согласия.", - "how-we-handle-your-data-line-5": "Мы не продаем ваши данные третьим лицам.", - "api-key-can-not-be-empty": "API-ключ не может быть пустым!", - "api-host-can-not-be-empty": "API-хост не может быть пустым!", - "model-type-can-not-be-empty": "Тип модели не может быть пустым!", - "validate-success": "Проверка прошла успешно", - "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "Модель была проверена на поддержку вызовов функций, что требуется для использования Eigent.", - "validate-failed": "Проверка не удалась", - "copy": "Копировать", - "copied-to-clipboard": "Скопировано в буфер обмена", - "failed-to-copy-to-clipboard": "Не удалось скопировать в буфер обмена", - "endpoint-url-can-not-be-empty": "URL конечной точки не может быть пустым!", - "verification-failed-please-check-endpoint-url": "Проверка не удалась, проверьте URL конечной точки", - "eigent-cloud-version": "Eigent Cloud Версия", - "you-are-currently-subscribed-to-the": "В настоящее время вы подписаны на", - "discover-more-about-our": "Узнайте больше о наших", - "pricing-options": "вариантах ценообразования", - "credits": "Кредиты", - "select-model-type": "Выберите тип модели", - "custom-model": "Пользовательская модель", - "use-your-own-api-keys-or-set-up-a-local-model": "Используйте свои собственные API-ключи или настройте локальную модель.", - "verify": "Проверить", - "local-model": "Локальная модель", - "model-platform": "Платформа модели", - "model-endpoint-url": "URL конечной точки модели", - "model-type": "Тип модели", - "enter-your-local-model-type": "Введите тип вашей локальной модели", - "you-are-on-selft-host-mode": "Вы находитесь в режиме самостоятельного хостинга", - "you-are-using-self-hosted-mode": "Вы используете режим самостоятельного хостинга. Для достижения наилучшей производительности этого продукта введите ключ поиска Google в разделе \"MCP и Инструменты\", чтобы Eigent работал должным образом.", - "the-google-search-key-is-essential-for-delivering-accurate-search-results": "Ключ поиска Google необходим для предоставления точных результатов поиска. Ключ Exa Search является необязательным, но настоятельно рекомендуется для лучшей производительности.", - "close": "Закрыть", - "enter-your-api-key": "Введите ваш API", - "key": "ключ", - "enter-your-api-host": "Введите ваш API-хост", - "url": "URL", - "enter-your-model-type": "Введите ваш тип модели", - "verifying": "Проверка...", - "account": "Аккаунт", "you-are-currently-signed-in-with": "Вы вошли с аккаунтом {{email}}", "manage": "Управление", @@ -105,7 +28,6 @@ "dark": "Тёмный", "light": "Светлый", "transparent": "Прозрачный", - "workspace-main-background": "Фон рабочей области", "workspace-main-background-description": "Только для основных панелей Workforce и Session.", "workspace-main-background-empty": "Пусто", @@ -114,14 +36,12 @@ "workspace-main-background-ruled": "Линейка", "workspace-main-background-dotted": "Пунктирные линии", "workspace-main-background-dashed": "Штриховые линии", - "appearance-tab": "Оформление", "color-mode": "Цветовой режим", "accent-palette": "Акцентная палитра", "accent-palette-description": "Предустановленные цветовые темы интерфейса. Сохраняются отдельно для светлого и тёмного режима.", "accent-for-light": "Светлый режим", "accent-for-dark": "Тёмный режим", - "data-privacy": "Конфиденциальность данных", "data-privacy-description": "Eigent построен по принципу \"сначала локально\", чтобы обеспечить вашу конфиденциальность. Ваши данные по умолчанию остаются на вашем устройстве. Облачные функции являются необязательными и используют только минимальные необходимые данные для функционирования. Полные сведения см. в нашей", "privacy-policy": "Политике конфиденциальности", @@ -143,6 +63,7 @@ "validate-failed": "Проверка не удалась", "copy": "Копировать", "copied-to-clipboard": "Скопировано в буфер обмена", + "failed-to-copy-to-clipboard": "Не удалось скопировать в буфер обмена", "endpoint-url-can-not-be-empty": "URL конечной точки не может быть пустым!", "verification-failed-please-check-endpoint-url": "Проверка не удалась, проверьте URL конечной точки", "eigent-cloud-version": "Eigent Cloud Версия", @@ -169,7 +90,6 @@ "url": "URL", "enter-your-model-type": "Введите ваш тип модели", "verifying": "Проверка...", - "mcp-and-tools": "MCP и Инструменты", "add-mcp-server": "Добавить MCP-сервер", "market": "Рынок", @@ -252,7 +172,6 @@ "reset-success": "Сброс выполнен успешно!", "reset-failed": "Сбой сброса!", "select-default-model": "Выбрать модель по умолчанию", - "browser-login": "Вход через браузер", "browser-login-description": "Откройте Chrome, чтобы войти в аккаунты. Данные входа сохраняются локально в защищённом профиле.", "open-browser-login": "Открыть браузер для входа", @@ -277,7 +196,6 @@ "confirm-delete-all-cookies": "Удалить все cookie? Это действие нельзя отменить.", "all-cookies-deleted": "Все cookie успешно удалены.", "cookie-delete-warning": "Примечание: удаление cookie выйдет из связанных сайтов. Может потребоваться перезапуск браузера.", - "network-proxy": "Сетевой прокси", "network-proxy-description": "Настройте прокси-сервер для сетевых запросов. Это полезно, если вам нужен доступ к внешним API через прокси.", "proxy-placeholder": "http://127.0.0.1:7890", @@ -285,7 +203,6 @@ "proxy-save-failed": "Не удалось сохранить конфигурацию прокси.", "proxy-invalid-url": "Недопустимый URL прокси. Должен начинаться с http://, https://, socks4:// или socks5://.", "proxy-restart-hint": "Для применения изменений прокси требуется перезапуск.", - "cloud-not-available-in-local-proxy": "Облачная версия недоступна в режиме локального прокси", "set-as-default": "Сделать по умолчанию", "api-key-setting": "Настройка API-ключа", @@ -293,11 +210,9 @@ "model-type-setting": "Настройка типа модели", "please-select": "Пожалуйста, выберите", "configuring": "Конфигурирование...", - "models-default-setting-title": "Настройка по умолчанию", "models-default-setting-description": "Выберите одну из настроенных моделей как модель по умолчанию для Eigent. Она будет применяться глобально во всём рабочем пространстве.", "models-configuration": "Конфигурация", - "gemini-3-pro-preview-name": "Gemini 3 Pro Preview", "gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview", "gemini-3-flash-preview-name": "Gemini 3 Flash Preview", @@ -311,11 +226,15 @@ "claude-opus-4-7-name": "Claude Opus 4.7", "deepseek-v4-pro-name": "DeepSeek V4 Pro", "minimax-m2-7-name": "Minimax M2.7", - "preferred-ide": "Предпочитаемая IDE", "preferred-ide-description": "Выберите приложение для открытия папок проектов агента.", "system-file-manager": "Системный файловый менеджер", "agents": "Агенты", "help-improve-eigent": "Помогите улучшить Eigent", - "help-improve-eigent-description": "Разрешите Eigent собирать анонимные журналы ошибок и данные об использовании для улучшения сервиса. Это необязательно и может быть изменено в любое время." + "help-improve-eigent-description": "Разрешите Eigent собирать анонимные журналы ошибок и данные об использовании для улучшения сервиса. Это необязательно и может быть изменено в любое время.", + "please-complete-authorization-in-browser": "Пожалуйста, завершите авторизацию в вашем браузере", + "authorization-cancelled": "Авторизация отменена", + "authorization-failed": "Не удалось выполнить авторизацию", + "this-service-is-already-enabled-by-default": "Эта служба уже включена по умолчанию", + "version": "Version" } diff --git a/src/i18n/locales/ru/triggers.json b/src/i18n/locales/ru/triggers.json index c5f1592e2..480ef64c4 100644 --- a/src/i18n/locales/ru/triggers.json +++ b/src/i18n/locales/ru/triggers.json @@ -2,19 +2,19 @@ "name": "Name", "description": "Description", "trigger-type": "Type", - "create-new": "Create New Trigger", - "trigger-details": "Trigger Details", - "no-trigger-selected": "No Trigger Selected", - "select-trigger-hint": "Click on a trigger from the list to view its details", - "no-triggers": "No triggers yet", - "name-placeholder": "Enter trigger name", - "description-placeholder": "Enter trigger description", + "create-new": "Создать новый триггер", + "trigger-details": "Подробности триггера", + "no-trigger-selected": "Триггер не выбран", + "select-trigger-hint": "Нажмите на триггер в списке, чтобы посмотреть его подробности", + "no-triggers": "Пока нет триггеров", + "name-placeholder": "Введите название триггера", + "description-placeholder": "Введите описание триггера", "schedule-trigger": "Schedule", "webhook-trigger": "Webhook", "slack-trigger": "Slack", "app-trigger": "App Trigger", - "cron-expression": "Cron Expression", - "cron-help": "Format: minute hour day month weekday (e.g., 0 */1 * * * = every hour)", + "cron-expression": "Cron-выражение", + "cron-help": "Формат: минута час день месяц день_недели (например, 0 */1 * * * = каждый час)", "cron-empty": "Выражение cron не может быть пустым", "cron-invalid-format": "Неверный формат cron. Ожидается: минута час день месяц день недели (например, 0 */1 * * *)", "cron-invalid-minute": "Неверное значение минуты. Должно быть 0-59 или допустимое выражение cron", @@ -22,23 +22,23 @@ "cron-invalid-day": "Неверное значение дня. Должно быть 1-31 или допустимое выражение cron", "cron-invalid-month": "Неверное значение месяца. Должно быть 1-12 или допустимое выражение cron", "cron-invalid-weekday": "Неверное значение дня недели. Должно быть 0-6 (0=Воскресенье) или допустимое выражение cron", - "listener-type": "Listener Type", - "select-listener": "Select listener type", + "listener-type": "Тип слушателя", + "select-listener": "Выберите тип слушателя", "chat-agent": "Chat Agent", "workforce": "Workforce", "agent-model": "Agent Model", "task-prompt": "Task Prompt", - "task-prompt-placeholder": "Enter the task prompt for this trigger", - "max-per-hour": "Max Per Hour", + "task-prompt-placeholder": "Введите запрос задачи для этого триггера", + "max-per-hour": "Максимум в час", "max-per-day": "Max Per Day", - "single-execution": "Single Execution", + "single-execution": "Однократное выполнение", "webhook-url": "Webhook URL", "executions": "Executions", "errors": "Errors", "view-runs": "View Runs", "activate": "Activate", "deactivate": "Deactivate", - "execution-id": "Execution ID", + "execution-id": "ID выполнения", "started": "Started", "duration": "Duration", "tokens": "Tokens", @@ -46,29 +46,29 @@ "failed": "Failed", "running": "Running", "pending": "Pending", - "no-executions": "No executions found", - "executions-for": "Executions for", - "name-required": "Trigger name is required", - "created-successfully": "Trigger created successfully", - "failed-to-create": "Failed to create trigger", - "failed-to-load": "Failed to load triggers", - "activated": "Trigger activated", - "deactivated": "Trigger deactivated", - "failed-to-toggle": "Failed to toggle trigger status", - "webhook-created-title": "Webhook Created Successfully", - "webhook-created-subtitle": "Your new webhook trigger is ready to receive requests", - "webhook-ready": "Webhook Ready!", - "webhook-instructions": "Use the URL below to trigger this agent. Send a request with any JSON body.", - "your-webhook-url": "Your Webhook URL", - "webhook-tip-title": "Did you know?", - "webhook-tip-description": "You can include custom data in your JSON payload and reference it in your task prompt using {{variable_name}}.", - "webhook-url-copied": "Webhook URL copied to clipboard", - "confirm-delete": "Are you sure you want to delete this trigger?", - "deleted": "Trigger deleted", - "failed-to-delete": "Failed to delete trigger", - "webhook-copied": "Webhook URL copied to clipboard", - "failed-to-copy": "Failed to copy webhook URL", - "trigger-task": "Trigger Task", + "no-executions": "Выполнения не найдены", + "executions-for": "Выполнения для", + "name-required": "Название триггера обязательно", + "created-successfully": "Триггер успешно создан", + "failed-to-create": "Не удалось создать триггер", + "failed-to-load": "Не удалось загрузить триггеры", + "activated": "Триггер активирован", + "deactivated": "Триггер деактивирован", + "failed-to-toggle": "Не удалось изменить статус триггера", + "webhook-created-title": "Вебхук успешно создан", + "webhook-created-subtitle": "Ваш новый триггер вебхука готов принимать запросы", + "webhook-ready": "Вебхук готов!", + "webhook-instructions": "Используйте URL ниже, чтобы запустить этого агента. Отправьте запрос с любым JSON-телом.", + "your-webhook-url": "Ваш URL вебхука", + "webhook-tip-title": "Знаете ли вы?", + "webhook-tip-description": "Вы можете включить пользовательские данные в свой JSON-пейлоад и использовать их в запросе задачи с помощью {{variable_name}}.", + "webhook-url-copied": "URL вебхука скопирован в буфер обмена", + "confirm-delete": "Вы уверены, что хотите удалить этот триггер?", + "deleted": "Триггер удалён", + "failed-to-delete": "Не удалось удалить триггер", + "webhook-copied": "URL вебхука скопирован в буфер обмена", + "failed-to-copy": "Не удалось скопировать URL вебхука", + "trigger-task": "Запустить задачу", "task-mode-text": "Text", "task-mode-json": "JSON", "schedule-frequency": "Frequency", @@ -81,44 +81,44 @@ "weekday-thursday": "Thursday", "weekday-friday": "Friday", "weekday-saturday": "Saturday", - "webhook-function": "Webhook Function", + "webhook-function": "Функция вебхука", "frequency-hourly": "Every Hour", "frequency-daily": "Daily", "frequency-weekly": "Weekly", "frequency-monthly": "Monthly", "frequency-one-time": "One Time", "frequency-custom": "Custom", - "invalid-time-format": "Invalid time format. Use HH:MM (e.g., 09:30)", - "schedule-day-of-month-note": "If the selected day doesn’t exist in that month (e.g., the 31st), the task will be skipped.", + "invalid-time-format": "Неверный формат времени. Используйте HH:MM (например, 09:30)", + "schedule-day-of-month-note": "Если выбранного дня нет в этом месяце (например, 31-го), задача будет пропущена.", "schedule-hour": "Час", "schedule-minute": "Минута", "schedule-date": "Date", "select-date": "Select date", - "schedule-day-of-month": "Day of Month", + "schedule-day-of-month": "День месяца", "select-day": "Select day", "day-of-month": "Day {{day}}", - "schedule-weekdays": "Days of Week", - "expiration-date": "Expiration Date", - "no-expiration": "No expiration", - "select-expiration": "Select expiration date", - "no-upcoming-one-time": "Select a future date and time", - "no-upcoming-executions": "No upcoming executions", - "date-required": "Date is required", - "weekday-required": "At least one weekday is required", - "schedule-required-fields": "Please fill in all required fields for the schedule", - "create-trigger-agent": "Automate task with trigger", - "trigger-overview": "Trigger Overview", + "schedule-weekdays": "Дни недели", + "expiration-date": "Дата окончания", + "no-expiration": "Без срока действия", + "select-expiration": "Выберите дату окончания", + "no-upcoming-one-time": "Выберите будущую дату и время", + "no-upcoming-executions": "Нет предстоящих запусков", + "date-required": "Требуется дата", + "weekday-required": "Требуется выбрать хотя бы один день недели", + "schedule-required-fields": "Пожалуйста, заполните все обязательные поля расписания", + "create-trigger-agent": "Автоматизируйте задачу с помощью триггера", + "trigger-overview": "Обзор триггера", "edit": "Edit", "delete": "Delete", "period": "Period", "created-at": "Created At", - "execution-history": "Execution History", + "execution-history": "История выполнений", "run-time": "Run Time", "success": "Success", - "output-tasks": "Output Tasks", + "output-tasks": "Выходные задачи", "logs": "Logs", "close": "Close", - "confirm-delete-trigger": "Are you sure you want to delete this trigger?", + "confirm-delete-trigger": "Вы уверены, что хотите удалить этот триггер?", "status": { "active": "Active", "inactive": "Inactive", @@ -126,66 +126,66 @@ "completed": "Completed", "unknown": "Unknown" }, - "webhook-url-after-creation": "You can find your webhook URL in the trigger details after creation.", - "webhook-method": "Request Method", - "created-time": "Created Time", - "last-execution-label": "Last Execution", + "webhook-url-after-creation": "URL вашего вебхука можно найти в деталях триггера после создания.", + "webhook-method": "Метод запроса", + "created-time": "Время создания", + "last-execution-label": "Последнее выполнение", "token-cost": "Token Cost", - "updated-successfully": "Trigger updated successfully", + "updated-successfully": "Триггер успешно обновлён", "title": "Triggers", - "create-hint": "Create a trigger to automate your tasks", - "live-activity": "Live Activity", - "no-activity": "No activity yet", - "activity-hint": "Activity will appear here", - "execution-logs": "Execution Logs", + "create-hint": "Создайте триггер, чтобы автоматизировать ваши задачи", + "live-activity": "Текущая активность", + "no-activity": "Пока нет активности", + "activity-hint": "Здесь будет отображаться активность", + "execution-logs": "Журнал выполнений", "fold-execution-logs": "Свернуть журналы выполнения", "open-execution-logs": "Развернуть журналы выполнения", - "delete-trigger": "Delete Trigger", + "delete-trigger": "Удалить триггер", "cancel": "Cancel", "deleting": "Deleting...", - "duplicated-successfully": "Trigger duplicated as \"{{name}}\"", - "confirm-delete-message": "Are you sure you want to delete \"{{name}}\"? This action cannot be undone.", + "duplicated-successfully": "Триггер продублирован как \"{{name}}\"", + "confirm-delete-message": "Вы уверены, что хотите удалить \"{{name}}\"? Это действие нельзя отменить.", "workspace": "Workspace", - "agent-folder": "Agent Folder", + "agent-folder": "Папка агента", "add": "Add", "upload": "Upload", "create": "Create", "loading": "Loading...", - "loading-executions": "Loading execution data...", - "failed-to-load-executions": "Failed to load execution data", - "no-execution-data": "No execution data available", + "loading-executions": "Загрузка данных о выполнениях...", + "failed-to-load-executions": "Не удалось загрузить данные о выполнениях", + "no-execution-data": "Данные о выполнениях отсутствуют", "total-runs": "Total Runs", - "success-rate": "Success Rate", - "no-executions-yet": "No executions yet", + "success-rate": "Процент успешных выполнений", + "no-executions-yet": "Выполнений пока нет", "last-run-label": "Last run", - "execution-completed-success": "Execution completed successfully", - "execution-failed-message": "Execution failed", - "execution-in-progress": "Execution in progress...", - "waiting-to-execute": "Waiting to execute...", - "execution-cancelled": "Execution was cancelled", - "execution-missed": "Execution was missed", - "unknown-status": "Unknown status", + "execution-completed-success": "Выполнение успешно завершено", + "execution-failed-message": "Выполнение завершилось с ошибкой", + "execution-in-progress": "Выполнение в процессе...", + "waiting-to-execute": "Ожидание выполнения...", + "execution-cancelled": "Выполнение было отменено", + "execution-missed": "Выполнение было пропущено", + "unknown-status": "Неизвестный статус", "trigger-label": "Trigger", "status-created": "Created", "status-updated": "Updated", "status-activated": "Activated", "status-deleted": "Deleted", "status-deactivated": "Deactivated", - "status-execution-started": "Execution started", - "status-execution-completed": "Execution completed", + "status-execution-started": "Выполнение начато", + "status-execution-completed": "Выполнение завершено", "status-error": "Error", - "status-webhook-triggered": "Webhook triggered", + "status-webhook-triggered": "Webhook вызван", "status-activity": "Activity", - "upcoming-executions": "Upcoming Executions", + "upcoming-executions": "Предстоящие выполнения", "preview-scheduled-times": "Предварительный Просмотр Расписания", - "task-prompt-required": "Task prompt is required", - "project-id-required": "Project ID is required", - "execution-settings": "Execution Settings", - "extra-settings": "Extra Settings", + "task-prompt-required": "Требуется описание задачи", + "project-id-required": "Требуется ID проекта", + "execution-settings": "Настройки выполнения", + "extra-settings": "Дополнительные настройки", "max-per-hour-placeholder": "0", "max-per-day-placeholder": "0", "copy": "Copy", - "edit-trigger-agent": "Edit Trigger Agent", + "edit-trigger-agent": "Редактировать агента-триггер", "updating": "Updating...", "creating": "Creating...", "update": "Update", @@ -195,102 +195,102 @@ "activation-limit-reached": "Достигнут лимит активации: максимум 5 активных триггеров на проект, 25 на пользователя", "never": "Never", "duplicate": "Duplicate", - "no-task-prompt": "No task prompt", + "no-task-prompt": "Описание задачи отсутствует", "select-app": "Выбрать приложение", "change-app": "Change", "dynamic": { "credentials": "Credentials", - "credentials-notice": "Your credentials are stored securely and used to authenticate with the service.", - "credentials-saved": "Credentials configured successfully", - "configuration": "Configuration", - "behavior-settings": "Behavior Settings", - "enter-value": "Please enter a value", + "credentials-notice": "Ваши учетные данные надежно хранятся и используются для аутентификации в сервисе.", + "credentials-saved": "Учетные данные успешно настроены", + "configuration": "Конфигурация", + "behavior-settings": "Настройки поведения", + "enter-value": "Пожалуйста, введите значение", "add": "Add", "update": "Update", - "config-saved": "Configuration saved successfully", - "config-updated": "Configuration updated successfully", - "config-save-error": "Failed to save configuration", + "config-saved": "Конфигурация успешно сохранена", + "config-updated": "Конфигурация успешно обновлена", + "config-save-error": "Не удалось сохранить конфигурацию", "loading": "Loading...", - "loading-config": "Loading configuration...", - "no-config-available": "No configuration available for this trigger type", - "failed-to-load-schema": "Failed to load configuration schema", - "select-options": "Select options...", + "loading-config": "Загрузка конфигурации...", + "no-config-available": "Для этого типа триггера конфигурация недоступна", + "failed-to-load-schema": "Не удалось загрузить схему конфигурации", + "select-options": "Выберите параметры...", "selected": "selected", - "save-credentials-first": "Save credentials first", + "save-credentials-first": "Сначала сохраните учетные данные", "search": "Search...", - "no-options": "No options found", + "no-options": "Варианты не найдены", "validation": { - "required": "{{field}} is required", - "invalid-regex": "Invalid regular expression pattern", - "invalid-email": "Invalid email address", - "invalid-url": "Invalid URL format", - "min-length": "Must be at least {{min}} characters", - "max-length": "Must be no more than {{max}} characters", - "pattern-mismatch": "Value does not match required pattern", - "min-value": "Must be at least {{min}}", - "max-value": "Must be no more than {{max}}" + "required": "{{field}} — обязательное поле", + "invalid-regex": "Недопустимый шаблон регулярного выражения", + "invalid-email": "Недопустимый адрес электронной почты", + "invalid-url": "Недопустимый формат URL", + "min-length": "Должно быть не менее {{min}} символов", + "max-length": "Должно быть не более {{max}} символов", + "pattern-mismatch": "Значение не соответствует требуемому шаблону", + "min-value": "Должно быть не менее {{min}}", + "max-value": "Должно быть не более {{max}}" }, - "validation-failed": "Please fix validation errors: {{errors}}" + "validation-failed": "Пожалуйста, исправьте ошибки валидации: {{errors}}" }, "slack": { - "credentials-saved": "Slack credentials configured successfully", - "enter-bot-token": "Please enter a bot token", - "bot-token-saved": "Bot token saved successfully", - "bot-token-updated": "Bot token updated successfully", - "bot-token-save-error": "Failed to save bot token", - "signing-secret-saved": "Signing secret saved successfully", - "signing-secret-updated": "Signing secret updated successfully", - "signing-secret-save-error": "Failed to save signing secret", + "credentials-saved": "Учетные данные Slack успешно настроены", + "enter-bot-token": "Пожалуйста, введите токен бота", + "bot-token-saved": "Токен бота успешно сохранен", + "bot-token-updated": "Токен бота успешно обновлен", + "bot-token-save-error": "Не удалось сохранить токен бота", + "signing-secret-saved": "Подписывающий секрет успешно сохранен", + "signing-secret-updated": "Подписывающий секрет успешно обновлен", + "signing-secret-save-error": "Не удалось сохранить подписывающий секрет", "add": "Add", "update": "Update", - "event-configuration": "Event Configuration", + "event-configuration": "Настройка событий", "event-types": "Event Types", - "select-events": "Select events to trigger on...", - "search-events": "Search events...", - "no-events-found": "No events found", - "events-selected": "events selected", - "channel-filter": "Channel Filter", - "select-channels": "All channels (no filter)", - "search-channels": "Search channels...", - "no-channels-found": "No channels found", - "channels-selected": "channels selected", - "save-credentials-first": "Save credentials first to load channels", - "loading-channels": "Loading channels...", - "channels-fetch-error": "Failed to fetch channels. Please check your credentials.", - "behavior-settings": "Behavior Settings", + "select-events": "Выберите события, при срабатывании которых выполнять действие...", + "search-events": "Поиск событий...", + "no-events-found": "События не найдены", + "events-selected": "событий выбрано", + "channel-filter": "Фильтр каналов", + "select-channels": "Все каналы (без фильтра)", + "search-channels": "Поиск каналов...", + "no-channels-found": "Каналы не найдены", + "channels-selected": "каналов выбрано", + "save-credentials-first": "Сначала сохраните учетные данные, чтобы загрузить каналы", + "loading-channels": "Загрузка каналов...", + "channels-fetch-error": "Не удалось получить каналы. Пожалуйста, проверьте свои учетные данные.", + "behavior-settings": "Настройки поведения", "authentication_required": { - "label": "Require Authentication", - "notice": "Slack triggers require authentication to verify webhook signatures (Slack Signing Secret required). Verify webhook endpoint at https://api.slack.com/apps to activate trigger." + "label": "Требовать аутентификацию", + "notice": "Триггеры Slack требуют аутентификации для проверки подписей webhook (необходим Slack Signing Secret). Чтобы активировать триггер, проверьте endpoint webhook на https://api.slack.com/apps." }, "bot_token": { - "label": "Slack Bot Token", + "label": "Токен Slack Bot", "placeholder": "xoxb-...", - "notice": "Your Slack Bot User OAuth Token (starts with xoxb-)" + "notice": "Ваш OAuth-токен пользователя бота Slack (начинается с xoxb-)" }, "signing_secret": { "label": "Slack Signing Secret", - "placeholder": "Enter your Slack signing secret...", - "notice": "Your Slack app's signing secret used to verify requests" + "placeholder": "Введите ваш Slack signing secret...", + "notice": "Signing secret вашего приложения Slack, используемый для проверки запросов" }, "events": { "label": "Event Types", - "notice": "Select which Slack events should trigger this workflow" + "notice": "Выберите, какие события Slack должны запускать этот workflow" }, "channel_id": { "label": "Channel ID", - "placeholder": "Select a channel...", - "notice": "Specific channel to watch (leave empty to watch all channels)" + "placeholder": "Выберите канал...", + "notice": "Конкретный канал для наблюдения (оставьте пустым, чтобы отслеживать все каналы)" }, "ignore_bot_messages": { - "label": "Ignore Bot Messages" + "label": "Игнорировать сообщения ботов" }, "ignore_users": { - "label": "Ignore Users", - "placeholder": "Enter Slack user IDs (e.g., U1234567890)...", - "notice": "Slack user IDs to ignore messages from" + "label": "Игнорировать пользователей", + "placeholder": "Введите ID пользователей Slack (например, U1234567890)...", + "notice": "ID пользователей Slack, сообщения от которых нужно игнорировать" } }, - "verification-required": "Pending Verification. A valid event message is required for Trigger Activation or disable trigger Authentication.", + "verification-required": "Ожидает проверки. Для активации триггера требуется действительное событие или отключите аутентификацию триггера.", "base": { "authentication_required": { "label": "Требуется аутентификация", @@ -309,34 +309,36 @@ }, "webhook": { "authentication_required": { - "label": "Require Authentication", - "notice": "Whether authentication is required for this webhook trigger" + "label": "Требовать аутентификацию", + "notice": "Требуется ли аутентификация для этого webhook-триггера" }, "body_contains": { - "label": "Body Contains", - "placeholder": "Enter text that must be in request body...", - "notice": "Only trigger if the request body contains this string" + "label": "Содержимое тела", + "placeholder": "Введите текст, который должен быть в теле запроса...", + "notice": "Запускать только если тело запроса содержит эту строку" }, "required_headers": { - "label": "Required Headers", - "placeholder": "Enter header names (e.g., Content-Type, Authorization)...", - "notice": "List of HTTP headers that must be present in the request" + "label": "Обязательные заголовки", + "placeholder": "Введите имена заголовков (например, Content-Type, Authorization)...", + "notice": "Список HTTP-заголовков, которые должны присутствовать в запросе" }, "header_match": { - "label": "Header Match (Regex)", + "label": "Совпадение заголовка (Regex)", "placeholder": "Header-Name: regex pattern", - "notice": "Match request headers against a regex pattern (format: Header-Name: pattern)" + "notice": "Сопоставлять заголовки запроса с шаблоном regex (формат: Header-Name: pattern)" }, "include_headers": { - "label": "Include Headers", - "notice": "Include request headers in the workflow execution input" + "label": "Включать заголовки", + "notice": "Включать заголовки запроса во входные данные выполнения workflow" }, "include_query_params": { - "label": "Include Query Parameters" + "label": "Включать параметры запроса" }, "include_request_metadata": { - "label": "Include Request Metadata", - "notice": "Include request metadata (method, URL, client IP) in execution input" + "label": "Включать метаданные запроса", + "notice": "Включать метаданные запроса (метод, URL, IP клиента) во входные данные выполнения" } - } + }, + "status-cancelled": "Cancelled", + "select-method": "Выберите метод" } diff --git a/src/i18n/locales/zh-Hans/chat.json b/src/i18n/locales/zh-Hans/chat.json index e098217bc..4832c4d41 100644 --- a/src/i18n/locales/zh-Hans/chat.json +++ b/src/i18n/locales/zh-Hans/chat.json @@ -91,5 +91,7 @@ "input-attach-manage-connectors": "管理连接器", "input-attach-open-browser": "打开浏览器", "input-attach-manage-browsers": "管理浏览器", - "input-attach-menu-trigger": "添加文件、照片,或通过菜单打开技能、连接器、浏览器" + "input-attach-menu-trigger": "添加文件、照片,或通过菜单打开技能、连接器、浏览器", + "hide-file-sidebar": "隐藏文件侧边栏", + "show-file-sidebar": "显示文件侧边栏" } diff --git a/src/i18n/locales/zh-Hans/dashboard.json b/src/i18n/locales/zh-Hans/dashboard.json index 25124c09f..160db8112 100644 --- a/src/i18n/locales/zh-Hans/dashboard.json +++ b/src/i18n/locales/zh-Hans/dashboard.json @@ -23,5 +23,7 @@ "document-agent": "文档智能体", "multi-modal-agent": "多模态智能体", "social-media-agent": "社交媒体智能体", - "no-projects-found": "没有找到项目" + "no-projects-found": "没有找到项目", + "no-projects-match-search": "没有项目匹配您的搜索", + "try-different-search": "尝试其他搜索" } diff --git a/src/i18n/locales/zh-Hans/folder.json b/src/i18n/locales/zh-Hans/folder.json new file mode 100644 index 000000000..925d063dc --- /dev/null +++ b/src/i18n/locales/zh-Hans/folder.json @@ -0,0 +1,8 @@ +{ + "file-path-remote-root": "Remote", + "files-scope-all": "All files", + "files-scope-new": "New files", + "file-path-breadcrumb": "File path", + "download-file": "下载文件", + "zip-file-is-not-supported-yet": "尚不支持 ZIP 预览。" +} diff --git a/src/i18n/locales/zh-Hans/index.ts b/src/i18n/locales/zh-Hans/index.ts index efa753446..4e23f35ac 100644 --- a/src/i18n/locales/zh-Hans/index.ts +++ b/src/i18n/locales/zh-Hans/index.ts @@ -15,6 +15,7 @@ import agents from './agents.json'; import chat from './chat.json'; import dashboard from './dashboard.json'; +import folder from './folder.json'; import layout from './layout.json'; import setting from './setting.json'; import triggers from './triggers.json'; @@ -24,6 +25,7 @@ export default { agents, layout, dashboard, + folder, workforce, chat, setting, diff --git a/src/i18n/locales/zh-Hans/layout.json b/src/i18n/locales/zh-Hans/layout.json index b4ce76f47..961b38edd 100644 --- a/src/i18n/locales/zh-Hans/layout.json +++ b/src/i18n/locales/zh-Hans/layout.json @@ -324,5 +324,48 @@ "cookie-count": "{{count}} 个 Cookie", "add-new-mcp": "添加新 MCP", "browse-mcps": "浏览 MCP", - "browser-settings": "浏览器设置" + "browser-settings": "浏览器设置", + "project-page-tab-project": "Project", + "project-page-tab-tasks": "Tasks", + "project-page-all-tasks": "All tasks", + "project-page-status-pending": "Pending", + "no-tasks": "No tasks", + "workspace-select-project": "选择项目", + "workspace-cowork-single-agent": "与单个代理协作", + "workspace-cowork-workforce": "与工作组协作", + "execution-context": "执行上下文", + "no-results": "No results", + "notification-panel-dismiss": "Dismiss", + "instructions": "说明", + "instructions-rules-tone": "规则与语气", + "memory": "Memory", + "memory-on": "On", + "memory-off": "Off", + "workforce-setting": "工作组设置", + "select": "Select", + "edit-instructions": "编辑说明", + "sessions-start-new": "开始新会话", + "sessions-full-title": "全部会话", + "sessions-create-task-hint": "创建任务以开始会话", + "workforce-progress": "Progress", + "workforce-agent-folder": "代理文件夹", + "workforce-agent-pool": "Agent Pool", + "expand-project-sidebar": "展开侧边栏", + "fold-project-sidebar": "折叠侧边栏", + "update": "Update", + "workspace-start-from-scratch": "从头开始", + "workspace-project-submenu": "Project", + "workspace-recent-session-now": "Now", + "workspace-recent-session-minutes": "{{count}} 分钟", + "workspace-recent-session-hours": "{{count}}h", + "workspace-recent-session-days": "{{count}}d", + "workspace-recent-sessions-heading": "Recent", + "workspace-session-mode-label": "会话模式", + "workspace-session-mode-cycle-hint": "点击切换会话模式", + "failed-to-start-task": "任务启动失败。请检查您的模型配置。", + "workspace-work-with-panel-hide": "隐藏“协作”面板", + "workspace-work-with-panel-show": "显示“协作”面板", + "workspace-work-with-dismiss-overlay": "Dismiss", + "workspace-work-with-title": "Work with", + "workspace-work-with-remote-control": "远程控制" } diff --git a/src/i18n/locales/zh-Hans/setting.json b/src/i18n/locales/zh-Hans/setting.json index 2df8efbf9..95f6f0b1a 100644 --- a/src/i18n/locales/zh-Hans/setting.json +++ b/src/i18n/locales/zh-Hans/setting.json @@ -14,10 +14,9 @@ "mcp-custom-server-tools": "服务器命令", "mcp-add": "添加", "disable": "禁用", - "eigent-cloud": "Eigent Cloud", + "eigent-cloud": "Eigent 云", "default": "默认", "profile": "个人资料", - "account": "账户", "you-are-currently-signed-in-with": "你当前使用的是 {{email}} 账户", "manage": "管理", @@ -29,7 +28,6 @@ "dark": "深色", "light": "亮色", "transparent": "透明", - "workspace-main-background": "工作区背景", "workspace-main-background-description": "仅应用于 Workforce 与 Session 主内容区。", "workspace-main-background-empty": "无图案", @@ -38,14 +36,12 @@ "workspace-main-background-ruled": "横格线", "workspace-main-background-dotted": "虚线格", "workspace-main-background-dashed": "长虚线", - "appearance-tab": "外观", "color-mode": "颜色模式", "accent-palette": "强调色主题", "accent-palette-description": "界面的预设配色方案,浅色与深色模式分别保存。", "accent-for-light": "浅色模式", "accent-for-dark": "深色模式", - "data-privacy": "数据隐私", "data-privacy-description": "Eigent 基于本地优先原则确保您的隐私。您的数据默认存储在您的设备上。云功能是可选的,仅使用最小的数据来实现功能。详细信息请访问我们的", "privacy-policy": "隐私政策", @@ -124,8 +120,8 @@ "delete": "删除", "configure {name} Toolkit": "配置 {{name}} 工具包", "get-it-from": "获取它来自", - "google-custom-search-api": "Google Custom Search API", - "google-cloud-console": "Google Cloud Console", + "google-custom-search-api": "Google 自定义搜索 API", + "google-cloud-console": "Google Cloud 控制台", "connect": "连接", "setting": "设置", "all": "全部", @@ -175,7 +171,6 @@ "reset-success": "重置成功!", "reset-failed": "重置失败!", "select-default-model": "选择默认模型", - "browser-login": "浏览器登录", "browser-login-description": "打开 Chrome 浏览器以登录您的账户。您的登录数据将安全地保存在本地配置文件中。", "open-browser-login": "打开浏览器登录", @@ -183,7 +178,6 @@ "browser-opened-successfully": "浏览器已成功打开。请登录您的账户。", "failed-to-open-browser": "打开浏览器失败,请重试。", "restart-to-apply": "重启应用", - "cookie-manager": "Cookie 管理器", "cookie-manager-description": "管理从浏览器会话中保存的 Cookie。可以删除特定网站或全部 Cookie。", "refresh": "刷新", @@ -202,7 +196,6 @@ "confirm-delete-all-cookies": "确定要删除所有 Cookie 吗?此操作无法撤销。", "all-cookies-deleted": "所有 Cookie 已成功删除。", "cookie-delete-warning": "注意:删除 Cookie 会使您从相关网站登出。您可能需要重启浏览器才能看到更改生效。", - "network-proxy": "网络代理", "network-proxy-description": "为网络请求配置代理服务器。如需通过代理访问外部 API,非常有用。", "proxy-placeholder": "http://127.0.0.1:7890", @@ -210,7 +203,6 @@ "proxy-save-failed": "保存代理配置失败。", "proxy-invalid-url": "无效的代理 URL。必须以 http://、https://、socks4:// 或 socks5:// 开头。", "proxy-restart-hint": "需要重启应用以应用代理更改。", - "cloud-not-available-in-local-proxy": "在本地代理模式下无法使用云端版本", "set-as-default": "设为默认", "api-key-setting": "API 密钥设置", @@ -218,14 +210,12 @@ "model-type-setting": "模型类型设置", "please-select": "请选择", "configuring": "正在配置...", - "models-default-setting-title": "默认设置", "models-default-setting-description": "从已配置的模型中选择一个作为 Eigent 的默认模型,它将全局应用到您的工作区。", "models-configuration": "配置", - - "gemini-3-pro-preview-name": "Gemini 3 Pro Preview", + "gemini-3-pro-preview-name": "Gemini 3 Pro 预览版", "gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview", - "gemini-3-flash-preview-name": "Gemini 3 Flash Preview", + "gemini-3-flash-preview-name": "Gemini 3 Flash 预览版", "gpt-5.4-name": "GPT-5.4", "gpt-5.5-name": "GPT-5.5", "gpt-5-mini-name": "GPT-5 Mini", @@ -236,11 +226,15 @@ "claude-opus-4-7-name": "Claude Opus 4.7", "deepseek-v4-pro-name": "DeepSeek V4 Pro", "minimax-m2-7-name": "Minimax M2.7", - "preferred-ide": "首选 IDE", "preferred-ide-description": "选择打开智能体项目文件夹时使用的应用程序。", "system-file-manager": "系统文件管理器", "agents": "智能体", "help-improve-eigent": "帮助改进 Eigent", - "help-improve-eigent-description": "允许 Eigent 收集匿名错误日志和使用数据以改进服务。此项为可选,可随时更改。" + "help-improve-eigent-description": "允许 Eigent 收集匿名错误日志和使用数据以改进服务。此项为可选,可随时更改。", + "please-complete-authorization-in-browser": "请在浏览器中完成授权", + "authorization-cancelled": "授权已取消", + "authorization-failed": "授权失败", + "this-service-is-already-enabled-by-default": "此服务默认已启用", + "version": "Version" } diff --git a/src/i18n/locales/zh-Hans/triggers.json b/src/i18n/locales/zh-Hans/triggers.json index 2408ee2fc..41139f05d 100644 --- a/src/i18n/locales/zh-Hans/triggers.json +++ b/src/i18n/locales/zh-Hans/triggers.json @@ -89,7 +89,7 @@ "frequency-one-time": "单次", "frequency-custom": "自定义", "invalid-time-format": "无效的时间格式。请使用 HH:MM (例如: 09:30)", - "schedule-day-of-month-note": "If the selected day doesn’t exist in that month (e.g., the 31st), the task will be skipped.", + "schedule-day-of-month-note": "如果所选日期在该月份中不存在(例如 31 日),则该任务将被跳过。", "schedule-hour": "小时", "schedule-minute": "分钟", "schedule-date": "日期", @@ -103,9 +103,9 @@ "select-expiration": "选择到期日期", "no-upcoming-one-time": "请选择未来的日期和时间", "no-upcoming-executions": "没有即将执行的计划", - "date-required": "Date is required", - "weekday-required": "At least one weekday is required", - "schedule-required-fields": "Please fill in all required fields for the schedule", + "date-required": "日期为必填项", + "weekday-required": "至少需要选择一个工作日", + "schedule-required-fields": "请填写该计划的所有必填项", "create-trigger-agent": "使用触发器自动化任务", "trigger-overview": "触发器概览", "edit": "编辑", @@ -181,7 +181,7 @@ "task-prompt-required": "任务提示词必填", "project-id-required": "项目 ID 必填", "execution-settings": "执行设置", - "extra-settings": "Extra Settings", + "extra-settings": "额外设置", "max-per-hour-placeholder": "0", "max-per-day-placeholder": "0", "copy": "复制", @@ -200,97 +200,97 @@ "change-app": "Change", "dynamic": { "credentials": "Credentials", - "credentials-notice": "Your credentials are stored securely and used to authenticate with the service.", - "credentials-saved": "Credentials configured successfully", - "configuration": "Configuration", - "behavior-settings": "Behavior Settings", - "enter-value": "Please enter a value", + "credentials-notice": "您的凭据已安全存储,并用于与服务进行身份验证。", + "credentials-saved": "凭据配置成功", + "configuration": "配置", + "behavior-settings": "行为设置", + "enter-value": "请输入一个值", "add": "Add", "update": "Update", - "config-saved": "Configuration saved successfully", - "config-updated": "Configuration updated successfully", - "config-save-error": "Failed to save configuration", + "config-saved": "配置保存成功", + "config-updated": "配置更新成功", + "config-save-error": "保存配置失败", "loading": "Loading...", - "loading-config": "Loading configuration...", - "no-config-available": "No configuration available for this trigger type", - "failed-to-load-schema": "Failed to load configuration schema", - "select-options": "Select options...", + "loading-config": "正在加载配置...", + "no-config-available": "此触发器类型没有可用配置", + "failed-to-load-schema": "加载配置模式失败", + "select-options": "选择选项...", "selected": "selected", - "save-credentials-first": "Save credentials first", + "save-credentials-first": "请先保存凭据", "search": "Search...", - "no-options": "No options found", + "no-options": "未找到选项", "validation": { - "required": "{{field}} is required", - "invalid-regex": "Invalid regular expression pattern", - "invalid-email": "Invalid email address", - "invalid-url": "Invalid URL format", - "min-length": "Must be at least {{min}} characters", - "max-length": "Must be no more than {{max}} characters", - "pattern-mismatch": "Value does not match required pattern", - "min-value": "Must be at least {{min}}", - "max-value": "Must be no more than {{max}}" + "required": "必须填写{{field}}", + "invalid-regex": "正则表达式模式无效", + "invalid-email": "电子邮件地址无效", + "invalid-url": "URL 格式无效", + "min-length": "长度至少为 {{min}} 个字符", + "max-length": "长度不能超过 {{max}} 个字符", + "pattern-mismatch": "值与所需模式不匹配", + "min-value": "至少为 {{min}}", + "max-value": "不能超过 {{max}}" }, - "validation-failed": "Please fix validation errors: {{errors}}" + "validation-failed": "请修复验证错误:{{errors}}" }, "slack": { - "credentials-saved": "Slack credentials configured successfully", - "enter-bot-token": "Please enter a bot token", - "bot-token-saved": "Bot token saved successfully", - "bot-token-updated": "Bot token updated successfully", - "bot-token-save-error": "Failed to save bot token", - "signing-secret-saved": "Signing secret saved successfully", - "signing-secret-updated": "Signing secret updated successfully", - "signing-secret-save-error": "Failed to save signing secret", + "credentials-saved": "Slack 凭据配置成功", + "enter-bot-token": "请输入机器人令牌", + "bot-token-saved": "机器人令牌保存成功", + "bot-token-updated": "机器人令牌更新成功", + "bot-token-save-error": "保存机器人令牌失败", + "signing-secret-saved": "签名密钥已成功保存", + "signing-secret-updated": "签名密钥已成功更新", + "signing-secret-save-error": "保存签名密钥失败", "add": "Add", "update": "Update", - "event-configuration": "Event Configuration", + "event-configuration": "事件配置", "event-types": "Event Types", - "select-events": "Select events to trigger on...", - "search-events": "Search events...", - "no-events-found": "No events found", - "events-selected": "events selected", - "channel-filter": "Channel Filter", - "select-channels": "All channels (no filter)", - "search-channels": "Search channels...", - "no-channels-found": "No channels found", - "channels-selected": "channels selected", - "save-credentials-first": "Save credentials first to load channels", - "loading-channels": "Loading channels...", - "channels-fetch-error": "Failed to fetch channels. Please check your credentials.", - "behavior-settings": "Behavior Settings", + "select-events": "选择要触发的事件...", + "search-events": "搜索事件...", + "no-events-found": "未找到事件", + "events-selected": "个事件已选择", + "channel-filter": "频道筛选", + "select-channels": "所有频道(无筛选)", + "search-channels": "搜索频道...", + "no-channels-found": "未找到频道", + "channels-selected": "个频道已选择", + "save-credentials-first": "请先保存凭据以加载频道", + "loading-channels": "正在加载频道...", + "channels-fetch-error": "获取频道失败。请检查您的凭据。", + "behavior-settings": "行为设置", "authentication_required": { - "label": "Require Authentication", - "notice": "Slack triggers require authentication to verify webhook signatures (Slack Signing Secret required). Verify webhook endpoint at https://api.slack.com/apps to activate trigger." + "label": "需要身份验证", + "notice": "Slack 触发器需要身份验证以验证 webhook 签名(需要 Slack Signing Secret)。请在 https://api.slack.com/apps 验证 webhook 端点以激活触发器。" }, "bot_token": { - "label": "Slack Bot Token", + "label": "Slack Bot 令牌", "placeholder": "xoxb-...", - "notice": "Your Slack Bot User OAuth Token (starts with xoxb-)" + "notice": "您的 Slack Bot 用户 OAuth 令牌(以 xoxb- 开头)" }, "signing_secret": { "label": "Slack Signing Secret", - "placeholder": "Enter your Slack signing secret...", - "notice": "Your Slack app's signing secret used to verify requests" + "placeholder": "请输入您的 Slack signing secret...", + "notice": "用于验证请求的 Slack 应用签名密钥" }, "events": { "label": "Event Types", - "notice": "Select which Slack events should trigger this workflow" + "notice": "选择应触发此工作流的 Slack 事件" }, "channel_id": { "label": "Channel ID", - "placeholder": "Select a channel...", - "notice": "Specific channel to watch (leave empty to watch all channels)" + "placeholder": "选择一个频道...", + "notice": "要监视的特定频道(留空则监视所有频道)" }, "ignore_bot_messages": { - "label": "Ignore Bot Messages" + "label": "忽略机器人消息" }, "ignore_users": { - "label": "Ignore Users", - "placeholder": "Enter Slack user IDs (e.g., U1234567890)...", - "notice": "Slack user IDs to ignore messages from" + "label": "忽略用户", + "placeholder": "输入 Slack 用户 ID(例如,U1234567890)...", + "notice": "要忽略其消息的 Slack 用户 ID" } }, - "verification-required": "Pending Verification. A valid event message is required for Trigger Activation or disable trigger Authentication.", + "verification-required": "等待验证。触发器激活需要有效的事件消息,或者请禁用触发器身份验证。", "base": { "authentication_required": { "label": "需要身份验证", @@ -309,34 +309,36 @@ }, "webhook": { "authentication_required": { - "label": "Require Authentication", - "notice": "Whether authentication is required for this webhook trigger" + "label": "需要身份验证", + "notice": "此 webhook 触发器是否需要身份验证" }, "body_contains": { - "label": "Body Contains", - "placeholder": "Enter text that must be in request body...", - "notice": "Only trigger if the request body contains this string" + "label": "正文包含", + "placeholder": "输入请求正文中必须包含的文本...", + "notice": "仅当请求正文包含此字符串时才触发" }, "required_headers": { - "label": "Required Headers", - "placeholder": "Enter header names (e.g., Content-Type, Authorization)...", - "notice": "List of HTTP headers that must be present in the request" + "label": "必需请求头", + "placeholder": "输入请求头名称(例如:Content-Type、Authorization)...", + "notice": "请求中必须存在的 HTTP 请求头列表" }, "header_match": { - "label": "Header Match (Regex)", - "placeholder": "Header-Name: regex pattern", - "notice": "Match request headers against a regex pattern (format: Header-Name: pattern)" + "label": "请求头匹配(正则)", + "placeholder": "请求头名称:正则表达式模式", + "notice": "根据正则表达式模式匹配请求头(格式:请求头名称:模式)" }, "include_headers": { - "label": "Include Headers", - "notice": "Include request headers in the workflow execution input" + "label": "包含请求头", + "notice": "将请求头包含在工作流执行输入中" }, "include_query_params": { - "label": "Include Query Parameters" + "label": "包含查询参数" }, "include_request_metadata": { - "label": "Include Request Metadata", - "notice": "Include request metadata (method, URL, client IP) in execution input" + "label": "包含请求元数据", + "notice": "将请求元数据(方法、URL、客户端 IP)包含在执行输入中" } - } + }, + "status-cancelled": "Cancelled", + "select-method": "选择方法" } diff --git a/src/i18n/locales/zh-Hant/chat.json b/src/i18n/locales/zh-Hant/chat.json index e12103a98..c5efac624 100644 --- a/src/i18n/locales/zh-Hant/chat.json +++ b/src/i18n/locales/zh-Hant/chat.json @@ -91,5 +91,7 @@ "input-attach-manage-connectors": "管理連接器", "input-attach-open-browser": "開啟瀏覽器", "input-attach-manage-browsers": "管理瀏覽器", - "input-attach-menu-trigger": "新增檔案、相片,或從選單開啟技能、連接器、瀏覽器" + "input-attach-menu-trigger": "新增檔案、相片,或從選單開啟技能、連接器、瀏覽器", + "hide-file-sidebar": "隱藏檔案側邊欄", + "show-file-sidebar": "顯示檔案側邊欄" } diff --git a/src/i18n/locales/zh-Hant/dashboard.json b/src/i18n/locales/zh-Hant/dashboard.json index 83d3e71ba..f36fbebaa 100644 --- a/src/i18n/locales/zh-Hant/dashboard.json +++ b/src/i18n/locales/zh-Hant/dashboard.json @@ -23,5 +23,7 @@ "document-agent": "文件智能體", "multi-modal-agent": "多模態智能體", "social-media-agent": "社群媒體智能體", - "no-projects-found": "沒有找到專案" + "no-projects-found": "沒有找到專案", + "no-projects-match-search": "沒有符合您搜尋條件的專案", + "try-different-search": "嘗試其他搜尋條件" } diff --git a/src/i18n/locales/zh-Hant/folder.json b/src/i18n/locales/zh-Hant/folder.json new file mode 100644 index 000000000..53898cdef --- /dev/null +++ b/src/i18n/locales/zh-Hant/folder.json @@ -0,0 +1,8 @@ +{ + "file-path-remote-root": "Remote", + "files-scope-all": "All files", + "files-scope-new": "New files", + "file-path-breadcrumb": "File path", + "download-file": "下載檔案", + "zip-file-is-not-supported-yet": "尚不支援 ZIP 預覽。" +} diff --git a/src/i18n/locales/zh-Hant/index.ts b/src/i18n/locales/zh-Hant/index.ts index efa753446..4e23f35ac 100644 --- a/src/i18n/locales/zh-Hant/index.ts +++ b/src/i18n/locales/zh-Hant/index.ts @@ -15,6 +15,7 @@ import agents from './agents.json'; import chat from './chat.json'; import dashboard from './dashboard.json'; +import folder from './folder.json'; import layout from './layout.json'; import setting from './setting.json'; import triggers from './triggers.json'; @@ -24,6 +25,7 @@ export default { agents, layout, dashboard, + folder, workforce, chat, setting, diff --git a/src/i18n/locales/zh-Hant/layout.json b/src/i18n/locales/zh-Hant/layout.json index 304795485..b7744337c 100644 --- a/src/i18n/locales/zh-Hant/layout.json +++ b/src/i18n/locales/zh-Hant/layout.json @@ -307,5 +307,65 @@ "cookie-count": "{{count}} 個 Cookie", "add-new-mcp": "新增 MCP", "browse-mcps": "瀏覽 MCP", - "browser-settings": "瀏覽器設定" + "browser-settings": "瀏覽器設定", + "report-bug-dialog-title": "回報錯誤", + "report-bug-footer-hint": "我們會先儲存應用程式記錄的 ZIP 檔,然後開啟您的電子郵件應用程式。請在送出前將已儲存的 ZIP 附加到郵件中。", + "report-bug-field-description": "哪裡出問題了?", + "report-bug-field-description-placeholder": "請描述問題…", + "report-bug-field-steps": "重現步驟(選填)", + "report-bug-field-steps-placeholder": "1. … 2. …", + "report-bug-meta": "版本 {{version}} · {{os}}({{arch}})", + "report-bug-description-required": "請描述哪裡出問題了。", + "report-bug-submit": "儲存診斷資訊並開啟電子郵件", + "report-bug-diagnostics-saved": "診斷資訊已儲存。請在電子郵件中附加 ZIP 檔,然後送出。", + "report-bug-mail-subject": "[Eigent] 錯誤回報", + "report-bug-mail-body-intro": "請將您剛剛儲存的診斷 ZIP 檔附加到這封郵件中。", + "report-bug-mail-body-path": "ZIP 已儲存至:{{path}}", + "report-bug-mail-body-meta": "應用程式版本:{{version}} | 作業系統:{{os}}({{arch}})", + "report-bug-mail-body-desc": "描述:", + "report-bug-mail-body-steps": "重現步驟:", + "report-bug-mail-body-truncated": "由於長度限制,電子郵件內容已縮短。完整內容請見 ZIP 檔中的 bug_report.txt。", + "project-page-tab-project": "Project", + "project-page-tab-tasks": "Tasks", + "project-page-all-tasks": "All tasks", + "project-page-status-pending": "Pending", + "no-tasks": "No tasks", + "workspace-select-project": "選擇專案", + "workspace-cowork-single-agent": "與單一代理協作", + "workspace-cowork-workforce": "與團隊協作", + "execution-context": "執行內容", + "no-results": "No results", + "notification-panel-dismiss": "Dismiss", + "instructions": "說明", + "instructions-rules-tone": "規則與語氣", + "memory": "Memory", + "memory-on": "On", + "memory-off": "Off", + "workforce-setting": "團隊設定", + "select": "Select", + "edit-instructions": "編輯說明", + "sessions-start-new": "開始新工作階段", + "sessions-full-title": "所有工作階段", + "sessions-create-task-hint": "建立任務以開始工作階段", + "workforce-progress": "Progress", + "workforce-agent-folder": "代理資料夾", + "workforce-agent-pool": "Agent Pool", + "expand-project-sidebar": "展開側邊欄", + "fold-project-sidebar": "收合側邊欄", + "update": "Update", + "workspace-start-from-scratch": "從頭開始", + "workspace-project-submenu": "Project", + "workspace-recent-session-now": "Now", + "workspace-recent-session-minutes": "{{count}} 分鐘", + "workspace-recent-session-hours": "{{count}}h", + "workspace-recent-session-days": "{{count}}d", + "workspace-recent-sessions-heading": "Recent", + "workspace-session-mode-label": "工作階段模式", + "workspace-session-mode-cycle-hint": "點擊以切換工作階段模式", + "failed-to-start-task": "無法開始任務。請檢查您的模型設定。", + "workspace-work-with-panel-hide": "隱藏「與面板一起工作」", + "workspace-work-with-panel-show": "顯示「與面板一起工作」", + "workspace-work-with-dismiss-overlay": "Dismiss", + "workspace-work-with-title": "Work with", + "workspace-work-with-remote-control": "遠端控制" } diff --git a/src/i18n/locales/zh-Hant/setting.json b/src/i18n/locales/zh-Hant/setting.json index b0974745d..e60af1fb3 100644 --- a/src/i18n/locales/zh-Hant/setting.json +++ b/src/i18n/locales/zh-Hant/setting.json @@ -17,7 +17,6 @@ "eigent-cloud": "Eigent Cloud", "default": "預設", "profile": "個人檔案", - "account": "帳戶", "you-are-currently-signed-in-with": "您目前使用的是 {{email}} 帳戶", "manage": "管理", @@ -29,7 +28,6 @@ "dark": "深色", "light": "淺色", "transparent": "透明", - "workspace-main-background": "工作區背景", "workspace-main-background-description": "僅套用於 Workforce 與 Session 主內容區。", "workspace-main-background-empty": "無圖案", @@ -38,14 +36,12 @@ "workspace-main-background-ruled": "橫格線", "workspace-main-background-dotted": "虛線格", "workspace-main-background-dashed": "長虛線", - "appearance-tab": "外觀", "color-mode": "顏色模式", "accent-palette": "強調色主題", "accent-palette-description": "介面的預設配色方案,淺色與深色模式分別儲存。", "accent-for-light": "淺色模式", "accent-for-dark": "深色模式", - "data-privacy": "數據隱私", "data-privacy-description": "Eigent 以本地優先原則確保您的隱私。您的數據預設儲存在您的設備上。雲端功能是可選的,僅使用最少量的數據來實現功能。詳細資訊請參閱我們的", "privacy-policy": "隱私政策", @@ -125,8 +121,8 @@ "delete": "刪除", "configure {name} Toolkit": "設定 {{name}} 工具組", "get-it-from": "從此處取得", - "google-custom-search-api": "Google Custom Search API", - "google-cloud-console": "Google Cloud Console", + "google-custom-search-api": "Google 自訂搜尋 API", + "google-cloud-console": "Google Cloud 控制台", "connect": "連接", "setting": "設定", "all": "全部", @@ -176,7 +172,6 @@ "reset-success": "重設成功!", "reset-failed": "重設失敗!", "select-default-model": "選擇預設模型", - "browser-login": "瀏覽器登入", "browser-login-description": "開啟 Chrome 以登入您的帳戶。登入資料將安全地儲存在本機設定檔中。", "open-browser-login": "開啟瀏覽器登入", @@ -201,7 +196,6 @@ "confirm-delete-all-cookies": "確定要刪除所有 Cookie 嗎?此操作無法復原。", "all-cookies-deleted": "所有 Cookie 已成功刪除。", "cookie-delete-warning": "注意:刪除 Cookie 會使您從相關網站登出。您可能需要重新啟動瀏覽器才能看到變更生效。", - "cloud-not-available-in-local-proxy": "在本機代理模式下無法使用雲端版本", "set-as-default": "設為預設", "api-key-setting": "API 金鑰設定", @@ -209,14 +203,12 @@ "model-type-setting": "模型類型設定", "please-select": "請選擇", "configuring": "正在配置...", - "models-default-setting-title": "預設設定", "models-default-setting-description": "從已配置的模型中選擇一個作為 Eigent 的預設模型,它將全域套用於您的工作區。", "models-configuration": "配置", - - "gemini-3-pro-preview-name": "Gemini 3 Pro Preview", + "gemini-3-pro-preview-name": "Gemini 3 Pro 預覽版", "gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview", - "gemini-3-flash-preview-name": "Gemini 3 Flash Preview", + "gemini-3-flash-preview-name": "Gemini 3 Flash 預覽版", "gpt-5.4-name": "GPT-5.4", "gpt-5.5-name": "GPT-5.5", "gpt-5-mini-name": "GPT-5 Mini", @@ -227,7 +219,6 @@ "claude-opus-4-7-name": "Claude Opus 4.7", "deepseek-v4-pro-name": "DeepSeek V4 Pro", "minimax-m2-7-name": "Minimax M2.7", - "network-proxy": "網路代理", "network-proxy-description": "設定網路請求的代理伺服器。如果您需要透過代理存取外部 API,這將非常有用。", "proxy-placeholder": "http://127.0.0.1:7890", @@ -240,5 +231,10 @@ "system-file-manager": "系統檔案管理器", "agents": "智能體", "help-improve-eigent": "幫助改進 Eigent", - "help-improve-eigent-description": "允許 Eigent 收集匿名錯誤日誌和使用數據以改進服務。此項為可選,可隨時更改。" + "help-improve-eigent-description": "允許 Eigent 收集匿名錯誤日誌和使用數據以改進服務。此項為可選,可隨時更改。", + "please-complete-authorization-in-browser": "請在瀏覽器中完成授權", + "authorization-cancelled": "授權已取消", + "authorization-failed": "授權失敗", + "this-service-is-already-enabled-by-default": "此服務預設已啟用", + "version": "Version" } diff --git a/src/i18n/locales/zh-Hant/triggers.json b/src/i18n/locales/zh-Hant/triggers.json index e59b43f75..129e54f1b 100644 --- a/src/i18n/locales/zh-Hant/triggers.json +++ b/src/i18n/locales/zh-Hant/triggers.json @@ -89,7 +89,7 @@ "frequency-one-time": "單次", "frequency-custom": "自定義", "invalid-time-format": "無效的時間格式。請使用 HH:MM (例如: 09:30)", - "schedule-day-of-month-note": "If the selected day doesn’t exist in that month (e.g., the 31st), the task will be skipped.", + "schedule-day-of-month-note": "如果所選日期在該月份不存在(例如 31 號),該任務將被略過。", "schedule-hour": "小時", "schedule-minute": "分鐘", "schedule-date": "日期", @@ -103,9 +103,9 @@ "select-expiration": "選擇到期日期", "no-upcoming-one-time": "請選擇未來的日期和時間", "no-upcoming-executions": "沒有即將執行的計劃", - "date-required": "Date is required", - "weekday-required": "At least one weekday is required", - "schedule-required-fields": "Please fill in all required fields for the schedule", + "date-required": "日期為必填", + "weekday-required": "至少需要選擇一個星期幾", + "schedule-required-fields": "請填寫排程所需的所有必填欄位", "create-trigger-agent": "使用觸發器自動化任務", "trigger-overview": "觸發器概覽", "edit": "編輯", @@ -181,7 +181,7 @@ "task-prompt-required": "任務提示詞必填", "project-id-required": "項目 ID 必填", "execution-settings": "執行設置", - "extra-settings": "Extra Settings", + "extra-settings": "額外設定", "max-per-hour-placeholder": "0", "max-per-day-placeholder": "0", "copy": "複製", @@ -200,97 +200,97 @@ "change-app": "Change", "dynamic": { "credentials": "Credentials", - "credentials-notice": "Your credentials are stored securely and used to authenticate with the service.", - "credentials-saved": "Credentials configured successfully", - "configuration": "Configuration", - "behavior-settings": "Behavior Settings", - "enter-value": "Please enter a value", + "credentials-notice": "您的憑證會被安全地儲存,並用於與服務進行驗證。", + "credentials-saved": "憑證設定成功", + "configuration": "設定", + "behavior-settings": "行為設定", + "enter-value": "請輸入值", "add": "Add", "update": "Update", - "config-saved": "Configuration saved successfully", - "config-updated": "Configuration updated successfully", - "config-save-error": "Failed to save configuration", + "config-saved": "設定已成功儲存", + "config-updated": "設定已成功更新", + "config-save-error": "儲存設定失敗", "loading": "Loading...", - "loading-config": "Loading configuration...", - "no-config-available": "No configuration available for this trigger type", - "failed-to-load-schema": "Failed to load configuration schema", - "select-options": "Select options...", + "loading-config": "正在載入設定...", + "no-config-available": "此觸發器類型沒有可用的設定", + "failed-to-load-schema": "載入設定結構描述失敗", + "select-options": "選擇選項...", "selected": "selected", - "save-credentials-first": "Save credentials first", + "save-credentials-first": "請先儲存憑證", "search": "Search...", - "no-options": "No options found", + "no-options": "找不到選項", "validation": { - "required": "{{field}} is required", - "invalid-regex": "Invalid regular expression pattern", - "invalid-email": "Invalid email address", - "invalid-url": "Invalid URL format", - "min-length": "Must be at least {{min}} characters", - "max-length": "Must be no more than {{max}} characters", - "pattern-mismatch": "Value does not match required pattern", - "min-value": "Must be at least {{min}}", - "max-value": "Must be no more than {{max}}" + "required": "{{field}} 為必填", + "invalid-regex": "無效的正規表示式模式", + "invalid-email": "無效的電子郵件地址", + "invalid-url": "無效的 URL 格式", + "min-length": "至少必須有 {{min}} 個字元", + "max-length": "最多不能超過 {{max}} 個字元", + "pattern-mismatch": "值不符合所需的格式", + "min-value": "至少必須為 {{min}}", + "max-value": "最多不能超過 {{max}}" }, - "validation-failed": "Please fix validation errors: {{errors}}" + "validation-failed": "請修正驗證錯誤:{{errors}}" }, "slack": { - "credentials-saved": "Slack credentials configured successfully", - "enter-bot-token": "Please enter a bot token", - "bot-token-saved": "Bot token saved successfully", - "bot-token-updated": "Bot token updated successfully", - "bot-token-save-error": "Failed to save bot token", - "signing-secret-saved": "Signing secret saved successfully", - "signing-secret-updated": "Signing secret updated successfully", - "signing-secret-save-error": "Failed to save signing secret", + "credentials-saved": "Slack 憑證設定成功", + "enter-bot-token": "請輸入機器人權杖", + "bot-token-saved": "機器人權杖儲存成功", + "bot-token-updated": "機器人權杖更新成功", + "bot-token-save-error": "儲存機器人權杖失敗", + "signing-secret-saved": "簽署密鑰已成功儲存", + "signing-secret-updated": "簽署密鑰已成功更新", + "signing-secret-save-error": "儲存簽署密鑰失敗", "add": "Add", "update": "Update", - "event-configuration": "Event Configuration", + "event-configuration": "事件設定", "event-types": "Event Types", - "select-events": "Select events to trigger on...", - "search-events": "Search events...", - "no-events-found": "No events found", - "events-selected": "events selected", - "channel-filter": "Channel Filter", - "select-channels": "All channels (no filter)", - "search-channels": "Search channels...", - "no-channels-found": "No channels found", - "channels-selected": "channels selected", - "save-credentials-first": "Save credentials first to load channels", - "loading-channels": "Loading channels...", - "channels-fetch-error": "Failed to fetch channels. Please check your credentials.", - "behavior-settings": "Behavior Settings", + "select-events": "選擇要觸發的事件...", + "search-events": "搜尋事件...", + "no-events-found": "找不到事件", + "events-selected": "個事件已選取", + "channel-filter": "頻道篩選", + "select-channels": "所有頻道(不篩選)", + "search-channels": "搜尋頻道...", + "no-channels-found": "找不到頻道", + "channels-selected": "個頻道已選取", + "save-credentials-first": "請先儲存憑證以載入頻道", + "loading-channels": "正在載入頻道...", + "channels-fetch-error": "無法取得頻道。請檢查您的憑證。", + "behavior-settings": "行為設定", "authentication_required": { - "label": "Require Authentication", - "notice": "Slack triggers require authentication to verify webhook signatures (Slack Signing Secret required). Verify webhook endpoint at https://api.slack.com/apps to activate trigger." + "label": "需要驗證", + "notice": "Slack 觸發器需要驗證以確認 webhook 簽章(需要 Slack Signing Secret)。請至 https://api.slack.com/apps 驗證 webhook 端點以啟用觸發器。" }, "bot_token": { - "label": "Slack Bot Token", + "label": "Slack Bot 權杖", "placeholder": "xoxb-...", - "notice": "Your Slack Bot User OAuth Token (starts with xoxb-)" + "notice": "您的 Slack Bot 使用者 OAuth 權杖(以 xoxb- 開頭)" }, "signing_secret": { - "label": "Slack Signing Secret", - "placeholder": "Enter your Slack signing secret...", - "notice": "Your Slack app's signing secret used to verify requests" + "label": "Slack 簽署密鑰", + "placeholder": "輸入您的 Slack 簽署密鑰...", + "notice": "用於驗證請求的 Slack 應用程式簽署密鑰" }, "events": { "label": "Event Types", - "notice": "Select which Slack events should trigger this workflow" + "notice": "選擇哪些 Slack 事件應觸發此工作流程" }, "channel_id": { "label": "Channel ID", - "placeholder": "Select a channel...", - "notice": "Specific channel to watch (leave empty to watch all channels)" + "placeholder": "選擇頻道...", + "notice": "要監聽的特定頻道(留空則監聽所有頻道)" }, "ignore_bot_messages": { - "label": "Ignore Bot Messages" + "label": "忽略機器人訊息" }, "ignore_users": { - "label": "Ignore Users", - "placeholder": "Enter Slack user IDs (e.g., U1234567890)...", - "notice": "Slack user IDs to ignore messages from" + "label": "忽略使用者", + "placeholder": "輸入 Slack 使用者 ID(例如:U1234567890)...", + "notice": "要忽略其訊息的 Slack 使用者 ID" } }, - "verification-required": "Pending Verification. A valid event message is required for Trigger Activation or disable trigger Authentication.", + "verification-required": "待驗證。觸發器啟用需要有效的事件訊息,或停用觸發器驗證。", "base": { "authentication_required": { "label": "需要身份驗證", @@ -309,34 +309,36 @@ }, "webhook": { "authentication_required": { - "label": "Require Authentication", - "notice": "Whether authentication is required for this webhook trigger" + "label": "需要驗證", + "notice": "此 webhook 觸發器是否需要驗證" }, "body_contains": { - "label": "Body Contains", - "placeholder": "Enter text that must be in request body...", - "notice": "Only trigger if the request body contains this string" + "label": "內容包含", + "placeholder": "輸入必須出現在請求本文中的文字...", + "notice": "只有當請求本文包含此字串時才觸發" }, "required_headers": { - "label": "Required Headers", - "placeholder": "Enter header names (e.g., Content-Type, Authorization)...", - "notice": "List of HTTP headers that must be present in the request" + "label": "必填標頭", + "placeholder": "輸入標頭名稱(例如:Content-Type、Authorization)...", + "notice": "請列出請求中必須存在的 HTTP 標頭" }, "header_match": { - "label": "Header Match (Regex)", - "placeholder": "Header-Name: regex pattern", - "notice": "Match request headers against a regex pattern (format: Header-Name: pattern)" + "label": "標頭比對(Regex)", + "placeholder": "標頭名稱:正規表示式模式", + "notice": "使用正規表示式模式比對請求標頭(格式:標頭名稱:模式)" }, "include_headers": { - "label": "Include Headers", - "notice": "Include request headers in the workflow execution input" + "label": "包含標頭", + "notice": "在工作流程執行輸入中包含請求標頭" }, "include_query_params": { - "label": "Include Query Parameters" + "label": "包含查詢參數" }, "include_request_metadata": { - "label": "Include Request Metadata", - "notice": "Include request metadata (method, URL, client IP) in execution input" + "label": "包含請求中繼資料", + "notice": "在執行輸入中包含請求中繼資料(方法、URL、用戶端 IP)" } - } + }, + "status-cancelled": "Cancelled", + "select-method": "選擇方法" }