Contactez-nous
Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81
Tutorial Zend_Translate et Zend_Locale
Introduction
Si vous voulez faire un site un plusieurs langues, vous devez pouvoir faire quelques opération plus complexes qu'il n'y parraissent au départ :
- déterminer la langue du navigateur
- traduire les pages
- traduire les messages d'erreurs
- permettre à l'internaute de changer de langue
La fonction de base proposée par le ZF pour les sites en plusieurs langues est Zend_Locale. Elle est ensuite utilisée dans de nombreuses classes comme Zend_Date ou Zend_Translate pour afficher une date ou un message dans la bonne langue.
Ce tutoriel montre un exemple d'utilisation simple de Zend_Translate en conjonction avec Zend_Locale.
Nous avons utilisé des fichiers CSV pour les traductions parce que c'est plus simple à manipuler. Ca n'est pas forcément idéal pour un projet réel parce qu'on ne peut pas avoir de messages sur plusieurs lignes et que les outils de traductions traditionnels génèrent plutot les formats gettext ou xliff (parfois TMX).
Etapes du tutoriel
Ce tutoriel explique le script PHP pas à pas et suit le plan suivant :
- création des fichiers CSV
- initialisation du ZF
- création des locales (Zend_Locale)
- création des traductions (initialisation Zend_Translate)
- utilisation du traducteur
Fichiers CSV de traduction
Voilà ci-dessous le fichier translate_fr.csv.
Je vous laisse le soin de créer le translate_en.csv dans le même répertoire. (attention, pas d'espace avant le ";" sinon la clé n'est pas retrouvée).
Notons également qu'il ne faut pas de ";" dans la traduction... pour l'instant ça n'est pas bien géré. La correction est prévue pour le lot 1.0 RC1 (cf bug ZF-1208)
msg1;le premier message kitpages.msg2;un message avec une clé compliquée clé3;la 3ème clé
Initialisation du ZF
Rien de bien révolutionnaire...
Vos fichiers CSV doivent être dans le répertoire défini dans CSV_DIR
<?php set_include_path( ".;". "C:/phplib/ZendFramework/library;". get_include_path() ); define("CSV_DIR","C:/translation"); require_once 'Zend/Loader.php'; ?>
Initialisation de différentes locales
On crée plusieurs locales :
- la première issue du language du navigateur (note : si votre navigateur n'est ni en français ni en anglais, il manquera le fichier de traduction...)
- la 2e est en français
- la 3e est en anglais
<?php Zend_Loader::loadClass("Zend_Locale"); $locale = new Zend_Locale(Zend_Locale::BROWSER); $localeFr = new Zend_Locale("fr"); $localeEn = new Zend_Locale("en"); ?>
Initialisation du traducteur
On crée un traducteur et on ajoute des traductions pour chaque langue du site.
<?php Zend_Loader::loadClass("Zend_Translate"); $translate = new Zend_Translate( 'csv', CSV_DIR.'/translate_fr.csv', 'fr'); $translate->addTranslation( CSV_DIR.'/translate_en.csv', 'en'); ?>
Utilisation du traducteur
Voilà un exemple d'utilisation avec les 3 locales définies au début
<?php $keyList = array( "msg1", "kitpages.msg2", "clé3" ); $translate->setLocale($locale->getLanguage()); echo "BROWSER<br/>"; foreach ($keyList as $key) { $tr = $translate->translate($key); echo "key=$key => traduction=$tr<br/>"; } $translate->setLocale($localeFr->getLanguage()); echo "FRANCAIS<br/>"; foreach ($keyList as $key) { $tr = $translate->translate($key); echo "key=$key => traduction=$tr<br/>"; } $translate->setLocale($localeEn->getLanguage()); echo "ANGLAIS<br/>"; foreach ($keyList as $key) { $tr = $translate->translate($key); echo "key=$key => traduction=$tr<br/>"; } ?>
Conclusion
Créez les CSV et mettez tous les codes PHP à la suite dans un fichier, ça devrait marcher directement.
Changez la langue de votre navigateur pour voir l'impact.
Si vous utilisez des CSV en UTF-8 il n'y a pas de raison pour que le chinois, le russe ou ou n'importe quelle langue à caractères non communs dans nos contrées ne fonctionne pas... (je n'ai pas testé)
N'hésitez pas à me signaler dans les commentaire tout passage peu clair ou erroné.
Commentaires
Ajouter un commentaire