From d7ff50dd03359b4d942312697c152e68961d23d2 Mon Sep 17 00:00:00 2001 From: "svilen.velikov" Date: Thu, 16 May 2024 18:41:13 +0300 Subject: [PATCH] Validate translations during jenkins build Added missing french labels reported by the validation test --- Jenkinsfile | 10 ++++++++++ scripts/validate-translations.js | 22 ++++++++++++++++++++++ src/i18n/locale-fr.json | 24 ++++++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 scripts/validate-translations.js diff --git a/Jenkinsfile b/Jenkinsfile index 619eb99e2..a8affff72 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -19,6 +19,12 @@ pipeline { stages { + stage('Validate translations') { + steps { + sh 'node scripts/validate-translations.js || exit 1' + } + } + stage('Install') { steps { sh "npm install" @@ -87,6 +93,10 @@ pipeline { sh "sudo rm -rf ./cypress" sh "sudo rm -rf ./report" } + + failure { + archiveArtifacts artifacts: 'translation-validation-result.json', onlyIfSuccessful: false + } } } diff --git a/scripts/validate-translations.js b/scripts/validate-translations.js new file mode 100644 index 000000000..20cf8a022 --- /dev/null +++ b/scripts/validate-translations.js @@ -0,0 +1,22 @@ +const fs = require('fs'); +const _ = require('lodash'); + +const localeEn = fs.readFileSync('src/i18n/locale-en.json', 'utf8'); +const localeFr = fs.readFileSync('src/i18n/locale-fr.json', 'utf8'); + +const enObj = JSON.parse(localeEn); +const frObj = JSON.parse(localeFr); + +const enKeys = _.keys(enObj); +const frKeys = _.keys(frObj); + +const missingKeysInFrenchBundle = _.difference(enKeys, frKeys); + +const difference = { + missingKeysInFrenchBundle +}; + +if (!_.isEmpty(difference.missingInFr)) { + fs.writeFileSync('translation-validation-result.json', JSON.stringify(difference, null, 2)); + process.exit(1); +} diff --git a/src/i18n/locale-fr.json b/src/i18n/locale-fr.json index ed13b0b4c..db5b02838 100644 --- a/src/i18n/locale-fr.json +++ b/src/i18n/locale-fr.json @@ -287,6 +287,7 @@ "state.label": "état", "download.btn": "Télécharger", "skip.btn": "Sauter", + "back.to.guides.btn": "Retour aux guides", "show.remaining": "Afficher les", "characters.label": "caractères", "show.first.chars": "Afficher les 500 premiers caractères", @@ -623,6 +624,8 @@ "view.autocomplete.title": "Index Autocomplete", "view.autocomplete.helpInfo": "L'index Autocomplete est utilisé pour la complétion automatique des IRIs dans l'éditeur SPARQL et la page de ressources View. Utilisez cette vue pour activer ou désactiver l'index et vérifier son état.", "view.clusterManagement.title": "Gestion des clusters", + "view.clusterManagement.create.title": "Créer un cluster", + "view.clusterManagement.edit.title": "Modifier un cluster", "view.clusterManagement.helpInfo": "La vue Gestion des clusters est un outil d'administration visuelle pour le cluster GraphDB. Vous pouvez y créer ou modifier un cluster en glissant et déposant les nœuds ou vous pouvez l'utiliser pour surveiller l'état d'un cluster en cours d'exécution en temps quasi réel.", "view.resource.title": "", "view.export.ctr.helpInfo": "La vue d'ensemble des graphes fournit une liste du graphe par défaut et de tous les graphes nommés dans un dépôt GraphDB. Il peut être utilisé pour inspecter les déclarations dans chaque graphe, exporter le graphe ou effacer les données du graphe.", @@ -719,6 +722,11 @@ "menu.monitor.label": "Surveiller", "menu.queries.and.updates.label": "Requêtes et mises à jour", "menu.backup_and_restore.label": "Sauvegarde et Restauration", + "menu.enableFtsIndex.label": "Activer l'index de recherche plein texte", + "menu.ftsIndexes.label": "Index de recherche en texte intégral à construire (délimités par des virgules)", + "menu.ftsStringLiteralsIndex.label": "Index de recherche en texte intégral pour les littéraux xsd:string", + "menu.ftsIrisIndex.label": "Index de recherche en texte intégral pour l'indexation en texte intégral des IRI", + "menu.ftsDefaultAnalyzer.label": "Analyseur pour l'index par défaut", "menu.ftsLanguages.label": "Entrez la langue pour la recherche plein texte", "menu.resources.label": "Système", "menu.setup.label": "Configurer", @@ -764,6 +772,7 @@ "query.editor.showing.results.from.msg": "Liste de résultats de ", "query.editor.to": " à ", "query.editor.of": " pour un total de ", + "query.editor.of.at.least": " d'au moins ", "query.editor.abort": "{{abort}}", "query.editor.abort.requested": "L'arrêt a été demandé", "query.editor.abort.update": "Annuler la mise à jour", @@ -1063,6 +1072,9 @@ "core.errors.no.accessible.repositories.warning.msg": "Il n'y a pas de dépôts accessibles.", "core.errors.no.accessible.writable.repositories.warning.msg": "Il n'y a pas de dépôts accessibles en écriture.", "core.errors.create.repository.warning.msg": " Vous pouvez créer un nouveau dépôt", + "core.errors.show.remote.locations.btn": "Afficher les emplacements distants", + "core.errors.hide.remote.locations.btn": "Masquer les emplacements distants", + "core.errors.location.local.label": "Local", "core.loading.longer.than.usual.warning": "GraphDB Workbench est en cours de chargement mais cela prend plus de temps que d'habitude, veuillez patienter...", "core.loading.refresh.warning": "Si le Workbench n'est pas encore chargé, veuillez essayer de vider le cache de votre navigateur et de recharger la page.", "copy.to.clipboard.modal.paragraph": "Copier l'URL dans le presse-papiers", @@ -1266,6 +1278,7 @@ "repoTooltips.shaclOptions.performanceLogging": "Consigner (INFO) le temps d'exécution par forme. Il est recommandé de désactiver la validation parallèle et la mise en cache des nœuds sélectionnés lorsque cette option est activée.", "repoTooltips.shaclOptions.eclipseRdf4jShaclExtensions": "Active les extensions SHACL de RDF4J qui fournissent des fonctionnalités supplémentaires (expérimental).", "repoTooltips.shaclOptions.dashDataShapes": "Active les extensions de DASH Data Shapes qui fournissent des fonctionnalités supplémentaires (expérimental).", + "repoTooltips.shaclOptions.shapesGraph": "Définit les graphiques nommés où les formes SHACL peuvent être stockées. La liste est délimitée par des virgules.", "repoTooltips.entityIdSize": "Définit la taille en bits des identifiants internes utilisés pour indexer les entités (URI, nœuds vides, littéraux et triplets intégrés RDF*). \nUtiliser un identifiant de 40 bits uniquement si vous prévoyez plus de 2 milliards de valeurs RDF uniques.", "repoTooltips.enableContextIndex": "Construit un index supplémentaire Context-Predicate-Subject-Object pour améliorer les performances des requêtes SPARQL avec les clauses GRAPH/FROM/FROM NAMED.", "repoTooltips.enablePredicateList": "Permet d'établir des correspondances entre une entité (sujet ou objet) et ses prédicats; son activation peut accélérer de manière significative les requêtes qui utilisent des modèles de prédicats joker.", @@ -1273,6 +1286,11 @@ "repoTooltips.throwQueryEvaluationExceptionOnTimeout": "Le dépôt lève une QueryEvaluationException lorsque la durée d'exécution d'une requête dépasse le paramètre de délai d'attente.", "repoTooltips.queryLimitResults": "Définit le nombre maximum de résultats renvoyés par une requête après lequel l'évaluation de celle-ci sera terminée; les valeurs inférieures ou égales à zéro signifient l'absence de limite.", "repoTooltips.nonInterpretablePredicates": "Liste délimitée par des points-virgules de prédicats (URI complets) que GraphDB n'essaiera pas de traiter avec les plugins GraphDB enregistrés.", + "repoTooltips.enableFtsIndex": "Activer l'index de recherche en texte intégral (FTS).", + "repoTooltips.ftsIndexes": "Liste de langues délimitées par des virgules qui doivent avoir un index spécifique avec un analyseur approprié pour la recherche en texte intégral. Les valeurs possibles sont: default, iri, ar, bg, bn, br, ca, ja, ko, zh, ku, cz, da, de, el, en, es, et, eu, fa, fi, fr, ga, gl, hi, hu, hy, id, it, lt, lv, ne, nl, no, pt, ro, ru, sr, sv, ta, te, th, tr", + "repoTooltips.ftsStringLiteralsIndex": "Index dans lequel les littéraux de chaîne (xsd:string) sont indexés. Les valeurs possibles sont: aucun, par défaut ou code de langue à 2 lettres.", + "repoTooltips.ftsIrisIndex": "Index dans lequel les IRI sont indexés pour la recherche en texte intégral. Les valeurs possibles sont: aucun, par défaut ou code de langue à 2 lettres.", + "repoTooltips.ftsDefaultAnalyzer": "L'analyseur à utiliser pour l'index « par défaut ». Les valeurs possibles sont: standard, simple, keyword, whitespace, unicodewhitespace, url, email, ar, bg, bn, br, ca, cjk, ckb, cz, da, de, el, en, es, et, eu, fa, fi, fr, ga, gl, hi, hu, hy, id, it, lt, lv, ne, nl, no, pt, ro, ru, sr, sv, ta, te, th, tr", "repoTooltips.ontop.driverType": "Détermine le type de base de données SQL à laquelle se connecter.", "repoTooltips.ontop.propertiesFile": "Décrit la configuration JDBC telle que le nom d'hôte et le nom de la base de données à laquelle se connecter.", "repoTooltips.ontop.hostName": "Le nom d'hôte JDBC auquel se connecter.", @@ -1405,6 +1423,8 @@ "save.settings.btn": "Sauvegarder les paramètres", "are.license.details.correct": "Vos détails de licence sont-ils corrects?", "edition": "Édition", + "capabilities": "Capacités", + "none": "None", "licensed.to": "Autorisé à", "valid.until": "Valable jusque", "perpetual": "Perpétuel", @@ -1912,6 +1932,7 @@ "sparql.shortcuts.auto.indent.lines.less": "Réduire l'indentation de la ou des lignes actuelles/sélectionnées", "sparql.shortcuts.execute.query.update": "Exécuter une requête ou une mise à jour", "sparql.shortcuts.execute.explain.plan": "Exécuter le plan d'explication pour la requête", + "sparql.shortcuts.execute.explain-gpt.plan": "Expliquer la requête/le résultat à l'aide de ChatGPT", "sparql.shortcuts.create.new.tab": "Créer un nouvel onglet sans nom", "sparql.shortcuts.create.saved.query": "Créer une requête sauvegardée à partir de l'état actuel", "sparql.shortcuts.switch.next.tab": "Passer à l'onglet suivant", @@ -2042,6 +2063,9 @@ "guide.step_plugin.welcome.input-icon-hint": " vous dit de taper ou de coller quelque chose.", "guide.step_plugin.welcome-what.title": "Qu'est-ce que {{translatedGuideName}} ?", "guide.step_plugin.welcome-what.content": "{{translatedGuideDescription}}

Commençons pour de vrai maintenant !

", + "guide.confirm.cancel.message": "Êtes-vous sûr de vouloir arrêter le guide?", + "guide.unexpected.error.message": "Le guide a été annulé en raison d'une erreur inattendue. Veuillez exécuter à nouveau le guide et si le problème persiste, contactez le support.", + "guide.start.unexpected.error.message": "Le guide ne peut pas être démarré en raison d'une erreur inattendue. Veuillez réessayer d'exécuter le guide et si le problème persiste, contactez le support.", "guide.step_plugin.execute-sparql-query.query-not-same.error": "La requête n'est pas la même que la requête du guide !", "ttyg.helpInfo": "Parlez à votre graphe est un chatbot basé sur le modèle GPT-4 d'OpenAI qui peut répondre aux questions sur les données stockées dans GraphDB, en exploitant à la fois vos données et les connaissances générales du modèle GPT-4. Le bot fonctionne dans connexion avec le connecteur ChatGPT Retrieval.", "ttyg.hint": "Parlez à votre graphe – posez simplement une question !\nPour le moment, cela fonctionne mieux si vous demandez en anglais, désolé !",