Çok dilli PHP web sitesi için en etkili yaklaşım

3 Cevap php

Ben büyük bir dilli bir web sitesi üzerinde çalışıyorum ve bu çok dilli yapmak için farklı yaklaşımlar dikkate yaşıyorum. Aklıma olası alternatifler:

  1. . Po dosyaları kuşak ile Gettext işlevleri
  2. Her metin için çeviriler ve benzersiz bir dize kimliği ile bir MySQL tablo
  3. Benzersiz bir dize kimlikleri ile farklı çevirilerini içeren diziler ile PHP-files

Bildiğim kadarıyla ben anlamış gibi Gettext fonksiyonları en verimli olmalı, ama benim gereğinin orijinal referans dil (İngilizce) bir metin dizesini değiştirmek mümkün olmalıdır olmasıdır dize otomatik sırf İngilizce'ye geri dönülüyor ve diğer çeviriler olmadan kelime bir çift değiştirilebilir. Bu GetText ile mümkün mü?

What is the least resource demanding solution?
Is using the Gettext functions or PHP files with arrays more or less equally resource demanding?
Any other suggestions for more efficient solutions?

3 Cevap

Birkaç hususlar:

1. Translations
Who will be doing the translations? People that are also connected to the site? A translation agency? When using Gettext you'll be working with 'pot' (.po) files. These files contain the message ID and the message string (the translation). Example:

msgid "A string to be translated would go here"  
msgstr ""

Şimdi, bu sadece iyi ve bu çevirmek için ihtiyaç duyan herkes için anlaşılabilir görünüyor. Anahtar kelimeler kullandığınızda Mike anlaşılacağı gibi ama yerine ne tam cümle, ne olur? Birisi "address_home" denilen bir msgstr çevirmesi gerekiyorsa bu bir başlık "Ev adresi" olabilir veya bir tam cümle olduğunu gerekir ise, o hiçbir ipucu vardır. Bu durumda, bu yüzden gibi, gettext fonksiyonu çağırıyoruz hemen önce dosyaya açıklama eklemek için emin olun:

/// This is a comment that will be included in the pot file for the translators
gettext("ready_for_lost_episode");

. Po dosyaları oluştururken xgettext --add-comments=/// kullanarak bu ekleyeceğim. Ancak, Gettext bu şekilde kullanılmak üzere ment sanmıyorum. Ayrıca, size bir) muhtemelen bir noktada bir hata yapacağım görüntülemek istiyorsanız every metinle Yorum eklemek için gerekiyorsa, b), bütün script zaten metinlerle dolu olacak konum sadece yorum formu, c) yorumları doğrudan kodunuzda fonksiyonunun pozisyonuna bağlı olarak, her zaman convient değil Gettext fonksiyonu yukarıda yerleştirilmesi gerekiyor.

2. Maintenance
Once your site grows (even further) and your language files along with it, it might get pretty hard to maintain all the different translations this way. Every time you add a text, you need to create new files, send out the files to translators, receive the files back, make sure the structure is still intact (eager translators are always happy to translate the syntax as well, making the whole file unusable :)), and finish with importing the new translations. It's doable, sure, but be aware with possible problems on this end with large sites and many different languages.


Another option: combine your 2nd and 3rd alternative:

Şahsen, daha kullanışlı bir (basit) CMS kullanarak bir veritabanı değişkenleri ve çeviriler tutmak ve dosyaları kendiniz dile Alakalı metinleri dışa çeviri yönetmek için bulabilirsiniz:

  1. veritabanına değişkenler ekleyebilir (örn: id, sayfa, değişken);
  2. Bu değişkenler (örneğin: id, varid, dil, çeviri) çeviriler ekleyebilirsiniz;
  3. , ilgili değişkenleri ve çeviriler seçmek bir dosyaya yazmak;
  4. sitenize ilgili dil dosyasını içerir;
  5. Bir değişkenleri metnini görüntülemek için kendi işlevi oluşturmak:

text('var'); ya da belki bir şey __('faq','register','lost_password_text'); gibi

Noktası 3, veritabanından ilgili tüm değişkenleri ve çeviriler seçiminde bir dizi koyarak ve bir dosyaya serlialized dizi yazı kadar basit olabilir.

Avantajları:

  1. Bakım. Metinleri bakımı büyük projeler için çok daha kolay olabilir. You can sadece bu değişkenin ait sitenin hangi parçası tanımlar veritabanına bir sütun ekleyerek sayfa, bölümler ya da site içinde diğer bölümleri tarafından grup değişkenleri. Hızlı bir şekilde, örneğin kullanılan tüm değişkenlerin bir listesini indirebiliriz Bu şekilde SSS sayfası.

  2. Tercüme. Sen tek bir sayfada tüm farklı dillerde tüm çevirileri ile değişken görüntüleyebilirsiniz. Bu, aynı anda birden çok dilde metinleri çevirebilir insanlar için yararlı olabilir. Ve bu çeviri mümkün olduğunca iyi şekilde bağlam için bir fikir almak için diğer çevirilerini görmek için yararlı olabilir. Ayrıca tercüme edilmiştir öğrenmek için veritabanını sorgulamak değil ne olabilir. Belki olası eski çevirilerin takip damgaları ekleyin.

  3. Erişim. Bu çeviri kim olacak bağlıdır. Sen ihtiyaç olması halinde bir çeviri ajansı kişiye erişim vermek için basit bir oturum açma ile CMS sarın ve sadece onları belirli dil veya sitenin hatta bazı kısımlarını değiştirmek için izin verebilirsiniz. Bu (bu daha önce belirtildiği gibi aynı sorunları ile gelebilir rağmen.) Elle çevrilen ve daha sonra içe edilebilir bir dosyaya veri yine çıkışın bir seçenek değilse. Sen çevirmen için bağlam olarak (İngilizce ya da başka bir ana dili) var zaten çeviriler birini ekleyebilirsiniz.

Tüm ben size özellikle uzun vadede, bu şekilde çeviriler üzerinde çok daha fazla kontrole sahip olacak bulacaksınız düşünüyorum. Sana hız veya yerli gettext işlevine göre bu yaklaşımın etkinliği hakkında bir şey söyleyemem. Ancak, dil dosyalarının boyutuna bağlı olarak, ben büyük bir fark olacak sanmıyorum. Eğer grup, sayfa veya bölüm değişkenleri ise, Alway sadece gerekli parçaları içerebilir.

Birkaç denemeden sonra nihayet ikinci ve üçüncü alternatif Alecs 'kombinasyonu hatları ile daha fazla veya daha az gitmeye karar verdi.

Gettext problem
I tried to set up the whole gettext-system first to try it out, but it turned out to be much more complicated then I thought. The problem is that Windows and Unix systems use different language shortnames for setlocale(). For the moment I'm running my dev-server on Windows with Wamp, while the final site will run on Linux. After I went through a couple of dozen guides, forums, questions etc. and restarting the server after each modification. I couldn't get it setup properly in any easy way it seemed. Additionally gettext is not threadsafe, to update the language file the server needs to be restarted or a hack needs to be used, there is no easy way of handling different versions of language files or handling the original English text without modifying the source or using Mikes suggestion, which as Alec pointed out isn't optimal.

Solution
So I ended up with what I think is the best solution based on Alecs response:

  • Alanları ile bir veritabanında tüm çeviriler kaydedin; dil, sayfa, var_key, sürüm, revizyon ve last_modified_time - versiyon revizyon çevirmen / değiştirmek bir sürümü içinde kesinleşmiş çeviriler düzeltmek için izin verirken, orijinal çeviri (İngilizce) sürümleri karşılık olduğu.
  • DB bağlı ve farklı sürümleri kolları ve dilleri çeviriler hangi sürümü ve nasıl tam olarak, tercüme edildikleri kolay bir bakış için izin verir çeviri için CMS bir tür kullanın.
  • Bir versiyonunun bir revizyon bir önbellek dosyaları oluşturulur kesinleşmiş olduğunda - her dosya, bir dil ve tek bir sayfa için sadece var_key ve metin çeviri ile bir dizi içerir ve dillerin ISO 639-1 isimlerle adlandırılır ve gibi sayfa adı: lang / Bu dil dosyaları en_index.php sonra sadece yer ve sonra önbellek dosyaları kullanmak sadece değişti ise, gelişimi sırasında DB kullanmak için izin veren bir fonksiyonu t ($ var_key) sarılır.

Performance
I never got around to test gettext, but according to the link Mike posted the difference in performance between using an array and gettext is totally acceptable for me for the benefits which a custom system gives as described above. However, I compared using an array with 20 translated text-strings in an array compared to retrieving the same 20 text-strings from a MySQL DB. It turned out that using an array included from a file was aeound 6 times faster than retrieving all the 20 strings at the same time from the MySQL DB. It was no really scientific benchmark and the results may surely vary on different systems and setups, but it clearly shows exactly what I expected - that it would be much slower using a DB than using an array directly, which is why I choose to generate cache-files for the array instead of using the DB.

Bir karşılaştırma olarak ben de aynı metin ile sadece çıkış basit yankılanırken için ne kadar hızlı test. Bu dahil bir dosyadan dizileri kullanarak göre yaklaşık 20 kat daha hızlı olduğu ortaya çıktı, ama iyi - o zaman dinamik sayfaların amacı meydan okuyan, hangi farklı diller için sayfanın farklı sürümlerini kalmadan çevirmek mümkün değildir. Sonra da kullanmak daha iyidir a good cachesystem.

Performance test source files:
PHP: http://pastie.org/964082
MySQL table: http://pastie.org/964115
It is surely not perfect, but at least creates an idea about the performance differences.

Aksine tuşları olarak İngilizce metin kullanmak zorunda daha keyfi bunu ancak aynı zamanda İngilizce çeviriler sağlayabilir yani

gettext anahtar 'merhaba' olduğunu

Daha sonra, bu değişik dil çevirileri ve aynı zamanda bu bir ingilizce çeviri var 'merhaba', o zaman yalnız anahtarını bırakın ve sadece ingilizce çeviri güncelleyebilirsiniz dize ingilizce sürümünü güncellemek istiyorsanız.