diff --git a/src/i18n/messages/fr_fr.ts b/src/i18n/messages/fr_fr.ts index 7e36623..a5561fd 100644 --- a/src/i18n/messages/fr_fr.ts +++ b/src/i18n/messages/fr_fr.ts @@ -5,17 +5,21 @@ export const frFrMessages: TranslationMessages = { ...enUsMessages, 'app.loading': 'Chargement...', 'assistant.displayName': 'Assistant musical K.G.Studio', - 'assistant.welcomeFallback': 'Bienvenue dans l’assistant musical K.G.Studio.', + 'assistant.welcomeFallback': 'Bienvenue dans l\'assistant musical K.G.Studio.', + 'chatbox.todo.title': 'Liste des tâches', + 'chatbox.todo.ariaLabel': 'Liste des tâches de l\'agent', + 'chatbox.todo.count': '{completed}/{total} terminée(s)', + 'chatbox.todo.active': 'En cours : {task}', 'mainContent.createTrack': 'Créer une piste', 'mainContent.showGlobalTracks': 'Afficher les pistes globales', - 'status.chordGuideCandidate': 'Suggestion du guide d’accords : {name} - {notes} - {note}', + 'status.chordGuideCandidate': 'Suggestion du guide d\'accords : {name} - {notes} - {note}', 'settings.sidebar.title': 'Réglages', 'settings.sidebar.close': 'Fermer les réglages', 'settings.sidebar.general': 'Général', 'settings.sidebar.audioIo': 'Entrées/Sorties audio', 'settings.sidebar.behavior': 'Comportement', 'settings.sidebar.templates': 'Modèles', - 'settings.sidebar.chordGuide': 'Guide d’accords', + 'settings.sidebar.chordGuide': 'Guide d\'accords', 'settings.general.title': 'Général', 'settings.general.language.label': 'Langue', 'settings.general.language.help': 'Le mode Auto utilise la langue du système.', @@ -45,17 +49,18 @@ export const frFrMessages: TranslationMessages = { 'settings.general.uvr5.downloadUrl': 'URL de téléchargement UVR-MDX-NET-Inst_HQ_3', 'settings.general.htdemucs.downloadUrl': 'URL de téléchargement htdemucs_4s', 'settings.general.modelUrl.help': 'Modifier cette URL peut empêcher le téléchargement ou pointer vers un fichier modèle incompatible.', + 'settings.general.openai.section': 'OpenAI', 'settings.general.openai.key': 'Clé', 'settings.general.openai.keyPlaceholder': 'Saisissez votre clé API OpenAI', 'settings.general.openai.model': 'Modèle', 'settings.general.openai.flexMode': 'Mode Flex', - 'settings.general.openai.flexHelp': 'Le mode Flex utilise le palier de service flexible d’OpenAI. Avantages : économies possibles et meilleur débit pendant les périodes chargées. Inconvénients : latence variable, mise en file d’attente ou baisse de priorité possibles. S’applique uniquement au fournisseur OpenAI ; sans effet pour les serveurs compatibles OpenAI.', + 'settings.general.openai.flexHelp': 'Le mode Flex utilise le palier de service flexible d\'OpenAI. Avantages : économies possibles et meilleur débit pendant les périodes chargées. Inconvénients : latence variable, mise en file d\'attente ou baisse de priorité possibles. S\'applique uniquement au fournisseur OpenAI ; sans effet pour les serveurs compatibles OpenAI.', 'settings.general.keys.persisted': 'Les clés sont conservées localement (IndexedDB du navigateur).', 'settings.general.keys.sessionOnly': 'Par sécurité, les clés ne sont pas conservées sur les hôtes non locaux et restent uniquement en mémoire pour cette session.', 'settings.general.claudeOpenRouter.section': 'Anthropic Claude (via OpenRouter)', 'settings.general.claudeOpenRouter.keyPlaceholder': 'Saisissez votre clé API Claude', 'settings.general.baseUrl': 'URL de base', - 'settings.general.claudeOpenRouter.baseUrlHelp': 'Il s’agit de l’URL de base de l’API OpenRouter. Ne la modifiez pas sauf si vous savez précisément ce que vous faites.', + 'settings.general.claudeOpenRouter.baseUrlHelp': 'Il s\'agit de l\'URL de base de l\'API OpenRouter. Ne la modifiez pas sauf si vous savez précisément ce que vous faites.', 'settings.general.openaiCompatible.section': 'Serveur compatible OpenAI', 'settings.general.openaiCompatible.keyPlaceholder': 'Saisissez votre clé API', 'settings.general.openaiCompatible.baseUrlPlaceholder': 'ex. https://openrouter.ai/api/v1', @@ -67,75 +72,75 @@ export const frFrMessages: TranslationMessages = { 'settings.general.soundfont.baseUrlHelp': 'Une source de soundfont incompatible peut provoquer des timbres incorrects ou empêcher certains instruments de jouer.', 'settings.general.kgone.section': 'Réglages K.G.One', 'settings.general.kgone.managed': 'La configuration K.G.One est gérée par le serveur (kgone-server.json). Ces réglages sont en lecture seule.', - 'settings.general.kgone.enabled': 'Activer l’intégration K.G.One', + 'settings.general.kgone.enabled': 'Activer l\'intégration K.G.One', 'settings.general.kgone.disabled': 'Désactivé', 'settings.general.kgone.enabledOption': 'Activé', 'settings.general.kgone.serverBaseUrl': 'URL de base du serveur', - 'settings.general.kgone.serverBaseUrlHelp': 'URL de base d’un serveur K.G.One Music Studio en cours d’exécution. Utilisée pour la génération de morceau complet, de clip et la séparation de stems.', + 'settings.general.kgone.serverBaseUrlHelp': 'URL de base d\'un serveur K.G.One Music Studio en cours d\'exécution. Utilisée pour la génération de morceau complet, de clip et la séparation de stems.', 'settings.audioIo.title': 'Entrées/Sorties audio', 'settings.audioIo.deviceRouting': 'Routage des appareils', 'settings.audioIo.refresh': 'Rafraîchir la liste des appareils', 'settings.audioIo.refreshing': 'Rafraîchissement…', - 'settings.audioIo.description': 'Choisissez les appareils que KGStudio doit utiliser pour l’enregistrement et la lecture. Les changements d’entrée s’appliquent à la prochaine session d’enregistrement. Les changements de sortie demandent un rechargement de la page.', - 'settings.audioIo.inputDevice': 'Appareil d’entrée audio', + 'settings.audioIo.description': 'Choisissez les appareils que KGStudio doit utiliser pour l\'enregistrement et la lecture. Les changements d\'entrée s\'appliquent à la prochaine session d\'enregistrement. Les changements de sortie demandent un rechargement de la page.', + 'settings.audioIo.inputDevice': 'Appareil d\'entrée audio', 'settings.audioIo.outputDevice': 'Appareil de sortie audio', - 'settings.audioIo.inputHelp': 'Les changements s’appliquent au prochain enregistrement audio. Si l’appareil choisi est retiré, KGStudio reviendra à l’appareil système par défaut.', - 'settings.audioIo.outputHelp': 'Les changements de sortie demandent un rechargement de la page. La prise en charge du routage vers une sortie non par défaut est limitée dans les navigateurs, donc KGStudio continuera à utiliser la sortie système par défaut lorsqu’elle n’est pas prise en charge.', - 'settings.audioIo.outputSinkUnsupported': 'Ce navigateur n’expose pas de bascule fiable en direct de la sortie Web Audio. La sélection d’une sortie non par défaut reste un effort au mieux et peut finalement rester sur la sortie système par défaut.', - 'settings.audioIo.chooseOutputDevice': 'Choisir l’appareil de sortie…', + 'settings.audioIo.inputHelp': 'Les changements s\'appliquent au prochain enregistrement audio. Si l\'appareil choisi est retiré, KGStudio reviendra à l\'appareil système par défaut.', + 'settings.audioIo.outputHelp': 'Les changements de sortie demandent un rechargement de la page. La prise en charge du routage vers une sortie non par défaut est limitée dans les navigateurs, donc KGStudio continuera à utiliser la sortie système par défaut lorsqu\'elle n\'est pas prise en charge.', + 'settings.audioIo.outputSinkUnsupported': 'Ce navigateur n\'expose pas de bascule fiable en direct de la sortie Web Audio. La sélection d\'une sortie non par défaut reste un effort au mieux et peut finalement rester sur la sortie système par défaut.', + 'settings.audioIo.chooseOutputDevice': 'Choisir l\'appareil de sortie…', 'settings.audioIo.previousSelectedInput': 'Entrée précédemment sélectionnée (autorisation requise pour vérification)', 'settings.audioIo.previousSelectedOutput': 'Sortie précédemment sélectionnée (autorisation requise pour vérification)', - 'settings.audioIo.status.inputUnavailable': 'L’appareil d’entrée audio précédemment sélectionné n’est pas disponible ; utilisation de l’appareil système par défaut.', - 'settings.audioIo.status.outputUnavailable': 'L’appareil de sortie audio précédemment sélectionné n’est pas disponible ; utilisation de l’appareil système par défaut.', + 'settings.audioIo.status.inputUnavailable': 'L\'appareil d\'entrée audio précédemment sélectionné n\'est pas disponible ; utilisation de l\'appareil système par défaut.', + 'settings.audioIo.status.outputUnavailable': 'L\'appareil de sortie audio précédemment sélectionné n\'est pas disponible ; utilisation de l\'appareil système par défaut.', 'settings.audioIo.status.refreshed': 'La liste des appareils audio a été rafraîchie.', 'settings.audioIo.status.readFailed': 'Impossible de lire les appareils audio depuis le navigateur.', - 'settings.audioIo.status.inputDefaultNextSession': 'L’entrée audio utilisera l’appareil système par défaut lors de la prochaine session d’enregistrement.', - 'settings.audioIo.status.inputChangedNextSession': 'L’entrée audio changera lors de la prochaine session d’enregistrement.', - 'settings.audioIo.status.outputDefaultAfterRefresh': 'La sortie audio utilisera l’appareil système par défaut après rechargement.', - 'settings.audioIo.status.outputSavedRefreshRequired': 'L’appareil de sortie audio a été enregistré. Rechargez la page pour l’appliquer.', - 'settings.audioIo.status.outputPromptUnsupported': 'Ce navigateur ne prend pas en charge l’invite de sélection d’un appareil de sortie audio.', - 'settings.audioIo.status.outputSelectedRefreshRequired': 'Appareil de sortie sélectionné. Rechargez la page pour l’appliquer.', - 'settings.audioIo.status.outputSelectionDenied': 'Le navigateur n’a pas autorisé la sélection d’une sortie non par défaut.', + 'settings.audioIo.status.inputDefaultNextSession': 'L\'entrée audio utilisera l\'appareil système par défaut lors de la prochaine session d\'enregistrement.', + 'settings.audioIo.status.inputChangedNextSession': 'L\'entrée audio changera lors de la prochaine session d\'enregistrement.', + 'settings.audioIo.status.outputDefaultAfterRefresh': 'La sortie audio utilisera l\'appareil système par défaut après rechargement.', + 'settings.audioIo.status.outputSavedRefreshRequired': 'L\'appareil de sortie audio a été enregistré. Rechargez la page pour l\'appliquer.', + 'settings.audioIo.status.outputPromptUnsupported': 'Ce navigateur ne prend pas en charge l\'invite de sélection d\'un appareil de sortie audio.', + 'settings.audioIo.status.outputSelectedRefreshRequired': 'Appareil de sortie sélectionné. Rechargez la page pour l\'appliquer.', + 'settings.audioIo.status.outputSelectionDenied': 'Le navigateur n\'a pas autorisé la sélection d\'une sortie non par défaut.', 'settings.behavior.title': 'Comportement', 'settings.behavior.editor': 'Éditeur', 'settings.behavior.playheadUpdateFrequency': 'Fréquence de mise à jour de la tête de lecture (fps)', - 'settings.behavior.playheadUpdateFrequencyHelp': 'Fréquence de mise à jour de l’animation de la tête de lecture pendant la lecture. Des valeurs plus élevées (60 fps) donnent une animation plus fluide mais utilisent plus de CPU. Des valeurs plus faibles (10 fps) sont plus efficaces. Les changements s’appliquent immédiatement sans redémarrage.', + 'settings.behavior.playheadUpdateFrequencyHelp': 'Fréquence de mise à jour de l\'animation de la tête de lecture pendant la lecture. Des valeurs plus élevées (60 fps) donnent une animation plus fluide mais utilisent plus de CPU. Des valeurs plus faibles (10 fps) sont plus efficaces. Les changements s\'appliquent immédiatement sans redémarrage.', 'settings.behavior.spectrogramHeightResolution': 'Résolution verticale du spectrogramme', 'settings.behavior.spectrogramHeightResolutionHelp': 'Contrôle le niveau de détail vertical du spectrogramme sur la plage de hauteurs visible. Des valeurs plus élevées accentuent les contours de hauteur mais consomment davantage de CPU et de mémoire lors du calcul du spectrogramme.', 'settings.behavior.chatBox': 'Boîte de discussion', 'settings.behavior.openAtStartup': 'Ouvrir au démarrage', 'settings.behavior.audio': 'Audio', - 'settings.behavior.lookaheadTime': 'Temps d’anticipation (ms)', - 'settings.behavior.lookaheadTimeHelp': 'Temps d’anticipation de planification audio (0-500 ms). Des valeurs plus faibles (10-20 ms) réduisent la latence d’entrée MIDI mais peuvent provoquer des glitches audio sur les systèmes plus lents. Des valeurs plus élevées (100 ms et plus) améliorent la stabilité de lecture. Les changements s’appliquent immédiatement sans redémarrage.', + 'settings.behavior.lookaheadTime': 'Temps d\'anticipation (ms)', + 'settings.behavior.lookaheadTimeHelp': 'Temps d\'anticipation de planification audio (0-500 ms). Des valeurs plus faibles (10-20 ms) réduisent la latence d\'entrée MIDI mais peuvent provoquer des glitches audio sur les systèmes plus lents. Des valeurs plus élevées (100 ms et plus) améliorent la stabilité de lecture. Les changements s\'appliquent immédiatement sans redémarrage.', 'settings.behavior.playbackDelay': 'Délai de lecture (ms)', - 'settings.behavior.playbackDelayHelp': 'La lecture démarrera avec un léger délai après avoir appuyé sur le bouton de démarrage (0-500 ms). Augmenter cette valeur peut aider à stabiliser la lecture, surtout pendant les premiers ticks si la valeur d’anticipation est trop faible. Les changements s’appliquent immédiatement sans redémarrage.', - 'settings.behavior.midiAutomationInterpolation': 'Interpolation de l’automation MIDI', + 'settings.behavior.playbackDelayHelp': 'La lecture démarrera avec un léger délai après avoir appuyé sur le bouton de démarrage (0-500 ms). Augmenter cette valeur peut aider à stabiliser la lecture, surtout pendant les premiers ticks si la valeur d\'anticipation est trop faible. Les changements s\'appliquent immédiatement sans redémarrage.', + 'settings.behavior.midiAutomationInterpolation': 'Interpolation de l\'automation MIDI', 'settings.behavior.midiAutomationInterpolation.low': 'Économie (20 ms)', 'settings.behavior.midiAutomationInterpolation.balanced': 'Équilibré (10 ms)', 'settings.behavior.midiAutomationInterpolation.high': 'Haute qualité (5 ms)', - 'settings.behavior.midiAutomationInterpolationHelp': 'Contrôle la densité de cuisson de l’automation MIDI pour la lecture et le bounce. Des intervalles plus courts sonnent plus fluides mais planifient davantage d’événements.', - 'settings.behavior.midiInputLatency': 'Latence d’entrée MIDI (ms)', - 'settings.behavior.midiInputLatencyHelp': 'Correction temporelle pour l’enregistrement MIDI (0-500 ms). Si les notes enregistrées apparaissent légèrement en retard par rapport à ce que vous vouliez jouer, augmentez cette valeur pour l’aligner sur la latence d’entrée de votre appareil MIDI. La position de chaque note est reculée de cette valeur lors de la validation.', + 'settings.behavior.midiAutomationInterpolationHelp': 'Contrôle la densité de cuisson de l\'automation MIDI pour la lecture et le bounce. Des intervalles plus courts sonnent plus fluides mais planifient davantage d\'événements.', + 'settings.behavior.midiInputLatency': 'Latence d\'entrée MIDI (ms)', + 'settings.behavior.midiInputLatencyHelp': 'Correction temporelle pour l\'enregistrement MIDI (0-500 ms). Si les notes enregistrées apparaissent légèrement en retard par rapport à ce que vous vouliez jouer, augmentez cette valeur pour l\'aligner sur la latence d\'entrée de votre appareil MIDI. La position de chaque note est reculée de cette valeur lors de la validation.', 'settings.behavior.bounceStartsFromBeat1': 'Le bounce démarre au temps 1', 'settings.behavior.bounceStartsFromBeat1Help': 'Oui inclut le silence initial entre le début du morceau et la première région rendue lors du bounce WAV/MP3. Non supprime ce silence initial et démarre le bounce à la première note rendue ou à la première région audio.', - 'settings.behavior.captureAudioForScreenSharing': 'Capturer l’audio pour le partage d’écran', - 'settings.behavior.captureAudioForScreenSharingHelp': 'Redémarrez KGStudio (rechargez la page) pour appliquer ce réglage. Activez cette option lorsque l’audio de KGStudio ne peut pas être capturé pendant le partage d’écran dans les appels vidéo (ex. Zoom, Teams). Cela crée un flux audio supplémentaire que les applications de capture d’écran peuvent détecter.', - 'settings.behavior.captureAudioForScreenSharingWarning': 'Lorsque vous partagez l’écran dans Zoom, vérifiez bien que l’option "Share Sound" est activée.', - 'settings.behavior.validation.lookahead.invalidNumber': 'Le temps d’anticipation doit être un nombre valide', - 'settings.behavior.validation.lookahead.range': 'Le temps d’anticipation doit être compris entre 0 et 0,5 seconde (0-500 ms)', + 'settings.behavior.captureAudioForScreenSharing': 'Capturer l\'audio pour le partage d\'écran', + 'settings.behavior.captureAudioForScreenSharingHelp': 'Redémarrez KGStudio (rechargez la page) pour appliquer ce réglage. Activez cette option lorsque l\'audio de KGStudio ne peut pas être capturé pendant le partage d\'écran dans les appels vidéo (ex. Zoom, Teams). Cela crée un flux audio supplémentaire que les applications de capture d\'écran peuvent détecter.', + 'settings.behavior.captureAudioForScreenSharingWarning': 'Lorsque vous partagez l\'écran dans Zoom, vérifiez bien que l\'option "Share Sound" est activée.', + 'settings.behavior.validation.lookahead.invalidNumber': 'Le temps d\'anticipation doit être un nombre valide', + 'settings.behavior.validation.lookahead.range': 'Le temps d\'anticipation doit être compris entre 0 et 0,5 seconde (0-500 ms)', 'settings.behavior.validation.playbackDelay.invalidNumber': 'Le délai de lecture doit être un nombre valide', 'settings.behavior.validation.playbackDelay.range': 'Le délai de lecture doit être compris entre 0 et 0,5 seconde (0-500 ms)', - 'settings.behavior.validation.recordingOffset.invalidNumber': 'La latence d’entrée MIDI doit être un nombre valide', - 'settings.behavior.validation.recordingOffset.range': 'La latence d’entrée MIDI doit être comprise entre 0 et 0,5 seconde (0-500 ms)', + 'settings.behavior.validation.recordingOffset.invalidNumber': 'La latence d\'entrée MIDI doit être un nombre valide', + 'settings.behavior.validation.recordingOffset.range': 'La latence d\'entrée MIDI doit être comprise entre 0 et 0,5 seconde (0-500 ms)', 'settings.templates.title': 'Modèles', 'settings.templates.customInstructions': 'Instructions personnalisées', - 'settings.templates.placeholder': 'Veuillez saisir vos instructions personnalisées pour l’assistant musical K.G.Studio', - 'settings.chordGuide.title': 'Guide d’accords', + 'settings.templates.placeholder': 'Veuillez saisir vos instructions personnalisées pour l\'assistant musical K.G.Studio', + 'settings.chordGuide.title': 'Guide d\'accords', 'settings.chordGuide.resetToDefault': 'Rétablir les valeurs par défaut', 'settings.chordGuide.group.major': 'Accords candidats majeurs', 'settings.chordGuide.group.minor': 'Accords candidats mineurs', - 'settings.chordGuide.help.major': 'Saisissez des accords relatifs à Do majeur. L’application les transposera automatiquement pour les autres armures majeures.', - 'settings.chordGuide.help.minor': 'Saisissez des accords relatifs à La mineur. L’application les transposera automatiquement pour les autres armures mineures.', + 'settings.chordGuide.help.major': 'Saisissez des accords relatifs à Do majeur. L\'application les transposera automatiquement pour les autres armures majeures.', + 'settings.chordGuide.help.minor': 'Saisissez des accords relatifs à La mineur. L\'application les transposera automatiquement pour les autres armures mineures.', 'settings.chordGuide.functionsAria': 'Fonctions pour {group}', 'settings.chordGuide.addTitle': 'Ajouter un accord à {group}', 'settings.chordGuide.deleteSelectedRows': 'Supprimer les lignes sélectionnées', @@ -143,25 +148,26 @@ export const frFrMessages: TranslationMessages = { 'settings.chordGuide.table.notes': 'Notes', 'settings.chordGuide.table.source': 'Source', 'settings.chordGuide.table.note': 'Note', - 'settings.chordGuide.loadError': 'Impossible de charger les réglages du guide d’accords.', - 'settings.chordGuide.invalidChordSymbol': 'Veuillez saisir un symbole d’accord valide. Exemple : Bm7b5', - 'settings.chordGuide.unsupportedChordSymbol': 'Impossible de déduire les notes pour cet accord. Veuillez utiliser un symbole d’accord pris en charge.', + 'settings.chordGuide.loadError': 'Impossible de charger les réglages du guide d\'accords.', + 'settings.chordGuide.invalidChordSymbol': 'Veuillez saisir un symbole d\'accord valide. Exemple : Bm7b5', + 'settings.chordGuide.unsupportedChordSymbol': 'Impossible de déduire les notes pour cet accord. Veuillez utiliser un symbole d\'accord pris en charge.', 'dialog.title.notice': 'Information', 'dialog.title.timeSignature': 'Chiffrage de mesure', 'dialog.title.tempoDetection': 'Détection du tempo', 'dialog.title.applyTempo': 'Appliquer le tempo', - 'dialog.title.chordDetection': 'Détection d’accords', + 'dialog.title.chordDetection': 'Détection d\'accords', 'dialog.title.input': 'Saisie', 'dialog.title.confirm': 'Confirmation', 'dialog.close': 'Fermer la boîte de dialogue', 'dialog.cancel': 'Annuler', + 'dialog.ok': 'OK', 'dialog.experimentalFeature': 'Fonction expérimentale', 'dialog.recommendedSource': 'Source recommandée', - 'dialog.chordHint.audio': 'L’analyse d’accords reste expérimentale. Le contenu harmonique, la densité de l’arrangement et les matériaux riches en transitoires peuvent affecter la précision. Pour de meilleurs résultats, commencez avec les réglages par défaut puis affinez la sensibilité et la stabilité jusqu’à ce que l’harmonie détectée corresponde à la phrase musicale.', - 'dialog.chordHint.midi': 'L’analyse d’accords reste expérimentale. La densité des voicings, les chevauchements et les notes d’ornement peuvent influencer le résultat. Pour des étiquettes d’accord plus fiables, partez des réglages par défaut puis ajustez la suppression des notes courtes et le focus harmonique selon le rôle musical du passage.', - 'dialog.chordHint.tempo': 'L’analyse du tempo reste expérimentale. Le rubato, les transitoires clairsemées et les couches de percussions peuvent réduire la précision. Commencez avec la plage de BPM par défaut, puis resserrez la fenêtre d’analyse vers la zone de tempo la plus plausible si le premier résultat n’est pas convaincant musicalement.', - 'dialog.sourceHint.kgone': 'Pour des étiquettes d’accord plus fiables, analysez de préférence un stem où les voix et les percussions ont été atténuées ou retirées. Si l’intégration du serveur K.G.One Music Studio est disponible, lancez Separator avec le modèle "Vocal, Drums, Bass, Guitar, Piano, and Others" et utilisez de préférence le stem Piano ou Others.', - 'dialog.sourceHint.local': 'Pour des étiquettes d’accord plus fiables, analysez de préférence un stem où les voix et les percussions ont été atténuées ou retirées. Si vous utilisez le séparateur local, choisissez le modèle "Vocal, Drums, Bass, and Others" et analysez le stem Others.', + 'dialog.chordHint.audio': 'L\'analyse d\'accords reste expérimentale. Le contenu harmonique, la densité de l\'arrangement et les matériaux riches en transitoires peuvent affecter la précision. Pour de meilleurs résultats, commencez avec les réglages par défaut puis affinez la sensibilité et la stabilité jusqu\'à ce que l\'harmonie détectée corresponde à la phrase musicale.', + 'dialog.chordHint.midi': 'L\'analyse d\'accords reste expérimentale. La densité des voicings, les chevauchements et les notes d\'ornement peuvent influencer le résultat. Pour des étiquettes d\'accord plus fiables, partez des réglages par défaut puis ajustez la suppression des notes courtes et le focus harmonique selon le rôle musical du passage.', + 'dialog.chordHint.tempo': 'L\'analyse du tempo reste expérimentale. Le rubato, les transitoires clairsemées et les couches de percussions peuvent réduire la précision. Commencez avec la plage de BPM par défaut, puis resserrez la fenêtre d\'analyse vers la zone de tempo la plus plausible si le premier résultat n\'est pas convaincant musicalement.', + 'dialog.sourceHint.kgone': 'Pour des étiquettes d\'accord plus fiables, analysez de préférence un stem où les voix et les percussions ont été atténuées ou retirées. Si l\'intégration du serveur K.G.One Music Studio est disponible, lancez Separator avec le modèle "Vocal, Drums, Bass, Guitar, Piano, and Others" et utilisez de préférence le stem Piano ou Others.', + 'dialog.sourceHint.local': 'Pour des étiquettes d\'accord plus fiables, analysez de préférence un stem où les voix et les percussions ont été atténuées ou retirées. Si vous utilisez le séparateur local, choisissez le modèle "Vocal, Drums, Bass, and Others" et analysez le stem Others.', 'dialog.label.sensitivity': 'Sensibilité', 'dialog.label.stability': 'Stabilité', 'dialog.label.noChordThreshold': 'Seuil sans accord', @@ -176,25 +182,27 @@ export const frFrMessages: TranslationMessages = { 'dialog.label.minimumBpm': 'BPM minimum', 'dialog.label.maximumBpm': 'BPM maximum', 'dialog.label.autoAlignRegionToBeat': 'Aligner automatiquement la région sur le temps', - 'dialog.message.chordDetection': 'Ajustez les réglages de détection d’accords audio avant le traitement.', + 'dialog.message.chordDetection': 'Ajustez les réglages de détection d\'accords audio avant le traitement.', 'dialog.message.tempoDetection': 'Ajustez les réglages de détection du tempo audio avant le traitement.', - 'dialog.message.tempoApply': 'Tempo détecté : {bpm} BPM. Choisissez comment l’appliquer.\n\nMettre à jour le tempo courant modifie le tempo actif à l’emplacement de ce clip. Insérer un changement de tempo ajoute une nouvelle région de tempo à la mesure la plus proche avant le début du clip.', + 'dialog.message.tempoApply': 'Tempo détecté : {bpm} BPM. Choisissez comment l\'appliquer.\n\nMettre à jour le tempo courant modifie le tempo actif à l\'emplacement de ce clip. Insérer un changement de tempo ajoute une nouvelle région de tempo à la mesure la plus proche avant le début du clip.', 'dialog.action.updateCurrentTempo': 'Mettre à jour le tempo courant', 'dialog.action.insertTempoChange': 'Insérer un changement de tempo', 'eventList.title': 'Liste des événements', - 'eventList.scopeTabs': 'Portées de la liste d’événements', + 'eventList.scopeTabs': 'Portées de la liste d\'événements', 'eventList.scope.region': 'Région', 'eventList.scope.track': 'Piste', 'eventList.scope.global': 'Global', 'eventList.deleteVisibleSelectedRows': 'Supprimer les lignes visibles sélectionnées', 'eventList.table.position': 'Position', 'eventList.table.status': 'État', + 'eventList.table.num': 'N°', + 'eventList.table.val': 'Val.', 'eventList.table.lengthInfo': 'Durée/Infos', 'eventList.region.filters': 'Filtres des événements de région', 'eventList.region.filter.notes': 'Notes', 'eventList.region.filter.pitchBends': 'Pitch bends', 'eventList.region.filter.controller': 'Contrôleurs', - 'eventList.region.empty': 'Sélectionnez une région MIDI, ou ouvrez-en une dans le Piano Roll, pour afficher sa liste d’événements.', + 'eventList.region.empty': 'Sélectionnez une région MIDI, ou ouvrez-en une dans le Piano Roll, pour afficher sa liste d\'événements.', 'eventList.region.add.label': 'Ajouter', 'eventList.region.add.noteTitle': 'Ajouter une note à la tête de lecture', 'eventList.region.add.pitchBendTitle': 'Ajouter un pitch bend à la tête de lecture', @@ -202,15 +210,21 @@ export const frFrMessages: TranslationMessages = { 'eventList.region.addType.note': 'Note', 'eventList.region.addType.pitchBend': 'Pitch bend', 'eventList.region.addType.controller': 'Contrôleur', + 'eventList.region.status.note': 'Note', + 'eventList.region.status.pitchBend': 'Pitch bend', + 'eventList.region.status.controller': 'Contrôleur', 'eventList.track.filters': 'Modes de la liste de piste', 'eventList.track.filter.regions': 'Régions', 'eventList.track.filter.volume': 'Volume', 'eventList.track.filter.pan': 'Panoramique', - 'eventList.track.empty': 'Sélectionnez une piste pour afficher les régions et l’automation de piste.', + 'eventList.track.empty': 'Sélectionnez une piste pour afficher les régions et l\'automation de piste.', + 'eventList.track.add.label': 'Ajouter', 'eventList.track.add.midiRegionTitle': 'Ajouter une région MIDI à la tête de lecture', - 'eventList.track.add.volumeTitle': 'Ajouter un point d’automation de volume à la tête de lecture', - 'eventList.track.add.panTitle': 'Ajouter un point d’automation de panoramique à la tête de lecture', + 'eventList.track.add.volumeTitle': 'Ajouter un point d\'automation de volume à la tête de lecture', + 'eventList.track.add.panTitle': 'Ajouter un point d\'automation de panoramique à la tête de lecture', 'eventList.track.addType.midiRegion': 'Région MIDI', + 'eventList.track.status.audio': 'Audio', + 'eventList.track.status.midi': 'MIDI', 'eventList.track.status.volume': 'Volume', 'eventList.track.status.pan': 'Panoramique', 'eventList.global.filters': 'Filtres des événements globaux', @@ -218,10 +232,11 @@ export const frFrMessages: TranslationMessages = { 'eventList.global.filter.tempo': 'Tempo', 'eventList.global.filter.keySignature': 'Armure', 'eventList.global.filter.chord': 'Accord', + 'eventList.global.add.label': 'Ajouter', 'eventList.global.add.markerTitle': 'Ajouter une région de repère à la tête de lecture', 'eventList.global.add.tempoTitle': 'Ajouter une région de tempo à la tête de lecture', - 'eventList.global.add.keySignatureTitle': 'Ajouter une région d’armure à la tête de lecture', - 'eventList.global.add.chordTitle': 'Ajouter une région d’accord à la tête de lecture', + 'eventList.global.add.keySignatureTitle': 'Ajouter une région d\'armure à la tête de lecture', + 'eventList.global.add.chordTitle': 'Ajouter une région d\'accord à la tête de lecture', 'eventList.global.addType.marker': 'Repère', 'eventList.global.addType.tempo': 'Tempo', 'eventList.global.addType.keySignature': 'Armure', @@ -231,29 +246,42 @@ export const frFrMessages: TranslationMessages = { 'eventList.global.status.chord': 'Accord', 'eventList.global.validation.marker': 'Veuillez saisir un libellé de repère. Un texte non vide est attendu. Exemple : Intro', 'eventList.global.validation.tempo': 'Veuillez saisir une valeur BPM en chiffres uniquement. Un entier entre {min} et {max} est attendu. Exemple : 128', - 'eventList.global.validation.keySignature': 'Veuillez saisir un nom d’armure exact. Une valeur canonique telle que "Do majeur" ou "Fa# mineur" est attendue. Exemple : Fa# mineur', - 'eventList.global.validation.chord': 'Veuillez saisir un symbole d’accord valide. Une écriture d’accord que l’application peut analyser est attendue. Exemple : Bm7b5', + 'eventList.global.validation.keySignature': 'Veuillez saisir un nom d\'armure exact. Une valeur canonique telle que "Do majeur" ou "Fa# mineur" est attendue. Exemple : Fa# mineur', + 'eventList.global.validation.chord': 'Veuillez saisir un symbole d\'accord valide. Une écriture d\'accord que l\'application peut analyser est attendue. Exemple : Bm7b5', 'eventList.global.validation.position': 'Veuillez saisir une position au début du projet ou après. Une position non négative est attendue. Exemple : 1 1 0', 'eventList.global.validation.length': 'Veuillez saisir une durée positive. Une valeur supérieure à zéro est attendue. Exemple : 4 0', 'globalTracks.label': 'Pistes globales', 'globalTracks.marker': 'Repère', + 'globalTracks.tempo': 'Tempo', 'globalTracks.signature': 'Armure', 'globalTracks.chord': 'Accord', 'globalTracks.addItem': 'Ajouter un élément global {label}', 'pianoRoll.power.sqrtDefault': '√ (par défaut)', - 'pianoRoll.chordGuide.off': 'Guide d’accords désactivé', - 'pianoRoll.chordGuide.tonic': 'Guide d’accords tonique', - 'pianoRoll.chordGuide.subdominant': 'Guide d’accords sous-dominante', - 'pianoRoll.chordGuide.dominant': 'Guide d’accords dominante', + 'pianoRoll.chordGuide.off': 'Guide d\'accords désactivé', + 'pianoRoll.chordGuide.tonic': 'Guide d\'accords tonique', + 'pianoRoll.chordGuide.subdominant': 'Guide d\'accords sous-dominante', + 'pianoRoll.chordGuide.dominant': 'Guide d\'accords dominante', 'pianoRoll.spectrogramView': 'Vue spectrogramme', 'pianoRoll.sheetMusicView': 'Vue partition', 'pianoRoll.pointerTool': 'Outil pointeur', 'pianoRoll.pencilTool': 'Outil crayon', - 'pianoRoll.toggleAutomationLane': 'Afficher/masquer la voie d’automation', + 'pianoRoll.toggleAutomationLane': 'Afficher/masquer la voie d\'automation', 'pianoRoll.automation': 'Automation', - 'pianoRoll.automationLane': 'Voie d’automation {label}', + 'pianoRoll.automationLane': 'Voie d\'automation {label}', 'pianoRoll.automationType.pitchBend': 'Pitch bend', - 'pianoRoll.chordGuide': 'Guide d’accords', + 'pianoRoll.mode': 'Mode', + 'pianoRoll.modeOption.ionian': 'Ionien', + 'pianoRoll.modeOption.dorian': 'Dorien', + 'pianoRoll.modeOption.phrygian': 'Phrygien', + 'pianoRoll.modeOption.lydian': 'Lydien', + 'pianoRoll.modeOption.mixolydian': 'Mixolydien', + 'pianoRoll.modeOption.aeolian': 'Éolien', + 'pianoRoll.modeOption.locrian': 'Locrien', + 'pianoRoll.modeOption.harmonic_minor': 'Mineur harmonique', + 'pianoRoll.modeOption.melodic_minor': 'Mineur mélodique', + 'pianoRoll.modeOption.phrygian_dominant': 'Phrygien dominant', + 'pianoRoll.modeOption.harmonic_major': 'Majeur harmonique', + 'pianoRoll.chordGuide': 'Guide d\'accords', 'pianoRoll.sheetQuantization': 'Quantif. partition', 'pianoRoll.snap': 'Snap', 'pianoRoll.snap.none': 'SANS SNAP', @@ -262,21 +290,25 @@ export const frFrMessages: TranslationMessages = { 'pianoRoll.floor': 'Plancher', 'pianoRoll.curve': 'Courbe', 'pianoRoll.zoom': 'Zoom', - 'pianoRoll.moreOptions': 'Plus d’options', + 'pianoRoll.moreOptions': 'Plus d\'options', 'pianoRoll.showActiveRegionOnly': 'Afficher seulement la région active', 'pianoRoll.showEntireTrack': 'Afficher toute la piste', 'pianoRoll.detectChords': 'Détecter les accords...', 'pianoRoll.detectingChords': 'Détection des accords...', 'pianoRoll.detectTempo': 'Détecter le tempo...', 'pianoRoll.detectingTempo': 'Détection du tempo...', + 'toolbar.export.kgstudio': 'Exporter au format KGStudio', + 'toolbar.export.midi': 'Exporter au format MIDI', + 'toolbar.export.wav': 'Exporter en WAV', + 'toolbar.export.mp3': 'Exporter en MP3', 'toolbar.projectName.prompt': 'Saisissez le nom du projet :', 'toolbar.projectName.invalid': 'Nom de projet invalide. Seules les lettres, les chiffres, les espaces, les tirets, les underscores, les points et les parenthèses sont autorisés.', 'toolbar.projectName.reserved': '"{name}" est un nom de projet réservé. Choisissez-en un autre.', - 'toolbar.projectName.overwrite': 'Le projet "{name}" existe déjà. Voulez-vous l’écraser ?', - 'toolbar.projectName.renameOrCopy': 'Souhaitez-vous renommer ce projet ou l’enregistrer comme nouvelle copie ?', + 'toolbar.projectName.overwrite': 'Le projet "{name}" existe déjà. Voulez-vous l\'écraser ?', + 'toolbar.projectName.renameOrCopy': 'Souhaitez-vous renommer ce projet ou l\'enregistrer comme nouvelle copie ?', 'toolbar.projectName.saveAsCopy': 'Enregistrer comme copie', 'toolbar.projectName.rename': 'Renommer', - 'toolbar.save.error': 'Une erreur est survenue lors de l’enregistrement : {error}', + 'toolbar.save.error': 'Une erreur est survenue lors de l\'enregistrement : {error}', 'toolbar.load.error': 'Une erreur est survenue lors du chargement du projet : {error}', 'toolbar.newProject.confirm': 'Créer un nouveau projet ? Toutes les modifications non enregistrées seront perdues.', 'toolbar.project.notFound': 'Projet "{name}" introuvable.', @@ -285,25 +317,25 @@ export const frFrMessages: TranslationMessages = { 'toolbar.status.newProjectCreated': 'Nouveau projet "{name}" créé', 'toolbar.status.projectLoaded': '{description} chargé avec succès', 'toolbar.status.projectExportedKgstudio': 'Projet "{name}" exporté au format KGStudio', - 'toolbar.status.exportProjectError': 'Erreur lors de l’export du projet : {error}', - 'toolbar.export.failedProject': 'Échec de l’export du projet : {error}', + 'toolbar.status.exportProjectError': 'Erreur lors de l\'export du projet : {error}', + 'toolbar.export.failedProject': 'Échec de l\'export du projet : {error}', 'toolbar.status.projectExportedMidi': 'Projet "{name}" exporté au format MIDI', - 'toolbar.status.exportMidiError': 'Erreur lors de l’export MIDI : {error}', - 'toolbar.export.failedMidi': 'Échec de l’export du projet en MIDI : {error}', + 'toolbar.status.exportMidiError': 'Erreur lors de l\'export MIDI : {error}', + 'toolbar.export.failedMidi': 'Échec de l\'export du projet en MIDI : {error}', 'toolbar.status.projectExportedWav': 'Projet "{name}" exporté en WAV', - 'toolbar.status.exportWavError': 'Erreur lors de l’export WAV : {error}', - 'toolbar.export.failedWav': 'Échec de l’export du projet en WAV : {error}', + 'toolbar.status.exportWavError': 'Erreur lors de l\'export WAV : {error}', + 'toolbar.export.failedWav': 'Échec de l\'export du projet en WAV : {error}', 'toolbar.status.projectExportedMp3': 'Projet "{name}" exporté en MP3', - 'toolbar.status.exportMp3Error': 'Erreur lors de l’export MP3 : {error}', - 'toolbar.export.failedMp3': 'Échec de l’export du projet en MP3 : {error}', - 'toolbar.status.importFailed': 'Échec de l’import du fichier : {error}', - 'toolbar.import.failedProjectFile': 'Échec de l’import du fichier projet : {error}', + 'toolbar.status.exportMp3Error': 'Erreur lors de l\'export MP3 : {error}', + 'toolbar.export.failedMp3': 'Échec de l\'export du projet en MP3 : {error}', + 'toolbar.status.importFailed': 'Échec de l\'import du fichier : {error}', + 'toolbar.import.failedProjectFile': 'Échec de l\'import du fichier projet : {error}', 'toolbar.import.corruptedKgstudio': 'Le fichier .kgstudio est corrompu ou invalide : {error}', 'toolbar.status.importingMidi': 'Import du fichier MIDI "{name}"...', - 'toolbar.status.failedImportMidi': 'Échec de l’import MIDI : {error}', + 'toolbar.status.failedImportMidi': 'Échec de l\'import MIDI : {error}', 'toolbar.status.playbackFailedStart': 'Impossible de démarrer la lecture', 'toolbar.status.recordingStoppedCommitted': 'Enregistrement arrêté, notes validées', - 'toolbar.status.failedStopPlayback': 'Impossible d’arrêter la lecture', + 'toolbar.status.failedStopPlayback': 'Impossible d\'arrêter la lecture', 'toolbar.maxBars.prompt': 'Saisissez le nouveau nombre maximal de mesures (>= {min}) :', 'toolbar.input.invalidNumber': 'Entrée invalide. Veuillez saisir un nombre valide.', 'toolbar.maxBars.invalid': 'Valeur invalide. Veuillez saisir un nombre >= {min}.', @@ -324,13 +356,14 @@ export const frFrMessages: TranslationMessages = { 'toolbar.redo.none': 'Rien à rétablir', 'toolbar.status.undid': 'Action annulée : {description}', 'toolbar.status.redid': 'Action rétablie : {description}', + 'toolbar.action': 'action', 'toolbar.status.chatToggled': 'Chat affiché/masqué', 'toolbar.status.settingsToggled': 'Réglages affichés/masqués', 'toolbar.pianoRoll.selectMidiRegion': 'Sélectionnez une région MIDI pour ouvrir le Piano Roll.', 'toolbar.status.recordingStopped': 'Enregistrement arrêté', 'toolbar.status.audioRecordingStarted': 'Enregistrement audio démarré...', - 'toolbar.recording.openMidiRegion': 'Ouvrez une région MIDI dans le Piano Roll avant de lancer l’enregistrement.', - 'toolbar.recording.selectMidiRegion': 'Sélectionnez une région MIDI avant de lancer l’enregistrement.', + 'toolbar.recording.openMidiRegion': 'Ouvrez une région MIDI dans le Piano Roll avant de lancer l\'enregistrement.', + 'toolbar.recording.selectMidiRegion': 'Sélectionnez une région MIDI avant de lancer l\'enregistrement.', 'toolbar.recording.noMidiDevice': 'Aucun périphérique MIDI détecté. Connectez un clavier MIDI puis réessayez.', 'toolbar.status.recordingStarted': 'Enregistrement démarré...', 'toolbar.button.new': 'Nouveau', @@ -352,25 +385,30 @@ export const frFrMessages: TranslationMessages = { 'toolbar.button.backToBeginning': 'Retour au début', 'toolbar.button.play': 'Lecture', 'toolbar.button.pause': 'Pause', - 'toolbar.button.stopRecording': 'Arrêter l’enregistrement', + 'toolbar.button.stopRecording': 'Arrêter l\'enregistrement', 'toolbar.button.record': 'Enregistrer', 'toolbar.button.loop': 'Boucle', 'toolbar.button.metronome': 'Métronome', 'toolbar.button.piano': 'Piano', 'toolbar.button.kgone': 'Générateur musical K.G.One', 'toolbar.button.chat': 'Chat', - 'toolbar.button.eventList': 'Éditeur de liste d’événements', + 'toolbar.button.eventList': 'Éditeur de liste d\'événements', 'track.controls.automationButton': 'Automation de piste', 'track.controls.automationDropdown': 'Automation', 'track.controls.automation.volume': 'Volume', 'track.controls.automation.pan': 'Panoramique', 'track.controls.settingsDropdown': 'Réglages', 'track.controls.settings.deleteTrack': 'Supprimer la piste', - 'toolbar.keySignatureChooser': 'Choisir l’armure, actuelle : {value}', + 'toolbar.keySignatureChooser': 'Choisir l\'armure, actuelle : {value}', 'toolbar.export.label': 'Exporter', 'toolbar.importProject.title': 'Importer un projet', 'toolbar.importProject.description': 'Glissez-déposez votre fichier projet ici', 'toolbar.openingProject': 'Ouverture du projet...', + 'fileImport.invalidType': 'Type de fichier invalide. Veuillez sélectionner un fichier avec l\'une de ces extensions : {extensions}', + 'fileImport.close': 'Fermer la fenêtre d\'import', + 'fileImport.supportedFormats': 'Formats pris en charge : {formats}', + 'fileImport.or': 'ou', + 'fileImport.browse': 'Parcourir les fichiers', 'instrument.group.PIANO_AND_KEYBOARDS': 'Pianos et claviers', 'instrument.group.GUITAR': 'Guitare', 'instrument.group.BASS': 'Basse', @@ -451,51 +489,68 @@ export const frFrMessages: TranslationMessages = { 'kgone.panel.title.server': 'Générateur musical K.G.One', 'kgone.panel.title.local': 'Générateur musical', 'kgone.tab.fullSong': 'Morceau complet', + 'kgone.tab.remix': 'Remix', + 'kgone.tab.repaint': 'Repaint', 'kgone.tab.separator': 'Séparateur', - 'kgone.tab.requiresServer': 'Nécessite l’intégration du serveur K.G.One Music Studio', + 'kgone.tab.requiresServer': 'Nécessite l\'intégration du serveur K.G.One Music Studio', 'kgone.shared.advancedSettings': 'Réglages avancés', 'kgone.shared.caption': 'Description', 'kgone.shared.lyrics': 'Paroles', + 'kgone.shared.lyricsPlaceholder': '[Verse 1]\nVos paroles ici...\n\n[Chorus]\n...', 'kgone.shared.instrumental': 'Instrumental (sans voix)', - 'kgone.shared.inferenceSteps': 'Étapes d’inférence', + 'kgone.shared.inferenceSteps': 'Étapes d\'inférence', 'kgone.shared.guidanceScale': 'Échelle de guidage', 'kgone.shared.useRandomSeed': 'Utiliser une seed aléatoire', 'kgone.shared.seed': 'Seed', 'kgone.shared.thinking': 'Réflexion (génération de métadonnées CoT)', 'kgone.shared.selectedRegion': 'Région sélectionnée', 'kgone.shared.track': 'Piste', + 'kgone.shared.poweredBy': 'Propulsé par ', 'kgone.shared.btn.loadingModel': 'Chargement du modèle...', 'kgone.shared.btn.generating': 'Génération...', 'kgone.shared.btn.processing': 'Traitement...', 'kgone.shared.btn.downloading': 'Téléchargement...', - 'kgone.shared.btn.preparingUpload': 'Préparation de l’envoi...', + 'kgone.shared.btn.preparingUpload': 'Préparation de l\'envoi...', 'kgone.shared.btn.importing': 'Import...', 'kgone.shared.hint.loadingModel': 'Chargement du modèle : cela peut prendre plus de 60 secondes, veuillez patienter...', 'kgone.shared.hint.submitting': 'Envoi de la demande de génération...', - 'kgone.shared.hint.downloadingAudio': 'Téléchargement de l’audio...', + 'kgone.shared.hint.downloadingAudio': 'Téléchargement de l\'audio...', 'kgone.clip.field.prompt': 'Prompt', - 'kgone.clip.field.promptHint': 'Décrivez le clip avec des tags séparés par des virgules : famille d’instrument, sous-type, timbre, effets, nombre de mesures, BPM, tonalité.', + 'kgone.clip.field.promptPlaceholder': 'ex. Gritty, Acid, Bassline, 303, Synth Lead, FM, Sub, Upper Mids, High Phaser, High Reverb, Pitch Bend, 8 Bars, 140 BPM, E minor', + 'kgone.clip.field.promptHint': 'Décrivez le clip avec des tags séparés par des virgules : famille d\'instrument, sous-type, timbre, effets, nombre de mesures, BPM, tonalité.', 'kgone.clip.field.negativePrompt': 'Prompt négatif', + 'kgone.clip.field.negativePromptPlaceholder': 'ex. distorsion, bruit', 'kgone.clip.field.bars': 'Mesures', + 'kgone.clip.field.bars4': '4 mesures', + 'kgone.clip.field.bars8': '8 mesures', 'kgone.clip.field.note': 'Note', 'kgone.clip.field.scale': 'Mode', 'kgone.clip.field.scaleMajor': 'Majeur', 'kgone.clip.field.scaleMinor': 'Mineur', + 'kgone.clip.field.bpm': 'BPM', 'kgone.clip.field.steps': 'Étapes', + 'kgone.clip.field.cfgScale': 'Échelle CFG', 'kgone.clip.field.seedLabel': 'Seed (-1 = aléatoire)', 'kgone.clip.field.samplerType': 'Type de sampler', + 'kgone.clip.field.sigmaMin': 'Sigma Min', + 'kgone.clip.field.sigmaMax': 'Sigma Max', + 'kgone.clip.field.cfgRescale': 'Remise à l\'échelle CFG', 'kgone.clip.hint.generating': 'Génération du clip...', - 'kgone.clip.hint.drag': 'Glissez le lecteur ci-dessus vers une piste pour importer le clip. Déposez-le sur une piste audio pour l’importer comme région WAV (recommandé), ou sur une piste MIDI pour l’importer comme région MIDI. Remarque : le MIDI est retranscrit depuis l’audio et peut ne pas être parfaitement exact.', + 'kgone.clip.hint.drag': 'Glissez le lecteur ci-dessus vers une piste pour importer le clip. Déposez-le sur une piste audio pour l\'importer comme région WAV (recommandé), ou sur une piste MIDI pour l\'importer comme région MIDI. Remarque : le MIDI est retranscrit depuis l\'audio et peut ne pas être parfaitement exact.', 'kgone.clip.btn.generate': 'Générer le clip', - 'kgone.fullSong.field.captionHint': 'Décrivez en langage naturel le style, l’ambiance, le tempo, l’instrumentation et la structure du morceau.', + 'kgone.clip.poweredBy': 'Foundation-1', + 'kgone.fullSong.field.captionPlaceholder': 'ex. Genre : eurodance, pop électronique des années 90, dynamique. Style : accrocheur, énergique... Tempo : ~130 BPM. Instrumentation : grosse caisse puissante, ligne de basse eurodance...', + 'kgone.fullSong.field.captionHint': 'Décrivez en langage naturel le style, l\'ambiance, le tempo, l\'instrumentation et la structure du morceau.', 'kgone.fullSong.field.lyricsHint': 'Utilisez les balises [Intro], [Verse], [Chorus], [Bridge] pour marquer les sections.', 'kgone.fullSong.hint.generating': 'Génération...', 'kgone.fullSong.hint.generatingProgress': 'Génération... {pct}% — {stage}', 'kgone.fullSong.hint.generatingProgressNoStage': 'Génération... {pct}%', - 'kgone.fullSong.hint.drag': 'Glissez le lecteur ci-dessus vers une piste audio pour importer le morceau. Le dépôt sur une piste MIDI n’est pas pris en charge pour la génération de morceau complet.', + 'kgone.fullSong.hint.drag': 'Glissez le lecteur ci-dessus vers une piste audio pour importer le morceau. Le dépôt sur une piste MIDI n\'est pas pris en charge pour la génération de morceau complet.', 'kgone.fullSong.btn.generate': 'Générer le morceau', - 'kgone.remix.field.captionHint': 'Décrivez le style, l’ambiance et l’instrumentation visés pour le remix.', - 'kgone.remix.field.lyricsHint': 'Laissez vide pour conserver les paroles d’origine, ou saisissez-en de nouvelles. Utilisez les balises [Verse], [Chorus], [Bridge].', + 'kgone.fullSong.poweredBy': 'ACE-Step 1.5', + 'kgone.remix.field.captionPlaceholder': 'ex. Genre : jazz, style : doux et mélodieux, instrumentation : piano, contrebasse, batterie brossée...', + 'kgone.remix.field.captionHint': 'Décrivez le style, l\'ambiance et l\'instrumentation visés pour le remix.', + 'kgone.remix.field.lyricsHint': 'Laissez vide pour conserver les paroles d\'origine, ou saisissez-en de nouvelles. Utilisez les balises [Verse], [Chorus], [Bridge].', 'kgone.remix.field.coverStrength': 'Intensité de reprise', 'kgone.remix.field.coverStrengthHint': '0 = créatif, 1 = fidèle à la structure source', 'kgone.remix.field.noiseStrength': 'Intensité du bruit', @@ -509,15 +564,17 @@ export const frFrMessages: TranslationMessages = { 'kgone.remix.btn.generate': 'Générer le remix', 'kgone.remix.btn.processingRemix': 'Traitement du remix...', 'kgone.remix.btn.importAligned': 'Importer aligné sur la source', + 'kgone.remix.poweredBy': 'ACE-Step 1.5', 'kgone.repaint.field.repaintRange': 'Plage de repaint', - 'kgone.repaint.field.loopModeOff': 'Le mode boucle est désactivé. Activez le bouton boucle dans la barre d’outils et définissez une plage de boucle pour fixer la fenêtre de repaint.', + 'kgone.repaint.field.captionPlaceholder': 'ex. Genre : jazz, style : doux et mélodieux, instrumentation : piano, contrebasse, batterie brossée...', + 'kgone.repaint.field.loopModeOff': 'Le mode boucle est désactivé. Activez le bouton boucle dans la barre d\'outils et définissez une plage de boucle pour fixer la fenêtre de repaint.', 'kgone.repaint.field.start': 'Début', 'kgone.repaint.field.end': 'Fin', - 'kgone.repaint.field.untilEnd': 'jusqu’à la fin de l’audio', - 'kgone.repaint.field.captionHint': 'Décrivez le style cible et l’instrumentation de la section repeinte.', - 'kgone.repaint.field.lyricsHint': 'Laissez vide pour conserver les paroles d’origine, ou saisissez-en de nouvelles pour la section repeinte.', + 'kgone.repaint.field.untilEnd': 'jusqu\'à la fin de l\'audio', + 'kgone.repaint.field.captionHint': 'Décrivez le style cible et l\'instrumentation de la section repeinte.', + 'kgone.repaint.field.lyricsHint': 'Laissez vide pour conserver les paroles d\'origine, ou saisissez-en de nouvelles pour la section repeinte.', 'kgone.repaint.field.repaintStrength': 'Intensité du repaint', - 'kgone.repaint.field.repaintStrengthHint': '0 = préserver l’original, 1 = régénération complète', + 'kgone.repaint.field.repaintStrengthHint': '0 = préserver l\'original, 1 = régénération complète', 'kgone.repaint.hint.submitting': 'Envoi de la demande de repaint...', 'kgone.repaint.hint.generating': 'Génération du repaint...', 'kgone.repaint.hint.generatingProgress': 'Génération du repaint... {pct}% — {stage}', @@ -527,23 +584,32 @@ export const frFrMessages: TranslationMessages = { 'kgone.repaint.btn.generate': 'Générer le repaint', 'kgone.repaint.btn.processingRepaint': 'Traitement du repaint...', 'kgone.repaint.btn.importAligned': 'Importer aligné sur la source', + 'kgone.repaint.poweredBy': 'ACE-Step 1.5', 'kgone.separator.field.separationModel': 'Modèle de séparation', 'kgone.separator.field.chunkDuration': 'Durée optionnelle des segments audio (secondes)', 'kgone.separator.field.chunkDurationPlaceholder': 'Laisser vide pour traiter toute la région', 'kgone.separator.field.modelOverlap': 'Recouvrement du modèle', - 'kgone.separator.hint.drag': 'Glissez chaque lecteur de stem ci-dessus vers une piste audio pour l’importer. Le dépôt sur une piste MIDI n’est pas pris en charge pour la séparation de stems.', + 'kgone.separator.hint.drag': 'Glissez chaque lecteur de stem ci-dessus vers une piste audio pour l\'importer. Le dépôt sur une piste MIDI n\'est pas pris en charge pour la séparation de stems.', 'kgone.separator.hint.noRegion.download': 'Téléchargez {model}, puis sélectionnez une région audio sur la timeline pour en extraire les stems.', 'kgone.separator.hint.noRegion.select': 'Sélectionnez une région audio sur la timeline pour en extraire les stems. Seules les régions audio sont prises en charge ; les régions MIDI ne peuvent pas être séparées.', 'kgone.separator.btn.separateStems': 'Séparer les stems', 'kgone.separator.btn.importAllStems': 'Importer tous les stems sur la timeline', + 'kgone.separator.poweredBy': 'UVR5 CLI', + 'kgone.separator.model.vocalInstMedium': 'Voix et instruments (précision moyenne)', + 'kgone.separator.model.vocalInstHigh': 'Voix et instruments (haute précision)', + 'kgone.separator.model.6stem': 'Voix, batterie, basse, guitare, piano et autres', + 'kgone.separator.model.htdemucs4s': 'Voix, batterie, basse et autres', + 'kgone.separator.btn.server.loadingModel': 'Chargement du modèle...', + 'kgone.separator.btn.server.generating': 'Préparation de l\'envoi...', 'kgone.separator.btn.server.polling': 'Séparation des stems...', + 'kgone.separator.btn.server.downloading': 'Téléchargement...', 'kgone.separator.btn.local.loadingModel': 'Préparation du modèle local...', - 'kgone.separator.btn.local.generating': 'Préparation de l’audio...', + 'kgone.separator.btn.local.generating': 'Préparation de l\'audio...', 'kgone.separator.btn.local.polling': 'Séparation locale en cours...', 'kgone.separator.btn.local.downloading': 'Finalisation...', 'kgone.separator.local.title': 'Mode séparateur local', - 'kgone.separator.local.description': 'Si K.G.One Music Studio n’est pas disponible, le mode séparateur local offre une solution intégrée pour extraire des stems directement dans votre navigateur. Deux modèles locaux sont disponibles : Vocal and Instrument (Medium Accuracy), et Vocal, Drums, Bass, and Others. L’état de téléchargement ci-dessous correspond au modèle actuellement sélectionné. Vocal and Instrument (Medium Accuracy) prend généralement plus de temps à traiter que Vocal, Drums, Bass, and Others, et la durée totale dépendra tout de même de votre matériel. Si le traitement bascule sur le CPU, la page peut devenir temporairement moins réactive pendant la séparation.', - 'kgone.separator.local.learnMore': 'En savoir plus sur l’intégration du serveur K.G.One Music Studio.', + 'kgone.separator.local.description': 'Si K.G.One Music Studio n\'est pas disponible, le mode séparateur local offre une solution intégrée pour extraire des stems directement dans votre navigateur. Deux modèles locaux sont disponibles : Vocal and Instrument (Medium Accuracy), et Vocal, Drums, Bass, and Others. L\'état de téléchargement ci-dessous correspond au modèle actuellement sélectionné. Vocal and Instrument (Medium Accuracy) prend généralement plus de temps à traiter que Vocal, Drums, Bass, and Others, et la durée totale dépendra tout de même de votre matériel. Si le traitement bascule sur le CPU, la page peut devenir temporairement moins réactive pendant la séparation.', + 'kgone.separator.local.learnMore': 'En savoir plus sur l\'intégration du serveur K.G.One Music Studio.', 'kgone.separator.local.provider': 'Fournisseur : ', 'kgone.separator.local.model': 'Modèle : ', 'kgone.separator.local.downloaded': 'téléchargé', @@ -563,4 +629,34 @@ export const frFrMessages: TranslationMessages = { 'kgone.separator.local.progress.readingAudio': 'Lecture du fichier audio...', 'kgone.separator.local.progress.running': 'Séparation dans le navigateur en cours...', 'kgone.separator.local.progress.complete': 'Séparation terminée.', + + 'openProjectModal.title': 'Ouvrir un projet', + 'openProjectModal.close': 'Fermer', + 'openProjectModal.loading': 'Chargement des projets...', + 'openProjectModal.date.unknown': 'Inconnu', + 'openProjectModal.filter.placeholder': 'Filtrer les projets...', + 'openProjectModal.viewToggle.projects': 'Projets', + 'openProjectModal.viewToggle.trash': 'Corbeille', + 'openProjectModal.trash.hint': 'Les projets supprimés sont automatiquement retirés après 30 jours.', + 'openProjectModal.sort.name': 'Nom', + 'openProjectModal.sort.created': 'Créé', + 'openProjectModal.sort.updated': 'Mis à jour', + 'openProjectModal.empty.trash': 'La corbeille est vide', + 'openProjectModal.empty.noProjects': 'Aucun projet enregistré', + 'openProjectModal.empty.noMatch': 'Aucun projet ne correspond au filtre', + 'openProjectModal.meta.created': 'Créé le {date}', + 'openProjectModal.meta.updated': 'Mis à jour le {date}', + 'openProjectModal.meta.deleted': 'Supprimé le {date}', + 'openProjectModal.action.open': 'Ouvrir', + 'openProjectModal.action.duplicate': 'Dupliquer', + 'openProjectModal.action.delete': 'Supprimer', + 'openProjectModal.action.restore': 'Restaurer', + 'openProjectModal.action.deletePermanently': 'Supprimer définitivement', + 'openProjectModal.dialog.duplicateName': 'Saisissez un nom pour le projet dupliqué :', + 'openProjectModal.dialog.invalidName': 'Nom de projet invalide. Seules les lettres, les chiffres, les espaces, les tirets, les underscores, les points et les parenthèses sont autorisés.', + 'openProjectModal.dialog.duplicateError': 'Échec de la duplication du projet : {error}', + 'openProjectModal.dialog.deleteError': 'Échec de la suppression du projet : {error}', + 'openProjectModal.dialog.restoreError': 'Échec de la restauration du projet : {error}', + 'openProjectModal.dialog.confirmPermanentDelete': 'Êtes-vous sûr de vouloir supprimer définitivement « {name} » ?\n\nCette opération est irréversible.', + 'openProjectModal.dialog.permanentDeleteError': 'Échec de la suppression définitive du projet : {error}', }; diff --git a/src/i18n/messages/zh_hk.ts b/src/i18n/messages/zh_hk.ts index 40dceb5..6335605 100644 --- a/src/i18n/messages/zh_hk.ts +++ b/src/i18n/messages/zh_hk.ts @@ -6,6 +6,10 @@ export const zhHkMessages: TranslationMessages = { 'app.loading': '載入中...', 'assistant.displayName': 'K.G.Studio 音樂創作助手', 'assistant.welcomeFallback': '歡迎使用 K.G.Studio 音樂創作助手。', + 'chatbox.todo.title': '任務清單', + 'chatbox.todo.ariaLabel': '代理任務清單', + 'chatbox.todo.count': '已完成 {completed}/{total}', + 'chatbox.todo.active': '當前進行中:{task}', 'mainContent.createTrack': '建立音軌', 'mainContent.showGlobalTracks': '顯示全域音軌', 'status.chordGuideCandidate': '和弦指導候選: {name} - {notes} - {note}',