묶음 A — UI 정리 + i18n 완성: [A1] desktop SettingsModal에 CloudSyncSection 통합 (탭 6번째) - CloudIcon import, settings.tabs.cloud 키 추가 - 기존 about 탭은 index 5 -> 6 [A2] apps/web Sidebar 공유 layout 리팩터링 - app/(app)/layout.tsx 신규 (route group) - dashboard/meetings/record/teams/billing을 (app)/ 아래로 git mv - app/(app)/layout.tsx에 auth 가드 + Sidebar 통합 - 기존 개별 page.tsx에서 Sidebar/auth 중복 제거 - app/(app)/dashboard/layout.tsx 제거 (루트 layout이 처리) [A3] 11개 locale에 V2 새 키 추가 (en/ja/zh/zh-TW/es/fr/de/pt/ru/vi/th) - nav.meetings/record/teams/billing/logout - login.subtitle/google/github/terms - settings.tabs.cloud 묶음 B — V2-4b pull 동기화: - CloudSyncService.pullAll() 신규 - history/dictionary 테이블 원격에서 fetch - last_sync_at 이후 updated_at만 필터 - Last-Write-Wins 충돌 해결 (remote.updated_at > local.updated_at) - 로컬에 없는 행은 INSERT, 있는 행은 UPDATE (구체적 컬럼 지정) - IPC CLOUD_SYNC.PULL_ALL 채널 + handler + preload api - CloudSyncSection에 Pull 버튼 추가 (Push 옆에 위치) 묶음 C — V2-8b Stripe webhook 서명 검증: - stripe-webhook Edge Function에 Web Crypto API 기반 HMAC-SHA256 검증 - Stripe-Signature 헤더 파싱 (t=, v1= 엔트리) - Replay 방지 (timestamp tolerance 300초) - constantTimeEqual로 타이밍 공격 방지 - crypto.subtle.importKey/sign으로 HMAC 계산 - stripe-portal Edge Function 신규 (Customer Portal) - JWT 인증 -> 기존 customer_id 조회 -> billing_portal/sessions 생성 - return_url 지원 - apps/web/components/billing/portal-button.tsx (구독 관리 버튼) - billing 페이지에 Free 외 tier 사용자에게 PortalButton 표시 - config.toml에 stripe-portal 함수 등록 (verify_jwt=true) 묶음 D — V2-6b packages/ui-native: - @d3ro/ui-native 신규 패키지 (React Native 전용 DS) - theme.ts: d3roNativePalette/Typo/Radius (MUI 없는 정적 값) - components/MetalCard.tsx: View + 섀시 섀도우 - components/PhosphorText.tsx: Text + 앰버 glow (textShadow) - components/Led.tsx: View 원 + glow - components/PhysicalButton.tsx: Pressable + 누름 느낌 - React/React-Native는 peerDependencies - apps/mobile/package.json에 @d3ro/ui-native를 file: 의존성으로 추가 (mobile은 npm workspace 제외이므로 file path 필요) 검증: - desktop typecheck OK - web typecheck OK - web next build OK (11 라우트, (app) 그룹 반영) - 회귀 없음
292 lines
No EOL
15 KiB
JSON
292 lines
No EOL
15 KiB
JSON
{
|
|
"app.name": "D3RO Voice",
|
|
"app.tagline": "Assistant vocal IA local",
|
|
"nav.dashboard": "Tableau de bord",
|
|
"nav.history": "Historique",
|
|
"nav.dictionary": "Dictionnaire",
|
|
"nav.commands": "Commandes",
|
|
"nav.settings": "Paramètres",
|
|
"nav.meetings": "Réunions",
|
|
"nav.record": "Enregistrer",
|
|
"nav.teams": "Équipes",
|
|
"nav.billing": "Facturation",
|
|
"nav.logout": "Déconnexion",
|
|
"login.subtitle": "Assistant vocal IA",
|
|
"login.google": "Continuer avec Google",
|
|
"login.github": "Continuer avec GitHub",
|
|
"login.terms": "En continuant, vous acceptez les Conditions d'utilisation et la Politique de confidentialité.",
|
|
"dashboard.sessionOverview": "Aperçu de session",
|
|
"dashboard.systemStatus": "État du système",
|
|
"dashboard.sessionsToday": "Sessions aujourd'hui",
|
|
"dashboard.pressToRecord": "Appuyez sur {{key}} pour commencer l'enregistrement",
|
|
"dashboard.hotkeyNotSet": "Raccourci non configuré",
|
|
"dashboard.words": "mots",
|
|
"dashboard.total": "total",
|
|
"dashboard.streak": "série",
|
|
"dashboard.days": "jours",
|
|
"dashboard.recording": "enregistrement",
|
|
"dashboard.sessions": "sessions",
|
|
"dashboard.today": "aujourd'hui",
|
|
"dashboard.recentTranscriptions": "Transcriptions récentes",
|
|
"dashboard.noHistory": "Aucun historique — appuyez sur le raccourci pour commencer à enregistrer",
|
|
"dashboard.copy": "Copier",
|
|
"dashboard.entries": "{{count}} entrées",
|
|
"dashboard.stat": "statistiques",
|
|
"dashboard.sys": "système",
|
|
"history.title": "Historique des transcriptions",
|
|
"history.search": "Rechercher...",
|
|
"history.entries": "{{count}} entrées",
|
|
"history.loading": "Chargement...",
|
|
"history.noResults": "Aucun résultat",
|
|
"history.noHistory": "Aucun historique — commencez à enregistrer",
|
|
"history.count": "{{count}} entrées",
|
|
"dictionary.title": "Dictionnaire personnalisé",
|
|
"dictionary.words": "{{count}} mots",
|
|
"dictionary.add": "Ajouter",
|
|
"dictionary.search": "Rechercher...",
|
|
"dictionary.loading": "Chargement...",
|
|
"dictionary.noResults": "Aucun résultat",
|
|
"dictionary.noWords": "Aucun mot — ajoutez des mots personnalisés pour améliorer la précision du STT",
|
|
"dictionary.used": "utilisé {{count}} fois",
|
|
"dictionary.editTitle": "Modifier le mot",
|
|
"dictionary.addTitle": "Ajouter un mot",
|
|
"dictionary.word": "Mot",
|
|
"dictionary.pronunciation": "Prononciation (facultatif)",
|
|
"commands.title": "Commandes LLM",
|
|
"commands.count": "{{count}} commandes",
|
|
"commands.add": "Ajouter",
|
|
"commands.activeCommand": "Commande active",
|
|
"commands.none": "Aucune",
|
|
"commands.loading": "Chargement...",
|
|
"commands.noCommands": "Aucune commande — cliquez sur ajouter pour en créer une",
|
|
"commands.editTitle": "Modifier la commande",
|
|
"commands.addTitle": "Ajouter une commande",
|
|
"commands.name": "Nom",
|
|
"commands.description": "Description",
|
|
"commands.promptTemplate": "Modèle de prompt",
|
|
"commands.promptHelp": "{{text}} sera remplacé par le texte transcrit",
|
|
"commands.defaultPrompt": "Veuillez améliorer {{text}}.",
|
|
"settings.title": "Paramètres",
|
|
"settings.tabs.general": "Général",
|
|
"settings.tabs.audio": "Audio",
|
|
"settings.tabs.stt": "STT",
|
|
"settings.tabs.llm": "LLM",
|
|
"settings.tabs.cloud": "Cloud",
|
|
"settings.tabs.about": "À propos",
|
|
"settings.shortcuts": "Raccourcis",
|
|
"settings.dictation": "Dictée",
|
|
"settings.dictation.desc": "Maintenez enfoncé pour parler. La transcription démarre au relâchement.",
|
|
"settings.agent": "Mode agent",
|
|
"settings.agent.descWithKey": "Double-cliquez sur {{key}} pour entrer en mode agent.",
|
|
"settings.agent.descNoKey": "Configurez d'abord le raccourci de dictée.",
|
|
"settings.oneTouch": "Mode une touche",
|
|
"settings.oneTouch.desc": "Appuyez pour démarrer, appuyez à nouveau pour arrêter. Nécessite un raccourci distinct.",
|
|
"settings.key": "Touche",
|
|
"settings.notSet": "Non configuré",
|
|
"settings.enabled": "Activé",
|
|
"settings.disabled": "Désactivé",
|
|
"settings.interface": "Interface",
|
|
"settings.theme": "Thème",
|
|
"settings.theme.system": "Système",
|
|
"settings.theme.light": "Clair",
|
|
"settings.theme.dark": "Sombre",
|
|
"settings.language": "Langue",
|
|
"settings.appBehavior": "Comportement de l'application",
|
|
"settings.closeToTray": "Réduire dans la barre système",
|
|
"settings.autoLaunch": "Lancer au démarrage du système",
|
|
"settings.autoInsert": "Insérer le texte automatiquement après la transcription",
|
|
"settings.soundEffects": "Effets sonores",
|
|
"settings.microphone": "Microphone",
|
|
"settings.inputDevice": "Périphérique d'entrée",
|
|
"settings.deviceDefault": "(par défaut)",
|
|
"settings.textInsert": "Insertion de texte",
|
|
"settings.insertMethod": "Méthode d'insertion",
|
|
"settings.insertClipboard": "Presse-papiers (Ctrl+V)",
|
|
"settings.insertKeyboard": "Frappe au clavier",
|
|
"settings.whisperModel": "Modèle Whisper",
|
|
"settings.model.tiny": "tiny (39 Mo, le plus rapide)",
|
|
"settings.model.base": "base (74 Mo, équilibré)",
|
|
"settings.model.small": "small (244 Mo, bon)",
|
|
"settings.model.medium": "medium (769 Mo, très bon)",
|
|
"settings.model.large": "large-v3 (1,5 Go, meilleur)",
|
|
"settings.sttLanguage": "Langue de reconnaissance",
|
|
"settings.sttLang.auto": "Détection automatique",
|
|
"settings.ollamaServer": "Serveur Ollama",
|
|
"settings.ollamaUrl": "URL du serveur Ollama",
|
|
"settings.ollamaHint": "D3RO Voice se connecte automatiquement quand Ollama est en cours d'exécution. Téléchargez les modèles directement depuis Ollama (ex : ollama pull qwen3:4b).",
|
|
"settings.postProcess": "Post-traitement vocal",
|
|
"settings.defaultAction": "Action de post-traitement par défaut",
|
|
"settings.action.none": "Aucune (texte original inchangé)",
|
|
"settings.action.refine": "Affiner (grammaire + naturel)",
|
|
"settings.action.translate": "Traduire",
|
|
"settings.action.summarize": "Résumer",
|
|
"settings.action.grammar": "Correction grammaticale",
|
|
"settings.action.custom": "Prompt personnalisé",
|
|
"settings.actionHint": "Le post-traitement LLM sélectionné est appliqué au texte transcrit après l'enregistrement avec le raccourci. Ne fonctionne que lorsque Ollama est connecté.",
|
|
"settings.about.version": "Version",
|
|
"settings.about.techStack": "Stack technologique",
|
|
"settings.about.techStackValue": "Electron + React 19 + MUI 7 + TypeScript",
|
|
"settings.about.voiceEngine": "Moteur vocal",
|
|
"settings.about.voiceEngineValue": "STT : faster-whisper (local) / LLM : Ollama (local)",
|
|
"settings.about.description": "Assistant vocal IA entièrement local, basé sur l'ingénierie inverse de Speakly. Fonctionne sans dépendance au cloud.",
|
|
"settings.about.restartOnboarding": "Revoir le guide de configuration initiale",
|
|
"status.ollama": "OLLAMA",
|
|
"status.offline": "HORS LIGNE",
|
|
"status.nudge.title": "Ollama n'est pas en cours d'exécution",
|
|
"status.nudge.desc": "Ollama est nécessaire pour le post-traitement LLM (traduction, résumé, etc.).",
|
|
"status.nudge.guide": "Voir le guide d'installation →",
|
|
"onboarding.welcome.title": "D3RO-VOICE",
|
|
"onboarding.welcome.desc": "Sans taper, par la voix. Votre assistant vocal IA local.",
|
|
"onboarding.welcome.start": "Commencer",
|
|
"onboarding.mic.title": "Configuration du microphone",
|
|
"onboarding.mic.desc": "Sélectionnez le microphone que vous souhaitez utiliser. Vous pourrez le modifier plus tard dans les paramètres.",
|
|
"onboarding.hotkey.title": "Configuration du raccourci",
|
|
"onboarding.hotkey.desc": "Configurez le raccourci de dictée. L'enregistrement dure tant que vous maintenez la touche enfoncée.",
|
|
"onboarding.hotkey.notSet": "Aucun raccourci configuré",
|
|
"onboarding.hotkey.change": "Modifier le raccourci",
|
|
"onboarding.hotkey.set": "Configurer le raccourci",
|
|
"onboarding.ollama.title": "Installer Ollama (facultatif)",
|
|
"onboarding.ollama.desc": "Ollama est nécessaire pour le post-traitement LLM comme la traduction ou le résumé. La dictée vocale fonctionne sans Ollama.",
|
|
"onboarding.ollama.download": "Télécharger Ollama",
|
|
"onboarding.ollama.modelHint": "Après l'installation, téléchargez un modèle depuis le terminal",
|
|
"onboarding.done.title": "Configuration terminée !",
|
|
"onboarding.done.descWithKey": "Maintenez {{key}} enfoncé et parlez pour convertir votre voix en texte.",
|
|
"onboarding.done.descNoKey": "Configurez un raccourci dans les paramètres pour commencer la dictée.",
|
|
"onboarding.done.start": "Commencer",
|
|
"onboarding.back": "Retour",
|
|
"onboarding.next": "Suivant",
|
|
"hotkey.title": "Configurer le raccourci",
|
|
"hotkey.dictationTitle": "Configurer le raccourci de dictée",
|
|
"hotkey.oneTouchTitle": "Configurer le raccourci du mode une touche",
|
|
"hotkey.prompt": "Appuyez sur une combinaison de touches...",
|
|
"hotkey.ready": "✓ {{keys}} — appuyez sur enregistrer",
|
|
"hotkey.noKey": "Veuillez saisir une touche",
|
|
"hotkey.reserved": "{{keys}} est un raccourci réservé par le système",
|
|
"hotkey.current": "Actuel : {{keys}}",
|
|
"hotkey.hint": "Saisissez une combinaison (ex : Ctrl+Shift+Q) ou une touche seule (ex : F5)",
|
|
"hotkey.reset": "Ressaisir",
|
|
"ollama.title": "GUIDE DE CONFIGURATION OLLAMA",
|
|
"ollama.step1.title": "ÉTAPE 1 — Installer Ollama",
|
|
"ollama.step1.desc": "Ollama est un outil gratuit pour exécuter des LLM en local.",
|
|
"ollama.step2.title": "ÉTAPE 2 — Télécharger un modèle",
|
|
"ollama.step2.desc": "Exécutez la commande suivante dans le terminal pour télécharger le modèle recommandé :",
|
|
"ollama.step2.alt": "Ou un modèle plus grand : ollama pull qwen3:8b (plus précis, plus lent)",
|
|
"ollama.step3.title": "ÉTAPE 3 — Connexion automatique",
|
|
"ollama.step3.desc": "D3RO-VOICE détecte automatiquement quand Ollama est en cours d'exécution. Quand la LED de la barre d'état passe du rouge au vert, c'est prêt !",
|
|
"service.sttEngine": "MOTEUR STT",
|
|
"service.ollamaLlm": "OLLAMA LLM",
|
|
"service.hotkeyHook": "RACCOURCI CLAVIER",
|
|
"service.audioInput": "ENTRÉE AUDIO",
|
|
"service.ready": "PRÊT",
|
|
"service.connected": "CONNECTÉ",
|
|
"service.offline": "HORS LIGNE",
|
|
"service.active": "ACTIF",
|
|
"service.standby": "EN VEILLE",
|
|
"common.cancel": "Annuler",
|
|
"common.save": "Enregistrer",
|
|
"common.delete": "Supprimer",
|
|
"common.add": "Ajouter",
|
|
"common.edit": "Modifier",
|
|
"common.close": "Fermer",
|
|
"common.confirm": "Confirmer",
|
|
"common.loading": "Chargement...",
|
|
"common.copy": "Copier",
|
|
"common.test": "Tester",
|
|
"common.stop": "Arrêter",
|
|
"date.today": "Aujourd'hui",
|
|
"date.yesterday": "Hier",
|
|
"settings.theme.nord": "Nord",
|
|
"settings.theme.solarized": "Solarized",
|
|
"settings.theme.catppuccin": "Catppuccin",
|
|
"settings.theme.dracula": "Dracula",
|
|
"settings.sttLang.ko": "Coréen",
|
|
"settings.sttLang.en": "Anglais",
|
|
"settings.sttLang.ja": "Japonais",
|
|
"settings.sttLang.zh": "Chinois",
|
|
"template.outputHelperText": "Utilisez {{nomChamp}} pour les espaces réservés",
|
|
"nav.meeting": "Réunion",
|
|
"meeting.title": "Mode Réunion",
|
|
"meeting.newMeeting": "Nouvelle Réunion",
|
|
"meeting.startRecording": "Démarrer l'enregistrement",
|
|
"meeting.stopRecording": "Arrêter l'enregistrement",
|
|
"meeting.recording": "Enregistrement en cours",
|
|
"meeting.processing": "Génération du compte-rendu...",
|
|
"meeting.completed": "Terminé",
|
|
"meeting.error": "Erreur",
|
|
"meeting.elapsed": "Temps écoulé",
|
|
"meeting.memoPlaceholder": "Saisir un mémo (Entrée pour ajouter)",
|
|
"meeting.memoAdded": "Mémo ajouté",
|
|
"meeting.noSessions": "Aucun enregistrement de réunion",
|
|
"meeting.noSessionsDesc": "Appuyez sur Nouvelle Réunion pour commencer l'enregistrement",
|
|
"meeting.summary": "Résumé",
|
|
"meeting.decisions": "Décisions",
|
|
"meeting.actionItems": "Actions à mener",
|
|
"meeting.timeline": "Chronologie",
|
|
"meeting.transcript": "Transcription brute",
|
|
"meeting.memos": "Mémos",
|
|
"meeting.exportPdf": "Exporter en PDF",
|
|
"meeting.exportMarkdown": "Exporter en Markdown",
|
|
"meeting.delete": "Supprimer",
|
|
"meeting.deleteConfirm": "Supprimer cet enregistrement de réunion ?",
|
|
"meeting.backToList": "Retour à la liste",
|
|
"meeting.notificationTitle": "Compte-rendu prêt",
|
|
"meeting.notificationBody": "Le compte-rendu de la réunion a été généré.",
|
|
"meeting.sessions": "{{count}} séances",
|
|
"meeting.duration": "{{minutes}} min",
|
|
"meeting.editTitle": "Modifier le titre",
|
|
"meeting.untitled": "Réunion sans titre",
|
|
"meeting.processingStep.merging": "Fusion de la transcription...",
|
|
"meeting.processingStep.generating": "Génération du compte-rendu avec LLM...",
|
|
"meeting.processingStep.parsing": "Analyse du compte-rendu...",
|
|
"meeting.processingStep.saving": "Enregistrement...",
|
|
"meeting.processingStep.notifying": "Envoi de la notification...",
|
|
"meeting.transcriptTab": "Transcription",
|
|
"meeting.addDocument": "Ajouter un document",
|
|
"meeting.selectTemplate": "Choisir un modèle",
|
|
"meeting.generate": "Générer",
|
|
"meeting.generating": "Génération du document...",
|
|
"meeting.editMode": "Éditer",
|
|
"meeting.previewMode": "Aperçu",
|
|
"meeting.modified": "Modifié",
|
|
"meeting.originalText": "Original",
|
|
"meeting.editedText": "Édité",
|
|
"meeting.exportDocx": "Exporter DOCX",
|
|
"meeting.exportTxt": "Exporter TXT",
|
|
"meeting.exportFormat": "Exporter",
|
|
"meeting.customPrompt": "Invite personnalisée",
|
|
"meeting.templateName": "Nom du modèle",
|
|
"meeting.templatePrompt": "Invite IA",
|
|
"meeting.templateSave": "Sauvegarder le modèle",
|
|
"meeting.documentDeleted": "Document supprimé",
|
|
"meeting.autoSaved": "Sauvegarde automatique",
|
|
"meeting.minutesTemplate": "Compte-rendu",
|
|
"meeting.reportTemplate": "Rapport",
|
|
"meeting.ideaNoteTemplate": "Note d'idées",
|
|
"meeting.customTemplate": "Personnalisé",
|
|
"meeting.downloadTranscript": "Télécharger la transcription",
|
|
"meeting.polish": "Peaufiner avec IA",
|
|
"meeting.polishing": "L'IA peaufine la transcription...",
|
|
"meeting.polished": "Peaufinement IA terminé",
|
|
"meeting.mindmapTemplate": "Carte mentale",
|
|
"meeting.chat": "Chat IA",
|
|
"meeting.chatPlaceholder": "Posez une question sur la réunion...",
|
|
"meeting.chatSend": "Envoyer",
|
|
"meeting.chatClear": "Effacer le chat",
|
|
"meeting.copyToClipboard": "Copier dans le presse-papiers",
|
|
"meeting.copied": "Copié",
|
|
"meeting.chatCollapse": "Réduire le chat",
|
|
"meeting.chatExpand": "Agrandir le chat",
|
|
"meeting.exportMd": "Markdown (.md)",
|
|
"meeting.exportPdfFmt": "PDF (.pdf)",
|
|
"meeting.polishFailed": "Echec du polish IA",
|
|
"meeting.viewDetailError": "Impossible de charger les détails de la réunion",
|
|
"meeting.startRecordingError": "Impossible de démarrer l'enregistrement",
|
|
"meeting.diarize": "Identifier les locuteurs",
|
|
"meeting.diarizing": "Identification des locuteurs...",
|
|
"meeting.diarizeComplete": "Identification terminée",
|
|
"meeting.speaker": "Locuteur",
|
|
"settings.hfToken": "Token HuggingFace",
|
|
"settings.hfTokenHint": "Un token HuggingFace est requis pour l'identification des locuteurs",
|
|
"settings.diarization": "Identification des locuteurs",
|
|
"settings.diarizationHint": "Identifier automatiquement les locuteurs après l'enregistrement"
|
|
} |