feat: i18n support with first translations

This commit is contained in:
2026-02-21 10:45:41 +01:00
parent a5281a7750
commit b8005bec30
48 changed files with 2792 additions and 462 deletions

View File

@@ -0,0 +1,320 @@
{
"common.save": "Enregistrer",
"common.cancel": "Annuler",
"common.clear": "Effacer",
"common.settings": "Paramètres",
"common.tasks": "Tâches",
"common.running": "en cours",
"common.pending": "en attente",
"activity.posts": "Articles",
"activity.pages": "Pages du site",
"activity.media": "Médias",
"activity.tags": "Étiquettes",
"activity.aiAssistant": "Assistant IA",
"activity.import": "Importation",
"activity.sourceControl": "Contrôle de source",
"activity.toggleHint": "(cliquez à nouveau pour basculer la barre latérale)",
"tasks.backgroundTasks": "Tâches en arrière-plan",
"tasks.clearCompleted": "Effacer terminé",
"tasks.recent": "Récentes",
"tasks.noActive": "Aucune tâche active",
"tasks.cancelTask": "Annuler la tâche",
"tasks.triggerTitle": "{running} en cours, {pending} en attente",
"app.taskCompleted": "Tâche terminée : {message}",
"app.taskFailed": "Échec de la tâche : {message}",
"app.databaseRebuildFailed": "Échec de la reconstruction de la base de données",
"app.textReindexFailed": "Échec de la réindexation du texte",
"app.sitemapGenerationFailed": "Échec de la génération du sitemap",
"app.previewOpenFailed": "Impossible douvrir laperçu de larticle sélectionné",
"app.metadataDiff": "Diff Métadonnées",
"app.importComplete": "Import terminé : {posts} articles, {media} fichiers média",
"settings.language.english": "Anglais",
"settings.language.german": "Allemand",
"settings.language.french": "Français",
"settings.language.italian": "Italien",
"settings.language.spanish": "Espagnol",
"settings.language.portuguese": "Portugais (Português)",
"settings.language.dutch": "Néerlandais (Nederlands)",
"settings.language.polish": "Polonais (Polski)",
"settings.language.russian": "Russe (Русский)",
"settings.language.japanese": "Japonais (日本語)",
"settings.language.chinese": "Chinois (中文)",
"settings.language.korean": "Coréen (한국어)",
"settings.language.arabic": "Arabe (العربية)",
"settings.language.hindi": "Hindi",
"settings.language.turkish": "Turc (Türkçe)",
"settings.language.swedish": "Suédois (Svenska)",
"settings.language.danish": "Danois (Dansk)",
"settings.language.norwegian": "Norvégien (Norsk)",
"settings.language.finnish": "Finnois (Suomi)",
"settings.language.czech": "Tchèque (Čeština)",
"settings.project.title": "Projet",
"settings.project.browse": "Parcourir",
"settings.project.reset": "Réinitialiser",
"settings.project.resetDefault": "Réinitialiser par défaut",
"settings.project.selectDataFolder": "Sélectionner le dossier de données du projet",
"settings.editor.title": "Éditeur",
"settings.editor.mode.wysiwyg": "WYSIWYG (éditeur visuel)",
"settings.editor.mode.markdown": "Markdown (source)",
"settings.editor.mode.preview": "Aperçu (lecture seule)",
"settings.editor.diff.inline": "En ligne",
"settings.editor.diff.sideBySide": "Côte à côte",
"settings.content.title": "Catégories darticles",
"settings.content.renderInLists": "Afficher dans les listes",
"settings.content.showTitles": "Afficher les titres",
"settings.ai.title": "Assistant IA",
"settings.ai.noModels": "Aucun modèle disponible",
"settings.publishing.ftpTitle": "Publication FTP",
"settings.publishing.sshTitle": "Publication SSH",
"settings.data.title": "Maintenance de la base de données",
"settings.data.fileSystemTitle": "Système de fichiers",
"settings.search.placeholder": "Rechercher des paramètres...",
"settings.search.noResults": "No paramètres found matching \"{query}\"",
"settings.search.clear": "Effacer la recherche",
"settings.toast.publishingSaved": "Identifiants de publication enregistrés",
"settings.toast.saveCredentialsFailed": "Échec de save credentials",
"settings.toast.credentialsCleared": "Identifiants {type} effacés",
"settings.toast.projectSaved": "Project paramètres saved",
"settings.toast.projectSaveFailed": "Échec de save project paramètres",
"settings.toast.categoryAdded": "Catégorie \"{category}\" ajoutée",
"settings.toast.categoryAddFailed": "Échec de add category",
"settings.toast.categoryExists": "La catégorie existe déjà",
"settings.toast.categoryProtected": "Impossible de supprimer la catégorie standard \"{category}\"",
"settings.toast.categoryAtLeastOne": "Au moins une catégorie est requise",
"settings.toast.categoryRemoved": "Catégorie \"{category}\" supprimée",
"settings.toast.categoryRemoveFailed": "Échec de remove category",
"settings.toast.categoriesReset": "Catégories réinitialisées aux valeurs par défaut",
"settings.toast.categoriesResetFailed": "Échec de reset categories",
"settings.toast.categorySettingsUpdateFailed": "Échec de update category paramètres",
"settings.toast.systemPromptSaved": "Prompt système enregistré",
"settings.toast.systemPromptSaveFailed": "Échec de save system prompt",
"settings.toast.systemPromptReset": "Prompt système réinitialisé par défaut",
"settings.toast.systemPromptResetFailed": "Échec de reset system prompt",
"settings.toast.apiKeySaved": "Clé API enregistrée et validée",
"settings.toast.apiKeyInvalid": "Clé API invalide",
"settings.toast.apiKeySaveFailed": "Échec de save API key",
"settings.toast.defaultModelUpdated": "Modèle par défaut mis à jour",
"settings.toast.defaultModelUpdateFailed": "Échec de set default model",
"settings.toast.rebuildPostsLoading": "Rebuilding articles database...",
"settings.toast.rebuildPostsSuccess": "Base des articles reconstruite",
"settings.toast.rebuildPostsFailed": "Échec de rebuild articles database",
"settings.toast.rebuildMediaLoading": "Rebuilding médias database...",
"settings.toast.rebuildMediaSuccess": "Base médias reconstruite",
"settings.toast.rebuildMediaFailed": "Échec de rebuild médias database",
"settings.toast.rebuildLinksLoading": "Rebuilding article links...",
"settings.toast.rebuildLinksSuccess": "Liens darticles reconstruits",
"settings.toast.rebuildLinksFailed": "Échec de rebuild article links",
"settings.toast.thumbnailsLoading": "Génération des miniatures...",
"settings.toast.thumbnailsGenerated": "{count} miniatures générées",
"settings.toast.thumbnailsAlreadyExist": "Toutes les miniatures existent déjà",
"settings.toast.thumbnailsComplete": "Génération des miniatures terminée",
"settings.toast.thumbnailsFailed": "Échec de generate thumbnails",
"chat.setupTitle": "Configuration du chat IA",
"chat.apiKeyRequiredTitle": "Clé API OpenCode Zen requise",
"chat.apiKeyRequiredDescription": "Saisissez votre clé API OpenCode pour activer le chat IA.",
"chat.apiKeyPlaceholder": "Saisissez votre clé API...",
"chat.apiKeySave": "Enregistrer la clé",
"chat.apiKeyValidating": "Validation...",
"chat.apiKeyInvalid": "Clé API invalide. Veuillez vérifier et réessayer.",
"chat.apiKeyValidationFailed": "Échec de validate API key.",
"chat.newChat": "Nouveau chat",
"chat.welcomeTitle": "Bienvenue dans lassistant IA",
"chat.welcomeDescription": "I can help you manage your articles and médias. Try asking me to:",
"chat.welcomeTipSearch": "Recherche for articles about a specific topic",
"chat.welcomeTipDetails": "Get details about a specific article",
"chat.welcomeTipTags": "Lister toutes les étiquettes ou catégories de votre blog",
"chat.welcomeTipMetadata": "Update metadata for articles or médias",
"chat.welcomeTipImages": "List all images in your médias library",
"chat.role.you": "Vous",
"chat.role.assistant": "Assistant IA",
"chat.stop": "Arrêter",
"chat.inputPlaceholder": "Saisissez un message...",
"chat.errorPrefix": "Erreur : {error}",
"chat.errorNoResponse": "Échec de get a response. Please try again.",
"chat.errorEmptyResponse": "Le modèle a renvoyé une réponse vide. Essayez un autre modèle ou reformulez votre question.",
"chat.errorGeneric": "Désolé, une erreur est survenue lors du traitement de votre message.",
"chat.cancelledSuffix": "(annulé)",
"aiSuggestions.title": "Analyse dimage IA",
"aiSuggestions.close": "Fermer",
"aiSuggestions.analyzing": "Analyse de limage...",
"aiSuggestions.titleField": "Titre",
"aiSuggestions.altField": "Texte alternatif",
"aiSuggestions.captionField": "Légende",
"aiSuggestions.hasExisting": "(valeur existante)",
"aiSuggestions.current": "Actuel",
"aiSuggestions.intro": "Sélectionnez les valeurs générées par lIA à appliquer. Les valeurs existantes sont conservées par défaut.",
"aiSuggestions.empty": "Aucune suggestion na été générée pour cette image.",
"aiSuggestions.wait": "Veuillez patienter...",
"aiSuggestions.applySelected": "Appliquer la sélection",
"insert.title.link": "Insérer un lien",
"insert.title.image": "Insérer une image",
"insert.tab.linkInternal": "Lier à un article",
"insert.tab.imageInternal": "Bibliothèque média",
"insert.tab.linkExternal": "URL externe",
"insert.tab.imageExternal": "Image externe",
"insert.searchPlaceholder.link": "Recherche articles by title or content...",
"insert.searchPlaceholder.image": "Recherche médias by name, title, or alt text...",
"insert.status.searching": "Recherche...",
"insert.status.typeMore": "Saisissez au moins 2 caractères pour rechercher",
"insert.status.noResults": "Aucun(e) {kind} trouvé(e) pour \"{query}\"",
"insert.label.url": "Adresse URL",
"insert.label.linkTextOptional": "Texte du lien (optionnel)",
"insert.label.altText": "Texte alternatif",
"insert.placeholder.linkUrl": "https://exemple.fr",
"insert.placeholder.imageUrl": "https://exemple.fr/image.jpg",
"insert.placeholder.linkText": "Cliquez ici",
"insert.placeholder.imageAlt": "Description de limage",
"insert.submit.link": "Insérer un lien",
"insert.submit.image": "Insérer une image",
"insert.hint.internal": "Utilisez ↑↓ pour naviguer, Entrée pour sélectionner, Esc pour fermer",
"insert.hint.external": "Entrez lURL et appuyez sur Entrée ou cliquez sur le bouton, Esc pour fermer",
"insert.hint.canonicalPost": "Canonique : /YYYY/MM/DD/slug",
"insert.hint.canonicalMedia": "Canonical: /médias/YYYY/MM/file.ext",
"postLinks.loading": "Chargement des liens...",
"postLinks.link": "lien",
"postLinks.links": "liens",
"postLinks.linksTo": "Liens vers ({count})",
"postLinks.linkedBy": "Lié par ({count})",
"postLinks.openTitle": "Ouvrir: {title}",
"docs.title": "Guide utilisateur",
"docs.subtitle": "Guide utilisateur pour cette version installée de bDS.",
"gitDiff.header": "Diff : {target}",
"gitDiff.noProject": "Aucun projet actif sélectionné.",
"gitDiff.noProjectPath": "Impossible de résoudre le chemin du projet.",
"gitDiff.loadFailed": "Échec de load diff.",
"gitDiff.loading": "Chargement du diff...",
"gitDiff.changedFiles": "Fichiers modifiés",
"gitDiff.previousFile": "Fichier précédent",
"gitDiff.nextFile": "Fichier suivant",
"errorModal.error": "Erreur",
"errorModal.stackTrace": "Trace de pile",
"errorModal.copyClipboard": "Copier dans le presse-papiers",
"errorModal.copy": "Copier",
"errorModal.noStack": "Aucune trace de pile disponible",
"confirmDelete.title": "Confirmer la suppression",
"confirmDelete.promptPost": "Are you sure you want to delete the article",
"confirmDelete.promptMedia": "Are you sure you want to delete the médias file",
"confirmDelete.warning": "Avertissement :",
"confirmDelete.referencedBy": "Ce/cette {itemType} est référencé(e) par les éléments suivants :",
"confirmDelete.note": "La suppression de ce/cette {itemType} supprimera toutes ces références.",
"confirmDelete.cancel": "Annuler",
"confirmDelete.deletePost": "Supprimer larticle",
"confirmDelete.deleteMedia": "Supprimer le média",
"confirmDelete.itemType.post": "article",
"confirmDelete.itemType.media": "médias",
"lightbox.close": "Fermer (Esc)",
"lightbox.previous": "Précédent (←)",
"lightbox.next": "Suivant (→)",
"credentials.error.load": "Échec de load credentials:",
"credentials.error.save": "Échec de save credentials:",
"credentials.toast.saved": "Identifiants enregistrés",
"credentials.toast.saveFailed": "Échec de save credentials",
"credentials.toast.testing": "Test de la connexion {type}...",
"credentials.toast.connectionFailed": "Connection échoué - check credentials",
"credentials.tab.ftp": "Accès FTP",
"credentials.tab.ssh": "Accès SSH",
"credentials.ftp.title": "Publication FTP",
"credentials.ftp.description": "Configurez FTP pour publier votre blog sur un serveur web.",
"credentials.ssh.title": "Publication SSH",
"credentials.ssh.description": "Configurez SSH pour une publication sécurisée sur votre serveur.",
"credentials.field.host": "Hôte",
"credentials.field.username": "Nom dutilisateur",
"credentials.field.password": "Mot de passe",
"credentials.field.sshKeyPath": "Chemin de clé SSH",
"credentials.action.testConnection": "Tester la connexion",
"credentials.ftp.placeholder.host": "ftp.exemple.fr",
"credentials.ftp.placeholder.username": "utilisateur-ftp",
"credentials.ftp.placeholder.password": "Mot de passe",
"credentials.ssh.placeholder.host": "serveur.exemple.fr",
"credentials.ssh.placeholder.username": "utilisateur-ssh",
"credentials.ssh.placeholder.keyPath": "~/.ssh/ma_cle",
"gitSidebar.header": "CONTRÔLE DE SOURCE",
"gitSidebar.loading": "Chargement...",
"gitSidebar.error.fetchRemoteUpdates": "Échec de fetch remote updates.",
"gitSidebar.error.refreshRemoteState": "Impossible dactualiser létat de suivi distant.",
"gitSidebar.error.gitMissing": "Exécutable Git introuvable. Veuillez installer Git et redémarrer lapplication.",
"gitSidebar.error.noActiveProject": "Aucun projet actif sélectionné.",
"gitSidebar.error.loadRepoStatus": "Impossible de charger létat du dépôt.",
"gitSidebar.error.initFailed": "Échec de initialize git repository.",
"gitSidebar.error.actionFailed": "Échec de {action}.",
"gitSidebar.error.commitFailed": "Échec de commit changes.",
"gitSidebar.progress.preparingInit": "Préparation de linitialisation du dépôt...",
"gitSidebar.progress.pushingRemote": "Envoi des commits vers le distant... cela peut prendre un moment pour les gros envois.",
"gitSidebar.progress.fetching": "Récupération des mises à jour distantes...",
"gitSidebar.progress.pulling": "Récupération des dernières modifications...",
"gitSidebar.progress.pruningLfs": "Nettoyage du cache local Git LFS...",
"gitSidebar.progress.committing": "Création du commit...",
"gitSidebar.progress.initializingRepo": "Initialisation du dépôt...",
"gitSidebar.history.synced": "Synchronisé",
"gitSidebar.history.localOnly": "Local uniquement",
"gitSidebar.history.remoteOnly": "Distant uniquement",
"gitSidebar.init.transcript": "Journal dinitialisation",
"gitSidebar.aria.repoActions": "Actions du dépôt",
"gitSidebar.aria.openChanges": "Modifications ouvertes",
"gitSidebar.aria.commitStatusLegend": "Légende du statut de commit",
"gitSidebar.aria.versionHistory": "Historique des versions",
"gitSidebar.action.fetch": "Récupérer",
"gitSidebar.action.fetching": "Récupération...",
"gitSidebar.action.pull": "Tirer",
"gitSidebar.action.pulling": "Récupération des changements...",
"gitSidebar.action.push": "Pousser",
"gitSidebar.action.pushing": "Envoi...",
"gitSidebar.action.pruneLfs": "Purger LFS",
"gitSidebar.action.pruning": "Purge...",
"gitSidebar.action.commit": "Valider",
"gitSidebar.action.committing": "Commit en cours...",
"gitSidebar.action.initializeGit": "Initialiser Git",
"gitSidebar.action.initializing": "Initialisation...",
"gitSidebar.openChanges": "Ouvrir Changes ({count})",
"gitSidebar.versionHistory": "Historique des versions ({count})",
"gitSidebar.loadingChanges": "Chargement des modifications...",
"gitSidebar.noChanges": "Aucune modification",
"gitSidebar.loadingHistory": "Chargement de lhistorique...",
"gitSidebar.noCommits": "Aucun commit pour le moment",
"gitSidebar.branch": "Branche : {branch}",
"gitSidebar.aheadBehind": "en avance {ahead} / en retard {behind}",
"gitSidebar.notRepo": "Ce projet nest pas un dépôt git.",
"gitSidebar.placeholder.remoteUrl": "URL optionnelle du dépôt distant",
"gitSidebar.placeholder.commitMessage": "Message de commit",
"editor.untitled": "Sans titre",
"tabBar.style": "Apparence",
"tabBar.loading": "Chargement...",
"tabBar.unknown": "Inconnu",
"tabBar.preview": "Aperçu",
"tabBar.modified": "Modifié",
"tabBar.closeHint": "Fermer (Ctrl+W)",
"tabBar.scrollLeft": "Faire défiler les onglets vers la gauche",
"tabBar.scrollRight": "Faire défiler les onglets vers la droite",
"tabBar.commitTitle": "Validation {hash}",
"tabBar.error.fetchPostTitle": "Échec de fetch article title:",
"tabBar.error.fetchChatTitle": "Échec de fetch chat title:",
"tabBar.error.fetchImportTitle": "Échec de fetch import definition title:",
"tabBar.error.fetchCommitTitle": "Échec de fetch commit titles:",
"metadataDiff.title": "Outil de diff des métadonnées",
"metadataDiff.description": "Compare article metadata between database and markdown files. Fix inconsistencies caused by bugs or manual edits.",
"metadataDiff.error.loadStats": "Échec de load database statistics",
"metadataDiff.error.scan": "Échec de scan for differences",
"metadataDiff.progress.starting": "Démarrage de lanalyse...",
"metadataDiff.progress.scanningPublished": "Scanning published articles...",
"metadataDiff.progress.scanning": "Analyse en cours...",
"metadataDiff.action.scan": "Analyser les différences",
"metadataDiff.action.rescan": "Relancer lanalyse",
"metadataDiff.stats.totalPosts": "Articles au total",
"metadataDiff.stats.published": "Publiés",
"metadataDiff.stats.drafts": "Brouillons",
"metadataDiff.stats.mediaFiles": "Fichiers média",
"metadataDiff.summary.noDiffs": "✅ No differences found! All {total} published articles are in sync.",
"metadataDiff.summary.withDiffs": "⚠️ Found {count} articles with differences out of {total} published articles.",
"metadataDiff.group.differences": "Différences de {label}",
"metadataDiff.group.postsCount": "{count} articles",
"metadataDiff.sync.failed": "échoué",
"metadataDiff.sync.dbToFile.title": "Mettre à jour les fichiers avec les valeurs de la base",
"metadataDiff.sync.dbToFile.success": "Synced {success} articles to files{échoué}",
"metadataDiff.sync.dbToFile.error": "Échec de sync to files",
"metadataDiff.sync.fileToDb.title": "Mettre à jour la base avec les valeurs des fichiers",
"metadataDiff.sync.fileToDb.success": "Synced {success} files to database{échoué}",
"metadataDiff.sync.fileToDb.error": "Échec de sync to database",
"metadataDiff.value.database": "Base de données",
"metadataDiff.value.file": "Fichier",
"metadataDiff.empty": "Cliquez sur « Rechercher les différences » pour comparer les métadonnées de la base et celles des fichiers."
}