Index
Documentation Générale Qualité
Documentation Classes Metier
Documentation Liste Qualité Code Review
Documentation Liste Qualité Guideline Development
Documentation Bugs Defaults
Documentation Tests Unitaires
Documentation i18n
Documentation SQL Indexation
Documentation Timeframe

GESTION DES I18N (Internationalisation)

Date

Par

Quoi

Version

08/09/2023

MB

Création

0.0.1

28/09/2023

MB

Ajout de “Qualité des textes d’origine en Français avant traduction”

0.0.2

03/10/2023

MD

Restructuration section  ajout d’une nouvelle traduction

0.0.3

04/10/2023

MD

Restructuration de la section Récupération d’une traduction

0.0.4

16/10/2023

MB

Ajout “Notes de mise en forme”

0.0.5

06/12/2023

MB

Mise en avant en rouge des précautions et ajout lien vers gestion traductions en admin

0.0.6

Procédure générale de traduction        2

Ajout d’une nouvelle traduction        2

Récupération/Utilisation d’une traduction existante        3

Instanciation de la classe Internationalisation        3

Notes technique traduction        3

Usage de la classe internationalisation        3

Notes de mise en forme        4

Mis en forme des nombres        4

Mis en forme des fichiers XLS ou CSV        4


Procédure générale de traduction

Ajout d’une nouvelle traduction

Avant même d’ajouter une nouvelle traduction, il faut impérativement vérifier si elle n’existe pas déjà dans la table internationalisation. On peut la chercher par la ref qu’on pense mettre, ou encore par le texte qu’on l’on souhaite traduire pour voir s’il ne possède pas déjà une ref différente de celle qu’on a pensé.

Pensez à utiliser l’interface de gestion des traductions en admin : admin/?page=traductions&default=1

Pour insérer une nouvelle traduction dans la table internationalisation, il faut renseigner l’interface, la langue, la ref et le texte.

L’interface peut prendre les valeurs suivantes : admin, consultants, clients ou commun.

Si votre traduction est très générique et sera réutilisée dans plusieurs interfaces, il faut mettre l’interface commun. Exemple : la traduction de “Oui” qui est très générique.

Sinon si la traduction est assez spécifique à une interface alors il faut préciser dans quelle interface on souhaite qu’elle soit disponible.

Exemple : la traduction de “Créer un client” sera qu’en admin car il s’agit d’une action réalisable uniquement en admin. Il faut donc mettre l’interface admin.

En cas de doute sur l’interface ou sur une ref, il ne faut pas hésiter à demander pour en discuter.

Le code de la langue doit être au format ISO 639-1 et correspondre à une langue présente dans la table langue. Les nouvelles traductions doivent être ajoutées pour toutes les langues.

La ref doit être en français, en minuscule, sans accent, sans espace, sans caractère spéciaux (-, _, &, etc.) et ne doit pas dépasser les 48 caractères de longueur.

Exemple : datefincontrat serait la ref pour le texte Date fin de contrat

Le texte français initial qui sera traduit dans toutes les langues doit être d’une certaine qualité, surtout quand il s’agit de textes à l’intention de l’utilisateur final. Les textes sont très importants. Ils participent à la compréhension de l’application. Ainsi, un bon texte, cohérent, facilitera la compréhension des outils de l’application et donnera une image de stabilité et fiabilité à l’application.

Exemple : Pour un texte d’erreur à afficher en cas de mauvaise saisie d’un prénom, le développeur pourrait mettre “Le prénom est invalide”, or il est préférable de mettre “Veuillez saisir un prénom valide”.

Il faut aussi faire attention à la différence de longueur des traductions. En effet, une traduction en anglais “views” sera plus courte qu’un de ses équivalents français “consultations”. Voir La taille des textes dans les traductions pour plus de détail. Une telle différence de taille peut casser une mise en page. Si c’est le cas, il faut chercher une traduction équivalente moins longue ou, dans le pire des cas, une abréviation.

Bien ajouter les requêtes SQL de la nouvelle traduction dans le fichier SQL de upgradeFromMaser qui correspond au projet. Il est possible que le fichier existe déjà. Dans ce cas, il faut le compléter.

Récupération/Utilisation d’une traduction existante

Pour l’utilisation des traductions qui sont déjà existantes, nous avons créé un classe de traduction Internationalisation.php située dans le répertoire src/internationalisation/Internationalisation.php.

!Attention si vous devez changer une référence ou changer une référence d’interface, vérifiez bien ses usages dans tout le code pour éviter de créer un bug de traduction.

Instanciation de la classe Internationalisation

Pour être utilisée, cette classe doit être instanciée. La classe Internationalisation est un singleton, et possède donc une fonction getInstance() pour en récupérer une instance.

La fonction getInstance() attend 3 paramètres :

Exemple de récupération d’instance pour l’interface admin

$i18n = Internationalisation::getInstance($dbConnect, Config::param('langue'), 'admin');

Notes technique traduction

Usage de la classe internationalisation

//Traduire une clef simple

$_i18n->translate('datedemarragemini');

//Traduire une clef avec variables > Mon test %%1%%, %%2%% [Non recommandé]

//Par défaut les clefs sont %%1%%, %%2%% etc…permet de gérer l’ordre des mots mais au niveau des traductions , le fait que les variables soient anonymes (%%1%%,%%3%% au lieu de clef qui ont du sens %%couleur%% %%température) rend les traductions difficiles pour le traducteur (dans la future interface de gestion internationalisation).

$_i18n->translateParams('test_param1', ['abcd', 'efgh'] );

//Traduire avec variable en précisant les clefs variables template > permet de gérer l’ordre des mots selon les langues de manière plus claire pour le traducteur.

$_i18n->translateParams('test_param2', ['1234', '5678'], ['%%val1%%', '%%val2%%'] );
//Exemple :

clef typevehiculecouleur = “la %%type_vehicule%% %%couleur%%”  en FR

clef typevehiculecouleur = “the %%couleur%%  %%type_vehicule%%”  en EN

$_i18n->translateParams(typevehiculecouleur , [$_i18n->translate('blue'), $_i18n->translate('car’')], ['%%couleur%%', '%%type_vehicule%%'] );

Notes de mise en forme

Mis en forme des nombres

Les nombres doivent être mis en forme selon les langues (les séparateurs changent). Exemple :

$numbersMetier->getFormatedNumberByCodeLangue($infos_facture->total_ht(), Config::param('langue');

Mis en forme des fichiers XLS ou CSV

Aucune mise en forme de nombre ou de date dans les fichiers XLS/CSV (c’est le logiciel client qui gère en fonction de la langue de l’utilisateur). Excel c’est avant tout un outil de gestion. Si on lui passe des strings formatées au lieu de nombres, les calculs ne fonctionnent pas. Pour tester, ouvrez Excel (ou open office) et tester une somme par exemple.

Par contre, il y a des méthodes spécifiques à PHPSPREADSHEET qui sont présentes dans les fichiers de download et qui permettent de préciser le format, exemple $sheet->getStyleByColumnAndRow(7, $offset)->getNumberFormat()->setFormatCode('#,##0.00');

A NE PAS FAIRE : $sheet->setCellValueExplicitByColumnAndRow(7, $offset, $numbersMetier->getFormatNumberByCodeLangue($infos_facture->total_ht(), Config::param('langue')), PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);

A FAIRE :  $infos_facture->total_ht() tout simplement[a]

[a]Que faire si le format du montant de la facture n'est pas dans un format géré par Excel ? Ne faudrait-il pas forcer un format géré par Excel ?