# 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 :

  1. Le libellé de l'état graph/steps/step/@state-label
  2. Le libellé de l'activité graph/steps/step/@activity-label
  3. 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 :

  1. Le libellé de l'état : contexte : <graph/@name>:state, id <step/@name>
  2. Le libellé de l'activité <graph/@name>:activity, id <step/@name>
  3. 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 :

  1. Le libellé de la Smart Structure config/structure-configuration/@label
  2. Le libellé des Smart Field config/structure-configuration/fields/**/field-*/@name
  3. 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 :

  1. Le libellé de la Smart Structure : contexte : config/structure-configuration/@name id : "title"
  2. Le libellé des Smart Field contexte : config/structure-configuration/@name, id : config/structure-configuration/parameters/**/field-*/@name
  3. 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 :

  1. 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 :

  1. 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 :

  1. 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 :

  1. 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"
}