Question

Je trouve grand cadre Yû, et le site exemple créé avec shell yiic est un bon point de départ ... mais il ne couvre pas le sujet des sites multi-langues, malheureusement. La documentation couvre le sujet de la traduction des messages courts, mais pas en gardant le contenu multilingue ...

Je suis sur le point de commencer à travailler sur un site Web qui doit être au moins deux langues, et je me demande quelle est la meilleure façon de garder le contenu pour que ... Le problème est que le contenu est mélangé avec des éléments largement communs (comme les fichiers vidéo intégrés).

Je dois éviter de dupliquer ces communes ... jusqu'à présent, je l'habitude d'avoir un tableau de tableaux contenant des textes (généralement pas plus de 1-2 paragraphes courts), le fichier de vue était tout simplement rendu le texte d'un tableau.

Maintenant, je voudrais éviter de garder dans les tableaux (ce qui nécessite une certaine attention lors de la mise à double citations « » et est peu pratique en général ...).

Alors, quelle est la meilleure façon de garder ces paragraphes courts? Dois-je les garder dans DB comme (id | id_msg | langue | contenu), puis les sélectionner par id_msg et la langue? Cela me demande encore de créer des années MSG_ID et les intégrer dans le fichier de vue ...

Y at-il paradigme recommandé pour qui a des solutions Yii?

Merci, m.

Était-ce utile?

La solution

Une application Yii utilise par défaut yu :: méthode t () pour traduire des messages texte et il y a 3 types différents pour les sources de message:

  1. CPhpMessageSource . Les traductions sont stockées sous forme de paires clé-valeur dans un tableau PHP
  2. CGettextMessageSource : Les traductions sont stockées sous forme de fichiers GNU Gettext. (Fichiers PO)
  3. CDbMessageSource :. Traductions de messages sont stockés dans des tables de base de données

Si je ne vous méprenez pas, vous utilisez des tableaux classiques pour les traductions. Je vous recommande l'utilisation de fichiers GetText et PO avec Yû pour les opérations de traduction.

Vous pouvez trouver beaucoup d'informations sur la traduction et i18n avec yu dans cette page de documentation officielle .

Autres conseils

Gettext est bon pour sa facilité de traduction, mais la mise en œuvre de PHP par défaut est pas thread-safe. Yu utilise donc son propre décompresseur, ce qui augmente considérablement le temps de traitement par rapport à des tableaux de php.

Depuis que je mettais un volume élevé, le site de transaction élevé, la baisse de performance n'a pas été acceptable. En outre, à l'aide d'APC, nous avons pu mettre en cache les performances de PHP traduction augmente encore.

Mon approche est donc d'utiliser des tableaux PHP mais pour garder les traductions dans une base de données pour faciliter la traduction, générer les fichiers nécessaires lorsque les traductions sont modifiés.

Le DB est similaire à ceci:

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

Je puis modifié la commande « message » outil CLI yiic pour vider les chaînes collectées dans la base de données.

http://www.yiiframework.com / wiki / 41 / comment étendre-yiic-shell-à-commandes /

Une fois dans la base de données, un simple CMS peut être configuré pour fournir des traducteurs un moyen facile de traduire et en même temps fournir des informations versioning, de revenir à des versions plus anciennes, de vérifier la qualité des traducteurs, etc ...

Un autre script, également modifié à partir yiic, puis prend les informations DB et compile dans des tableaux PHP. Fondamentalement, une jointure des deux tables pour chaque langue, puis construire un tableau en utilisant « Message » « key » et « MessageTranslation ».. « Valeur » comme (quoi d'autre?) Key => valeur ... enregistrement dans un fichier nommé de ' message ». 'catégorie' dans le dossier spécifié par la langue.

Les fichiers générés sont chargés normalement par Yû CPhpMessageSource.

Pour les images, ce fut aussi simple que de les placer dans des dossiers avec la langue appropriée et d'obtenir la langue de l'application lors de la liaison.

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

Notez que dans la vraie vie, je l'ai écrit une méthode peu d'aide pour dépouiller le pays de la chaîne de langue, « fr_fr » devrait être « en ».

Eh bien, je pense que ce qui est concerné ici est de savoir comment traduire le texte statique / messages sur la page et Yii résout assez bien en utilisant Yii. T () et la réponse de Edigu est pour elle

Je vérifie le message sur FlexicaCMS sur la traduction de contenu dynamique dans la base de données, et en fin de compte ce sera la prochaine fois que vous résoudre le problème un message texte / statique, et qui est une approche vraiment bonne en utilisant le comportement de Yû. Je ne sais pas si les auteurs FlexicaCMS sont trop ambitieux pour soutenir la traduction de cette façon que cela rendrait la traduction du contenu une chose sans souci -. Vraiment super

Une chose qu'ils ne mentionnent pas est l'URL de la page traduite. Par exemple your.site.com/fr/translated_article_title.html. Je veux dire l'URL doit a / language_id / partie en elle de sorte qu'il peut aider avec SEO.

Dans Yii1 et Yii2 yu \ i18n \ GettextMessageSource ne pas utiliser le moteur parfait cache Yii de toute façon (voir la source) pour augmenter la charge de PO ou des fichiers MO. Il est recommandé de ne pas charger ces fichiers en utilisant le code php pur (y compris yu \ i18n \ GettextMessageSource) (il est tellement plus lent que PHP tableau IDX): http: // mel. melaxis.com/devblog/2006/04/10/benchmarking-php-localization-is-gettext-fast-enough/

Cependant php gettext poste pour les fichiers MO est un peu plus rapide que matrice de traduction php car il utilise le cache, mais le point négatif est:. Chaque changement de MO nécessite un redémarrage du serveur

Je pense que la meilleure solution serait d'étendre yu \ i18n \ GettextMessageSource dans votre propre bibliothèque de code et ajouter la capacité de cache à GettextMessageSource pour améliorer ses performances et d'utiliser votre version étendue en tant que composant.

protected function loadMessages($category, $language);

Il suffit de ne pas date de modification vérifier MO dans chaque charge de comparer sur le cache, au lieu vider le cache lorsque les fichiers MO ou PO sont modifiés (il peut être un calendrier).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top