Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Je rencontre actuellement un problème avec l'utilisation de Zend_Translate. Ce que je souhaite c'est pouvoir charger plusieurs fichiers de traductions pour une même langue. Concrètement pour chaque langue je souhaite avoir :
- Un fichier de traduction pour tout ce que je considère comme commun (bonjour, formatage date, ...) (variable $translateCommonFile)
- Un fichier de traduction pour toutes les chaines d'erreurs (Standard ZF) remontées lors de l'utilisation de Zend_Form (variable $translateFormFile)
- Un fichier de traduction propre à chaqu'un de mes modules (variable $translateModuleFile)
Voici mon code (sachant que bien avant le cache est activé)
$translate = new Zend_Translate('xliff', $translateCommonFile);
$translate->addTranslation($translateFormFile, $locale, array('clear'=>false));
$translate->addTranslation($translateModuleFile, $locale, array('clear'=>false));
Mon problème est que si je fait un print_r de $translate seules les traduction de $translateModuleFile sont prises en compte alors que je devrais normalement avoir un tableau avec les traduction de mes 3 fichiers.
Si quelqu'un a une idée cela m'intéresse.
Merci
Cédric Déserville
Hors ligne
Pour info, de mon coté avec le cache désactivé :
J'ai dans mon bootstrap
Zend_Registry::set('Zend_Translate', new Zend_Translate('tmx', COMMON_I18N_DIR, 'fr') );
et dans une classe dérivant de Zend_Controller_Action, que j'utilise partout après, j'ai :
public function init(){ $this->_translate = Zend_Registry::get('Zend_Translate') ->addTranslation(MODULES_DIR .$this->_request->getModuleName().'/i18n/'); }
Les informations communes et celles du modules sont correctement chargées.
Désactive le cache pour voir si cela ne vient pas de la
Hors ligne
Bonjour, merci pour la réponse. Après avoir effectué pas mal de recherche / test, j'ai constaté un bug dans la classe Zend_Translate_Adapter_Xliff qui résulte en un reset systèmatique des données de traduction précedemment chargées.
J'ai d'ailleurs ouvert un ticket sur Zend - http://framework.zend.com/issues/browse/ZF-5534
Cordialement.
Hors ligne
Hello,
je rencontre le même problème depuis que j'ai mis en place le cache, sauf que j'utilise un adaptateur TMX.
Voilà un exemple d'un de mes fichiers TMX
<?xml version="1.0" encoding="UTF-8"?> <tmx version="1.4"> <header creationtoolversion="0.0" datatype="plaintext" segtype="sentence" adminlang="EN" srclang="*all*" [b]aussi testé avec srclang="en_US*" [/b] o-tmf="abc" creationtool="SageTool" /> <body> <tu tuid='new-order'> <tuv xml:lang="en_US"><seg>New Order</seg></tuv> <tuv xml:lang="fr_CH"><seg>Nouvelle Commande</seg></tuv> <tuv xml:lang="it_IT"><seg>Nuova Ordine</seg></tuv> <tuv xml:lang="de_DE"><seg>Neue Bestellung</seg></tuv> </tu> <tu tuid='last-order'> <tuv xml:lang="en_US"><seg>Last Order</seg></tuv> <tuv xml:lang="fr_CH"><seg>Dernière Commande</seg></tuv> <tuv xml:lang="it_IT"><seg>Ultima Ordine</seg></tuv> <tuv xml:lang="de_DE"><seg>Letzte Bestellung</seg></tuv> </tu> .... </body> </tmx>
Ici le code sans cache:
$locale = new Zend_Locale('en_US'); Zend_Registry::set('Zend_Locale', $locale); ... $translate = new Zend_Translate('tmx', APP_ROOT . '/locale', $locale); $test = new Zend_Session_Namespace('session'); $langLocale = isset($test->lang) ? $test->lang : $locale; $translate->setLocale($langLocale); Zend_Registry::set('Zend_Translate', $translate);
Quand je veux afficher la liste des languages disponibles :
(Zend_Debug::dump($translate->getAdapter()->getList())
J'ai :
array(4) {
["en_US"] => string(5) "en_US"
["fr_CH"] => string(5) "fr_CH"
["it_IT"] => string(5) "it_IT"
["de_DE"] => string(5) "de_DE"
}
mais avec le cache mis en place:
$frontendOptions = array( 'lifetime' => 3600, 'automatic_serialization' => true ); $cache = Zend_Cache::factory('Core', 'Zend Platform', $frontendOptions); ... $locale = new Zend_Locale('en_US'); Zend_Registry::set('Zend_Locale', $locale); ... Zend_Translate::setCache($cache); $translate = new Zend_Translate('tmx', APP_ROOT . '/locale', $locale); $test = new Zend_Session_Namespace('session'); $langLocale = isset($test->lang) ? $test->lang : $locale; $translate->setLocale($langLocale); Zend_Registry::set('Zend_Translate', $translate);
J'obtiens:
array(4) {
["en_US"] => string(5) "en_US"
}
Après avoir relu plusieurs fois le manuel, je crois qu'il y a des "erreurs":
ici
Les fichiers TMX peuvent avoir plusieurs langues dans le même fichier. Toute autre langue incluse est ajoutée 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.
Le seul moyen que j'ai trouvé pour avoir toutes mes sources de traduction est d'ajouter les trois autres langues après avoir instancié l'objet Zend_Translate...
... $translate->getAdapter()->addTranslation(APP_ROOT . '/locale', 'fr_CH'); $translate->getAdapter()->addTranslation(APP_ROOT . '/locale', 'de_DE'); $translate->getAdapter()->addTranslation(APP_ROOT . '/locale', 'it_IT'); ...
Mais de cette manière le fichier est parcouru 4 fois au lieu de 1 seul (sans le cache).
Je ne sais vraiment pas si cette erreur provient du framework ou si je ne rien compris à l'utilisation.
Meilleures salutations,
Nicolas
Hors ligne
N'associe pas de suite la locale avec Zend_Translate.
Ne fais :
$oTranslate->setLocale($oLocale);
qu'au tout dernier moment.
Tu devrais ainsi avoir toutes les traductions
Hors ligne
Je ne peux pas associer la locale à zend_Translate "plus tard", c'est déjà la dernière ligne avant de le poser en registre.
L'erreur pourrait provenir alors de cette instruction:
Zend_Registry::set('Zend_Locale', $locale);
Car tous les objets ayant une méthode setLocale() l'utilise implicitement quand l'objet Zend_Locale est défini en registre.
J'ai commenté cette instruction en gardant le même constructeur:
$translate = new Zend_Translate('tmx', APP_ROOT . '/locale', $locale);
là ça ne fonctionne tjs pas. Et changeant l'instanciation comme suit:
$translate = new Zend_Translate('tmx', APP_ROOT . '/locale');
Les notices suivantes apparaissent:
Notice: No translation for the language 'fr' available. in C:\www\myApp\library\Zend\Translate\Adapter.php on line 317
Notice: The language 'en_US' has to be added before it can be used. in C:\www\myApp\library\Zend\Translate\Adapter.php on line 306
Notice: No translation for the language 'en' available. in C:\www\myApp\library\Zend\Translate\Adapter.php on line 317
Hors ligne
Le problème est réglé !!! Merci à ndesaleux, cela tournait effectivement autour de l'affectation des locales.
donc voilà le code modifié:
... Zend_Locale::setCache($cache); $test = new Zend_Session_Namespace('session'); $langLocale = isset($test->lang) ? $test->lang : new Zend_Locale('en_US'); Zend_Registry::set('Zend_Locale', new Zend_Locale($langLocale)); ... Zend_Translate::setCache($cache); $translate = new Zend_Translate('tmx', APP_ROOT . '/locale'); Zend_Registry::set('Zend_Translate', $translate); ...
Par contre ça règle pas le souci de la fameuse méthode addLanguage() citée dans le manuel et qui n'existe pas dans l'API
Dernière modification par Nicolas Milesi (04-03-2009 09:38:41)
Hors ligne
Pages: 1