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:
+1
-1
@@ -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
|
||||
|
||||
@@ -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 },
|
||||
})
|
||||
|
||||
@@ -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',
|
||||
},
|
||||
}
|
||||
@@ -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',
|
||||
},
|
||||
}
|
||||
@@ -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',
|
||||
},
|
||||
}
|
||||
@@ -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: '使用データがありません',
|
||||
},
|
||||
}
|
||||
@@ -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: '사용량 데이터 없음',
|
||||
},
|
||||
}
|
||||
@@ -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',
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user