Traduzione testi di numerosi prodotti

Dunque se vogliamo far le traduzioni di un programma la via tipica in yii è usare Yii::t().

Che sia su file o db, finché si tratta dei testi dei menu, piuttosto che dei titoli delle pagine mi va anche bene come metodo.

Non mi pare però ottimale per le schede dei prodotti (titolo e testo descrittivo). Parlo di siti con > 10.000 prodotti. Caricare un file con > 20.000 testi per caricare una pagina dove ne mostro 2 non è il massimo in termini prestazionali.

Io quindi avevo ipotizzato di fare tabella prodotti_dati (altezza, peso, prezzo, foto, ecc) e prodotti_traduzioni (lingua, titolo, testo).

Gestire questa "doppia tabella" in yii non è una delle cose più semplici.

Qualcuno ha delle ipotesi alternative? Altre idee?

Io di solito faccio in questo modo: creo due tabelle generiche per le traduzioni:




CREATE TABLE SourceMessage 

( 

    id INTEGER PRIMARY KEY, 

    category VARCHAR(32), 

    message TEXT 

); 

CREATE TABLE Message 

( 

    id INTEGER, 

    language VARCHAR(16), 

    translation TEXT, 

    PRIMARY KEY (id, language), 

    CONSTRAINT FK_Message_SourceMessage FOREIGN KEY (id) 

         REFERENCES SourceMessage (id) ON DELETE CASCADE ON UPDATE RESTRICT 

);



La tabella SourceMessage contiene i messaggi che devono essere tradotti mentre la tabella Message contiene i messaggi che sono già stati tradotti.

Bisogna tenere presente che esiste il linguaggio usato nel codice sorgente ed il linguaggio di destinazione. Cioè, se tu programmi in italiano, il SourceMessage sarà in italiano, e dentro la tabella Message ci saranno le traduzioni in tutte le lingue che vuoi =).

Yii gestisce tutto attraverso un suo componente


     // application components

    'components' => array(

        'messages' => array(

            'class' => 'CDbMessageSource',

        ),

Per cambiare la lingua, dovrai secondo standard Yii, dovrai nuovamente mettere mano al file di configurazione:

return array(


    …

    'behaviors' => array(

        'runTimeConfig' => array(

            'class' => 'ApplicationConfigBehavior'

        )

    ),


<?php


/**

 * ApplicationConfigBehavior is a behavior for the application.

 * It loads additional config paramenters that cannot be statically

 * written in config/main

 */

class ApplicationConfigBehavior extends CBehavior {


  /**

   * Declares events and the event handler methods

   * See yii documentation on behaviour

   */

  public function events() {

    return array_merge(parent::events(), array(

        'onBeginRequest' => 'beginRequest',

    ));

  }


  /**

   * Load configuration that cannot be put in config/main

   */

  public function beginRequest() {

    // set the user language

    //if the user choosed a language, we use the choosen one

    if ($this->owner->user->getState('applicationLanguage'))

      $this->owner->language = $this->owner->user->getState('applicationLanguage');

    else

      $this->owner->language = 'it';

  }


}

Io personalmente, creo nel controller questa azione:


  public function actionChangelanguage() {

    if (isset($_POST['lang']))

      Yii::app()->user->setState('applicationLanguage',$_POST['lang']);

    $this->redirect(array('site/index'));

  }

Spero di esserti stato di aiuto.

Se io usassi questa soluzione mi troverei ad avere una tabella con oltre 30.000 records per ogni lingua …come impatta questo sull’applicazione?

Non so: andrebbe provato. Ammesso e concesso che non so se questa sia la soluzione migliore, il miglior modo per saperlo è provarlo. Se hai già i files di testo, e se magari possono essere riconosciuti cime csv, puoi importare tutto in pochi semplici passi e vedere come si comporta yii.

In verità in verità vi dico, yii 2.0 supporterà database NoSQL quindi quei 30.000 con due o tre zeri in più davanti non ti spaventerebbero più. Credo.

Giusto … potresti provare il NoSQL. Sono sicuro di aver visto un’estensione non troppo tempo fa.

anch’io sto provando la yiimongodb suite e con qualche accorgimento funziona molto bene.

Cmq penso che l’applicazione settata con il http://www.yiiframework.com/doc/api/1.1/CDbMessageSource/ e il cachingDuration non dovrebbe risentire affatto in termini di prestazioni.