Question

Je et application existante dans CakePHP avec une base de données. La tâche est d'appliquer à traduire le comportement de ses modèles. Le problème est que le script crée juste i18n.php table _i18n mais ne copie pas les données existantes à ce tableau. Ne savez-vous pas un script qui pourrait le faire? Merci pour toute aide.

Était-ce utile?

La solution

Pour autant que je sache, il n'y a aucun moyen de le faire. De plus, à cause de la façon dont la table i18n est configuré pour fonctionner, je pense qu'il ya une meilleure solution. Un peu en arrière, je l'ai écrit un patch pour le qui vous le comportement Translate évitera d'avoir à copier les données existantes dans la table i18n (qui me sentir incroyablement redondant et était un énorme obstacle à la mise en œuvre i18n). Si aucun enregistrement pour ce modèle existe dans la table i18n, il suffit de lire le dossier du modèle lui-même comme solution de repli.

Malheureusement, l'équipe de gâteau semble avoir déplacé tout à de nouveaux systèmes, donc je ne peux plus trouver soit le billet ou le patch que je soumettais. Ma copie corrigée de l'est dans mon comportement Translate dépôt Codaset http://codaset.com/robwilkerson/scratchpad/source/master/blob/cakephp/behaviors/translatable.php .

Comme on pouvait s'y attendre, tous les avertissements habituels s'appliquent. Le fichier a été développé pour patché 1.2.x et travaille pour mes besoins, par YMMV .

Autres conseils

Je tendis les réponses de Aziz et MarcoB et créé un CakeShell encore plus générique hors de lui.

Dans simplement la méthode _execute() défini quelque chose comme:

$this->_regenerateI18n('BlogPosts', array('title'), 'deu');

Et toutes les entrées du BlogPosts modèle pour le titre de colonne dans la deu linguistique sera créer dans la table i18n.

Ceci est CakePHP 2.4 compatible!

<?php 

class SetuptranslationsShell extends AppShell {

    public function main() {
        $selection = $this->in('Start to create translated entries?', array('y', 'n', 'q'), 'y');
        if (strtolower($selection) === 'y') {
            $this->out('Creating entries in i18n table...');
            $this->_execute();
        }
    }

    function _execute() {
        $this->_regenerateI18n('BlogPosts', array('title'), 'deu');
        $this->_regenerateI18n('BlogTags',  array('name'),  'deu');
    }

    /**
     * See http://stackoverflow.com/q/2024407/22470
     * 
     */
    function _regenerateI18n($Model, $fields = array(), $targetLocale) {

        $this->out('Create entries for "'.$Model.'":');

        if (!isset($this->$Model)) {
            $this->{$Model} = ClassRegistry::init($Model);
        }

        $this->{$Model}->Behaviors->disable('Translate'); 
        $out = $this->{$Model}->find('all', array(
                                                    'recursive' => -1, 
                                                    'order'     => $this->{$Model}->primaryKey, 
                                                    'fields'    => array_merge(array($this->{$Model}->primaryKey), $fields))
                                                    );

        $this->I18nModel = ClassRegistry::init('I18nModel');

        $t = 0;
        foreach ($out as $v) {

            foreach ($fields as $field) {
                $data = array(
                    'locale'        => $targetLocale,
                    'model'         => $this->{$Model}->name,
                    'foreign_key'   => $v[$Model][$this->{$Model}->primaryKey],
                    'field'         => $field,
                    'content'       => $v[$Model][$field],
                );


                $check_data = $data;
                unset($check_data['content']);
                if (!$this->I18nModel->find('first', array('conditions' => $check_data))) {
                    if ($this->I18nModel->create($data) AND $this->I18nModel->save($data)) {
                        echo '.';
                        $t++;
                    }
                }
            }
        }
        $this->out($t." entries written");
    }
}

essayer de l'utiliser

function regenerate()
{
    $this->Article->Behaviors->disable('Translate'); 
    $out = $this->Article->find('all', array('recursive'=>-1, 'order'=>'id'));
    $t = $b = 0;
    foreach($out as $v){
        $title['locale'] = 'aze';
        $title['model'] = 'Article';
        $title['foreign_key'] = $v['Article']['id'];
        $title['field'] = 'title';
        $title['content'] = $v['Article']['title'];
        if($this->Article->I18n->create($title) && $this->Article->I18n->save($title)){
            $t++;
        }
        $body['locale'] = 'aze';
        $body['model'] = 'Article';
        $body['foreign_key'] = $v['Article']['id'];
        $body['field'] = 'body';
        $body['content'] = $v['Article']['body'];
        if($this->Article->I18n->create($body) && $this->Article->I18n->save($body)){
            $b++;
        }
    }
}

Merci Aziz. J'ai modifié votre code pour l'utiliser dans le cakeshell
(CakePHP 2.3.8)

function execute() {
    $this->out('CORE_PATH: '. CORE_PATH. "\n");
    $this->out('CAKEPHP_SHELL: '. CAKEPHP_SHELL. "\n");

    $this->out('Migrate BlogPosts');
    $this->regenerateI18n('BlogPost', 'title', 'BlogPostI18n');
}
/**
 * @param string $Model 
 * @param string $Field
 * @param string $ModelI18n
 */
function regenerateI18n($Model = null, $Field = null, $ModelI18n = null)
{
    if(!isset($this->$Model))
        $this->$Model = ClassRegistry::init($Model);
    if(!isset($this->$ModelI18n))
        $this->$ModelI18n = ClassRegistry::init($ModelI18n);

    $this->$Model->Behaviors->disable('Translate'); 
    $out = $this->$Model->find('all', array('recursive'=>-1, 'order'=>'id'));
    $t = 0;
    foreach($out as $v){
        $data = array(
            'locale' => 'deu',
            'model' => $this->$Model->name,
            'foreign_key' => $v[$Model]['id'],
            'field' => $Field,
            'content' => $v[$Model][$Field],
        );
        if($this->$ModelI18n->create($data) && $this->$ModelI18n->save($data)){
            echo '.';
            $t++;
        }
    }
    $this->out($t." Entries written");
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top