Yii: Çoklu dil web sitesi - en iyi uygulamalar

3 Cevap php

Ben Yii büyük çerçeve bulmak ve yiic kabuğu ile oluşturulan örnek web sitesi ancak ne yazık ki, çok-dilli web siteleri konuyu kapak değil ... başlamak için iyi bir nokta. Dokümanlar kısa mesajları tercüme, ancak çok dilli içerik tutmak değil konuyu kapsar ...

I'm about to start working on a website which needs to be in at least two languages, and I'm wondering what is the best way to keep content for that ... The problem is that the content is mixed extensively with common elements (like embedded video files).

Ben şimdiye kadar o görünüm dosyası sadece bir dizi metin render edildi, metinler (genellikle en fazla 1-2 kısa paragraflar) içeren diziler bir dizi için kullanılır ... bu müşterekleri çoğaltarak kaçınmak gerekir.

Şimdi ben (... "" çifte alıntılar koyarak bazı dikkat gerektiren ve genel olarak sakıncalı olan) diziler tutarak önlemek istiyorum.

Yani, bu kısa paragraflar tutmak için en iyi yolu nedir? Ben gibi DB onları tutmalı (| msg_id | Dil | id içeriği) ve daha sonra msg_id bunları seçin ve dil? Bu hala bazı msg_id bulunuyor oluşturmak açmamı ve görünümü dosyası içine gömmek ...

Yii bazı çözümler var olduğu için herhangi bir tavsiye paradigma var mı?

Thanks, m.

3 Cevap

Varsayılan olarak bir Yii uygulama metin mesajları çeviri için yii :: t () yöntemini kullanır ve mesaj kaynakları için 3 farklı tipi vardır:

  1. CPhpMessageSource: Çeviriler bir PHP dizi anahtar-değer çiftleri olarak depolanır.
  2. CGettextMessageSource: Çeviriler GNU Gettext dosyaları olarak depolanır. (PO Dosyalar)
  3. CDbMessageSource: Mesaj çeviriler veritabanı tablolarında depolanır.

I yanlış anlamayın yoksa, çeviriler için klasik dizileri kullanıyor. Ben çeviri işlemleri için Yii ile GetText ve PO dosyalarını kullanarak size tavsiye.

Bu official documentation page içinde Yii ile çeviri ve i18n hakkında bilgi sürü bulabilirsiniz.

Gettext çeviri kolaylığı için iyidir, ancak varsayılan PHP uygulama parçacığı güvenli değildir. Yii bu nedenle önemli ölçüde php diziler ile karşılaştırıldığında işlem süresini artırarak, kendi UNPACKER kullanır.

Ben bir yüksek hacimli, yüksek işlem sitesi kurma bu yana, performans isabet kabul edilebilir değildi. Ayrıca, APC kullanarak, daha fazla performansın arttırılması PHP çeviri önbelleğe olabilir.

Benim yaklaşım PHP diziler kullanmak ancak çeviriler değiştiği zaman gerekli dosyaları oluşturma, çeviri kolaylığı için bir DB çeviriler tutmak bu nedenle oldu.

DB buna benzer:

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

Daha sonra DB içine toplanan dizeleri dökümü CLI araç yiic 'mesajı' komutunu değiştirilmiş.

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

Bir kez DB, basit bir CMS tercümanlar tercüme ve aynı zamanda vb, çevirmenlerin kalitesini kontrol etmek, eski sürümlere geri dönen, sürüm bilgileri sunmak için kolay bir yol sağlamak için kurulum olabilir ...

Ayrıca yiic değiştirilmiş başka bir komut dosyası, daha sonra DB bilgi alır ve PHP diziler içine derler. Temelde bir 'mesaj' kullanarak bir dizi kurmak sonra, her dil için iki tablo JOIN. 'Anahtar' ve 'MessageTranslation'. 'Değer' (başka ne?) Anahtar => değer ... ', adlı dosyaya kaydetme gibi dil tarafından belirtilen klasörde mesajı '.' kategori '.

Oluşturulan dosyaları Yii CPhpMessageSource normal olarak yüklenir.

Görüntüler için, bu uygun dille klasörlere yerleştirerek ve bağlarken app dili almak kadar basit.

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

Gerçek hayatta, ben 'tr_TR' tr 'olmalı, dil dizeden ülkeyi kapalı şerit biraz yardımcı yöntemi yazdı unutmayın.

T () ve Edigu cevabı bunun için: Peki ben burada ne endişe duymaktadır sayfada statik metin / mesajları çevirmek ve Yii Yii kullanarak oldukça iyi çözer nasıl olduğunu düşünüyorum.

Ben veritabanında dinamik içeriği çeviri hakkında FlexicaCMS üzerindeki sonrası check out, iyi sonuçta statik metin / iletisi sorunu çözmek bundan sonra yanında olacak, ve bu Yii davranışını kullanarak gerçekten iyi bir yaklaşımdır. Emin değilim FlexicaCMS yazarlar içerik çeviri sorunsuz bir şey yapar gibi bu şekilde çevirisini destekleyen çok iddialı ise - gerçekten harika.

Onlar söz etmeyin bir şey çevrilmiş sayfanın url. Örneğin your.site.com / fr / translated_article_title.html için. Ben url zorunluluktur SEO ile içinde / Dil_Kimliği / part yardımcı olabilir gelmiştir böylece anlamına gelir.