diff --git a/lightrag_webui/src/components/AppSettings.tsx b/lightrag_webui/src/components/AppSettings.tsx
index 09312794..360e00ff 100644
--- a/lightrag_webui/src/components/AppSettings.tsx
+++ b/lightrag_webui/src/components/AppSettings.tsx
@@ -22,7 +22,7 @@ export default function AppSettings({ className }: AppSettingsProps) {
const setTheme = useSettingsStore.use.setTheme()
const handleLanguageChange = useCallback((value: string) => {
- setLanguage(value as 'en' | 'zh' | 'fr' | 'ar' | 'zh_TW')
+ setLanguage(value as 'en' | 'zh' | 'fr' | 'ar' | 'zh_TW' | 'ru' | 'ja' | 'de' | 'uk')
}, [setLanguage])
const handleThemeChange = useCallback((value: string) => {
@@ -50,6 +50,10 @@ export default function AppSettings({ className }: AppSettingsProps) {
Français
العربية
繁體中文
+ Русский
+ 日本語
+ Deutsch
+ Українська
diff --git a/lightrag_webui/src/i18n.ts b/lightrag_webui/src/i18n.ts
index dbee5d10..8e025956 100644
--- a/lightrag_webui/src/i18n.ts
+++ b/lightrag_webui/src/i18n.ts
@@ -7,6 +7,10 @@ import zh from './locales/zh.json'
import fr from './locales/fr.json'
import ar from './locales/ar.json'
import zh_TW from './locales/zh_TW.json'
+import ru from './locales/ru.json'
+import ja from './locales/ja.json'
+import de from './locales/de.json'
+import uk from './locales/uk.json'
const getStoredLanguage = () => {
try {
@@ -29,7 +33,11 @@ i18n
zh: { translation: zh },
fr: { translation: fr },
ar: { translation: ar },
- zh_TW: { translation: zh_TW }
+ zh_TW: { translation: zh_TW },
+ ru: { translation: ru },
+ ja: { translation: ja },
+ de: { translation: de },
+ uk: { translation: uk }
},
lng: getStoredLanguage(), // Use stored language settings
fallbackLng: 'en',
diff --git a/lightrag_webui/src/locales/de.json b/lightrag_webui/src/locales/de.json
new file mode 100644
index 00000000..9b866394
--- /dev/null
+++ b/lightrag_webui/src/locales/de.json
@@ -0,0 +1,465 @@
+{
+ "settings": {
+ "language": "Sprache",
+ "theme": "Design",
+ "light": "Hell",
+ "dark": "Dunkel",
+ "system": "System"
+ },
+ "header": {
+ "documents": "Dokumente",
+ "knowledgeGraph": "Wissensgraph",
+ "retrieval": "Abruf",
+ "api": "API",
+ "projectRepository": "Projekt-Repository",
+ "logout": "Abmelden",
+ "frontendNeedsRebuild": "Frontend muss neu erstellt werden",
+ "themeToggle": {
+ "switchToLight": "Zu hellem Design wechseln",
+ "switchToDark": "Zu dunklem Design wechseln"
+ }
+ },
+ "login": {
+ "description": "Bitte geben Sie Ihr Konto und Passwort ein, um sich im System anzumelden",
+ "username": "Benutzername",
+ "usernamePlaceholder": "Bitte geben Sie einen Benutzernamen ein",
+ "password": "Passwort",
+ "passwordPlaceholder": "Bitte geben Sie ein Passwort ein",
+ "loginButton": "Anmelden",
+ "loggingIn": "Anmeldung läuft...",
+ "successMessage": "Anmeldung erfolgreich",
+ "errorEmptyFields": "Bitte geben Sie Ihren Benutzernamen und Ihr Passwort ein",
+ "errorInvalidCredentials": "Anmeldung fehlgeschlagen, bitte überprüfen Sie Benutzername und Passwort",
+ "authDisabled": "Authentifizierung ist deaktiviert. Verwenden des anmeldefreien Modus.",
+ "guestMode": "Anmeldefrei"
+ },
+ "common": {
+ "cancel": "Abbrechen",
+ "save": "Speichern",
+ "saving": "Speichern...",
+ "saveFailed": "Speichern fehlgeschlagen"
+ },
+ "documentPanel": {
+ "clearDocuments": {
+ "button": "Löschen",
+ "tooltip": "Dokumente löschen",
+ "title": "Dokumente löschen",
+ "description": "Dies entfernt alle Dokumente aus dem System",
+ "warning": "WARNUNG: Diese Aktion löscht alle Dokumente dauerhaft und kann nicht rückgängig gemacht werden!",
+ "confirm": "Möchten Sie wirklich alle Dokumente löschen?",
+ "confirmPrompt": "Geben Sie 'yes' ein, um diese Aktion zu bestätigen",
+ "confirmPlaceholder": "Geben Sie yes ein, um zu bestätigen",
+ "clearCache": "LLM-Cache löschen",
+ "confirmButton": "JA",
+ "clearing": "Löschen...",
+ "timeout": "Löschvorgang hat das Zeitlimit überschritten, bitte versuchen Sie es erneut",
+ "success": "Dokumente erfolgreich gelöscht",
+ "cacheCleared": "Cache erfolgreich gelöscht",
+ "cacheClearFailed": "Cache konnte nicht gelöscht werden:\n{{error}}",
+ "failed": "Dokumente löschen fehlgeschlagen:\n{{message}}",
+ "error": "Dokumente löschen fehlgeschlagen:\n{{error}}"
+ },
+ "deleteDocuments": {
+ "button": "Löschen",
+ "tooltip": "Ausgewählte Dokumente löschen",
+ "title": "Dokumente löschen",
+ "description": "Dies löscht die ausgewählten Dokumente dauerhaft aus dem System",
+ "warning": "WARNUNG: Diese Aktion löscht die ausgewählten Dokumente dauerhaft und kann nicht rückgängig gemacht werden!",
+ "confirm": "Möchten Sie wirklich {{count}} ausgewählte(s) Dokument(e) löschen?",
+ "confirmPrompt": "Geben Sie 'yes' ein, um diese Aktion zu bestätigen",
+ "confirmPlaceholder": "Geben Sie yes ein, um zu bestätigen",
+ "confirmButton": "JA",
+ "deleteFileOption": "Auch hochgeladene Dateien löschen",
+ "deleteFileTooltip": "Aktivieren Sie diese Option, um auch die entsprechenden hochgeladenen Dateien auf dem Server zu löschen",
+ "deleteLLMCacheOption": "Auch extrahierten LLM-Cache löschen",
+ "success": "Dokumentlösch-Pipeline erfolgreich gestartet",
+ "failed": "Dokumente löschen fehlgeschlagen:\n{{message}}",
+ "error": "Dokumente löschen fehlgeschlagen:\n{{error}}",
+ "busy": "Pipeline ist beschäftigt, bitte versuchen Sie es später erneut",
+ "notAllowed": "Keine Berechtigung, diese Operation auszuführen"
+ },
+ "selectDocuments": {
+ "selectCurrentPage": "Aktuelle Seite auswählen ({{count}})",
+ "deselectAll": "Alle Auswahl aufheben ({{count}})"
+ },
+ "uploadDocuments": {
+ "button": "Hochladen",
+ "tooltip": "Dokumente hochladen",
+ "title": "Dokumente hochladen",
+ "description": "Ziehen Sie Ihre Dokumente hierher oder klicken Sie zum Durchsuchen.",
+ "single": {
+ "uploading": "Hochladen {{name}}: {{percent}}%",
+ "success": "Upload erfolgreich:\n{{name}} erfolgreich hochgeladen",
+ "failed": "Upload fehlgeschlagen:\n{{name}}\n{{message}}",
+ "error": "Upload fehlgeschlagen:\n{{name}}\n{{error}}"
+ },
+ "batch": {
+ "uploading": "Dateien werden hochgeladen...",
+ "success": "Dateien erfolgreich hochgeladen",
+ "error": "Einige Dateien konnten nicht hochgeladen werden"
+ },
+ "generalError": "Upload fehlgeschlagen\n{{error}}",
+ "fileTypes": "Unterstützte Typen: TXT, MD, DOCX, PDF, PPTX, XLSX, RTF, ODT, EPUB, HTML, HTM, TEX, JSON, XML, YAML, YML, CSV, LOG, CONF, INI, PROPERTIES, SQL, BAT, SH, C, CPP, PY, JAVA, JS, TS, SWIFT, GO, RB, PHP, CSS, SCSS, LESS",
+ "fileUploader": {
+ "singleFileLimit": "Es kann nicht mehr als 1 Datei gleichzeitig hochgeladen werden",
+ "maxFilesLimit": "Es können nicht mehr als {{count}} Dateien hochgeladen werden",
+ "fileRejected": "Datei {{name}} wurde abgelehnt",
+ "unsupportedType": "Nicht unterstützter Dateityp",
+ "fileTooLarge": "Datei zu groß, maximale Größe ist {{maxSize}}",
+ "dropHere": "Dateien hier ablegen",
+ "dragAndDrop": "Dateien hierher ziehen oder klicken, um Dateien auszuwählen",
+ "removeFile": "Datei entfernen",
+ "uploadDescription": "Sie können {{isMultiple ? 'mehrere' : count}} Dateien hochladen (bis zu {{maxSize}} pro Datei)",
+ "duplicateFile": "Dateiname existiert bereits im Server-Cache"
+ }
+ },
+ "documentManager": {
+ "title": "Dokumentenverwaltung",
+ "scanButton": "Scannen/Wiederholen",
+ "scanTooltip": "Dokumente im Eingabeordner scannen und verarbeiten sowie alle fehlgeschlagenen Dokumente erneut verarbeiten",
+ "refreshTooltip": "Dokumentenliste zurücksetzen",
+ "pipelineStatusButton": "Pipeline",
+ "pipelineStatusTooltip": "Status der Dokumentverarbeitungs-Pipeline anzeigen",
+ "uploadedTitle": "Hochgeladene Dokumente",
+ "uploadedDescription": "Liste der hochgeladenen Dokumente und ihrer Status.",
+ "emptyTitle": "Keine Dokumente",
+ "emptyDescription": "Es wurden noch keine Dokumente hochgeladen.",
+ "columns": {
+ "id": "ID",
+ "fileName": "Dateiname",
+ "summary": "Zusammenfassung",
+ "status": "Status",
+ "length": "Länge",
+ "chunks": "Chunks",
+ "created": "Erstellt",
+ "updated": "Aktualisiert",
+ "metadata": "Metadaten",
+ "select": "Auswählen"
+ },
+ "status": {
+ "all": "Alle",
+ "completed": "Abgeschlossen",
+ "preprocessed": "Vorverarbeitet",
+ "processing": "Verarbeitung",
+ "pending": "Ausstehend",
+ "failed": "Fehlgeschlagen"
+ },
+ "errors": {
+ "loadFailed": "Dokumente konnten nicht geladen werden\n{{error}}",
+ "scanFailed": "Dokumente konnten nicht gescannt werden\n{{error}}",
+ "scanProgressFailed": "Scan-Fortschritt konnte nicht abgerufen werden\n{{error}}"
+ },
+ "fileNameLabel": "Dateiname",
+ "showButton": "Anzeigen",
+ "hideButton": "Ausblenden",
+ "showFileNameTooltip": "Dateiname anzeigen",
+ "hideFileNameTooltip": "Dateiname ausblenden"
+ },
+ "pipelineStatus": {
+ "title": "Pipeline-Status",
+ "busy": "Pipeline beschäftigt",
+ "requestPending": "Anfrage ausstehend",
+ "cancellationRequested": "Stornierung angefordert",
+ "jobName": "Auftragsname",
+ "startTime": "Startzeit",
+ "progress": "Fortschritt",
+ "unit": "Batch",
+ "pipelineMessages": "Pipeline-Nachrichten",
+ "cancelButton": "Abbrechen",
+ "cancelTooltip": "Pipeline-Verarbeitung abbrechen",
+ "cancelConfirmTitle": "Pipeline-Stornierung bestätigen",
+ "cancelConfirmDescription": "Dies unterbricht die laufende Pipeline-Verarbeitung. Möchten Sie wirklich fortfahren?",
+ "cancelConfirmButton": "Stornierung bestätigen",
+ "cancelInProgress": "Stornierung läuft...",
+ "pipelineNotRunning": "Pipeline läuft nicht",
+ "cancelSuccess": "Pipeline-Stornierung angefordert",
+ "cancelFailed": "Pipeline konnte nicht abgebrochen werden\n{{error}}",
+ "cancelNotBusy": "Pipeline läuft nicht, keine Stornierung erforderlich",
+ "errors": {
+ "fetchFailed": "Pipeline-Status konnte nicht abgerufen werden\n{{error}}"
+ }
+ }
+ },
+ "graphPanel": {
+ "dataIsTruncated": "Graphdaten wurden auf maximale Knotenanzahl gekürzt",
+ "statusDialog": {
+ "title": "LightRAG Server-Einstellungen",
+ "description": "Aktuellen Systemstatus und Verbindungsinformationen anzeigen"
+ },
+ "legend": "Legende",
+ "nodeTypes": {
+ "person": "Person",
+ "category": "Kategorie",
+ "geo": "Geografisch",
+ "location": "Ort",
+ "organization": "Organisation",
+ "event": "Ereignis",
+ "equipment": "Ausrüstung",
+ "weapon": "Waffe",
+ "animal": "Tier",
+ "unknown": "Unbekannt",
+ "object": "Objekt",
+ "group": "Gruppe",
+ "technology": "Technologie",
+ "product": "Produkt",
+ "document": "Dokument",
+ "content": "Inhalt",
+ "data": "Daten",
+ "artifact": "Artefakt",
+ "concept": "Konzept",
+ "naturalobject": "Natürliches Objekt",
+ "method": "Methode",
+ "creature": "Kreatur",
+ "plant": "Pflanze",
+ "disease": "Krankheit",
+ "drug": "Medikament",
+ "food": "Lebensmittel",
+ "other": "Sonstiges"
+ },
+ "sideBar": {
+ "settings": {
+ "settings": "Einstellungen",
+ "healthCheck": "Gesundheitsprüfung",
+ "showPropertyPanel": "Eigenschaften-Panel anzeigen",
+ "showSearchBar": "Suchleiste anzeigen",
+ "showNodeLabel": "Knotenbezeichnung anzeigen",
+ "nodeDraggable": "Knoten verschiebbar",
+ "showEdgeLabel": "Kantenbezeichnung anzeigen",
+ "hideUnselectedEdges": "Nicht ausgewählte Kanten ausblenden",
+ "edgeEvents": "Kanten-Ereignisse",
+ "maxQueryDepth": "Maximale Abfragetiefe",
+ "maxNodes": "Maximale Knotenanzahl",
+ "maxLayoutIterations": "Maximale Layout-Iterationen",
+ "resetToDefault": "Auf Standard zurücksetzen",
+ "edgeSizeRange": "Kantengrößenbereich",
+ "depth": "T",
+ "max": "Max",
+ "degree": "Grad",
+ "apiKey": "API-Schlüssel",
+ "enterYourAPIkey": "Geben Sie Ihren API-Schlüssel ein",
+ "save": "Speichern",
+ "refreshLayout": "Layout aktualisieren"
+ },
+ "zoomControl": {
+ "zoomIn": "Vergrößern",
+ "zoomOut": "Verkleinern",
+ "resetZoom": "Zoom zurücksetzen",
+ "rotateCamera": "Im Uhrzeigersinn drehen",
+ "rotateCameraCounterClockwise": "Gegen den Uhrzeigersinn drehen"
+ },
+ "layoutsControl": {
+ "startAnimation": "Layout-Animation fortsetzen",
+ "stopAnimation": "Layout-Animation stoppen",
+ "layoutGraph": "Graph layouten",
+ "layouts": {
+ "Circular": "Kreisförmig",
+ "Circlepack": "Kreis-Packung",
+ "Random": "Zufällig",
+ "Noverlaps": "Keine Überlappungen",
+ "Force Directed": "Kraftgerichtet",
+ "Force Atlas": "Force Atlas"
+ }
+ },
+ "fullScreenControl": {
+ "fullScreen": "Vollbild",
+ "windowed": "Fenstermodus"
+ },
+ "legendControl": {
+ "toggleLegend": "Legende umschalten"
+ }
+ },
+ "statusIndicator": {
+ "connected": "Verbunden",
+ "disconnected": "Getrennt"
+ },
+ "statusCard": {
+ "unavailable": "Statusinformationen nicht verfügbar",
+ "serverInfo": "Server-Informationen",
+ "workingDirectory": "Arbeitsverzeichnis",
+ "inputDirectory": "Eingabeverzeichnis",
+ "maxParallelInsert": "Gleichzeitige Dokumentenverarbeitung",
+ "summarySettings": "Zusammenfassungseinstellungen",
+ "llmConfig": "LLM-Konfiguration",
+ "llmBinding": "LLM-Bindung",
+ "llmBindingHost": "LLM-Endpunkt",
+ "llmModel": "LLM-Modell",
+ "embeddingConfig": "Einbettungskonfiguration",
+ "embeddingBinding": "Einbettungsbindung",
+ "embeddingBindingHost": "Einbettungs-Endpunkt",
+ "embeddingModel": "Einbettungsmodell",
+ "storageConfig": "Speicherkonfiguration",
+ "kvStorage": "KV-Speicher",
+ "docStatusStorage": "Dokumentstatus-Speicher",
+ "graphStorage": "Graph-Speicher",
+ "vectorStorage": "Vektor-Speicher",
+ "workspace": "Arbeitsbereich",
+ "maxGraphNodes": "Maximale Graph-Knotenanzahl",
+ "rerankerConfig": "Reranker-Konfiguration",
+ "rerankerBindingHost": "Reranker-Endpunkt",
+ "rerankerModel": "Reranker-Modell",
+ "lockStatus": "Sperrstatus",
+ "threshold": "Schwellenwert"
+ },
+ "propertiesView": {
+ "editProperty": "{{property}} bearbeiten",
+ "editPropertyDescription": "Bearbeiten Sie den Eigenschaftswert im Textbereich unten.",
+ "errors": {
+ "duplicateName": "Knotenname existiert bereits",
+ "updateFailed": "Knoten konnte nicht aktualisiert werden",
+ "tryAgainLater": "Bitte versuchen Sie es später erneut",
+ "updateSuccessButMergeFailed": "Eigenschaften aktualisiert, aber Zusammenführung fehlgeschlagen: {{error}}",
+ "mergeFailed": "Zusammenführung fehlgeschlagen: {{error}}"
+ },
+ "success": {
+ "entityUpdated": "Knoten erfolgreich aktualisiert",
+ "relationUpdated": "Beziehung erfolgreich aktualisiert",
+ "entityMerged": "Knoten erfolgreich zusammengeführt"
+ },
+ "mergeOptionLabel": "Automatisch zusammenführen, wenn ein doppelter Name gefunden wird",
+ "mergeOptionDescription": "Wenn aktiviert, wird beim Umbenennen in einen bestehenden Namen dieser Knoten in den bestehenden zusammengeführt, anstatt zu scheitern.",
+ "mergeDialog": {
+ "title": "Knoten zusammengeführt",
+ "description": "\"{{source}}\" wurde in \"{{target}}\" zusammengeführt.",
+ "refreshHint": "Aktualisieren Sie den Graph, um die neueste Struktur zu laden.",
+ "keepCurrentStart": "Aktualisieren und aktuellen Startknoten beibehalten",
+ "useMergedStart": "Aktualisieren und zusammengeführten Knoten verwenden",
+ "refreshing": "Graph wird aktualisiert..."
+ },
+ "node": {
+ "title": "Knoten",
+ "id": "ID",
+ "labels": "Bezeichnungen",
+ "degree": "Grad",
+ "properties": "Eigenschaften",
+ "relationships": "Beziehungen (innerhalb des Teilgraphen)",
+ "expandNode": "Knoten erweitern",
+ "pruneNode": "Knoten beschneiden",
+ "deleteAllNodesError": "Löschen aller Knoten im Graph verweigert",
+ "nodesRemoved": "{{count}} Knoten entfernt, einschließlich verwaister Knoten",
+ "noNewNodes": "Keine erweiterbaren Knoten gefunden",
+ "propertyNames": {
+ "description": "Beschreibung",
+ "entity_id": "Name",
+ "entity_type": "Typ",
+ "source_id": "C-ID",
+ "Neighbour": "Nachbar",
+ "file_path": "Datei",
+ "keywords": "Schlüssel",
+ "weight": "Gewicht"
+ }
+ },
+ "edge": {
+ "title": "Beziehung",
+ "id": "ID",
+ "type": "Typ",
+ "source": "Quelle",
+ "target": "Ziel",
+ "properties": "Eigenschaften"
+ }
+ },
+ "search": {
+ "placeholder": "Knoten auf der Seite suchen...",
+ "message": "Und {{count}} weitere"
+ },
+ "graphLabels": {
+ "selectTooltip": "Teilgraph eines Knotens (Bezeichnung) abrufen",
+ "noLabels": "Keine passenden Knoten gefunden",
+ "label": "Knotenname suchen",
+ "placeholder": "Knotenname suchen...",
+ "andOthers": "Und {{count}} weitere",
+ "refreshGlobalTooltip": "Globale Graphdaten aktualisieren und Suchverlauf zurücksetzen",
+ "refreshCurrentLabelTooltip": "Graphdaten der aktuellen Seite aktualisieren",
+ "refreshingTooltip": "Daten werden aktualisiert..."
+ },
+ "emptyGraph": "Leer (Bitte erneut laden)"
+ },
+ "retrievePanel": {
+ "chatMessage": {
+ "copyTooltip": "In Zwischenablage kopieren",
+ "copyError": "Text konnte nicht in die Zwischenablage kopiert werden",
+ "copyEmpty": "Kein Inhalt zum Kopieren",
+ "copySuccess": "Inhalt in Zwischenablage kopiert",
+ "copySuccessLegacy": "Inhalt kopiert (Legacy-Methode)",
+ "copySuccessManual": "Inhalt kopiert (manuelle Methode)",
+ "copyFailed": "Inhalt konnte nicht kopiert werden",
+ "copyManualInstruction": "Bitte wählen Sie den Text manuell aus und kopieren Sie ihn",
+ "thinking": "Denken...",
+ "thinkingTime": "Denkzeit {{time}}s",
+ "thinkingInProgress": "Denken läuft..."
+ },
+ "retrieval": {
+ "startPrompt": "Starten Sie eine Abfrage, indem Sie Ihre Frage unten eingeben",
+ "clear": "Löschen",
+ "send": "Senden",
+ "placeholder": "Geben Sie Ihre Abfrage ein (Präfix unterstützt: /)",
+ "error": "Fehler: Antwort konnte nicht abgerufen werden",
+ "queryModeError": "Nur die folgenden Abfragemodi werden unterstützt: {{modes}}",
+ "queryModePrefixInvalid": "Ungültiges Abfragemodus-Präfix. Verwenden Sie: / [Leerzeichen] Ihre Abfrage"
+ },
+ "querySettings": {
+ "parametersTitle": "Parameter",
+ "parametersDescription": "Konfigurieren Sie Ihre Abfrageparameter",
+ "queryMode": "Abfragemodus",
+ "queryModeTooltip": "Abfragestrategie auswählen:\n• Naive: Traditionelle Text-Chunk-Vektorabfrage\n• Local: Fokus auf Entitätsabfrage\n• Global: Fokus auf Beziehungsabfrage\n• Hybrid: Local+Global\n• Mix: Local+Global+Naive\n• Bypass: Abfrage überspringen, Konversationsverlauf und aktuelle Frage an LLM senden",
+ "queryModeOptions": {
+ "naive": "Naive",
+ "local": "Local",
+ "global": "Global",
+ "hybrid": "Hybrid",
+ "mix": "Mix",
+ "bypass": "Bypass"
+ },
+ "responseFormat": "Antwortformat",
+ "responseFormatTooltip": "Definiert das Antwortformat. Beispiele:\n• Mehrere Absätze\n• Einzelner Absatz\n• Aufzählungspunkte",
+ "responseFormatOptions": {
+ "multipleParagraphs": "Mehrere Absätze",
+ "singleParagraph": "Einzelner Absatz",
+ "bulletPoints": "Aufzählungspunkte"
+ },
+ "topK": "KG Top K",
+ "topKTooltip": "Anzahl der abzurufenden Entitäten und Beziehungen. Gilt für Nicht-Naive-Modi.",
+ "topKPlaceholder": "top_k-Wert eingeben",
+ "chunkTopK": "Chunk Top K",
+ "chunkTopKTooltip": "Anzahl der abzurufenden Text-Chunks, gilt für alle Modi.",
+ "chunkTopKPlaceholder": "chunk_top_k-Wert eingeben",
+ "maxEntityTokens": "Max. Entitäts-Tokens",
+ "maxEntityTokensTooltip": "Maximale Anzahl von Tokens, die für den Entitätskontext im einheitlichen Token-Kontrollsystem zugewiesen werden",
+ "maxRelationTokens": "Max. Beziehungs-Tokens",
+ "maxRelationTokensTooltip": "Maximale Anzahl von Tokens, die für den Beziehungskontext im einheitlichen Token-Kontrollsystem zugewiesen werden",
+ "maxTotalTokens": "Max. Gesamt-Tokens",
+ "maxTotalTokensTooltip": "Maximales Gesamt-Token-Budget für den gesamten Abfragekontext (Entitäten + Beziehungen + Chunks + System-Prompt)",
+ "historyTurns": "Verlaufsturns",
+ "historyTurnsTooltip": "Anzahl der vollständigen Konversationsturns (Benutzer-Assistenten-Paare), die im Antwortkontext berücksichtigt werden sollen",
+ "historyTurnsPlaceholder": "Anzahl der Verlaufsturns",
+ "onlyNeedContext": "Nur Kontext benötigt",
+ "onlyNeedContextTooltip": "Wenn True, wird nur der abgerufene Kontext ohne Generierung einer Antwort zurückgegeben",
+ "onlyNeedPrompt": "Nur Prompt benötigt",
+ "onlyNeedPromptTooltip": "Wenn True, wird nur der generierte Prompt ohne Erzeugung einer Antwort zurückgegeben",
+ "streamResponse": "Stream-Antwort",
+ "streamResponseTooltip": "Wenn True, aktiviert Streaming-Ausgabe für Echtzeit-Antworten",
+ "userPrompt": "Zusätzlicher Ausgabe-Prompt",
+ "userPromptTooltip": "Geben Sie zusätzliche Antwortanforderungen an das LLM an (unabhängig vom Abfrageinhalt, nur für die Ausgabeverarbeitung).",
+ "userPromptPlaceholder": "Benutzerdefinierten Prompt eingeben (optional)",
+ "enableRerank": "Rerank aktivieren",
+ "enableRerankTooltip": "Reranking für abgerufene Text-Chunks aktivieren. Wenn True, aber kein Rerank-Modell konfiguriert ist, wird eine Warnung ausgegeben. Standard ist True."
+ }
+ },
+ "apiSite": {
+ "loading": "API-Dokumentation wird geladen..."
+ },
+ "apiKeyAlert": {
+ "title": "API-Schlüssel ist erforderlich",
+ "description": "Bitte geben Sie Ihren API-Schlüssel ein, um auf den Dienst zuzugreifen",
+ "placeholder": "API-Schlüssel eingeben",
+ "save": "Speichern"
+ },
+ "pagination": {
+ "showing": "Zeige {{start}} bis {{end}} von {{total}} Einträgen",
+ "page": "Seite",
+ "pageSize": "Seitengröße",
+ "firstPage": "Erste Seite",
+ "prevPage": "Vorherige Seite",
+ "nextPage": "Nächste Seite",
+ "lastPage": "Letzte Seite"
+ }
+}
diff --git a/lightrag_webui/src/locales/ja.json b/lightrag_webui/src/locales/ja.json
new file mode 100644
index 00000000..e6b976b0
--- /dev/null
+++ b/lightrag_webui/src/locales/ja.json
@@ -0,0 +1,465 @@
+{
+ "settings": {
+ "language": "言語",
+ "theme": "テーマ",
+ "light": "ライト",
+ "dark": "ダーク",
+ "system": "システム"
+ },
+ "header": {
+ "documents": "ドキュメント",
+ "knowledgeGraph": "ナレッジグラフ",
+ "retrieval": "検索",
+ "api": "API",
+ "projectRepository": "プロジェクトリポジトリ",
+ "logout": "ログアウト",
+ "frontendNeedsRebuild": "フロントエンドの再ビルドが必要です",
+ "themeToggle": {
+ "switchToLight": "ライトテーマに切り替え",
+ "switchToDark": "ダークテーマに切り替え"
+ }
+ },
+ "login": {
+ "description": "システムにログインするには、アカウントとパスワードを入力してください",
+ "username": "ユーザー名",
+ "usernamePlaceholder": "ユーザー名を入力してください",
+ "password": "パスワード",
+ "passwordPlaceholder": "パスワードを入力してください",
+ "loginButton": "ログイン",
+ "loggingIn": "ログイン中...",
+ "successMessage": "ログインに成功しました",
+ "errorEmptyFields": "ユーザー名とパスワードを入力してください",
+ "errorInvalidCredentials": "ログインに失敗しました。ユーザー名とパスワードを確認してください",
+ "authDisabled": "認証が無効になっています。ログインフリーモードを使用しています。",
+ "guestMode": "ログインフリー"
+ },
+ "common": {
+ "cancel": "キャンセル",
+ "save": "保存",
+ "saving": "保存中...",
+ "saveFailed": "保存に失敗しました"
+ },
+ "documentPanel": {
+ "clearDocuments": {
+ "button": "クリア",
+ "tooltip": "ドキュメントをクリア",
+ "title": "ドキュメントをクリア",
+ "description": "システムからすべてのドキュメントを削除します",
+ "warning": "警告: この操作はすべてのドキュメントを永続的に削除し、元に戻すことはできません!",
+ "confirm": "本当にすべてのドキュメントをクリアしますか?",
+ "confirmPrompt": "この操作を確認するには「yes」と入力してください",
+ "confirmPlaceholder": "確認するには「yes」と入力",
+ "clearCache": "LLMキャッシュをクリア",
+ "confirmButton": "はい",
+ "clearing": "クリア中...",
+ "timeout": "クリア操作がタイムアウトしました。もう一度お試しください",
+ "success": "ドキュメントが正常にクリアされました",
+ "cacheCleared": "キャッシュが正常にクリアされました",
+ "cacheClearFailed": "キャッシュのクリアに失敗しました:\n{{error}}",
+ "failed": "ドキュメントのクリアに失敗しました:\n{{message}}",
+ "error": "ドキュメントのクリアに失敗しました:\n{{error}}"
+ },
+ "deleteDocuments": {
+ "button": "削除",
+ "tooltip": "選択したドキュメントを削除",
+ "title": "ドキュメントを削除",
+ "description": "システムから選択したドキュメントを永続的に削除します",
+ "warning": "警告: この操作は選択したドキュメントを永続的に削除し、元に戻すことはできません!",
+ "confirm": "本当に{{count}}個の選択したドキュメントを削除しますか?",
+ "confirmPrompt": "この操作を確認するには「yes」と入力してください",
+ "confirmPlaceholder": "確認するには「yes」と入力",
+ "confirmButton": "はい",
+ "deleteFileOption": "アップロードされたファイルも削除",
+ "deleteFileTooltip": "このオプションを選択すると、サーバー上の対応するアップロードファイルも削除されます",
+ "deleteLLMCacheOption": "抽出されたLLMキャッシュも削除",
+ "success": "ドキュメント削除パイプラインが正常に開始されました",
+ "failed": "ドキュメントの削除に失敗しました:\n{{message}}",
+ "error": "ドキュメントの削除に失敗しました:\n{{error}}",
+ "busy": "パイプラインがビジーです。後でもう一度お試しください",
+ "notAllowed": "この操作を実行する権限がありません"
+ },
+ "selectDocuments": {
+ "selectCurrentPage": "現在のページを選択 ({{count}})",
+ "deselectAll": "すべての選択を解除 ({{count}})"
+ },
+ "uploadDocuments": {
+ "button": "アップロード",
+ "tooltip": "ドキュメントをアップロード",
+ "title": "ドキュメントをアップロード",
+ "description": "ドキュメントをここにドラッグ&ドロップするか、クリックして参照してください。",
+ "single": {
+ "uploading": "アップロード中 {{name}}: {{percent}}%",
+ "success": "アップロード成功:\n{{name}}が正常にアップロードされました",
+ "failed": "アップロード失敗:\n{{name}}\n{{message}}",
+ "error": "アップロード失敗:\n{{name}}\n{{error}}"
+ },
+ "batch": {
+ "uploading": "ファイルをアップロード中...",
+ "success": "ファイルが正常にアップロードされました",
+ "error": "一部のファイルのアップロードに失敗しました"
+ },
+ "generalError": "アップロード失敗\n{{error}}",
+ "fileTypes": "サポートされている形式: TXT, MD, DOCX, PDF, PPTX, XLSX, RTF, ODT, EPUB, HTML, HTM, TEX, JSON, XML, YAML, YML, CSV, LOG, CONF, INI, PROPERTIES, SQL, BAT, SH, C, CPP, PY, JAVA, JS, TS, SWIFT, GO, RB, PHP, CSS, SCSS, LESS",
+ "fileUploader": {
+ "singleFileLimit": "一度に1つ以上のファイルをアップロードできません",
+ "maxFilesLimit": "{{count}}個を超えるファイルをアップロードできません",
+ "fileRejected": "ファイル {{name}} は拒否されました",
+ "unsupportedType": "サポートされていないファイル形式",
+ "fileTooLarge": "ファイルが大きすぎます。最大サイズは{{maxSize}}です",
+ "dropHere": "ファイルをここにドロップ",
+ "dragAndDrop": "ファイルをここにドラッグ&ドロップするか、クリックしてファイルを選択",
+ "removeFile": "ファイルを削除",
+ "uploadDescription": "{{isMultiple ? '複数' : count}}個のファイルをアップロードできます(それぞれ最大{{maxSize}}まで)",
+ "duplicateFile": "ファイル名がサーバーキャッシュに既に存在します"
+ }
+ },
+ "documentManager": {
+ "title": "ドキュメント管理",
+ "scanButton": "スキャン/再試行",
+ "scanTooltip": "入力フォルダ内のドキュメントをスキャンして処理し、失敗したすべてのドキュメントも再処理します",
+ "refreshTooltip": "ドキュメントリストをリセット",
+ "pipelineStatusButton": "パイプライン",
+ "pipelineStatusTooltip": "ドキュメント処理パイプラインのステータスを表示",
+ "uploadedTitle": "アップロードされたドキュメント",
+ "uploadedDescription": "アップロードされたドキュメントとそのステータスのリスト。",
+ "emptyTitle": "ドキュメントなし",
+ "emptyDescription": "まだアップロードされたドキュメントがありません。",
+ "columns": {
+ "id": "ID",
+ "fileName": "ファイル名",
+ "summary": "概要",
+ "status": "ステータス",
+ "length": "長さ",
+ "chunks": "チャンク",
+ "created": "作成日時",
+ "updated": "更新日時",
+ "metadata": "メタデータ",
+ "select": "選択"
+ },
+ "status": {
+ "all": "すべて",
+ "completed": "完了",
+ "preprocessed": "前処理済み",
+ "processing": "処理中",
+ "pending": "保留中",
+ "failed": "失敗"
+ },
+ "errors": {
+ "loadFailed": "ドキュメントの読み込みに失敗しました\n{{error}}",
+ "scanFailed": "ドキュメントのスキャンに失敗しました\n{{error}}",
+ "scanProgressFailed": "スキャン進捗の取得に失敗しました\n{{error}}"
+ },
+ "fileNameLabel": "ファイル名",
+ "showButton": "表示",
+ "hideButton": "非表示",
+ "showFileNameTooltip": "ファイル名を表示",
+ "hideFileNameTooltip": "ファイル名を非表示"
+ },
+ "pipelineStatus": {
+ "title": "パイプラインステータス",
+ "busy": "パイプラインがビジー",
+ "requestPending": "リクエスト保留中",
+ "cancellationRequested": "キャンセル要求済み",
+ "jobName": "ジョブ名",
+ "startTime": "開始時刻",
+ "progress": "進捗",
+ "unit": "バッチ",
+ "pipelineMessages": "パイプラインメッセージ",
+ "cancelButton": "キャンセル",
+ "cancelTooltip": "パイプライン処理をキャンセル",
+ "cancelConfirmTitle": "パイプラインキャンセルの確認",
+ "cancelConfirmDescription": "これにより、進行中のパイプライン処理が中断されます。続行してもよろしいですか?",
+ "cancelConfirmButton": "キャンセルを確認",
+ "cancelInProgress": "キャンセル処理中...",
+ "pipelineNotRunning": "パイプラインは実行されていません",
+ "cancelSuccess": "パイプラインキャンセルが要求されました",
+ "cancelFailed": "パイプラインのキャンセルに失敗しました\n{{error}}",
+ "cancelNotBusy": "パイプラインは実行されていないため、キャンセルする必要はありません",
+ "errors": {
+ "fetchFailed": "パイプラインステータスの取得に失敗しました\n{{error}}"
+ }
+ }
+ },
+ "graphPanel": {
+ "dataIsTruncated": "グラフデータは最大ノード数に切り詰められました",
+ "statusDialog": {
+ "title": "LightRAGサーバー設定",
+ "description": "現在のシステムステータスと接続情報を表示"
+ },
+ "legend": "凡例",
+ "nodeTypes": {
+ "person": "人物",
+ "category": "カテゴリ",
+ "geo": "地理",
+ "location": "場所",
+ "organization": "組織",
+ "event": "イベント",
+ "equipment": "機器",
+ "weapon": "武器",
+ "animal": "動物",
+ "unknown": "不明",
+ "object": "オブジェクト",
+ "group": "グループ",
+ "technology": "技術",
+ "product": "製品",
+ "document": "ドキュメント",
+ "content": "コンテンツ",
+ "data": "データ",
+ "artifact": "アーティファクト",
+ "concept": "概念",
+ "naturalobject": "自然物",
+ "method": "方法",
+ "creature": "生物",
+ "plant": "植物",
+ "disease": "病気",
+ "drug": "薬",
+ "food": "食品",
+ "other": "その他"
+ },
+ "sideBar": {
+ "settings": {
+ "settings": "設定",
+ "healthCheck": "ヘルスチェック",
+ "showPropertyPanel": "プロパティパネルを表示",
+ "showSearchBar": "検索バーを表示",
+ "showNodeLabel": "ノードラベルを表示",
+ "nodeDraggable": "ノードをドラッグ可能",
+ "showEdgeLabel": "エッジラベルを表示",
+ "hideUnselectedEdges": "選択されていないエッジを非表示",
+ "edgeEvents": "エッジイベント",
+ "maxQueryDepth": "最大クエリ深度",
+ "maxNodes": "最大ノード数",
+ "maxLayoutIterations": "最大レイアウト反復回数",
+ "resetToDefault": "デフォルトにリセット",
+ "edgeSizeRange": "エッジサイズ範囲",
+ "depth": "D",
+ "max": "最大",
+ "degree": "次数",
+ "apiKey": "APIキー",
+ "enterYourAPIkey": "APIキーを入力してください",
+ "save": "保存",
+ "refreshLayout": "レイアウトを更新"
+ },
+ "zoomControl": {
+ "zoomIn": "ズームイン",
+ "zoomOut": "ズームアウト",
+ "resetZoom": "ズームをリセット",
+ "rotateCamera": "時計回りに回転",
+ "rotateCameraCounterClockwise": "反時計回りに回転"
+ },
+ "layoutsControl": {
+ "startAnimation": "レイアウトアニメーションを続行",
+ "stopAnimation": "レイアウトアニメーションを停止",
+ "layoutGraph": "グラフをレイアウト",
+ "layouts": {
+ "Circular": "円形",
+ "Circlepack": "サークルパック",
+ "Random": "ランダム",
+ "Noverlaps": "重複なし",
+ "Force Directed": "力指向",
+ "Force Atlas": "フォースアトラス"
+ }
+ },
+ "fullScreenControl": {
+ "fullScreen": "フルスクリーン",
+ "windowed": "ウィンドウ"
+ },
+ "legendControl": {
+ "toggleLegend": "凡例を切り替え"
+ }
+ },
+ "statusIndicator": {
+ "connected": "接続済み",
+ "disconnected": "切断済み"
+ },
+ "statusCard": {
+ "unavailable": "ステータス情報が利用できません",
+ "serverInfo": "サーバー情報",
+ "workingDirectory": "作業ディレクトリ",
+ "inputDirectory": "入力ディレクトリ",
+ "maxParallelInsert": "同時ドキュメント処理",
+ "summarySettings": "概要設定",
+ "llmConfig": "LLM設定",
+ "llmBinding": "LLMバインディング",
+ "llmBindingHost": "LLMエンドポイント",
+ "llmModel": "LLMモデル",
+ "embeddingConfig": "埋め込み設定",
+ "embeddingBinding": "埋め込みバインディング",
+ "embeddingBindingHost": "埋め込みエンドポイント",
+ "embeddingModel": "埋め込みモデル",
+ "storageConfig": "ストレージ設定",
+ "kvStorage": "KVストレージ",
+ "docStatusStorage": "ドキュメントステータスストレージ",
+ "graphStorage": "グラフストレージ",
+ "vectorStorage": "ベクトルストレージ",
+ "workspace": "ワークスペース",
+ "maxGraphNodes": "最大グラフノード数",
+ "rerankerConfig": "リランカー設定",
+ "rerankerBindingHost": "リランカーエンドポイント",
+ "rerankerModel": "リランカーモデル",
+ "lockStatus": "ロックステータス",
+ "threshold": "しきい値"
+ },
+ "propertiesView": {
+ "editProperty": "{{property}}を編集",
+ "editPropertyDescription": "下のテキストエリアでプロパティ値を編集してください。",
+ "errors": {
+ "duplicateName": "ノード名が既に存在します",
+ "updateFailed": "ノードの更新に失敗しました",
+ "tryAgainLater": "後でもう一度お試しください",
+ "updateSuccessButMergeFailed": "プロパティは更新されましたが、マージに失敗しました: {{error}}",
+ "mergeFailed": "マージに失敗しました: {{error}}"
+ },
+ "success": {
+ "entityUpdated": "ノードが正常に更新されました",
+ "relationUpdated": "関係が正常に更新されました",
+ "entityMerged": "ノードが正常にマージされました"
+ },
+ "mergeOptionLabel": "重複名が見つかった場合に自動的にマージ",
+ "mergeOptionDescription": "有効にすると、既存の名前に名前を変更すると、失敗する代わりにこのノードが既存のノードにマージされます。",
+ "mergeDialog": {
+ "title": "ノードがマージされました",
+ "description": "\"{{source}}\"が\"{{target}}\"にマージされました。",
+ "refreshHint": "グラフを更新して最新の構造を読み込みます。",
+ "keepCurrentStart": "更新して現在の開始ノードを保持",
+ "useMergedStart": "更新してマージされたノードを使用",
+ "refreshing": "グラフを更新中..."
+ },
+ "node": {
+ "title": "ノード",
+ "id": "ID",
+ "labels": "ラベル",
+ "degree": "次数",
+ "properties": "プロパティ",
+ "relationships": "関係(サブグラフ内)",
+ "expandNode": "ノードを展開",
+ "pruneNode": "ノードを剪定",
+ "deleteAllNodesError": "グラフ内のすべてのノードを削除することを拒否します",
+ "nodesRemoved": "{{count}}個のノードが削除されました(孤立ノードを含む)",
+ "noNewNodes": "展開可能なノードが見つかりませんでした",
+ "propertyNames": {
+ "description": "説明",
+ "entity_id": "名前",
+ "entity_type": "タイプ",
+ "source_id": "C-ID",
+ "Neighbour": "隣接",
+ "file_path": "ファイル",
+ "keywords": "キー",
+ "weight": "重み"
+ }
+ },
+ "edge": {
+ "title": "関係",
+ "id": "ID",
+ "type": "タイプ",
+ "source": "ソース",
+ "target": "ターゲット",
+ "properties": "プロパティ"
+ }
+ },
+ "search": {
+ "placeholder": "ページ内のノードを検索...",
+ "message": "その他{{count}}件"
+ },
+ "graphLabels": {
+ "selectTooltip": "ノード(ラベル)のサブグラフを取得",
+ "noLabels": "一致するノードが見つかりませんでした",
+ "label": "ノード名を検索",
+ "placeholder": "ノード名を検索...",
+ "andOthers": "その他{{count}}件",
+ "refreshGlobalTooltip": "グローバルグラフデータを更新し、検索履歴をリセット",
+ "refreshCurrentLabelTooltip": "現在のページのグラフデータを更新",
+ "refreshingTooltip": "データを更新中..."
+ },
+ "emptyGraph": "空(再読み込みをお試しください)"
+ },
+ "retrievePanel": {
+ "chatMessage": {
+ "copyTooltip": "クリップボードにコピー",
+ "copyError": "クリップボードへのテキストコピーに失敗しました",
+ "copyEmpty": "コピーするコンテンツがありません",
+ "copySuccess": "コンテンツがクリップボードにコピーされました",
+ "copySuccessLegacy": "コンテンツがコピーされました(レガシーメソッド)",
+ "copySuccessManual": "コンテンツがコピーされました(手動メソッド)",
+ "copyFailed": "コンテンツのコピーに失敗しました",
+ "copyManualInstruction": "テキストを手動で選択してコピーしてください",
+ "thinking": "思考中...",
+ "thinkingTime": "思考時間 {{time}}秒",
+ "thinkingInProgress": "思考中..."
+ },
+ "retrieval": {
+ "startPrompt": "下にクエリを入力して検索を開始",
+ "clear": "クリア",
+ "send": "送信",
+ "placeholder": "クエリを入力(プレフィックス対応: /<クエリモード>)",
+ "error": "エラー: 応答の取得に失敗しました",
+ "queryModeError": "次のクエリモードのみサポートされています: {{modes}}",
+ "queryModePrefixInvalid": "無効なクエリモードプレフィックス。使用: / [スペース] クエリ"
+ },
+ "querySettings": {
+ "parametersTitle": "パラメータ",
+ "parametersDescription": "クエリパラメータを設定",
+ "queryMode": "クエリモード",
+ "queryModeTooltip": "検索戦略を選択:\n• Naive: 従来のテキストチャンクベクトル検索\n• Local: エンティティ検索に焦点\n• Global: 関係検索に焦点\n• Hybrid: Local+Global\n• Mix: Local+Global+Naive\n• Bypass: 検索をスキップし、会話履歴と現在の質問をLLMに送信",
+ "queryModeOptions": {
+ "naive": "Naive",
+ "local": "Local",
+ "global": "Global",
+ "hybrid": "Hybrid",
+ "mix": "Mix",
+ "bypass": "Bypass"
+ },
+ "responseFormat": "応答形式",
+ "responseFormatTooltip": "応答形式を定義します。例:\n• 複数段落\n• 単一段落\n• 箇条書き",
+ "responseFormatOptions": {
+ "multipleParagraphs": "複数段落",
+ "singleParagraph": "単一段落",
+ "bulletPoints": "箇条書き"
+ },
+ "topK": "KG Top K",
+ "topKTooltip": "取得するエンティティと関係の数。非naiveモードに適用されます。",
+ "topKPlaceholder": "top_k値を入力",
+ "chunkTopK": "チャンクTop K",
+ "chunkTopKTooltip": "取得するテキストチャンクの数。すべてのモードに適用されます。",
+ "chunkTopKPlaceholder": "chunk_top_k値を入力",
+ "maxEntityTokens": "最大エンティティトークン数",
+ "maxEntityTokensTooltip": "統一トークン制御システムでエンティティコンテキストに割り当てられる最大トークン数",
+ "maxRelationTokens": "最大関係トークン数",
+ "maxRelationTokensTooltip": "統一トークン制御システムで関係コンテキストに割り当てられる最大トークン数",
+ "maxTotalTokens": "最大合計トークン数",
+ "maxTotalTokensTooltip": "クエリコンテキスト全体(エンティティ+関係+チャンク+システムプロンプト)の最大合計トークン予算",
+ "historyTurns": "履歴ターン数",
+ "historyTurnsTooltip": "応答コンテキストで考慮する完全な会話ターン(ユーザー-アシスタントペア)の数",
+ "historyTurnsPlaceholder": "履歴ターン数",
+ "onlyNeedContext": "コンテキストのみ必要",
+ "onlyNeedContextTooltip": "Trueの場合、応答を生成せずに取得されたコンテキストのみを返します",
+ "onlyNeedPrompt": "プロンプトのみ必要",
+ "onlyNeedPromptTooltip": "Trueの場合、応答を生成せずに生成されたプロンプトのみを返します",
+ "streamResponse": "ストリーム応答",
+ "streamResponseTooltip": "Trueの場合、リアルタイム応答のストリーミング出力を有効にします",
+ "userPrompt": "追加出力プロンプト",
+ "userPromptTooltip": "LLMに追加の応答要件を提供します(クエリコンテンツとは無関係で、出力処理のみに使用)。",
+ "userPromptPlaceholder": "カスタムプロンプトを入力(オプション)",
+ "enableRerank": "リランクを有効化",
+ "enableRerankTooltip": "取得されたテキストチャンクのリランクを有効にします。Trueに設定してもリランクモデルが設定されていない場合、警告が発行されます。デフォルトはTrueです。"
+ }
+ },
+ "apiSite": {
+ "loading": "APIドキュメントを読み込み中..."
+ },
+ "apiKeyAlert": {
+ "title": "APIキーが必要です",
+ "description": "サービスにアクセスするには、APIキーを入力してください",
+ "placeholder": "APIキーを入力",
+ "save": "保存"
+ },
+ "pagination": {
+ "showing": "{{start}}から{{end}}まで、全{{total}}件を表示",
+ "page": "ページ",
+ "pageSize": "ページサイズ",
+ "firstPage": "最初のページ",
+ "prevPage": "前のページ",
+ "nextPage": "次のページ",
+ "lastPage": "最後のページ"
+ }
+}
diff --git a/lightrag_webui/src/locales/ru.json b/lightrag_webui/src/locales/ru.json
new file mode 100644
index 00000000..9a178a2b
--- /dev/null
+++ b/lightrag_webui/src/locales/ru.json
@@ -0,0 +1,465 @@
+{
+ "settings": {
+ "language": "Язык",
+ "theme": "Тема",
+ "light": "Светлая",
+ "dark": "Тёмная",
+ "system": "Системная"
+ },
+ "header": {
+ "documents": "Документы",
+ "knowledgeGraph": "Граф знаний",
+ "retrieval": "Поиск",
+ "api": "API",
+ "projectRepository": "Репозиторий проекта",
+ "logout": "Выйти",
+ "frontendNeedsRebuild": "Требуется пересборка фронтенда",
+ "themeToggle": {
+ "switchToLight": "Переключить на светлую тему",
+ "switchToDark": "Переключить на тёмную тему"
+ }
+ },
+ "login": {
+ "description": "Пожалуйста, введите ваш аккаунт и пароль для входа в систему",
+ "username": "Имя пользователя",
+ "usernamePlaceholder": "Введите имя пользователя",
+ "password": "Пароль",
+ "passwordPlaceholder": "Введите пароль",
+ "loginButton": "Войти",
+ "loggingIn": "Вход в систему...",
+ "successMessage": "Вход выполнен успешно",
+ "errorEmptyFields": "Пожалуйста, введите имя пользователя и пароль",
+ "errorInvalidCredentials": "Ошибка входа, проверьте имя пользователя и пароль",
+ "authDisabled": "Аутентификация отключена. Используется режим без входа.",
+ "guestMode": "Без входа"
+ },
+ "common": {
+ "cancel": "Отмена",
+ "save": "Сохранить",
+ "saving": "Сохранение...",
+ "saveFailed": "Ошибка сохранения"
+ },
+ "documentPanel": {
+ "clearDocuments": {
+ "button": "Очистить",
+ "tooltip": "Очистить документы",
+ "title": "Очистить документы",
+ "description": "Это действие удалит все документы из системы",
+ "warning": "ВНИМАНИЕ: Это действие навсегда удалит все документы и не может быть отменено!",
+ "confirm": "Вы действительно хотите очистить все документы?",
+ "confirmPrompt": "Введите 'yes' для подтверждения действия",
+ "confirmPlaceholder": "Введите yes для подтверждения",
+ "clearCache": "Очистить кэш LLM",
+ "confirmButton": "ДА",
+ "clearing": "Очистка...",
+ "timeout": "Операция очистки превысила время ожидания, попробуйте снова",
+ "success": "Документы успешно очищены",
+ "cacheCleared": "Кэш успешно очищен",
+ "cacheClearFailed": "Не удалось очистить кэш:\n{{error}}",
+ "failed": "Ошибка очистки документов:\n{{message}}",
+ "error": "Ошибка очистки документов:\n{{error}}"
+ },
+ "deleteDocuments": {
+ "button": "Удалить",
+ "tooltip": "Удалить выбранные документы",
+ "title": "Удалить документы",
+ "description": "Это действие навсегда удалит выбранные документы из системы",
+ "warning": "ВНИМАНИЕ: Это действие навсегда удалит выбранные документы и не может быть отменено!",
+ "confirm": "Вы действительно хотите удалить {{count}} выбранный(ых) документ(ов)?",
+ "confirmPrompt": "Введите 'yes' для подтверждения действия",
+ "confirmPlaceholder": "Введите yes для подтверждения",
+ "confirmButton": "ДА",
+ "deleteFileOption": "Также удалить загруженные файлы",
+ "deleteFileTooltip": "Отметьте эту опцию, чтобы также удалить соответствующие загруженные файлы на сервере",
+ "deleteLLMCacheOption": "Также удалить извлечённый кэш LLM",
+ "success": "Конвейер удаления документов успешно запущен",
+ "failed": "Ошибка удаления документов:\n{{message}}",
+ "error": "Ошибка удаления документов:\n{{error}}",
+ "busy": "Конвейер занят, попробуйте позже",
+ "notAllowed": "Нет разрешения на выполнение этой операции"
+ },
+ "selectDocuments": {
+ "selectCurrentPage": "Выбрать текущую страницу ({{count}})",
+ "deselectAll": "Снять все выделения ({{count}})"
+ },
+ "uploadDocuments": {
+ "button": "Загрузить",
+ "tooltip": "Загрузить документы",
+ "title": "Загрузить документы",
+ "description": "Перетащите ваши документы сюда или нажмите для просмотра.",
+ "single": {
+ "uploading": "Загрузка {{name}}: {{percent}}%",
+ "success": "Загрузка успешна:\n{{name}} успешно загружен",
+ "failed": "Ошибка загрузки:\n{{name}}\n{{message}}",
+ "error": "Ошибка загрузки:\n{{name}}\n{{error}}"
+ },
+ "batch": {
+ "uploading": "Загрузка файлов...",
+ "success": "Файлы успешно загружены",
+ "error": "Некоторые файлы не удалось загрузить"
+ },
+ "generalError": "Ошибка загрузки\n{{error}}",
+ "fileTypes": "Поддерживаемые типы: TXT, MD, DOCX, PDF, PPTX, XLSX, RTF, ODT, EPUB, HTML, HTM, TEX, JSON, XML, YAML, YML, CSV, LOG, CONF, INI, PROPERTIES, SQL, BAT, SH, C, CPP, PY, JAVA, JS, TS, SWIFT, GO, RB, PHP, CSS, SCSS, LESS",
+ "fileUploader": {
+ "singleFileLimit": "Нельзя загрузить более 1 файла за раз",
+ "maxFilesLimit": "Нельзя загрузить более {{count}} файлов",
+ "fileRejected": "Файл {{name}} был отклонён",
+ "unsupportedType": "Неподдерживаемый тип файла",
+ "fileTooLarge": "Файл слишком большой, максимальный размер {{maxSize}}",
+ "dropHere": "Перетащите файлы сюда",
+ "dragAndDrop": "Перетащите файлы сюда или нажмите для выбора файлов",
+ "removeFile": "Удалить файл",
+ "uploadDescription": "Вы можете загрузить {{isMultiple ? 'несколько' : count}} файлов (до {{maxSize}} каждый)",
+ "duplicateFile": "Имя файла уже существует в кэше сервера"
+ }
+ },
+ "documentManager": {
+ "title": "Управление документами",
+ "scanButton": "Сканировать/Повторить",
+ "scanTooltip": "Сканировать и обработать документы во входной папке, а также повторно обработать все неудачные документы",
+ "refreshTooltip": "Сбросить список документов",
+ "pipelineStatusButton": "Конвейер",
+ "pipelineStatusTooltip": "Просмотр статуса конвейера обработки документов",
+ "uploadedTitle": "Загруженные документы",
+ "uploadedDescription": "Список загруженных документов и их статусы.",
+ "emptyTitle": "Нет документов",
+ "emptyDescription": "Документы ещё не загружены.",
+ "columns": {
+ "id": "ID",
+ "fileName": "Имя файла",
+ "summary": "Краткое содержание",
+ "status": "Статус",
+ "length": "Длина",
+ "chunks": "Фрагменты",
+ "created": "Создан",
+ "updated": "Обновлён",
+ "metadata": "Метаданные",
+ "select": "Выбрать"
+ },
+ "status": {
+ "all": "Все",
+ "completed": "Завершено",
+ "preprocessed": "Предобработано",
+ "processing": "Обработка",
+ "pending": "Ожидание",
+ "failed": "Ошибка"
+ },
+ "errors": {
+ "loadFailed": "Не удалось загрузить документы\n{{error}}",
+ "scanFailed": "Не удалось просканировать документы\n{{error}}",
+ "scanProgressFailed": "Не удалось получить прогресс сканирования\n{{error}}"
+ },
+ "fileNameLabel": "Имя файла",
+ "showButton": "Показать",
+ "hideButton": "Скрыть",
+ "showFileNameTooltip": "Показать имя файла",
+ "hideFileNameTooltip": "Скрыть имя файла"
+ },
+ "pipelineStatus": {
+ "title": "Статус конвейера",
+ "busy": "Конвейер занят",
+ "requestPending": "Запрос ожидает",
+ "cancellationRequested": "Запрошена отмена",
+ "jobName": "Название задачи",
+ "startTime": "Время начала",
+ "progress": "Прогресс",
+ "unit": "Пакет",
+ "pipelineMessages": "Сообщения конвейера",
+ "cancelButton": "Отмена",
+ "cancelTooltip": "Отменить обработку конвейера",
+ "cancelConfirmTitle": "Подтверждение отмены конвейера",
+ "cancelConfirmDescription": "Это прервёт текущую обработку конвейера. Вы уверены, что хотите продолжить?",
+ "cancelConfirmButton": "Подтвердить отмену",
+ "cancelInProgress": "Отмена выполняется...",
+ "pipelineNotRunning": "Конвейер не запущен",
+ "cancelSuccess": "Запрошена отмена конвейера",
+ "cancelFailed": "Не удалось отменить конвейер\n{{error}}",
+ "cancelNotBusy": "Конвейер не запущен, отмена не требуется",
+ "errors": {
+ "fetchFailed": "Не удалось получить статус конвейера\n{{error}}"
+ }
+ }
+ },
+ "graphPanel": {
+ "dataIsTruncated": "Данные графа обрезаны до максимального количества узлов",
+ "statusDialog": {
+ "title": "Настройки сервера LightRAG",
+ "description": "Просмотр текущего статуса системы и информации о подключении"
+ },
+ "legend": "Легенда",
+ "nodeTypes": {
+ "person": "Персона",
+ "category": "Категория",
+ "geo": "Географическое",
+ "location": "Местоположение",
+ "organization": "Организация",
+ "event": "Событие",
+ "equipment": "Оборудование",
+ "weapon": "Оружие",
+ "animal": "Животное",
+ "unknown": "Неизвестно",
+ "object": "Объект",
+ "group": "Группа",
+ "technology": "Технология",
+ "product": "Продукт",
+ "document": "Документ",
+ "content": "Содержимое",
+ "data": "Данные",
+ "artifact": "Артефакт",
+ "concept": "Концепция",
+ "naturalobject": "Природный объект",
+ "method": "Метод",
+ "creature": "Существо",
+ "plant": "Растение",
+ "disease": "Болезнь",
+ "drug": "Лекарство",
+ "food": "Еда",
+ "other": "Другое"
+ },
+ "sideBar": {
+ "settings": {
+ "settings": "Настройки",
+ "healthCheck": "Проверка здоровья",
+ "showPropertyPanel": "Показать панель свойств",
+ "showSearchBar": "Показать панель поиска",
+ "showNodeLabel": "Показать метки узлов",
+ "nodeDraggable": "Узлы перетаскиваемые",
+ "showEdgeLabel": "Показать метки рёбер",
+ "hideUnselectedEdges": "Скрыть невыбранные рёбра",
+ "edgeEvents": "События рёбер",
+ "maxQueryDepth": "Максимальная глубина запроса",
+ "maxNodes": "Максимальное количество узлов",
+ "maxLayoutIterations": "Максимальное количество итераций раскладки",
+ "resetToDefault": "Сбросить к значениям по умолчанию",
+ "edgeSizeRange": "Диапазон размера рёбер",
+ "depth": "Г",
+ "max": "Макс",
+ "degree": "Степень",
+ "apiKey": "API ключ",
+ "enterYourAPIkey": "Введите ваш API ключ",
+ "save": "Сохранить",
+ "refreshLayout": "Обновить раскладку"
+ },
+ "zoomControl": {
+ "zoomIn": "Увеличить",
+ "zoomOut": "Уменьшить",
+ "resetZoom": "Сбросить масштаб",
+ "rotateCamera": "Поворот по часовой стрелке",
+ "rotateCameraCounterClockwise": "Поворот против часовой стрелки"
+ },
+ "layoutsControl": {
+ "startAnimation": "Продолжить анимацию раскладки",
+ "stopAnimation": "Остановить анимацию раскладки",
+ "layoutGraph": "Раскладка графа",
+ "layouts": {
+ "Circular": "Круговой",
+ "Circlepack": "Упаковка кругов",
+ "Random": "Случайный",
+ "Noverlaps": "Без перекрытий",
+ "Force Directed": "Силовой",
+ "Force Atlas": "Силовой Атлас"
+ }
+ },
+ "fullScreenControl": {
+ "fullScreen": "Полный экран",
+ "windowed": "Оконный режим"
+ },
+ "legendControl": {
+ "toggleLegend": "Переключить легенду"
+ }
+ },
+ "statusIndicator": {
+ "connected": "Подключено",
+ "disconnected": "Отключено"
+ },
+ "statusCard": {
+ "unavailable": "Информация о статусе недоступна",
+ "serverInfo": "Информация о сервере",
+ "workingDirectory": "Рабочая директория",
+ "inputDirectory": "Входная директория",
+ "maxParallelInsert": "Параллельная обработка документов",
+ "summarySettings": "Настройки краткого содержания",
+ "llmConfig": "Конфигурация LLM",
+ "llmBinding": "Привязка LLM",
+ "llmBindingHost": "Конечная точка LLM",
+ "llmModel": "Модель LLM",
+ "embeddingConfig": "Конфигурация встраивания",
+ "embeddingBinding": "Привязка встраивания",
+ "embeddingBindingHost": "Конечная точка встраивания",
+ "embeddingModel": "Модель встраивания",
+ "storageConfig": "Конфигурация хранилища",
+ "kvStorage": "KV хранилище",
+ "docStatusStorage": "Хранилище статуса документов",
+ "graphStorage": "Хранилище графа",
+ "vectorStorage": "Векторное хранилище",
+ "workspace": "Рабочее пространство",
+ "maxGraphNodes": "Максимальное количество узлов графа",
+ "rerankerConfig": "Конфигурация ранжирования",
+ "rerankerBindingHost": "Конечная точка ранжирования",
+ "rerankerModel": "Модель ранжирования",
+ "lockStatus": "Статус блокировки",
+ "threshold": "Порог"
+ },
+ "propertiesView": {
+ "editProperty": "Редактировать {{property}}",
+ "editPropertyDescription": "Отредактируйте значение свойства в текстовой области ниже.",
+ "errors": {
+ "duplicateName": "Имя узла уже существует",
+ "updateFailed": "Не удалось обновить узел",
+ "tryAgainLater": "Пожалуйста, попробуйте позже",
+ "updateSuccessButMergeFailed": "Свойства обновлены, но слияние не удалось: {{error}}",
+ "mergeFailed": "Слияние не удалось: {{error}}"
+ },
+ "success": {
+ "entityUpdated": "Узел успешно обновлён",
+ "relationUpdated": "Связь успешно обновлена",
+ "entityMerged": "Узлы успешно объединены"
+ },
+ "mergeOptionLabel": "Автоматически объединять при обнаружении дублирующегося имени",
+ "mergeOptionDescription": "Если включено, переименование в существующее имя объединит этот узел с существующим вместо ошибки.",
+ "mergeDialog": {
+ "title": "Узел объединён",
+ "description": "\"{{source}}\" был объединён в \"{{target}}\".",
+ "refreshHint": "Обновите граф, чтобы загрузить последнюю структуру.",
+ "keepCurrentStart": "Обновить и сохранить текущий начальный узел",
+ "useMergedStart": "Обновить и использовать объединённый узел",
+ "refreshing": "Обновление графа..."
+ },
+ "node": {
+ "title": "Узел",
+ "id": "ID",
+ "labels": "Метки",
+ "degree": "Степень",
+ "properties": "Свойства",
+ "relationships": "Связи (в подграфе)",
+ "expandNode": "Развернуть узел",
+ "pruneNode": "Обрезать узел",
+ "deleteAllNodesError": "Отказ в удалении всех узлов в графе",
+ "nodesRemoved": "{{count}} узлов удалено, включая изолированные узлы",
+ "noNewNodes": "Расширяемых узлов не найдено",
+ "propertyNames": {
+ "description": "Описание",
+ "entity_id": "Имя",
+ "entity_type": "Тип",
+ "source_id": "C-ID",
+ "Neighbour": "Сосед",
+ "file_path": "Файл",
+ "keywords": "Ключи",
+ "weight": "Вес"
+ }
+ },
+ "edge": {
+ "title": "Связь",
+ "id": "ID",
+ "type": "Тип",
+ "source": "Источник",
+ "target": "Цель",
+ "properties": "Свойства"
+ }
+ },
+ "search": {
+ "placeholder": "Поиск узлов на странице...",
+ "message": "И ещё {{count}} других"
+ },
+ "graphLabels": {
+ "selectTooltip": "Получить подграф узла (метка)",
+ "noLabels": "Соответствующих узлов не найдено",
+ "label": "Поиск имени узла",
+ "placeholder": "Поиск имени узла...",
+ "andOthers": "И ещё {{count}} других",
+ "refreshGlobalTooltip": "Обновить глобальные данные графа и сбросить историю поиска",
+ "refreshCurrentLabelTooltip": "Обновить данные графа текущей страницы",
+ "refreshingTooltip": "Обновление данных..."
+ },
+ "emptyGraph": "Пусто (попробуйте перезагрузить снова)"
+ },
+ "retrievePanel": {
+ "chatMessage": {
+ "copyTooltip": "Копировать в буфер обмена",
+ "copyError": "Не удалось скопировать текст в буфер обмена",
+ "copyEmpty": "Нет содержимого для копирования",
+ "copySuccess": "Содержимое скопировано в буфер обмена",
+ "copySuccessLegacy": "Содержимое скопировано (устаревший метод)",
+ "copySuccessManual": "Содержимое скопировано (ручной метод)",
+ "copyFailed": "Не удалось скопировать содержимое",
+ "copyManualInstruction": "Пожалуйста, выберите и скопируйте текст вручную",
+ "thinking": "Размышление...",
+ "thinkingTime": "Время размышления {{time}}с",
+ "thinkingInProgress": "Размышление в процессе..."
+ },
+ "retrieval": {
+ "startPrompt": "Начните поиск, введя ваш запрос ниже",
+ "clear": "Очистить",
+ "send": "Отправить",
+ "placeholder": "Введите ваш запрос (Поддержка префикса: /<Режим запроса>)",
+ "error": "Ошибка: Не удалось получить ответ",
+ "queryModeError": "Поддерживаются только следующие режимы запроса: {{modes}}",
+ "queryModePrefixInvalid": "Неверный префикс режима запроса. Используйте: /<режим> [пробел] ваш запрос"
+ },
+ "querySettings": {
+ "parametersTitle": "Параметры",
+ "parametersDescription": "Настройте параметры вашего запроса",
+ "queryMode": "Режим запроса",
+ "queryModeTooltip": "Выберите стратегию поиска:\n• Naive: Традиционный поиск по вектору текстовых фрагментов\n• Local: Фокус на поиске сущностей\n• Global: Фокус на поиске связей\n• Hybrid: Local+Global\n• Mix: Local+Global+Naive\n• Bypass: Пропустить поиск, отправить историю разговора и текущий вопрос в LLM",
+ "queryModeOptions": {
+ "naive": "Naive",
+ "local": "Local",
+ "global": "Global",
+ "hybrid": "Hybrid",
+ "mix": "Mix",
+ "bypass": "Bypass"
+ },
+ "responseFormat": "Формат ответа",
+ "responseFormatTooltip": "Определяет формат ответа. Примеры:\n• Несколько абзацев\n• Один абзац\n• Маркированный список",
+ "responseFormatOptions": {
+ "multipleParagraphs": "Несколько абзацев",
+ "singleParagraph": "Один абзац",
+ "bulletPoints": "Маркированный список"
+ },
+ "topK": "KG Top K",
+ "topKTooltip": "Количество извлекаемых сущностей и связей. Применимо для режимов, отличных от naive.",
+ "topKPlaceholder": "Введите значение top_k",
+ "chunkTopK": "Chunk Top K",
+ "chunkTopKTooltip": "Количество извлекаемых текстовых фрагментов, применимо для всех режимов.",
+ "chunkTopKPlaceholder": "Введите значение chunk_top_k",
+ "maxEntityTokens": "Макс. токенов сущностей",
+ "maxEntityTokensTooltip": "Максимальное количество токенов, выделенных для контекста сущностей в системе единого управления токенами",
+ "maxRelationTokens": "Макс. токенов связей",
+ "maxRelationTokensTooltip": "Максимальное количество токенов, выделенных для контекста связей в системе единого управления токенами",
+ "maxTotalTokens": "Макс. общее количество токенов",
+ "maxTotalTokensTooltip": "Максимальный общий бюджет токенов для всего контекста запроса (сущности + связи + фрагменты + системный промпт)",
+ "historyTurns": "История ходов",
+ "historyTurnsTooltip": "Количество полных ходов разговора (пары пользователь-ассистент) для учёта в контексте ответа",
+ "historyTurnsPlaceholder": "Количество ходов истории",
+ "onlyNeedContext": "Только контекст",
+ "onlyNeedContextTooltip": "Если True, возвращает только извлечённый контекст без генерации ответа",
+ "onlyNeedPrompt": "Только промпт",
+ "onlyNeedPromptTooltip": "Если True, возвращает только сгенерированный промпт без создания ответа",
+ "streamResponse": "Потоковый ответ",
+ "streamResponseTooltip": "Если True, включает потоковый вывод для ответов в реальном времени",
+ "userPrompt": "Дополнительный промпт вывода",
+ "userPromptTooltip": "Предоставьте дополнительные требования к ответу для LLM (не связанные с содержимым запроса, только для обработки вывода).",
+ "userPromptPlaceholder": "Введите пользовательский промпт (необязательно)",
+ "enableRerank": "Включить ранжирование",
+ "enableRerankTooltip": "Включить ранжирование для извлечённых текстовых фрагментов. Если True, но модель ранжирования не настроена, будет выдано предупреждение. По умолчанию True."
+ }
+ },
+ "apiSite": {
+ "loading": "Загрузка документации API..."
+ },
+ "apiKeyAlert": {
+ "title": "Требуется API ключ",
+ "description": "Пожалуйста, введите ваш API ключ для доступа к сервису",
+ "placeholder": "Введите ваш API ключ",
+ "save": "Сохранить"
+ },
+ "pagination": {
+ "showing": "Показано {{start}} - {{end}} из {{total}} записей",
+ "page": "Страница",
+ "pageSize": "Размер страницы",
+ "firstPage": "Первая страница",
+ "prevPage": "Предыдущая страница",
+ "nextPage": "Следующая страница",
+ "lastPage": "Последняя страница"
+ }
+}
diff --git a/lightrag_webui/src/locales/uk.json b/lightrag_webui/src/locales/uk.json
new file mode 100644
index 00000000..46eb9636
--- /dev/null
+++ b/lightrag_webui/src/locales/uk.json
@@ -0,0 +1,465 @@
+{
+ "settings": {
+ "language": "Мова",
+ "theme": "Тема",
+ "light": "Світла",
+ "dark": "Темна",
+ "system": "Системна"
+ },
+ "header": {
+ "documents": "Документи",
+ "knowledgeGraph": "Граф знань",
+ "retrieval": "Пошук",
+ "api": "API",
+ "projectRepository": "Репозиторій проекту",
+ "logout": "Вихід",
+ "frontendNeedsRebuild": "Потрібна перебудова фронтенду",
+ "themeToggle": {
+ "switchToLight": "Перемкнути на світлу тему",
+ "switchToDark": "Перемкнути на темну тему"
+ }
+ },
+ "login": {
+ "description": "Будь ласка, введіть ваш обліковий запис та пароль для входу в систему",
+ "username": "Ім'я користувача",
+ "usernamePlaceholder": "Будь ласка, введіть ім'я користувача",
+ "password": "Пароль",
+ "passwordPlaceholder": "Будь ласка, введіть пароль",
+ "loginButton": "Увійти",
+ "loggingIn": "Вхід...",
+ "successMessage": "Вхід успішний",
+ "errorEmptyFields": "Будь ласка, введіть ім'я користувача та пароль",
+ "errorInvalidCredentials": "Вхід не вдався, будь ласка, перевірте ім'я користувача та пароль",
+ "authDisabled": "Аутентифікацію вимкнено. Використовується режим без входу.",
+ "guestMode": "Без входу"
+ },
+ "common": {
+ "cancel": "Скасувати",
+ "save": "Зберегти",
+ "saving": "Збереження...",
+ "saveFailed": "Збереження не вдалося"
+ },
+ "documentPanel": {
+ "clearDocuments": {
+ "button": "Очистити",
+ "tooltip": "Очистити документи",
+ "title": "Очистити документи",
+ "description": "Це видалить усі документи з системи",
+ "warning": "ПОПЕРЕДЖЕННЯ: Ця дія назавжди видалить усі документи і не може бути скасована!",
+ "confirm": "Ви дійсно хочете очистити всі документи?",
+ "confirmPrompt": "Введіть 'yes' для підтвердження цієї дії",
+ "confirmPlaceholder": "Введіть yes для підтвердження",
+ "clearCache": "Очистити кеш LLM",
+ "confirmButton": "ТАК",
+ "clearing": "Очищення...",
+ "timeout": "Операція очищення перевищила час очікування, будь ласка, спробуйте ще раз",
+ "success": "Документи успішно очищено",
+ "cacheCleared": "Кеш успішно очищено",
+ "cacheClearFailed": "Не вдалося очистити кеш:\n{{error}}",
+ "failed": "Очищення документів не вдалося:\n{{message}}",
+ "error": "Очищення документів не вдалося:\n{{error}}"
+ },
+ "deleteDocuments": {
+ "button": "Видалити",
+ "tooltip": "Видалити вибрані документи",
+ "title": "Видалити документи",
+ "description": "Це назавжди видалить вибрані документи з системи",
+ "warning": "ПОПЕРЕДЖЕННЯ: Ця дія назавжди видалить вибрані документи і не може бути скасована!",
+ "confirm": "Ви дійсно хочете видалити {{count}} вибраний(их) документ(ів)?",
+ "confirmPrompt": "Введіть 'yes' для підтвердження цієї дії",
+ "confirmPlaceholder": "Введіть yes для підтвердження",
+ "confirmButton": "ТАК",
+ "deleteFileOption": "Також видалити завантажені файли",
+ "deleteFileTooltip": "Встановіть цю опцію, щоб також видалити відповідні завантажені файли на сервері",
+ "deleteLLMCacheOption": "Також видалити витягнутий кеш LLM",
+ "success": "Пайплайн видалення документів успішно запущено",
+ "failed": "Видалення документів не вдалося:\n{{message}}",
+ "error": "Видалення документів не вдалося:\n{{error}}",
+ "busy": "Пайплайн зайнятий, будь ласка, спробуйте пізніше",
+ "notAllowed": "Немає дозволу на виконання цієї операції"
+ },
+ "selectDocuments": {
+ "selectCurrentPage": "Вибрати поточну сторінку ({{count}})",
+ "deselectAll": "Зняти всі вибрані ({{count}})"
+ },
+ "uploadDocuments": {
+ "button": "Завантажити",
+ "tooltip": "Завантажити документи",
+ "title": "Завантажити документи",
+ "description": "Перетягніть ваші документи сюди або натисніть для перегляду.",
+ "single": {
+ "uploading": "Завантаження {{name}}: {{percent}}%",
+ "success": "Завантаження успішне:\n{{name}} успішно завантажено",
+ "failed": "Завантаження не вдалося:\n{{name}}\n{{message}}",
+ "error": "Завантаження не вдалося:\n{{name}}\n{{error}}"
+ },
+ "batch": {
+ "uploading": "Завантаження файлів...",
+ "success": "Файли успішно завантажено",
+ "error": "Деякі файли не вдалося завантажити"
+ },
+ "generalError": "Завантаження не вдалося\n{{error}}",
+ "fileTypes": "Підтримувані типи: TXT, MD, DOCX, PDF, PPTX, XLSX, RTF, ODT, EPUB, HTML, HTM, TEX, JSON, XML, YAML, YML, CSV, LOG, CONF, INI, PROPERTIES, SQL, BAT, SH, C, CPP, PY, JAVA, JS, TS, SWIFT, GO, RB, PHP, CSS, SCSS, LESS",
+ "fileUploader": {
+ "singleFileLimit": "Не можна завантажити більше 1 файлу одночасно",
+ "maxFilesLimit": "Не можна завантажити більше {{count}} файлів",
+ "fileRejected": "Файл {{name}} було відхилено",
+ "unsupportedType": "Непідтримуваний тип файлу",
+ "fileTooLarge": "Файл занадто великий, максимальний розмір {{maxSize}}",
+ "dropHere": "Перетягніть файли сюди",
+ "dragAndDrop": "Перетягніть файли сюди або натисніть для вибору файлів",
+ "removeFile": "Видалити файл",
+ "uploadDescription": "Ви можете завантажити {{isMultiple ? 'кілька' : count}} файлів (до {{maxSize}} кожен)",
+ "duplicateFile": "Ім'я файлу вже існує в кеші сервера"
+ }
+ },
+ "documentManager": {
+ "title": "Управління документами",
+ "scanButton": "Сканувати/Повторити",
+ "scanTooltip": "Сканувати та обробити документи в папці введення, а також повторно обробити всі невдалі документи",
+ "refreshTooltip": "Скинути список документів",
+ "pipelineStatusButton": "Пайплайн",
+ "pipelineStatusTooltip": "Переглянути статус пайплайну обробки документів",
+ "uploadedTitle": "Завантажені документи",
+ "uploadedDescription": "Список завантажених документів та їх статусів.",
+ "emptyTitle": "Немає документів",
+ "emptyDescription": "Ще немає завантажених документів.",
+ "columns": {
+ "id": "ID",
+ "fileName": "Ім'я файлу",
+ "summary": "Резюме",
+ "status": "Статус",
+ "length": "Довжина",
+ "chunks": "Чанки",
+ "created": "Створено",
+ "updated": "Оновлено",
+ "metadata": "Метадані",
+ "select": "Вибрати"
+ },
+ "status": {
+ "all": "Всі",
+ "completed": "Завершено",
+ "preprocessed": "Попередньо оброблено",
+ "processing": "Обробка",
+ "pending": "Очікування",
+ "failed": "Невдало"
+ },
+ "errors": {
+ "loadFailed": "Не вдалося завантажити документи\n{{error}}",
+ "scanFailed": "Не вдалося відсканувати документи\n{{error}}",
+ "scanProgressFailed": "Не вдалося отримати прогрес сканування\n{{error}}"
+ },
+ "fileNameLabel": "Ім'я файлу",
+ "showButton": "Показати",
+ "hideButton": "Приховати",
+ "showFileNameTooltip": "Показати ім'я файлу",
+ "hideFileNameTooltip": "Приховати ім'я файлу"
+ },
+ "pipelineStatus": {
+ "title": "Статус пайплайну",
+ "busy": "Пайплайн зайнятий",
+ "requestPending": "Запит очікує",
+ "cancellationRequested": "Запит на скасування",
+ "jobName": "Назва завдання",
+ "startTime": "Час початку",
+ "progress": "Прогрес",
+ "unit": "Пакет",
+ "pipelineMessages": "Повідомлення пайплайну",
+ "cancelButton": "Скасувати",
+ "cancelTooltip": "Скасувати обробку пайплайну",
+ "cancelConfirmTitle": "Підтвердити скасування пайплайну",
+ "cancelConfirmDescription": "Це перерве поточну обробку пайплайну. Ви впевнені, що хочете продовжити?",
+ "cancelConfirmButton": "Підтвердити скасування",
+ "cancelInProgress": "Скасування в процесі...",
+ "pipelineNotRunning": "Пайплайн не працює",
+ "cancelSuccess": "Запит на скасування пайплайну",
+ "cancelFailed": "Не вдалося скасувати пайплайн\n{{error}}",
+ "cancelNotBusy": "Пайплайн не працює, немає потреби скасовувати",
+ "errors": {
+ "fetchFailed": "Не вдалося отримати статус пайплайну\n{{error}}"
+ }
+ }
+ },
+ "graphPanel": {
+ "dataIsTruncated": "Дані графа обрізано до максимальної кількості вузлів",
+ "statusDialog": {
+ "title": "Налаштування сервера LightRAG",
+ "description": "Переглянути поточний статус системи та інформацію про підключення"
+ },
+ "legend": "Легенда",
+ "nodeTypes": {
+ "person": "Особа",
+ "category": "Категорія",
+ "geo": "Географічне",
+ "location": "Місце",
+ "organization": "Організація",
+ "event": "Подія",
+ "equipment": "Обладнання",
+ "weapon": "Зброя",
+ "animal": "Тварина",
+ "unknown": "Невідомо",
+ "object": "Об'єкт",
+ "group": "Група",
+ "technology": "Технологія",
+ "product": "Продукт",
+ "document": "Документ",
+ "content": "Контент",
+ "data": "Дані",
+ "artifact": "Артефакт",
+ "concept": "Концепція",
+ "naturalobject": "Природний об'єкт",
+ "method": "Метод",
+ "creature": "Істота",
+ "plant": "Рослина",
+ "disease": "Хвороба",
+ "drug": "Ліки",
+ "food": "Їжа",
+ "other": "Інше"
+ },
+ "sideBar": {
+ "settings": {
+ "settings": "Налаштування",
+ "healthCheck": "Перевірка здоров'я",
+ "showPropertyPanel": "Показати панель властивостей",
+ "showSearchBar": "Показати панель пошуку",
+ "showNodeLabel": "Показати мітку вузла",
+ "nodeDraggable": "Вузол перетягуваний",
+ "showEdgeLabel": "Показати мітку ребра",
+ "hideUnselectedEdges": "Приховати невибрані ребра",
+ "edgeEvents": "Події ребер",
+ "maxQueryDepth": "Максимальна глибина запиту",
+ "maxNodes": "Максимальна кількість вузлів",
+ "maxLayoutIterations": "Максимальна кількість ітерацій макета",
+ "resetToDefault": "Скинути до за замовчуванням",
+ "edgeSizeRange": "Діапазон розміру ребер",
+ "depth": "Г",
+ "max": "Макс",
+ "degree": "Ступінь",
+ "apiKey": "API ключ",
+ "enterYourAPIkey": "Введіть ваш API ключ",
+ "save": "Зберегти",
+ "refreshLayout": "Оновити макет"
+ },
+ "zoomControl": {
+ "zoomIn": "Збільшити",
+ "zoomOut": "Зменшити",
+ "resetZoom": "Скинути масштаб",
+ "rotateCamera": "Повернути за годинниковою стрілкою",
+ "rotateCameraCounterClockwise": "Повернути проти годинникової стрілки"
+ },
+ "layoutsControl": {
+ "startAnimation": "Продовжити анімацію макета",
+ "stopAnimation": "Зупинити анімацію макета",
+ "layoutGraph": "Макет графа",
+ "layouts": {
+ "Circular": "Круговий",
+ "Circlepack": "Кругове упакування",
+ "Random": "Випадковий",
+ "Noverlaps": "Без перекриттів",
+ "Force Directed": "Силово-направлений",
+ "Force Atlas": "Force Atlas"
+ }
+ },
+ "fullScreenControl": {
+ "fullScreen": "Повноекранний режим",
+ "windowed": "Віконний режим"
+ },
+ "legendControl": {
+ "toggleLegend": "Перемкнути легенду"
+ }
+ },
+ "statusIndicator": {
+ "connected": "Підключено",
+ "disconnected": "Відключено"
+ },
+ "statusCard": {
+ "unavailable": "Інформація про статус недоступна",
+ "serverInfo": "Інформація про сервер",
+ "workingDirectory": "Робоча директорія",
+ "inputDirectory": "Вхідна директорія",
+ "maxParallelInsert": "Паралельна обробка документів",
+ "summarySettings": "Налаштування резюме",
+ "llmConfig": "Конфігурація LLM",
+ "llmBinding": "Прив'язка LLM",
+ "llmBindingHost": "Кінцева точка LLM",
+ "llmModel": "Модель LLM",
+ "embeddingConfig": "Конфігурація вбудовування",
+ "embeddingBinding": "Прив'язка вбудовування",
+ "embeddingBindingHost": "Кінцева точка вбудовування",
+ "embeddingModel": "Модель вбудовування",
+ "storageConfig": "Конфігурація сховища",
+ "kvStorage": "KV сховище",
+ "docStatusStorage": "Сховище статусу документів",
+ "graphStorage": "Сховище графа",
+ "vectorStorage": "Векторне сховище",
+ "workspace": "Робочий простір",
+ "maxGraphNodes": "Максимальна кількість вузлів графа",
+ "rerankerConfig": "Конфігурація реранкера",
+ "rerankerBindingHost": "Кінцева точка реранкера",
+ "rerankerModel": "Модель реранкера",
+ "lockStatus": "Статус блокування",
+ "threshold": "Поріг"
+ },
+ "propertiesView": {
+ "editProperty": "Редагувати {{property}}",
+ "editPropertyDescription": "Редагуйте значення властивості в текстовій області нижче.",
+ "errors": {
+ "duplicateName": "Ім'я вузла вже існує",
+ "updateFailed": "Не вдалося оновити вузол",
+ "tryAgainLater": "Будь ласка, спробуйте пізніше",
+ "updateSuccessButMergeFailed": "Властивості оновлено, але об'єднання не вдалося: {{error}}",
+ "mergeFailed": "Об'єднання не вдалося: {{error}}"
+ },
+ "success": {
+ "entityUpdated": "Вузол успішно оновлено",
+ "relationUpdated": "Відношення успішно оновлено",
+ "entityMerged": "Вузли успішно об'єднано"
+ },
+ "mergeOptionLabel": "Автоматично об'єднувати, коли знайдено дублікат імені",
+ "mergeOptionDescription": "Якщо увімкнено, перейменування на існуюче ім'я об'єднає цей вузол з існуючим замість невдачі.",
+ "mergeDialog": {
+ "title": "Вузол об'єднано",
+ "description": "\"{{source}}\" було об'єднано з \"{{target}}\".",
+ "refreshHint": "Оновіть граф, щоб завантажити останню структуру.",
+ "keepCurrentStart": "Оновити та зберегти поточний початковий вузол",
+ "useMergedStart": "Оновити та використати об'єднаний вузол",
+ "refreshing": "Оновлення графа..."
+ },
+ "node": {
+ "title": "Вузол",
+ "id": "ID",
+ "labels": "Мітки",
+ "degree": "Ступінь",
+ "properties": "Властивості",
+ "relationships": "Відношення (в межах підграфа)",
+ "expandNode": "Розширити вузол",
+ "pruneNode": "Обрізати вузол",
+ "deleteAllNodesError": "Відмова видалити всі вузли в графі",
+ "nodesRemoved": "{{count}} вузлів видалено, включаючи сирітські вузли",
+ "noNewNodes": "Розширюваних вузлів не знайдено",
+ "propertyNames": {
+ "description": "Опис",
+ "entity_id": "Ім'я",
+ "entity_type": "Тип",
+ "source_id": "C-ID",
+ "Neighbour": "Сусід",
+ "file_path": "Файл",
+ "keywords": "Ключі",
+ "weight": "Вага"
+ }
+ },
+ "edge": {
+ "title": "Відношення",
+ "id": "ID",
+ "type": "Тип",
+ "source": "Джерело",
+ "target": "Ціль",
+ "properties": "Властивості"
+ }
+ },
+ "search": {
+ "placeholder": "Шукати вузли на сторінці...",
+ "message": "Та {{count}} інших"
+ },
+ "graphLabels": {
+ "selectTooltip": "Отримати підграф вузла (мітка)",
+ "noLabels": "Відповідних вузлів не знайдено",
+ "label": "Шукати ім'я вузла",
+ "placeholder": "Шукати ім'я вузла...",
+ "andOthers": "Та {{count}} інших",
+ "refreshGlobalTooltip": "Оновити глобальні дані графа та скинути історію пошуку",
+ "refreshCurrentLabelTooltip": "Оновити дані графа поточної сторінки",
+ "refreshingTooltip": "Оновлення даних..."
+ },
+ "emptyGraph": "Порожньо (Спробуйте перезавантажити знову)"
+ },
+ "retrievePanel": {
+ "chatMessage": {
+ "copyTooltip": "Копіювати в буфер обміну",
+ "copyError": "Не вдалося скопіювати текст в буфер обміну",
+ "copyEmpty": "Немає вмісту для копіювання",
+ "copySuccess": "Вміст скопійовано в буфер обміну",
+ "copySuccessLegacy": "Вміст скопійовано (застарілий метод)",
+ "copySuccessManual": "Вміст скопійовано (ручний метод)",
+ "copyFailed": "Не вдалося скопіювати вміст",
+ "copyManualInstruction": "Будь ласка, виберіть та скопіюйте текст вручну",
+ "thinking": "Мислення...",
+ "thinkingTime": "Час мислення {{time}}с",
+ "thinkingInProgress": "Мислення в процесі..."
+ },
+ "retrieval": {
+ "startPrompt": "Почніть пошук, ввівши ваш запит нижче",
+ "clear": "Очистити",
+ "send": "Відправити",
+ "placeholder": "Введіть ваш запит (Підтримка префіксу: /<Режим запиту>)",
+ "error": "Помилка: Не вдалося отримати відповідь",
+ "queryModeError": "Підтримуються лише наступні режими запиту: {{modes}}",
+ "queryModePrefixInvalid": "Недійсний префікс режиму запиту. Використовуйте: / [пробіл] ваш запит"
+ },
+ "querySettings": {
+ "parametersTitle": "Параметри",
+ "parametersDescription": "Налаштуйте параметри вашого запиту",
+ "queryMode": "Режим запиту",
+ "queryModeTooltip": "Виберіть стратегію пошуку:\n• Naive: Традиційний пошук векторів текстових чанків\n• Local: Фокус на пошуку сутностей\n• Global: Фокус на пошуку відношень\n• Hybrid: Local+Global\n• Mix: Local+Global+Naive\n• Bypass: Пропустити пошук, надіслати історію розмови та поточне питання в LLM",
+ "queryModeOptions": {
+ "naive": "Naive",
+ "local": "Local",
+ "global": "Global",
+ "hybrid": "Hybrid",
+ "mix": "Mix",
+ "bypass": "Bypass"
+ },
+ "responseFormat": "Формат відповіді",
+ "responseFormatTooltip": "Визначає формат відповіді. Приклади:\n• Кілька абзаців\n• Один абзац\n• Маркований список",
+ "responseFormatOptions": {
+ "multipleParagraphs": "Кілька абзаців",
+ "singleParagraph": "Один абзац",
+ "bulletPoints": "Маркований список"
+ },
+ "topK": "KG Top K",
+ "topKTooltip": "Кількість сутностей та відношень для отримання. Застосовується для не-naive режимів.",
+ "topKPlaceholder": "Введіть значення top_k",
+ "chunkTopK": "Chunk Top K",
+ "chunkTopKTooltip": "Кількість текстових чанків для отримання, застосовується для всіх режимів.",
+ "chunkTopKPlaceholder": "Введіть значення chunk_top_k",
+ "maxEntityTokens": "Макс. токенів сутностей",
+ "maxEntityTokensTooltip": "Максимальна кількість токенів, виділених для контексту сутностей в уніфікованій системі контролю токенів",
+ "maxRelationTokens": "Макс. токенів відношень",
+ "maxRelationTokensTooltip": "Максимальна кількість токенів, виділених для контексту відношень в уніфікованій системі контролю токенів",
+ "maxTotalTokens": "Макс. загальна кількість токенів",
+ "maxTotalTokensTooltip": "Максимальний загальний бюджет токенів для всього контексту запиту (сутності + відношення + чанки + системний промпт)",
+ "historyTurns": "Хідів історії",
+ "historyTurnsTooltip": "Кількість повних ходів розмови (пари користувач-асистент) для врахування в контексті відповіді",
+ "historyTurnsPlaceholder": "Кількість ходів історії",
+ "onlyNeedContext": "Потрібен лише контекст",
+ "onlyNeedContextTooltip": "Якщо True, повертає лише отриманий контекст без генерації відповіді",
+ "onlyNeedPrompt": "Потрібен лише промпт",
+ "onlyNeedPromptTooltip": "Якщо True, повертає лише згенерований промпт без створення відповіді",
+ "streamResponse": "Потокова відповідь",
+ "streamResponseTooltip": "Якщо True, увімкнює потоковий вивід для відповідей у реальному часі",
+ "userPrompt": "Додатковий промпт виводу",
+ "userPromptTooltip": "Надайте додаткові вимоги до відповіді для LLM (не пов'язані з вмістом запиту, лише для обробки виводу).",
+ "userPromptPlaceholder": "Введіть користувацький промпт (необов'язково)",
+ "enableRerank": "Увімкнути реранк",
+ "enableRerankTooltip": "Увімкнути реранкінг для отриманих текстових чанків. Якщо True, але модель реранкера не налаштована, буде видано попередження. За замовчуванням True."
+ }
+ },
+ "apiSite": {
+ "loading": "Завантаження документації API..."
+ },
+ "apiKeyAlert": {
+ "title": "Потрібен API ключ",
+ "description": "Будь ласка, введіть ваш API ключ для доступу до сервісу",
+ "placeholder": "Введіть ваш API ключ",
+ "save": "Зберегти"
+ },
+ "pagination": {
+ "showing": "Показано {{start}} до {{end}} з {{total}} записів",
+ "page": "Сторінка",
+ "pageSize": "Розмір сторінки",
+ "firstPage": "Перша сторінка",
+ "prevPage": "Попередня сторінка",
+ "nextPage": "Наступна сторінка",
+ "lastPage": "Остання сторінка"
+ }
+}
diff --git a/lightrag_webui/src/stores/settings.ts b/lightrag_webui/src/stores/settings.ts
index ac300af8..5d8053a7 100644
--- a/lightrag_webui/src/stores/settings.ts
+++ b/lightrag_webui/src/stores/settings.ts
@@ -5,7 +5,7 @@ import { defaultQueryLabel } from '@/lib/constants'
import { Message, QueryRequest } from '@/api/lightrag'
type Theme = 'dark' | 'light' | 'system'
-type Language = 'en' | 'zh' | 'fr' | 'ar' | 'zh_TW'
+type Language = 'en' | 'zh' | 'fr' | 'ar' | 'zh_TW' | 'ru' | 'ja' | 'de' | 'uk'
type Tab = 'documents' | 'knowledge-graph' | 'retrieval' | 'api'
interface SettingsState {