Navigation

Contactez-nous

Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81

Par Philippe Le Van (@plv) Dernière mise à jour : 06 April 2007

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
zend-translate sur plusieur ligne
Bonjour
Tout d'abord merci pour ce tuto.
Je voudrais savoir si il y a un moyen de faire un traduction d'un paragraphe (sur plusieurs lignes)
Ex:
motClé;ligne1 du paragraphe
           ligne2 du paragraphe
           ....