Programmer's Reference Guide
| Adaptateurs pour Zend_Translate |
Utiliser les adaptateurs de traduction
L'étape suivante est d'utiliser l'adaptateur dans votre code.
Exemple #1 Exemple de code PHP monolingue
print "Exemple\n";
print "=======\n";
print "Ceci la ligne une\n";
print "Aujourd'hui nous sommes le " . date("d/m/Y") . "\n";
print "\n";
print "Correction de la langue ceci est la ligne deux\n";
L'exemple ci-dessus montre l'affichage sans le support de traduction. Vous écrivez probablement votre code dans votre langue maternelle. Généralement vous devez traduire non seulement l'affichage, mais également les messages d'erreur et les messages de log.
La prochaine étape est d'inclure Zend_Translate dans votre code existant. Naturellement il est
beaucoup plus facile si vous écrivez dès le début votre code en utilisant Zend_Translate au lieu de
modifier votre code après.
Exemple #2 Exemple de code PHP multilingue
$translate = new Zend_Translate('gettext', '/mon/chemin/source-de.mo', 'de');
$translate->addTranslation('//mon/chemin/fr-source.mo', 'fr');
print $translate->_("Exemple")."\n";
print "=======\n";
print $translate->_("Ceci la ligne une")."\n";
printf($translate->_("Aujourd'hui nous sommes le %1\$s") . "\n", date("d/m/Y"));
print "\n";
$translate->setLocale('fr');
print $translate->_("Correction de la langue ceci est la ligne deux") . "\n";
Maintenant regardons plus attentivement ce qui a été fait et la façon d'intégrer Zend_Translate
dans votre code.
Créer un nouvel objet de traduction et définir l'adaptateur de base :
$translate = new Zend_Translate('gettext', '/chemin/vers/source-de.mo', 'de');
source-de.mo dans le dossier /chemin/vers. Le fichier gettext inclura la
traduction allemande. Et nous avons également ajouté un autre fichier de langue pour le français.
L'étape suivante est d'envelopper toutes les chaînes qui doivent être traduites. L'approche la plus simple est d'avoir seulement des chaînes simples ou des phrases comme celle-ci :
print $translate->_("Exemple")."\n";
print "=======\n";
print $translate->_("Ceci la ligne une")."\n";
Avoir des valeurs de données intégrées dans une chaîne de traduction est également supporté par l'utilisation des paramètres inclus.
printf($translate->_("Aujourd'hui nous sommes le %1\$s") . "\n", date("d/m/Y"));
print(), utiliser la fonction printf() et remplacer tous les paramètres avec
des éléments de type %1\$s. Le premier est %1\$s, le second %2\$s, et ainsi
de suite. De cette façon une traduction peut être faite sans savoir la valeur exacte. Dans notre exemple, la date
est toujours le jour actuel, mais la chaîne peut être traduite sans connaissance du jour actuel.
Chaque chaîne est identifiée dans le stockage de traduction par un identificateur de message. Vous pouvez employer l'identificateur de message au lieu des chaînes dans votre code, comme ceci :
print $translate->_(1)."\n"; print "=======\n"; print $translate->_(2)."\n";
Vous ne pouvez pas voir ce que votre code devrait afficher juste en regardant votre code.
En outre vous obtiendrez des problèmes si certaines chaînes ne sont pas traduites. Vous devez toujours
imaginer comment la traduction fonctionne. Premièrement Zend_Translate vérifie si la langue choisie a
une traduction pour l'identificateur de message ou la chaîne fournie. Si aucune chaîne de traduction n'a été
trouvée, elle se reporte sur la langue suivante comme définie dans Zend_Locale. Ainsi le "de_AT" devient seulement "de". S'il n'y a aucune
traduction n'est trouvée pour le "de", alors le message original est retourné. De
cette façon vous avez toujours un affichage, au cas où la traduction de message n'existerait pas dans votre stockage
des messages. Zend_Translate ne lève jamais d'erreur ou d'exception en traduisant les chaînes.
Structures des sources de traduction
L'étape suivante est la création des sources de traduction pour les multiples langues vers lesquelles vous traduisez. Chaque adaptateur est créé de sa propre manière comme décrit ici. Mais il y a quelques dispositifs généraux qui sont valables pour tous les adaptateurs.
Vous devrez savoir où stocker vos fichiers sources de traduction. Avec Zend_Translate vous
n'êtes lié par aucune restriction. Les structures suivantes sont préférables :
-
Structure de source unique
/application /languages lang.en lang.de /library
Positif : Tous les fichiers sources pour chacune des langues peuvent être trouvés dans un dossier. Aucun fractionnement des fichiers.
-
Source structurée par langue
/application /languages /en lang.en other.en /de lang.de other.de /libraryPositif : chaque langue est située dans un dossier. La traduction est facilitée car un seul dossier doit être traduit par une équipe de langue. En outre l'utilisation de dossiers multiples est transparente.
-
Source structurée par application
/application /languages lang.en lang.de other.en other.dePositif : tous les fichiers sources pour chacune des langues peuvent être trouvés dans un seul dossier. Aucun fractionnement des fichiers.
Négatif : avoir des dossiers multiples pour la même langue est problématique.
-
Source structurée par Gettext
/languages /de /LC_MESSAGES lang.mo other.mo /en /LC_MESSAGES lang.mo other.moPositif : de vieilles sources de gettext peuvent être utiliser sans changer la structure.
Négatif : avoir des dossiers de dossiers peut être embrouillant pour les personnes qui n'ont pas utilisé gettext avant.
-
Source structurée par fichier
/application /models mymodel.php mymodel.de mymodel.en /views /controllers mycontroller.de /document_root /images /styles .htaccess index.php index.de /library /ZendPositif : chaque fichier est lié à sa propre source de traduction.
Négatif : de multiples petits fichiers source de traduction rendent plus dur la traduction. En outre chaque fichier doit être ajouté comme source de traduction.
Les fichiers source uniques et structurés par langue sont les plus utilisés pour
Zend_Translate.
Maintenant, que nous connaissons la structure que nous voulons avoir, nous devons créer nos fichiers sources de traduction.
Créer des fichiers sources de type tableau
Les fichiers source de type tableau sont simplement des tableaux. Mais vous devez les définir manuellement parce qu'il n'y a aucun outil pour cela. Mais parce qu'ils sont si simples, c'est la manière la plus rapide de rechercher des messages si votre code fonctionne comme prévu. C'est généralement le meilleur adaptateur pour démarrer avec des systèmes multilingues.
$english = array('message1' => 'message1',
'message2' => 'message2',
'message3' => 'message3');
$german = array('message1' => 'Nachricht1',
'message2' => 'Nachricht2',
'message3' => 'Nachricht3');
$translate = new Zend_Translate('array', $english, 'en');
$translate->addTranslation($deutsch, 'de');
Depuis la version 1.5 il est également possible d'avoir des tableaux inclus dans un fichier externe. Vous
devez simplement fournir le nom de fichier, Zend_Translate l'inclura automatiquement et recherchera
le tableau. Voir l'exemple suivant pour les détails :
// montableau.php
return array(
'message1' => 'Nachricht1',
'message2' => 'Nachricht2',
'message3' => 'Nachricht3');
// contrôleur
$translate = new Zend_Translate('array', 'chemin/vers/montableau.php', 'de');
Note: Les fichiers qui ne renvoient pas un tableau ne seront pas inclus. N'importe quel rendu issu ce fichier sera ignoré et également supprimé.
Créer des fichiers source Gettext
Des fichiers source Gettext sont créés par la bibliothèque GNU gettext. Il y a plusieurs outils libres disponibles qui peuvent analyser vos fichiers de code et créer les fichiers source nécessaires de gettext. Ces fichiers se termine par *.mo et ce sont des fichiers binaires. Un gratuiciel pour créer ces fichiers est » poEdit. Cet outil vous aide également pour le processus de traduction lui-même.
// Les fichiers mo sont créés et déjà traduits
$translate = new Zend_Translate('gettext', 'chemin/vers/english.mo', 'en');
$translate->addTranslation('chemin/vers/german.mo', 'de');
Comme vous pouvez le voir, les adaptateurs sont utilisés exactement de la même manière, avec juste une
petite différence : changer "array" en "gettext". Toutes autres utilisations sont
exactement les mêmes qu'avec tous autres adaptateurs. Avec l'adaptateur de gettext vous ne devez plus vous
occuper de la structure des répertoires, du "bindtextdomain" et du "textdomain".
Fournissez juste le chemin et le nom de fichier à l'adaptateur.
Note: Vous devriez toujours employer UTF-8 comme source d'encodage. Autrement vous aurez des problèmes si vous employez deux encodages différents. Par exemple, si un de vos fichiers source est encodé en ISO-8815-1 et un fichier différent est codé avec CP815. Vous ne pouvez utiliser qu'un seul encodage pour vos fichiers sources, ainsi une de vos langues ne s'affichera probablement pas correctement.
UTF-8 est un format portable qui supporte toutes les langues. Si vous employez l'encodage UTF-8 pour toutes les langues, vous éliminez le problème des encodages incompatibles.
Many gettext editors add adapter informations as empty translation string.
This is the reason why empty string are not translated when using the
gettext adapter. Instead they are erased from the translation table and
provided by the getAdapterInfo() method. It will return
the adapter informations for all added gettext files as array where the
filename is used as key.
// How to get the adapter informations
$translate = new Zend_Translate('gettext', 'path/to/english.mo', 'en');
print_r $translate->getAdapterInfo();
Créer des fichiers source TMX
Les fichiers sources TMX sont les nouveaux standard industriels. Ils ont l'avantage d'être des fichiers XML et ainsi ils sont lisibles par tout éditeur de fichier et naturellement ils sont lisibles pour l'homme. Vous pouvez soit créer des fichiers TMX manuellement avec un éditeur de texte, soit utiliser un outil. Mais la plupart des programmes actuellement disponibles pour développer des fichiers source TMX ne sont pas des gratuiciels.
Exemple #3 Exemple de fichier TMX
<?xml version="1.0" ?> <!DOCTYPE tmx SYSTEM "tmx14.dtd"> <tmx version="1.4"> <header creationtoolversion="1.0.0" datatype="winres" segtype="sentence" adminlang="en-us" srclang="de-at" o-tmf="abc" creationtool="XYZTool" > </header> <body> <tu tuid='message1'> <tuv xml:lang="de"><seg>Nachricht1</seg></tuv> <tuv xml:lang="en"><seg>message1</seg></tuv> </tu> <tu tuid='message2'> <tuv xml:lang="en"><seg>message2</seg></tuv> <tuv xml:lang="de"><seg>Nachricht2</seg></tuv> </tu>
$translate = new Zend_Translate('tmx', 'chemin/vers/mytranslation.tmx', 'en');
// TMX peut contenir différentes langues dans le même fichier
Les fichiers TMX peuvent avoir plusieurs langues dans le même fichier. Toutes autres langues incluses sont
ajoutées automatiquement, ainsi vous n'avez pas à appeler addLanguage().
Si vous voulez avoir seulement les langues spécifiées de la source traduite, vous pouvez régler l'option
defined_language à true. Avec cette option vous pouvez ajouter les langues souhaitées
explicitement avec addLanguage(). La valeur par défaut pour cette option est d'ajouter toutes les
langues.
Créer des fichiers source CSV
Les fichiers source CSV sont petits et lisibles pour l'homme. Si vos clients veulent eux-mêmes traduire, vous utiliserez probablement l'adaptateur CSV.
Exemple #4 Exemple avec un fichier CSV
#Exemple de fichier csv message1;Nachricht1 message2;Nachricht2
$translate = new Zend_Translate('csv', 'chemin/vers/matraduction.csv', 'de');
$translate->addTranslation('chemin/vers/autretraduction.csv', 'fr');
Il existe trois options différentes pour l'adaptateur CSV. Vous pouvez paramétrer
"delimiter", "limit" et "enclosure".
Le délimiteur standard des fichiers CSV est le signe ";". Mais celui-ci n'est pas
obligatoire. Avec l'option "delimiter" vous pouvez décider d'utiliser un autre signe de
séparation.
La taille limite d'une ligne de fichier CSV est par défaut "0" Ce qui veut dire que la fin de
la ligne est recherchée automatiquement. Si vous paramétrez l'option "limit" avec une valeur
quelconque, alors le fichier CSV sera lu plus rapidement, mais toute ligne dont la longueur excédera la limite
sera tronquée.
"L'échappement" par défaut d'un fichier CSV est le """. Vous pouvez en paramétrer un autre
avec l'option "enclosure".
Exemple #5 Exemple avec un fichier CSV (2)
#Exemple de fichier csv # original 'message,1' "message,1",Nachricht1 # traduction 'Nachricht,2' message2,"Nachricht,2" # original 'message3,' "message3,",Nachricht3
$translate = new Zend_Translate('csv', 'chemin/vers/matraduction.csv', 'de', array('delimiter' => ','));
$translate->addTranslation('chemin/vers/autretraduction.csv', 'fr');
Créer des fichiers source INI
Les fichiers source INI sont lisibles par l'homme mais habituellement pas très petits puisqu'ils incluent également d'autres données à côté des traductions. Si vous avez des données qui seront éditables par vos clients, vous pouvez aussi utiliser l'adaptateur INI dans ce cas.
Exemple #6 Exemple avec un fichier INI
[Test] ;Commentaires possibles Message_1="Nachricht 1 (de)" Message_2="Nachricht 2 (de)" Message_3="Nachricht :3 (de)"
$translate = new Zend_Translate('ini', 'path/to/mytranslation.ini', 'de');
$translate->addTranslation('path/to/other.ini', 'it');
Les fichiers INI ont de multiples restrictions. Si une valeur dans le fichier INI contient un caractère
non-alphanumérique, il doit être entouré avec des guillemets doubles ("). Il y a aussi des mots réservés qui ne
doivent pas être utilisés en tant que clés des fichiers INI. Ceci inclue : null, yes,
no, true et false. Les valeurs null, no et
false sont retournées sous la forme "". yes et true sont retournés en
"1". Les caractères {}|&~