packages/i18n (@d3ro/i18n) 신규:
- src/locales/ 12개 JSON (ko/en/ja/zh/zh-TW/es/fr/de/pt/ru/vi/th)
- src/index.tsx: TFunction/Locale/LOCALE_META/resolveTranslation/
포맷 유틸(createFormatDate/Number/RelativeDate/Time)/
I18nContext/useI18n/I18nProvider
Electron 독립성 확보 (monorepo 원칙 준수):
- I18nStorage interface 신설 (load/save 어댑터 추상화)
- window.electronAPI.config 직접 호출 제거
- I18nProvider는 storage prop으로 영속화 어댑터 주입
- 기본값 noopStorage (메모리 한정, 세션 범위)
- 결과: packages/i18n은 React에만 의존, web/mobile에서 재사용 가능
apps/desktop 어댑터:
- App.tsx에 electronI18nStorage 구현 (config.get/set 래핑)
- <I18nProvider storage={electronI18nStorage}>로 주입
apps/desktop 설정:
- package.json: @d3ro/i18n '*' dep 추가
- tsconfig.node/web.json paths에 @d3ro/i18n 추가
- electron.vite.config.ts alias + externalize exclude 추가
- vitest.config.ts alias 추가
일괄 치환 (29 파일):
- ./i18n, ../i18n, ../../i18n → @d3ro/i18n
apps/desktop/src/renderer/i18n/ 디렉토리 완전 제거.
검증: typecheck + build + dev 런타임 모두 통과.
Phase V2-1 전체 완료 (a/b/c/d).
282 lines
14 KiB
JSON
282 lines
14 KiB
JSON
{
|
|
"app.name": "D3RO Voice",
|
|
"app.tagline": "Lokaler KI-Sprachassistent",
|
|
"nav.dashboard": "Dashboard",
|
|
"nav.history": "Verlauf",
|
|
"nav.dictionary": "Wörterbuch",
|
|
"nav.commands": "Befehle",
|
|
"nav.settings": "Einstellungen",
|
|
"dashboard.sessionOverview": "Sitzungsübersicht",
|
|
"dashboard.systemStatus": "Systemstatus",
|
|
"dashboard.sessionsToday": "Sitzungen heute",
|
|
"dashboard.pressToRecord": "Drücke {{key}}, um die Aufnahme zu starten",
|
|
"dashboard.hotkeyNotSet": "Tastenkürzel nicht festgelegt",
|
|
"dashboard.words": "Wörter",
|
|
"dashboard.total": "gesamt",
|
|
"dashboard.streak": "Serie",
|
|
"dashboard.days": "Tage",
|
|
"dashboard.recording": "Aufnahme",
|
|
"dashboard.sessions": "Sitzungen",
|
|
"dashboard.today": "heute",
|
|
"dashboard.recentTranscriptions": "Letzte Transkriptionen",
|
|
"dashboard.noHistory": "Kein Verlauf — drücke das Tastenkürzel, um die Aufnahme zu starten",
|
|
"dashboard.copy": "Kopieren",
|
|
"dashboard.entries": "{{count}} Einträge",
|
|
"dashboard.stat": "Statistiken",
|
|
"dashboard.sys": "System",
|
|
"history.title": "Transkriptionsverlauf",
|
|
"history.search": "Suchen...",
|
|
"history.entries": "{{count}} Einträge",
|
|
"history.loading": "Laden...",
|
|
"history.noResults": "Keine Ergebnisse",
|
|
"history.noHistory": "Kein Verlauf — starte eine Aufnahme",
|
|
"history.count": "{{count}} Einträge",
|
|
"dictionary.title": "Benutzerwörterbuch",
|
|
"dictionary.words": "{{count}} Wörter",
|
|
"dictionary.add": "Hinzufügen",
|
|
"dictionary.search": "Suchen...",
|
|
"dictionary.loading": "Laden...",
|
|
"dictionary.noResults": "Keine Ergebnisse",
|
|
"dictionary.noWords": "Keine Wörter — füge benutzerdefinierte Wörter hinzu, um die STT-Genauigkeit zu verbessern",
|
|
"dictionary.used": "{{count}} Mal verwendet",
|
|
"dictionary.editTitle": "Wort bearbeiten",
|
|
"dictionary.addTitle": "Wort hinzufügen",
|
|
"dictionary.word": "Wort",
|
|
"dictionary.pronunciation": "Aussprache (optional)",
|
|
"commands.title": "LLM-Befehle",
|
|
"commands.count": "{{count}} Befehle",
|
|
"commands.add": "Hinzufügen",
|
|
"commands.activeCommand": "Aktiver Befehl",
|
|
"commands.none": "Keiner",
|
|
"commands.loading": "Laden...",
|
|
"commands.noCommands": "Keine Befehle — klicke auf Hinzufügen, um einen zu erstellen",
|
|
"commands.editTitle": "Befehl bearbeiten",
|
|
"commands.addTitle": "Befehl hinzufügen",
|
|
"commands.name": "Name",
|
|
"commands.description": "Beschreibung",
|
|
"commands.promptTemplate": "Prompt-Vorlage",
|
|
"commands.promptHelp": "{{text}} wird durch den transkribierten Text ersetzt",
|
|
"commands.defaultPrompt": "Bitte verbessere {{text}}.",
|
|
"settings.title": "Einstellungen",
|
|
"settings.tabs.general": "Allgemein",
|
|
"settings.tabs.audio": "Audio",
|
|
"settings.tabs.stt": "STT",
|
|
"settings.tabs.llm": "LLM",
|
|
"settings.tabs.about": "Über",
|
|
"settings.shortcuts": "Tastenkürzel",
|
|
"settings.dictation": "Diktat",
|
|
"settings.dictation.desc": "Gedrückt halten zum Sprechen. Die Transkription beginnt beim Loslassen.",
|
|
"settings.agent": "Agentenmodus",
|
|
"settings.agent.descWithKey": "Doppelklick auf {{key}}, um den Agentenmodus aufzurufen.",
|
|
"settings.agent.descNoKey": "Lege zuerst das Diktat-Tastenkürzel fest.",
|
|
"settings.oneTouch": "Ein-Tasten-Modus",
|
|
"settings.oneTouch.desc": "Drücken zum Starten, erneut drücken zum Beenden. Erfordert ein eigenes Tastenkürzel.",
|
|
"settings.key": "Taste",
|
|
"settings.notSet": "Nicht festgelegt",
|
|
"settings.enabled": "Aktiviert",
|
|
"settings.disabled": "Deaktiviert",
|
|
"settings.interface": "Oberfläche",
|
|
"settings.theme": "Design",
|
|
"settings.theme.system": "System",
|
|
"settings.theme.light": "Hell",
|
|
"settings.theme.dark": "Dunkel",
|
|
"settings.language": "Sprache",
|
|
"settings.appBehavior": "App-Verhalten",
|
|
"settings.closeToTray": "In Systembereich minimieren",
|
|
"settings.autoLaunch": "Beim Systemstart automatisch starten",
|
|
"settings.autoInsert": "Text nach der Transkription automatisch einfügen",
|
|
"settings.soundEffects": "Soundeffekte",
|
|
"settings.microphone": "Mikrofon",
|
|
"settings.inputDevice": "Eingabegerät",
|
|
"settings.deviceDefault": "(Standard)",
|
|
"settings.textInsert": "Texteinfügung",
|
|
"settings.insertMethod": "Einfügemethode",
|
|
"settings.insertClipboard": "Zwischenablage (Ctrl+V)",
|
|
"settings.insertKeyboard": "Tastatureingabe",
|
|
"settings.whisperModel": "Whisper-Modell",
|
|
"settings.model.tiny": "tiny (39 MB, am schnellsten)",
|
|
"settings.model.base": "base (74 MB, ausgewogen)",
|
|
"settings.model.small": "small (244 MB, gut)",
|
|
"settings.model.medium": "medium (769 MB, sehr gut)",
|
|
"settings.model.large": "large-v3 (1,5 GB, beste Qualität)",
|
|
"settings.sttLanguage": "Erkennungssprache",
|
|
"settings.sttLang.auto": "Automatische Erkennung",
|
|
"settings.ollamaServer": "Ollama-Server",
|
|
"settings.ollamaUrl": "Ollama-Server-URL",
|
|
"settings.ollamaHint": "D3RO Voice verbindet sich automatisch, wenn Ollama läuft. Lade Modelle direkt über Ollama herunter (z. B.: ollama pull qwen3:4b).",
|
|
"settings.postProcess": "Sprachnachbearbeitung",
|
|
"settings.defaultAction": "Standard-Nachbearbeitungsaktion",
|
|
"settings.action.none": "Keine (Originaltext unverändert)",
|
|
"settings.action.refine": "Verfeinern (Grammatik + Natürlichkeit)",
|
|
"settings.action.translate": "Übersetzen",
|
|
"settings.action.summarize": "Zusammenfassen",
|
|
"settings.action.grammar": "Grammatikkorrektur",
|
|
"settings.action.custom": "Benutzerdefinierter Prompt",
|
|
"settings.actionHint": "Die gewählte LLM-Nachbearbeitung wird auf den transkribierten Text angewendet, nachdem mit dem Tastenkürzel aufgenommen wurde. Funktioniert nur, wenn Ollama verbunden ist.",
|
|
"settings.about.version": "Version",
|
|
"settings.about.techStack": "Tech-Stack",
|
|
"settings.about.techStackValue": "Electron + React 19 + MUI 7 + TypeScript",
|
|
"settings.about.voiceEngine": "Sprach-Engine",
|
|
"settings.about.voiceEngineValue": "STT: faster-whisper (lokal) / LLM: Ollama (lokal)",
|
|
"settings.about.description": "Vollständig lokaler KI-Sprachassistent, basierend auf Reverse Engineering von Speakly. Funktioniert ohne Cloud-Abhängigkeiten.",
|
|
"settings.about.restartOnboarding": "Einrichtungsanleitung erneut anzeigen",
|
|
"status.ollama": "OLLAMA",
|
|
"status.offline": "OFFLINE",
|
|
"status.nudge.title": "Ollama läuft nicht",
|
|
"status.nudge.desc": "Ollama wird für die LLM-Nachbearbeitung (Übersetzung, Zusammenfassung usw.) benötigt.",
|
|
"status.nudge.guide": "Installationsanleitung anzeigen →",
|
|
"onboarding.welcome.title": "D3RO-VOICE",
|
|
"onboarding.welcome.desc": "Ohne Tippen, per Sprache. Dein lokaler KI-Sprachassistent.",
|
|
"onboarding.welcome.start": "Loslegen",
|
|
"onboarding.mic.title": "Mikrofon einrichten",
|
|
"onboarding.mic.desc": "Wähle das Mikrofon aus, das du verwenden möchtest. Du kannst es später in den Einstellungen ändern.",
|
|
"onboarding.hotkey.title": "Tastenkürzel einrichten",
|
|
"onboarding.hotkey.desc": "Lege das Diktat-Tastenkürzel fest. Die Aufnahme läuft, solange du die Taste gedrückt hältst.",
|
|
"onboarding.hotkey.notSet": "Kein Tastenkürzel festgelegt",
|
|
"onboarding.hotkey.change": "Tastenkürzel ändern",
|
|
"onboarding.hotkey.set": "Tastenkürzel festlegen",
|
|
"onboarding.ollama.title": "Ollama installieren (optional)",
|
|
"onboarding.ollama.desc": "Ollama wird für die LLM-Nachbearbeitung wie Übersetzung oder Zusammenfassung benötigt. Die Sprachdiktierung funktioniert ohne Ollama.",
|
|
"onboarding.ollama.download": "Ollama herunterladen",
|
|
"onboarding.ollama.modelHint": "Lade nach der Installation ein Modell über das Terminal herunter",
|
|
"onboarding.done.title": "Einrichtung abgeschlossen!",
|
|
"onboarding.done.descWithKey": "Halte {{key}} gedrückt und sprich, um deine Stimme in Text umzuwandeln.",
|
|
"onboarding.done.descNoKey": "Lege in den Einstellungen ein Tastenkürzel fest, um mit der Spracheingabe zu beginnen.",
|
|
"onboarding.done.start": "Loslegen",
|
|
"onboarding.back": "Zurück",
|
|
"onboarding.next": "Weiter",
|
|
"hotkey.title": "Tastenkürzel einrichten",
|
|
"hotkey.dictationTitle": "Diktat-Tastenkürzel einrichten",
|
|
"hotkey.oneTouchTitle": "Tastenkürzel für Ein-Tasten-Modus einrichten",
|
|
"hotkey.prompt": "Drücke eine Tastenkombination...",
|
|
"hotkey.ready": "✓ {{keys}} — drücke Speichern",
|
|
"hotkey.noKey": "Bitte gib eine Taste ein",
|
|
"hotkey.reserved": "{{keys}} ist ein vom System reserviertes Tastenkürzel",
|
|
"hotkey.current": "Aktuell: {{keys}}",
|
|
"hotkey.hint": "Gib eine Kombination (z. B. Ctrl+Shift+Q) oder eine einzelne Taste (z. B. F5) ein",
|
|
"hotkey.reset": "Erneut eingeben",
|
|
"ollama.title": "OLLAMA EINRICHTUNGSANLEITUNG",
|
|
"ollama.step1.title": "SCHRITT 1 — Ollama installieren",
|
|
"ollama.step1.desc": "Ollama ist ein kostenloses Tool zum lokalen Ausführen von LLMs.",
|
|
"ollama.step2.title": "SCHRITT 2 — Modell herunterladen",
|
|
"ollama.step2.desc": "Führe den folgenden Befehl im Terminal aus, um das empfohlene Modell herunterzuladen:",
|
|
"ollama.step2.alt": "Oder ein größeres Modell: ollama pull qwen3:8b (genauer, langsamer)",
|
|
"ollama.step3.title": "SCHRITT 3 — Automatische Verbindung",
|
|
"ollama.step3.desc": "D3RO-VOICE erkennt automatisch, wenn Ollama läuft. Wenn die LED in der Statusleiste von Rot auf Grün wechselt, ist alles bereit!",
|
|
"service.sttEngine": "STT-ENGINE",
|
|
"service.ollamaLlm": "OLLAMA LLM",
|
|
"service.hotkeyHook": "TASTENKÜRZEL",
|
|
"service.audioInput": "AUDIOEINGABE",
|
|
"service.ready": "BEREIT",
|
|
"service.connected": "VERBUNDEN",
|
|
"service.offline": "OFFLINE",
|
|
"service.active": "AKTIV",
|
|
"service.standby": "BEREITSCHAFT",
|
|
"common.cancel": "Abbrechen",
|
|
"common.save": "Speichern",
|
|
"common.delete": "Löschen",
|
|
"common.add": "Hinzufügen",
|
|
"common.edit": "Bearbeiten",
|
|
"common.close": "Schließen",
|
|
"common.confirm": "Bestätigen",
|
|
"common.loading": "Laden...",
|
|
"common.copy": "Kopieren",
|
|
"common.test": "Testen",
|
|
"common.stop": "Stoppen",
|
|
"date.today": "Heute",
|
|
"date.yesterday": "Gestern",
|
|
"settings.theme.nord": "Nord",
|
|
"settings.theme.solarized": "Solarized",
|
|
"settings.theme.catppuccin": "Catppuccin",
|
|
"settings.theme.dracula": "Dracula",
|
|
"settings.sttLang.ko": "Koreanisch",
|
|
"settings.sttLang.en": "Englisch",
|
|
"settings.sttLang.ja": "Japanisch",
|
|
"settings.sttLang.zh": "Chinesisch",
|
|
"template.outputHelperText": "Verwenden Sie {{Feldname}} für Platzhalter",
|
|
"nav.meeting": "Meeting",
|
|
"meeting.title": "Meeting-Modus",
|
|
"meeting.newMeeting": "Neues Meeting",
|
|
"meeting.startRecording": "Aufnahme starten",
|
|
"meeting.stopRecording": "Aufnahme beenden",
|
|
"meeting.recording": "Aufnahme läuft",
|
|
"meeting.processing": "Protokoll wird erstellt...",
|
|
"meeting.completed": "Abgeschlossen",
|
|
"meeting.error": "Fehler",
|
|
"meeting.elapsed": "Vergangen",
|
|
"meeting.memoPlaceholder": "Memo eingeben (Enter zum Hinzufügen)",
|
|
"meeting.memoAdded": "Memo hinzugefügt",
|
|
"meeting.noSessions": "Keine Meeting-Aufnahmen",
|
|
"meeting.noSessionsDesc": "Drücke «Neues Meeting», um die Aufnahme zu starten",
|
|
"meeting.summary": "Zusammenfassung",
|
|
"meeting.decisions": "Beschlüsse",
|
|
"meeting.actionItems": "Aufgaben",
|
|
"meeting.timeline": "Zeitlinie",
|
|
"meeting.transcript": "Rohtranskript",
|
|
"meeting.memos": "Memos",
|
|
"meeting.exportPdf": "Als PDF exportieren",
|
|
"meeting.exportMarkdown": "Als Markdown exportieren",
|
|
"meeting.delete": "Löschen",
|
|
"meeting.deleteConfirm": "Diesen Meeting-Eintrag löschen?",
|
|
"meeting.backToList": "Zurück zur Liste",
|
|
"meeting.notificationTitle": "Protokoll fertig",
|
|
"meeting.notificationBody": "Das Meeting-Protokoll wurde erstellt.",
|
|
"meeting.sessions": "{{count}} Sitzungen",
|
|
"meeting.duration": "{{minutes}} Min.",
|
|
"meeting.editTitle": "Titel bearbeiten",
|
|
"meeting.untitled": "Meeting ohne Titel",
|
|
"meeting.processingStep.merging": "Transkript zusammenführen...",
|
|
"meeting.processingStep.generating": "Protokoll mit LLM erstellen...",
|
|
"meeting.processingStep.parsing": "Protokoll analysieren...",
|
|
"meeting.processingStep.saving": "Speichern...",
|
|
"meeting.processingStep.notifying": "Benachrichtigung senden...",
|
|
"meeting.transcriptTab": "Transkript",
|
|
"meeting.addDocument": "Dokument hinzufügen",
|
|
"meeting.selectTemplate": "Vorlage auswählen",
|
|
"meeting.generate": "Generieren",
|
|
"meeting.generating": "Dokument wird generiert...",
|
|
"meeting.editMode": "Bearbeiten",
|
|
"meeting.previewMode": "Vorschau",
|
|
"meeting.modified": "Geändert",
|
|
"meeting.originalText": "Original",
|
|
"meeting.editedText": "Bearbeitet",
|
|
"meeting.exportDocx": "DOCX exportieren",
|
|
"meeting.exportTxt": "TXT exportieren",
|
|
"meeting.exportFormat": "Exportieren",
|
|
"meeting.customPrompt": "Benutzerdefinierter Prompt",
|
|
"meeting.templateName": "Vorlagenname",
|
|
"meeting.templatePrompt": "KI-Prompt",
|
|
"meeting.templateSave": "Vorlage speichern",
|
|
"meeting.documentDeleted": "Dokument gelöscht",
|
|
"meeting.autoSaved": "Automatisch gespeichert",
|
|
"meeting.minutesTemplate": "Besprechungsprotokoll",
|
|
"meeting.reportTemplate": "Bericht",
|
|
"meeting.ideaNoteTemplate": "Ideennotiz",
|
|
"meeting.customTemplate": "Benutzerdefiniert",
|
|
"meeting.downloadTranscript": "Transkript herunterladen",
|
|
"meeting.polish": "KI Glätten",
|
|
"meeting.polishing": "KI glättet Transkript...",
|
|
"meeting.polished": "KI Glättung abgeschlossen",
|
|
"meeting.mindmapTemplate": "Mindmap",
|
|
"meeting.chat": "KI-Chat",
|
|
"meeting.chatPlaceholder": "Fragen Sie zum Meeting...",
|
|
"meeting.chatSend": "Senden",
|
|
"meeting.chatClear": "Chat löschen",
|
|
"meeting.copyToClipboard": "In Zwischenablage kopieren",
|
|
"meeting.copied": "Kopiert",
|
|
"meeting.chatCollapse": "Chat einklappen",
|
|
"meeting.chatExpand": "Chat ausklappen",
|
|
"meeting.exportMd": "Markdown (.md)",
|
|
"meeting.exportPdfFmt": "PDF (.pdf)",
|
|
"meeting.polishFailed": "KI-Polierung fehlgeschlagen",
|
|
"meeting.viewDetailError": "Meeting-Details konnten nicht geladen werden",
|
|
"meeting.startRecordingError": "Aufnahme konnte nicht gestartet werden",
|
|
"meeting.diarize": "Sprecher trennen",
|
|
"meeting.diarizing": "Sprecher werden identifiziert...",
|
|
"meeting.diarizeComplete": "Sprechertrennung abgeschlossen",
|
|
"meeting.speaker": "Sprecher",
|
|
"settings.hfToken": "HuggingFace Token",
|
|
"settings.hfTokenHint": "Ein HuggingFace Token wird für die Sprechertrennung benötigt",
|
|
"settings.diarization": "Sprechertrennung",
|
|
"settings.diarizationHint": "Sprecher werden nach der Aufnahme automatisch identifiziert"
|
|
}
|