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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
$this->translate($string);
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.
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
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
 
/**
** Copier/Coller de Zend_Log_Writer_Db modifié
**/
class Ez_Log_Writer_DbTranslator extends Zend_Log_Writer_Abstract
{
/** .../... **/
    /**
     * Write a message to the log.
     *
     * @param  array  $event  event data
     * @return void
     */
    protected function _write($event)
    {
        if ($this->_db === null) {
            require_once 'Zend/Log/Exception.php';
            throw new Zend_Log_Exception('Database adapter is null');
        }
 
        if ($this->_columnMap === null) {
            throw new Zend_Exception('You have to define a columnMap');
//            $dataToInsert = $event;
        } else {
            $dataToInsert = array();
            foreach ($this->_columnMap as $columnName => $fieldKey) {
                $dataToInsert[$columnName] = $event[$fieldKey];
            }
        }
        // Vérifie que la chaine n'existe pas déjà
        $select = $this->_db->select()->from($this->_table)->where(array_search('message', $this->_columnMap).' = ?', $event['message']);
        $result = $this->_db->fetchOne($select);
 
        if (!$result) {
            $this->_db->insert($this->_table, $dataToInsert);
        }
    }
}
Ensuite dans le bootstrap:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
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
 
    protected 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;
    }
La structure des tables:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
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
 
--
-- Structure de la table `translationsSources`
--
 
CREATE TABLE IF NOT EXISTS `translationsSources` (
  `id_translationSource` int(11) NOT NULL auto_increment,
  `date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `location` varchar(255) collate utf8_unicode_ci NOT NULL,
  `source` text collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`id_translationSource`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ;
 
--
-- Contenu de la table `translationsSources`
--
 
INSERT INTO `translationsSources` (`id_translationSource`, `date`, `location`, `source`) VALUES
(4, '2010-02-26 12:00:36', '', 'Unknow String');
 
-- --------------------------------------------------------
 
--
-- Structure de la table `translationsTargets`
--
 
CREATE TABLE IF NOT EXISTS `translationsTargets` (
  `id_translationTarget` int(11) NOT NULL auto_increment,
  `source` int(11) NOT NULL,
  `translation` text collate utf8_unicode_ci NOT NULL,
  `language` varchar(12) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`id_translationTarget`),
  KEY `source` (`source`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;
 
--
-- Contenu de la table `translationsTargets`
--
 
INSERT INTO `translationsTargets` (`id_translationTarget`, `source`, `translation`, `language`) VALUES
(1, 4, 'chaine inconnue', 'fr');
 
--
-- Contraintes pour les tables exportées
--
 
--
-- Contraintes pour la table `translationsTargets`
--
ALTER TABLE `translationsTargets`
  ADD CONSTRAINT `translationsTargets_ibfk_1` FOREIGN KEY (`source`) REFERENCES `translationsSources` (`id_translationSource`) ON DELETE CASCADE ON UPDATE CASCADE;
Ainsi, les chaines non traduites sont stockées en base et peuvent être traduite via une interface d'admin...
J'attend vos avis!