feat: add 6 new locales (ja, ko, fr, es, de, pt) and UI polish

- Add Japanese, Korean, French, Spanish, German, Portuguese translations
- Improve session active state visibility in both themes
- Static language labels in LanguageSwitch component
- Dark theme: lighten chat input background for better contrast
- Fix system theme listener not toggling back to light

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
ekko
2026-04-17 09:09:50 +08:00
parent 16e07bcc9b
commit dcb477594b
10 changed files with 2728 additions and 12 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "hermes-web-ui",
"version": "0.3.0",
"version": "0.3.1",
"description": "Web dashboard for Hermes Agent — multi-platform AI chat, session management, scheduled jobs, usage analytics & channel configuration (Telegram, Discord, Slack, WhatsApp)",
"repository": {
"type": "git",
@@ -577,7 +577,7 @@ async function handleRenameConfirm() {
}
&.active {
background: rgba($accent-primary, 0.1);
background: rgba(var(--accent-primary-rgb), 0.12);
color: $text-primary;
font-weight: 500;
}
@@ -1,16 +1,19 @@
<script setup lang="ts">
import { computed } from 'vue'
import { useI18n } from 'vue-i18n'
import { NSelect } from 'naive-ui'
const { locale, availableLocales, t } = useI18n()
const { locale } = useI18n()
const options = computed(() =>
availableLocales.map(loc => ({
label: loc === 'zh' ? t('language.zh') : t('language.en'),
value: loc,
})),
)
const options = [
{ label: '中文', value: 'zh' },
{ label: 'English', value: 'en' },
{ label: '日本語', value: 'ja' },
{ label: '한국어', value: 'ko' },
{ label: 'Français', value: 'fr' },
{ label: 'Español', value: 'es' },
{ label: 'Deutsch', value: 'de' },
{ label: 'Português', value: 'pt' },
]
function handleChange(val: string) {
locale.value = val
+21 -2
View File
@@ -1,13 +1,32 @@
import { createI18n } from 'vue-i18n'
import en from './locales/en'
import zh from './locales/zh'
import ja from './locales/ja'
import ko from './locales/ko'
import fr from './locales/fr'
import es from './locales/es'
import de from './locales/de'
import pt from './locales/pt'
const saved = localStorage.getItem('hermes_locale')
const detected = navigator.language.slice(0, 2)
const supportedLocales = ['en', 'zh', 'ja', 'ko', 'fr', 'es', 'de', 'pt'] as const
type SupportedLocale = (typeof supportedLocales)[number]
function resolveLocale(saved: string | null, detected: string): SupportedLocale {
if (saved && (supportedLocales as readonly string[]).includes(saved)) {
return saved as SupportedLocale
}
if ((supportedLocales as readonly string[]).includes(detected)) {
return detected as SupportedLocale
}
return 'en'
}
export const i18n = createI18n({
legacy: false,
locale: saved || (detected === 'zh' ? 'zh' : 'en'),
locale: resolveLocale(saved, detected),
fallbackLocale: 'en',
messages: { en, zh },
messages: { en, zh, ja, ko, fr, es, de, pt },
})
+449
View File
@@ -0,0 +1,449 @@
export default {
// Login
login: {
title: 'Hermes Web UI',
description: 'Geben Sie Ihren Zugangs-Token ein, um fortzufahren. Finden Sie ihn in den Server-Startprotokollen.',
placeholder: 'Zugangs-Token',
submit: 'Anmelden',
tokenRequired: 'Bitte geben Sie Ihren Zugangs-Token ein',
invalidToken: 'Ungultiger Token',
connectionFailed: 'Verbindung zum Server nicht moglich',
},
// Common
common: {
loading: 'Laden...',
cancel: 'Abbrechen',
delete: 'Loschen',
edit: 'Bearbeiten',
save: 'Speichern',
saved: 'Gespeichert',
update: 'Aktualisieren',
create: 'Erstellen',
saveFailed: 'Speichern fehlgeschlagen',
ok: 'OK',
copied: 'Kopiert',
copy: 'Kopieren',
noData: 'Keine Daten',
fetch: 'Abrufen',
add: 'Hinzufugen',
enable: 'Aktivieren',
disable: 'Deaktivieren',
configured: 'Konfiguriert',
notConfigured: 'Nicht konfiguriert',
confirm: 'Bestatigen',
expand: 'Aufklappen',
collapse: 'Zuklappen',
},
// Sidebar
sidebar: {
chat: 'Chat',
jobs: 'Geplante Aufgaben',
models: 'Modelle',
profiles: 'Profile',
skills: 'Fahigkeiten',
memory: 'Gedachtnis',
logs: 'Protokolle',
usage: 'Nutzung',
channels: 'Kanale',
terminal: 'Terminal',
settings: 'Einstellungen',
connected: 'Verbunden',
disconnected: 'Getrennt',
updateTip: 'Fuhren Sie "hermes-web-ui update" im Terminal aus, um zu aktualisieren',
updateVersion: 'Aktualisieren auf v{version}',
updating: 'Aktualisierung...',
updateSuccess: 'Aktualisierung abgeschlossen, bitte Server neu starten',
updateFailed: 'Aktualisierung fehlgeschlagen',
},
// Chat
chat: {
emptyState: 'Starten Sie eine Konversation mit Hermes Agent',
inputPlaceholder: 'Nachricht eingeben... (Enter zum Senden, Shift+Enter fur neue Zeile)',
attachFiles: 'Dateien anhangen',
stop: 'Stopp',
send: 'Senden',
contextUsed: 'Kontext verwendet:',
sessions: 'Sitzungen',
noSessions: 'Keine Sitzungen',
newChat: 'Neuer Chat',
deleteSession: 'Diese Sitzung loschen?',
sessionDeleted: 'Sitzung geloscht',
rename: 'Umbenennen',
copySessionId: 'Sitzungs-ID kopieren',
renamed: 'Umbenannt',
renameFailed: 'Umbenennung fehlgeschlagen',
renameSession: 'Sitzung umbenennen',
enterNewTitle: 'Neuen Titel eingeben',
other: 'Sonstige',
runFailed: 'Ausfuhrung fehlgeschlagen',
error: 'Fehler',
tool: 'Werkzeug',
arguments: 'Argumente',
result: 'Ergebnis',
truncated: '... (abgeschnitten)',
},
// Jobs
jobs: {
title: 'Geplante Aufgaben',
createJob: 'Aufgabe erstellen',
editJob: 'Aufgabe bearbeiten',
noJobs: 'Noch keine geplanten Aufgaben. Erstellen Sie eine, um zu beginnen.',
name: 'Name',
namePlaceholder: 'Aufgabenname',
schedule: 'Zeitplan (Cron-Ausdruck)',
schedulePlaceholder: 'z. B. 0 9 * * *',
quickPresets: 'Schnellvorgaben',
selectPreset: 'Vorgabe auswahlen...',
presetEveryMinute: 'Jede Minute',
presetEvery5Min: 'Alle 5 Minuten',
presetEveryHour: 'Jede Stunde',
presetEveryDay: 'Jeden Tag um 00:00',
presetEveryDay9: 'Jeden Tag um 09:00',
presetEveryMonday: 'Jeden Montag um 09:00',
presetEveryMonth: 'Am 1. jedes Monats um 09:00',
prompt: 'Prompt',
promptPlaceholder: 'Der auszufuhrende Prompt',
deliverTarget: 'Zustellziel',
origin: 'Herkunft',
local: 'Lokal',
repeatCount: 'Wiederholungsanzahl (optional)',
repeatPlaceholder: 'Leer lassen fur unendlich',
jobCreated: 'Aufgabe erstellt',
jobUpdated: 'Aufgabe aktualisiert',
nameRequired: 'Name ist erforderlich',
scheduleRequired: 'Zeitplan ist erforderlich',
loadFailed: 'Laden der Aufgabe fehlgeschlagen',
jobPaused: 'Aufgabe pausiert',
jobResumed: 'Aufgabe fortgesetzt',
jobTriggered: 'Aufgabe ausgelost',
jobDeleted: 'Aufgabe geloscht',
status: {
running: 'Lauft',
paused: 'Pausiert',
disabled: 'Deaktiviert',
scheduled: 'Geplant',
},
info: {
schedule: 'Zeitplan',
lastRun: 'Letzte Ausfuhrung',
nextRun: 'Nachste Ausfuhrung',
deliver: 'Zustellung',
repeat: 'Wiederholung',
},
action: {
pause: 'Pausieren',
pauseJob: 'Aufgabe pausieren',
resume: 'Fortsetzen',
resumeJob: 'Aufgabe fortsetzen',
runNow: 'Jetzt ausfuhren',
triggerImmediately: 'Sofort auslosen',
},
},
// Skills
skills: {
title: 'Fahigkeiten',
searchPlaceholder: 'Fahigkeiten suchen...',
noMatch: 'Keine Fahigkeiten entsprechen Ihrer Suche',
noSkills: 'Keine Fahigkeiten gefunden',
backTo: 'Zuruck zu',
attachedFiles: 'Angehange Dateien',
loadFailed: 'Laden der Fahigkeit fehlgeschlagen',
fileLoadFailed: 'Laden der Datei fehlgeschlagen',
toggleFailed: 'Aktivieren/Deaktivieren der Fahigkeit fehlgeschlagen',
},
// Memory
memory: {
title: 'Gedachtnis',
refresh: 'Aktualisieren',
loadFailed: 'Laden des Gedachtnisses fehlgeschlagen',
myNotes: 'Meine Notizen',
noNotes: 'Noch keine Notizen.',
notesPlaceholder: 'Notizen schreiben...',
userProfile: 'Benutzerprofil',
noProfile: 'Noch kein Profil.',
profilePlaceholder: 'Profil schreiben...',
soul: 'Seele',
noSoul: 'Noch keine Seelenkonfiguration.',
soulPlaceholder: 'Seelenkonfiguration schreiben...',
},
// Models
models: {
title: 'Modelle',
addProvider: 'Anbieter hinzufugen',
providerType: 'Anbietertyp',
preset: 'Vorgabe',
custom: 'Benutzerdefiniert',
selectProvider: 'Anbieter auswahlen',
chooseProvider: 'Anbieter wahlen...',
name: 'Name',
autoGeneratedName: 'Automatisch aus Basis-URL generiert',
baseUrl: 'Basis-URL',
baseUrlPlaceholder: 'z. B. https://api.example.com/v1',
apiKey: 'API-Schlussel',
apiKeyPlaceholder: 'sk-...',
defaultModel: 'Standardmodell',
selectModel: 'Modell auswahlen...',
providerAdded: 'Anbieter hinzugefugt',
providerDeleted: 'Anbieter geloscht',
deleteProvider: 'Anbieter loschen',
deleteConfirm: 'Mochten Sie "{name}" wirklich loschen?',
noProviders: 'Keine Anbieter gefunden. Fugen Sie einen benutzerdefinierten Anbieter hinzu, um zu beginnen.',
builtIn: 'Integriert',
customType: 'Benutzerdefiniert',
provider: 'Anbieter',
local: 'Lokal ({host})',
selectProviderRequired: 'Bitte wahlen Sie einen Anbieter',
baseUrlRequired: 'Basis-URL ist erforderlich',
apiKeyRequired: 'API-Schlussel ist erforderlich',
modelRequired: 'Standardmodell ist erforderlich',
enterBaseUrl: 'Bitte geben Sie zuerst die Basis-URL ein',
unexpectedFormat: 'Unerwartetes Antwortformat',
foundModels: '{count} Modelle gefunden',
fetchFailed: 'Abrufen der Modelle fehlgeschlagen',
},
// Profiles
profiles: {
title: 'Profile',
create: 'Profil erstellen',
import: 'Importieren',
export: 'Exportieren',
rename: 'Umbenennen',
delete: 'Loschen',
switchTo: 'Wechseln zu',
switchConfirm: 'Das Wechseln zum Profil "{name}" startet das Gateway neu. Fortfahren?',
switchSuccess: 'Zum Profil "{name}" gewechselt',
switchFailed: 'Profilwechsel fehlgeschlagen. Moglicherweise muss das Gateway manuell neu gestartet werden.',
createSuccess: 'Profil "{name}" erstellt',
createFailed: 'Erstellen des Profils fehlgeschlagen',
renameSuccess: 'Profil umbenannt',
renameFailed: 'Umbenennung des Profils fehlgeschlagen',
deleteConfirm: 'Mochten Sie das Profil "{name}" wirklich loschen?',
deleteSuccess: 'Profil geloscht',
deleteFailed: 'Loschen des Profils fehlgeschlagen',
exportSuccess: 'Profil exportiert',
exportFailed: 'Exportieren des Profils fehlgeschlagen',
importSuccess: 'Profil importiert',
importFailed: 'Importieren des Profils fehlgeschlagen',
importSelectFile: 'Archivdatei auswahlen',
importInvalidFile: 'Bitte wahlen Sie ein gultiges Archiv (.tar.gz, .tgz, .gz, .zip)',
name: 'Profilname',
namePlaceholder: 'Nur Buchstaben, Zahlen und Bindestriche',
newName: 'Neuer Name',
newNamePlaceholder: 'Neuen Namen eingeben',
cloneFromCurrent: 'Aus aktuellem Profil klonen',
archivePath: 'Archivpfad',
archivePathPlaceholder: 'Serverpfad zur Archivdatei',
importName: 'Profilname (optional)',
importNamePlaceholder: 'Leer lassen, um den Archivnamen zu verwenden',
active: 'Aktiv',
model: 'Modell',
gateway: 'Gateway',
alias: 'Alias',
provider: 'Anbieter',
path: 'Pfad',
skills: 'Fahigkeiten',
hasEnv: 'Hat .env',
hasSoulMd: 'Hat soul.md',
noProfiles: 'Keine Profile gefunden. Erstellen Sie eines, um zu beginnen.',
},
// Logs
logs: {
title: 'Protokolle',
all: 'Alle',
searchPlaceholder: 'Suchen...',
refresh: 'Aktualisieren',
noEntries: 'Keine Protokolleintrage',
},
// Settings
settings: {
title: 'Einstellungen',
saved: 'Gespeichert',
saveFailed: 'Speichern fehlgeschlagen',
tabs: {
display: 'Anzeige',
agent: 'Agent',
memory: 'Gedachtnis',
session: 'Sitzung',
privacy: 'Datenschutz',
apiServer: 'API-Server',
},
display: {
streaming: 'Streaming-Antworten',
streamingHint: 'KI-Antworten in Echtzeit anzeigen',
compact: 'Kompaktmodus',
compactHint: 'Nachrichtenabstand reduzieren',
showReasoning: 'Schlussfolgerung anzeigen',
showReasoningHint: 'Denkprozess des Modells anzeigen',
showCost: 'Kosten anzeigen',
showCostHint: 'Token-Nutzung in Antworten anzeigen',
inlineDiffs: 'Inline-Diffs',
inlineDiffsHint: 'Codeanderungen inline anzeigen',
bellOnComplete: 'Abschluss-Signalton',
bellOnCompleteHint: 'Ton abspielen, wenn die KI fertig ist',
busyInputMode: 'Eingabemodus bei Beschaftigung',
busyInputModeHint: 'Eingabe erlauben, wahrend die KI verarbeitet',
theme: 'Design',
themeHint: 'Hell, Dunkel oder Systemeinstellung verwenden',
themeLight: 'Hell',
themeDark: 'Dunkel',
themeSystem: 'System',
},
agent: {
maxTurns: 'Maximale Runden',
maxTurnsHint: 'Maximale Interaktionsrunden pro Konversation',
gatewayTimeout: 'Gateway-Timeout',
gatewayTimeoutHint: 'Anfrage-Timeout in Sekunden',
restartDrainTimeout: 'Neustart-Drain-Timeout',
restartDrainTimeoutHint: 'Drain-Timeout vor Neustart in Sekunden',
toolEnforcement: 'Werkzeuferzwingung',
toolEnforcementHint: 'Ausfuhrungsmodus fur Werkzeugaufrufe steuern',
auto: 'Automatisch',
always: 'Immer',
never: 'Nie',
},
memory: {
enabled: 'Gedachtnis aktivieren',
enabledHint: 'KI erlauben, den Konversationskontext zu merken',
userProfile: 'Benutzerprofil',
userProfileHint: 'KI erlauben, Benutzereinstellungen zu merken',
charLimit: 'Zeichenlimit fur Gedachtnis',
charLimitHint: 'Maximale Zeichen fur MEMORY.md',
userCharLimit: 'Zeichenlimit fur Benutzerprofil',
userCharLimitHint: 'Maximale Zeichen fur USER.md',
},
session: {
mode: 'Zurucksetzungsmodus',
modeHint: 'Ausloser fur Sitzungszurucksetzung',
modeBoth: 'Inaktivitat + Geplant',
modeIdle: 'Nur Inaktivitat',
modeHourly: 'Nur Geplant',
idleMinutes: 'Inaktivitats-Timeout',
idleMinutesHint: 'Wartezeit vor automatischer Zurucksetzung (Minuten)',
atHour: 'Geplante Zurucksetzungszeit',
atHourHint: 'Sitzung taglich zu dieser Stunde zurucksetzen',
},
privacy: {
redactPii: 'Personliche Daten maskieren',
redactPiiHint: 'Sensible Informationen automatisch erkennen und ausblenden (Passworter, Schlussel usw.)',
},
apiServer: {
enable: 'Aktivieren',
enableHint: 'API-Server aktivieren',
host: 'Host',
hostHint: 'Listen-Adresse',
port: 'Port',
portHint: 'Listen-Port',
key: 'Schlussel',
keyHint: 'API-Zugangsschlussel',
cors: 'CORS-Ursprunge',
corsHint: 'Erlaubte Cross-Origin-Quellen',
},
},
// Platform channel settings
platform: {
requireMention: "Erwahnung {'@'} erfordern",
requireMentionGroup: "Erwahnung {'@'} in Gruppen erfordern zum Antworten",
requireMentionChannel: "Erwahnung {'@'} in Kanalen erfordern zum Antworten",
requireMentionRoom: "Erwahnung {'@'} in Raumen erfordern zum Antworten",
reactions: 'Reaktionen',
reactionsHint: 'Auf Nachrichten mit Emoji reagieren',
freeResponseChats: 'Frei antwortende Chats',
freeResponseChatsHint: "Chat-IDs, die ohne {'@'}Erwahnung antworten (komma-getrennt)",
freeResponseChannels: 'Frei antwortende Kanale',
freeResponseChannelsHint: "Kanal-IDs, die ohne {'@'}Erwahnung antworten (komma-getrennt)",
freeResponseRooms: 'Frei antwortende Raume',
freeResponseRoomsHint: "Raum-IDs, die ohne {'@'}Erwahnung antworten (komma-getrennt)",
mentionPatterns: 'Benutzerdefinierte Erwahnungsmuster',
mentionPatternsHint: 'Zusatzliche Auslosermuster',
autoThread: 'Auto-Thread',
autoThreadHint: "Automatisch Antwort-Threads nach {'@'}Erwahnung erstellen",
autoThreadHintRoom: 'Automatisch Antwort-Threads in Raumen erstellen',
dmMentionThreads: 'DM-Erwahnungs-Threads',
dmMentionThreadsHint: 'Thread-Antworten fur Erwahnungen in DMs verwenden',
allowBots: 'Bot-Nachrichten erlauben',
allowBotsHint: 'Auf Nachrichten von anderen Bots antworten',
allowedChannels: 'Erlaubte Kanale',
allowedChannelsHint: 'Whitelist der Kanal-IDs (komma-getrennt)',
ignoredChannels: 'Ignorierte Kanale',
ignoredChannelsHint: 'Kanale, in denen der Bot nie antwortet (komma-getrennt)',
noThreadChannels: 'Thread-lose Kanale',
noThreadChannelsHint: 'Kanale, in denen der Bot ohne Threads antwortet (komma-getrennt)',
botToken: 'Bot-Token',
botTokenHint: 'Bot-Token vom Entwicklerportal',
accessToken: 'Zugangs-Token',
accessTokenHint: 'Matrix-Zugangs-Token',
homeserver: 'Homeserver-URL',
homeserverHint: 'Matrix-Homeserver-URL',
appId: 'App-ID',
appIdHint: 'Feishu App-ID',
appSecret: 'App-Geheimnis',
appSecretHint: 'Feishu App-Geheimnis',
clientId: 'Client-ID',
clientIdHint: 'DingTalk Client-ID',
clientSecret: 'Client-Geheimnis',
clientSecretHint: 'DingTalk Client-Geheimnis',
botId: 'Bot-ID',
botIdHint: 'WeCom Bot-ID',
wecomSecretHint: 'WeCom Bot-Geheimnis',
waEnabled: 'WhatsApp aktivieren',
waEnabledHint: 'WhatsApp uber QR-Code-Kopplung aktivieren',
weixinToken: 'Weixin-Token',
weixinTokenHint: 'Von Weixin-CLI QR-Anmeldung (hermes weixin)',
accountId: 'Konto-ID',
accountIdHint: 'Weixin-Konto-ID',
qrLogin: 'QR-Anmeldung',
qrRelogin: 'Erneut anmelden',
qrFetching: 'QR-Code wird abgerufen...',
qrScanHint: 'Mit WeChat scannen zum Anmelden',
qrScanedHint: 'Gescannt, bitte auf dem Gerat bestatigen...',
},
// Language
language: {
label: 'Sprache',
zh: '中文',
en: 'English',
de: 'Deutsch',
},
// Terminal
terminal: {
sessions: 'Sitzungen',
newTab: 'Neues Terminal',
closeSession: 'Diese Sitzung schliessen?',
sessionExited: 'Beendet',
processExited: 'Prozess beendet mit Code {code}',
},
// Usage
usage: {
title: 'Nutzungsstatistiken',
refresh: 'Aktualisieren',
totalTokens: 'Gesamt-Tokens',
inputTokens: 'Eingabe',
outputTokens: 'Ausgabe',
totalSessions: 'Gesamt-Sitzungen',
avgPerDay: '~{n}/Tag Durchschn.',
estimatedCost: 'Gesch. Kosten',
cacheHitRate: 'Cache-Trefferquote',
modelBreakdown: 'Modellaufschluesselung',
dailyTrend: 'Tagliche Nutzung (letzte 30 Tage)',
date: 'Datum',
tokens: 'Tokens',
cache: 'Cache',
sessions: 'Sitzungen',
cost: 'Kosten',
noData: 'Keine Nutzungsdaten',
},
}
+449
View File
@@ -0,0 +1,449 @@
export default {
// Login
login: {
title: 'Hermes Web UI',
description: 'Introduce tu token de acceso para continuar. Encuentralo en los registros de inicio del servidor.',
placeholder: 'Token de acceso',
submit: 'Iniciar sesion',
tokenRequired: 'Por favor, introduce tu token de acceso',
invalidToken: 'Token invalido',
connectionFailed: 'No se puede conectar al servidor',
},
// Common
common: {
loading: 'Cargando...',
cancel: 'Cancelar',
delete: 'Eliminar',
edit: 'Editar',
save: 'Guardar',
saved: 'Guardado',
update: 'Actualizar',
create: 'Crear',
saveFailed: 'Error al guardar',
ok: 'OK',
copied: 'Copiado',
copy: 'Copiar',
noData: 'Sin datos',
fetch: 'Obtener',
add: 'Anadir',
enable: 'Activar',
disable: 'Desactivar',
configured: 'Configurado',
notConfigured: 'No configurado',
confirm: 'Confirmar',
expand: 'Expandir',
collapse: 'Contraer',
},
// Sidebar
sidebar: {
chat: 'Chat',
jobs: 'Tareas programadas',
models: 'Modelos',
profiles: 'Perfiles',
skills: 'Habilidades',
memory: 'Memoria',
logs: 'Registros',
usage: 'Uso',
channels: 'Canales',
terminal: 'Terminal',
settings: 'Configuracion',
connected: 'Conectado',
disconnected: 'Desconectado',
updateTip: 'Ejecuta "hermes-web-ui update" en la terminal para actualizar',
updateVersion: 'Actualizar a v{version}',
updating: 'Actualizando...',
updateSuccess: 'Actualizacion completa, por favor reinicia el servidor',
updateFailed: 'Error al actualizar',
},
// Chat
chat: {
emptyState: 'Inicia una conversacion con Hermes Agent',
inputPlaceholder: 'Escribe un mensaje... (Enter para enviar, Shift+Enter para nueva linea)',
attachFiles: 'Adjuntar archivos',
stop: 'Detener',
send: 'Enviar',
contextUsed: 'Contexto utilizado:',
sessions: 'Sesiones',
noSessions: 'Sin sesiones',
newChat: 'Nuevo chat',
deleteSession: 'Eliminar esta sesion?',
sessionDeleted: 'Sesion eliminada',
rename: 'Renombrar',
copySessionId: 'Copiar ID de sesion',
renamed: 'Renombrada',
renameFailed: 'Error al renombrar',
renameSession: 'Renombrar sesion',
enterNewTitle: 'Introduce un nuevo titulo',
other: 'Otro',
runFailed: 'Error en la ejecucion',
error: 'Error',
tool: 'Herramienta',
arguments: 'Argumentos',
result: 'Resultado',
truncated: '... (truncado)',
},
// Jobs
jobs: {
title: 'Tareas programadas',
createJob: 'Crear tarea',
editJob: 'Editar tarea',
noJobs: 'No hay tareas programadas aun. Crea una para comenzar.',
name: 'Nombre',
namePlaceholder: 'Nombre de la tarea',
schedule: 'Programacion (expresion Cron)',
schedulePlaceholder: 'ej. 0 9 * * *',
quickPresets: 'Presets rapidos',
selectPreset: 'Seleccionar un preset...',
presetEveryMinute: 'Cada minuto',
presetEvery5Min: 'Cada 5 minutos',
presetEveryHour: 'Cada hora',
presetEveryDay: 'Todos los dias a las 00:00',
presetEveryDay9: 'Todos los dias a las 09:00',
presetEveryMonday: 'Cada lunes a las 09:00',
presetEveryMonth: 'El dia 1 de cada mes a las 09:00',
prompt: 'Prompt',
promptPlaceholder: 'El prompt a ejecutar',
deliverTarget: 'Destino de entrega',
origin: 'Origen',
local: 'Local',
repeatCount: 'Repeticiones (opcional)',
repeatPlaceholder: 'Dejar vacio para infinito',
jobCreated: 'Tarea creada',
jobUpdated: 'Tarea actualizada',
nameRequired: 'El nombre es obligatorio',
scheduleRequired: 'La programacion es obligatoria',
loadFailed: 'Error al cargar la tarea',
jobPaused: 'Tarea en pausa',
jobResumed: 'Tarea reanudada',
jobTriggered: 'Tarea ejecutada',
jobDeleted: 'Tarea eliminada',
status: {
running: 'En ejecucion',
paused: 'En pausa',
disabled: 'Desactivada',
scheduled: 'Programada',
},
info: {
schedule: 'Programacion',
lastRun: 'Ultima ejecucion',
nextRun: 'Proxima ejecucion',
deliver: 'Entrega',
repeat: 'Repeticion',
},
action: {
pause: 'Pausar',
pauseJob: 'Pausar tarea',
resume: 'Reanudar',
resumeJob: 'Reanudar tarea',
runNow: 'Ejecutar ahora',
triggerImmediately: 'Ejecutar inmediatamente',
},
},
// Skills
skills: {
title: 'Habilidades',
searchPlaceholder: 'Buscar habilidades...',
noMatch: 'Ninguna habilidad coincide con tu busqueda',
noSkills: 'No se encontraron habilidades',
backTo: 'Volver a',
attachedFiles: 'Archivos adjuntos',
loadFailed: 'Error al cargar la habilidad',
fileLoadFailed: 'Error al cargar el archivo',
toggleFailed: 'Error al activar/desactivar la habilidad',
},
// Memory
memory: {
title: 'Memoria',
refresh: 'Actualizar',
loadFailed: 'Error al cargar la memoria',
myNotes: 'Mis notas',
noNotes: 'Sin notas aun.',
notesPlaceholder: 'Escribe tus notas...',
userProfile: 'Perfil de usuario',
noProfile: 'Sin perfil aun.',
profilePlaceholder: 'Escribe tu perfil...',
soul: 'Alma',
noSoul: 'Sin configuracion de alma aun.',
soulPlaceholder: 'Escribe la configuracion del alma...',
},
// Models
models: {
title: 'Modelos',
addProvider: 'Anadir proveedor',
providerType: 'Tipo de proveedor',
preset: 'Preset',
custom: 'Personalizado',
selectProvider: 'Seleccionar proveedor',
chooseProvider: 'Elige un proveedor...',
name: 'Nombre',
autoGeneratedName: 'Generado automaticamente desde la URL base',
baseUrl: 'URL base',
baseUrlPlaceholder: 'ej. https://api.example.com/v1',
apiKey: 'Clave API',
apiKeyPlaceholder: 'sk-...',
defaultModel: 'Modelo predeterminado',
selectModel: 'Seleccionar un modelo...',
providerAdded: 'Proveedor anadido',
providerDeleted: 'Proveedor eliminado',
deleteProvider: 'Eliminar proveedor',
deleteConfirm: 'Estas seguro de que quieres eliminar "{name}"?',
noProviders: 'No se encontraron proveedores. Anade un proveedor personalizado para comenzar.',
builtIn: 'Integrado',
customType: 'Personalizado',
provider: 'Proveedor',
local: 'Local ({host})',
selectProviderRequired: 'Por favor, selecciona un proveedor',
baseUrlRequired: 'La URL base es obligatoria',
apiKeyRequired: 'La clave API es obligatoria',
modelRequired: 'El modelo predeterminado es obligatorio',
enterBaseUrl: 'Por favor, introduce primero la URL base',
unexpectedFormat: 'Formato de respuesta inesperado',
foundModels: '{count} modelos encontrados',
fetchFailed: 'Error al obtener los modelos',
},
// Profiles
profiles: {
title: 'Perfiles',
create: 'Crear perfil',
import: 'Importar',
export: 'Exportar',
rename: 'Renombrar',
delete: 'Eliminar',
switchTo: 'Cambiar a',
switchConfirm: 'Cambiar al perfil "{name}" reiniciara la pasarela. Continuar?',
switchSuccess: 'Se ha cambiado al perfil "{name}"',
switchFailed: 'Error al cambiar de perfil. Es posible que la pasarela necesite un reinicio manual.',
createSuccess: 'Perfil "{name}" creado',
createFailed: 'Error al crear el perfil',
renameSuccess: 'Perfil renombrado',
renameFailed: 'Error al renombrar el perfil',
deleteConfirm: 'Estas seguro de que quieres eliminar el perfil "{name}"?',
deleteSuccess: 'Perfil eliminado',
deleteFailed: 'Error al eliminar el perfil',
exportSuccess: 'Perfil exportado',
exportFailed: 'Error al exportar el perfil',
importSuccess: 'Perfil importado',
importFailed: 'Error al importar el perfil',
importSelectFile: 'Seleccionar archivo de archivo',
importInvalidFile: 'Por favor, selecciona un archivo valido (.tar.gz, .tgz, .gz, .zip)',
name: 'Nombre del perfil',
namePlaceholder: 'Solo letras, numeros y guiones',
newName: 'Nuevo nombre',
newNamePlaceholder: 'Introduce un nuevo nombre',
cloneFromCurrent: 'Clonar desde el perfil actual',
archivePath: 'Ruta del archivo',
archivePathPlaceholder: 'Ruta del servidor al archivo de archivo',
importName: 'Nombre del perfil (opcional)',
importNamePlaceholder: 'Dejar vacio para usar el nombre del archivo',
active: 'Activo',
model: 'Modelo',
gateway: 'Pasarela',
alias: 'Alias',
provider: 'Proveedor',
path: 'Ruta',
skills: 'Habilidades',
hasEnv: 'Tiene .env',
hasSoulMd: 'Tiene soul.md',
noProfiles: 'No se encontraron perfiles. Crea uno para comenzar.',
},
// Logs
logs: {
title: 'Registros',
all: 'Todos',
searchPlaceholder: 'Buscar...',
refresh: 'Actualizar',
noEntries: 'Sin entradas de registro',
},
// Settings
settings: {
title: 'Configuracion',
saved: 'Guardado',
saveFailed: 'Error al guardar',
tabs: {
display: 'Pantalla',
agent: 'Agente',
memory: 'Memoria',
session: 'Sesion',
privacy: 'Privacidad',
apiServer: 'Servidor API',
},
display: {
streaming: 'Respuestas en streaming',
streamingHint: 'Mostrar respuestas de la IA en tiempo real',
compact: 'Modo compacto',
compactHint: 'Reducir el espaciado entre mensajes',
showReasoning: 'Mostrar razonamiento',
showReasoningHint: 'Mostrar el proceso de pensamiento del modelo',
showCost: 'Mostrar costo',
showCostHint: 'Mostrar uso de tokens en las respuestas',
inlineDiffs: 'Diffs en linea',
inlineDiffsHint: 'Mostrar cambios de codigo en linea',
bellOnComplete: 'Sonido de finalizacion',
bellOnCompleteHint: 'Reproducir un sonido cuando la IA termina',
busyInputMode: 'Modo de entrada ocupada',
busyInputModeHint: 'Permitir entrada mientras la IA procesa',
theme: 'Tema',
themeHint: 'Elige claro, oscuro o seguir la preferencia del sistema',
themeLight: 'Claro',
themeDark: 'Oscuro',
themeSystem: 'Sistema',
},
agent: {
maxTurns: 'Turnos maximos',
maxTurnsHint: 'Rondas maximas de interaccion por conversacion',
gatewayTimeout: 'Tiempo de espera de la pasarela',
gatewayTimeoutHint: 'Tiempo de espera de la peticion en segundos',
restartDrainTimeout: 'Tiempo de drenado al reiniciar',
restartDrainTimeoutHint: 'Tiempo de drenado antes de reiniciar en segundos',
toolEnforcement: 'Aplicacion de herramientas',
toolEnforcementHint: 'Controlar el modo de ejecucion de llamadas a herramientas',
auto: 'Automatico',
always: 'Siempre',
never: 'Nunca',
},
memory: {
enabled: 'Activar memoria',
enabledHint: 'Permitir que la IA recuerde el contexto de la conversacion',
userProfile: 'Perfil de usuario',
userProfileHint: 'Permitir que la IA recuerde las preferencias del usuario',
charLimit: 'Limite de caracteres de memoria',
charLimitHint: 'Maximo de caracteres para MEMORY.md',
userCharLimit: 'Limite de caracteres del perfil de usuario',
userCharLimitHint: 'Maximo de caracteres para USER.md',
},
session: {
mode: 'Modo de reinicio',
modeHint: 'Condicion de activacion del reinicio de sesion',
modeBoth: 'Inactividad + Programado',
modeIdle: 'Solo inactividad',
modeHourly: 'Solo programado',
idleMinutes: 'Tiempo de inactividad',
idleMinutesHint: 'Tiempo de espera antes del reinicio automatico (minutos)',
atHour: 'Hora de reinicio programado',
atHourHint: 'Reiniciar sesion a esta hora todos los dias',
},
privacy: {
redactPii: 'Ocultar informacion personal',
redactPiiHint: 'Detectar y ocultar automaticamente informacion sensible (contrasenas, claves, etc.)',
},
apiServer: {
enable: 'Activar',
enableHint: 'Activar servidor API',
host: 'Host',
hostHint: 'Direccion de escucha',
port: 'Puerto',
portHint: 'Puerto de escucha',
key: 'Clave',
keyHint: 'Clave de acceso API',
cors: 'Origenes CORS',
corsHint: 'Fuentes cross-origin permitidas',
},
},
// Platform channel settings
platform: {
requireMention: "Requerir mencion {'@'}",
requireMentionGroup: "Requerir mencion {'@'} en grupos para responder",
requireMentionChannel: "Requerir mencion {'@'} en canales para responder",
requireMentionRoom: "Requerir mencion {'@'} en salas para responder",
reactions: 'Reacciones',
reactionsHint: 'Reaccionar a mensajes con emoji',
freeResponseChats: 'Chats de respuesta libre',
freeResponseChatsHint: "IDs de chats que responden sin mencion {'@'} (separados por comas)",
freeResponseChannels: 'Canales de respuesta libre',
freeResponseChannelsHint: "IDs de canales que responden sin mencion {'@'} (separados por comas)",
freeResponseRooms: 'Salas de respuesta libre',
freeResponseRoomsHint: "IDs de salas que responden sin mencion {'@'} (separados por comas)",
mentionPatterns: 'Patrones de mencion personalizados',
mentionPatternsHint: 'Patrones de activacion adicionales',
autoThread: 'Hilo automatico',
autoThreadHint: "Crear automaticamente hilos de respuesta despues de mencion {'@'}",
autoThreadHintRoom: 'Crear automaticamente hilos de respuesta en salas',
dmMentionThreads: 'Hilos de mencion en MD',
dmMentionThreadsHint: 'Usar hilos de respuesta para menciones en mensajes directos',
allowBots: 'Permitir mensajes de bots',
allowBotsHint: 'Responder a mensajes de otros bots',
allowedChannels: 'Canales permitidos',
allowedChannelsHint: 'Lista blanca de IDs de canales (separados por comas)',
ignoredChannels: 'Canales ignorados',
ignoredChannelsHint: 'Canales donde el bot nunca responde (separados por comas)',
noThreadChannels: 'Canales sin hilo',
noThreadChannelsHint: 'Canales donde el bot responde sin hilos (separados por comas)',
botToken: 'Token del bot',
botTokenHint: 'Token del bot del portal de desarrolladores',
accessToken: 'Token de acceso',
accessTokenHint: 'Token de acceso de Matrix',
homeserver: 'URL del homeserver',
homeserverHint: 'URL del homeserver de Matrix',
appId: 'ID de aplicacion',
appIdHint: 'ID de aplicacion de Feishu',
appSecret: 'Secreto de aplicacion',
appSecretHint: 'Secreto de aplicacion de Feishu',
clientId: 'ID de cliente',
clientIdHint: 'ID de cliente de DingTalk',
clientSecret: 'Secreto de cliente',
clientSecretHint: 'Secreto de cliente de DingTalk',
botId: 'ID del bot',
botIdHint: 'ID del bot de WeCom',
wecomSecretHint: 'Secreto del bot de WeCom',
waEnabled: 'Activar WhatsApp',
waEnabledHint: 'Activar WhatsApp mediante emparejamiento por codigo QR',
weixinToken: 'Token de Weixin',
weixinTokenHint: 'Desde el inicio de sesion QR de la CLI de weixin (hermes weixin)',
accountId: 'ID de cuenta',
accountIdHint: 'ID de cuenta de Weixin',
qrLogin: 'Inicio de sesion QR',
qrRelogin: 'Volver a iniciar sesion',
qrFetching: 'Obteniendo codigo QR...',
qrScanHint: 'Escanea con WeChat para iniciar sesion',
qrScanedHint: 'Escaneado, por favor confirma en el telefono...',
},
// Language
language: {
label: 'Idioma',
zh: '中文',
en: 'English',
es: 'Espanol',
},
// Terminal
terminal: {
sessions: 'Sesiones',
newTab: 'Nueva terminal',
closeSession: 'Cerrar esta sesion?',
sessionExited: 'Finalizada',
processExited: 'Proceso finalizado con codigo {code}',
},
// Usage
usage: {
title: 'Estadisticas de uso',
refresh: 'Actualizar',
totalTokens: 'Total de tokens',
inputTokens: 'Entrada',
outputTokens: 'Salida',
totalSessions: 'Total de sesiones',
avgPerDay: '~{n}/dia de promedio',
estimatedCost: 'Costo est.',
cacheHitRate: 'Tasa de acierto de cache',
modelBreakdown: 'Desglose por modelo',
dailyTrend: 'Uso diario (ultimos 30 dias)',
date: 'Fecha',
tokens: 'Tokens',
cache: 'Cache',
sessions: 'Sesiones',
cost: 'Costo',
noData: 'Sin datos de uso',
},
}
+449
View File
@@ -0,0 +1,449 @@
export default {
// Login
login: {
title: 'Hermes Web UI',
description: 'Entrez votre jeton d\'acces pour continuer. Retrouvez-le dans les journaux de demarrage du serveur.',
placeholder: 'Jeton d\'acces',
submit: 'Connexion',
tokenRequired: 'Veuillez entrer votre jeton d\'acces',
invalidToken: 'Jeton invalide',
connectionFailed: 'Impossible de se connecter au serveur',
},
// Common
common: {
loading: 'Chargement...',
cancel: 'Annuler',
delete: 'Supprimer',
edit: 'Modifier',
save: 'Enregistrer',
saved: 'Enregistre',
update: 'Mettre a jour',
create: 'Creer',
saveFailed: 'Echec de l\'enregistrement',
ok: 'OK',
copied: 'Copie',
copy: 'Copier',
noData: 'Aucune donnee',
fetch: 'Recuperer',
add: 'Ajouter',
enable: 'Activer',
disable: 'Desactiver',
configured: 'Configure',
notConfigured: 'Non configure',
confirm: 'Confirmer',
expand: 'Developper',
collapse: 'Reduire',
},
// Sidebar
sidebar: {
chat: 'Discussion',
jobs: 'Taches planifiees',
models: 'Modeles',
profiles: 'Profils',
skills: 'Competences',
memory: 'Memoire',
logs: 'Journaux',
usage: 'Utilisation',
channels: 'Canaux',
terminal: 'Terminal',
settings: 'Parametres',
connected: 'Connecte',
disconnected: 'Deconnecte',
updateTip: 'Executez "hermes-web-ui update" dans le terminal pour mettre a jour',
updateVersion: 'Mettre a jour vers v{version}',
updating: 'Mise a jour...',
updateSuccess: 'Mise a jour terminee, veuillez redemarrer le serveur',
updateFailed: 'Echec de la mise a jour',
},
// Chat
chat: {
emptyState: 'Demarrer une conversation avec Hermes Agent',
inputPlaceholder: 'Tapez un message... (Entree pour envoyer, Shift+Entree pour un saut de ligne)',
attachFiles: 'Joindre des fichiers',
stop: 'Arreter',
send: 'Envoyer',
contextUsed: 'Contexte utilise :',
sessions: 'Sessions',
noSessions: 'Aucune session',
newChat: 'Nouvelle discussion',
deleteSession: 'Supprimer cette session ?',
sessionDeleted: 'Session supprimee',
rename: 'Renommer',
copySessionId: 'Copier l\'ID de session',
renamed: 'Renomme',
renameFailed: 'Echec du renommage',
renameSession: 'Renommer la session',
enterNewTitle: 'Entrez un nouveau titre',
other: 'Autre',
runFailed: 'Echec de l\'execution',
error: 'Erreur',
tool: 'Outil',
arguments: 'Arguments',
result: 'Resultat',
truncated: '... (tronque)',
},
// Jobs
jobs: {
title: 'Taches planifiees',
createJob: 'Creer une tache',
editJob: 'Modifier la tache',
noJobs: 'Aucune tache planifiee. Creez-en une pour commencer.',
name: 'Nom',
namePlaceholder: 'Nom de la tache',
schedule: 'Planification (expression Cron)',
schedulePlaceholder: 'ex. 0 9 * * *',
quickPresets: 'Presets rapides',
selectPreset: 'Selectionner un preset...',
presetEveryMinute: 'Chaque minute',
presetEvery5Min: 'Toutes les 5 minutes',
presetEveryHour: 'Chaque heure',
presetEveryDay: 'Tous les jours a 00:00',
presetEveryDay9: 'Tous les jours a 09:00',
presetEveryMonday: 'Chaque lundi a 09:00',
presetEveryMonth: 'Le 1er de chaque mois a 09:00',
prompt: 'Invite',
promptPlaceholder: 'L\'invite a executer',
deliverTarget: 'Cible de livraison',
origin: 'Origine',
local: 'Local',
repeatCount: 'Nombre de repetitions (facultatif)',
repeatPlaceholder: 'Laisser vide pour infini',
jobCreated: 'Tache creee',
jobUpdated: 'Tache mise a jour',
nameRequired: 'Le nom est requis',
scheduleRequired: 'La planification est requise',
loadFailed: 'Echec du chargement de la tache',
jobPaused: 'Tache en pause',
jobResumed: 'Tache reprise',
jobTriggered: 'Tache declenchee',
jobDeleted: 'Tache supprimee',
status: {
running: 'En cours',
paused: 'En pause',
disabled: 'Desactivee',
scheduled: 'Planifiee',
},
info: {
schedule: 'Planification',
lastRun: 'Derniere execution',
nextRun: 'Prochaine execution',
deliver: 'Livraison',
repeat: 'Repetition',
},
action: {
pause: 'Pause',
pauseJob: 'Mettre en pause',
resume: 'Reprendre',
resumeJob: 'Reprendre la tache',
runNow: 'Executer maintenant',
triggerImmediately: 'Declencher immediatement',
},
},
// Skills
skills: {
title: 'Competences',
searchPlaceholder: 'Rechercher des competences...',
noMatch: 'Aucune competence ne correspond a votre recherche',
noSkills: 'Aucune competence trouvee',
backTo: 'Retour a',
attachedFiles: 'Fichiers joints',
loadFailed: 'Echec du chargement de la competence',
fileLoadFailed: 'Echec du chargement du fichier',
toggleFailed: 'Echec de l\'activation/desactivation de la competence',
},
// Memory
memory: {
title: 'Memoire',
refresh: 'Actualiser',
loadFailed: 'Echec du chargement de la memoire',
myNotes: 'Mes notes',
noNotes: 'Aucune note pour l\'instant.',
notesPlaceholder: 'Ecrivez vos notes...',
userProfile: 'Profil utilisateur',
noProfile: 'Aucun profil pour l\'instant.',
profilePlaceholder: 'Ecrivez votre profil...',
soul: 'Ame',
noSoul: 'Aucune configuration d\'ame pour l\'instant.',
soulPlaceholder: 'Ecrivez la configuration de l\'ame...',
},
// Models
models: {
title: 'Modeles',
addProvider: 'Ajouter un fournisseur',
providerType: 'Type de fournisseur',
preset: 'Preset',
custom: 'Personnalise',
selectProvider: 'Selectionner un fournisseur',
chooseProvider: 'Choisir un fournisseur...',
name: 'Nom',
autoGeneratedName: 'Genere automatiquement a partir de l\'URL de base',
baseUrl: 'URL de base',
baseUrlPlaceholder: 'ex. https://api.example.com/v1',
apiKey: 'Cle API',
apiKeyPlaceholder: 'sk-...',
defaultModel: 'Modele par defaut',
selectModel: 'Selectionner un modele...',
providerAdded: 'Fournisseur ajoute',
providerDeleted: 'Fournisseur supprime',
deleteProvider: 'Supprimer le fournisseur',
deleteConfirm: 'Etes-vous sur de vouloir supprimer "{name}" ?',
noProviders: 'Aucun fournisseur trouve. Ajoutez un fournisseur personnalise pour commencer.',
builtIn: 'Integre',
customType: 'Personnalise',
provider: 'Fournisseur',
local: 'Local ({host})',
selectProviderRequired: 'Veuillez selectionner un fournisseur',
baseUrlRequired: 'L\'URL de base est requise',
apiKeyRequired: 'La cle API est requise',
modelRequired: 'Le modele par defaut est requis',
enterBaseUrl: 'Veuillez d\'abord entrer l\'URL de base',
unexpectedFormat: 'Format de reponse inattendu',
foundModels: '{count} modeles trouves',
fetchFailed: 'Echec de la recuperation des modeles',
},
// Profiles
profiles: {
title: 'Profils',
create: 'Creer un profil',
import: 'Importer',
export: 'Exporter',
rename: 'Renommer',
delete: 'Supprimer',
switchTo: 'Passer a',
switchConfirm: 'Le passage au profil "{name}" redemarrera la passerelle. Continuer ?',
switchSuccess: 'Profil "{name}" actif',
switchFailed: 'Echec du changement de profil. La passerelle peut necessiter un redemarrage manuel.',
createSuccess: 'Profil "{name}" cree',
createFailed: 'Echec de la creation du profil',
renameSuccess: 'Profil renomme',
renameFailed: 'Echec du renommage du profil',
deleteConfirm: 'Etes-vous sur de vouloir supprimer le profil "{name}" ?',
deleteSuccess: 'Profil supprime',
deleteFailed: 'Echec de la suppression du profil',
exportSuccess: 'Profil exporte',
exportFailed: 'Echec de l\'exportation du profil',
importSuccess: 'Profil importe',
importFailed: 'Echec de l\'importation du profil',
importSelectFile: 'Selectionner un fichier d\'archive',
importInvalidFile: 'Veuillez selectionner une archive valide (.tar.gz, .tgz, .gz, .zip)',
name: 'Nom du profil',
namePlaceholder: 'Lettres, chiffres et tirets uniquement',
newName: 'Nouveau nom',
newNamePlaceholder: 'Entrez un nouveau nom',
cloneFromCurrent: 'Cloner depuis le profil actuel',
archivePath: 'Chemin de l\'archive',
archivePathPlaceholder: 'Chemin serveur du fichier d\'archive',
importName: 'Nom du profil (facultatif)',
importNamePlaceholder: 'Laisser vide pour utiliser le nom de l\'archive',
active: 'Actif',
model: 'Modele',
gateway: 'Passerelle',
alias: 'Alias',
provider: 'Fournisseur',
path: 'Chemin',
skills: 'Competences',
hasEnv: 'A un .env',
hasSoulMd: 'A un soul.md',
noProfiles: 'Aucun profil trouve. Creez-en un pour commencer.',
},
// Logs
logs: {
title: 'Journaux',
all: 'Tout',
searchPlaceholder: 'Rechercher...',
refresh: 'Actualiser',
noEntries: 'Aucune entree de journal',
},
// Settings
settings: {
title: 'Parametres',
saved: 'Enregistre',
saveFailed: 'Echec de l\'enregistrement',
tabs: {
display: 'Affichage',
agent: 'Agent',
memory: 'Memoire',
session: 'Session',
privacy: 'Confidentialite',
apiServer: 'Serveur API',
},
display: {
streaming: 'Reponses en continu',
streamingHint: 'Afficher les reponses de l\'IA en temps reel',
compact: 'Mode compact',
compactHint: 'Reduire l\'espacement des messages',
showReasoning: 'Afficher le raisonnement',
showReasoningHint: 'Afficher le processus de reflexion du modele',
showCost: 'Afficher le cout',
showCostHint: 'Afficher l\'utilisation des jetons dans les reponses',
inlineDiffs: 'Diffs en ligne',
inlineDiffsHint: 'Afficher les changements de code en ligne',
bellOnComplete: 'Son de fin',
bellOnCompleteHint: 'Jouer un son lorsque l\'IA a termine',
busyInputMode: 'Mode saisie active',
busyInputModeHint: 'Permettre la saisie pendant le traitement de l\'IA',
theme: 'Theme',
themeHint: 'Choisir clair, sombre ou suivre les preferences du systeme',
themeLight: 'Clair',
themeDark: 'Sombre',
themeSystem: 'Systeme',
},
agent: {
maxTurns: 'Tours maximum',
maxTurnsHint: 'Nombre maximum de tours d\'interaction par conversation',
gatewayTimeout: 'Delai d\'attente de la passerelle',
gatewayTimeoutHint: 'Delai d\'attente de la requete en secondes',
restartDrainTimeout: 'Delai de vidange au redemarrage',
restartDrainTimeoutHint: 'Delai de vidange avant redemarrage en secondes',
toolEnforcement: 'Application des outils',
toolEnforcementHint: 'Controler le mode d\'execution des appels d\'outils',
auto: 'Automatique',
always: 'Toujours',
never: 'Jamais',
},
memory: {
enabled: 'Activer la memoire',
enabledHint: 'Permettre a l\'IA de memoriser le contexte de conversation',
userProfile: 'Profil utilisateur',
userProfileHint: 'Permettre a l\'IA de memoriser les preferences utilisateur',
charLimit: 'Limite de caracteres de la memoire',
charLimitHint: 'Nombre maximum de caracteres pour MEMORY.md',
userCharLimit: 'Limite de caracteres du profil utilisateur',
userCharLimitHint: 'Nombre maximum de caracteres pour USER.md',
},
session: {
mode: 'Mode de reinitialisation',
modeHint: 'Condition de declenchement de la reinitialisation de session',
modeBoth: 'Inactivite + Planifie',
modeIdle: 'Inactivite uniquement',
modeHourly: 'Planifie uniquement',
idleMinutes: 'Delai d\'inactivite',
idleMinutesHint: 'Temps d\'attente avant reinitialisation automatique (minutes)',
atHour: 'Heure de reinitialisation planifiee',
atHourHint: 'Reinitialiser la session a cette heure chaque jour',
},
privacy: {
redactPii: 'Masquer les DPI',
redactPiiHint: 'Detecter et masquer automatiquement les informations sensibles (mots de passe, cles, etc.)',
},
apiServer: {
enable: 'Activer',
enableHint: 'Activer le serveur API',
host: 'Hote',
hostHint: 'Adresse d\'ecoute',
port: 'Port',
portHint: 'Port d\'ecoute',
key: 'Cle',
keyHint: 'Cle d\'acces API',
cors: 'Origines CORS',
corsHint: 'Sources cross-origin autorisees',
},
},
// Platform channel settings
platform: {
requireMention: "Exiger une mention {'@'}",
requireMentionGroup: "Exiger une mention {'@'} dans les groupes pour repondre",
requireMentionChannel: "Exiger une mention {'@'} dans les canaux pour repondre",
requireMentionRoom: "Exiger une mention {'@'} dans les salles pour repondre",
reactions: 'Reactions',
reactionsHint: 'Reagir aux messages avec des emoji',
freeResponseChats: 'Discussions en reponse libre',
freeResponseChatsHint: "ID de discussions repondant sans mention {'@'} (separes par des virgules)",
freeResponseChannels: 'Canaux en reponse libre',
freeResponseChannelsHint: "ID de canaux repondant sans mention {'@'} (separes par des virgules)",
freeResponseRooms: 'Salles en reponse libre',
freeResponseRoomsHint: "ID de salles repondant sans mention {'@'} (separes par des virgules)",
mentionPatterns: 'Motifs de mention personnalises',
mentionPatternsHint: 'Motifs de declenchement supplementaires',
autoThread: 'Fil automatique',
autoThreadHint: "Creer automatiquement des fils de reponse apres une mention {'@'}",
autoThreadHintRoom: 'Creer automatiquement des fils de reponse dans les salles',
dmMentionThreads: 'Fils de mention en MP',
dmMentionThreadsHint: 'Utiliser des fils de reponse pour les mentions en MP',
allowBots: 'Autoriser les messages de bots',
allowBotsHint: 'Repondre aux messages d\'autres bots',
allowedChannels: 'Canaux autorises',
allowedChannelsHint: 'Liste blanche des ID de canaux (separes par des virgules)',
ignoredChannels: 'Canaux ignores',
ignoredChannelsHint: 'Canaux ou le bot ne repond jamais (separes par des virgules)',
noThreadChannels: 'Canaux sans fil',
noThreadChannelsHint: 'Canaux ou le bot repond sans fil (separes par des virgules)',
botToken: 'Jeton de bot',
botTokenHint: 'Jeton de bot depuis le portail developpeur',
accessToken: 'Jeton d\'acces',
accessTokenHint: 'Jeton d\'acces Matrix',
homeserver: 'URL du serveur domestique',
homeserverHint: 'URL du serveur domestique Matrix',
appId: 'ID de l\'application',
appIdHint: 'ID de l\'application Feishu',
appSecret: 'Secret de l\'application',
appSecretHint: 'Secret de l\'application Feishu',
clientId: 'ID client',
clientIdHint: 'ID client DingTalk',
clientSecret: 'Secret client',
clientSecretHint: 'Secret client DingTalk',
botId: 'ID du bot',
botIdHint: 'ID du bot WeCom',
wecomSecretHint: 'Secret du bot WeCom',
waEnabled: 'Activer WhatsApp',
waEnabledHint: 'Activer WhatsApp via appairage par code QR',
weixinToken: 'Jeton Weixin',
weixinTokenHint: 'Depuis la connexion QR de la CLI weixin (hermes weixin)',
accountId: 'ID de compte',
accountIdHint: 'ID du compte Weixin',
qrLogin: 'Connexion QR',
qrRelogin: 'Reconnexion',
qrFetching: 'Recuperation du code QR...',
qrScanHint: 'Scannez avec WeChat pour vous connecter',
qrScanedHint: 'Scanne, veuillez confirmer sur le telephone...',
},
// Language
language: {
label: 'Langue',
zh: '中文',
en: 'English',
fr: 'Francais',
},
// Terminal
terminal: {
sessions: 'Sessions',
newTab: 'Nouveau terminal',
closeSession: 'Fermer cette session ?',
sessionExited: 'Terminee',
processExited: 'Processus termine avec le code {code}',
},
// Usage
usage: {
title: 'Statistiques d\'utilisation',
refresh: 'Actualiser',
totalTokens: 'Total des jetons',
inputTokens: 'Entree',
outputTokens: 'Sortie',
totalSessions: 'Total des sessions',
avgPerDay: '~{n}/jour en moy.',
estimatedCost: 'Cout est.',
cacheHitRate: 'Taux de succes du cache',
modelBreakdown: 'Repartition par modele',
dailyTrend: 'Utilisation quotidienne (30 derniers jours)',
date: 'Date',
tokens: 'Jetons',
cache: 'Cache',
sessions: 'Sessions',
cost: 'Cout',
noData: 'Aucune donnee d\'utilisation',
},
}
+449
View File
@@ -0,0 +1,449 @@
export default {
// ログイン
login: {
title: 'Hermes Web UI',
description: 'アクセストークンを入力して続行してください。サーバーの起動ログで確認できます。',
placeholder: 'アクセストークン',
submit: 'ログイン',
tokenRequired: 'アクセストークンを入力してください',
invalidToken: '無効なトークンです',
connectionFailed: 'サーバーに接続できません',
},
// 共通
common: {
loading: '読み込み中...',
cancel: 'キャンセル',
delete: '削除',
edit: '編集',
save: '保存',
saved: '保存しました',
update: '更新',
create: '作成',
saveFailed: '保存に失敗しました',
ok: 'OK',
copied: 'コピーしました',
copy: 'コピー',
noData: 'データがありません',
fetch: '取得',
add: '追加',
enable: '有効化',
disable: '無効化',
configured: '設定済み',
notConfigured: '未設定',
confirm: '確認',
expand: '展開',
collapse: '折りたたむ',
},
// サイドバー
sidebar: {
chat: 'チャット',
jobs: 'ジョブ',
models: 'モデル',
profiles: 'プロファイル',
skills: 'スキル',
memory: 'メモリ',
logs: 'ログ',
usage: '使用量',
channels: 'チャンネル',
terminal: 'ターミナル',
settings: '設定',
connected: '接続済み',
disconnected: '未接続',
updateTip: 'ターミナルで "hermes-web-ui update" を実行して更新してください',
updateVersion: 'v{version} にアップグレード',
updating: '更新中...',
updateSuccess: '更新が完了しました。サーバーを再起動してください',
updateFailed: '更新に失敗しました',
},
// チャット
chat: {
emptyState: 'Hermes Agent と会話を開始しましょう',
inputPlaceholder: 'メッセージを入力... (Enter で送信、Shift+Enter で改行)',
attachFiles: 'ファイルを添付',
stop: '停止',
send: '送信',
contextUsed: 'コンテキスト使用量:',
sessions: 'セッション',
noSessions: 'セッションがありません',
newChat: '新しいチャット',
deleteSession: 'このセッションを削除しますか?',
sessionDeleted: 'セッションを削除しました',
rename: '名前変更',
copySessionId: 'セッション ID をコピー',
renamed: '名前を変更しました',
renameFailed: '名前の変更に失敗しました',
renameSession: 'セッション名の変更',
enterNewTitle: '新しいタイトルを入力',
other: 'その他',
runFailed: '実行に失敗しました',
error: 'エラー',
tool: 'ツール',
arguments: '引数',
result: '結果',
truncated: '... (省略)',
},
// スケジュールジョブ
jobs: {
title: 'スケジュールジョブ',
createJob: 'ジョブを作成',
editJob: 'ジョブを編集',
noJobs: 'スケジュールジョブがありません。作成して始めましょう。',
name: '名前',
namePlaceholder: 'ジョブ名',
schedule: 'スケジュール (Cron 式)',
schedulePlaceholder: '例: 0 9 * * *',
quickPresets: 'クイックプリセット',
selectPreset: 'プリセットを選択...',
presetEveryMinute: '毎分',
presetEvery5Min: '5分ごと',
presetEveryHour: '毎時',
presetEveryDay: '毎日 00:00',
presetEveryDay9: '毎日 09:00',
presetEveryMonday: '毎週月曜 09:00',
presetEveryMonth: '毎月1日 09:00',
prompt: 'プロンプト',
promptPlaceholder: '実行するプロンプト',
deliverTarget: '配信先',
origin: '配信元',
local: 'ローカル',
repeatCount: '繰り返し回数(任意)',
repeatPlaceholder: '空白の場合は無制限',
jobCreated: 'ジョブを作成しました',
jobUpdated: 'ジョブを更新しました',
nameRequired: '名前は必須です',
scheduleRequired: 'スケジュールは必須です',
loadFailed: 'ジョブの読み込みに失敗しました',
jobPaused: 'ジョブを一時停止しました',
jobResumed: 'ジョブを再開しました',
jobTriggered: 'ジョブをトリガーしました',
jobDeleted: 'ジョブを削除しました',
status: {
running: '実行中',
paused: '一時停止',
disabled: '無効',
scheduled: 'スケジュール済み',
},
info: {
schedule: 'スケジュール',
lastRun: '前回実行',
nextRun: '次回実行',
deliver: '配信',
repeat: '繰り返し',
},
action: {
pause: '一時停止',
pauseJob: 'ジョブを一時停止',
resume: '再開',
resumeJob: 'ジョブを再開',
runNow: '今すぐ実行',
triggerImmediately: 'すぐにトリガー',
},
},
// スキル
skills: {
title: 'スキル',
searchPlaceholder: 'スキルを検索...',
noMatch: '検索に一致するスキルがありません',
noSkills: 'スキルがありません',
backTo: '戻る',
attachedFiles: '添付ファイル',
loadFailed: 'スキルの読み込みに失敗しました',
fileLoadFailed: 'ファイルの読み込みに失敗しました',
toggleFailed: 'スキルの切り替えに失敗しました',
},
// メモリ
memory: {
title: 'メモリ',
refresh: '更新',
loadFailed: 'メモリの読み込みに失敗しました',
myNotes: 'メモ',
noNotes: 'メモはまだありません。',
notesPlaceholder: 'メモを入力...',
userProfile: 'ユーザープロファイル',
noProfile: 'プロファイルはまだありません。',
profilePlaceholder: 'プロファイルを入力...',
soul: 'ソウル',
noSoul: 'ソウル設定はまだありません。',
soulPlaceholder: 'ソウル設定を入力...',
},
// モデル
models: {
title: 'モデル',
addProvider: 'プロバイダーを追加',
providerType: 'プロバイダー種別',
preset: 'プリセット',
custom: 'カスタム',
selectProvider: 'プロバイダーを選択',
chooseProvider: 'プロバイダーを選択...',
name: '名前',
autoGeneratedName: 'ベース URL から自動生成',
baseUrl: 'ベース URL',
baseUrlPlaceholder: '例: https://api.example.com/v1',
apiKey: 'API キー',
apiKeyPlaceholder: 'sk-...',
defaultModel: 'デフォルトモデル',
selectModel: 'モデルを選択...',
providerAdded: 'プロバイダーを追加しました',
providerDeleted: 'プロバイダーを削除しました',
deleteProvider: 'プロバイダーを削除',
deleteConfirm: '「{name}」を削除しますか?',
noProviders: 'プロバイダーがありません。カスタムプロバイダーを追加して始めましょう。',
builtIn: '組み込み',
customType: 'カスタム',
provider: 'プロバイダー',
local: 'ローカル ({host})',
selectProviderRequired: 'プロバイダーを選択してください',
baseUrlRequired: 'ベース URL は必須です',
apiKeyRequired: 'API キーは必須です',
modelRequired: 'デフォルトモデルは必須です',
enterBaseUrl: 'ベース URL を先に入力してください',
unexpectedFormat: '予期しないレスポンス形式です',
foundModels: '{count} 個のモデルが見つかりました',
fetchFailed: 'モデルの取得に失敗しました',
},
// プロファイル
profiles: {
title: 'プロファイル',
create: 'プロファイルを作成',
import: 'インポート',
export: 'エクスポート',
rename: '名前変更',
delete: '削除',
switchTo: '切り替え',
switchConfirm: 'プロファイル「{name}」に切り替えるとゲートウェイが再起動されます。続行しますか?',
switchSuccess: 'プロファイル「{name}」に切り替えました',
switchFailed: 'プロファイルの切り替えに失敗しました。ゲートウェイの手動再起動が必要な場合があります。',
createSuccess: 'プロファイル「{name}」を作成しました',
createFailed: 'プロファイルの作成に失敗しました',
renameSuccess: 'プロファイル名を変更しました',
renameFailed: 'プロファイル名の変更に失敗しました',
deleteConfirm: 'プロファイル「{name}」を削除しますか?',
deleteSuccess: 'プロファイルを削除しました',
deleteFailed: 'プロファイルの削除に失敗しました',
exportSuccess: 'プロファイルをエクスポートしました',
exportFailed: 'プロファイルのエクスポートに失敗しました',
importSuccess: 'プロファイルをインポートしました',
importFailed: 'プロファイルのインポートに失敗しました',
importSelectFile: 'アーカイブファイルを選択',
importInvalidFile: '有効なアーカイブファイルを選択してください (.tar.gz, .tgz, .gz, .zip)',
name: 'プロファイル名',
namePlaceholder: '英数字、ハイフンのみ',
newName: '新しい名前',
newNamePlaceholder: '新しい名前を入力',
cloneFromCurrent: '現在のプロファイルから複製',
archivePath: 'アーカイブパス',
archivePathPlaceholder: 'アーカイブファイルのサーバーパス',
importName: 'プロファイル名(任意)',
importNamePlaceholder: '空白の場合はアーカイブ名を使用',
active: 'アクティブ',
model: 'モデル',
gateway: 'ゲートウェイ',
alias: 'エイリアス',
provider: 'プロバイダー',
path: 'パス',
skills: 'スキル',
hasEnv: '.env あり',
hasSoulMd: 'soul.md あり',
noProfiles: 'プロファイルがありません。作成して始めましょう。',
},
// ログ
logs: {
title: 'ログ',
all: 'すべて',
searchPlaceholder: '検索...',
refresh: '更新',
noEntries: 'ログエントリがありません',
},
// 設定
settings: {
title: '設定',
saved: '保存しました',
saveFailed: '保存に失敗しました',
tabs: {
display: '表示',
agent: 'エージェント',
memory: 'メモリ',
session: 'セッション',
privacy: 'プライバシー',
apiServer: 'API サーバー',
},
display: {
streaming: 'ストリームレスポンス',
streamingHint: 'AI の返信をリアルタイムで表示',
compact: 'コンパクトモード',
compactHint: 'メッセージの間隔を狭める',
showReasoning: '推論過程を表示',
showReasoningHint: 'モデルの思考プロセスを表示',
showCost: 'コストを表示',
showCostHint: '返信にトークン使用量を表示',
inlineDiffs: 'インライン差分',
inlineDiffsHint: 'コード変更をインラインで表示',
bellOnComplete: '完了通知音',
bellOnCompleteHint: 'AI の応答完了時に通知音を再生',
busyInputMode: '処理中入力モード',
busyInputModeHint: 'AI 処理中でも入力を許可',
theme: 'テーマ',
themeHint: 'ライト、ダーク、またはシステム設定に従う',
themeLight: 'ライト',
themeDark: 'ダーク',
themeSystem: 'システム',
},
agent: {
maxTurns: '最大ターン数',
maxTurnsHint: '1回の会話の最大インタラクション回数',
gatewayTimeout: 'ゲートウェイタイムアウト',
gatewayTimeoutHint: 'リクエストタイムアウト(秒)',
restartDrainTimeout: '再起動ドレインタイムアウト',
restartDrainTimeoutHint: '再起動前のドレインタイムアウト(秒)',
toolEnforcement: 'ツール実行ポリシー',
toolEnforcementHint: 'ツール呼び出しの実行モードを制御',
auto: '自動',
always: '常に',
never: 'しない',
},
memory: {
enabled: 'メモリを有効化',
enabledHint: 'AI に会話コンテキストを記憶させる',
userProfile: 'ユーザープロファイル',
userProfileHint: 'AI にユーザーの設定を記憶させる',
charLimit: 'メモリ文字数上限',
charLimitHint: 'MEMORY.md の最大文字数',
userCharLimit: 'ユーザープロファイル文字数上限',
userCharLimitHint: 'USER.md の最大文字数',
},
session: {
mode: 'リセットモード',
modeHint: 'セッションリセットのトリガー条件',
modeBoth: 'アイドル + スケジュール',
modeIdle: 'アイドルのみ',
modeHourly: 'スケジュールのみ',
idleMinutes: 'アイドルタイムアウト',
idleMinutesHint: '自動リセットまでの待機時間(分)',
atHour: 'スケジュールリセット時刻',
atHourHint: '毎日指定時刻にセッションをリセット',
},
privacy: {
redactPii: '個人情報のマスキング',
redactPiiHint: '機密情報を自動検出して隠す(パスワード、キーなど)',
},
apiServer: {
enable: '有効化',
enableHint: 'API サーバーを有効にする',
host: 'ホスト',
hostHint: 'リッスンアドレス',
port: 'ポート',
portHint: 'リッスンポート',
key: 'キー',
keyHint: 'API アクセスキー',
cors: 'CORS 許可元',
corsHint: '許可するクロスオリジン',
},
},
// プラットフォームチャンネル設定
platform: {
requireMention: "メンションが必要",
requireMentionGroup: "グループで応答するには {'@'}メンションが必要",
requireMentionChannel: "チャンネルで応答するには {'@'}メンションが必要",
requireMentionRoom: "ルームで応答するには {'@'}メンションが必要",
reactions: 'リアクション',
reactionsHint: 'メッセージに絵文字でリアクションする',
freeResponseChats: '自由応答チャット',
freeResponseChatsHint: "{'@'}メンションなしで応答するチャット ID(カンマ区切り)",
freeResponseChannels: '自由応答チャンネル',
freeResponseChannelsHint: "{'@'}メンションなしで応答するチャンネル ID(カンマ区切り)",
freeResponseRooms: '自由応答ルーム',
freeResponseRoomsHint: "{'@'}メンションなしで応答するルーム ID(カンマ区切り)",
mentionPatterns: 'カスタムメンションパターン',
mentionPatternsHint: '追加のトリガーパターン',
autoThread: '自動スレッド',
autoThreadHint: "{'@'}メンション後に自動で返信スレッドを作成",
autoThreadHintRoom: 'ルームで自動的に返信スレッドを作成',
dmMentionThreads: 'DM メンションスレッド',
dmMentionThreadsHint: 'DM 内のメンションにスレッド返信を使用',
allowBots: 'ボットメッセージを許可',
allowBotsHint: '他のボットからのメッセージに応答する',
allowedChannels: '許可チャンネル',
allowedChannelsHint: 'ホワイトリストのチャンネル ID(カンマ区切り)',
ignoredChannels: '除外チャンネル',
ignoredChannelsHint: 'ボットが応答しないチャンネル ID(カンマ区切り)',
noThreadChannels: 'スレッドなしチャンネル',
noThreadChannelsHint: 'スレッドなしで応答するチャンネル ID(カンマ区切り)',
botToken: 'ボットトークン',
botTokenHint: '開発者ポータルから取得したボットトークン',
accessToken: 'アクセストークン',
accessTokenHint: 'Matrix アクセストークン',
homeserver: 'Homeserver URL',
homeserverHint: 'Matrix ホームサーバー URL',
appId: 'App ID',
appIdHint: 'Feishu App ID',
appSecret: 'App Secret',
appSecretHint: 'Feishu App Secret',
clientId: 'Client ID',
clientIdHint: 'DingTalk Client ID',
clientSecret: 'Client Secret',
clientSecretHint: 'DingTalk Client Secret',
botId: 'Bot ID',
botIdHint: 'WeCom Bot ID',
wecomSecretHint: 'WeCom Bot Secret',
waEnabled: 'WhatsApp を有効化',
waEnabledHint: 'QR コードペアリングで WhatsApp を有効にする',
weixinToken: 'Weixin トークン',
weixinTokenHint: 'weixin CLI の QR ログインから取得 (hermes weixin)',
accountId: 'Account ID',
accountIdHint: 'Weixin アカウント ID',
qrLogin: 'QR ログイン',
qrRelogin: '再ログイン',
qrFetching: 'QR コードを取得中...',
qrScanHint: 'WeChat でスキャンしてログイン',
qrScanedHint: 'スキャン済み、スマートフォンで確認してください...',
},
// 言語
language: {
label: '言語',
zh: '中文',
en: 'English',
ja: '日本語',
},
// ターミナル
terminal: {
sessions: 'セッション',
newTab: '新しいターミナル',
closeSession: 'このセッションを閉じますか?',
sessionExited: '終了しました',
processExited: 'プロセスが終了しました(コード {code})',
},
// 使用統計
usage: {
title: '使用統計',
refresh: '更新',
totalTokens: '総トークン数',
inputTokens: '入力',
outputTokens: '出力',
totalSessions: '総セッション数',
avgPerDay: '1日平均 ~{n}',
estimatedCost: '推定コスト',
cacheHitRate: 'キャッシュヒット率',
modelBreakdown: 'モデル別内訳',
dailyTrend: '日別使用量(過去30日間)',
date: '日付',
tokens: 'トークン',
cache: 'キャッシュ',
sessions: 'セッション',
cost: 'コスト',
noData: '使用データがありません',
},
}
+449
View File
@@ -0,0 +1,449 @@
export default {
// 로그인
login: {
title: 'Hermes Web UI',
description: '계속하려면 액세스 토큰을 입력하세요. 서버 시작 로그에서 확인할 수 있습니다.',
placeholder: '액세스 토큰',
submit: '로그인',
tokenRequired: '액세스 토큰을 입력해 주세요',
invalidToken: '유효하지 않은 토큰입니다',
connectionFailed: '서버에 연결할 수 없습니다',
},
// 공통
common: {
loading: '로딩 중...',
cancel: '취소',
delete: '삭제',
edit: '편집',
save: '저장',
saved: '저장됨',
update: '업데이트',
create: '생성',
saveFailed: '저장 실패',
ok: '확인',
copied: '복사됨',
copy: '복사',
noData: '데이터 없음',
fetch: '가져오기',
add: '추가',
enable: '활성화',
disable: '비활성화',
configured: '구성됨',
notConfigured: '미구성',
confirm: '확인',
expand: '펼치기',
collapse: '접기',
},
// 사이드바
sidebar: {
chat: '채팅',
jobs: '예약 작업',
models: '모델',
profiles: '프로필',
skills: '스킬',
memory: '메모리',
logs: '로그',
usage: '사용량',
channels: '채널',
terminal: '터미널',
settings: '설정',
connected: '연결됨',
disconnected: '연결 끊김',
updateTip: '터미널에서 "hermes-web-ui update"를 실행하여 업데이트하세요',
updateVersion: 'v{version}(으)로 업그레이드',
updating: '업데이트 중...',
updateSuccess: '업데이트 완료, 서버를 재시작해 주세요',
updateFailed: '업데이트 실패',
},
// 채팅
chat: {
emptyState: 'Hermes Agent와 대화를 시작하세요',
inputPlaceholder: '메시지를 입력하세요... (Enter로 전송, Shift+Enter로 줄바꿈)',
attachFiles: '파일 첨부',
stop: '중지',
send: '전송',
contextUsed: '사용된 컨텍스트:',
sessions: '세션',
noSessions: '세션 없음',
newChat: '새 채팅',
deleteSession: '이 세션을 삭제하시겠습니까?',
sessionDeleted: '세션이 삭제되었습니다',
rename: '이름 변경',
copySessionId: '세션 ID 복사',
renamed: '이름이 변경되었습니다',
renameFailed: '이름 변경 실패',
renameSession: '세션 이름 변경',
enterNewTitle: '새 제목을 입력하세요',
other: '기타',
runFailed: '실행 실패',
error: '오류',
tool: '도구',
arguments: '인수',
result: '결과',
truncated: '... (잘림)',
},
// 예약 작업
jobs: {
title: '예약 작업',
createJob: '작업 생성',
editJob: '작업 편집',
noJobs: '예약된 작업이 없습니다. 새로 만들어 시작하세요.',
name: '이름',
namePlaceholder: '작업 이름',
schedule: '스케줄 (Cron 표현식)',
schedulePlaceholder: '예: 0 9 * * *',
quickPresets: '빠른 프리셋',
selectPreset: '프리셋 선택...',
presetEveryMinute: '매 분',
presetEvery5Min: '매 5분',
presetEveryHour: '매 시간',
presetEveryDay: '매일 00:00',
presetEveryDay9: '매일 09:00',
presetEveryMonday: '매주 월요일 09:00',
presetEveryMonth: '매월 1일 09:00',
prompt: '프롬프트',
promptPlaceholder: '실행할 프롬프트',
deliverTarget: '전송 대상',
origin: '출처',
local: '로컬',
repeatCount: '반복 횟수 (선택)',
repeatPlaceholder: '비워두면 무한 반복',
jobCreated: '작업이 생성되었습니다',
jobUpdated: '작업이 업데이트되었습니다',
nameRequired: '이름을 입력해 주세요',
scheduleRequired: '스케줄을 입력해 주세요',
loadFailed: '작업을 불러오지 못했습니다',
jobPaused: '작업이 일시 정지되었습니다',
jobResumed: '작업이 재개되었습니다',
jobTriggered: '작업이 실행되었습니다',
jobDeleted: '작업이 삭제되었습니다',
status: {
running: '실행 중',
paused: '일시 정지',
disabled: '비활성화',
scheduled: '예약됨',
},
info: {
schedule: '스케줄',
lastRun: '마지막 실행',
nextRun: '다음 실행',
deliver: '전송',
repeat: '반복',
},
action: {
pause: '일시 정지',
pauseJob: '작업 일시 정지',
resume: '재개',
resumeJob: '작업 재개',
runNow: '즉시 실행',
triggerImmediately: '즉시 실행',
},
},
// 스킬
skills: {
title: '스킬',
searchPlaceholder: '스킬 검색...',
noMatch: '검색과 일치하는 스킬이 없습니다',
noSkills: '스킬을 찾을 수 없습니다',
backTo: '돌아가기',
attachedFiles: '첨부 파일',
loadFailed: '스킬을 불러오지 못했습니다',
fileLoadFailed: '파일을 불러오지 못했습니다',
toggleFailed: '스킬 상태를 전환하지 못했습니다',
},
// 메모리
memory: {
title: '메모리',
refresh: '새로고침',
loadFailed: '메모리를 불러오지 못했습니다',
myNotes: '내 메모',
noNotes: '메모가 없습니다.',
notesPlaceholder: '메모를 작성하세요...',
userProfile: '사용자 프로필',
noProfile: '프로필이 없습니다.',
profilePlaceholder: '프로필을 작성하세요...',
soul: '소울',
noSoul: '소울 설정이 없습니다.',
soulPlaceholder: '소울 설정을 작성하세요...',
},
// 모델
models: {
title: '모델',
addProvider: 'Provider 추가',
providerType: 'Provider 유형',
preset: '프리셋',
custom: '사용자 지정',
selectProvider: 'Provider 선택',
chooseProvider: 'Provider를 선택하세요...',
name: '이름',
autoGeneratedName: 'Base URL에서 자동 생성',
baseUrl: 'Base URL',
baseUrlPlaceholder: '예: https://api.example.com/v1',
apiKey: 'API Key',
apiKeyPlaceholder: 'sk-...',
defaultModel: '기본 모델',
selectModel: '모델 선택...',
providerAdded: 'Provider가 추가되었습니다',
providerDeleted: 'Provider가 삭제되었습니다',
deleteProvider: 'Provider 삭제',
deleteConfirm: '"{name}"을(를) 삭제하시겠습니까?',
noProviders: 'Provider가 없습니다. 사용자 지정 Provider를 추가하여 시작하세요.',
builtIn: '내장',
customType: '사용자 지정',
provider: 'Provider',
local: '로컬 ({host})',
selectProviderRequired: 'Provider를 선택해 주세요',
baseUrlRequired: 'Base URL을 입력해 주세요',
apiKeyRequired: 'API Key를 입력해 주세요',
modelRequired: '기본 모델을 선택해 주세요',
enterBaseUrl: '먼저 Base URL을 입력해 주세요',
unexpectedFormat: '예상치 못한 응답 형식입니다',
foundModels: '{count}개의 모델을 찾았습니다',
fetchFailed: '모델을 가져오지 못했습니다',
},
// 프로필
profiles: {
title: '프로필',
create: '프로필 생성',
import: '가져오기',
export: '내보내기',
rename: '이름 변경',
delete: '삭제',
switchTo: '전환',
switchConfirm: '프로필 "{name}"(으)로 전환하면 게이트웨이가 재시작됩니다. 계속하시겠습니까?',
switchSuccess: '프로필 "{name}"(으)로 전환되었습니다',
switchFailed: '프로필 전환 실패. 게이트웨이를 수동으로 재시작해야 할 수 있습니다.',
createSuccess: '프로필 "{name}"이(가) 생성되었습니다',
createFailed: '프로필 생성 실패',
renameSuccess: '프로필 이름이 변경되었습니다',
renameFailed: '프로필 이름 변경 실패',
deleteConfirm: '프로필 "{name}"을(를) 삭제하시겠습니까?',
deleteSuccess: '프로필이 삭제되었습니다',
deleteFailed: '프로필 삭제 실패',
exportSuccess: '프로필이 내보내기되었습니다',
exportFailed: '프로필 내보내기 실패',
importSuccess: '프로필이 가져오기되었습니다',
importFailed: '프로필 가져오기 실패',
importSelectFile: '아카이브 파일 선택',
importInvalidFile: '유효한 아카이브 파일을 선택해 주세요 (.tar.gz, .tgz, .gz, .zip)',
name: '프로필 이름',
namePlaceholder: '영문, 숫자, 하이픈만 사용 가능',
newName: '새 이름',
newNamePlaceholder: '새 이름을 입력하세요',
cloneFromCurrent: '현재 프로필에서 복제',
archivePath: '아카이브 경로',
archivePathPlaceholder: '아카이브 파일의 서버 경로',
importName: '프로필 이름 (선택)',
importNamePlaceholder: '비워두면 아카이브 이름을 사용합니다',
active: '활성',
model: '모델',
gateway: '게이트웨이',
alias: '별칭',
provider: 'Provider',
path: '경로',
skills: '스킬',
hasEnv: '.env 있음',
hasSoulMd: 'soul.md 있음',
noProfiles: '프로필이 없습니다. 새로 만들어 시작하세요.',
},
// 로그
logs: {
title: '로그',
all: '전체',
searchPlaceholder: '검색...',
refresh: '새로고침',
noEntries: '로그 항목 없음',
},
// 설정
settings: {
title: '설정',
saved: '저장됨',
saveFailed: '저장 실패',
tabs: {
display: '표시',
agent: '에이전트',
memory: '메모리',
session: '세션',
privacy: '개인정보',
apiServer: 'API 서버',
},
display: {
streaming: '스트리밍 응답',
streamingHint: 'AI 응답을 실시간으로 표시',
compact: '컴팩트 모드',
compactHint: '메시지 간격 줄이기',
showReasoning: '추론 과정 표시',
showReasoningHint: '모델의 생각 과정 표시',
showCost: '비용 표시',
showCostHint: '응답에 토큰 사용량 표시',
inlineDiffs: '인라인 변경사항',
inlineDiffsHint: '코드 변경사항을 인라인으로 표시',
bellOnComplete: '완료 알림음',
bellOnCompleteHint: 'AI 응답 완료 시 알림음 재생',
busyInputMode: '바쁨 입력 모드',
busyInputModeHint: 'AI 처리 중에도 입력 허용',
theme: '테마',
themeHint: '라이트, 다크 또는 시스템 설정 따르기',
themeLight: '라이트',
themeDark: '다크',
themeSystem: '시스템',
},
agent: {
maxTurns: '최대 턴 수',
maxTurnsHint: '대화당 최대 상호작용 라운드 수',
gatewayTimeout: '게이트웨이 시간초과',
gatewayTimeoutHint: '요청 시간초과 (초)',
restartDrainTimeout: '재시작 드레인 시간초과',
restartDrainTimeoutHint: '재시작 전 드레인 시간초과 (초)',
toolEnforcement: '도구 실행 정책',
toolEnforcementHint: '도구 호출 실행 모드 제어',
auto: '자동',
always: '항상',
never: '사용 안 함',
},
memory: {
enabled: '메모리 활성화',
enabledHint: 'AI가 대화 컨텍스트를 기억하도록 허용',
userProfile: '사용자 프로필',
userProfileHint: 'AI가 사용자 선호를 기억하도록 허용',
charLimit: '메모리 문자 제한',
charLimitHint: 'MEMORY.md 최대 문자 수',
userCharLimit: '사용자 프로필 문자 제한',
userCharLimitHint: 'USER.md 최대 문자 수',
},
session: {
mode: '초기화 모드',
modeHint: '세션 초기화 트리거 조건',
modeBoth: '유휴 + 예약',
modeIdle: '유휴만',
modeHourly: '예약만',
idleMinutes: '유휴 시간초과',
idleMinutesHint: '자동 초기화 대기 시간 (분)',
atHour: '예약 초기화 시간',
atHourHint: '매일 지정한 시간에 세션 초기화',
},
privacy: {
redactPii: '개인정보 마스킹',
redactPiiHint: '민감 정보 자동 감지 및 숨김 (비밀번호, 키 등)',
},
apiServer: {
enable: '활성화',
enableHint: 'API 서버 활성화',
host: '호스트',
hostHint: '수신 주소',
port: '포트',
portHint: '수신 포트',
key: '키',
keyHint: 'API 접근 키',
cors: 'CORS 출처',
corsHint: '허용된 교차 출처',
},
},
// 플랫폼 채널 설정
platform: {
requireMention: "{'@'}멘션 필요",
requireMentionGroup: "그룹에서 {'@'}멘션 시에만 응답",
requireMentionChannel: "채널에서 {'@'}멘션 시에만 응답",
requireMentionRoom: "방에서 {'@'}멘션 시에만 응답",
reactions: '반응',
reactionsHint: '메시지에 이모지 반응',
freeResponseChats: '자유 응답 채팅',
freeResponseChatsHint: "{'@'}멘션 없이 응답할 채팅 ID (쉼표로 구분)",
freeResponseChannels: '자유 응답 채널',
freeResponseChannelsHint: "{'@'}멘션 없이 응답할 채널 ID (쉼표로 구분)",
freeResponseRooms: '자유 응답 방',
freeResponseRoomsHint: "{'@'}멘션 없이 응답할 방 ID (쉼표로 구분)",
mentionPatterns: '사용자 지정 멘션 패턴',
mentionPatternsHint: '추가 트리거 패턴',
autoThread: '자동 스레드',
autoThreadHint: "{'@'}멘션 후 자동으로 스레드 생성",
autoThreadHintRoom: '방에서 자동으로 스레드 생성',
dmMentionThreads: 'DM 멘션 스레드',
dmMentionThreadsHint: 'DM에서 멘션 시 스레드로 응답',
allowBots: '봇 메시지 허용',
allowBotsHint: '다른 봇의 메시지에 응답',
allowedChannels: '허용된 채널',
allowedChannelsHint: '채널 ID 허용 목록 (쉼표로 구분)',
ignoredChannels: '무시할 채널',
ignoredChannelsHint: '봇이 응답하지 않는 채널 ID (쉼표로 구분)',
noThreadChannels: '스레드 없는 채널',
noThreadChannelsHint: '스레드 없이 응답할 채널 ID (쉼표로 구분)',
botToken: 'Bot Token',
botTokenHint: '개발자 포털에서 발급받은 Bot Token',
accessToken: 'Access Token',
accessTokenHint: 'Matrix Access Token',
homeserver: 'Homeserver URL',
homeserverHint: 'Matrix 홈서버 URL',
appId: 'App ID',
appIdHint: 'Feishu App ID',
appSecret: 'App Secret',
appSecretHint: 'Feishu App Secret',
clientId: 'Client ID',
clientIdHint: 'DingTalk Client ID',
clientSecret: 'Client Secret',
clientSecretHint: 'DingTalk Client Secret',
botId: 'Bot ID',
botIdHint: 'WeCom Bot ID',
wecomSecretHint: 'WeCom Bot Secret',
waEnabled: 'WhatsApp 활성화',
waEnabledHint: 'QR 코드 페어링으로 WhatsApp 활성화',
weixinToken: 'Weixin Token',
weixinTokenHint: 'weixin CLI QR 로그인에서 가져오기 (hermes weixin)',
accountId: 'Account ID',
accountIdHint: 'Weixin Account ID',
qrLogin: 'QR 로그인',
qrRelogin: '다시 로그인',
qrFetching: 'QR 코드를 가져오는 중...',
qrScanHint: 'WeChat으로 QR 코드를 스캔하여 로그인',
qrScanedHint: '스캔됨, 휴대폰에서 확인해 주세요...',
},
// 언어
language: {
label: '언어',
zh: '中文',
en: 'English',
ko: '한국어',
},
// 터미널
terminal: {
sessions: '세션',
newTab: '새 터미널',
closeSession: '이 세션을 닫으시겠습니까?',
sessionExited: '종료됨',
processExited: '프로세스가 종료되었습니다 (코드 {code})',
},
// 사용량
usage: {
title: '사용량 통계',
refresh: '새로고침',
totalTokens: '총 토큰 수',
inputTokens: '입력',
outputTokens: '출력',
totalSessions: '총 세션 수',
avgPerDay: '일평균 ~{n}',
estimatedCost: '예상 비용',
cacheHitRate: '캐시 적중률',
modelBreakdown: '모델별 분포',
dailyTrend: '일별 사용량 (최근 30일)',
date: '날짜',
tokens: '토큰',
cache: '캐시',
sessions: '세션',
cost: '비용',
noData: '사용량 데이터 없음',
},
}
+449
View File
@@ -0,0 +1,449 @@
export default {
// Login
login: {
title: 'Hermes Web UI',
description: 'Insira seu token de acesso para continuar. Encontre-o nos logs de inicializacao do servidor.',
placeholder: 'Token de acesso',
submit: 'Entrar',
tokenRequired: 'Por favor, insira seu token de acesso',
invalidToken: 'Token invalido',
connectionFailed: 'Nao foi possivel conectar ao servidor',
},
// Common
common: {
loading: 'Carregando...',
cancel: 'Cancelar',
delete: 'Excluir',
edit: 'Editar',
save: 'Salvar',
saved: 'Salvo',
update: 'Atualizar',
create: 'Criar',
saveFailed: 'Falha ao salvar',
ok: 'OK',
copied: 'Copiado',
copy: 'Copiar',
noData: 'Sem dados',
fetch: 'Buscar',
add: 'Adicionar',
enable: 'Ativar',
disable: 'Desativar',
configured: 'Configurado',
notConfigured: 'Nao configurado',
confirm: 'Confirmar',
expand: 'Expandir',
collapse: 'Recolher',
},
// Sidebar
sidebar: {
chat: 'Chat',
jobs: 'Tarefas agendadas',
models: 'Modelos',
profiles: 'Perfis',
skills: 'Habilidades',
memory: 'Memoria',
logs: 'Logs',
usage: 'Uso',
channels: 'Canais',
terminal: 'Terminal',
settings: 'Configuracoes',
connected: 'Conectado',
disconnected: 'Desconectado',
updateTip: 'Execute "hermes-web-ui update" no terminal para atualizar',
updateVersion: 'Atualizar para v{version}',
updating: 'Atualizando...',
updateSuccess: 'Atualizacao concluida, por favor reinicie o servidor',
updateFailed: 'Falha na atualizacao',
},
// Chat
chat: {
emptyState: 'Inicie uma conversa com o Hermes Agent',
inputPlaceholder: 'Digite uma mensagem... (Enter para enviar, Shift+Enter para nova linha)',
attachFiles: 'Anexar arquivos',
stop: 'Parar',
send: 'Enviar',
contextUsed: 'Contexto utilizado:',
sessions: 'Sessoes',
noSessions: 'Sem sessoes',
newChat: 'Novo chat',
deleteSession: 'Excluir esta sessao?',
sessionDeleted: 'Sessao excluida',
rename: 'Renomear',
copySessionId: 'Copiar ID da sessao',
renamed: 'Renomeado',
renameFailed: 'Falha ao renomear',
renameSession: 'Renomear sessao',
enterNewTitle: 'Digite um novo titulo',
other: 'Outro',
runFailed: 'Falha na execucao',
error: 'Erro',
tool: 'Ferramenta',
arguments: 'Argumentos',
result: 'Resultado',
truncated: '... (truncado)',
},
// Jobs
jobs: {
title: 'Tarefas agendadas',
createJob: 'Criar tarefa',
editJob: 'Editar tarefa',
noJobs: 'Nenhuma tarefa agendada ainda. Crie uma para comecar.',
name: 'Nome',
namePlaceholder: 'Nome da tarefa',
schedule: 'Agendamento (expressao Cron)',
schedulePlaceholder: 'ex. 0 9 * * *',
quickPresets: 'Presets rapidos',
selectPreset: 'Selecionar um preset...',
presetEveryMinute: 'Cada minuto',
presetEvery5Min: 'A cada 5 minutos',
presetEveryHour: 'Cada hora',
presetEveryDay: 'Todos os dias as 00:00',
presetEveryDay9: 'Todos os dias as 09:00',
presetEveryMonday: 'Toda segunda as 09:00',
presetEveryMonth: 'Dia 1 de cada mes as 09:00',
prompt: 'Prompt',
promptPlaceholder: 'O prompt a executar',
deliverTarget: 'Destino de entrega',
origin: 'Origem',
local: 'Local',
repeatCount: 'Contagem de repeticoes (opcional)',
repeatPlaceholder: 'Deixar vazio para infinito',
jobCreated: 'Tarefa criada',
jobUpdated: 'Tarefa atualizada',
nameRequired: 'O nome e obrigatorio',
scheduleRequired: 'O agendamento e obrigatorio',
loadFailed: 'Falha ao carregar a tarefa',
jobPaused: 'Tarefa pausada',
jobResumed: 'Tarefa retomada',
jobTriggered: 'Tarefa acionada',
jobDeleted: 'Tarefa excluida',
status: {
running: 'Em execucao',
paused: 'Pausada',
disabled: 'Desativada',
scheduled: 'Agendada',
},
info: {
schedule: 'Agendamento',
lastRun: 'Ultima execucao',
nextRun: 'Proxima execucao',
deliver: 'Entrega',
repeat: 'Repeticao',
},
action: {
pause: 'Pausar',
pauseJob: 'Pausar tarefa',
resume: 'Retomar',
resumeJob: 'Retomar tarefa',
runNow: 'Executar agora',
triggerImmediately: 'Acionar imediatamente',
},
},
// Skills
skills: {
title: 'Habilidades',
searchPlaceholder: 'Buscar habilidades...',
noMatch: 'Nenhuma habilidade corresponde a sua busca',
noSkills: 'Nenhuma habilidade encontrada',
backTo: 'Voltar para',
attachedFiles: 'Arquivos anexados',
loadFailed: 'Falha ao carregar a habilidade',
fileLoadFailed: 'Falha ao carregar o arquivo',
toggleFailed: 'Falha ao ativar/desativar a habilidade',
},
// Memory
memory: {
title: 'Memoria',
refresh: 'Atualizar',
loadFailed: 'Falha ao carregar a memoria',
myNotes: 'Minhas notas',
noNotes: 'Nenhuma nota ainda.',
notesPlaceholder: 'Escreva suas notas...',
userProfile: 'Perfil do usuario',
noProfile: 'Nenhum perfil ainda.',
profilePlaceholder: 'Escreva seu perfil...',
soul: 'Alma',
noSoul: 'Nenhuma configuracao de alma ainda.',
soulPlaceholder: 'Escreva a configuracao da alma...',
},
// Models
models: {
title: 'Modelos',
addProvider: 'Adicionar provedor',
providerType: 'Tipo de provedor',
preset: 'Preset',
custom: 'Personalizado',
selectProvider: 'Selecionar provedor',
chooseProvider: 'Escolha um provedor...',
name: 'Nome',
autoGeneratedName: 'Gerado automaticamente pela URL base',
baseUrl: 'URL base',
baseUrlPlaceholder: 'ex. https://api.example.com/v1',
apiKey: 'Chave API',
apiKeyPlaceholder: 'sk-...',
defaultModel: 'Modelo padrao',
selectModel: 'Selecionar um modelo...',
providerAdded: 'Provedor adicionado',
providerDeleted: 'Provedor excluido',
deleteProvider: 'Excluir provedor',
deleteConfirm: 'Tem certeza de que deseja excluir "{name}"?',
noProviders: 'Nenhum provedor encontrado. Adicione um provedor personalizado para comecar.',
builtIn: 'Integrado',
customType: 'Personalizado',
provider: 'Provedor',
local: 'Local ({host})',
selectProviderRequired: 'Por favor, selecione um provedor',
baseUrlRequired: 'A URL base e obrigatoria',
apiKeyRequired: 'A chave API e obrigatoria',
modelRequired: 'O modelo padrao e obrigatorio',
enterBaseUrl: 'Por favor, insira a URL base primeiro',
unexpectedFormat: 'Formato de resposta inesperado',
foundModels: '{count} modelos encontrados',
fetchFailed: 'Falha ao buscar os modelos',
},
// Profiles
profiles: {
title: 'Perfis',
create: 'Criar perfil',
import: 'Importar',
export: 'Exportar',
rename: 'Renomear',
delete: 'Excluir',
switchTo: 'Mudar para',
switchConfirm: 'Mudar para o perfil "{name}" reiniciara o gateway. Continuar?',
switchSuccess: 'Mudou para o perfil "{name}"',
switchFailed: 'Falha ao mudar de perfil. O gateway pode precisar de reinicio manual.',
createSuccess: 'Perfil "{name}" criado',
createFailed: 'Falha ao criar o perfil',
renameSuccess: 'Perfil renomeado',
renameFailed: 'Falha ao renomear o perfil',
deleteConfirm: 'Tem certeza de que deseja excluir o perfil "{name}"?',
deleteSuccess: 'Perfil excluido',
deleteFailed: 'Falha ao excluir o perfil',
exportSuccess: 'Perfil exportado',
exportFailed: 'Falha ao exportar o perfil',
importSuccess: 'Perfil importado',
importFailed: 'Falha ao importar o perfil',
importSelectFile: 'Selecionar arquivo de arquivo',
importInvalidFile: 'Por favor, selecione um arquivo valido (.tar.gz, .tgz, .gz, .zip)',
name: 'Nome do perfil',
namePlaceholder: 'Apenas letras, numeros e hifens',
newName: 'Novo nome',
newNamePlaceholder: 'Digite um novo nome',
cloneFromCurrent: 'Clonar do perfil atual',
archivePath: 'Caminho do arquivo',
archivePathPlaceholder: 'Caminho do servidor para o arquivo',
importName: 'Nome do perfil (opcional)',
importNamePlaceholder: 'Deixe vazio para usar o nome do arquivo',
active: 'Ativo',
model: 'Modelo',
gateway: 'Gateway',
alias: 'Alias',
provider: 'Provedor',
path: 'Caminho',
skills: 'Habilidades',
hasEnv: 'Tem .env',
hasSoulMd: 'Tem soul.md',
noProfiles: 'Nenhum perfil encontrado. Crie um para comecar.',
},
// Logs
logs: {
title: 'Logs',
all: 'Todos',
searchPlaceholder: 'Buscar...',
refresh: 'Atualizar',
noEntries: 'Nenhuma entrada de log',
},
// Settings
settings: {
title: 'Configuracoes',
saved: 'Salvo',
saveFailed: 'Falha ao salvar',
tabs: {
display: 'Exibicao',
agent: 'Agente',
memory: 'Memoria',
session: 'Sessao',
privacy: 'Privacidade',
apiServer: 'Servidor API',
},
display: {
streaming: 'Respostas em streaming',
streamingHint: 'Mostrar respostas da IA em tempo real',
compact: 'Modo compacto',
compactHint: 'Reduzir espacamento entre mensagens',
showReasoning: 'Mostrar raciocinio',
showReasoningHint: 'Mostrar processo de pensamento do modelo',
showCost: 'Mostrar custo',
showCostHint: 'Mostrar uso de tokens nas respostas',
inlineDiffs: 'Diffs em linha',
inlineDiffsHint: 'Mostrar alteracoes de codigo em linha',
bellOnComplete: 'Som de conclusao',
bellOnCompleteHint: 'Tocar som quando a IA terminar',
busyInputMode: 'Modo de entrada ocupada',
busyInputModeHint: 'Permitir entrada enquanto a IA processa',
theme: 'Tema',
themeHint: 'Escolha claro, escuro ou seguir a preferencia do sistema',
themeLight: 'Claro',
themeDark: 'Escuro',
themeSystem: 'Sistema',
},
agent: {
maxTurns: 'Maximo de turnos',
maxTurnsHint: 'Maximo de rodadas de interacao por conversa',
gatewayTimeout: 'Timeout do gateway',
gatewayTimeoutHint: 'Timeout da requisicao em segundos',
restartDrainTimeout: 'Timeout de drenagem ao reiniciar',
restartDrainTimeoutHint: 'Timeout de drenagem antes de reiniciar em segundos',
toolEnforcement: 'Obrigatoriedade de ferramentas',
toolEnforcementHint: 'Controlar o modo de execucao de chamadas de ferramentas',
auto: 'Automatico',
always: 'Sempre',
never: 'Nunca',
},
memory: {
enabled: 'Ativar memoria',
enabledHint: 'Permitir que a IA lembre do contexto da conversa',
userProfile: 'Perfil do usuario',
userProfileHint: 'Permitir que a IA lembre das preferencias do usuario',
charLimit: 'Limite de caracteres da memoria',
charLimitHint: 'Maximo de caracteres para MEMORY.md',
userCharLimit: 'Limite de caracteres do perfil do usuario',
userCharLimitHint: 'Maximo de caracteres para USER.md',
},
session: {
mode: 'Modo de reinicializacao',
modeHint: 'Condicao de acionamento para reinicializacao de sessao',
modeBoth: 'Inatividade + Agendado',
modeIdle: 'Somente inatividade',
modeHourly: 'Somente agendado',
idleMinutes: 'Timeout de inatividade',
idleMinutesHint: 'Tempo de espera antes da reinicializacao automatica (minutos)',
atHour: 'Horario de reinicializacao agendada',
atHourHint: 'Reiniciar sessao neste horario diariamente',
},
privacy: {
redactPii: 'Ocultar dados pessoais',
redactPiiHint: 'Detectar e ocultar automaticamente informacoes sensiveis (senhas, chaves, etc.)',
},
apiServer: {
enable: 'Ativar',
enableHint: 'Ativar servidor API',
host: 'Host',
hostHint: 'Endereco de escuta',
port: 'Porta',
portHint: 'Porta de escuta',
key: 'Chave',
keyHint: 'Chave de acesso API',
cors: 'Origens CORS',
corsHint: 'Fontes cross-origin permitidas',
},
},
// Platform channel settings
platform: {
requireMention: "Exigir mencao {'@'}",
requireMentionGroup: "Exigir mencao {'@'} em grupos para responder",
requireMentionChannel: "Exigir mencao {'@'} em canais para responder",
requireMentionRoom: "Exigir mencao {'@'} em salas para responder",
reactions: 'Reacoes',
reactionsHint: 'Reagir a mensagens com emoji',
freeResponseChats: 'Chats de resposta livre',
freeResponseChatsHint: "IDs de chats que respondem sem mencao {'@'} (separados por virgula)",
freeResponseChannels: 'Canais de resposta livre',
freeResponseChannelsHint: "IDs de canais que respondem sem mencao {'@'} (separados por virgula)",
freeResponseRooms: 'Salas de resposta livre',
freeResponseRoomsHint: "IDs de salas que respondem sem mencao {'@'} (separados por virgula)",
mentionPatterns: 'Padroes de mencao personalizados',
mentionPatternsHint: 'Padroes de acionamento adicionais',
autoThread: 'Thread automatica',
autoThreadHint: "Criar automaticamente threads de resposta apos mencao {'@'}",
autoThreadHintRoom: 'Criar automaticamente threads de resposta em salas',
dmMentionThreads: 'Threads de mencao em DM',
dmMentionThreadsHint: 'Usar respostas em thread para mencoes em DMs',
allowBots: 'Permitir mensagens de bots',
allowBotsHint: 'Responder a mensagens de outros bots',
allowedChannels: 'Canais permitidos',
allowedChannelsHint: 'Lista branca de IDs de canais (separados por virgula)',
ignoredChannels: 'Canais ignorados',
ignoredChannelsHint: 'Canais onde o bot nunca responde (separados por virgula)',
noThreadChannels: 'Canais sem thread',
noThreadChannelsHint: 'Canais onde o bot responde sem threads (separados por virgula)',
botToken: 'Token do bot',
botTokenHint: 'Token do bot do portal do desenvolvedor',
accessToken: 'Token de acesso',
accessTokenHint: 'Token de acesso Matrix',
homeserver: 'URL do homeserver',
homeserverHint: 'URL do homeserver Matrix',
appId: 'ID do aplicativo',
appIdHint: 'ID do aplicativo Feishu',
appSecret: 'Segredo do aplicativo',
appSecretHint: 'Segredo do aplicativo Feishu',
clientId: 'ID do cliente',
clientIdHint: 'ID do cliente DingTalk',
clientSecret: 'Segredo do cliente',
clientSecretHint: 'Segredo do cliente DingTalk',
botId: 'ID do bot',
botIdHint: 'ID do bot WeCom',
wecomSecretHint: 'Segredo do bot WeCom',
waEnabled: 'Ativar WhatsApp',
waEnabledHint: 'Ativar WhatsApp via pareamento por codigo QR',
weixinToken: 'Token Weixin',
weixinTokenHint: 'Do login QR da CLI weixin (hermes weixin)',
accountId: 'ID da conta',
accountIdHint: 'ID da conta Weixin',
qrLogin: 'Login por QR',
qrRelogin: 'Reconectar',
qrFetching: 'Buscando codigo QR...',
qrScanHint: 'Escaneie com WeChat para fazer login',
qrScanedHint: 'Escaneado, por favor confirme no celular...',
},
// Language
language: {
label: 'Idioma',
zh: '中文',
en: 'English',
pt: 'Portugues',
},
// Terminal
terminal: {
sessions: 'Sessoes',
newTab: 'Novo terminal',
closeSession: 'Fechar esta sessao?',
sessionExited: 'Encerrada',
processExited: 'Processo encerrado com codigo {code}',
},
// Usage
usage: {
title: 'Estatisticas de uso',
refresh: 'Atualizar',
totalTokens: 'Total de tokens',
inputTokens: 'Entrada',
outputTokens: 'Saida',
totalSessions: 'Total de sessoes',
avgPerDay: '~{n}/dia em media',
estimatedCost: 'Custo est.',
cacheHitRate: 'Taxa de acerto de cache',
modelBreakdown: 'Detalhamento por modelo',
dailyTrend: 'Uso diario (ultimos 30 dias)',
date: 'Data',
tokens: 'Tokens',
cache: 'Cache',
sessions: 'Sessoes',
cost: 'Custo',
noData: 'Sem dados de uso',
},
}