Domanda

trovo grande quadro Yii, e il sito web creato ad esempio con le coperture yiic è un buon punto per iniziare ... tuttavia non copre il tema dei siti web multi-lingua, purtroppo. La documentazione copre l'argomento di tradurre i messaggi brevi, ma non mantenendo il multi-lingue dei contenuti ...

Sto per iniziare a lavorare su un sito web che ha bisogno di essere in almeno due lingue, e mi chiedo qual è il modo migliore per tenere aggiornati i contenuti per questo ... Il problema è che il contenuto è mescolato a lungo con elementi comuni (come i file video incorporati).

Ho bisogno di evitare la duplicazione di quelle comuni ... finora ho usato per avere un array di array contenenti testi (di solito non più di 1-2 brevi paragrafi), quindi il file di vista era semplicemente il rendering del testo da un array.

Ora vorrei evitare di tenere in array (che richiede una certa attenzione quando mettere doppie citazioni "" ed è scomodo in generale ...).

Quindi, qual è il modo migliore per mantenere quei brevi paragrafi? Dovrei tenere a DB come (id | msg_id | lingua | contenuto) e poi selezionarle dal msg_id & lingua? Questo mi richiede ancora per creare alcuni msg_id e di incorporarli in file di vista ...

C'è un paradigma consigliata per i quali Yii ha alcune soluzioni?

Grazie, m.

È stato utile?

Soluzione

Un'applicazione Yii di default usa Yii :: metodo t () per la traduzione dei messaggi di testo e ci sono 3 tipi diversi di fonti di messaggi:

  1. CPhpMessageSource :. Traduzioni sono memorizzati come coppie di valori-chiave in un array PHP
  2. CGettextMessageSource : Le traduzioni sono memorizzati come file GNU Gettext. (PO File)
  3. CDbMessageSource :. Traduzioni dei messaggi sono memorizzati in tabelle di database

Se non mi fraintendere, che si sta utilizzando le matrici classiche per le traduzioni. Mi raccomando a voi utilizzando file GetText e PO con Yii per le operazioni di traduzione.

Si possono trovare molte informazioni sulla traduzione e i18n con Yii in questo pagina ufficiale di documentazione .

Altri suggerimenti

Gettext è un bene per la sua facilità di traduzione, ma l'implementazione di default PHP non è thread-safe. Yii utilizza quindi la sua propria unpacker, aumentando notevolmente il tempo di elaborazione rispetto al array PHP.

Da quando sono stato la creazione di un alto volume, alto luogo della transazione, il calo di prestazioni non era accettabile. Inoltre, usando APC, potremmo memorizzare nella cache la traduzione PHP ulteriormente aumentare le prestazioni.

Il mio approccio è stato quindi quello di utilizzare array PHP ma per mantenere le traduzioni in un DB per la facilità di traduzione, la generazione dei file necessari quando traduzioni sono cambiati.

Il DB è simile a questo:

TABLE Message            // stores source language, updated by script
 id INT UNSIGNED
 category VARCHAR(20)         // first argument to Yii::t()
 key TEXT                     // second argument to Yii::t()
 occurences TINYINT UNSIGNED  // number of times found in sources

TABLE MessageTranslation // stores target language, translated by human  
 id INT UNSIGNED
 language VARCHAR(3)          // ISO 639-1 or 639-3, as used by Yii
 messageId INT UNSIGNED       // foreign key on Message table
 value TEXT
 version VARCHAR(15)
 creationTime TIMESTAMP DEFAULT NOW()
 lastModifiedTime TIMESTAMP DEFAULT NULL
 lastModifiedUserId INT UNSIGNED

Ho poi modificato il comando lo strumento yiic 'messaggio' CLI per fare uscire le stringhe raccolti nel DB.

http://www.yiiframework.com / wiki / 41 / how-to yiic-shell-comandi-extend-/

Una volta nel DB, un semplice CMS può essere configurato per fornire i traduttori un modo semplice per tradurre e allo stesso tempo fornire informazioni sulla versione, tornando alle versioni precedenti, il controllo della qualità dei traduttori, ecc ...

Un altro script, modificata anche da yiic, poi prende le informazioni DB e compila in array PHP. Fondamentalmente un join di due tabelle per ogni lingua, quindi costruire un array usando 'Messaggio'. 'Chiave' e 'MessageTranslation'. 'Valore' come (che altro?) Key => valore ... il salvataggio di file di nome da ' Messaggio'. 'categoria' nella cartella specificata per lingua.

I file generati vengono caricati come normale Yii CPhpMessageSource.

Per le immagini, questo è stato così semplice come mettendoli in cartelle con il linguaggio corretto e ottenere la lingua applicazione durante il collegamento.

<img src="/images/<?php echo Yii::app()->language; ?>/help_button.png">

Si noti che nella vita reale, ho scritto un metodo di supporto poco per togliere il paese dalla stringa di lingua, 'en_US' dovrebbe essere 'it'.

Beh penso che ciò che è interessato qui è come tradurre statici di testo / messaggi sulla pagina e Yii risolve abbastanza bene con Yii:. T () e la risposta di Edigu è per esso

I check out il post sul FlexicaCMS a tradurre il contenuto dinamico nel database, così in definitiva che sarà il prossimo dopo a risolvere statica problema text / messaggio, e che è un vero e buon approccio con il comportamento di Yii. Non sono sicuro se gli autori FlexicaCMS sono troppo ambiziosi nel sostenere traduzione che modo come farebbe traduzione dei contenuti una cosa senza problemi -. Davvero grande

Una cosa che non fanno menzione è l'url della pagina tradotta. Per esempio your.site.com/fr/translated_article_title.html. Voglio dire il mosto URL è / language_id / parte in esso in modo che possa aiutare con SEO.

In Yii1 e Yii2 Yii \ i18n \ GettextMessageSource non utilizzare Yii motore perfetto della cache in ogni caso (vedi fonte) per aumentare il carico di file MO PO o. Non è consigliabile caricare i file utilizzando PHP codice puro (tra cui Yii \ i18n \ GettextMessageSource) (è così lento rispetto php array di IDX): http: // mel. melaxis.com/devblog/2006/04/10/benchmarking-php-localization-is-gettext-fast-enough/

Tuttavia php gettext ext per i file MO si trova a pochi più veloce di traduzione array PHP perché utilizza la cache, ma il punto negativo è:. Ogni cambiamento MO richiede il riavvio del server

Penso che la soluzione migliore sarebbe quella di estendere Yii \ i18n \ GettextMessageSource nella libreria di codice proprio e aggiungere la possibilità cache per GettextMessageSource per migliorare le prestazioni e utilizzare la versione estesa come componente.

protected function loadMessages($category, $language);

Basta non controllare MO data di modifica in ogni carico da confrontare con la cache, invece cancellare la cache quando i file MO o PO sono cambiate (può essere un programma).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top