Bonjour à tous!
Suite à quelques traductions introuvables par poedit j'ai cherché à faire un genre de traducteur automatique et je voulais savoir ce que vous en pensiez...
Surtout n'hésitez pas à me reprendre si je dit des bêtises!
En fait habituellement j'utilise Zend_Translate avec 'gettext' et je traduis l'interface avec Poedit. Le problème c'est que poedit ne peut pas traduire des chaines dynamiques. ex:
Poedit cherche à traduire des chaines se trouvant a des endroits précis dans des fichiers. Mais si la chaine se trouve par exemple dans un fichier de config xml ou autre et qu'on souhaite la traduire, ce ne sera pas détecté par poedit et donc non traduit par zend_translate.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
2
Comme Zend_Translate peut logguer les chaines non traduites, je me suis dit que ce serait pratique de les logguer dans une table destinée à être retraduite.
J'ai copié Zend_Log_Writer_Db en le modifiant quelque peu:
Ensuite dans le bootstrap:
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
La structure des tables:
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37protected function _initTranslate() { // Traductin de l'interface par fichiers .po $poTranslate = new Zend_Translate('gettext', APPLICATION_PATH . '/languages', 'fr', array('scan' => Zend_Translate::LOCALE_FILENAME, 'logUntranslated' => false)); // Traductions dynamiques $arrayTranslator = new Zend_Translate('array', $poTranslate->getMessages('fr'),'fr'); // Log to MySql $db = $this->bootstrap('db')->getResource('db'); $writer = new Ez_Log_Writer_DbTranslator($db, 'translationsSources', array('source'=>'message','date' => 'timestamp')); $log = new Zend_Log($writer); $arrayTranslator->setOptions(array( 'log' => $log, 'logMessage' => "%message%", 'logUntranslated' => true)); // Récupérations des chaines déjà traduites $select = $db->select()->from(array('tt'=>'translationsTargets')) ->join(array('ts'=>'translationsSources'), 'tt.source = ts.id_translationSource') ->where('language = ?','fr'); $allTrans = $db->fetchAll($select); $tradList = array(); foreach ($allTrans as $trans) { $tradList[$trans['source']] = $trans['translation']; } $arrayTranslator->addTranslation($tradList, 'fr'); // Exemple de chaine à traduire $string = "Unknow String"; echo $arrayTranslator->translate($string); return $arrayTranslator; }
Ainsi, les chaines non traduites sont stockées en base et peuvent être traduite via une interface d'admin...
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
J'attend vos avis!

 

 
		
		 
        

 
			
			

 
			 
   
 


 Traduire avec une base de données
 Traduire avec une base de données
				
 Répondre avec citation
  Répondre avec citation
Partager