feat: i18n 11 languages + website update + fix #139 #140 #141

i18n:
- Add 9 new locale files (ja/ko/de/es/fr/pt/ru/vi/zh-TW)
- Add multilingual README files for all 11 languages
- Add locale helper, index, and modular translation system
- Add translation generation scripts

Website (docs/index.html):
- Replace 公益AI接口 branding with 晴辰云AI接口
- Remove OpenClaw 独立安装包 promotion block
- Update SEO meta tags (description, keywords, OG, Twitter, JSON-LD)
- Add 11-language README links to footer
- Update 元宝派 link to new URL

Bug fixes:
- fix(cron): delivery format mode:'push' → mode:'announce', remove invalid 'to' field (fixes #141)
- fix(cron): allow single-channel users to select delivery channel
- fix(cron): preserve delivery field in job state for editing
- fix(models): add 'ollama' as recognized API type, prevent overwriting native ollama config (fixes #140)
- fix(models): skip /v1 append for ollama native API baseUrl
- fix(assistant): normalize 'google-generative-ai' consistently, add ollama hints
- fix(version): use CLI path classification for source detection on Windows (fixes #139)
- fix(version): default to 'official' instead of 'chinese' when source unknown
- fix(version): reorder npm global package check based on active CLI
This commit is contained in:
晴天
2026-03-24 22:31:11 +08:00
parent f8af3bea4a
commit 985d263dc6
261 changed files with 26760 additions and 175 deletions

View File

@@ -0,0 +1,47 @@
/**
* Generate vi/es/pt/ru/fr/de locale JSON files
* Base: en.json → apply translations → write {lang}.json
*/
const fs = require('fs')
const path = require('path')
const LOCALES = path.resolve(__dirname, '../src/locales')
const PATCHES = path.resolve(__dirname, 'translations')
const en = JSON.parse(fs.readFileSync(path.join(LOCALES, 'en.json'), 'utf8'))
const LANGS = ['vi', 'es', 'pt', 'ru', 'fr', 'de']
function clone(o) { return JSON.parse(JSON.stringify(o)) }
function loadPatches(dir) {
if (!fs.existsSync(dir)) return {}
const merged = {}
for (const f of fs.readdirSync(dir).filter(x => x.endsWith('.json'))) {
const mod = f.replace('.json', '')
merged[mod] = JSON.parse(fs.readFileSync(path.join(dir, f), 'utf8'))
}
return merged
}
function applyTranslations(target, dict) {
for (const [section, entries] of Object.entries(dict)) {
if (!target[section]) continue
for (const [key, val] of Object.entries(entries)) {
if (target[section][key] !== undefined) {
target[section][key] = val
}
}
}
}
for (const lang of LANGS) {
const result = clone(en)
const patchDir = path.join(PATCHES, lang)
const patches = loadPatches(patchDir)
applyTranslations(result, patches)
const outPath = path.join(LOCALES, `${lang}.json`)
fs.writeFileSync(outPath, JSON.stringify(result, null, 2) + '\n', 'utf8')
const patchCount = Object.keys(patches).length
console.log(`${lang}.json generated (${patchCount} patch modules applied)`)
}
console.log(' Missing keys fallback to English')

54
scripts/gen-ja-ko.cjs Normal file
View File

@@ -0,0 +1,54 @@
/**
* Generate ja.json and ko.json by applying translation dictionaries
* to the en.json structure. Missing translations fallback to English.
* Run: node scripts/gen-ja-ko.cjs
*/
const fs = require('fs')
const path = require('path')
const LOCALES = path.resolve(__dirname, '../src/locales')
const en = JSON.parse(fs.readFileSync(path.join(LOCALES, 'en.json'), 'utf8'))
// Deep clone helper
const clone = o => JSON.parse(JSON.stringify(o))
// Apply translation dict to target (mutates target)
function applyTranslations(target, dict) {
for (const [section, keys] of Object.entries(dict)) {
if (!target[section]) continue
for (const [key, val] of Object.entries(keys)) {
if (target[section][key] !== undefined && val) {
target[section][key] = val
}
}
}
}
// Load translation patches from separate files
const jaPatches = path.join(__dirname, 'translations', 'ja')
const koPatches = path.join(__dirname, 'translations', 'ko')
function loadPatches(dir) {
if (!fs.existsSync(dir)) return {}
const result = {}
for (const file of fs.readdirSync(dir).filter(f => f.endsWith('.json'))) {
const section = file.replace('.json', '')
result[section] = JSON.parse(fs.readFileSync(path.join(dir, file), 'utf8'))
}
return result
}
// Generate ja.json
const ja = clone(en)
applyTranslations(ja, loadPatches(jaPatches))
fs.writeFileSync(path.join(LOCALES, 'ja.json'), JSON.stringify(ja, null, 2) + '\n', 'utf8')
console.log('✓ ja.json generated')
// Generate ko.json
const ko = clone(en)
applyTranslations(ko, loadPatches(koPatches))
fs.writeFileSync(path.join(LOCALES, 'ko.json'), JSON.stringify(ko, null, 2) + '\n', 'utf8')
console.log('✓ ko.json generated')
console.log(' Translations applied from scripts/translations/{ja,ko}/*.json')
console.log(' Missing keys fallback to English')

View File

@@ -0,0 +1,294 @@
/**
* Generate translation patch files for vi/es/pt/ru/fr/de
* Writes scripts/translations/{lang}/{module}.json
*/
const fs = require('fs')
const path = require('path')
const OUTDIR = path.resolve(__dirname, 'translations')
function w(lang, mod, data) {
const dir = path.join(OUTDIR, lang)
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })
fs.writeFileSync(path.join(dir, mod + '.json'), JSON.stringify(data, null, 2))
}
const LANGS = ['vi', 'es', 'pt', 'ru', 'fr', 'de']
// ── toast ──
const toast = {
vi: { copySuccess: 'Đã sao chép', copyFailed: 'Sao chép thất bại' },
es: { copySuccess: 'Copiado al portapapeles', copyFailed: 'Error al copiar' },
pt: { copySuccess: 'Copiado', copyFailed: 'Falha ao copiar' },
ru: { copySuccess: 'Скопировано', copyFailed: 'Ошибка копирования' },
fr: { copySuccess: 'Copié', copyFailed: 'Échec de la copie' },
de: { copySuccess: 'Kopiert', copyFailed: 'Kopieren fehlgeschlagen' },
}
// ── modal ──
const modal = {
vi: { confirmTitle: 'Xác nhận', confirmOk: 'Đồng ý', confirmCancel: 'Hủy' },
es: { confirmTitle: 'Confirmar', confirmOk: 'Aceptar', confirmCancel: 'Cancelar' },
pt: { confirmTitle: 'Confirmar', confirmOk: 'OK', confirmCancel: 'Cancelar' },
ru: { confirmTitle: 'Подтвердите', confirmOk: 'ОК', confirmCancel: 'Отмена' },
fr: { confirmTitle: 'Confirmer', confirmOk: 'OK', confirmCancel: 'Annuler' },
de: { confirmTitle: 'Bestätigen', confirmOk: 'OK', confirmCancel: 'Abbrechen' },
}
// ── instance ──
const instance = {
vi: { local: 'Cục bộ', remote: 'Từ xa', docker: 'Docker', addInstance: 'Thêm instance', addRemote: 'Thêm instance từ xa', nameLabel: 'Tên', endpointLabel: 'Địa chỉ panel', adding: 'Đang thêm...', current: 'Hiện tại' },
es: { local: 'Local', remote: 'Remoto', docker: 'Docker', addInstance: 'Agregar instancia', addRemote: 'Agregar instancia remota', nameLabel: 'Nombre', endpointLabel: 'Dirección del panel', adding: 'Agregando...', current: 'Actual' },
pt: { local: 'Local', remote: 'Remoto', docker: 'Docker', addInstance: 'Adicionar instância', addRemote: 'Adicionar instância remota', nameLabel: 'Nome', endpointLabel: 'Endereço do painel', adding: 'Adicionando...', current: 'Atual' },
ru: { local: 'Локальный', remote: 'Удалённый', docker: 'Docker', addInstance: 'Добавить экземпляр', addRemote: 'Добавить удалённый', nameLabel: 'Имя', endpointLabel: 'Адрес панели', adding: 'Добавление...', current: 'Текущий' },
fr: { local: 'Local', remote: 'Distant', docker: 'Docker', addInstance: 'Ajouter une instance', addRemote: 'Ajouter une instance distante', nameLabel: 'Nom', endpointLabel: 'Adresse du panneau', adding: 'Ajout...', current: 'Actuel' },
de: { local: 'Lokal', remote: 'Remote', docker: 'Docker', addInstance: 'Instanz hinzufügen', addRemote: 'Remote-Instanz hinzufügen', nameLabel: 'Name', endpointLabel: 'Panel-Adresse', adding: 'Wird hinzugefügt...', current: 'Aktuell' },
}
// ── logs ──
const logs = {
vi: { title: 'Nhật ký', desc: 'Xem nhật ký dịch vụ OpenClaw', tabGateway: 'Gateway', tabGatewayErr: 'Lỗi Gateway', tabGuardian: 'Guardian', tabBackup: 'Sao lưu', tabAudit: 'Kiểm toán', searchPlaceholder: 'Tìm kiếm...', refresh: 'Làm mới', autoScroll: 'Tự động cuộn', loading: 'Đang tải...', empty: 'Không có nhật ký', loadFailed: 'Tải thất bại', noResults: 'Không có kết quả', searchFailed: 'Tìm kiếm thất bại' },
es: { title: 'Registros', desc: 'Ver registros del servicio OpenClaw', tabGateway: 'Gateway', tabGatewayErr: 'Errores Gateway', tabGuardian: 'Guardian', tabBackup: 'Respaldo', tabAudit: 'Auditoría', searchPlaceholder: 'Buscar...', refresh: 'Actualizar', autoScroll: 'Auto-desplazar', loading: 'Cargando...', empty: 'Sin registros', loadFailed: 'Error al cargar', noResults: 'Sin resultados', searchFailed: 'Búsqueda fallida' },
pt: { title: 'Logs', desc: 'Ver logs do serviço OpenClaw', tabGateway: 'Gateway', tabGatewayErr: 'Erros Gateway', tabGuardian: 'Guardian', tabBackup: 'Backup', tabAudit: 'Auditoria', searchPlaceholder: 'Pesquisar...', refresh: 'Atualizar', autoScroll: 'Rolagem auto', loading: 'Carregando...', empty: 'Sem logs', loadFailed: 'Falha ao carregar', noResults: 'Sem resultados', searchFailed: 'Pesquisa falhou' },
ru: { title: 'Журналы', desc: 'Просмотр журналов OpenClaw', tabGateway: 'Gateway', tabGatewayErr: 'Ошибки Gateway', tabGuardian: 'Guardian', tabBackup: 'Резервное копирование', tabAudit: 'Аудит', searchPlaceholder: 'Поиск...', refresh: 'Обновить', autoScroll: 'Автопрокрутка', loading: 'Загрузка...', empty: 'Нет записей', loadFailed: 'Ошибка загрузки', noResults: 'Ничего не найдено', searchFailed: 'Ошибка поиска' },
fr: { title: 'Journaux', desc: 'Voir les journaux OpenClaw', tabGateway: 'Gateway', tabGatewayErr: 'Erreurs Gateway', tabGuardian: 'Guardian', tabBackup: 'Sauvegarde', tabAudit: 'Audit', searchPlaceholder: 'Rechercher...', refresh: 'Actualiser', autoScroll: 'Défilement auto', loading: 'Chargement...', empty: 'Aucun journal', loadFailed: 'Échec du chargement', noResults: 'Aucun résultat', searchFailed: 'Échec de la recherche' },
de: { title: 'Protokolle', desc: 'OpenClaw-Protokolle anzeigen', tabGateway: 'Gateway', tabGatewayErr: 'Gateway-Fehler', tabGuardian: 'Guardian', tabBackup: 'Backup', tabAudit: 'Audit', searchPlaceholder: 'Suchen...', refresh: 'Aktualisieren', autoScroll: 'Auto-Scrollen', loading: 'Laden...', empty: 'Keine Protokolle', loadFailed: 'Laden fehlgeschlagen', noResults: 'Keine Ergebnisse', searchFailed: 'Suche fehlgeschlagen' },
}
// ── sidebar ──
const sidebar = {
vi: { collapse: 'Thu gọn', closeMenu: 'Đóng menu', themeLight: 'Sáng', themeDark: 'Tối', sectionMonitor: 'Giám sát', sectionConfig: 'Cấu hình', sectionData: 'Dữ liệu', sectionExtension: 'Mở rộng', dashboard: 'Bảng điều khiển', assistant: 'Trợ lý', chat: 'Trò chuyện', services: 'Dịch vụ', logs: 'Nhật ký', models: 'Mô hình', agents: 'Agent', gateway: 'Gateway', channels: 'Kênh', communication: 'Truyền thông', security: 'Bảo mật', memory: 'Bộ nhớ', cron: 'Tác vụ định kỳ', usage: 'Sử dụng', skills: 'Skills', settings: 'Cài đặt', chatDebug: 'Chẩn đoán', about: 'Giới thiệu', setup: 'Thiết lập' },
es: { collapse: 'Colapsar', closeMenu: 'Cerrar menú', themeLight: 'Claro', themeDark: 'Oscuro', sectionMonitor: 'Monitoreo', sectionConfig: 'Configuración', sectionData: 'Datos', sectionExtension: 'Extensiones', dashboard: 'Panel', assistant: 'Asistente', chat: 'Chat', services: 'Servicios', logs: 'Registros', models: 'Modelos', agents: 'Agentes', gateway: 'Gateway', channels: 'Canales', communication: 'Comunicación', security: 'Seguridad', memory: 'Memoria', cron: 'Tareas', usage: 'Uso', skills: 'Skills', settings: 'Configuración', chatDebug: 'Diagnóstico', about: 'Acerca de', setup: 'Configuración inicial' },
pt: { collapse: 'Recolher', closeMenu: 'Fechar menu', themeLight: 'Claro', themeDark: 'Escuro', sectionMonitor: 'Monitoramento', sectionConfig: 'Configuração', sectionData: 'Dados', sectionExtension: 'Extensões', dashboard: 'Painel', assistant: 'Assistente', chat: 'Chat', services: 'Serviços', logs: 'Logs', models: 'Modelos', agents: 'Agentes', gateway: 'Gateway', channels: 'Canais', communication: 'Comunicação', security: 'Segurança', memory: 'Memória', cron: 'Tarefas', usage: 'Uso', skills: 'Skills', settings: 'Configurações', chatDebug: 'Diagnóstico', about: 'Sobre', setup: 'Configuração inicial' },
ru: { collapse: 'Свернуть', closeMenu: 'Закрыть меню', themeLight: 'Светлая', themeDark: 'Тёмная', sectionMonitor: 'Мониторинг', sectionConfig: 'Настройки', sectionData: 'Данные', sectionExtension: 'Расширения', dashboard: 'Панель', assistant: 'Ассистент', chat: 'Чат', services: 'Сервисы', logs: 'Журналы', models: 'Модели', agents: 'Агенты', gateway: 'Gateway', channels: 'Каналы', communication: 'Коммуникации', security: 'Безопасность', memory: 'Память', cron: 'Планировщик', usage: 'Использование', skills: 'Skills', settings: 'Настройки', chatDebug: 'Диагностика', about: 'О программе', setup: 'Начальная настройка' },
fr: { collapse: 'Réduire', closeMenu: 'Fermer le menu', themeLight: 'Clair', themeDark: 'Sombre', sectionMonitor: 'Surveillance', sectionConfig: 'Configuration', sectionData: 'Données', sectionExtension: 'Extensions', dashboard: 'Tableau de bord', assistant: 'Assistant', chat: 'Chat', services: 'Services', logs: 'Journaux', models: 'Modèles', agents: 'Agents', gateway: 'Gateway', channels: 'Canaux', communication: 'Communication', security: 'Sécurité', memory: 'Mémoire', cron: 'Tâches planifiées', usage: 'Utilisation', skills: 'Skills', settings: 'Paramètres', chatDebug: 'Diagnostic', about: 'À propos', setup: 'Configuration initiale' },
de: { collapse: 'Einklappen', closeMenu: 'Menü schließen', themeLight: 'Hell', themeDark: 'Dunkel', sectionMonitor: 'Überwachung', sectionConfig: 'Konfiguration', sectionData: 'Daten', sectionExtension: 'Erweiterungen', dashboard: 'Dashboard', assistant: 'Assistent', chat: 'Live-Chat', services: 'Dienste', logs: 'Protokolle', models: 'Modelle', agents: 'Agenten', gateway: 'Gateway', channels: 'Kanäle', communication: 'Kommunikation', security: 'Sicherheit', memory: 'Speicher', cron: 'Geplante Aufgaben', usage: 'Nutzung', skills: 'Skills', settings: 'Einstellungen', chatDebug: 'Diagnose', about: 'Über', setup: 'Ersteinrichtung' },
}
// Write small modules
for (const mod of [
['toast', toast], ['modal', modal], ['instance', instance],
['logs', logs], ['sidebar', sidebar],
]) {
for (const lang of LANGS) {
if (mod[1][lang]) w(lang, mod[0], mod[1][lang])
}
}
console.log('✓ Small modules: toast, modal, instance, logs, sidebar (6 langs)')
// ── dashboard (core keys) ──
const dashboard = {
vi: { title: 'Bảng điều khiển', desc: 'Tổng quan trạng thái OpenClaw', gateway: 'Gateway', notStarted: 'Chưa khởi động', versionLabel: 'Phiên bản', agentFleet: 'Đội Agent', defaultAgent: 'Mặc định', modelPool: 'Nhóm mô hình', baseServices: 'Dịch vụ cơ bản', controlUI: 'Control UI', restartGw: 'Khởi động lại Gateway', checkUpdate: 'Kiểm tra cập nhật', createBackup: 'Tạo bản sao lưu', recentLogs: 'Nhật ký gần đây', cliPath: 'Đường dẫn CLI', retry: 'Thử lại', notSet: 'Chưa đặt', port: 'Cổng', startBtn: 'Khởi động', stopBtn: 'Dừng', restartBtn: 'Khởi động lại', primaryModel: 'Mô hình chính', noLogs: 'Không có nhật ký', starting: 'Đang khởi động...', stopping: 'Đang dừng...', restarting: 'Đang khởi động lại...', checking: 'Đang kiểm tra...', upToDate: 'Đã cập nhật', backingUp: 'Đang sao lưu...', backupFail: 'Sao lưu thất bại' },
es: { title: 'Panel', desc: 'Resumen del estado de OpenClaw', gateway: 'Gateway', notStarted: 'No iniciado', versionLabel: 'Versión', agentFleet: 'Flota de Agentes', defaultAgent: 'Predeterminado', modelPool: 'Pool de modelos', baseServices: 'Servicios base', controlUI: 'Control UI', restartGw: 'Reiniciar Gateway', checkUpdate: 'Buscar actualizaciones', createBackup: 'Crear respaldo', recentLogs: 'Registros recientes', cliPath: 'Ruta CLI', retry: 'Reintentar', notSet: 'No configurado', port: 'Puerto', startBtn: 'Iniciar', stopBtn: 'Detener', restartBtn: 'Reiniciar', primaryModel: 'Modelo principal', noLogs: 'Sin registros', starting: 'Iniciando...', stopping: 'Deteniendo...', restarting: 'Reiniciando...', checking: 'Verificando...', upToDate: 'Actualizado', backingUp: 'Respaldando...', backupFail: 'Respaldo fallido' },
pt: { title: 'Painel', desc: 'Visão geral do estado do OpenClaw', gateway: 'Gateway', notStarted: 'Não iniciado', versionLabel: 'Versão', agentFleet: 'Frota de Agentes', defaultAgent: 'Padrão', modelPool: 'Pool de modelos', baseServices: 'Serviços base', controlUI: 'Control UI', restartGw: 'Reiniciar Gateway', checkUpdate: 'Verificar atualizações', createBackup: 'Criar backup', recentLogs: 'Logs recentes', cliPath: 'Caminho CLI', retry: 'Tentar novamente', notSet: 'Não definido', port: 'Porta', startBtn: 'Iniciar', stopBtn: 'Parar', restartBtn: 'Reiniciar', primaryModel: 'Modelo principal', noLogs: 'Sem logs', starting: 'Iniciando...', stopping: 'Parando...', restarting: 'Reiniciando...', checking: 'Verificando...', upToDate: 'Atualizado', backingUp: 'Fazendo backup...', backupFail: 'Falha no backup' },
ru: { title: 'Панель', desc: 'Обзор состояния OpenClaw', gateway: 'Gateway', notStarted: 'Не запущен', versionLabel: 'Версия', agentFleet: 'Флот агентов', defaultAgent: 'По умолчанию', modelPool: 'Пул моделей', baseServices: 'Базовые сервисы', controlUI: 'Control UI', restartGw: 'Перезапустить Gateway', checkUpdate: 'Проверить обновления', createBackup: 'Создать резервную копию', recentLogs: 'Последние записи', cliPath: 'Путь CLI', retry: 'Повторить', notSet: 'Не задано', port: 'Порт', startBtn: 'Запустить', stopBtn: 'Остановить', restartBtn: 'Перезапустить', primaryModel: 'Основная модель', noLogs: 'Нет записей', starting: 'Запуск...', stopping: 'Остановка...', restarting: 'Перезапуск...', checking: 'Проверка...', upToDate: 'Актуально', backingUp: 'Резервное копирование...', backupFail: 'Ошибка резервного копирования' },
fr: { title: 'Tableau de bord', desc: "Vue d'ensemble de l'état OpenClaw", gateway: 'Gateway', notStarted: 'Non démarré', versionLabel: 'Version', agentFleet: "Flotte d'Agents", defaultAgent: 'Par défaut', modelPool: 'Pool de modèles', baseServices: 'Services de base', controlUI: 'Control UI', restartGw: 'Redémarrer Gateway', checkUpdate: 'Vérifier les mises à jour', createBackup: 'Créer une sauvegarde', recentLogs: 'Journaux récents', cliPath: 'Chemin CLI', retry: 'Réessayer', notSet: 'Non défini', port: 'Port', startBtn: 'Démarrer', stopBtn: 'Arrêter', restartBtn: 'Redémarrer', primaryModel: 'Modèle principal', noLogs: 'Aucun journal', starting: 'Démarrage...', stopping: 'Arrêt...', restarting: 'Redémarrage...', checking: 'Vérification...', upToDate: 'À jour', backingUp: 'Sauvegarde...', backupFail: 'Échec de la sauvegarde' },
de: { title: 'Dashboard', desc: 'OpenClaw-Statusübersicht', gateway: 'Gateway', notStarted: 'Nicht gestartet', versionLabel: 'Version', agentFleet: 'Agent-Flotte', defaultAgent: 'Standard', modelPool: 'Modell-Pool', baseServices: 'Basisdienste', controlUI: 'Control UI', restartGw: 'Gateway neustarten', checkUpdate: 'Updates prüfen', createBackup: 'Backup erstellen', recentLogs: 'Aktuelle Protokolle', cliPath: 'CLI-Pfad', retry: 'Wiederholen', notSet: 'Nicht gesetzt', port: 'Port', startBtn: 'Starten', stopBtn: 'Stoppen', restartBtn: 'Neustarten', primaryModel: 'Primäres Modell', noLogs: 'Keine Protokolle', starting: 'Wird gestartet...', stopping: 'Wird gestoppt...', restarting: 'Wird neugestartet...', checking: 'Wird geprüft...', upToDate: 'Aktuell', backingUp: 'Backup wird erstellt...', backupFail: 'Backup fehlgeschlagen' },
}
// ── services (core keys) ──
const services = {
vi: { title: 'Quản lý dịch vụ', desc: 'Khởi động, dừng và giám sát dịch vụ OpenClaw', gatewayTitle: 'Dịch vụ Gateway', guardianTitle: 'Dịch vụ Guardian', status: 'Trạng thái', pid: 'PID', uptime: 'Thời gian hoạt động', port: 'Cổng', host: 'Máy chủ', start: 'Khởi động', stop: 'Dừng', restart: 'Khởi động lại', forceKill: 'Buộc dừng', viewLogs: 'Xem nhật ký', starting: 'Đang khởi động...', stopping: 'Đang dừng...', restarting: 'Đang khởi động lại...', loadFail: 'Tải trạng thái thất bại', healthCheck: 'Kiểm tra sức khỏe', healthOk: 'Hoạt động bình thường', healthFail: 'Không phản hồi' },
es: { title: 'Gestión de servicios', desc: 'Iniciar, detener y monitorear servicios OpenClaw', gatewayTitle: 'Servicio Gateway', guardianTitle: 'Servicio Guardian', status: 'Estado', pid: 'PID', uptime: 'Tiempo activo', port: 'Puerto', host: 'Host', start: 'Iniciar', stop: 'Detener', restart: 'Reiniciar', forceKill: 'Forzar cierre', viewLogs: 'Ver registros', starting: 'Iniciando...', stopping: 'Deteniendo...', restarting: 'Reiniciando...', loadFail: 'Error al cargar estado', healthCheck: 'Verificación de salud', healthOk: 'Funcionando correctamente', healthFail: 'Sin respuesta' },
pt: { title: 'Gestão de serviços', desc: 'Iniciar, parar e monitorar serviços OpenClaw', gatewayTitle: 'Serviço Gateway', guardianTitle: 'Serviço Guardian', status: 'Status', pid: 'PID', uptime: 'Tempo ativo', port: 'Porta', host: 'Host', start: 'Iniciar', stop: 'Parar', restart: 'Reiniciar', forceKill: 'Forçar encerramento', viewLogs: 'Ver logs', starting: 'Iniciando...', stopping: 'Parando...', restarting: 'Reiniciando...', loadFail: 'Falha ao carregar status', healthCheck: 'Verificação de saúde', healthOk: 'Funcionando normalmente', healthFail: 'Sem resposta' },
ru: { title: 'Управление сервисами', desc: 'Запуск, остановка и мониторинг сервисов OpenClaw', gatewayTitle: 'Сервис Gateway', guardianTitle: 'Сервис Guardian', status: 'Статус', pid: 'PID', uptime: 'Время работы', port: 'Порт', host: 'Хост', start: 'Запустить', stop: 'Остановить', restart: 'Перезапустить', forceKill: 'Принудительное завершение', viewLogs: 'Смотреть журналы', starting: 'Запуск...', stopping: 'Остановка...', restarting: 'Перезапуск...', loadFail: 'Ошибка загрузки статуса', healthCheck: 'Проверка состояния', healthOk: 'Работает нормально', healthFail: 'Нет ответа' },
fr: { title: 'Gestion des services', desc: 'Démarrer, arrêter et surveiller les services OpenClaw', gatewayTitle: 'Service Gateway', guardianTitle: 'Service Guardian', status: 'Statut', pid: 'PID', uptime: 'Temps de fonctionnement', port: 'Port', host: 'Hôte', start: 'Démarrer', stop: 'Arrêter', restart: 'Redémarrer', forceKill: 'Forcer la fermeture', viewLogs: 'Voir les journaux', starting: 'Démarrage...', stopping: 'Arrêt...', restarting: 'Redémarrage...', loadFail: 'Échec du chargement du statut', healthCheck: 'Vérification de santé', healthOk: 'Fonctionne normalement', healthFail: 'Pas de réponse' },
de: { title: 'Dienstverwaltung', desc: 'OpenClaw-Dienste starten, stoppen und überwachen', gatewayTitle: 'Gateway-Dienst', guardianTitle: 'Guardian-Dienst', status: 'Status', pid: 'PID', uptime: 'Betriebszeit', port: 'Port', host: 'Host', start: 'Starten', stop: 'Stoppen', restart: 'Neustarten', forceKill: 'Erzwungen beenden', viewLogs: 'Protokolle ansehen', starting: 'Wird gestartet...', stopping: 'Wird gestoppt...', restarting: 'Wird neugestartet...', loadFail: 'Status laden fehlgeschlagen', healthCheck: 'Zustandsprüfung', healthOk: 'Läuft normal', healthFail: 'Keine Antwort' },
}
// ── settings (core keys) ──
const settings = {
vi: { title: 'Cài đặt panel', desc: 'Quản lý cài đặt mạng, proxy và nguồn tải xuống', networkProxy: 'Proxy mạng', modelProxy: 'Proxy yêu cầu mô hình', npmRegistry: 'npm Registry', language: 'Ngôn ngữ hiển thị', languageHint: 'Chuyển đổi ngôn ngữ giao diện.', testProxy: 'Kiểm tra kết nối', clearProxy: 'Tắt proxy', resetDefault: 'Khôi phục mặc định', restarting: 'Đang khởi động lại...' },
es: { title: 'Configuración del panel', desc: 'Gestionar configuración de red, proxy y fuentes de descarga', networkProxy: 'Proxy de red', modelProxy: 'Proxy de solicitudes de modelo', npmRegistry: 'npm Registry', language: 'Idioma de visualización', languageHint: 'Cambiar el idioma de la interfaz.', testProxy: 'Probar conexión', clearProxy: 'Desactivar proxy', resetDefault: 'Restaurar predeterminado', restarting: 'Reiniciando...' },
pt: { title: 'Configurações do painel', desc: 'Gerenciar configurações de rede, proxy e fontes de download', networkProxy: 'Proxy de rede', modelProxy: 'Proxy de solicitações de modelo', npmRegistry: 'npm Registry', language: 'Idioma de exibição', languageHint: 'Alterar o idioma da interface.', testProxy: 'Testar conexão', clearProxy: 'Desativar proxy', resetDefault: 'Restaurar padrão', restarting: 'Reiniciando...' },
ru: { title: 'Настройки панели', desc: 'Управление сетью, прокси и источниками загрузки', networkProxy: 'Сетевой прокси', modelProxy: 'Прокси для запросов моделей', npmRegistry: 'npm Registry', language: 'Язык интерфейса', languageHint: 'Переключить язык интерфейса.', testProxy: 'Проверить подключение', clearProxy: 'Отключить прокси', resetDefault: 'Восстановить по умолчанию', restarting: 'Перезапуск...' },
fr: { title: 'Paramètres du panneau', desc: 'Gérer les paramètres réseau, proxy et sources de téléchargement', networkProxy: 'Proxy réseau', modelProxy: 'Proxy des requêtes de modèle', npmRegistry: 'npm Registry', language: "Langue d'affichage", languageHint: "Changer la langue de l'interface.", testProxy: 'Tester la connexion', clearProxy: 'Désactiver le proxy', resetDefault: 'Restaurer les paramètres par défaut', restarting: 'Redémarrage...' },
de: { title: 'Panel-Einstellungen', desc: 'Netzwerk-, Proxy- und Download-Einstellungen verwalten', networkProxy: 'Netzwerk-Proxy', modelProxy: 'Modell-Anfrage-Proxy', npmRegistry: 'npm Registry', language: 'Anzeigesprache', languageHint: 'Sprache der Benutzeroberfläche wechseln.', testProxy: 'Verbindung testen', clearProxy: 'Proxy deaktivieren', resetDefault: 'Standard wiederherstellen', restarting: 'Wird neugestartet...' },
}
// ── agents (core keys) ──
const agents = {
vi: { title: 'Quản lý Agent', desc: 'Tạo và quản lý OpenClaw Agent', addAgent: '+ Agent mới', noAgents: 'Không có Agent', loadFailed: 'Tải thất bại', default: 'Mặc định', backup: 'Sao lưu', edit: 'Sửa', delete: 'Xóa', notSet: 'Chưa đặt', addTitle: 'Agent mới', agentId: 'Agent ID', agentName: 'Tên', agentModel: 'Mô hình', created: 'Agent đã tạo', createFailed: 'Tạo thất bại', editTitle: 'Sửa Agent — {id}', updated: 'Đã cập nhật', updateFailed: 'Cập nhật thất bại', deleted: 'Đã xóa', deleteFailed: 'Xóa thất bại' },
es: { title: 'Gestión de Agentes', desc: 'Crear y gestionar OpenClaw Agents', addAgent: '+ Nuevo Agent', noAgents: 'Sin Agentes', loadFailed: 'Error al cargar', default: 'Predeterminado', backup: 'Respaldo', edit: 'Editar', delete: 'Eliminar', notSet: 'No configurado', addTitle: 'Nuevo Agent', agentId: 'Agent ID', agentName: 'Nombre', agentModel: 'Modelo', created: 'Agent creado', createFailed: 'Error al crear', editTitle: 'Editar Agent — {id}', updated: 'Actualizado', updateFailed: 'Error al actualizar', deleted: 'Eliminado', deleteFailed: 'Error al eliminar' },
pt: { title: 'Gestão de Agentes', desc: 'Criar e gerenciar OpenClaw Agents', addAgent: '+ Novo Agent', noAgents: 'Sem Agentes', loadFailed: 'Falha ao carregar', default: 'Padrão', backup: 'Backup', edit: 'Editar', delete: 'Excluir', notSet: 'Não definido', addTitle: 'Novo Agent', agentId: 'Agent ID', agentName: 'Nome', agentModel: 'Modelo', created: 'Agent criado', createFailed: 'Falha ao criar', editTitle: 'Editar Agent — {id}', updated: 'Atualizado', updateFailed: 'Falha ao atualizar', deleted: 'Excluído', deleteFailed: 'Falha ao excluir' },
ru: { title: 'Управление агентами', desc: 'Создание и управление агентами OpenClaw', addAgent: '+ Новый агент', noAgents: 'Нет агентов', loadFailed: 'Ошибка загрузки', default: 'По умолчанию', backup: 'Резервная копия', edit: 'Редактировать', delete: 'Удалить', notSet: 'Не задано', addTitle: 'Новый агент', agentId: 'ID агента', agentName: 'Имя', agentModel: 'Модель', created: 'Агент создан', createFailed: 'Ошибка создания', editTitle: 'Редактировать агента — {id}', updated: 'Обновлено', updateFailed: 'Ошибка обновления', deleted: 'Удалён', deleteFailed: 'Ошибка удаления' },
fr: { title: 'Gestion des Agents', desc: 'Créer et gérer les Agents OpenClaw', addAgent: '+ Nouvel Agent', noAgents: 'Aucun Agent', loadFailed: 'Échec du chargement', default: 'Par défaut', backup: 'Sauvegarde', edit: 'Modifier', delete: 'Supprimer', notSet: 'Non défini', addTitle: 'Nouvel Agent', agentId: 'ID Agent', agentName: 'Nom', agentModel: 'Modèle', created: 'Agent créé', createFailed: 'Échec de la création', editTitle: "Modifier l'Agent — {id}", updated: 'Mis à jour', updateFailed: 'Échec de la mise à jour', deleted: 'Supprimé', deleteFailed: 'Échec de la suppression' },
de: { title: 'Agenten-Verwaltung', desc: 'OpenClaw-Agenten erstellen und verwalten', addAgent: '+ Neuer Agent', noAgents: 'Keine Agenten', loadFailed: 'Laden fehlgeschlagen', default: 'Standard', backup: 'Backup', edit: 'Bearbeiten', delete: 'Löschen', notSet: 'Nicht gesetzt', addTitle: 'Neuer Agent', agentId: 'Agent-ID', agentName: 'Name', agentModel: 'Modell', created: 'Agent erstellt', createFailed: 'Erstellen fehlgeschlagen', editTitle: 'Agent bearbeiten — {id}', updated: 'Aktualisiert', updateFailed: 'Aktualisierung fehlgeschlagen', deleted: 'Gelöscht', deleteFailed: 'Löschen fehlgeschlagen' },
}
// ── gateway (core keys) ──
const gateway = {
vi: { title: 'Gateway', desc: 'Cấu hình và quản lý Gateway', status: 'Trạng thái', running: 'Đang chạy', stopped: 'Đã dừng', port: 'Cổng', saveConfig: 'Lưu cấu hình', saved: 'Đã lưu cấu hình Gateway', saveFailed: 'Lưu thất bại', restartRequired: 'Cần khởi động lại Gateway', restartNow: 'Khởi động lại ngay', configLoadFail: 'Tải cấu hình thất bại', pairingTitle: 'Ghép nối thiết bị', pairedDevices: 'Thiết bị đã ghép nối', noPairedDevices: 'Chưa có thiết bị ghép nối' },
es: { title: 'Gateway', desc: 'Configurar y gestionar Gateway', status: 'Estado', running: 'Ejecutando', stopped: 'Detenido', port: 'Puerto', saveConfig: 'Guardar configuración', saved: 'Configuración de Gateway guardada', saveFailed: 'Error al guardar', restartRequired: 'Se requiere reiniciar Gateway', restartNow: 'Reiniciar ahora', configLoadFail: 'Error al cargar configuración', pairingTitle: 'Emparejamiento de dispositivos', pairedDevices: 'Dispositivos emparejados', noPairedDevices: 'Sin dispositivos emparejados' },
pt: { title: 'Gateway', desc: 'Configurar e gerenciar Gateway', status: 'Status', running: 'Em execução', stopped: 'Parado', port: 'Porta', saveConfig: 'Salvar configuração', saved: 'Configuração do Gateway salva', saveFailed: 'Falha ao salvar', restartRequired: 'É necessário reiniciar o Gateway', restartNow: 'Reiniciar agora', configLoadFail: 'Falha ao carregar configuração', pairingTitle: 'Pareamento de dispositivos', pairedDevices: 'Dispositivos pareados', noPairedDevices: 'Nenhum dispositivo pareado' },
ru: { title: 'Gateway', desc: 'Настройка и управление Gateway', status: 'Статус', running: 'Работает', stopped: 'Остановлен', port: 'Порт', saveConfig: 'Сохранить настройки', saved: 'Настройки Gateway сохранены', saveFailed: 'Ошибка сохранения', restartRequired: 'Требуется перезапуск Gateway', restartNow: 'Перезапустить сейчас', configLoadFail: 'Ошибка загрузки настроек', pairingTitle: 'Сопряжение устройств', pairedDevices: 'Сопряжённые устройства', noPairedDevices: 'Нет сопряжённых устройств' },
fr: { title: 'Gateway', desc: 'Configurer et gérer Gateway', status: 'Statut', running: 'En cours', stopped: 'Arrêté', port: 'Port', saveConfig: 'Enregistrer la configuration', saved: 'Configuration Gateway enregistrée', saveFailed: 'Échec de la sauvegarde', restartRequired: 'Redémarrage de Gateway requis', restartNow: 'Redémarrer maintenant', configLoadFail: 'Échec du chargement de la configuration', pairingTitle: 'Appairage des appareils', pairedDevices: 'Appareils appairés', noPairedDevices: 'Aucun appareil appairé' },
de: { title: 'Gateway', desc: 'Gateway konfigurieren und verwalten', status: 'Status', running: 'Läuft', stopped: 'Gestoppt', port: 'Port', saveConfig: 'Konfiguration speichern', saved: 'Gateway-Konfiguration gespeichert', saveFailed: 'Speichern fehlgeschlagen', restartRequired: 'Gateway-Neustart erforderlich', restartNow: 'Jetzt neustarten', configLoadFail: 'Konfiguration laden fehlgeschlagen', pairingTitle: 'Gerätekopplung', pairedDevices: 'Gekoppelte Geräte', noPairedDevices: 'Keine gekoppelten Geräte' },
}
// ── models (core keys) ──
const models = {
vi: { title: 'Cấu hình mô hình', desc: 'Quản lý nhà cung cấp và mô hình AI', addProvider: '+ Thêm nhà cung cấp', noProviders: 'Không có nhà cung cấp', providerName: 'Tên nhà cung cấp', baseUrl: 'Base URL', apiKey: 'API Key', models: 'Mô hình', addModel: 'Thêm mô hình', saveProvider: 'Lưu', testConnection: 'Kiểm tra kết nối', testing: 'Đang kiểm tra...', testSuccess: 'Kết nối thành công', testFailed: 'Kết nối thất bại', fetchModels: 'Lấy danh sách mô hình', primaryModel: 'Mô hình chính', enabled: 'Đã bật', disabled: 'Đã tắt', loadFailed: 'Tải cấu hình thất bại' },
es: { title: 'Configuración de modelos', desc: 'Gestionar proveedores y modelos de IA', addProvider: '+ Agregar proveedor', noProviders: 'Sin proveedores', providerName: 'Nombre del proveedor', baseUrl: 'Base URL', apiKey: 'API Key', models: 'Modelos', addModel: 'Agregar modelo', saveProvider: 'Guardar', testConnection: 'Probar conexión', testing: 'Probando...', testSuccess: 'Conexión exitosa', testFailed: 'Conexión fallida', fetchModels: 'Obtener lista de modelos', primaryModel: 'Modelo principal', enabled: 'Habilitado', disabled: 'Deshabilitado', loadFailed: 'Error al cargar configuración' },
pt: { title: 'Configuração de modelos', desc: 'Gerenciar provedores e modelos de IA', addProvider: '+ Adicionar provedor', noProviders: 'Sem provedores', providerName: 'Nome do provedor', baseUrl: 'Base URL', apiKey: 'API Key', models: 'Modelos', addModel: 'Adicionar modelo', saveProvider: 'Salvar', testConnection: 'Testar conexão', testing: 'Testando...', testSuccess: 'Conexão bem-sucedida', testFailed: 'Conexão falhou', fetchModels: 'Obter lista de modelos', primaryModel: 'Modelo principal', enabled: 'Ativado', disabled: 'Desativado', loadFailed: 'Falha ao carregar configuração' },
ru: { title: 'Настройка моделей', desc: 'Управление провайдерами и моделями ИИ', addProvider: '+ Добавить провайдера', noProviders: 'Нет провайдеров', providerName: 'Имя провайдера', baseUrl: 'Base URL', apiKey: 'API Key', models: 'Модели', addModel: 'Добавить модель', saveProvider: 'Сохранить', testConnection: 'Проверить подключение', testing: 'Проверка...', testSuccess: 'Подключение успешно', testFailed: 'Ошибка подключения', fetchModels: 'Получить список моделей', primaryModel: 'Основная модель', enabled: 'Включено', disabled: 'Отключено', loadFailed: 'Ошибка загрузки настроек' },
fr: { title: 'Configuration des modèles', desc: 'Gérer les fournisseurs et modèles IA', addProvider: '+ Ajouter un fournisseur', noProviders: 'Aucun fournisseur', providerName: 'Nom du fournisseur', baseUrl: 'Base URL', apiKey: 'API Key', models: 'Modèles', addModel: 'Ajouter un modèle', saveProvider: 'Enregistrer', testConnection: 'Tester la connexion', testing: 'Test en cours...', testSuccess: 'Connexion réussie', testFailed: 'Connexion échouée', fetchModels: 'Obtenir la liste des modèles', primaryModel: 'Modèle principal', enabled: 'Activé', disabled: 'Désactivé', loadFailed: 'Échec du chargement de la configuration' },
de: { title: 'Modell-Konfiguration', desc: 'KI-Anbieter und Modelle verwalten', addProvider: '+ Anbieter hinzufügen', noProviders: 'Keine Anbieter', providerName: 'Anbietername', baseUrl: 'Base URL', apiKey: 'API Key', models: 'Modelle', addModel: 'Modell hinzufügen', saveProvider: 'Speichern', testConnection: 'Verbindung testen', testing: 'Test läuft...', testSuccess: 'Verbindung erfolgreich', testFailed: 'Verbindung fehlgeschlagen', fetchModels: 'Modellliste abrufen', primaryModel: 'Primäres Modell', enabled: 'Aktiviert', disabled: 'Deaktiviert', loadFailed: 'Konfiguration laden fehlgeschlagen' },
}
// ── security ──
const security = {
vi: { title: 'Bảo mật', desc: 'Quản lý cài đặt bảo mật OpenClaw', toolPermissions: 'Quyền công cụ', savePermissions: 'Lưu quyền', permSaved: 'Quyền đã lưu', loadFailed: 'Tải cài đặt thất bại' },
es: { title: 'Seguridad', desc: 'Gestionar configuración de seguridad de OpenClaw', toolPermissions: 'Permisos de herramientas', savePermissions: 'Guardar permisos', permSaved: 'Permisos guardados', loadFailed: 'Error al cargar configuración' },
pt: { title: 'Segurança', desc: 'Gerenciar configurações de segurança do OpenClaw', toolPermissions: 'Permissões de ferramentas', savePermissions: 'Salvar permissões', permSaved: 'Permissões salvas', loadFailed: 'Falha ao carregar configurações' },
ru: { title: 'Безопасность', desc: 'Управление настройками безопасности OpenClaw', toolPermissions: 'Права инструментов', savePermissions: 'Сохранить права', permSaved: 'Права сохранены', loadFailed: 'Ошибка загрузки настроек' },
fr: { title: 'Sécurité', desc: 'Gérer les paramètres de sécurité OpenClaw', toolPermissions: 'Permissions des outils', savePermissions: 'Enregistrer les permissions', permSaved: 'Permissions enregistrées', loadFailed: 'Échec du chargement de la configuration' },
de: { title: 'Sicherheit', desc: 'OpenClaw-Sicherheitseinstellungen verwalten', toolPermissions: 'Werkzeug-Berechtigungen', savePermissions: 'Berechtigungen speichern', permSaved: 'Berechtigungen gespeichert', loadFailed: 'Einstellungen laden fehlgeschlagen' },
}
// ── memory ──
const memory = {
vi: { title: 'Bộ nhớ', desc: 'Quản lý tệp bộ nhớ Agent', noFiles: 'Không có tệp', view: 'Xem', download: 'Tải xuống', delete: 'Xóa', upload: 'Tải lên', uploading: 'Đang tải...', uploaded: 'Đã tải lên', uploadFailed: 'Tải lên thất bại', deleted: 'Đã xóa', deleteFailed: 'Xóa thất bại', loadFailed: 'Tải thất bại', selectAgent: 'Chọn Agent', searchPlaceholder: 'Tìm kiếm...' },
es: { title: 'Memoria', desc: 'Gestionar archivos de memoria del Agent', noFiles: 'Sin archivos', view: 'Ver', download: 'Descargar', delete: 'Eliminar', upload: 'Subir', uploading: 'Subiendo...', uploaded: 'Subido', uploadFailed: 'Error al subir', deleted: 'Eliminado', deleteFailed: 'Error al eliminar', loadFailed: 'Error al cargar', selectAgent: 'Seleccionar Agent', searchPlaceholder: 'Buscar...' },
pt: { title: 'Memória', desc: 'Gerenciar arquivos de memória do Agent', noFiles: 'Sem arquivos', view: 'Ver', download: 'Baixar', delete: 'Excluir', upload: 'Enviar', uploading: 'Enviando...', uploaded: 'Enviado', uploadFailed: 'Falha ao enviar', deleted: 'Excluído', deleteFailed: 'Falha ao excluir', loadFailed: 'Falha ao carregar', selectAgent: 'Selecionar Agent', searchPlaceholder: 'Pesquisar...' },
ru: { title: 'Память', desc: 'Управление файлами памяти агента', noFiles: 'Нет файлов', view: 'Просмотр', download: 'Скачать', delete: 'Удалить', upload: 'Загрузить', uploading: 'Загрузка...', uploaded: 'Загружено', uploadFailed: 'Ошибка загрузки', deleted: 'Удалено', deleteFailed: 'Ошибка удаления', loadFailed: 'Ошибка загрузки', selectAgent: 'Выбрать агента', searchPlaceholder: 'Поиск...' },
fr: { title: 'Mémoire', desc: "Gérer les fichiers mémoire de l'Agent", noFiles: 'Aucun fichier', view: 'Voir', download: 'Télécharger', delete: 'Supprimer', upload: 'Téléverser', uploading: 'Téléversement...', uploaded: 'Téléversé', uploadFailed: 'Échec du téléversement', deleted: 'Supprimé', deleteFailed: 'Échec de la suppression', loadFailed: 'Échec du chargement', selectAgent: 'Sélectionner Agent', searchPlaceholder: 'Rechercher...' },
de: { title: 'Speicher', desc: 'Agent-Speicherdateien verwalten', noFiles: 'Keine Dateien', view: 'Ansehen', download: 'Herunterladen', delete: 'Löschen', upload: 'Hochladen', uploading: 'Wird hochgeladen...', uploaded: 'Hochgeladen', uploadFailed: 'Hochladen fehlgeschlagen', deleted: 'Gelöscht', deleteFailed: 'Löschen fehlgeschlagen', loadFailed: 'Laden fehlgeschlagen', selectAgent: 'Agent auswählen', searchPlaceholder: 'Suchen...' },
}
// ── usage ──
const usage = {
vi: { title: 'Sử dụng', desc: 'Xem thống kê sử dụng mô hình và token', totalTokens: 'Tổng token', totalRequests: 'Tổng yêu cầu', totalCost: 'Tổng chi phí', today: 'Hôm nay', week: 'Tuần này', month: 'Tháng này', all: 'Tất cả', noData: 'Không có dữ liệu', model: 'Mô hình', tokens: 'Token', loadFailed: 'Tải thất bại', chart: 'Biểu đồ', table: 'Bảng' },
es: { title: 'Uso', desc: 'Ver estadísticas de uso de modelos y tokens', totalTokens: 'Tokens totales', totalRequests: 'Solicitudes totales', totalCost: 'Costo total', today: 'Hoy', week: 'Esta semana', month: 'Este mes', all: 'Todo', noData: 'Sin datos', model: 'Modelo', tokens: 'Tokens', loadFailed: 'Error al cargar', chart: 'Gráfico', table: 'Tabla' },
pt: { title: 'Uso', desc: 'Ver estatísticas de uso de modelos e tokens', totalTokens: 'Total de tokens', totalRequests: 'Total de solicitações', totalCost: 'Custo total', today: 'Hoje', week: 'Esta semana', month: 'Este mês', all: 'Todos', noData: 'Sem dados', model: 'Modelo', tokens: 'Tokens', loadFailed: 'Falha ao carregar', chart: 'Gráfico', table: 'Tabela' },
ru: { title: 'Использование', desc: 'Статистика использования моделей и токенов', totalTokens: 'Всего токенов', totalRequests: 'Всего запросов', totalCost: 'Общая стоимость', today: 'Сегодня', week: 'Эта неделя', month: 'Этот месяц', all: 'Все', noData: 'Нет данных', model: 'Модель', tokens: 'Токены', loadFailed: 'Ошибка загрузки', chart: 'График', table: 'Таблица' },
fr: { title: 'Utilisation', desc: "Voir les statistiques d'utilisation des modèles et tokens", totalTokens: 'Tokens totaux', totalRequests: 'Requêtes totales', totalCost: 'Coût total', today: "Aujourd'hui", week: 'Cette semaine', month: 'Ce mois', all: 'Tout', noData: 'Aucune donnée', model: 'Modèle', tokens: 'Tokens', loadFailed: 'Échec du chargement', chart: 'Graphique', table: 'Tableau' },
de: { title: 'Nutzung', desc: 'Modell- und Token-Nutzungsstatistiken anzeigen', totalTokens: 'Gesamte Tokens', totalRequests: 'Gesamte Anfragen', totalCost: 'Gesamtkosten', today: 'Heute', week: 'Diese Woche', month: 'Dieser Monat', all: 'Alle', noData: 'Keine Daten', model: 'Modell', tokens: 'Tokens', loadFailed: 'Laden fehlgeschlagen', chart: 'Diagramm', table: 'Tabelle' },
}
// ── cron ──
const cron = {
vi: { title: 'Tác vụ định kỳ', desc: 'Quản lý tác vụ định kỳ OpenClaw', addTask: '+ Thêm tác vụ', noTasks: 'Không có tác vụ', taskName: 'Tên tác vụ', schedule: 'Lịch trình', status: 'Trạng thái', active: 'Hoạt động', inactive: 'Không hoạt động', edit: 'Sửa', delete: 'Xóa', enable: 'Bật', disable: 'Tắt', runNow: 'Chạy ngay', created: 'Tác vụ đã tạo', deleted: 'Tác vụ đã xóa', loadFailed: 'Tải thất bại' },
es: { title: 'Tareas programadas', desc: 'Gestionar tareas programadas de OpenClaw', addTask: '+ Agregar tarea', noTasks: 'Sin tareas', taskName: 'Nombre de tarea', schedule: 'Programación', status: 'Estado', active: 'Activa', inactive: 'Inactiva', edit: 'Editar', delete: 'Eliminar', enable: 'Habilitar', disable: 'Deshabilitar', runNow: 'Ejecutar ahora', created: 'Tarea creada', deleted: 'Tarea eliminada', loadFailed: 'Error al cargar' },
pt: { title: 'Tarefas agendadas', desc: 'Gerenciar tarefas agendadas do OpenClaw', addTask: '+ Adicionar tarefa', noTasks: 'Sem tarefas', taskName: 'Nome da tarefa', schedule: 'Agendamento', status: 'Status', active: 'Ativa', inactive: 'Inativa', edit: 'Editar', delete: 'Excluir', enable: 'Ativar', disable: 'Desativar', runNow: 'Executar agora', created: 'Tarefa criada', deleted: 'Tarefa excluída', loadFailed: 'Falha ao carregar' },
ru: { title: 'Планировщик', desc: 'Управление периодическими задачами OpenClaw', addTask: '+ Добавить задачу', noTasks: 'Нет задач', taskName: 'Имя задачи', schedule: 'Расписание', status: 'Статус', active: 'Активна', inactive: 'Неактивна', edit: 'Редактировать', delete: 'Удалить', enable: 'Включить', disable: 'Отключить', runNow: 'Запустить сейчас', created: 'Задача создана', deleted: 'Задача удалена', loadFailed: 'Ошибка загрузки' },
fr: { title: 'Tâches planifiées', desc: 'Gérer les tâches planifiées OpenClaw', addTask: '+ Ajouter une tâche', noTasks: 'Aucune tâche', taskName: 'Nom de la tâche', schedule: 'Planification', status: 'Statut', active: 'Active', inactive: 'Inactive', edit: 'Modifier', delete: 'Supprimer', enable: 'Activer', disable: 'Désactiver', runNow: 'Exécuter maintenant', created: 'Tâche créée', deleted: 'Tâche supprimée', loadFailed: 'Échec du chargement' },
de: { title: 'Geplante Aufgaben', desc: 'OpenClaw-Aufgaben verwalten', addTask: '+ Aufgabe hinzufügen', noTasks: 'Keine Aufgaben', taskName: 'Aufgabenname', schedule: 'Zeitplan', status: 'Status', active: 'Aktiv', inactive: 'Inaktiv', edit: 'Bearbeiten', delete: 'Löschen', enable: 'Aktivieren', disable: 'Deaktivieren', runNow: 'Jetzt ausführen', created: 'Aufgabe erstellt', deleted: 'Aufgabe gelöscht', loadFailed: 'Laden fehlgeschlagen' },
}
// ── skills ──
const skills = {
vi: { title: 'Skills', desc: 'Quản lý và cài đặt OpenClaw Skills', installed: 'Đã cài', available: 'Có sẵn', noSkills: 'Không có Skills', install: 'Cài đặt', uninstall: 'Gỡ cài đặt', update: 'Cập nhật', search: 'Tìm kiếm Skills...', installing: 'Đang cài...', installSuccess: 'Đã cài đặt', installFailed: 'Cài đặt thất bại', loadFailed: 'Tải thất bại', noResults: 'Không có kết quả', refreshList: 'Làm mới danh sách', checkUpdates: 'Kiểm tra cập nhật', noUpdates: 'Đã cập nhật' },
es: { title: 'Skills', desc: 'Gestionar e instalar OpenClaw Skills', installed: 'Instalados', available: 'Disponibles', noSkills: 'Sin Skills', install: 'Instalar', uninstall: 'Desinstalar', update: 'Actualizar', search: 'Buscar Skills...', installing: 'Instalando...', installSuccess: 'Instalado', installFailed: 'Error al instalar', loadFailed: 'Error al cargar', noResults: 'Sin resultados', refreshList: 'Actualizar lista', checkUpdates: 'Buscar actualizaciones', noUpdates: 'Todo actualizado' },
pt: { title: 'Skills', desc: 'Gerenciar e instalar OpenClaw Skills', installed: 'Instalados', available: 'Disponíveis', noSkills: 'Sem Skills', install: 'Instalar', uninstall: 'Desinstalar', update: 'Atualizar', search: 'Pesquisar Skills...', installing: 'Instalando...', installSuccess: 'Instalado', installFailed: 'Falha ao instalar', loadFailed: 'Falha ao carregar', noResults: 'Sem resultados', refreshList: 'Atualizar lista', checkUpdates: 'Verificar atualizações', noUpdates: 'Tudo atualizado' },
ru: { title: 'Skills', desc: 'Управление и установка навыков OpenClaw', installed: 'Установленные', available: 'Доступные', noSkills: 'Нет навыков', install: 'Установить', uninstall: 'Удалить', update: 'Обновить', search: 'Поиск Skills...', installing: 'Установка...', installSuccess: 'Установлено', installFailed: 'Ошибка установки', loadFailed: 'Ошибка загрузки', noResults: 'Ничего не найдено', refreshList: 'Обновить список', checkUpdates: 'Проверить обновления', noUpdates: 'Всё обновлено' },
fr: { title: 'Skills', desc: 'Gérer et installer les Skills OpenClaw', installed: 'Installés', available: 'Disponibles', noSkills: 'Aucun Skill', install: 'Installer', uninstall: 'Désinstaller', update: 'Mettre à jour', search: 'Rechercher Skills...', installing: 'Installation...', installSuccess: 'Installé', installFailed: "Échec de l'installation", loadFailed: 'Échec du chargement', noResults: 'Aucun résultat', refreshList: 'Actualiser la liste', checkUpdates: 'Vérifier les mises à jour', noUpdates: 'Tout est à jour' },
de: { title: 'Skills', desc: 'OpenClaw Skills verwalten und installieren', installed: 'Installiert', available: 'Verfügbar', noSkills: 'Keine Skills', install: 'Installieren', uninstall: 'Deinstallieren', update: 'Aktualisieren', search: 'Skills suchen...', installing: 'Wird installiert...', installSuccess: 'Installiert', installFailed: 'Installation fehlgeschlagen', loadFailed: 'Laden fehlgeschlagen', noResults: 'Keine Ergebnisse', refreshList: 'Liste aktualisieren', checkUpdates: 'Nach Updates suchen', noUpdates: 'Alles aktuell' },
}
// ── ext ──
const ext = {
vi: { title: 'Công cụ mở rộng', desc: 'Quản lý cftunnel và ClawApp', cftunnelTitle: 'cftunnel', clawappTitle: 'ClawApp', installBtn: 'Cài đặt nhanh', status: 'Trạng thái', running: 'Đang chạy', stopped: 'Đã dừng', version: 'Phiên bản', startTunnel: 'Bắt đầu tunnel', stopTunnel: 'Dừng tunnel', start: 'Khởi động', stop: 'Dừng', installing: 'Đang cài đặt...', installDone: 'Cài đặt hoàn tất', installFailed: 'Cài đặt thất bại' },
es: { title: 'Herramientas de extensión', desc: 'Gestionar cftunnel y ClawApp', cftunnelTitle: 'cftunnel', clawappTitle: 'ClawApp', installBtn: 'Instalación rápida', status: 'Estado', running: 'Ejecutando', stopped: 'Detenido', version: 'Versión', startTunnel: 'Iniciar túnel', stopTunnel: 'Detener túnel', start: 'Iniciar', stop: 'Detener', installing: 'Instalando...', installDone: 'Instalación completada', installFailed: 'Instalación fallida' },
pt: { title: 'Ferramentas de extensão', desc: 'Gerenciar cftunnel e ClawApp', cftunnelTitle: 'cftunnel', clawappTitle: 'ClawApp', installBtn: 'Instalação rápida', status: 'Status', running: 'Em execução', stopped: 'Parado', version: 'Versão', startTunnel: 'Iniciar túnel', stopTunnel: 'Parar túnel', start: 'Iniciar', stop: 'Parar', installing: 'Instalando...', installDone: 'Instalação concluída', installFailed: 'Instalação falhou' },
ru: { title: 'Расширения', desc: 'Управление cftunnel и ClawApp', cftunnelTitle: 'cftunnel', clawappTitle: 'ClawApp', installBtn: 'Быстрая установка', status: 'Статус', running: 'Работает', stopped: 'Остановлен', version: 'Версия', startTunnel: 'Запустить туннель', stopTunnel: 'Остановить туннель', start: 'Запустить', stop: 'Остановить', installing: 'Установка...', installDone: 'Установка завершена', installFailed: 'Ошибка установки' },
fr: { title: 'Outils additionnels', desc: 'Gérer cftunnel et ClawApp', cftunnelTitle: 'cftunnel', clawappTitle: 'ClawApp', installBtn: 'Installation rapide', status: 'Statut', running: 'En cours', stopped: 'Arrêté', version: 'Version', startTunnel: 'Démarrer le tunnel', stopTunnel: 'Arrêter le tunnel', start: 'Démarrer', stop: 'Arrêter', installing: 'Installation...', installDone: 'Installation terminée', installFailed: "Échec de l'installation" },
de: { title: 'Erweiterungstools', desc: 'cftunnel und ClawApp verwalten', cftunnelTitle: 'cftunnel', clawappTitle: 'ClawApp', installBtn: 'Schnellinstallation', status: 'Status', running: 'Läuft', stopped: 'Gestoppt', version: 'Version', startTunnel: 'Tunnel starten', stopTunnel: 'Tunnel stoppen', start: 'Starten', stop: 'Stoppen', installing: 'Wird installiert...', installDone: 'Installation abgeschlossen', installFailed: 'Installation fehlgeschlagen' },
}
// Write medium modules
for (const mod of [
['dashboard', dashboard], ['services', services], ['settings', settings],
['agents', agents], ['gateway', gateway], ['models', models],
['security', security], ['memory', memory], ['usage', usage],
['cron', cron], ['skills', skills], ['ext', ext],
]) {
for (const lang of LANGS) {
if (mod[1][lang]) w(lang, mod[0], mod[1][lang])
}
}
console.log('✓ Medium modules: dashboard, services, settings, agents, gateway, models, security, memory, usage, cron, skills, ext (6 langs)')
// ── communication ──
const communication = {
vi: { title: 'Truyền thông & Tự động hóa', desc: 'Cấu hình kênh thông báo và quy tắc tự động', notifyTitle: 'Kênh thông báo', automationTitle: 'Quy tắc tự động', addChannel: '+ Thêm kênh', addRule: '+ Thêm quy tắc', noChannels: 'Không có kênh', noRules: 'Không có quy tắc', channelName: 'Tên kênh', enabled: 'Đã bật', disabled: 'Đã tắt', test: 'Gửi thử', testing: 'Đang thử...', testSuccess: 'Gửi thử thành công', testFailed: 'Gửi thử thất bại', save: 'Lưu', saved: 'Đã lưu', saveFailed: 'Lưu thất bại', delete: 'Xóa', deleted: 'Đã xóa', deleteFailed: 'Xóa thất bại', loadFailed: 'Tải thất bại', trigger: 'Kích hoạt', action: 'Hành động', selectAgent: 'Chọn Agent', approve: 'Phê duyệt' },
es: { title: 'Comunicación y Automatización', desc: 'Configurar canales de notificación y reglas de automatización', notifyTitle: 'Canales de notificación', automationTitle: 'Reglas de automatización', addChannel: '+ Agregar canal', addRule: '+ Agregar regla', noChannels: 'Sin canales', noRules: 'Sin reglas', channelName: 'Nombre del canal', enabled: 'Habilitado', disabled: 'Deshabilitado', test: 'Enviar prueba', testing: 'Probando...', testSuccess: 'Prueba exitosa', testFailed: 'Prueba fallida', save: 'Guardar', saved: 'Guardado', saveFailed: 'Error al guardar', delete: 'Eliminar', deleted: 'Eliminado', deleteFailed: 'Error al eliminar', loadFailed: 'Error al cargar', trigger: 'Activador', action: 'Acción', selectAgent: 'Seleccionar Agent', approve: 'Aprobar' },
pt: { title: 'Comunicação e Automação', desc: 'Configurar canais de notificação e regras de automação', notifyTitle: 'Canais de notificação', automationTitle: 'Regras de automação', addChannel: '+ Adicionar canal', addRule: '+ Adicionar regra', noChannels: 'Sem canais', noRules: 'Sem regras', channelName: 'Nome do canal', enabled: 'Ativado', disabled: 'Desativado', test: 'Enviar teste', testing: 'Testando...', testSuccess: 'Teste bem-sucedido', testFailed: 'Teste falhou', save: 'Salvar', saved: 'Salvo', saveFailed: 'Falha ao salvar', delete: 'Excluir', deleted: 'Excluído', deleteFailed: 'Falha ao excluir', loadFailed: 'Falha ao carregar', trigger: 'Gatilho', action: 'Ação', selectAgent: 'Selecionar Agent', approve: 'Aprovar' },
ru: { title: 'Коммуникации и автоматизация', desc: 'Настройка каналов уведомлений и правил автоматизации', notifyTitle: 'Каналы уведомлений', automationTitle: 'Правила автоматизации', addChannel: '+ Добавить канал', addRule: '+ Добавить правило', noChannels: 'Нет каналов', noRules: 'Нет правил', channelName: 'Имя канала', enabled: 'Включено', disabled: 'Отключено', test: 'Тестовая отправка', testing: 'Тестирование...', testSuccess: 'Тест успешен', testFailed: 'Тест не удался', save: 'Сохранить', saved: 'Сохранено', saveFailed: 'Ошибка сохранения', delete: 'Удалить', deleted: 'Удалено', deleteFailed: 'Ошибка удаления', loadFailed: 'Ошибка загрузки', trigger: 'Триггер', action: 'Действие', selectAgent: 'Выбрать агента', approve: 'Одобрить' },
fr: { title: 'Communication et Automatisation', desc: 'Configurer les canaux de notification et les règles d\'automatisation', notifyTitle: 'Canaux de notification', automationTitle: 'Règles d\'automatisation', addChannel: '+ Ajouter un canal', addRule: '+ Ajouter une règle', noChannels: 'Aucun canal', noRules: 'Aucune règle', channelName: 'Nom du canal', enabled: 'Activé', disabled: 'Désactivé', test: 'Envoyer un test', testing: 'Test en cours...', testSuccess: 'Test réussi', testFailed: 'Test échoué', save: 'Enregistrer', saved: 'Enregistré', saveFailed: 'Échec de la sauvegarde', delete: 'Supprimer', deleted: 'Supprimé', deleteFailed: 'Échec de la suppression', loadFailed: 'Échec du chargement', trigger: 'Déclencheur', action: 'Action', selectAgent: 'Sélectionner Agent', approve: 'Approuver' },
de: { title: 'Kommunikation & Automatisierung', desc: 'Benachrichtigungskanäle und Automatisierungsregeln konfigurieren', notifyTitle: 'Benachrichtigungskanäle', automationTitle: 'Automatisierungsregeln', addChannel: '+ Kanal hinzufügen', addRule: '+ Regel hinzufügen', noChannels: 'Keine Kanäle', noRules: 'Keine Regeln', channelName: 'Kanalname', enabled: 'Aktiviert', disabled: 'Deaktiviert', test: 'Test senden', testing: 'Wird getestet...', testSuccess: 'Test erfolgreich', testFailed: 'Test fehlgeschlagen', save: 'Speichern', saved: 'Gespeichert', saveFailed: 'Speichern fehlgeschlagen', delete: 'Löschen', deleted: 'Gelöscht', deleteFailed: 'Löschen fehlgeschlagen', loadFailed: 'Laden fehlgeschlagen', trigger: 'Auslöser', action: 'Aktion', selectAgent: 'Agent auswählen', approve: 'Genehmigen' },
}
// ── channels (core keys) ──
const channels = {
vi: { title: 'Kênh', desc: 'Quản lý kênh tin nhắn và kết nối nền tảng', addChannel: '+ Thêm kênh', noChannels: 'Không có kênh', channelName: 'Tên kênh', platform: 'Nền tảng', status: 'Trạng thái', connected: 'Đã kết nối', disconnected: 'Chưa kết nối', edit: 'Sửa', delete: 'Xóa', save: 'Lưu', saved: 'Đã lưu', saveFailed: 'Lưu thất bại', deleted: 'Đã xóa', loadFailed: 'Tải thất bại', testConnection: 'Kiểm tra kết nối', testing: 'Đang kiểm tra...', testSuccess: 'Kết nối thành công', testFailed: 'Kết nối thất bại', bindAgent: 'Liên kết Agent', selectAgent: 'Chọn Agent', pairingTitle: 'Ghép nối', approve: 'Phê duyệt', configTitle: 'Cấu hình kênh', restartRequired: 'Cần khởi động lại Gateway', installPlugin: 'Cài đặt plugin', installing: 'Đang cài đặt...', installSuccess: 'Cài đặt thành công', installFailed: 'Cài đặt thất bại' },
es: { title: 'Canales', desc: 'Gestionar canales de mensajería y conexiones de plataforma', addChannel: '+ Agregar canal', noChannels: 'Sin canales', channelName: 'Nombre del canal', platform: 'Plataforma', status: 'Estado', connected: 'Conectado', disconnected: 'Desconectado', edit: 'Editar', delete: 'Eliminar', save: 'Guardar', saved: 'Guardado', saveFailed: 'Error al guardar', deleted: 'Eliminado', loadFailed: 'Error al cargar', testConnection: 'Probar conexión', testing: 'Probando...', testSuccess: 'Conexión exitosa', testFailed: 'Conexión fallida', bindAgent: 'Vincular Agent', selectAgent: 'Seleccionar Agent', pairingTitle: 'Emparejamiento', approve: 'Aprobar', configTitle: 'Configuración del canal', restartRequired: 'Se requiere reiniciar Gateway', installPlugin: 'Instalar plugin', installing: 'Instalando...', installSuccess: 'Instalado', installFailed: 'Instalación fallida' },
pt: { title: 'Canais', desc: 'Gerenciar canais de mensagens e conexões de plataforma', addChannel: '+ Adicionar canal', noChannels: 'Sem canais', channelName: 'Nome do canal', platform: 'Plataforma', status: 'Status', connected: 'Conectado', disconnected: 'Desconectado', edit: 'Editar', delete: 'Excluir', save: 'Salvar', saved: 'Salvo', saveFailed: 'Falha ao salvar', deleted: 'Excluído', loadFailed: 'Falha ao carregar', testConnection: 'Testar conexão', testing: 'Testando...', testSuccess: 'Conexão bem-sucedida', testFailed: 'Conexão falhou', bindAgent: 'Vincular Agent', selectAgent: 'Selecionar Agent', pairingTitle: 'Pareamento', approve: 'Aprovar', configTitle: 'Configuração do canal', restartRequired: 'É necessário reiniciar o Gateway', installPlugin: 'Instalar plugin', installing: 'Instalando...', installSuccess: 'Instalado', installFailed: 'Instalação falhou' },
ru: { title: 'Каналы', desc: 'Управление каналами сообщений и подключение платформ', addChannel: '+ Добавить канал', noChannels: 'Нет каналов', channelName: 'Имя канала', platform: 'Платформа', status: 'Статус', connected: 'Подключён', disconnected: 'Отключён', edit: 'Редактировать', delete: 'Удалить', save: 'Сохранить', saved: 'Сохранено', saveFailed: 'Ошибка сохранения', deleted: 'Удалено', loadFailed: 'Ошибка загрузки', testConnection: 'Проверить подключение', testing: 'Проверка...', testSuccess: 'Подключение успешно', testFailed: 'Ошибка подключения', bindAgent: 'Привязать агента', selectAgent: 'Выбрать агента', pairingTitle: 'Сопряжение', approve: 'Одобрить', configTitle: 'Настройка канала', restartRequired: 'Требуется перезапуск Gateway', installPlugin: 'Установить плагин', installing: 'Установка...', installSuccess: 'Установлено', installFailed: 'Ошибка установки' },
fr: { title: 'Canaux', desc: 'Gérer les canaux de messagerie et les connexions de plateforme', addChannel: '+ Ajouter un canal', noChannels: 'Aucun canal', channelName: 'Nom du canal', platform: 'Plateforme', status: 'Statut', connected: 'Connecté', disconnected: 'Déconnecté', edit: 'Modifier', delete: 'Supprimer', save: 'Enregistrer', saved: 'Enregistré', saveFailed: 'Échec de la sauvegarde', deleted: 'Supprimé', loadFailed: 'Échec du chargement', testConnection: 'Tester la connexion', testing: 'Test en cours...', testSuccess: 'Connexion réussie', testFailed: 'Connexion échouée', bindAgent: 'Lier un Agent', selectAgent: 'Sélectionner Agent', pairingTitle: 'Appairage', approve: 'Approuver', configTitle: 'Configuration du canal', restartRequired: 'Redémarrage de Gateway requis', installPlugin: 'Installer le plugin', installing: 'Installation...', installSuccess: 'Installé', installFailed: "Échec de l'installation" },
de: { title: 'Kanäle', desc: 'Nachrichtenkanäle und Plattformverbindungen verwalten', addChannel: '+ Kanal hinzufügen', noChannels: 'Keine Kanäle', channelName: 'Kanalname', platform: 'Plattform', status: 'Status', connected: 'Verbunden', disconnected: 'Getrennt', edit: 'Bearbeiten', delete: 'Löschen', save: 'Speichern', saved: 'Gespeichert', saveFailed: 'Speichern fehlgeschlagen', deleted: 'Gelöscht', loadFailed: 'Laden fehlgeschlagen', testConnection: 'Verbindung testen', testing: 'Wird getestet...', testSuccess: 'Verbindung erfolgreich', testFailed: 'Verbindung fehlgeschlagen', bindAgent: 'Agent verknüpfen', selectAgent: 'Agent auswählen', pairingTitle: 'Kopplung', approve: 'Genehmigen', configTitle: 'Kanalkonfiguration', restartRequired: 'Gateway-Neustart erforderlich', installPlugin: 'Plugin installieren', installing: 'Wird installiert...', installSuccess: 'Installiert', installFailed: 'Installation fehlgeschlagen' },
}
// ── chat (core keys) ──
const chat = {
vi: { title: 'Trò chuyện trực tiếp', desc: 'Trò chuyện với Agent theo thời gian thực', selectAgent: 'Chọn Agent', connecting: 'Đang kết nối...', connected: 'Đã kết nối', disconnected: 'Đã ngắt kết nối', send: 'Gửi', inputPlaceholder: 'Nhập tin nhắn...', noMessages: 'Không có tin nhắn', clearChat: 'Xóa lịch sử', newSession: 'Phiên mới', noSessions: 'Không có phiên', copyMessage: 'Sao chép', thinking: 'Đang suy nghĩ...', generating: 'Đang tạo...', stop: 'Dừng', regenerate: 'Tạo lại', modelSelect: 'Chọn mô hình', gatewayNotRunning: 'Gateway chưa chạy', startGateway: 'Khởi động Gateway' },
es: { title: 'Chat en vivo', desc: 'Chatear con el Agent en tiempo real', selectAgent: 'Seleccionar Agent', connecting: 'Conectando...', connected: 'Conectado', disconnected: 'Desconectado', send: 'Enviar', inputPlaceholder: 'Escribe un mensaje...', noMessages: 'Sin mensajes', clearChat: 'Limpiar historial', newSession: 'Nueva sesión', noSessions: 'Sin sesiones', copyMessage: 'Copiar', thinking: 'Pensando...', generating: 'Generando...', stop: 'Detener', regenerate: 'Regenerar', modelSelect: 'Seleccionar modelo', gatewayNotRunning: 'Gateway no está ejecutando', startGateway: 'Iniciar Gateway' },
pt: { title: 'Chat ao vivo', desc: 'Conversar com o Agent em tempo real', selectAgent: 'Selecionar Agent', connecting: 'Conectando...', connected: 'Conectado', disconnected: 'Desconectado', send: 'Enviar', inputPlaceholder: 'Digite uma mensagem...', noMessages: 'Sem mensagens', clearChat: 'Limpar histórico', newSession: 'Nova sessão', noSessions: 'Sem sessões', copyMessage: 'Copiar', thinking: 'Pensando...', generating: 'Gerando...', stop: 'Parar', regenerate: 'Regenerar', modelSelect: 'Selecionar modelo', gatewayNotRunning: 'Gateway não está em execução', startGateway: 'Iniciar Gateway' },
ru: { title: 'Живой чат', desc: 'Общение с агентом в реальном времени', selectAgent: 'Выбрать агента', connecting: 'Подключение...', connected: 'Подключено', disconnected: 'Отключено', send: 'Отправить', inputPlaceholder: 'Введите сообщение...', noMessages: 'Нет сообщений', clearChat: 'Очистить историю', newSession: 'Новая сессия', noSessions: 'Нет сессий', copyMessage: 'Копировать', thinking: 'Думает...', generating: 'Генерация...', stop: 'Остановить', regenerate: 'Перегенерировать', modelSelect: 'Выбрать модель', gatewayNotRunning: 'Gateway не запущен', startGateway: 'Запустить Gateway' },
fr: { title: 'Chat en direct', desc: "Discuter avec l'Agent en temps réel", selectAgent: 'Sélectionner Agent', connecting: 'Connexion...', connected: 'Connecté', disconnected: 'Déconnecté', send: 'Envoyer', inputPlaceholder: 'Tapez un message...', noMessages: 'Aucun message', clearChat: "Effacer l'historique", newSession: 'Nouvelle session', noSessions: 'Aucune session', copyMessage: 'Copier', thinking: 'Réflexion...', generating: 'Génération...', stop: 'Arrêter', regenerate: 'Régénérer', modelSelect: 'Sélectionner un modèle', gatewayNotRunning: "Gateway n'est pas en cours d'exécution", startGateway: 'Démarrer Gateway' },
de: { title: 'Live-Chat', desc: 'Mit dem Agenten in Echtzeit chatten', selectAgent: 'Agent auswählen', connecting: 'Verbindung wird hergestellt...', connected: 'Verbunden', disconnected: 'Getrennt', send: 'Senden', inputPlaceholder: 'Nachricht eingeben...', noMessages: 'Keine Nachrichten', clearChat: 'Verlauf löschen', newSession: 'Neue Sitzung', noSessions: 'Keine Sitzungen', copyMessage: 'Kopieren', thinking: 'Denkt nach...', generating: 'Wird generiert...', stop: 'Stoppen', regenerate: 'Neu generieren', modelSelect: 'Modell auswählen', gatewayNotRunning: 'Gateway läuft nicht', startGateway: 'Gateway starten' },
}
// ── chatDebug (core keys) ──
const chatDebug = {
vi: { title: 'Chẩn đoán hệ thống', desc: 'Chẩn đoán kết nối WebSocket và gỡ lỗi mạng', wsStatus: 'Trạng thái WebSocket', wsConnect: 'Kết nối', wsDisconnect: 'Ngắt kết nối', wsConnected: 'Đã kết nối', wsDisconnected: 'Chưa kết nối', wsConnecting: 'Đang kết nối...', wsError: 'Lỗi WebSocket', networkLogTitle: 'Nhật ký yêu cầu mạng', noRequests: 'Không có yêu cầu', totalRequests: 'Tổng yêu cầu', fixStarting: 'Bắt đầu sửa chữa...', fixFailed: 'Sửa chữa thất bại' },
es: { title: 'Diagnóstico del sistema', desc: 'Diagnóstico de conexión WebSocket y depuración de red', wsStatus: 'Estado WebSocket', wsConnect: 'Conectar', wsDisconnect: 'Desconectar', wsConnected: 'Conectado', wsDisconnected: 'No conectado', wsConnecting: 'Conectando...', wsError: 'Error WebSocket', networkLogTitle: 'Registro de solicitudes de red', noRequests: 'Sin solicitudes', totalRequests: 'Total de solicitudes', fixStarting: 'Iniciando reparación...', fixFailed: 'Reparación fallida' },
pt: { title: 'Diagnóstico do sistema', desc: 'Diagnóstico de conexão WebSocket e depuração de rede', wsStatus: 'Status WebSocket', wsConnect: 'Conectar', wsDisconnect: 'Desconectar', wsConnected: 'Conectado', wsDisconnected: 'Não conectado', wsConnecting: 'Conectando...', wsError: 'Erro WebSocket', networkLogTitle: 'Log de solicitações de rede', noRequests: 'Sem solicitações', totalRequests: 'Total de solicitações', fixStarting: 'Iniciando reparo...', fixFailed: 'Reparo falhou' },
ru: { title: 'Диагностика системы', desc: 'Диагностика WebSocket и отладка сети', wsStatus: 'Статус WebSocket', wsConnect: 'Подключить', wsDisconnect: 'Отключить', wsConnected: 'Подключено', wsDisconnected: 'Не подключено', wsConnecting: 'Подключение...', wsError: 'Ошибка WebSocket', networkLogTitle: 'Журнал сетевых запросов', noRequests: 'Нет запросов', totalRequests: 'Всего запросов', fixStarting: 'Начинаем исправление...', fixFailed: 'Исправление не удалось' },
fr: { title: 'Diagnostic système', desc: 'Diagnostic de connexion WebSocket et débogage réseau', wsStatus: 'Statut WebSocket', wsConnect: 'Connecter', wsDisconnect: 'Déconnecter', wsConnected: 'Connecté', wsDisconnected: 'Non connecté', wsConnecting: 'Connexion...', wsError: 'Erreur WebSocket', networkLogTitle: 'Journal des requêtes réseau', noRequests: 'Aucune requête', totalRequests: 'Total des requêtes', fixStarting: 'Début de la réparation...', fixFailed: 'Réparation échouée' },
de: { title: 'Systemdiagnose', desc: 'WebSocket-Verbindungsdiagnose und Netzwerk-Debugging', wsStatus: 'WebSocket-Status', wsConnect: 'Verbinden', wsDisconnect: 'Trennen', wsConnected: 'Verbunden', wsDisconnected: 'Nicht verbunden', wsConnecting: 'Verbindung wird hergestellt...', wsError: 'WebSocket-Fehler', networkLogTitle: 'Netzwerkanfrage-Protokoll', noRequests: 'Keine Anfragen', totalRequests: 'Gesamte Anfragen', fixStarting: 'Reparatur wird gestartet...', fixFailed: 'Reparatur fehlgeschlagen' },
}
// ── setup (core keys) ──
const setup = {
vi: { title: 'Thiết lập ban đầu', desc: 'Cài đặt và cấu hình OpenClaw', headerTitle: 'Chào mừng đến ClawPanel', recheck: 'Kiểm tra lại', stepNode: 'Môi trường Node.js', installed: 'Đã cài đặt', downloadNode: 'Tải Node.js', stepGit: 'Git', stepConfig: 'Tệp cấu hình', saveBtn: 'Lưu', resetDefaultBtn: 'Khôi phục mặc định', aiAssistant: 'Trợ lý AI', openAiAssistant: 'Mở trợ lý AI', nextStepsTitle: 'Bước tiếp theo', configModels: 'Cấu hình mô hình', gatewaySetup: 'Cấu hình Gateway', messageChannels: 'Kênh', enterPanel: 'Vào panel', installBtn: 'Cài đặt nhanh', installOpenclaw: 'Cài đặt OpenClaw', installComplete: 'Cài đặt hoàn tất' },
es: { title: 'Configuración inicial', desc: 'Instalar y configurar OpenClaw', headerTitle: 'Bienvenido a ClawPanel', recheck: 'Verificar de nuevo', stepNode: 'Entorno Node.js', installed: 'Instalado', downloadNode: 'Descargar Node.js', stepGit: 'Git', stepConfig: 'Archivo de configuración', saveBtn: 'Guardar', resetDefaultBtn: 'Restaurar predeterminado', aiAssistant: 'Asistente IA', openAiAssistant: 'Abrir asistente IA', nextStepsTitle: 'Próximos pasos', configModels: 'Configurar modelos', gatewaySetup: 'Configurar Gateway', messageChannels: 'Canales', enterPanel: 'Entrar al panel', installBtn: 'Instalación rápida', installOpenclaw: 'Instalar OpenClaw', installComplete: 'Instalación completada' },
pt: { title: 'Configuração inicial', desc: 'Instalar e configurar OpenClaw', headerTitle: 'Bem-vindo ao ClawPanel', recheck: 'Verificar novamente', stepNode: 'Ambiente Node.js', installed: 'Instalado', downloadNode: 'Baixar Node.js', stepGit: 'Git', stepConfig: 'Arquivo de configuração', saveBtn: 'Salvar', resetDefaultBtn: 'Restaurar padrão', aiAssistant: 'Assistente IA', openAiAssistant: 'Abrir assistente IA', nextStepsTitle: 'Próximos passos', configModels: 'Configurar modelos', gatewaySetup: 'Configurar Gateway', messageChannels: 'Canais', enterPanel: 'Entrar no painel', installBtn: 'Instalação rápida', installOpenclaw: 'Instalar OpenClaw', installComplete: 'Instalação concluída' },
ru: { title: 'Начальная настройка', desc: 'Установка и настройка OpenClaw', headerTitle: 'Добро пожаловать в ClawPanel', recheck: 'Проверить снова', stepNode: 'Среда Node.js', installed: 'Установлено', downloadNode: 'Скачать Node.js', stepGit: 'Git', stepConfig: 'Файл конфигурации', saveBtn: 'Сохранить', resetDefaultBtn: 'Восстановить по умолчанию', aiAssistant: 'ИИ-ассистент', openAiAssistant: 'Открыть ИИ-ассистента', nextStepsTitle: 'Следующие шаги', configModels: 'Настроить модели', gatewaySetup: 'Настроить Gateway', messageChannels: 'Каналы', enterPanel: 'Войти в панель', installBtn: 'Быстрая установка', installOpenclaw: 'Установить OpenClaw', installComplete: 'Установка завершена' },
fr: { title: 'Configuration initiale', desc: 'Installer et configurer OpenClaw', headerTitle: 'Bienvenue sur ClawPanel', recheck: 'Revérifier', stepNode: 'Environnement Node.js', installed: 'Installé', downloadNode: 'Télécharger Node.js', stepGit: 'Git', stepConfig: 'Fichier de configuration', saveBtn: 'Enregistrer', resetDefaultBtn: 'Restaurer les paramètres par défaut', aiAssistant: 'Assistant IA', openAiAssistant: "Ouvrir l'assistant IA", nextStepsTitle: 'Étapes suivantes', configModels: 'Configurer les modèles', gatewaySetup: 'Configurer Gateway', messageChannels: 'Canaux', enterPanel: 'Entrer dans le panneau', installBtn: 'Installation rapide', installOpenclaw: 'Installer OpenClaw', installComplete: 'Installation terminée' },
de: { title: 'Ersteinrichtung', desc: 'OpenClaw installieren und konfigurieren', headerTitle: 'Willkommen bei ClawPanel', recheck: 'Erneut prüfen', stepNode: 'Node.js-Umgebung', installed: 'Installiert', downloadNode: 'Node.js herunterladen', stepGit: 'Git', stepConfig: 'Konfigurationsdatei', saveBtn: 'Speichern', resetDefaultBtn: 'Standard wiederherstellen', aiAssistant: 'KI-Assistent', openAiAssistant: 'KI-Assistent öffnen', nextStepsTitle: 'Nächste Schritte', configModels: 'Modelle konfigurieren', gatewaySetup: 'Gateway konfigurieren', messageChannels: 'Kanäle', enterPanel: 'Panel betreten', installBtn: 'Schnellinstallation', installOpenclaw: 'OpenClaw installieren', installComplete: 'Installation abgeschlossen' },
}
// ── about (core keys) ──
const about = {
vi: { title: 'Giới thiệu', desc: 'Thông tin phiên bản và dự án ClawPanel', subtitle: 'Bảng quản lý trực quan OpenClaw', sectionCommunity: 'Cộng đồng', sectionContribute: 'Đóng góp', sectionLinks: 'Liên kết', checkingUpdate: 'Đang kiểm tra cập nhật...', official: 'Chính thức', notInstalled: 'Chưa cài đặt', versionLabel: 'Phiên bản', recommended: 'Khuyến nghị', current: 'Hiện tại', upToDate: 'Đã cập nhật', checkUpdateFailed: 'Kiểm tra cập nhật thất bại', submitIssue: 'Gửi Issue', submitPR: 'Gửi PR', officialWebsite: 'Trang web chính thức', openSourceRepo: 'Kho mã nguồn mở' },
es: { title: 'Acerca de', desc: 'Información de versión y proyecto de ClawPanel', subtitle: 'Panel de gestión visual de OpenClaw', sectionCommunity: 'Comunidad', sectionContribute: 'Contribuir', sectionLinks: 'Enlaces', checkingUpdate: 'Verificando actualizaciones...', official: 'Oficial', notInstalled: 'No instalado', versionLabel: 'Versión', recommended: 'Recomendado', current: 'Actual', upToDate: 'Actualizado', checkUpdateFailed: 'Error al verificar actualizaciones', submitIssue: 'Enviar Issue', submitPR: 'Enviar PR', officialWebsite: 'Sitio web oficial', openSourceRepo: 'Repositorio de código abierto' },
pt: { title: 'Sobre', desc: 'Informações de versão e projeto do ClawPanel', subtitle: 'Painel de gestão visual do OpenClaw', sectionCommunity: 'Comunidade', sectionContribute: 'Contribuir', sectionLinks: 'Links', checkingUpdate: 'Verificando atualizações...', official: 'Oficial', notInstalled: 'Não instalado', versionLabel: 'Versão', recommended: 'Recomendado', current: 'Atual', upToDate: 'Atualizado', checkUpdateFailed: 'Falha ao verificar atualizações', submitIssue: 'Enviar Issue', submitPR: 'Enviar PR', officialWebsite: 'Site oficial', openSourceRepo: 'Repositório de código aberto' },
ru: { title: 'О программе', desc: 'Информация о версии и проекте ClawPanel', subtitle: 'Панель визуального управления OpenClaw', sectionCommunity: 'Сообщество', sectionContribute: 'Вклад', sectionLinks: 'Ссылки', checkingUpdate: 'Проверка обновлений...', official: 'Официальный', notInstalled: 'Не установлен', versionLabel: 'Версия', recommended: 'Рекомендуемый', current: 'Текущий', upToDate: 'Актуально', checkUpdateFailed: 'Ошибка проверки обновлений', submitIssue: 'Создать Issue', submitPR: 'Создать PR', officialWebsite: 'Официальный сайт', openSourceRepo: 'Открытый репозиторий' },
fr: { title: 'À propos', desc: 'Informations de version et de projet ClawPanel', subtitle: 'Panneau de gestion visuelle OpenClaw', sectionCommunity: 'Communauté', sectionContribute: 'Contribuer', sectionLinks: 'Liens', checkingUpdate: 'Vérification des mises à jour...', official: 'Officiel', notInstalled: 'Non installé', versionLabel: 'Version', recommended: 'Recommandé', current: 'Actuel', upToDate: 'À jour', checkUpdateFailed: 'Échec de la vérification des mises à jour', submitIssue: 'Soumettre un Issue', submitPR: 'Soumettre un PR', officialWebsite: 'Site officiel', openSourceRepo: 'Dépôt open source' },
de: { title: 'Über', desc: 'ClawPanel-Version und Projektinformationen', subtitle: 'OpenClaw Visuelles Verwaltungspanel', sectionCommunity: 'Community', sectionContribute: 'Mitwirken', sectionLinks: 'Links', checkingUpdate: 'Suche nach Updates...', official: 'Offiziell', notInstalled: 'Nicht installiert', versionLabel: 'Version', recommended: 'Empfohlen', current: 'Aktuell', upToDate: 'Aktuell', checkUpdateFailed: 'Update-Prüfung fehlgeschlagen', submitIssue: 'Issue einreichen', submitPR: 'PR einreichen', officialWebsite: 'Offizielle Website', openSourceRepo: 'Open-Source-Repository' },
}
// ── assistant (core keys) ──
const assistant = {
vi: { defaultName: 'Trợ lý AI', welcomeText: 'Xin chào! Tôi là trợ lý AI. Tôi có thể giúp gì cho bạn?', loading: 'Đang tải...', settings: 'Cài đặt', settingsTitle: 'Cài đặt trợ lý', settingsSaved: 'Đã lưu cài đặt', model: 'Mô hình', temperature: 'Nhiệt độ', testSuccess: 'Kết nối thành công', testFailed: 'Kết nối thất bại', testing: 'Đang kiểm tra...', testBtn: 'Kiểm tra kết nối', send: 'Gửi', inputPlaceholder: 'Mô tả vấn đề...', stopped: 'Đã dừng', retry: 'Thử lại', copyText: 'Sao chép văn bản', newSession: 'Phiên mới', deleteSession: 'Xóa phiên', noSessions: 'Không có phiên', sessionList: 'Danh sách phiên', aiThinking: 'Đang suy nghĩ...', confirmAllow: 'Cho phép thực thi', toolExecuting: 'Đang thực thi...', toolDone: 'Thực thi hoàn tất' },
es: { defaultName: 'Asistente IA', welcomeText: '¡Hola! Soy el asistente IA. ¿En qué puedo ayudarle?', loading: 'Cargando...', settings: 'Configuración', settingsTitle: 'Configuración del asistente', settingsSaved: 'Configuración guardada', model: 'Modelo', temperature: 'Temperatura', testSuccess: 'Conexión exitosa', testFailed: 'Conexión fallida', testing: 'Probando...', testBtn: 'Probar conexión', send: 'Enviar', inputPlaceholder: 'Describa el problema...', stopped: 'Detenido', retry: 'Reintentar', copyText: 'Copiar texto', newSession: 'Nueva sesión', deleteSession: 'Eliminar sesión', noSessions: 'Sin sesiones', sessionList: 'Lista de sesiones', aiThinking: 'Pensando...', confirmAllow: 'Permitir ejecución', toolExecuting: 'Ejecutando...', toolDone: 'Ejecución completada' },
pt: { defaultName: 'Assistente IA', welcomeText: 'Olá! Sou o assistente IA. Como posso ajudar?', loading: 'Carregando...', settings: 'Configurações', settingsTitle: 'Configurações do assistente', settingsSaved: 'Configurações salvas', model: 'Modelo', temperature: 'Temperatura', testSuccess: 'Conexão bem-sucedida', testFailed: 'Conexão falhou', testing: 'Testando...', testBtn: 'Testar conexão', send: 'Enviar', inputPlaceholder: 'Descreva o problema...', stopped: 'Parado', retry: 'Tentar novamente', copyText: 'Copiar texto', newSession: 'Nova sessão', deleteSession: 'Excluir sessão', noSessions: 'Sem sessões', sessionList: 'Lista de sessões', aiThinking: 'Pensando...', confirmAllow: 'Permitir execução', toolExecuting: 'Executando...', toolDone: 'Execução concluída' },
ru: { defaultName: 'ИИ-ассистент', welcomeText: 'Здравствуйте! Я ИИ-ассистент. Чем могу помочь?', loading: 'Загрузка...', settings: 'Настройки', settingsTitle: 'Настройки ассистента', settingsSaved: 'Настройки сохранены', model: 'Модель', temperature: 'Температура', testSuccess: 'Подключение успешно', testFailed: 'Ошибка подключения', testing: 'Проверка...', testBtn: 'Проверить подключение', send: 'Отправить', inputPlaceholder: 'Опишите проблему...', stopped: 'Остановлено', retry: 'Повторить', copyText: 'Копировать текст', newSession: 'Новая сессия', deleteSession: 'Удалить сессию', noSessions: 'Нет сессий', sessionList: 'Список сессий', aiThinking: 'Думает...', confirmAllow: 'Разрешить выполнение', toolExecuting: 'Выполняется...', toolDone: 'Выполнение завершено' },
fr: { defaultName: 'Assistant IA', welcomeText: 'Bonjour ! Je suis l\'assistant IA. Comment puis-je vous aider ?', loading: 'Chargement...', settings: 'Paramètres', settingsTitle: 'Paramètres de l\'assistant', settingsSaved: 'Paramètres enregistrés', model: 'Modèle', temperature: 'Température', testSuccess: 'Connexion réussie', testFailed: 'Connexion échouée', testing: 'Test en cours...', testBtn: 'Tester la connexion', send: 'Envoyer', inputPlaceholder: 'Décrivez le problème...', stopped: 'Arrêté', retry: 'Réessayer', copyText: 'Copier le texte', newSession: 'Nouvelle session', deleteSession: 'Supprimer la session', noSessions: 'Aucune session', sessionList: 'Liste des sessions', aiThinking: 'Réflexion...', confirmAllow: "Autoriser l'exécution", toolExecuting: 'Exécution...', toolDone: 'Exécution terminée' },
de: { defaultName: 'KI-Assistent', welcomeText: 'Hallo! Ich bin der KI-Assistent. Wie kann ich Ihnen helfen?', loading: 'Laden...', settings: 'Einstellungen', settingsTitle: 'Assistenten-Einstellungen', settingsSaved: 'Einstellungen gespeichert', model: 'Modell', temperature: 'Temperatur', testSuccess: 'Verbindung erfolgreich', testFailed: 'Verbindung fehlgeschlagen', testing: 'Wird getestet...', testBtn: 'Verbindung testen', send: 'Senden', inputPlaceholder: 'Problem beschreiben...', stopped: 'Gestoppt', retry: 'Wiederholen', copyText: 'Text kopieren', newSession: 'Neue Sitzung', deleteSession: 'Sitzung löschen', noSessions: 'Keine Sitzungen', sessionList: 'Sitzungsliste', aiThinking: 'Denkt nach...', confirmAllow: 'Ausführung erlauben', toolExecuting: 'Wird ausgeführt...', toolDone: 'Ausführung abgeschlossen' },
}
// Write large modules
for (const mod of [
['communication', communication], ['channels', channels], ['chat', chat],
['chatDebug', chatDebug], ['setup', setup], ['about', about], ['assistant', assistant],
]) {
for (const lang of LANGS) {
if (mod[1][lang]) w(lang, mod[0], mod[1][lang])
}
}
console.log('✓ Large modules: communication, channels, chat, chatDebug, setup, about, assistant (6 langs)')
console.log('✓ All 18 modules × 6 languages = patch files generated')

165
scripts/split-locales.cjs Normal file
View File

@@ -0,0 +1,165 @@
/**
* 迁移脚本:将单体 JSON 语言包拆分为模块化 JS 文件
* 读取 11 种语言 JSON → 生成 src/locales/modules/*.js
*/
const fs = require('fs')
const path = require('path')
const LOCALES_DIR = path.resolve(__dirname, '../src/locales')
const MODULES_DIR = path.resolve(LOCALES_DIR, 'modules')
function readLang(file) {
const p = path.join(LOCALES_DIR, file)
return fs.existsSync(p) ? JSON.parse(fs.readFileSync(p, 'utf8')) : {}
}
const zhCN = readLang('zh-CN.json')
const en = readLang('en.json')
const zhTW = readLang('zh-TW.json')
const ja = readLang('ja.json')
const ko = readLang('ko.json')
const vi = readLang('vi.json')
const es = readLang('es.json')
const pt = readLang('pt.json')
const ru = readLang('ru.json')
const fr = readLang('fr.json')
const de = readLang('de.json')
// 模块名映射JSON key → 文件名)
const MODULE_FILE_MAP = {
common: 'common',
sidebar: 'sidebar',
instance: 'instance',
dashboard: 'dashboard',
services: 'services',
settings: 'settings',
models: 'models',
agents: 'agents',
gateway: 'gateway',
security: 'security',
communication: 'communication',
channels: 'channels',
memory: 'memory',
cron: 'cron',
usage: 'usage',
skills: 'skills',
chat: 'chat',
chatDebug: 'chat-debug',
setup: 'setup',
about: 'about',
ext: 'ext',
logs: 'logs',
assistant: 'assistant',
toast: 'toast',
modal: 'modal',
}
// 确保输出目录存在
if (!fs.existsSync(MODULES_DIR)) {
fs.mkdirSync(MODULES_DIR, { recursive: true })
}
// 转义 JS 字符串中的特殊字符
function escapeStr(s) {
if (typeof s !== 'string') return ''
return s
.replace(/\\/g, '\\\\')
.replace(/'/g, "\\'")
.replace(/\n/g, '\\n')
.replace(/\r/g, '')
}
// 参数顺序: zhCN, en, zhTW, ja, ko, vi, es, pt, ru, fr, de
const LANG_ORDER = [
{ key: 'zhCN', fallback: null },
{ key: 'en', fallback: null },
{ key: 'zhTW', fallback: 'zhCN' },
{ key: 'ja', fallback: 'en' },
{ key: 'ko', fallback: 'en' },
{ key: 'vi', fallback: 'en' },
{ key: 'es', fallback: 'en' },
{ key: 'pt', fallback: 'en' },
{ key: 'ru', fallback: 'en' },
{ key: 'fr', fallback: 'en' },
{ key: 'de', fallback: 'en' },
]
// 生成一个模块的 JS 源码11 语言)
function generateModule(sectionKey, sections) {
const keys = Object.keys(sections.zhCN)
const lines = []
lines.push("import { _ } from '../helper.js'")
lines.push('')
lines.push('export default {')
for (const key of keys) {
const vals = {}
for (const { key: lk } of LANG_ORDER) {
vals[lk] = (sections[lk] && sections[lk][key]) || ''
}
// 计算可省略的参数(和 fallback 相同时省略)
const params = LANG_ORDER.map(({ key: lk, fallback }) => {
if (!fallback) return vals[lk] // zhCN, en 必填
return vals[lk] === vals[fallback] ? '' : vals[lk]
})
// 从尾部截断空参数
let lastNonEmpty = 1 // 至少保留 zhCN + en
for (let i = params.length - 1; i >= 2; i--) {
if (params[i]) { lastNonEmpty = i; break }
}
const parts = params.slice(0, lastNonEmpty + 1).map(v => `'${escapeStr(v)}'`)
lines.push(` ${safeKey(key)}: _(${parts.join(', ')}),`)
}
lines.push('}')
lines.push('')
return lines.join('\n')
}
// 确保 key 是合法的 JS 标识符,否则加引号
function safeKey(key) {
if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key)) return key
return `'${key}'`
}
let totalKeys = 0
let fileCount = 0
for (const [sectionKey, fileName] of Object.entries(MODULE_FILE_MAP)) {
const zhCNSection = zhCN[sectionKey]
if (!zhCNSection) {
console.warn(`⚠ Section "${sectionKey}" not found in zh-CN.json, skipping`)
continue
}
const sections = {
zhCN: zhCNSection,
en: en[sectionKey] || {},
zhTW: zhTW[sectionKey] || {},
ja: ja[sectionKey] || {},
ko: ko[sectionKey] || {},
vi: vi[sectionKey] || {},
es: es[sectionKey] || {},
pt: pt[sectionKey] || {},
ru: ru[sectionKey] || {},
fr: fr[sectionKey] || {},
de: de[sectionKey] || {},
}
const source = generateModule(sectionKey, sections)
const outPath = path.join(MODULES_DIR, `${fileName}.js`)
fs.writeFileSync(outPath, source, 'utf8')
const keyCount = Object.keys(zhCNSection).length
totalKeys += keyCount
fileCount++
console.log(`${fileName}.js (${keyCount} keys)`)
}
console.log(`\n✓ Done: ${fileCount} module files, ${totalKeys} total keys`)
console.log(` Output: ${MODULES_DIR}`)

View File

@@ -0,0 +1,24 @@
{
"title": "Über",
"desc": "ClawPanel-Version und Projektinformationen",
"subtitle": "OpenClaw Visuelles Verwaltungspanel",
"sectionCommunity": "Community",
"sectionContribute": "Mitwirken",
"sectionLinks": "Links",
"checkingUpdate": "Suche nach Updates...",
"official": "Offiziell",
"notInstalled": "Nicht installiert",
"versionLabel": "Version",
"recommended": "Empfohlen",
"current": "Aktuell",
"upToDate": "Aktuell",
"checkUpdateFailed": "Update-Prüfung fehlgeschlagen",
"joinDiscord": "Discord beitreten",
"discordDesc": "Internationale Community",
"communityWelcome": "Willkommen in der OpenClaw-Community! Melden Sie Probleme jederzeit, lassen Sie uns gemeinsam AI-Agenten verbessern.",
"communityWelcomeIntl": "Welcome to the OpenClaw community! Share ideas, get help, and build amazing AI agents together.",
"submitIssue": "Issue einreichen",
"submitPR": "PR einreichen",
"officialWebsite": "Offizielle Website",
"openSourceRepo": "Open-Source-Repository"
}

View File

@@ -0,0 +1,23 @@
{
"title": "Agenten-Verwaltung",
"desc": "OpenClaw-Agenten erstellen und verwalten",
"addAgent": "+ Neuer Agent",
"noAgents": "Keine Agenten",
"loadFailed": "Laden fehlgeschlagen",
"default": "Standard",
"backup": "Backup",
"edit": "Bearbeiten",
"delete": "Löschen",
"notSet": "Nicht gesetzt",
"addTitle": "Neuer Agent",
"agentId": "Agent-ID",
"agentName": "Name",
"agentModel": "Modell",
"created": "Agent erstellt",
"createFailed": "Erstellen fehlgeschlagen",
"editTitle": "Agent bearbeiten — {id}",
"updated": "Aktualisiert",
"updateFailed": "Aktualisierung fehlgeschlagen",
"deleted": "Gelöscht",
"deleteFailed": "Löschen fehlgeschlagen"
}

View File

@@ -0,0 +1,27 @@
{
"defaultName": "KI-Assistent",
"welcomeText": "Hallo! Ich bin der KI-Assistent. Wie kann ich Ihnen helfen?",
"loading": "Laden...",
"settings": "Einstellungen",
"settingsTitle": "Assistenten-Einstellungen",
"settingsSaved": "Einstellungen gespeichert",
"model": "Modell",
"temperature": "Temperatur",
"testSuccess": "Verbindung erfolgreich",
"testFailed": "Verbindung fehlgeschlagen",
"testing": "Wird getestet...",
"testBtn": "Verbindung testen",
"send": "Senden",
"inputPlaceholder": "Problem beschreiben...",
"stopped": "Gestoppt",
"retry": "Wiederholen",
"copyText": "Text kopieren",
"newSession": "Neue Sitzung",
"deleteSession": "Sitzung löschen",
"noSessions": "Keine Sitzungen",
"sessionList": "Sitzungsliste",
"aiThinking": "Denkt nach...",
"confirmAllow": "Ausführung erlauben",
"toolExecuting": "Wird ausgeführt...",
"toolDone": "Ausführung abgeschlossen"
}

View File

@@ -0,0 +1,32 @@
{
"title": "Kanäle",
"desc": "Nachrichtenkanäle und Plattformverbindungen verwalten",
"addChannel": "+ Kanal hinzufügen",
"noChannels": "Keine Kanäle",
"channelName": "Kanalname",
"platform": "Plattform",
"status": "Status",
"connected": "Verbunden",
"disconnected": "Getrennt",
"edit": "Bearbeiten",
"delete": "Löschen",
"save": "Speichern",
"saved": "Gespeichert",
"saveFailed": "Speichern fehlgeschlagen",
"deleted": "Gelöscht",
"loadFailed": "Laden fehlgeschlagen",
"testConnection": "Verbindung testen",
"testing": "Wird getestet...",
"testSuccess": "Verbindung erfolgreich",
"testFailed": "Verbindung fehlgeschlagen",
"bindAgent": "Agent verknüpfen",
"selectAgent": "Agent auswählen",
"pairingTitle": "Kopplung",
"approve": "Genehmigen",
"configTitle": "Kanalkonfiguration",
"restartRequired": "Gateway-Neustart erforderlich",
"installPlugin": "Plugin installieren",
"installing": "Wird installiert...",
"installSuccess": "Installiert",
"installFailed": "Installation fehlgeschlagen"
}

View File

@@ -0,0 +1,22 @@
{
"title": "Live-Chat",
"desc": "Mit dem Agenten in Echtzeit chatten",
"selectAgent": "Agent auswählen",
"connecting": "Verbindung wird hergestellt...",
"connected": "Verbunden",
"disconnected": "Getrennt",
"send": "Senden",
"inputPlaceholder": "Nachricht eingeben...",
"noMessages": "Keine Nachrichten",
"clearChat": "Verlauf löschen",
"newSession": "Neue Sitzung",
"noSessions": "Keine Sitzungen",
"copyMessage": "Kopieren",
"thinking": "Denkt nach...",
"generating": "Wird generiert...",
"stop": "Stoppen",
"regenerate": "Neu generieren",
"modelSelect": "Modell auswählen",
"gatewayNotRunning": "Gateway läuft nicht",
"startGateway": "Gateway starten"
}

View File

@@ -0,0 +1,16 @@
{
"title": "Systemdiagnose",
"desc": "WebSocket-Verbindungsdiagnose und Netzwerk-Debugging",
"wsStatus": "WebSocket-Status",
"wsConnect": "Verbinden",
"wsDisconnect": "Trennen",
"wsConnected": "Verbunden",
"wsDisconnected": "Nicht verbunden",
"wsConnecting": "Verbindung wird hergestellt...",
"wsError": "WebSocket-Fehler",
"networkLogTitle": "Netzwerkanfrage-Protokoll",
"noRequests": "Keine Anfragen",
"totalRequests": "Gesamte Anfragen",
"fixStarting": "Reparatur wird gestartet...",
"fixFailed": "Reparatur fehlgeschlagen"
}

View File

@@ -0,0 +1,42 @@
{
"save": "Speichern",
"cancel": "Abbrechen",
"confirm": "Bestätigen",
"delete": "Löschen",
"edit": "Bearbeiten",
"add": "Hinzufügen",
"close": "Schließen",
"loading": "Laden...",
"retry": "Wiederholen",
"copy": "Kopieren",
"copied": "Kopiert",
"search": "Suchen",
"refresh": "Aktualisieren",
"back": "Zurück",
"submit": "Absenden",
"reset": "Zurücksetzen",
"enabled": "Aktiviert",
"disabled": "Deaktiviert",
"unknown": "Unbekannt",
"none": "Keine",
"yes": "Ja",
"no": "Nein",
"online": "Online",
"offline": "Offline",
"running": "Läuft",
"stopped": "Gestoppt",
"error": "Fehler",
"success": "Erfolg",
"warning": "Warnung",
"info": "Info",
"loadFailed": "Laden fehlgeschlagen",
"saveFailed": "Speichern fehlgeschlagen",
"saveSuccess": "Erfolgreich gespeichert",
"operationFailed": "Vorgang fehlgeschlagen",
"operationSuccess": "Vorgang erfolgreich",
"noData": "Keine Daten",
"unit": "",
"survivalRate": "Verfügbarkeit",
"settings": "Einstellungen",
"update": "Aktualisieren"
}

View File

@@ -0,0 +1,28 @@
{
"title": "Kommunikation & Automatisierung",
"desc": "Benachrichtigungskanäle und Automatisierungsregeln konfigurieren",
"notifyTitle": "Benachrichtigungskanäle",
"automationTitle": "Automatisierungsregeln",
"addChannel": "+ Kanal hinzufügen",
"addRule": "+ Regel hinzufügen",
"noChannels": "Keine Kanäle",
"noRules": "Keine Regeln",
"channelName": "Kanalname",
"enabled": "Aktiviert",
"disabled": "Deaktiviert",
"test": "Test senden",
"testing": "Wird getestet...",
"testSuccess": "Test erfolgreich",
"testFailed": "Test fehlgeschlagen",
"save": "Speichern",
"saved": "Gespeichert",
"saveFailed": "Speichern fehlgeschlagen",
"delete": "Löschen",
"deleted": "Gelöscht",
"deleteFailed": "Löschen fehlgeschlagen",
"loadFailed": "Laden fehlgeschlagen",
"trigger": "Auslöser",
"action": "Aktion",
"selectAgent": "Agent auswählen",
"approve": "Genehmigen"
}

View File

@@ -0,0 +1,19 @@
{
"title": "Geplante Aufgaben",
"desc": "OpenClaw-Aufgaben verwalten",
"addTask": "+ Aufgabe hinzufügen",
"noTasks": "Keine Aufgaben",
"taskName": "Aufgabenname",
"schedule": "Zeitplan",
"status": "Status",
"active": "Aktiv",
"inactive": "Inaktiv",
"edit": "Bearbeiten",
"delete": "Löschen",
"enable": "Aktivieren",
"disable": "Deaktivieren",
"runNow": "Jetzt ausführen",
"created": "Aufgabe erstellt",
"deleted": "Aufgabe gelöscht",
"loadFailed": "Laden fehlgeschlagen"
}

View File

@@ -0,0 +1,32 @@
{
"title": "Dashboard",
"desc": "OpenClaw-Statusübersicht",
"gateway": "Gateway",
"notStarted": "Nicht gestartet",
"versionLabel": "Version",
"agentFleet": "Agent-Flotte",
"defaultAgent": "Standard",
"modelPool": "Modell-Pool",
"baseServices": "Basisdienste",
"controlUI": "Control UI",
"restartGw": "Gateway neustarten",
"checkUpdate": "Updates prüfen",
"createBackup": "Backup erstellen",
"recentLogs": "Aktuelle Protokolle",
"cliPath": "CLI-Pfad",
"retry": "Wiederholen",
"notSet": "Nicht gesetzt",
"port": "Port",
"startBtn": "Starten",
"stopBtn": "Stoppen",
"restartBtn": "Neustarten",
"primaryModel": "Primäres Modell",
"noLogs": "Keine Protokolle",
"starting": "Wird gestartet...",
"stopping": "Wird gestoppt...",
"restarting": "Wird neugestartet...",
"checking": "Wird geprüft...",
"upToDate": "Aktuell",
"backingUp": "Backup wird erstellt...",
"backupFail": "Backup fehlgeschlagen"
}

View File

@@ -0,0 +1,18 @@
{
"title": "Erweiterungstools",
"desc": "cftunnel und ClawApp verwalten",
"cftunnelTitle": "cftunnel",
"clawappTitle": "ClawApp",
"installBtn": "Schnellinstallation",
"status": "Status",
"running": "Läuft",
"stopped": "Gestoppt",
"version": "Version",
"startTunnel": "Tunnel starten",
"stopTunnel": "Tunnel stoppen",
"start": "Starten",
"stop": "Stoppen",
"installing": "Wird installiert...",
"installDone": "Installation abgeschlossen",
"installFailed": "Installation fehlgeschlagen"
}

View File

@@ -0,0 +1,17 @@
{
"title": "Gateway",
"desc": "Gateway konfigurieren und verwalten",
"status": "Status",
"running": "Läuft",
"stopped": "Gestoppt",
"port": "Port",
"saveConfig": "Konfiguration speichern",
"saved": "Gateway-Konfiguration gespeichert",
"saveFailed": "Speichern fehlgeschlagen",
"restartRequired": "Gateway-Neustart erforderlich",
"restartNow": "Jetzt neustarten",
"configLoadFail": "Konfiguration laden fehlgeschlagen",
"pairingTitle": "Gerätekopplung",
"pairedDevices": "Gekoppelte Geräte",
"noPairedDevices": "Keine gekoppelten Geräte"
}

View File

@@ -0,0 +1,11 @@
{
"local": "Lokal",
"remote": "Remote",
"docker": "Docker",
"addInstance": "Instanz hinzufügen",
"addRemote": "Remote-Instanz hinzufügen",
"nameLabel": "Name",
"endpointLabel": "Panel-Adresse",
"adding": "Wird hinzugefügt...",
"current": "Aktuell"
}

View File

@@ -0,0 +1,17 @@
{
"title": "Protokolle",
"desc": "OpenClaw-Protokolle anzeigen",
"tabGateway": "Gateway",
"tabGatewayErr": "Gateway-Fehler",
"tabGuardian": "Guardian",
"tabBackup": "Backup",
"tabAudit": "Audit",
"searchPlaceholder": "Suchen...",
"refresh": "Aktualisieren",
"autoScroll": "Auto-Scrollen",
"loading": "Laden...",
"empty": "Keine Protokolle",
"loadFailed": "Laden fehlgeschlagen",
"noResults": "Keine Ergebnisse",
"searchFailed": "Suche fehlgeschlagen"
}

View File

@@ -0,0 +1,17 @@
{
"title": "Speicher",
"desc": "Agent-Speicherdateien verwalten",
"noFiles": "Keine Dateien",
"view": "Ansehen",
"download": "Herunterladen",
"delete": "Löschen",
"upload": "Hochladen",
"uploading": "Wird hochgeladen...",
"uploaded": "Hochgeladen",
"uploadFailed": "Hochladen fehlgeschlagen",
"deleted": "Gelöscht",
"deleteFailed": "Löschen fehlgeschlagen",
"loadFailed": "Laden fehlgeschlagen",
"selectAgent": "Agent auswählen",
"searchPlaceholder": "Suchen..."
}

View File

@@ -0,0 +1,5 @@
{
"confirmTitle": "Bestätigen",
"confirmOk": "OK",
"confirmCancel": "Abbrechen"
}

View File

@@ -0,0 +1,21 @@
{
"title": "Modell-Konfiguration",
"desc": "KI-Anbieter und Modelle verwalten",
"addProvider": "+ Anbieter hinzufügen",
"noProviders": "Keine Anbieter",
"providerName": "Anbietername",
"baseUrl": "Base URL",
"apiKey": "API Key",
"models": "Modelle",
"addModel": "Modell hinzufügen",
"saveProvider": "Speichern",
"testConnection": "Verbindung testen",
"testing": "Test läuft...",
"testSuccess": "Verbindung erfolgreich",
"testFailed": "Verbindung fehlgeschlagen",
"fetchModels": "Modellliste abrufen",
"primaryModel": "Primäres Modell",
"enabled": "Aktiviert",
"disabled": "Deaktiviert",
"loadFailed": "Konfiguration laden fehlgeschlagen"
}

View File

@@ -0,0 +1,8 @@
{
"title": "Sicherheit",
"desc": "OpenClaw-Sicherheitseinstellungen verwalten",
"toolPermissions": "Werkzeug-Berechtigungen",
"savePermissions": "Berechtigungen speichern",
"permSaved": "Berechtigungen gespeichert",
"loadFailed": "Einstellungen laden fehlgeschlagen"
}

View File

@@ -0,0 +1,23 @@
{
"title": "Dienstverwaltung",
"desc": "OpenClaw-Dienste starten, stoppen und überwachen",
"gatewayTitle": "Gateway-Dienst",
"guardianTitle": "Guardian-Dienst",
"status": "Status",
"pid": "PID",
"uptime": "Betriebszeit",
"port": "Port",
"host": "Host",
"start": "Starten",
"stop": "Stoppen",
"restart": "Neustarten",
"forceKill": "Erzwungen beenden",
"viewLogs": "Protokolle ansehen",
"starting": "Wird gestartet...",
"stopping": "Wird gestoppt...",
"restarting": "Wird neugestartet...",
"loadFail": "Status laden fehlgeschlagen",
"healthCheck": "Zustandsprüfung",
"healthOk": "Läuft normal",
"healthFail": "Keine Antwort"
}

View File

@@ -0,0 +1,13 @@
{
"title": "Panel-Einstellungen",
"desc": "Netzwerk-, Proxy- und Download-Einstellungen verwalten",
"networkProxy": "Netzwerk-Proxy",
"modelProxy": "Modell-Anfrage-Proxy",
"npmRegistry": "npm Registry",
"language": "Anzeigesprache",
"languageHint": "Sprache der Benutzeroberfläche wechseln.",
"testProxy": "Verbindung testen",
"clearProxy": "Proxy deaktivieren",
"resetDefault": "Standard wiederherstellen",
"restarting": "Wird neugestartet..."
}

View File

@@ -0,0 +1,23 @@
{
"title": "Ersteinrichtung",
"desc": "OpenClaw installieren und konfigurieren",
"headerTitle": "Willkommen bei ClawPanel",
"recheck": "Erneut prüfen",
"stepNode": "Node.js-Umgebung",
"installed": "Installiert",
"downloadNode": "Node.js herunterladen",
"stepGit": "Git",
"stepConfig": "Konfigurationsdatei",
"saveBtn": "Speichern",
"resetDefaultBtn": "Standard wiederherstellen",
"aiAssistant": "KI-Assistent",
"openAiAssistant": "KI-Assistent öffnen",
"nextStepsTitle": "Nächste Schritte",
"configModels": "Modelle konfigurieren",
"gatewaySetup": "Gateway konfigurieren",
"messageChannels": "Kanäle",
"enterPanel": "Panel betreten",
"installBtn": "Schnellinstallation",
"installOpenclaw": "OpenClaw installieren",
"installComplete": "Installation abgeschlossen"
}

View File

@@ -0,0 +1,29 @@
{
"collapse": "Einklappen",
"closeMenu": "Menü schließen",
"themeLight": "Hell",
"themeDark": "Dunkel",
"sectionMonitor": "Überwachung",
"sectionConfig": "Konfiguration",
"sectionData": "Daten",
"sectionExtension": "Erweiterungen",
"dashboard": "Dashboard",
"assistant": "Assistent",
"chat": "Live-Chat",
"services": "Dienste",
"logs": "Protokolle",
"models": "Modelle",
"agents": "Agenten",
"gateway": "Gateway",
"channels": "Kanäle",
"communication": "Kommunikation",
"security": "Sicherheit",
"memory": "Speicher",
"cron": "Geplante Aufgaben",
"usage": "Nutzung",
"skills": "Skills",
"settings": "Einstellungen",
"chatDebug": "Diagnose",
"about": "Über",
"setup": "Ersteinrichtung"
}

View File

@@ -0,0 +1,19 @@
{
"title": "Skills",
"desc": "OpenClaw Skills verwalten und installieren",
"installed": "Installiert",
"available": "Verfügbar",
"noSkills": "Keine Skills",
"install": "Installieren",
"uninstall": "Deinstallieren",
"update": "Aktualisieren",
"search": "Skills suchen...",
"installing": "Wird installiert...",
"installSuccess": "Installiert",
"installFailed": "Installation fehlgeschlagen",
"loadFailed": "Laden fehlgeschlagen",
"noResults": "Keine Ergebnisse",
"refreshList": "Liste aktualisieren",
"checkUpdates": "Nach Updates suchen",
"noUpdates": "Alles aktuell"
}

View File

@@ -0,0 +1,4 @@
{
"copySuccess": "Kopiert",
"copyFailed": "Kopieren fehlgeschlagen"
}

View File

@@ -0,0 +1,17 @@
{
"title": "Nutzung",
"desc": "Modell- und Token-Nutzungsstatistiken anzeigen",
"totalTokens": "Gesamte Tokens",
"totalRequests": "Gesamte Anfragen",
"totalCost": "Gesamtkosten",
"today": "Heute",
"week": "Diese Woche",
"month": "Dieser Monat",
"all": "Alle",
"noData": "Keine Daten",
"model": "Modell",
"tokens": "Tokens",
"loadFailed": "Laden fehlgeschlagen",
"chart": "Diagramm",
"table": "Tabelle"
}

View File

@@ -0,0 +1,24 @@
{
"title": "Acerca de",
"desc": "Información de versión y proyecto de ClawPanel",
"subtitle": "Panel de gestión visual de OpenClaw",
"sectionCommunity": "Comunidad",
"sectionContribute": "Contribuir",
"sectionLinks": "Enlaces",
"checkingUpdate": "Verificando actualizaciones...",
"official": "Oficial",
"notInstalled": "No instalado",
"versionLabel": "Versión",
"recommended": "Recomendado",
"current": "Actual",
"upToDate": "Actualizado",
"checkUpdateFailed": "Error al verificar actualizaciones",
"joinDiscord": "Unirse a Discord",
"discordDesc": "Comunidad internacional",
"communityWelcome": "¡Bienvenido a la comunidad OpenClaw! Reporta problemas en cualquier momento, hagamos juntos que los AI Agents sean mejores.",
"communityWelcomeIntl": "Welcome to the OpenClaw community! Share ideas, get help, and build amazing AI agents together.",
"submitIssue": "Enviar Issue",
"submitPR": "Enviar PR",
"officialWebsite": "Sitio web oficial",
"openSourceRepo": "Repositorio de código abierto"
}

View File

@@ -0,0 +1,23 @@
{
"title": "Gestión de Agentes",
"desc": "Crear y gestionar OpenClaw Agents",
"addAgent": "+ Nuevo Agent",
"noAgents": "Sin Agentes",
"loadFailed": "Error al cargar",
"default": "Predeterminado",
"backup": "Respaldo",
"edit": "Editar",
"delete": "Eliminar",
"notSet": "No configurado",
"addTitle": "Nuevo Agent",
"agentId": "Agent ID",
"agentName": "Nombre",
"agentModel": "Modelo",
"created": "Agent creado",
"createFailed": "Error al crear",
"editTitle": "Editar Agent — {id}",
"updated": "Actualizado",
"updateFailed": "Error al actualizar",
"deleted": "Eliminado",
"deleteFailed": "Error al eliminar"
}

View File

@@ -0,0 +1,27 @@
{
"defaultName": "Asistente IA",
"welcomeText": "¡Hola! Soy el asistente IA. ¿En qué puedo ayudarle?",
"loading": "Cargando...",
"settings": "Configuración",
"settingsTitle": "Configuración del asistente",
"settingsSaved": "Configuración guardada",
"model": "Modelo",
"temperature": "Temperatura",
"testSuccess": "Conexión exitosa",
"testFailed": "Conexión fallida",
"testing": "Probando...",
"testBtn": "Probar conexión",
"send": "Enviar",
"inputPlaceholder": "Describa el problema...",
"stopped": "Detenido",
"retry": "Reintentar",
"copyText": "Copiar texto",
"newSession": "Nueva sesión",
"deleteSession": "Eliminar sesión",
"noSessions": "Sin sesiones",
"sessionList": "Lista de sesiones",
"aiThinking": "Pensando...",
"confirmAllow": "Permitir ejecución",
"toolExecuting": "Ejecutando...",
"toolDone": "Ejecución completada"
}

View File

@@ -0,0 +1,32 @@
{
"title": "Canales",
"desc": "Gestionar canales de mensajería y conexiones de plataforma",
"addChannel": "+ Agregar canal",
"noChannels": "Sin canales",
"channelName": "Nombre del canal",
"platform": "Plataforma",
"status": "Estado",
"connected": "Conectado",
"disconnected": "Desconectado",
"edit": "Editar",
"delete": "Eliminar",
"save": "Guardar",
"saved": "Guardado",
"saveFailed": "Error al guardar",
"deleted": "Eliminado",
"loadFailed": "Error al cargar",
"testConnection": "Probar conexión",
"testing": "Probando...",
"testSuccess": "Conexión exitosa",
"testFailed": "Conexión fallida",
"bindAgent": "Vincular Agent",
"selectAgent": "Seleccionar Agent",
"pairingTitle": "Emparejamiento",
"approve": "Aprobar",
"configTitle": "Configuración del canal",
"restartRequired": "Se requiere reiniciar Gateway",
"installPlugin": "Instalar plugin",
"installing": "Instalando...",
"installSuccess": "Instalado",
"installFailed": "Instalación fallida"
}

View File

@@ -0,0 +1,22 @@
{
"title": "Chat en vivo",
"desc": "Chatear con el Agent en tiempo real",
"selectAgent": "Seleccionar Agent",
"connecting": "Conectando...",
"connected": "Conectado",
"disconnected": "Desconectado",
"send": "Enviar",
"inputPlaceholder": "Escribe un mensaje...",
"noMessages": "Sin mensajes",
"clearChat": "Limpiar historial",
"newSession": "Nueva sesión",
"noSessions": "Sin sesiones",
"copyMessage": "Copiar",
"thinking": "Pensando...",
"generating": "Generando...",
"stop": "Detener",
"regenerate": "Regenerar",
"modelSelect": "Seleccionar modelo",
"gatewayNotRunning": "Gateway no está ejecutando",
"startGateway": "Iniciar Gateway"
}

View File

@@ -0,0 +1,16 @@
{
"title": "Diagnóstico del sistema",
"desc": "Diagnóstico de conexión WebSocket y depuración de red",
"wsStatus": "Estado WebSocket",
"wsConnect": "Conectar",
"wsDisconnect": "Desconectar",
"wsConnected": "Conectado",
"wsDisconnected": "No conectado",
"wsConnecting": "Conectando...",
"wsError": "Error WebSocket",
"networkLogTitle": "Registro de solicitudes de red",
"noRequests": "Sin solicitudes",
"totalRequests": "Total de solicitudes",
"fixStarting": "Iniciando reparación...",
"fixFailed": "Reparación fallida"
}

View File

@@ -0,0 +1,42 @@
{
"save": "Guardar",
"cancel": "Cancelar",
"confirm": "Confirmar",
"delete": "Eliminar",
"edit": "Editar",
"add": "Agregar",
"close": "Cerrar",
"loading": "Cargando...",
"retry": "Reintentar",
"copy": "Copiar",
"copied": "Copiado",
"search": "Buscar",
"refresh": "Actualizar",
"back": "Volver",
"submit": "Enviar",
"reset": "Restablecer",
"enabled": "Habilitado",
"disabled": "Deshabilitado",
"unknown": "Desconocido",
"none": "Ninguno",
"yes": "Sí",
"no": "No",
"online": "En línea",
"offline": "Fuera de línea",
"running": "Ejecutando",
"stopped": "Detenido",
"error": "Error",
"success": "Éxito",
"warning": "Advertencia",
"info": "Información",
"loadFailed": "Error al cargar",
"saveFailed": "Error al guardar",
"saveSuccess": "Guardado correctamente",
"operationFailed": "Operación fallida",
"operationSuccess": "Operación exitosa",
"noData": "Sin datos",
"unit": "",
"survivalRate": "Disponibilidad",
"settings": "Configuración",
"update": "Actualizar"
}

View File

@@ -0,0 +1,28 @@
{
"title": "Comunicación y Automatización",
"desc": "Configurar canales de notificación y reglas de automatización",
"notifyTitle": "Canales de notificación",
"automationTitle": "Reglas de automatización",
"addChannel": "+ Agregar canal",
"addRule": "+ Agregar regla",
"noChannels": "Sin canales",
"noRules": "Sin reglas",
"channelName": "Nombre del canal",
"enabled": "Habilitado",
"disabled": "Deshabilitado",
"test": "Enviar prueba",
"testing": "Probando...",
"testSuccess": "Prueba exitosa",
"testFailed": "Prueba fallida",
"save": "Guardar",
"saved": "Guardado",
"saveFailed": "Error al guardar",
"delete": "Eliminar",
"deleted": "Eliminado",
"deleteFailed": "Error al eliminar",
"loadFailed": "Error al cargar",
"trigger": "Activador",
"action": "Acción",
"selectAgent": "Seleccionar Agent",
"approve": "Aprobar"
}

View File

@@ -0,0 +1,19 @@
{
"title": "Tareas programadas",
"desc": "Gestionar tareas programadas de OpenClaw",
"addTask": "+ Agregar tarea",
"noTasks": "Sin tareas",
"taskName": "Nombre de tarea",
"schedule": "Programación",
"status": "Estado",
"active": "Activa",
"inactive": "Inactiva",
"edit": "Editar",
"delete": "Eliminar",
"enable": "Habilitar",
"disable": "Deshabilitar",
"runNow": "Ejecutar ahora",
"created": "Tarea creada",
"deleted": "Tarea eliminada",
"loadFailed": "Error al cargar"
}

View File

@@ -0,0 +1,32 @@
{
"title": "Panel",
"desc": "Resumen del estado de OpenClaw",
"gateway": "Gateway",
"notStarted": "No iniciado",
"versionLabel": "Versión",
"agentFleet": "Flota de Agentes",
"defaultAgent": "Predeterminado",
"modelPool": "Pool de modelos",
"baseServices": "Servicios base",
"controlUI": "Control UI",
"restartGw": "Reiniciar Gateway",
"checkUpdate": "Buscar actualizaciones",
"createBackup": "Crear respaldo",
"recentLogs": "Registros recientes",
"cliPath": "Ruta CLI",
"retry": "Reintentar",
"notSet": "No configurado",
"port": "Puerto",
"startBtn": "Iniciar",
"stopBtn": "Detener",
"restartBtn": "Reiniciar",
"primaryModel": "Modelo principal",
"noLogs": "Sin registros",
"starting": "Iniciando...",
"stopping": "Deteniendo...",
"restarting": "Reiniciando...",
"checking": "Verificando...",
"upToDate": "Actualizado",
"backingUp": "Respaldando...",
"backupFail": "Respaldo fallido"
}

View File

@@ -0,0 +1,18 @@
{
"title": "Herramientas de extensión",
"desc": "Gestionar cftunnel y ClawApp",
"cftunnelTitle": "cftunnel",
"clawappTitle": "ClawApp",
"installBtn": "Instalación rápida",
"status": "Estado",
"running": "Ejecutando",
"stopped": "Detenido",
"version": "Versión",
"startTunnel": "Iniciar túnel",
"stopTunnel": "Detener túnel",
"start": "Iniciar",
"stop": "Detener",
"installing": "Instalando...",
"installDone": "Instalación completada",
"installFailed": "Instalación fallida"
}

View File

@@ -0,0 +1,17 @@
{
"title": "Gateway",
"desc": "Configurar y gestionar Gateway",
"status": "Estado",
"running": "Ejecutando",
"stopped": "Detenido",
"port": "Puerto",
"saveConfig": "Guardar configuración",
"saved": "Configuración de Gateway guardada",
"saveFailed": "Error al guardar",
"restartRequired": "Se requiere reiniciar Gateway",
"restartNow": "Reiniciar ahora",
"configLoadFail": "Error al cargar configuración",
"pairingTitle": "Emparejamiento de dispositivos",
"pairedDevices": "Dispositivos emparejados",
"noPairedDevices": "Sin dispositivos emparejados"
}

View File

@@ -0,0 +1,11 @@
{
"local": "Local",
"remote": "Remoto",
"docker": "Docker",
"addInstance": "Agregar instancia",
"addRemote": "Agregar instancia remota",
"nameLabel": "Nombre",
"endpointLabel": "Dirección del panel",
"adding": "Agregando...",
"current": "Actual"
}

View File

@@ -0,0 +1,17 @@
{
"title": "Registros",
"desc": "Ver registros del servicio OpenClaw",
"tabGateway": "Gateway",
"tabGatewayErr": "Errores Gateway",
"tabGuardian": "Guardian",
"tabBackup": "Respaldo",
"tabAudit": "Auditoría",
"searchPlaceholder": "Buscar...",
"refresh": "Actualizar",
"autoScroll": "Auto-desplazar",
"loading": "Cargando...",
"empty": "Sin registros",
"loadFailed": "Error al cargar",
"noResults": "Sin resultados",
"searchFailed": "Búsqueda fallida"
}

View File

@@ -0,0 +1,17 @@
{
"title": "Memoria",
"desc": "Gestionar archivos de memoria del Agent",
"noFiles": "Sin archivos",
"view": "Ver",
"download": "Descargar",
"delete": "Eliminar",
"upload": "Subir",
"uploading": "Subiendo...",
"uploaded": "Subido",
"uploadFailed": "Error al subir",
"deleted": "Eliminado",
"deleteFailed": "Error al eliminar",
"loadFailed": "Error al cargar",
"selectAgent": "Seleccionar Agent",
"searchPlaceholder": "Buscar..."
}

View File

@@ -0,0 +1,5 @@
{
"confirmTitle": "Confirmar",
"confirmOk": "Aceptar",
"confirmCancel": "Cancelar"
}

View File

@@ -0,0 +1,21 @@
{
"title": "Configuración de modelos",
"desc": "Gestionar proveedores y modelos de IA",
"addProvider": "+ Agregar proveedor",
"noProviders": "Sin proveedores",
"providerName": "Nombre del proveedor",
"baseUrl": "Base URL",
"apiKey": "API Key",
"models": "Modelos",
"addModel": "Agregar modelo",
"saveProvider": "Guardar",
"testConnection": "Probar conexión",
"testing": "Probando...",
"testSuccess": "Conexión exitosa",
"testFailed": "Conexión fallida",
"fetchModels": "Obtener lista de modelos",
"primaryModel": "Modelo principal",
"enabled": "Habilitado",
"disabled": "Deshabilitado",
"loadFailed": "Error al cargar configuración"
}

View File

@@ -0,0 +1,8 @@
{
"title": "Seguridad",
"desc": "Gestionar configuración de seguridad de OpenClaw",
"toolPermissions": "Permisos de herramientas",
"savePermissions": "Guardar permisos",
"permSaved": "Permisos guardados",
"loadFailed": "Error al cargar configuración"
}

View File

@@ -0,0 +1,23 @@
{
"title": "Gestión de servicios",
"desc": "Iniciar, detener y monitorear servicios OpenClaw",
"gatewayTitle": "Servicio Gateway",
"guardianTitle": "Servicio Guardian",
"status": "Estado",
"pid": "PID",
"uptime": "Tiempo activo",
"port": "Puerto",
"host": "Host",
"start": "Iniciar",
"stop": "Detener",
"restart": "Reiniciar",
"forceKill": "Forzar cierre",
"viewLogs": "Ver registros",
"starting": "Iniciando...",
"stopping": "Deteniendo...",
"restarting": "Reiniciando...",
"loadFail": "Error al cargar estado",
"healthCheck": "Verificación de salud",
"healthOk": "Funcionando correctamente",
"healthFail": "Sin respuesta"
}

View File

@@ -0,0 +1,13 @@
{
"title": "Configuración del panel",
"desc": "Gestionar configuración de red, proxy y fuentes de descarga",
"networkProxy": "Proxy de red",
"modelProxy": "Proxy de solicitudes de modelo",
"npmRegistry": "npm Registry",
"language": "Idioma de visualización",
"languageHint": "Cambiar el idioma de la interfaz.",
"testProxy": "Probar conexión",
"clearProxy": "Desactivar proxy",
"resetDefault": "Restaurar predeterminado",
"restarting": "Reiniciando..."
}

View File

@@ -0,0 +1,23 @@
{
"title": "Configuración inicial",
"desc": "Instalar y configurar OpenClaw",
"headerTitle": "Bienvenido a ClawPanel",
"recheck": "Verificar de nuevo",
"stepNode": "Entorno Node.js",
"installed": "Instalado",
"downloadNode": "Descargar Node.js",
"stepGit": "Git",
"stepConfig": "Archivo de configuración",
"saveBtn": "Guardar",
"resetDefaultBtn": "Restaurar predeterminado",
"aiAssistant": "Asistente IA",
"openAiAssistant": "Abrir asistente IA",
"nextStepsTitle": "Próximos pasos",
"configModels": "Configurar modelos",
"gatewaySetup": "Configurar Gateway",
"messageChannels": "Canales",
"enterPanel": "Entrar al panel",
"installBtn": "Instalación rápida",
"installOpenclaw": "Instalar OpenClaw",
"installComplete": "Instalación completada"
}

View File

@@ -0,0 +1,29 @@
{
"collapse": "Colapsar",
"closeMenu": "Cerrar menú",
"themeLight": "Claro",
"themeDark": "Oscuro",
"sectionMonitor": "Monitoreo",
"sectionConfig": "Configuración",
"sectionData": "Datos",
"sectionExtension": "Extensiones",
"dashboard": "Panel",
"assistant": "Asistente",
"chat": "Chat",
"services": "Servicios",
"logs": "Registros",
"models": "Modelos",
"agents": "Agentes",
"gateway": "Gateway",
"channels": "Canales",
"communication": "Comunicación",
"security": "Seguridad",
"memory": "Memoria",
"cron": "Tareas",
"usage": "Uso",
"skills": "Skills",
"settings": "Configuración",
"chatDebug": "Diagnóstico",
"about": "Acerca de",
"setup": "Configuración inicial"
}

View File

@@ -0,0 +1,19 @@
{
"title": "Skills",
"desc": "Gestionar e instalar OpenClaw Skills",
"installed": "Instalados",
"available": "Disponibles",
"noSkills": "Sin Skills",
"install": "Instalar",
"uninstall": "Desinstalar",
"update": "Actualizar",
"search": "Buscar Skills...",
"installing": "Instalando...",
"installSuccess": "Instalado",
"installFailed": "Error al instalar",
"loadFailed": "Error al cargar",
"noResults": "Sin resultados",
"refreshList": "Actualizar lista",
"checkUpdates": "Buscar actualizaciones",
"noUpdates": "Todo actualizado"
}

View File

@@ -0,0 +1,4 @@
{
"copySuccess": "Copiado al portapapeles",
"copyFailed": "Error al copiar"
}

View File

@@ -0,0 +1,17 @@
{
"title": "Uso",
"desc": "Ver estadísticas de uso de modelos y tokens",
"totalTokens": "Tokens totales",
"totalRequests": "Solicitudes totales",
"totalCost": "Costo total",
"today": "Hoy",
"week": "Esta semana",
"month": "Este mes",
"all": "Todo",
"noData": "Sin datos",
"model": "Modelo",
"tokens": "Tokens",
"loadFailed": "Error al cargar",
"chart": "Gráfico",
"table": "Tabla"
}

View File

@@ -0,0 +1,24 @@
{
"title": "À propos",
"desc": "Informations de version et de projet ClawPanel",
"subtitle": "Panneau de gestion visuelle OpenClaw",
"sectionCommunity": "Communauté",
"sectionContribute": "Contribuer",
"sectionLinks": "Liens",
"checkingUpdate": "Vérification des mises à jour...",
"official": "Officiel",
"notInstalled": "Non installé",
"versionLabel": "Version",
"recommended": "Recommandé",
"current": "Actuel",
"upToDate": "À jour",
"checkUpdateFailed": "Échec de la vérification des mises à jour",
"joinDiscord": "Rejoindre Discord",
"discordDesc": "Communauté internationale",
"communityWelcome": "Bienvenue dans la communauté OpenClaw ! Signalez les problèmes à tout moment, construisons ensemble de meilleurs agents IA.",
"communityWelcomeIntl": "Welcome to the OpenClaw community! Share ideas, get help, and build amazing AI agents together.",
"submitIssue": "Soumettre un Issue",
"submitPR": "Soumettre un PR",
"officialWebsite": "Site officiel",
"openSourceRepo": "Dépôt open source"
}

View File

@@ -0,0 +1,23 @@
{
"title": "Gestion des Agents",
"desc": "Créer et gérer les Agents OpenClaw",
"addAgent": "+ Nouvel Agent",
"noAgents": "Aucun Agent",
"loadFailed": "Échec du chargement",
"default": "Par défaut",
"backup": "Sauvegarde",
"edit": "Modifier",
"delete": "Supprimer",
"notSet": "Non défini",
"addTitle": "Nouvel Agent",
"agentId": "ID Agent",
"agentName": "Nom",
"agentModel": "Modèle",
"created": "Agent créé",
"createFailed": "Échec de la création",
"editTitle": "Modifier l'Agent — {id}",
"updated": "Mis à jour",
"updateFailed": "Échec de la mise à jour",
"deleted": "Supprimé",
"deleteFailed": "Échec de la suppression"
}

View File

@@ -0,0 +1,27 @@
{
"defaultName": "Assistant IA",
"welcomeText": "Bonjour ! Je suis l'assistant IA. Comment puis-je vous aider ?",
"loading": "Chargement...",
"settings": "Paramètres",
"settingsTitle": "Paramètres de l'assistant",
"settingsSaved": "Paramètres enregistrés",
"model": "Modèle",
"temperature": "Température",
"testSuccess": "Connexion réussie",
"testFailed": "Connexion échouée",
"testing": "Test en cours...",
"testBtn": "Tester la connexion",
"send": "Envoyer",
"inputPlaceholder": "Décrivez le problème...",
"stopped": "Arrêté",
"retry": "Réessayer",
"copyText": "Copier le texte",
"newSession": "Nouvelle session",
"deleteSession": "Supprimer la session",
"noSessions": "Aucune session",
"sessionList": "Liste des sessions",
"aiThinking": "Réflexion...",
"confirmAllow": "Autoriser l'exécution",
"toolExecuting": "Exécution...",
"toolDone": "Exécution terminée"
}

View File

@@ -0,0 +1,32 @@
{
"title": "Canaux",
"desc": "Gérer les canaux de messagerie et les connexions de plateforme",
"addChannel": "+ Ajouter un canal",
"noChannels": "Aucun canal",
"channelName": "Nom du canal",
"platform": "Plateforme",
"status": "Statut",
"connected": "Connecté",
"disconnected": "Déconnecté",
"edit": "Modifier",
"delete": "Supprimer",
"save": "Enregistrer",
"saved": "Enregistré",
"saveFailed": "Échec de la sauvegarde",
"deleted": "Supprimé",
"loadFailed": "Échec du chargement",
"testConnection": "Tester la connexion",
"testing": "Test en cours...",
"testSuccess": "Connexion réussie",
"testFailed": "Connexion échouée",
"bindAgent": "Lier un Agent",
"selectAgent": "Sélectionner Agent",
"pairingTitle": "Appairage",
"approve": "Approuver",
"configTitle": "Configuration du canal",
"restartRequired": "Redémarrage de Gateway requis",
"installPlugin": "Installer le plugin",
"installing": "Installation...",
"installSuccess": "Installé",
"installFailed": "Échec de l'installation"
}

View File

@@ -0,0 +1,22 @@
{
"title": "Chat en direct",
"desc": "Discuter avec l'Agent en temps réel",
"selectAgent": "Sélectionner Agent",
"connecting": "Connexion...",
"connected": "Connecté",
"disconnected": "Déconnecté",
"send": "Envoyer",
"inputPlaceholder": "Tapez un message...",
"noMessages": "Aucun message",
"clearChat": "Effacer l'historique",
"newSession": "Nouvelle session",
"noSessions": "Aucune session",
"copyMessage": "Copier",
"thinking": "Réflexion...",
"generating": "Génération...",
"stop": "Arrêter",
"regenerate": "Régénérer",
"modelSelect": "Sélectionner un modèle",
"gatewayNotRunning": "Gateway n'est pas en cours d'exécution",
"startGateway": "Démarrer Gateway"
}

View File

@@ -0,0 +1,16 @@
{
"title": "Diagnostic système",
"desc": "Diagnostic de connexion WebSocket et débogage réseau",
"wsStatus": "Statut WebSocket",
"wsConnect": "Connecter",
"wsDisconnect": "Déconnecter",
"wsConnected": "Connecté",
"wsDisconnected": "Non connecté",
"wsConnecting": "Connexion...",
"wsError": "Erreur WebSocket",
"networkLogTitle": "Journal des requêtes réseau",
"noRequests": "Aucune requête",
"totalRequests": "Total des requêtes",
"fixStarting": "Début de la réparation...",
"fixFailed": "Réparation échouée"
}

View File

@@ -0,0 +1,42 @@
{
"save": "Enregistrer",
"cancel": "Annuler",
"confirm": "Confirmer",
"delete": "Supprimer",
"edit": "Modifier",
"add": "Ajouter",
"close": "Fermer",
"loading": "Chargement...",
"retry": "Réessayer",
"copy": "Copier",
"copied": "Copié",
"search": "Rechercher",
"refresh": "Actualiser",
"back": "Retour",
"submit": "Soumettre",
"reset": "Réinitialiser",
"enabled": "Activé",
"disabled": "Désactivé",
"unknown": "Inconnu",
"none": "Aucun",
"yes": "Oui",
"no": "Non",
"online": "En ligne",
"offline": "Hors ligne",
"running": "En cours",
"stopped": "Arrêté",
"error": "Erreur",
"success": "Succès",
"warning": "Avertissement",
"info": "Information",
"loadFailed": "Échec du chargement",
"saveFailed": "Échec de la sauvegarde",
"saveSuccess": "Sauvegardé",
"operationFailed": "Opération échouée",
"operationSuccess": "Opération réussie",
"noData": "Aucune donnée",
"unit": "",
"survivalRate": "Disponibilité",
"settings": "Paramètres",
"update": "Mettre à jour"
}

View File

@@ -0,0 +1,28 @@
{
"title": "Communication et Automatisation",
"desc": "Configurer les canaux de notification et les règles d'automatisation",
"notifyTitle": "Canaux de notification",
"automationTitle": "Règles d'automatisation",
"addChannel": "+ Ajouter un canal",
"addRule": "+ Ajouter une règle",
"noChannels": "Aucun canal",
"noRules": "Aucune règle",
"channelName": "Nom du canal",
"enabled": "Activé",
"disabled": "Désactivé",
"test": "Envoyer un test",
"testing": "Test en cours...",
"testSuccess": "Test réussi",
"testFailed": "Test échoué",
"save": "Enregistrer",
"saved": "Enregistré",
"saveFailed": "Échec de la sauvegarde",
"delete": "Supprimer",
"deleted": "Supprimé",
"deleteFailed": "Échec de la suppression",
"loadFailed": "Échec du chargement",
"trigger": "Déclencheur",
"action": "Action",
"selectAgent": "Sélectionner Agent",
"approve": "Approuver"
}

View File

@@ -0,0 +1,19 @@
{
"title": "Tâches planifiées",
"desc": "Gérer les tâches planifiées OpenClaw",
"addTask": "+ Ajouter une tâche",
"noTasks": "Aucune tâche",
"taskName": "Nom de la tâche",
"schedule": "Planification",
"status": "Statut",
"active": "Active",
"inactive": "Inactive",
"edit": "Modifier",
"delete": "Supprimer",
"enable": "Activer",
"disable": "Désactiver",
"runNow": "Exécuter maintenant",
"created": "Tâche créée",
"deleted": "Tâche supprimée",
"loadFailed": "Échec du chargement"
}

View File

@@ -0,0 +1,32 @@
{
"title": "Tableau de bord",
"desc": "Vue d'ensemble de l'état OpenClaw",
"gateway": "Gateway",
"notStarted": "Non démarré",
"versionLabel": "Version",
"agentFleet": "Flotte d'Agents",
"defaultAgent": "Par défaut",
"modelPool": "Pool de modèles",
"baseServices": "Services de base",
"controlUI": "Control UI",
"restartGw": "Redémarrer Gateway",
"checkUpdate": "Vérifier les mises à jour",
"createBackup": "Créer une sauvegarde",
"recentLogs": "Journaux récents",
"cliPath": "Chemin CLI",
"retry": "Réessayer",
"notSet": "Non défini",
"port": "Port",
"startBtn": "Démarrer",
"stopBtn": "Arrêter",
"restartBtn": "Redémarrer",
"primaryModel": "Modèle principal",
"noLogs": "Aucun journal",
"starting": "Démarrage...",
"stopping": "Arrêt...",
"restarting": "Redémarrage...",
"checking": "Vérification...",
"upToDate": "À jour",
"backingUp": "Sauvegarde...",
"backupFail": "Échec de la sauvegarde"
}

View File

@@ -0,0 +1,18 @@
{
"title": "Outils additionnels",
"desc": "Gérer cftunnel et ClawApp",
"cftunnelTitle": "cftunnel",
"clawappTitle": "ClawApp",
"installBtn": "Installation rapide",
"status": "Statut",
"running": "En cours",
"stopped": "Arrêté",
"version": "Version",
"startTunnel": "Démarrer le tunnel",
"stopTunnel": "Arrêter le tunnel",
"start": "Démarrer",
"stop": "Arrêter",
"installing": "Installation...",
"installDone": "Installation terminée",
"installFailed": "Échec de l'installation"
}

View File

@@ -0,0 +1,17 @@
{
"title": "Gateway",
"desc": "Configurer et gérer Gateway",
"status": "Statut",
"running": "En cours",
"stopped": "Arrêté",
"port": "Port",
"saveConfig": "Enregistrer la configuration",
"saved": "Configuration Gateway enregistrée",
"saveFailed": "Échec de la sauvegarde",
"restartRequired": "Redémarrage de Gateway requis",
"restartNow": "Redémarrer maintenant",
"configLoadFail": "Échec du chargement de la configuration",
"pairingTitle": "Appairage des appareils",
"pairedDevices": "Appareils appairés",
"noPairedDevices": "Aucun appareil appairé"
}

View File

@@ -0,0 +1,11 @@
{
"local": "Local",
"remote": "Distant",
"docker": "Docker",
"addInstance": "Ajouter une instance",
"addRemote": "Ajouter une instance distante",
"nameLabel": "Nom",
"endpointLabel": "Adresse du panneau",
"adding": "Ajout...",
"current": "Actuel"
}

View File

@@ -0,0 +1,17 @@
{
"title": "Journaux",
"desc": "Voir les journaux OpenClaw",
"tabGateway": "Gateway",
"tabGatewayErr": "Erreurs Gateway",
"tabGuardian": "Guardian",
"tabBackup": "Sauvegarde",
"tabAudit": "Audit",
"searchPlaceholder": "Rechercher...",
"refresh": "Actualiser",
"autoScroll": "Défilement auto",
"loading": "Chargement...",
"empty": "Aucun journal",
"loadFailed": "Échec du chargement",
"noResults": "Aucun résultat",
"searchFailed": "Échec de la recherche"
}

View File

@@ -0,0 +1,17 @@
{
"title": "Mémoire",
"desc": "Gérer les fichiers mémoire de l'Agent",
"noFiles": "Aucun fichier",
"view": "Voir",
"download": "Télécharger",
"delete": "Supprimer",
"upload": "Téléverser",
"uploading": "Téléversement...",
"uploaded": "Téléversé",
"uploadFailed": "Échec du téléversement",
"deleted": "Supprimé",
"deleteFailed": "Échec de la suppression",
"loadFailed": "Échec du chargement",
"selectAgent": "Sélectionner Agent",
"searchPlaceholder": "Rechercher..."
}

View File

@@ -0,0 +1,5 @@
{
"confirmTitle": "Confirmer",
"confirmOk": "OK",
"confirmCancel": "Annuler"
}

View File

@@ -0,0 +1,21 @@
{
"title": "Configuration des modèles",
"desc": "Gérer les fournisseurs et modèles IA",
"addProvider": "+ Ajouter un fournisseur",
"noProviders": "Aucun fournisseur",
"providerName": "Nom du fournisseur",
"baseUrl": "Base URL",
"apiKey": "API Key",
"models": "Modèles",
"addModel": "Ajouter un modèle",
"saveProvider": "Enregistrer",
"testConnection": "Tester la connexion",
"testing": "Test en cours...",
"testSuccess": "Connexion réussie",
"testFailed": "Connexion échouée",
"fetchModels": "Obtenir la liste des modèles",
"primaryModel": "Modèle principal",
"enabled": "Activé",
"disabled": "Désactivé",
"loadFailed": "Échec du chargement de la configuration"
}

View File

@@ -0,0 +1,8 @@
{
"title": "Sécurité",
"desc": "Gérer les paramètres de sécurité OpenClaw",
"toolPermissions": "Permissions des outils",
"savePermissions": "Enregistrer les permissions",
"permSaved": "Permissions enregistrées",
"loadFailed": "Échec du chargement de la configuration"
}

View File

@@ -0,0 +1,23 @@
{
"title": "Gestion des services",
"desc": "Démarrer, arrêter et surveiller les services OpenClaw",
"gatewayTitle": "Service Gateway",
"guardianTitle": "Service Guardian",
"status": "Statut",
"pid": "PID",
"uptime": "Temps de fonctionnement",
"port": "Port",
"host": "Hôte",
"start": "Démarrer",
"stop": "Arrêter",
"restart": "Redémarrer",
"forceKill": "Forcer la fermeture",
"viewLogs": "Voir les journaux",
"starting": "Démarrage...",
"stopping": "Arrêt...",
"restarting": "Redémarrage...",
"loadFail": "Échec du chargement du statut",
"healthCheck": "Vérification de santé",
"healthOk": "Fonctionne normalement",
"healthFail": "Pas de réponse"
}

View File

@@ -0,0 +1,13 @@
{
"title": "Paramètres du panneau",
"desc": "Gérer les paramètres réseau, proxy et sources de téléchargement",
"networkProxy": "Proxy réseau",
"modelProxy": "Proxy des requêtes de modèle",
"npmRegistry": "npm Registry",
"language": "Langue d'affichage",
"languageHint": "Changer la langue de l'interface.",
"testProxy": "Tester la connexion",
"clearProxy": "Désactiver le proxy",
"resetDefault": "Restaurer les paramètres par défaut",
"restarting": "Redémarrage..."
}

View File

@@ -0,0 +1,23 @@
{
"title": "Configuration initiale",
"desc": "Installer et configurer OpenClaw",
"headerTitle": "Bienvenue sur ClawPanel",
"recheck": "Revérifier",
"stepNode": "Environnement Node.js",
"installed": "Installé",
"downloadNode": "Télécharger Node.js",
"stepGit": "Git",
"stepConfig": "Fichier de configuration",
"saveBtn": "Enregistrer",
"resetDefaultBtn": "Restaurer les paramètres par défaut",
"aiAssistant": "Assistant IA",
"openAiAssistant": "Ouvrir l'assistant IA",
"nextStepsTitle": "Étapes suivantes",
"configModels": "Configurer les modèles",
"gatewaySetup": "Configurer Gateway",
"messageChannels": "Canaux",
"enterPanel": "Entrer dans le panneau",
"installBtn": "Installation rapide",
"installOpenclaw": "Installer OpenClaw",
"installComplete": "Installation terminée"
}

View File

@@ -0,0 +1,29 @@
{
"collapse": "Réduire",
"closeMenu": "Fermer le menu",
"themeLight": "Clair",
"themeDark": "Sombre",
"sectionMonitor": "Surveillance",
"sectionConfig": "Configuration",
"sectionData": "Données",
"sectionExtension": "Extensions",
"dashboard": "Tableau de bord",
"assistant": "Assistant",
"chat": "Chat",
"services": "Services",
"logs": "Journaux",
"models": "Modèles",
"agents": "Agents",
"gateway": "Gateway",
"channels": "Canaux",
"communication": "Communication",
"security": "Sécurité",
"memory": "Mémoire",
"cron": "Tâches planifiées",
"usage": "Utilisation",
"skills": "Skills",
"settings": "Paramètres",
"chatDebug": "Diagnostic",
"about": "À propos",
"setup": "Configuration initiale"
}

View File

@@ -0,0 +1,19 @@
{
"title": "Skills",
"desc": "Gérer et installer les Skills OpenClaw",
"installed": "Installés",
"available": "Disponibles",
"noSkills": "Aucun Skill",
"install": "Installer",
"uninstall": "Désinstaller",
"update": "Mettre à jour",
"search": "Rechercher Skills...",
"installing": "Installation...",
"installSuccess": "Installé",
"installFailed": "Échec de l'installation",
"loadFailed": "Échec du chargement",
"noResults": "Aucun résultat",
"refreshList": "Actualiser la liste",
"checkUpdates": "Vérifier les mises à jour",
"noUpdates": "Tout est à jour"
}

View File

@@ -0,0 +1,4 @@
{
"copySuccess": "Copié",
"copyFailed": "Échec de la copie"
}

View File

@@ -0,0 +1,17 @@
{
"title": "Utilisation",
"desc": "Voir les statistiques d'utilisation des modèles et tokens",
"totalTokens": "Tokens totaux",
"totalRequests": "Requêtes totales",
"totalCost": "Coût total",
"today": "Aujourd'hui",
"week": "Cette semaine",
"month": "Ce mois",
"all": "Tout",
"noData": "Aucune donnée",
"model": "Modèle",
"tokens": "Tokens",
"loadFailed": "Échec du chargement",
"chart": "Graphique",
"table": "Tableau"
}

View File

@@ -0,0 +1,59 @@
{
"title": "について",
"desc": "ClawPanel バージョンとプロジェクト情報",
"subtitle": "OpenClaw ビジュアル管理パネル",
"sectionCommunity": "コミュニティ",
"sectionProjects": "関連プロジェクト",
"sectionContribute": "コントリビュート",
"sectionLinks": "リンク",
"sectionAboutUs": "私たちについて",
"techStack": "ClawPanel は Tauri v2 で構築、フロントエンド Vanilla JS + Vite、バックエンド Rust。",
"checkingUpdate": "更新を確認中...",
"official": "公式",
"chinese": "中国語版",
"notInstalled": "未インストール",
"recommendedStable": "推奨安定版: {ver}",
"switchVersion": "バージョン切替",
"installOpenclaw": "OpenClaw をインストール",
"uninstall": "アンインストール",
"installPath": "インストールパス",
"configExists": "設定ファイルあり",
"configNotFound": "設定ファイルが見つかりません",
"versionLabel": "バージョン",
"selectVersion": "バージョンを選択",
"btnSwitch": "切替",
"btnInstall": "インストール",
"tagRecommended": "(推奨安定版)",
"tagNeedTest": "(互換性要テスト)",
"noVersions": "利用可能なバージョンが見つかりません",
"recommended": "推奨",
"current": "現在",
"operationDone": "操作完了",
"updateReady": "準備完了",
"reloadApp": "アプリを再読み込み",
"rollback": "ロールバック",
"newVersion": "新バージョン",
"hotUpdate": "ホットアップデート",
"fullInstaller": "フルインストーラー",
"downloading": "ダウンロード中...",
"downloadDone": "更新ダウンロード完了、「アプリを再読み込み」をクリックして適用",
"downloadFailed": "ダウンロード失敗: ",
"retry": "再試行",
"upToDate": "最新です",
"checkUpdateFailed": "更新を確認できません",
"joinDiscord": "Discord に参加",
"discordDesc": "国際コミュニティ",
"communityWelcome": "OpenClaw コミュニティへようこそ!問題があればいつでもフィードバックしてください。一緒に AI Agent をより使いやすくしましょう。",
"communityWelcomeIntl": "Welcome to the OpenClaw community! Share ideas, get help, and build amazing AI agents together.",
"communityDesc": "QR コードをスキャンまたはリンクをクリックしてコミュニティに参加",
"contributeDesc": "ClawPanel はオープンソースプロジェクトです。Issue や PR を歓迎します!",
"submitIssue": "Issue を提出",
"submitPR": "PR を提出",
"contributeGuide": "コントリビュートガイド",
"viewIssues": "Issues を見る",
"officialWebsite": "公式サイト",
"productWebsite": "製品サイト",
"openSourceRepo": "オープンソースリポジトリ",
"businessCoop": "ビジネス連携",
"contactViaWebsite": "公式サイトからお問い合わせください"
}

View File

@@ -0,0 +1,45 @@
{
"title": "Agent 管理",
"desc": "OpenClaw Agent の作成と管理、ID・モデル・ワークスペースの設定",
"addAgent": "+ 新規 Agent",
"noAgents": "Agent なし",
"loadFailed": "読み込み失敗",
"loadListFailed": "Agent リストの読み込みに失敗",
"noDesc": "説明なし",
"default": "デフォルト",
"backup": "バックアップ",
"edit": "編集",
"delete": "削除",
"labelName": "名前:",
"labelModel": "モデル:",
"labelWorkspace": "ワークスペース:",
"labelBindings": "バインドチャンネル:",
"notSet": "未設定",
"noBinding": "チャンネル未バインド",
"addModelsFirst": "先にモデル設定ページでモデルを追加してください",
"addTitle": "新規 Agent",
"agentId": "Agent ID",
"agentIdPlaceholder": "例: translator小文字、数字、アンダースコア、ハイフン",
"agentName": "名前",
"agentNamePlaceholder": "例: 翻訳アシスタント",
"agentEmoji": "Emoji",
"agentEmojiPlaceholder": "例: 🌐(任意)",
"agentModel": "モデル",
"agentWorkspace": "ワークスペースパス",
"agentWorkspacePlaceholder": "空欄で自動作成(任意、絶対パス)",
"idRequired": "Agent ID を入力してください",
"idInvalid": "Agent ID は小文字、数字、アンダースコア、ハイフンのみ使用可能です",
"created": "Agent 作成済み",
"createdNameFailed": "Agent は作成されましたが名前の設定に失敗しました。後で編集できます。",
"createFailed": "作成失敗",
"editTitle": "Agent 編集 — {id}",
"workspaceReadonly": "作成時に設定、変更不可",
"updated": "更新済み",
"updateFailed": "更新失敗",
"confirmDelete": "Agent「{id}」を削除しますか?\\n\\nこの Agent のすべてのデータと会話が削除されます。",
"deleted": "削除済み",
"deleteFailed": "削除失敗",
"backingUp": "Agent「{id}」をバックアップ中...",
"backupDone": "バックアップ完了: {file}",
"backupFailed": "バックアップ失敗"
}

View File

@@ -0,0 +1,103 @@
{
"modeChat": "チャット",
"modeChatDesc": "会話のみ、ツール不使用",
"modePlan": "プランニング",
"modePlanDesc": "AI 読み取り専用分析、ツールは閲覧のみ",
"modeExecute": "実行",
"modeExecuteDesc": "コマンド実行とファイル変更を許可",
"modeUnlimited": "無制限",
"modeUnlimitedDesc": "危険確認をスキップ、全自動実行",
"defaultName": "AI アシスタント",
"defaultPersonality": "プロフェッショナル、フレンドリー、親切",
"welcomeText": "こんにちはAI アシスタントです。何かお手伝いできることはありますか?",
"loading": "読み込み中...",
"settings": "設定",
"settingsTitle": "アシスタント設定",
"settingsSaved": "設定を保存しました",
"settingsTabApi": "API 設定",
"settingsTabTools": "ツール",
"settingsTabPersona": "ペルソナ",
"settingsTabKnowledge": "ナレッジベース",
"apiType": "API タイプ",
"model": "モデル",
"temperature": "温度",
"quickSelect": "クイック選択",
"visitSite": "サイトを訪問",
"notConfigured": "未設定",
"testConnTitle": "接続テスト",
"testSuccess": "接続成功",
"testFailed": "接続失敗",
"testNoReply": "(応答なし)",
"testFillUrlKey": "先に Base URL と API Key を入力してください",
"testFillUrl": "先に Base URL を入力してください",
"testFillModel": "先にモデル名を入力してください",
"testing": "テスト中...",
"testSending": "テストリクエスト送信中...",
"testBtn": "接続テスト",
"fetching": "取得中...",
"fetchingModels": "モデルリスト取得中...",
"fetchModelsTitle": "モデルリスト取得",
"fetchBtn": "リスト取得",
"noModelsFound": "利用可能なモデルが見つかりません",
"modelsFound": "{count} モデルが見つかりました",
"personaSource": "ペルソナソース",
"personaDefault": "デフォルト",
"personaOpenClaw": "OpenClaw Agent",
"personaOpenClawHint": "OpenClaw Agent からIDとワークスペース設定を継承",
"personaName": "アシスタント名",
"personaPersonality": "アシスタント性格",
"personaPersonalityHint": "アシスタントの性格特性を説明",
"personaSelectAgent": "Agent を選択",
"personaSelectFirst": "先に Agent を選択してください",
"kbDesc": "カスタムナレッジベース、AI 回答時に参照されます",
"kbEmpty": "ナレッジベースエントリなし",
"kbNamePlaceholder": "ナレッジベース名",
"kbContentPlaceholder": "ナレッジベース内容...",
"kbNameRequired": "名前を入力してください",
"kbContentRequired": "内容を入力してください",
"kbSave": "保存",
"toolFilterAll": "すべて",
"toolNoDesc": "説明なし",
"toolsAlwaysAvailable": "常に利用可能",
"toolsHint": "有効にするツールカテゴリを選択",
"toolExecuting": "実行中...",
"toolDone": "実行完了",
"toolDenied": "ユーザーが実行を拒否",
"toolExecFail": "実行失敗",
"toolUnknown": "不明なツール",
"toolRejected": "ユーザーがこの操作を拒否しました",
"toolRejectedDanger": "ユーザーが危険な操作を拒否しました",
"askConfirm": "確認",
"askSkip": "スキップ",
"askSkipped": "(スキップ済み)",
"confirmRunCmd": "以下のコマンドを実行します",
"confirmCwd": "作業ディレクトリ",
"confirmWriteFile": "以下のファイルに書き込みます",
"confirmPreview": "内容プレビュー",
"confirmAllow": "実行を許可",
"confirmAiRequest": "AI が以下の操作を要求しています",
"aiThinking": "考え中...",
"aiProcessingRound": "第 {round} ラウンド処理中...",
"toolLoopQuestion": "AI が {round} ラウンドのツール呼び出しを実行しました。続行しますか?",
"toolLoopContinue": "さらに {rounds} ラウンド自動実行",
"toolLoopNoBreak": "中断せず継続実行",
"toolLoopRethink": "AI に再考させる",
"toolLoopStop": "実行停止",
"send": "送信",
"inputPlaceholder": "問題を説明、ログやスクリーンショットを貼り付け...",
"inputHint": "Enter で送信 · Shift+Enter で改行 · 画像貼り付け/ドラッグ対応 · AI アシスタントは OpenClaw とは独立",
"stopped": "停止",
"retry": "再試行",
"copyText": "テキストをコピー",
"copyMd": "Markdown をコピー",
"copiedText": "テキストをコピーしました",
"copiedMd": "Markdown をコピーしました",
"uploadImage": "画像アップロード",
"newSession": "新しいセッション",
"deleteSession": "セッション削除",
"noSessions": "セッションなし",
"confirmDeleteSession": "このセッションを削除しますか?",
"sessionList": "セッションリスト",
"errConfigFirst": "先に設定で API を設定してください",
"errTimeout": "リクエストタイムアウト"
}

View File

@@ -0,0 +1,100 @@
{
"title": "チャンネル",
"desc": "メッセージチャンネルの管理とプラットフォーム接続",
"addChannel": "+ チャンネル追加",
"noChannels": "チャンネルなし",
"channelName": "チャンネル名",
"platform": "プラットフォーム",
"status": "ステータス",
"connected": "接続済み",
"disconnected": "未接続",
"actions": "操作",
"edit": "編集",
"delete": "削除",
"enable": "有効化",
"disable": "無効化",
"save": "保存",
"saving": "保存中...",
"saved": "保存済み",
"saveFailed": "保存失敗",
"confirmDelete": "チャンネル「{name}」を削除しますか?",
"deleted": "削除済み",
"deleteFailed": "削除失敗",
"loadFailed": "チャンネルの読み込みに失敗",
"testConnection": "接続テスト",
"testing": "テスト中...",
"testSuccess": "接続成功",
"testFailed": "接続失敗",
"nameRequired": "チャンネル名を入力してください",
"namePlaceholder": "例: メインチャンネル",
"bindAgent": "Agent をバインド",
"unbindAgent": "バインド解除",
"selectAgent": "Agent を選択",
"noAgentBound": "Agent 未バインド",
"boundTo": "{agent} にバインド済み",
"bindSuccess": "バインド成功",
"bindFailed": "バインド失敗",
"pairingTitle": "ペアリング",
"pairingDesc": "デバイスペアリングを管理",
"pairingCode": "ペアリングコード",
"pairingCodePlaceholder": "ペアリングコードを入力",
"approve": "承認",
"approvePairing": "ペアリング承認",
"approving": "承認中...",
"approved": "承認済み",
"approveFailed": "承認失敗",
"noPendingPairing": "保留中のペアリングなし",
"refreshPairing": "更新",
"pendingCount": "{count} 件保留中",
"configTitle": "チャンネル設定",
"guideTitle": "設定ガイド",
"guideSteps": "設定手順",
"step": "ステップ",
"pluginRequired": "プラグインが必要",
"pluginInstalled": "プラグインインストール済み",
"pluginNotInstalled": "プラグイン未インストール",
"installPlugin": "プラグインインストール",
"installing": "インストール中...",
"installSuccess": "インストール成功",
"installFailed": "インストール失敗",
"restartRequired": "変更を反映するには Gateway の再起動が必要です",
"restartGateway": "Gateway を再起動",
"advanced": "詳細設定",
"basicConfig": "基本設定",
"qqTitle": "QQ",
"qqDesc": "QQ プラットフォームに接続",
"dingtalkTitle": "DingTalk",
"dingtalkDesc": "DingTalk に接続",
"feishuTitle": "Feishu",
"feishuDesc": "Feishu に接続",
"telegramTitle": "Telegram",
"telegramDesc": "Telegram Bot に接続",
"discordTitle": "Discord",
"discordDesc": "Discord Bot に接続",
"slackTitle": "Slack",
"slackDesc": "Slack に接続",
"wechatTitle": "WeChat",
"wechatDesc": "WeChat に接続",
"teamsTitle": "MS Teams",
"teamsDesc": "Microsoft Teams に接続",
"signalTitle": "Signal",
"signalDesc": "Signal に接続",
"matrixTitle": "Matrix",
"matrixDesc": "Matrix プロトコルに接続",
"whatsappTitle": "WhatsApp",
"whatsappDesc": "WhatsApp に接続",
"lineTitle": "LINE",
"lineDesc": "LINE に接続",
"botToken": "Bot トークン",
"botTokenPlaceholder": "Bot トークンを入力",
"appId": "App ID",
"appIdPlaceholder": "App ID を入力",
"appSecret": "App Secret",
"appSecretPlaceholder": "App Secret を入力",
"webhookUrl": "Webhook URL",
"webhookSecret": "Webhook Secret",
"groupId": "グループ ID",
"groupIdPlaceholder": "グループ ID を入力",
"verifyToken": "検証トークン",
"encryptKey": "暗号化キー"
}

View File

@@ -0,0 +1,73 @@
{
"title": "ライブチャット",
"desc": "Agent とリアルタイムで会話",
"noAgent": "Agent が見つかりません",
"selectAgent": "Agent を選択",
"connecting": "接続中...",
"connected": "接続済み",
"disconnected": "切断",
"reconnecting": "再接続中...",
"reconnectFailed": "再接続に失敗",
"send": "送信",
"sending": "送信中...",
"inputPlaceholder": "メッセージを入力...",
"noMessages": "メッセージなし",
"clearChat": "チャット履歴をクリア",
"confirmClear": "チャット履歴をクリアしますか?",
"cleared": "チャット履歴をクリアしました",
"newSession": "新しいセッション",
"deleteSession": "セッション削除",
"sessionList": "セッションリスト",
"noSessions": "セッションなし",
"confirmDeleteSession": "このセッションを削除しますか?",
"typingIndicator": "入力中...",
"copyMessage": "メッセージをコピー",
"retryMessage": "再試行",
"deleteMessage": "メッセージを削除",
"messageDeleted": "メッセージ削除済み",
"connectionLost": "接続が失われました",
"connectionRestored": "接続が復元されました",
"wsConnecting": "WebSocket 接続中...",
"wsConnected": "WebSocket 接続済み",
"wsDisconnected": "WebSocket 切断",
"wsError": "WebSocket エラー",
"wsReconnect": "再接続",
"modelSelect": "モデル選択",
"loadingModels": "モデル読み込み中...",
"modelChanged": "モデルを {model} に変更しました",
"modelChangeFailed": "モデル変更に失敗",
"sendFailed": "送信失敗",
"rateLimited": "レート制限中、しばらくお待ちください",
"attachImage": "画像を添付",
"imageUploaded": "画像アップロード済み",
"imageTooLarge": "画像が大きすぎます10MB 以下)",
"fileNotSupported": "サポートされていないファイル形式",
"scrollToBottom": "最下部にスクロール",
"unreadMessages": "{count} 件の未読メッセージ",
"online": "オンライン",
"offline": "オフライン",
"thinking": "考え中...",
"generating": "生成中...",
"stopped": "停止",
"stop": "停止",
"regenerate": "再生成",
"editMessage": "メッセージを編集",
"saveEdit": "編集を保存",
"cancelEdit": "キャンセル",
"exportChat": "チャットをエクスポート",
"importChat": "チャットをインポート",
"markdownMode": "Markdown モード",
"rawMode": "Raw モード",
"codeBlock": "コードブロック",
"copyCode": "コードをコピー",
"agentInfo": "Agent 情報",
"sessionInfo": "セッション情報",
"createdAt": "作成日時",
"messageCount": "{count} メッセージ",
"tokenUsage": "トークン使用量",
"sidebarOpen": "サイドバーを開く",
"sidebarClose": "サイドバーを閉じる",
"gatewayNotRunning": "Gateway が実行されていません",
"startGateway": "Gateway を起動",
"pairFirst": "先にデバイスペアリングを行ってください"
}

View File

@@ -0,0 +1,55 @@
{
"title": "システム診断",
"desc": "WebSocket 接続診断とネットワークデバッグ",
"wsStatus": "WebSocket ステータス",
"wsConnect": "接続",
"wsDisconnect": "切断",
"wsReconnect": "再接続",
"wsConnected": "接続済み",
"wsDisconnected": "未接続",
"wsConnecting": "接続中...",
"wsHandshakeOk": "ハンドシェイク成功!",
"wsHandshakeFailed": "ハンドシェイク失敗",
"wsParseFailed": "メッセージ解析失敗",
"wsRawData": "Raw データ",
"wsError": "WebSocket エラー",
"wsClosed": "接続終了",
"wsOriginRejected": "origin not allowed (1008) - Gateway が現在のアプリの origin を拒否しました",
"wsOriginFix": "解決方法「ワンクリック修復」をクリックすると、tauri://localhost がホワイトリストに追加され Gateway が再起動されます",
"wsAuthFailed": "認証失敗 (4001) - トークンが正しくない可能性があります",
"wsAbnormalClose": "異常終了 (1006) - ネットワークの問題か Gateway が切断した可能性があります",
"wsCreateFailed": "WebSocket 作成失敗",
"wsConfigReadFailed": "設定の読み込みに失敗",
"networkLogTitle": "ネットワークリクエストログ(最新 100 件)",
"noRequests": "リクエスト記録なし",
"totalRequests": "合計リクエスト",
"cacheHit": "キャッシュヒット",
"avgDuration": "平均所要時間",
"colTime": "時間",
"colCommand": "コマンド",
"colArgs": "引数",
"colDuration": "所要時間",
"colCache": "キャッシュ",
"fixStarting": "修復開始...",
"fixWritingPair": "デバイスペアリング情報と Gateway origin ホワイトリストを書き込み中...",
"fixOriginAdded": "tauri://localhost を gateway.controlUi.allowedOrigins に追加しました",
"fixStoppingGw": "Gateway サービスを停止中...",
"fixWaitExit": "プロセス終了待ち3秒...",
"fixStartingGw": "Gateway サービスを起動中...",
"fixGwStartSent": "Gateway 起動コマンド送信済み",
"fixWaitReady": "Gateway 準備待ち5秒...",
"fixCheckStatus": "Gateway ステータス確認中...",
"fixGwStarted": "Gateway が起動しました",
"fixGwMaybeStarting": "Gateway はまだ起動中の可能性があります。後で手動テストしてください",
"fixTestingWs": "WebSocket 接続テスト中...",
"fixReceivedChallenge": "connect.challenge を受信",
"fixFrameSent": "connect フレーム送信済み",
"fixPairSuccess": "ハンドシェイク成功!ペアリングの問題が修復されました!",
"fixReconnecting": "メインアプリの WebSocket 接続を再確立中...",
"fixOriginStillRejected": "原因Gateway が現在のアプリの origin を拒否しました。Gateway の再起動が必要です",
"fixSuggestManualRestart": "「サービス管理」ページで Gateway を手動で再起動してください",
"fixWsConnFailed": "WebSocket 接続失敗、Gateway が実行中か確認してください",
"fixOriginRejected1008": "接続拒否 (1008) - Gateway が現在の origin を拒否しました",
"fixRetryHint": "この問題は今回の修復で処理されたはずです。もう一度「ワンクリック修復」をクリックしてください",
"fixFailed": "修復失敗"
}

View File

@@ -0,0 +1,42 @@
{
"save": "保存",
"cancel": "キャンセル",
"confirm": "確認",
"delete": "削除",
"edit": "編集",
"add": "追加",
"close": "閉じる",
"loading": "読み込み中...",
"retry": "再試行",
"copy": "コピー",
"copied": "コピーしました",
"search": "検索",
"refresh": "更新",
"back": "戻る",
"submit": "送信",
"reset": "リセット",
"enabled": "有効",
"disabled": "無効",
"unknown": "不明",
"none": "なし",
"yes": "はい",
"no": "いいえ",
"online": "オンライン",
"offline": "オフライン",
"running": "実行中",
"stopped": "停止",
"error": "エラー",
"success": "成功",
"warning": "警告",
"info": "情報",
"loadFailed": "読み込み失敗",
"saveFailed": "保存失敗",
"saveSuccess": "保存しました",
"operationFailed": "操作失敗",
"operationSuccess": "操作成功",
"noData": "データなし",
"unit": "個",
"survivalRate": "稼働率",
"settings": "設定",
"update": "更新"
}

View File

@@ -0,0 +1,73 @@
{
"title": "通信と自動化",
"desc": "通知チャンネルと自動化ルールの設定",
"notifyTitle": "通知チャンネル",
"notifyDesc": "Agent のメッセージ通知先を設定",
"automationTitle": "自動化ルール",
"automationDesc": "イベントトリガーによる自動処理ルール",
"addChannel": "+ チャンネル追加",
"addRule": "+ ルール追加",
"noChannels": "通知チャンネルなし",
"noRules": "自動化ルールなし",
"channelType": "チャンネルタイプ",
"webhook": "Webhook",
"email": "メール",
"slack": "Slack",
"discord": "Discord",
"telegram": "Telegram",
"dingtalk": "DingTalk",
"feishu": "Feishu",
"wechat": "WeChat",
"custom": "カスタム",
"channelName": "チャンネル名",
"namePlaceholder": "例: チーム通知",
"urlPlaceholder": "Webhook URL",
"enabled": "有効",
"disabled": "無効",
"test": "テスト送信",
"testing": "テスト中...",
"testSuccess": "テスト送信成功",
"testFailed": "テスト送信失敗",
"save": "保存",
"saving": "保存中...",
"saved": "保存済み",
"saveFailed": "保存失敗",
"delete": "削除",
"confirmDelete": "{name} を削除しますか?",
"deleted": "削除済み",
"deleteFailed": "削除失敗",
"loadFailed": "読み込み失敗",
"ruleTitle": "ルール名",
"ruleTitlePlaceholder": "例: エラー時にSlack通知",
"trigger": "トリガー",
"triggerEvent": "トリガーイベント",
"onError": "エラー発生時",
"onComplete": "タスク完了時",
"onStart": "タスク開始時",
"onSchedule": "スケジュール実行",
"action": "アクション",
"actionNotify": "通知送信",
"actionRun": "コマンド実行",
"actionWebhook": "Webhook 呼出",
"targetChannel": "対象チャンネル",
"condition": "条件(任意)",
"conditionPlaceholder": "例: error.code === 500",
"ruleEnabled": "ルール有効化",
"ruleDisabled": "ルール無効化",
"noAgentBound": "Agent 未バインド",
"bindAgent": "Agent をバインド",
"unbindAgent": "バインド解除",
"boundTo": "{agent} にバインド済み",
"bindSuccess": "バインド成功",
"bindFailed": "バインド失敗",
"selectAgent": "Agent を選択",
"pairingTitle": "ペアリング承認",
"pairingDesc": "チャンネルからのペアリングリクエストを管理",
"noPairingRequests": "保留中のリクエストなし",
"pairingCode": "ペアリングコード",
"approve": "承認",
"reject": "拒否",
"approved": "承認済み",
"rejected": "拒否済み",
"approveFailed": "承認失敗"
}

View File

@@ -0,0 +1,65 @@
{
"title": "スケジュールタスク",
"desc": "OpenClaw の定期タスクを管理",
"addTask": "+ タスク追加",
"noTasks": "タスクなし",
"taskName": "タスク名",
"schedule": "スケジュール",
"lastRun": "最終実行",
"nextRun": "次回実行",
"status": "ステータス",
"active": "アクティブ",
"inactive": "非アクティブ",
"actions": "操作",
"edit": "編集",
"delete": "削除",
"enable": "有効化",
"disable": "無効化",
"runNow": "今すぐ実行",
"running": "実行中...",
"addTitle": "タスク追加",
"editTitle": "タスク編集",
"namePlaceholder": "例: 毎日のレポート",
"cronExpression": "Cron 式",
"cronPlaceholder": "例: 0 9 * * *毎日9時",
"cronHelp": "Cron 式のヘルプ",
"command": "コマンド",
"commandPlaceholder": "実行するコマンドまたはメッセージ",
"targetAgent": "対象 Agent",
"allAgents": "すべての Agent",
"nameRequired": "タスク名を入力してください",
"cronRequired": "Cron 式を入力してください",
"commandRequired": "コマンドを入力してください",
"created": "タスク作成済み",
"createFailed": "タスク作成失敗",
"updated": "タスク更新済み",
"updateFailed": "タスク更新失敗",
"confirmDelete": "タスク「{name}」を削除しますか?",
"deleted": "タスク削除済み",
"deleteFailed": "タスク削除失敗",
"enabled": "タスク有効化済み",
"disabled": "タスク無効化済み",
"toggleFailed": "状態切替失敗",
"runSent": "実行コマンド送信済み",
"runFailed": "実行失敗",
"loadFailed": "タスクの読み込みに失敗",
"cronPreview": "次回の {count} 回の実行",
"everyMinute": "毎分",
"everyHour": "毎時",
"everyDay": "毎日",
"everyWeek": "毎週",
"everyMonth": "毎月",
"custom": "カスタム",
"quickSchedule": "クイックスケジュール",
"timezone": "タイムゾーン",
"description": "説明",
"descPlaceholder": "タスクの説明(任意)",
"maxRetries": "最大リトライ回数",
"timeout": "タイムアウト(秒)",
"history": "実行履歴",
"noHistory": "実行履歴なし",
"success": "成功",
"failed": "失敗",
"duration": "所要時間",
"output": "出力"
}

View File

@@ -0,0 +1,81 @@
{
"title": "ダッシュボード",
"desc": "OpenClaw 実行状況の概要",
"gateway": "Gateway",
"portDetect": "ポート検出",
"notStarted": "未起動",
"versionLabel": "バージョン",
"versionOfficial": "公式",
"versionChinese": "中国語版",
"versionUnknown": "バージョン情報未取得",
"versionAhead": "現在のバージョンは推奨安定版 {version} より新しく、不安定な可能性があります",
"versionStable": "安定版 {version}",
"versionRecommend": "推奨安定版 {version}",
"versionLatest": "最新アップストリーム {version}",
"agentFleet": "Agent フリート",
"defaultAgent": "デフォルト",
"modelPool": "モデルプール",
"basedOnProviders": "{count} プロバイダーから",
"baseServices": "基本サービス",
"controlUI": "Control UI",
"controlUIDesc": "OpenClaw ネイティブパネル",
"controlUIClick": "ブラウザで開く",
"controlUINotRunning": "Gateway 未実行",
"restartGw": "Gateway 再起動",
"checkUpdate": "更新確認",
"createBackup": "バックアップ作成",
"recentLogs": "最近のログ",
"cliPath": "CLI パス",
"cliSource": "インストール元",
"cliSourceStandalone": "スタンドアロン版",
"cliSourceNpmZh": "npm 中国語版",
"cliSourceNpmOfficial": "npm 公式版",
"cliSourceNpmGlobal": "npm グローバル",
"cliSourceUnknown": "不明",
"multiInstall": "複数のインストールを検出",
"multiInstallHint": "設定で使用するものを選択できます",
"installCount": "{count} インストール",
"retry": "再試行",
"servicesLoadFail": "サービス状態の読み込みに失敗",
"versionLoadFail": "バージョン情報の読み込みに失敗",
"notSet": "未設定",
"port": "ポート",
"startBtn": "起動",
"stopBtn": "停止",
"restartBtn": "再起動",
"primaryModel": "プライマリモデル",
"maxConcurrent": "最大同時実行数",
"mcpTools": "MCP ツール",
"mountedExtensions": "マウント済み拡張",
"recentBackup": "最近のバックアップ",
"noBackup": "バックアップなし",
"backupCount": "{count} バックアップファイル",
"workspaceCount": "{count} ワークスペース",
"runtimeVersion": "ランタイムバージョン",
"remaining": "残り",
"activeSessions": "アクティブセッション",
"defaultModel": "デフォルトモデル",
"context": "コンテキスト",
"noLogs": "ログなし",
"openControlUIFail": "Control UI を開けませんでした",
"starting": "起動中...",
"gwStartSent": "Gateway 起動コマンド送信済み",
"startFail": "起動失敗",
"stopping": "停止中...",
"gwStopped": "Gateway 停止済み",
"stopFail": "停止失敗",
"restarting": "再起動中...",
"gwRestartSent": "Gateway 再起動コマンド送信済み",
"restartFail": "再起動失敗",
"gwRestarted": "Gateway 再起動済み (PID: {pid})",
"restartTimeout": "再起動タイムアウト、Gateway はまだ起動中の可能性があります",
"checking": "確認中...",
"versionAheadWarn": "ローカルバージョン {current} は推奨安定版 {recommended} より新しく、互換性リスクがある可能性があります",
"updateAvailable": "推奨安定版が利用可能: {version}",
"alignedWithLatest": "推奨安定版に一致、最新アップストリームは {version}",
"upToDate": "推奨安定版に一致",
"checkUpdateFail": "更新確認に失敗",
"backingUp": "バックアップ中...",
"backupDone": "バックアップ完了: {name}",
"backupFail": "バックアップ失敗"
}

View File

@@ -0,0 +1,47 @@
{
"title": "拡張ツール",
"desc": "cftunnel トンネリングと ClawApp モバイルクライアントの管理",
"cftunnelTitle": "cftunnel トンネリング",
"cftunnelDesc": "Cloudflare Tunnel でローカルサービスを公開。パブリック IP やポートマッピング不要。",
"clawappTitle": "ClawApp モバイルクライアント",
"clawappDesc": "H5 モバイルチャットクライアント、プロキシサーバー経由で Gateway に接続。ローカルおよび外部アクセス対応。",
"cftunnelNotInstalled": "cftunnel 未インストール",
"clawappNotInstalled": "ClawApp 未インストール",
"installBtn": "ワンクリックインストール",
"viewDocs": "ドキュメント",
"status": "ステータス",
"running": "実行中",
"stopped": "停止",
"version": "バージョン",
"unknown": "不明",
"routes": "ルート",
"noRoutes": "ルートなし",
"active": "アクティブ",
"localService": "ローカルサービス",
"startTunnel": "トンネル開始",
"stopTunnel": "トンネル停止",
"viewLogs": "ログ表示",
"refresh": "更新",
"port": "ポート",
"accessUrl": "アクセス URL",
"publicUrl": "パブリック",
"openClawapp": "ClawApp を開く",
"openPublicUrl": "パブリック URL を開く",
"start": "起動",
"stop": "停止",
"tunnelActionDone": "トンネル{action}済み",
"tunnelActionFail": "{action}失敗",
"recentLogs": "最近のログ",
"collapse": "折りたたむ",
"noLogs": "ログなし",
"readLogsFailed": "ログの読み込みに失敗",
"preparing": "インストール準備中...",
"installing": "インストール中...",
"installDone": "インストール完了",
"installSuccess": "{name} インストール成功",
"installFailed": "インストール失敗",
"installFailedTitle": "{name} のインストールに失敗",
"installScene": "{name} のインストール",
"error": "エラー",
"webModeNoLogs": "Web モード:インストールログは利用できません。完了をお待ちください..."
}

View File

@@ -0,0 +1,46 @@
{
"title": "Gateway",
"desc": "OpenClaw Gateway サービスの設定と管理",
"status": "ステータス",
"running": "実行中",
"stopped": "停止",
"port": "ポート",
"host": "ホスト",
"authMode": "認証モード",
"authToken": "トークン認証",
"authPassword": "パスワード認証",
"authNone": "認証なし",
"controlUI": "Control UI",
"allowedOrigins": "許可されたオリジン",
"addOrigin": "オリジン追加",
"removeOrigin": "削除",
"originPlaceholder": "例: http://localhost:3000",
"httpEndpoints": "HTTP エンドポイント",
"chatCompletions": "Chat Completions",
"enabled": "有効",
"disabled": "無効",
"enableEndpoint": "有効にする",
"disableEndpoint": "無効にする",
"dangerZone": "危険ゾーン",
"dangerouslyDisableAuth": "デバイス認証を無効化(危険)",
"dangerAuthHint": "これにより未認証デバイスからの接続が許可されます。テスト用途のみ推奨。",
"saveConfig": "設定を保存",
"saving": "保存中...",
"saved": "Gateway 設定を保存しました",
"saveFailed": "保存失敗",
"restartRequired": "変更を反映するには Gateway の再起動が必要です",
"restartNow": "今すぐ再起動",
"configLoadFail": "Gateway 設定の読み込みに失敗",
"portInUse": "ポート {port} は使用中です",
"invalidPort": "有効なポート番号を入力してください",
"noConfig": "Gateway 設定が見つかりません。Gateway を起動してから設定してください。",
"pairingTitle": "デバイスペアリング",
"pairingDesc": "接続を許可されたデバイスを管理",
"pairedDevices": "ペアリング済みデバイス",
"noPairedDevices": "ペアリング済みデバイスなし",
"removePairing": "ペアリング解除",
"confirmRemovePairing": "このデバイスのペアリングを解除しますか?再接続時に再度ペアリングが必要になります。",
"pairingRemoved": "ペアリング解除済み",
"pairingRemoveFail": "ペアリング解除に失敗",
"refreshPairing": "更新"
}

View File

@@ -0,0 +1,19 @@
{
"local": "ローカル",
"remote": "リモート",
"docker": "Docker",
"switchHint": "切り替え後、モデル設定や Agent などのページは選択したインスタンスを管理します",
"addInstance": "インスタンス追加",
"addRemote": "リモートインスタンス追加",
"namePlaceholder": "リモートサーバー",
"nameLabel": "名前",
"endpointLabel": "パネルアドレス",
"gwPortLabel": "Gateway ポート(任意)",
"nameRequired": "名前とパネルアドレスを入力してください",
"endpointExists": "このエンドポイントは既に存在します",
"adding": "追加中...",
"switchedTo": "{name} に切り替えました",
"current": "現在",
"remoteHint": "リモートサーバーで ClawPanel (serve.js) が実行されている必要があります。",
"example": "例"
}

View File

@@ -0,0 +1,17 @@
{
"title": "ログ",
"desc": "OpenClaw サービスログを表示",
"tabGateway": "Gateway ログ",
"tabGatewayErr": "Gateway エラー",
"tabGuardian": "ガーディアン",
"tabBackup": "バックアップログ",
"tabAudit": "監査ログ",
"searchPlaceholder": "ログを検索...",
"refresh": "更新",
"autoScroll": "自動スクロール",
"loading": "ログ読み込み中...",
"empty": "ログなし",
"loadFailed": "ログの読み込みに失敗",
"noResults": "一致する結果なし",
"searchFailed": "検索失敗"
}

View File

@@ -0,0 +1,33 @@
{
"title": "メモリ",
"desc": "Agent のメモリファイルを管理",
"noFiles": "メモリファイルなし",
"fileName": "ファイル名",
"fileSize": "サイズ",
"lastModified": "最終更新",
"actions": "操作",
"view": "表示",
"download": "ダウンロード",
"delete": "削除",
"upload": "アップロード",
"uploadHint": "テキストファイルをドラッグ&ドロップまたはクリックしてアップロード",
"uploading": "アップロード中...",
"uploaded": "アップロード完了",
"uploadFailed": "アップロード失敗",
"confirmDelete": "メモリファイル「{name}」を削除しますか?",
"deleted": "削除済み",
"deleteFailed": "削除失敗",
"loadFailed": "メモリファイルの読み込みに失敗",
"viewTitle": "メモリファイル — {name}",
"noContent": "内容なし",
"lines": "{count} 行",
"bytes": "{count} バイト",
"selectAgent": "Agent を選択",
"allAgents": "すべての Agent",
"defaultAgent": "デフォルト Agent",
"refreshing": "更新中...",
"searchPlaceholder": "ファイル名を検索...",
"noResults": "一致するファイルなし",
"totalFiles": "合計 {count} ファイル",
"totalSize": "合計サイズ: {size}"
}

View File

@@ -0,0 +1,5 @@
{
"confirmTitle": "操作の確認",
"confirmOk": "OK",
"confirmCancel": "キャンセル"
}

View File

@@ -0,0 +1,126 @@
{
"title": "モデル設定",
"desc": "AI モデルプロバイダーとモデルの管理",
"addProvider": "+ プロバイダー追加",
"noProviders": "プロバイダーなし",
"providerName": "プロバイダー名",
"baseUrl": "Base URL",
"apiKey": "API Key",
"models": "モデル",
"addModel": "モデル追加",
"removeModel": "削除",
"editProvider": "プロバイダー編集",
"deleteProvider": "プロバイダー削除",
"saveProvider": "保存",
"testConnection": "接続テスト",
"testing": "テスト中...",
"testSuccess": "接続成功",
"testFailed": "接続失敗",
"testNoReply": "(応答なし)",
"fetchModels": "モデルリスト取得",
"fetching": "取得中...",
"fetchSuccess": "{count} モデルが見つかりました",
"fetchFailed": "モデルリスト取得失敗",
"noModelsFound": "利用可能なモデルが見つかりません",
"selectAll": "すべて選択",
"deselectAll": "すべて解除",
"providerSaved": "プロバイダー保存済み",
"providerDeleted": "プロバイダー削除済み",
"saveFailed": "保存失敗",
"deleteFailed": "削除失敗",
"confirmDelete": "プロバイダー「{name}」を削除しますか?関連するすべてのモデル設定が失われます。",
"loadFailed": "モデル設定の読み込みに失敗",
"nameRequired": "プロバイダー名を入力してください",
"urlRequired": "Base URL を入力してください",
"keyRequired": "API Key を入力してください",
"namePlaceholder": "例: OpenAI",
"urlPlaceholder": "例: https://api.openai.com/v1",
"keyPlaceholder": "例: sk-...",
"modelPlaceholder": "例: gpt-4o",
"primaryModel": "プライマリモデル",
"primaryModelHint": "デフォルトで使用されるモデル",
"setPrimary": "プライマリに設定",
"isPrimary": "プライマリモデル",
"noPrimary": "プライマリモデル未設定",
"primarySet": "プライマリモデルを設定しました",
"primarySetFailed": "プライマリモデルの設定に失敗",
"modelCount": "{count} モデル",
"enabled": "有効",
"disabled": "無効",
"toggleModel": "モデル切替",
"modelEnabled": "モデル有効化",
"modelDisabled": "モデル無効化",
"toggleFailed": "切替失敗",
"duplicate": "重複するプロバイダー名",
"urlInvalid": "無効な URL 形式",
"providerType": "プロバイダータイプ",
"typeOpenai": "OpenAI 互換",
"typeAnthropic": "Anthropic",
"typeGoogle": "Google",
"typeCustom": "カスタム",
"temperature": "温度",
"maxTokens": "最大トークン",
"topP": "Top P",
"frequencyPenalty": "頻度ペナルティ",
"presencePenalty": "存在ペナルティ",
"advancedSettings": "詳細設定",
"resetDefaults": "デフォルトに戻す",
"modelSettings": "モデル設定",
"globalSettings": "グローバル設定",
"perModelSettings": "モデル別設定",
"inheritGlobal": "グローバル設定を継承",
"customValue": "カスタム値",
"timeout": "タイムアウト(秒)",
"retries": "リトライ回数",
"retryDelay": "リトライ間隔(ミリ秒)",
"concurrency": "同時実行数",
"rateLimitRpm": "レート制限RPM",
"headers": "カスタムヘッダー",
"addHeader": "ヘッダー追加",
"headerKey": "キー",
"headerValue": "値",
"importConfig": "設定インポート",
"exportConfig": "設定エクスポート",
"importFromClipboard": "クリップボードからインポート",
"exportToClipboard": "クリップボードにエクスポート",
"imported": "設定をインポートしました",
"importFailed": "インポート失敗",
"exported": "設定をクリップボードにコピーしました",
"exportFailed": "エクスポート失敗",
"invalidFormat": "無効な設定形式",
"backupConfig": "設定バックアップ",
"restoreConfig": "設定復元",
"backupCreated": "バックアップ作成済み",
"restoreDone": "設定復元済み",
"qtcoolTitle": "晴辰クラウド",
"qtcoolBadge": "公式",
"qtcoolDesc": "GPT-5 / Codex 全シリーズ、公式価格の2〜3割",
"qtcoolHint": "毎日サインインでクレジット獲得",
"qtcoolSetup": "ワンクリック設定",
"qtcoolDocs": "詳細 →",
"presetTitle": "プリセット",
"presetDesc": "人気プロバイダーのワンクリック設定",
"presetOpenai": "OpenAI",
"presetAnthropic": "Anthropic",
"presetGoogle": "Google AI",
"presetGroq": "Groq",
"presetCustom": "カスタム",
"sortByName": "名前順",
"sortByModel": "モデル数順",
"filterEnabled": "有効のみ",
"filterAll": "すべて",
"searchProviders": "プロバイダーを検索...",
"noResults": "一致するプロバイダーなし",
"totalModels": "合計 {count} モデル",
"activeModels": "アクティブ {count}",
"modelIdPlaceholder": "モデル ID例: gpt-4o-mini",
"modelDisplayName": "表示名",
"modelDisplayPlaceholder": "表示名(任意)",
"contextLength": "コンテキスト長",
"vision": "ビジョン対応",
"functionCalling": "Function Calling",
"streaming": "ストリーミング",
"modelCapabilities": "モデル機能",
"supported": "対応",
"notSupported": "非対応"
}

View File

@@ -0,0 +1,40 @@
{
"title": "セキュリティ",
"desc": "OpenClaw のセキュリティ設定を管理",
"toolPermissions": "ツール権限",
"toolPermDesc": "Agent が使用可能なツールカテゴリを制御",
"permAll": "すべて許可",
"permSafe": "安全のみ",
"permNone": "すべて拒否",
"permCustom": "カスタム",
"fileSystem": "ファイルシステム",
"network": "ネットワーク",
"process": "プロセス",
"shell": "シェル",
"browser": "ブラウザ",
"dangerousTools": "危険なツール",
"enableAll": "すべて有効",
"disableAll": "すべて無効",
"savePermissions": "権限を保存",
"permSaved": "ツール権限を保存しました",
"permSaveFail": "権限の保存に失敗",
"allowedPaths": "許可パス",
"blockedPaths": "ブロックパス",
"addPath": "パス追加",
"removePath": "削除",
"pathPlaceholder": "例: /home/user/documents",
"networkRules": "ネットワークルール",
"allowedDomains": "許可ドメイン",
"blockedDomains": "ブロックドメイン",
"addDomain": "ドメイン追加",
"domainPlaceholder": "例: api.example.com",
"rateLimit": "レート制限",
"rateLimitDesc": "1分あたりの最大リクエスト数",
"rateLimitHint": "0 で無制限",
"auditLog": "監査ログ",
"auditLogDesc": "すべてのツール実行を監査ログに記録",
"auditEnabled": "監査ログ有効",
"auditDisabled": "監査ログ無効",
"loadFailed": "セキュリティ設定の読み込みに失敗",
"noConfig": "セキュリティ設定が見つかりません"
}

View File

@@ -0,0 +1,72 @@
{
"title": "サービス管理",
"desc": "OpenClaw サービスの起動・停止・監視",
"gatewayTitle": "Gateway サービス",
"guardianTitle": "Guardian サービス",
"status": "ステータス",
"pid": "PID",
"uptime": "稼働時間",
"port": "ポート",
"host": "ホスト",
"actions": "操作",
"start": "起動",
"stop": "停止",
"restart": "再起動",
"forceKill": "強制終了",
"viewLogs": "ログを見る",
"starting": "起動中...",
"stopping": "停止中...",
"restarting": "再起動中...",
"killing": "強制終了中...",
"startSent": "起動コマンド送信済み",
"stopSent": "停止コマンド送信済み",
"restartSent": "再起動コマンド送信済み",
"killSent": "強制終了コマンド送信済み",
"startFail": "起動失敗",
"stopFail": "停止失敗",
"restartFail": "再起動失敗",
"killFail": "強制終了失敗",
"gwStarted": "Gateway が起動しました (PID: {pid})",
"gwStopped": "Gateway が停止しました",
"gwRestarted": "Gateway が再起動しました (PID: {pid})",
"gwKilled": "Gateway プロセスを強制終了しました",
"guardianStarted": "Guardian が起動しました",
"guardianStopped": "Guardian が停止しました",
"gwRestartTimeout": "再起動タイムアウト",
"loadFail": "サービス状態の読み込みに失敗",
"confirmStop": "Gateway を停止しますか?すべてのアクティブ接続が切断されます。",
"confirmKill": "Gateway プロセスを強制終了しますか?これは最終手段です。",
"portOpen": "ポート {port} は開いています",
"portClosed": "ポート {port} は閉じています",
"portCheckFail": "ポートチェック失敗",
"autoRefresh": "自動更新",
"autoRefreshOn": "{sec}秒ごとに自動更新",
"autoRefreshOff": "自動更新オフ",
"processInfo": "プロセス情報",
"noProcess": "プロセスなし",
"memory": "メモリ",
"cpu": "CPU",
"configFile": "設定ファイル",
"configPath": "パス",
"gwMode": "Gateway モード",
"gwModeDaemon": "デーモン(バックグラウンド)",
"gwModeForeground": "フォアグラウンド",
"logsHint": "「ログ」ページで詳細を確認",
"quickActions": "クイック操作",
"healthCheck": "ヘルスチェック",
"healthOk": "正常に動作中",
"healthFail": "応答なし",
"checkingHealth": "ヘルスチェック中...",
"lastChecked": "最終確認",
"neverChecked": "未確認",
"environment": "環境",
"nodeVersion": "Node.js バージョン",
"platform": "プラットフォーム",
"arch": "アーキテクチャ",
"homeDir": "ホームディレクトリ",
"configDir": "設定ディレクトリ",
"gwNotRunning": "Gateway は実行されていません",
"guardianNotRunning": "Guardian は実行されていません",
"guardianDesc": "Gateway の自動再起動を管理するウォッチドッグプロセス",
"confirmStopGuardian": "Guardian を停止しますかGateway が自動再起動されなくなります。"
}

View File

@@ -0,0 +1,53 @@
{
"title": "パネル設定",
"desc": "ClawPanel のネットワーク、プロキシ、ダウンロードソース設定を管理",
"networkProxy": "ネットワークプロキシ",
"modelProxy": "モデルリクエストプロキシ",
"npmRegistry": "npm レジストリ",
"openclawDir": "OpenClaw インストールパス",
"openclawCli": "OpenClaw CLI バインド",
"cliAutoDetect": "自動検出(推奨)",
"cliBindHint": "パネルが使用する OpenClaw CLI を選択、複数バージョン共存時に便利",
"cliCurrent": "現在使用中",
"cliBound": "バインド済み",
"cliActive": "アクティブ",
"cliVersion": "バージョン",
"cliSwitchConfirm": "この CLI に切り替えますか?パネルはすべての操作にこのインストールを使用します。",
"language": "表示言語",
"languageHint": "インターフェース言語を切り替えます。一部コンテンツは元の言語のまま表示される場合があります。",
"testProxy": "接続テスト",
"clearProxy": "プロキシ無効化",
"proxyHint": "設定後、npm インストール/アップグレード、バージョンチェック、GitHub/Gitee 更新チェック、ClawHub Skills ダウンロードはこのプロキシを使用します。localhost と LAN アドレスは自動バイパスされます。すぐに有効になります。Gateway が実行中の場合はサービスの再起動を検討してください。",
"modelProxyToggle": "モデルテストとモデルリストリクエストもプロキシ経由",
"modelProxyHint": "デフォルトオフ。一部のモデル API は国内中継または LAN アドレスのため、プロキシを使用すると接続に失敗する場合があります。モデルプロバイダーがプロキシを必要とする場合のみ有効にしてください。",
"modelProxyNoProxy": "まず上のネットワークプロキシアドレスを設定してから、このオプションを有効にしてください。",
"registryTaobao": "Taobao ミラー(中国推奨)",
"registryNpm": "npm 公式",
"registryHuawei": "Huawei Cloud ミラー",
"registryCustom": "カスタム",
"registryHint": "アップグレードとバージョンチェックに使用する npm レジストリ。中国のユーザーには Taobao ミラー推奨。",
"registryEmpty": "レジストリ URL を入力してください",
"registrySaved": "npm レジストリ保存済み",
"configExists": "設定ファイルあり",
"configMissing": "設定ファイルが見つかりません",
"currentPath": "現在のパス",
"customBadge": "カスタム",
"dirPlaceholder": "デフォルトパス ~/.openclaw を使用するには空欄のまま",
"resetDefault": "デフォルトに戻す",
"dirHint": "カスタム OpenClaw 設定ディレクトリパス。変更後は再起動が必要です。対象ディレクトリは存在し、openclaw.json を含む必要があります。",
"customPathSaved": "カスタムパス保存済み",
"defaultRestored": "デフォルトパスに戻しました",
"restartConfirm": "変更を反映するにはパネルの再起動が必要です。今すぐ再起動しますか?",
"restarting": "再起動中...",
"restartFailed": "自動再起動に失敗しました。手動で閉じて再度開いてください",
"effectNextLaunch": "次回起動時に有効",
"proxyUrlInvalid": "プロキシ URL は http:// または https:// で始まる必要があります",
"testingProxy": "プロキシ接続をテスト中...",
"proxyOk": "プロキシ接続成功HTTP {status}、{ms}ms→ {target}",
"proxyWarn": "プロキシに到達可能ですが異常な応答HTTP {status}、{ms}ms",
"proxyUrlEmpty": "プロキシアドレスを入力するか、「プロキシ無効化」をクリックしてください",
"proxySaved": "ネットワークプロキシ保存済み。Gateway が実行中の場合はサービスの再起動を検討してください",
"proxyCleared": "ネットワークプロキシ無効化",
"modelProxyOn": "モデルリクエストはプロキシを使用します",
"modelProxyOff": "モデルリクエストプロキシ無効化"
}

View File

@@ -0,0 +1,46 @@
{
"title": "初期設定",
"desc": "OpenClaw のインストールと設定",
"headerTitle": "ClawPanel へようこそ",
"headerDesc": "OpenClaw AI Agent フレームワークのデスクトップ管理パネル",
"recheck": "再検出",
"stepNode": "Node.js 環境",
"installed": "インストール済み",
"stepNodeHint": "OpenClaw は Node.js で動作します。先にインストールしてください。",
"downloadNode": "Node.js をダウンロード",
"recheckAfterInstall": "インストール後「再検出」をクリック",
"nodeInstalledButNotDetected": "インストール済みなのに検出されない?",
"scanNodeBtn": "自動スキャン",
"orManualPath": "またはパスを手動指定:",
"checkPathBtn": "検出",
"stepGit": "Git バージョン管理",
"stepGitHint": "一部の依存関係には Git が必要です。下のボタンで自動インストールするか、手動でインストールしてください。",
"autoInstallGitBtn": "Git をワンクリックインストール",
"manualDownload": "手動ダウンロード",
"stepConfig": "設定ファイル",
"configAt": "設定ファイル: {path}",
"configMissing": "設定ファイルが存在しません。下のボタンでデフォルト設定を自動作成します。",
"initConfigLabel": "設定をワンクリック初期化",
"customDirTitle": "カスタム OpenClaw インストールパス",
"customDirHint": "OpenClaw がデフォルト以外のディレクトリにインストールされている場合、ここで指定できます。空欄の場合はデフォルトパスを使用します。",
"saveBtn": "保存",
"resetDefaultBtn": "デフォルトに戻す",
"aiAssistant": "AI アシスタント",
"aiAssistantDesc": "インストールの問題がありますかAI アシスタントが診断と解決をお手伝いします。",
"openAiAssistant": "AI アシスタントを開く",
"askAiHelp": "AI に解決してもらう",
"nextStepsTitle": "次のステップ",
"nextStepsDesc": "現在、実行環境の準備ができたことを示していますが、すぐにチャットできるわけではありません。通常、以下のステップを完了する必要があります:",
"nextStep1": "「モデル設定」で少なくとも1つのモデルを追加し、プライマリモデルを設定",
"nextStep2": "「Gateway」でサービスが起動していることを確認",
"nextStep3": "Feishu、DingTalk、QQ などのチャンネルが必要な場合は「チャンネル」で設定",
"configModels": "モデル設定",
"gatewaySetup": "Gateway 設定",
"messageChannels": "チャンネル",
"enterPanel": "パネルに入る",
"installBtn": "ワンクリックインストール",
"installOpenclaw": "OpenClaw をインストール",
"installComplete": "インストール完了",
"installSuccess": "OpenClaw インストール成功",
"installScene": "OpenClaw 初期インストール"
}

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