# Générer et mettre à jour les entrées du catalogue
Le catalogue doit contenir des entrées pour toutes les clés à traduire. Ces clés peuvent se trouver dans des fichiers PHP, Js, des templates, etc... Ce chapitre décrit comment extraire toutes les chaînes à traduire, et produire le catalogue correspondant.
Anakeen Platform requiert 2 catalogues par application:
- Un catalogue pour la partie PHP, il contient:
- Les traductions des fichiers PHP,
- Les traductions des workflows,
- les traductions des Smart Structures de Smart Elements,
- les traductions des énumérés
- les traductions des contrôles de vue
- les traductions des templates mustache.
- Un catalogue pour la partie JavaScript contient:
- Les traductions des fichiers Javascript VueJS.
# Publier et mettre à jour les catalogues
La fonction extractPo
est la fonction qui analyse les fichiers PHP et javascript
afin de produire les catalogues.
L'extraction des traductions est basé sur un système de règles définies dans le fichier build.xml
du projet.
Exemple de fichier build.xml
<module:config xmlns:module="https://platform.anakeen.com/4/schemas/module/1.0">
<module:source path="src" />
<module:po-config>
<module:po-struct source="src/**/*struct.xml"/>
<module:po-enum source="src/**/*struct.xml"/>
<module:po-mustache target="user-interfaces" source="src/**/*.mustache"/>
<module:po-php source="src/**/*.php" target="user-interfaces"/>
<module:po-php source="src/vendor/Anakeen/Ui/PhpLib/**/*.php" target="user-interfaces" ignore="true"/>
<module:po-js source="src/vendor/Anakeen/DOCUMENT/**/*js" target="DOCUMENT"/>
<module:po-vuejs source="components/src/**/*.?(ts|vue|js)" target="ui-components"/>
<module:po-vuejs source="src/vendor/Anakeen/Components/**/*.?(js)" target="ui-components"/>
<module:po-vuejs source="src/vendor/Anakeen/SmartStructures/Dsearch/Render/**/*vue" target="dsearch-components"/>
</module:po-config>
</module:config>
# Catalogues PHP
Les classes PHP peuvent utiliser la fonction ___($msgid, $msgctxt)
pour indiquer les clefs à traduire. Cette fonction
est basée sur la fonction pgettext
de la
bibliothèque gettext
.
Les fichiers PHP comportant des appels à la fonction ___()
doivent être indiqué dans la balise
config/po-config/po-struct/@source
. L'attribut source
référence un glob pattern. L'attribut target
indique le nom
des fichiers produits. Ces noms seront complétés avec la langue et l'extension .po
. Ils sont écrits dans les
répertoires src/locale/[fr,en]/LC_MESSAGES/src/
.
<module:config xmlns:module="https://platform.anakeen.com/4/schemas/module/1.0">
<module:source path="src"/>
<module:po-config>
<module:po-php source="src/vendor/My/**/*.php" target="my-translations"/>
</module:po-config>
</module:config>
Exemple de fichier PHP :
<?php
$text = ___("Hello world", "My");
Contexte de traduction
Les paires msgctxt/msgid
doivent être uniques sur l'ensemble des traductions. Il est conseillé d'utiliser un msgctxt
propre à votre module.
L'analyse produit le résultat suivant :
npx @anakeen/anakeen-cli extractPo --sourcePath ./ -v
[2020-1-20] [10:44:06] › ▶ po Initialized timer...
[po] › ℹ info No smart element to extract
[po] › ℹ info No enum to extract
[po] › ℹ info No view control to extract
[po] › ℹ info No workflow to extract
[po] › ℹ info No mustache template to extract
[po] › ℹ info Extract PHP
[po] › ℹ info Analyze PHP Path: src/vendor/Anakeen/**/*.php
[po] › ✔ success Write: src/locale/fr/LC_MESSAGES/src/my-translations_fr.po
[po] › ✔ success Write: src/locale/en/LC_MESSAGES/src/my-translations_en.po
[po] › ℹ info No JS glob
[po] › ℹ info No VUEJS glob
[2020-1-20] [10:44:07] › ◼ po Timer run for: 420ms
[2020-1-20] [10:44:07] › ✔ success po done
Pour finaliser les traductions, il faut compléter les fichiers .po
produits dans le format attendu par xgettext
.
Conseil pour enregistrer les traductions
Il est recommandé d'utiliser un logiciel comme PoEdit, spécialisé dans la traduction pour
compléter les fichiers .po
.
# Catalogues Workflow
Sur les workflows, les éléments suivants peuvent être traduits :
- Le libellé de l'état
graph/steps/step/@state-label
- Le libellé de l'activité
graph/steps/step/@activity-label
- Le libellé de la transition
graph/transitions/transition/@alabel
Les graphes de workflow à traduire sont indiqués dans la balise
config/po-config/po-workflow/@source
. L'attribut source
référence un glob pattern.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<module:config xmlns:module="https://platform.anakeen.com/4/schemas/module/1.0">
<module:source path="src"/>
<module:po-config>
<module:po-workflow source="src/**/*Graph.xml"/>
</module:po-config>
</module:config>
Pour le fichier de graph : "src/vendor/Anakeen/SmartStructures/Devbill/Workflows/Wfam_billGraph.xml"
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0" xmlns:workflow="https://platform.anakeen.com/4/schemas/workflow/1.0">
<workflow:graph ns="GDC" name="WGRAPH_BILL">
<workflow:steps>
<workflow:step name="wfam_bill_e1" state-label="Initial" activity-label="Writting" initial="true"/>
<workflow:step name="wfam_bill_e2" state-label="Final"/>
</workflow:steps>
<workflow:transitions>
<workflow:transition name="t_wfam_bill_e1_e2" from="wfam_bill_e1" to="wfam_bill_e2" label="Transition initial final"/>
</workflow:transitions>
</workflow:graph>
</smart:config>
L'analyse produit le résultat suivant :
npx @anakeen/anakeen-cli extractPo --sourcePath ./ -vv
[2020-1-17] [11:27:08] › ▶ po Initialized timer...
[po] › ℹ info No smart element to extract
[po] › ℹ info No enum to extract
[po] › ℹ info No view control to extract
[po] › ℹ info Extract workflow element
[po] › ℹ info Analyze Path: src/**/*Graph.xml
[po] › ℹ info Analyze WORKFLOW: src/vendor/Anakeen/SmartStructures/Devbill/Workflows/Wfam_billGraph.xml : ✓
[po] › ✔ success Write: src/locale/fr/LC_MESSAGES/src/workflow_WGRAPH_BILL_fr.po
[po] › ✔ success Write: src/locale/en/LC_MESSAGES/src/workflow_WGRAPH_BILL_en.po
[po] › ℹ info No mustache template to extract
[po] › ℹ info No PHP glob
[po] › ℹ info No JS glob
[po] › ℹ info No VUEJS glob
[2020-1-17] [11:27:08] › ◼ po Timer run for: 177ms
[2020-1-17] [11:27:08] › ✔ success po done
Les fichiers produits sont enregistrés au format po (gettext)
. Ils sont préfixés par "workflow_" et sont identifiés
par le nom (attribut name
) du graphe.
Les clefs sont générées sous la forme suivante :
- Le libellé de l'état : contexte :
<graph/@name>:state
, id<step/@name>
- Le libellé de l'activité
<graph/@name>:activity
, id<step/@name>
- Le libellé de la transition
<graph/@name>:transition
, id<transition/@name>
Les libellés sont pris en compte dans les méthodes des Smart Workflow :
SmartStructure\Wdoc::getActivity()
SmartStructure\Wdoc::getStateLabel()
SmartStructure\Wdoc::getTransitionLabel()
Ci-dessous le résultat pour le graphe donné en exemple.
msgid ""
msgstr ""
"Project-Id-Version: workflow WGRAPH_BILL \n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-01-17T10:20:56.579Z\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: src/vendor/Anakeen/SmartStructures/Devbill/Workflows/Wfam_billGraph.xml
#, fuzzy
msgctxt "WGRAPH_BILL:transition"
msgid "t_wfam_bill_e1_e2"
msgstr "Transition initial final"
#: src/vendor/Anakeen/SmartStructures/Devbill/Workflows/Wfam_billGraph.xml
#, fuzzy
msgctxt "WGRAPH_BILL:activity"
msgid "wfam_bill_e1"
msgstr "Writting"
#: src/vendor/Anakeen/SmartStructures/Devbill/Workflows/Wfam_billGraph.xml
#, fuzzy
msgctxt "WGRAPH_BILL:state"
msgid "wfam_bill_e1"
msgstr "Initial"
#: src/vendor/Anakeen/SmartStructures/Devbill/Workflows/Wfam_billGraph.xml
#, fuzzy
msgctxt "WGRAPH_BILL:state"
msgid "wfam_bill_e2"
msgstr "Final"
# Catalogues Smart Structure
Sur les Smart Structures, les éléments suivants peuvent être traduits :
- Le libellé de la Smart Structure
config/structure-configuration/@label
- Le libellé des Smart Field
config/structure-configuration/fields/**/field-*/@name
- Le libellé des paramètres
config/structure-configuration/parameters/**/field-*/@name
Les Smart Structure à traduire sont indiquées dans la balise
config/po-config/po-struct/@source
. L'attribut source
référence un glob pattern.
<module:config xmlns:module="https://platform.anakeen.com/4/schemas/module/1.0">
<module:source path="src"/>
<module:po-config>
<module:po-struct source="src/**/Devbill/*structure.xml"/>
</module:po-config>
</module:config>
Pour la structure : "src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml"
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
<smart:structure-configuration name="DEVBILL" label="Bill">
<smart:icon file="devbill.png"/>
<smart:class>Anakeen\SmartStructures\Devbill\DevbillBehavior</smart:class>
<smart:fields>
<smart:field-set name="bill_fr_ident" type="frame" access="ReadWrite" label="Identification">
<smart:field-text name="bill_title" is-title="true" access="ReadWrite" label="Title"/>
<smart:field-longtext name="bill_content" access="ReadWrite" label="Description"/>
<smart:field-docid name="bill_author" relation="DEVPERSON" access="ReadWrite" label="Author"/>
<smart:field-text name="bill_author_display" is-title="true" access="Read"/>
<smart:field-date name="bill_billdate" access="ReadWrite" label="Bill date"/>
<smart:field-text name="bill_location" access="ReadWrite" label="City"/>
<smart:field-docid name="bill_clients" relation="DEVCLIENT" access="ReadWrite" multiple="true" label="Clients"/>
<smart:field-set name="bill_otherclients" type="array" access="ReadWrite" label="Other clients">
<smart:field-text name="bill_clientname" access="ReadWrite" label="Client name"/>
<smart:field-text name="bill_society" access="ReadWrite" label="Enterprise"/>
</smart:field-set>
<smart:field-money name="bill_cost" access="ReadWrite" label="Cost"/>
</smart:field-set>
</smart:fields>
<smart:parameters>
<smart:field-set name="bill_parameters" type="frame" access="ReadWrite" label="Identification">
<smart:field-account name="bill_main_controller" access="ReadWrite" label="Bill Main Controller"/>
</smart:field-set>
</smart:parameters>
</smart:structure-configuration>
</smart:config>
L'analyse produit le résultat suivant :
npx @anakeen/anakeen-cli extractPo --sourcePath ./ -vv
2020-1-17] [14:37:22] › ▶ po Initialized timer...
[po] › ℹ info Extract smart element
[po] › ℹ info Analyze Path: src/**/Devbill/*structure.xml
[po] › ℹ info Analyze STRUCTURE Path: src/**/Devbill/*structure.xml
[po] › ℹ info Analyze STRUCTURE: src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml : ✓
[po] › ✔ success Write: src/locale/fr/LC_MESSAGES/src/DEVBILL_fr.po
[po] › ✔ success Write: src/locale/en/LC_MESSAGES/src/DEVBILL_en.po
[po] › ℹ info No enum to extract
[po] › ℹ info No view control to extract
[po] › ℹ info No workflow to extract
[po] › ℹ info No mustache template to extract
[po] › ℹ info No PHP glob
[po] › ℹ info No JS glob
[po] › ℹ info No VUEJS glob
[2020-1-17] [14:37:22] › ◼ po Timer run for: 180ms
[2020-1-17] [14:37:22] › ✔ success po done
Les fichiers produits sont enregistrés au format po (gettext)
. Ils sont identifiés par le nom (attribut name
) de la
structure.
Les clefs sont générées sous la forme suivante :
- Le libellé de la Smart Structure : contexte :
config/structure-configuration/@name
id : "title" - Le libellé des Smart Field contexte :
config/structure-configuration/@name
, id :config/structure-configuration/parameters/**/field-*/@name
- Le libellé des paramètres
config/structure-configuration/@name
, id :config/structure-configuration/parameters/**/field-*/@name
Les libellés sont pris en compte dans les méthodes des Smart Elements :
Anakeen/SmartElement::getTitle()
Anakeen/SmartElement::getLabel()
Ci-dessous le résultat pour la Smart Structure donnée en exemple.
msgid ""
msgstr ""
"Project-Id-Version: smart DEVBILL \n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-01-17T13:44:28.963Z\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml
#, fuzzy
msgctxt "DEVBILL"
msgid "bill_fr_ident"
msgstr "Identification"
#: src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml
#, fuzzy
msgctxt "DEVBILL"
msgid "bill_title"
msgstr "Title"
#: src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml
msgctxt "DEVBILL"
msgid "bill_author_display"
msgstr ""
#: src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml
#, fuzzy
msgctxt "DEVBILL"
msgid "bill_location"
msgstr "City"
#: src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml
#, fuzzy
msgctxt "DEVBILL"
msgid "bill_content"
msgstr "Description"
#: src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml
#, fuzzy
msgctxt "DEVBILL"
msgid "bill_author"
msgstr "Author"
#: src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml
#, fuzzy
msgctxt "DEVBILL"
msgid "bill_clients"
msgstr "Clients"
#: src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml
#, fuzzy
msgctxt "DEVBILL"
msgid "bill_billdate"
msgstr "Bill date"
#: src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml
#, fuzzy
msgctxt "DEVBILL"
msgid "bill_otherclients"
msgstr "Other clients"
#: src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml
#, fuzzy
msgctxt "DEVBILL"
msgid "bill_clientname"
msgstr "Client name"
#: src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml
#, fuzzy
msgctxt "DEVBILL"
msgid "bill_society"
msgstr "Enterprise"
#: src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml
#, fuzzy
msgctxt "DEVBILL"
msgid "bill_cost"
msgstr "Cost"
#: src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml
#, fuzzy
msgctxt "DEVBILL"
msgid "bill_parameters"
msgstr "Identification"
#: src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml
#, fuzzy
msgctxt "DEVBILL"
msgid "bill_main_controller"
msgstr "Bill Main Controller"
#: src/vendor/Anakeen/SmartStructures/Devbill/100-Devbill.structure.xml
msgctxt "DEVBILL"
msgid "title"
msgstr ""
# Catalogues Énumérés
Sur les énumérés, le libellé peut être traduit :
- Le libellé de l'énuméré
config/enumerates/enum-configuration/enum/@label
Les énumérés à traduire sont indiqués dans la balise
config/po-config/po-enum/@source
. L'attribut source
référence un glob pattern.
<module:config xmlns:module="https://platform.anakeen.com/4/schemas/module/1.0">
<module:source path="src"/>
<module:po-config>
<module:po-enum source="src/**/*enum.xml"/>
</module:po-config>
</module:config>
Pour l'énuméré : "src/vendor/Anakeen/SmartStructures/Devnote/Devnote.enum.xml"
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
<smart:enumerates>
<smart:enum-configuration name="notelevel" extendable="true" >
<smart:enum name="internal" label="Internal note"/>
<smart:enum name="confidential" label="Confidential note"/>
</smart:enum-configuration>
</smart:enumerates>
</smart:config>
L'analyse produit le résultat suivant :
npx @anakeen/anakeen-cli extractPo --sourcePath ./ -vv
[2020-1-17] [15:09:25] › ▶ po Initialized timer...
[po] › ℹ info No smart element to extract
[po] › ℹ info Extract enum
[po] › ℹ info Analyze ENUM Path: src/**/*enum.xml
[po] › ℹ info Analyze ENUM: src/vendor/Anakeen/SmartStructures/Devnote/Devnote.enum.xml : ✓
[po] › ✔ success Write: src/locale/fr/LC_MESSAGES/src/enumnotelevel_fr.po
[po] › ✔ success Write: src/locale/en/LC_MESSAGES/src/enumnotelevel_en.po
[po] › ℹ info No view control to extract
[po] › ℹ info No workflow to extract
[po] › ℹ info No mustache template to extract
[po] › ℹ info No PHP glob
[po] › ℹ info No JS glob
[po] › ℹ info No VUEJS glob
[2020-1-17] [15:09:25] › ◼ po Timer run for: 175ms
[2020-1-17] [15:09:25] › ✔ success po done
Les fichiers produits sont enregistrés au format po (gettext)
. Ils sont préfixés par "enum" et identifiés par le nom
(attribut name
) de la configuration de l'énuméré.
Les clefs sont générées sous la forme suivante :
- Le libellé de l'énuméré' : contexte :
config/enumerates/enum-configuration/@name
, id :config/enumerates/enum-configuration/enum/@name
Les libellés sont pris en compte dans les classes des Smart Fields liés aux énumérés :
Anakeen\Core\SmartStructure\NormalAttribute::getEnumLabel()
Ci-dessous le résultat pour l'énuméré donné en exemple.
msgid ""
msgstr ""
"Project-Id-Version: enum notelevel \n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-01-17T14:09:25.792Z\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: src/vendor/Anakeen/SmartStructures/Devnote/Devnote.enum.xml
#, fuzzy
msgctxt "notelevel"
msgid "internal"
msgstr "Internal note"
#: src/vendor/Anakeen/SmartStructures/Devnote/Devnote.enum.xml
#, fuzzy
msgctxt "notelevel"
msgid "confidential"
msgstr "Confidential note"
# Catalogues Contrôle de vue
Sur les contrôle de vue, le libellé de la vue, affiché dans les menus, peut être traduit :
- Le libellé de la vue'
config/view-control/view/@label
Les contrôles de vue à traduire sont indiqués dans la balise
config/po-config/po-cvdoc/@source
. L'attribut source
référence un glob pattern.
<module:config xmlns:module="https://platform.anakeen.com/4/schemas/module/1.0">
<module:source path="src"/>
<module:po-config>
<module:po-cvdoc source="src/**/*views.xml"/>
</module:po-config>
</module:config>
Pour le contrôle de vue : "src/vendor/Anakeen/SmartStructures/Devnote/Render/devnote.views.xml"
<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0"
xmlns:ui="https://platform.anakeen.com/4/schemas/ui/1.0">
<ui:view-control name="CV_NOTE" label="CV des notes" structure="DEVNOTE">
<ui:view-list>
<ui:view name="CVADMIN" label="Administrer" display-mode="edition" order="3" menu-displayed="false">
<ui:mask ref="MSK_IUSER_ADMIN"/>
<ui:render-config class="\Anakeen\SmartStructures\Devnote\Render\NoteAdminRender"/>
</ui:view>
<ui:view name="CVRECAP" label="Récapitulatif" display-mode="consultation"
menu-displayed="true">
<ui:render-config class="\Anakeen\SmartStructures\Devnote\Render\Recap"/>
</ui:view>
<ui:view name="CVGROUP" label="Modifier le référant" display-mode="edition"
menu-displayed="true">
<ui:mask ref="MSK_NOTESUBSTITUTE"/>
</ui:view>
</ui:view-list>
</ui:view-control>
<ui:render ref="DEVNOTE">
<ui:view-control ref="CV_NOTE"/>
</ui:render>
</smart:config>
L'analyse produit le résultat suivant :
npx @anakeen/anakeen-cli extractPo --sourcePath ./ -vv
[2020-1-17] [15:42:22] › ▶ po Initialized timer...
[po] › ℹ info No smart element to extract
[po] › ℹ info No enum to extract
[po] › ℹ info Extract view control element
[po] › ℹ info Analyze Path: src/**/*views.xml
[po] › ℹ info Analyze CV: src/vendor/Anakeen/SmartStructures/Devnote/Render/devnote.views.xml : ✓
[po] › ✔ success Write: src/locale/fr/LC_MESSAGES/src/cvdoc_CV_NOTE_fr.po
[po] › ✔ success Write: src/locale/en/LC_MESSAGES/src/cvdoc_CV_NOTE_en.po
[po] › ℹ info No workflow to extract
[po] › ℹ info No mustache template to extract
[po] › ℹ info No PHP glob
[po] › ℹ info No JS glob
[po] › ℹ info No VUEJS glob
[2020-1-17] [15:42:22] › ◼ po Timer run for: 171ms
[2020-1-17] [15:42:22] › ✔ success po done
Les fichiers produits sont enregistrés au format po (gettext)
. Ils sont préfixés par "cvdoc" et identifiés par le nom
(attribut view-control/@name
) de la configuration du contrôle de vue.
Les clefs sont générées sous la forme suivante :
- Le libellé de la vue : contexte :
config/view-control/@name
, id :config/view-control/view/@name
Ci-dessous le résultat pour le contrôle de vue donné exemple.
msgid ""
msgstr ""
"Project-Id-Version: cvdoc CV_NOTE \n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-01-17T14:42:22.448Z\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: src/vendor/Anakeen/SmartStructures/Devnote/Render/devnote.views.xml
#, fuzzy
msgctxt "CV_NOTE"
msgid "CVADMIN"
msgstr "Administrer"
#: src/vendor/Anakeen/SmartStructures/Devnote/Render/devnote.views.xml
#, fuzzy
msgctxt "CV_NOTE"
msgid "CVRECAP"
msgstr "Récapitulatif"
#: src/vendor/Anakeen/SmartStructures/Devnote/Render/devnote.views.xml
#, fuzzy
msgctxt "CV_NOTE"
msgid "CVGROUP"
msgstr "Modifier le référant"
# Catalogues Template Mustache
Les templates utilisés par la fonction getTemplates des rendus de configuration peuvent comporter des textes traduisibles dans les sections .
La balise pour marquer une traduction est la balise i18n
.
Exemple : issue du header de rendu du Smart Element :
<header>
{{#document.properties.icon}}<img
class="dcpDocument__header__icon"
src="{{document.properties.icon}}"
alt="Document icon"
/>{{/document.properties.icon}}
<span
style="display:none;"
title="[[#i18n]]ddui::Editing form[[/i18n]]"
class="dcpDocument__header__modified fa fa-asterisk"
></span>
<span class="dcpDocument__header__title">{{document.properties.title}}</span>
<div class="dcpDocument__header__family">{{document.properties.family.title}}</div>
</header>
Les sources des template mustache, qui comportent des traductions, sont indiqués dans la balise
config/po-config/po-vuejs/@source
. L'attribut source
référence un glob pattern, l'attribut target
indique le nom
du fichier produit. Le fichier produit est préfixé par "mustache-
".
<module:config xmlns:module="https://platform.anakeen.com/4/schemas/module/1.0">
<module:source path="src"/>
<module:po-config>
<module:po-mustache source="src/vendor/My/**/*.mustache" target="my-test"/>
</module:po-config>
</module:config>
L'analyse produit le résultat suivant :
npx @anakeen/anakeen-cli extractPo --sourcePath ./ -v
[2020-1-20] [10:13:38] › ▶ po Initialized timer...
[po] › ℹ info No smart element to extract
[po] › ℹ info No enum to extract
[po] › ℹ info No view control to extract
[po] › ℹ info No workflow to extract
[po] › ℹ info Extract Mustache template
[po] › ℹ info Analyze Path: src/**/*.mustache
[po] › ✔ success Write: src/locale/fr/LC_MESSAGES/src/mustache-my-test_fr.po
[po] › ✔ success Write: src/locale/en/LC_MESSAGES/src/mustache-my-test_en.po
[po] › ℹ info No PHP glob
[po] › ℹ info No JS glob
[po] › ℹ info No VUEJS glob
[2020-1-20] [10:13:39] › ◼ po Timer run for: 467ms
[2020-1-20] [10:13:39] › ✔ success po done
# Catalogues Vue.js
Les composants Vue.js peuvent utiliser le mixin AnkI18NMixin
pour récupérer les traductions. Ce mixin est basé sur le
composant vue-i18n. L'utilisation de ce mixin permet de bénéficier de la gestion
des catalogues avec la commande extractPo
.
Les sources des composants Vue.js, qui comportent des traductions, sont indiqués dans la balise
config/po-config/po-vuejs/@source
. L'attribut source
référence un glob pattern, l'attribut target
indique le nom
du fichier produit.
<module:config xmlns:module="https://platform.anakeen.com/4/schemas/module/1.0">
<module:source path="src"/>
<module:po-config>
<module:po-vuejs source="src/vendor/My/**/*.?(vue)" target="my-test"/>
</module:po-config>
</module:config>
L'analyse produit le résultat suivant :
npx @anakeen/anakeen-cli extractPo --sourcePath ./ -v
[2020-1-20] [8:47:17] › ▶ po Initialized timer...
[po] › ℹ info No smart element to extract
[po] › ℹ info No enum to extract
[po] › ℹ info No view control to extract
[po] › ℹ info No workflow to extract
[po] › ℹ info No mustache template to extract
[po] › ℹ info No PHP glob
[po] › ℹ info No JS glob
[po] › ℹ info Extract VUEJS
[po] › ℹ info Analyze VUEJS Path: [fr]src/vendor/Anakeen/**/*.?(vue) : ✓
[po] › ✔ success Write: src/locale/fr/vuejs/src//my-test.json : ✓
[po] › ℹ info Analyze VUEJS Path: [en]src/vendor/Anakeen/**/*.?(vue) : ✓
[po] › ✔ success Write: src/locale/en/vuejs/src//my-test.json : ✓
[2020-1-20] [8:47:17] › ◼ po Timer run for: 163ms
[2020-1-20] [8:47:17] › ✔ success po done
Unicité des clefs de traduction
Les clefs de traduction doivent être uniques pour tous les composants qui utilisent le mixin "AnkI18NMixin". Il est conseillé d'utiliser un préfixe différent pour chacun des composants.
Soit le fichier "src/vendor/My/TestSmartForm/testi18n.vue" :
<template>
<div>
<h1>{{ greeting }} World!</h1>
<p>{{ $t("my.say.hello", { name: "John" }) }}</p>
</div>
</template>
<script>
import AnkI18NMixin from "@anakeen/user-interfaces/components/lib/AnkI18NMixin.esm";
export default {
name: "myTest",
mixins: [AnkI18NMixin],
data() {
return {
greeting: this.$t("my.Hello")
};
}
};
</script>
Asynchronisme
Les composants utilisant le mixin "AnkI18NMixin", sont asynchrones. Il faut donc les déclarer via les promesses d'import.
Cela produit les fichiers src/locale/[fr,en]/vuejs/src//my-test.json
:
{
"my.say.hello": null,
"my.Hello": null
}
Les traductions se font en remplaçant le null
par la chaîne de traduction comme par exemple pour le "fr" :
{
"my.say.hello": "Dit bonjour à {name}.",
"my.Hello": "Bonjour"
}