Je sais que cette question est ancienne, mais comme elle est restée sans réponse et que j'ai eu du mal à la résoudre, voici mes deux cents :
scope, Cakephp 1.3.
tout d'abord, vous avez besoin d'un enregistrement i18n pour chaque champ -> enregistrement -> modèle dans votre application, bien sûr seulement les modèles avec le comportement Translate et seulement pour les champs spécifiés, donc oui, vous vous retrouverez avec un contenu dupliqué à la fois dans les champs réels du modèle et dans la table i18n.
En outre, vous devez disposer de traductions existantes pour toutes les langues que vous spécifiez pour que les méthodes de recherche puissent retourner quelque chose. Cette question m'a laissé perplexe, car j'ai également ajouté le comportement de traduction à un projet déjà développé, avec des tonnes de données. En fait, j'ai créé une méthode de synchronisation afin de créer chaque traduction pour chaque champ de chaque modèle avec le comportement translate. Si j'ajoute une nouvelle langue à l'avenir, je devrai l'exécuter à nouveau.
Voici le code pour cela :
$locales = array( 'spa', 'eng', 'por' );
$models = array( 'Event', 'News', 'Promotion', 'Shop', 'ShopCategory' );
foreach ( $models as $model )
{
$this->loadModel( $model );
$records = $this->{$model}->find( 'all', array(
'fields' => array( "*" ),
'contain' => FALSE
) );
$fields = $this->{$model}->actsAs['Translate'];
foreach ( $records as $record )
{
foreach ( $fields as $field )
{
foreach ( $locales as $locale )
{
$content = mysql_real_escape_string( $record[$model][$field] );
$this->{$model}->query( "INSERT INTO `i18n` (`locale`, `model`, `foreign_key`, `field`, `content`) VALUES('{$locale}', '{$model}', '{$record[$model]['id']}', '{$field}', '{$content}');" );
}
}
}
}
Conseil : créez un index unique dans la table i18n avec les clés locale, model, foreign_key et field.
Ainsi, maintenant que mes données d'origine sont répliquées dans toutes les langues, je dois être en mesure de créer de nouveaux enregistrements avec une langue donnée. Le problème est que si je crée un nouvel enregistrement en anglais, je devrais pouvoir le mettre à jour en espagnol, mais comme il n'y a pas d'enregistrement i18n pour l'espagnol, je ne peux pas voir l'enregistrement dans mon CMS et je ne peux pas le modifier. La façon dont j'ai résolu ce problème est de créer des enregistrements i18n pour chaque langue lors de la création de nouveaux enregistrements, mais de n'utiliser que la langue actuelle lors de l'édition des enregistrements.
J'ai utilisé cette modification pour le comportement de Translate : http://bin.cakephp.org/view/1939852942
Mais la plupart des exemples avec cette modification echo $this->Form->input('nom.eng') ; echo $this->Form->input('nom.spa') ; echo $this->Form->input('description.eng') ; echo $this->Form->input('description.spa') ;
Je trouve cela ennuyeux, donc j'ai créé une fonction d'aide dans app_controller pour convertir les champs traduisibles en cette structure de données :
function _expandLocalizations( $data )
{
foreach ( $data as $modelName => $modelData )
{
if ( !isset( $modelData[$this->{$modelName}->primaryKey] ) )
{
foreach ( $this->{$modelName}->actsAs['Translate'] as $field )
{
$translations = array();
foreach ( $this->languages as $language )
{
$translations[$language] = $this->data[$modelName][$field];
}
$data[$modelName][$field] = $translations;
}
}
}
return $data;
}
et dans chaque méthode d'ajout :
if ( !empty( $this->data ) )
{
$this->News->set( $this->data );
if ( $this->News->validates() )
{
$this->News->create();
$data = $this->_expandLocalizations( $this->data );
$saved = $this->News->save( $data );
if ( $saved )
{
De cette façon, je peux utiliser les formulaires traditionnels et je n'ai pas besoin de modifier la vue si j'ajoute de nouvelles langues. J'ai besoin de modifier la méthode d'ajout traditionnelle car j'ai besoin des données soumises pour la validation, mais des données modifiées pour la sauvegarde.
Enfin, j'ai suivi ces étapes pour changer la langue dans le site/admin : http://nuts-and-bolts-of-cakephp.com/2008/11/28/cakephp-url-based-language-switching-for-i18n-and-l10n-internationalization-and-localization/
En gros, c'est ça. 1. Vous créez des traductions pour chaque donnée que vous avez déjà dans la BD, chacune étant copiée dans chaque langue. 2. Vous créez chaque traduction pour les nouveaux enregistrements à la création, toutes avec la même valeur bien sûr. 3. Modifiez chaque enregistrement dans la traduction sélectionnée.