php web sitesinde bir çeviri sistemi koymak için en iyi yolu nedir?

7 Cevap php

PHP bir web sitesi deevelopping ve ben kolayca ingilizce almanca geçmek için kullanıcı vermek istiyorum.

Yani, bir çeviri politik dikkate alınmalıdır:

I ((1, "Merhaba", "merhaba"), (2, "Günaydın", "Guten Tag") vb bir veritabanı tablosunda veri ve çevirisini depolamanız gerekir ..?

Or should I use the ".mo" Files to store it? Which way is the best? What are the pros and the cons? Thank you very much, Regards.

7 Cevap

Düşünmelisiniz bazı faktörler vardır.

Web sitesi frequenytly güncellenmiş olacak? evet eğer, kim tarafından? Eğer yoksa sahibi mi? ne kadar veri / bilgi ile ilgileniyor? ve ayrıca ... Eğer (birçok müşteri için) sık sık yapıyorsun?

Ben pek çok yüksek trafik (yüzlerce günlük sayfa binlerce) yaşadığınız sürece bir ilişkisel veritabanı kullanarak herhangi bir ciddi hız etkileri couse düşünüyorum edebilirsiniz.

Eğer (müşteri bir sürü için) sık sık bunu yapıyor olmalıdır başka hiçbir düşünüyorum: CMS kurmak (veya varolan birini kullanın). Eğer gerçekten hızlı etki dikkate almak gerekir Eğer web sitesi ile bittiğinde, mümkünse statik HTML sayfalarını verebilirsiniz böylece, bunu özelleştirebilirsiniz.

If you are updating frequently, the same as above applies. If the client has to update (and not you), again, you need a CMS. If you are dealing with lots of infomration (big and lots of articles), you need a CMS.

Sonuçta, bir CMS yeniden kullanılabilir olacak yana, hızlı web sitesi yapısını kurmak içerik hızlı eklemek değil, kod hakkında çok fazla endişe yardımcı olacaktır.

Eğer sadece hızlı bir küçük web sitesi oluşturmak gerekiyorsa Şimdi, kolayca kodlanmış diziler ve veri dosyaları ile yapabilirsiniz.

PHP diziler gerçekten çeviriler yüklemek için en hızlı yoldur. Ancak, really bir editörüne elle bu dosyaları güncelleştirmek istemiyorum. Bu başında çalışmak, ve bir ya da iki dil için, ancak siteniz büyüdükçe bu korumak gerçekten zor oluyor olabilir.

Ben kurulum için size çeviriler tutmak bir veritabanında bir kaç basit tablolar tavsiye ve çeviriler (bazı formları eklemek ve güncelleme metinler için) güncelleme sağlayan basit bir uygulama oluşturmak. Veritabanı gibi: çevirisi değişkenleri saklamak için tek bir tablo kullanabilirsiniz; bu değişkenlere çevirileri bağlamak için başka kullanın.

Örnek:

`text`

id  variable
1   hello
2   bye
`text_translations`

id  textId  language  translation
1   1       en        hello
2   1       de        hallo
3   2       en        bye
4   2       de        tschüss

Peki ne olduğunu:

  • ilk tablodaki değişkeni oluşturmak

  • (istersen dil olarak) ikinci tabloda bunun için çeviriler ekleyebilir

Eğer çevirileri güncellenmiş sonra, kullandığınız her bir dil için bir dil dosyası / güncelleyin oluşturun:

  • İhtiyacınız değişkenleri ve çevirisini seçin (ipucu: bir çeviri varsa İngilizce kullanın)

  • Bütün bu malzeme ile büyük bir dizi oluşturmak, örneğin:

$texts = array('hello' => 'hallo', 'bye' => 'tschüss');
  • örneğin, bir dosyaya dizi yazmak:
file_put_contents('de.php', serialize($texts));
  • PHP / HTML (kullanıcı tarafından seçilen diline dayalı) dosyadan dizi oluşturmak, örneğin:
$texts = unserialize(file_get_contents('de.php'));
  • PHP / HTML değişkenleri kullanın, örneğin:
<h1><?php echo $texts['hello']; ?></h1>

or if you like/enabled PHP short tags:

<p><?=$texts['bye'];?></p>

Bu kurulum, çok esnek, ve çeviriler güncelleştirmek için birkaç formları ile birden çok dilde güncel sitenizi tutmak kolaydır.

Ben de Zend Framework Zend_Translate paketi öneririm.

Manuel How to decide which translation adapter to use iyi bir bakış verir. ZF kullanmadan bile, bu size orada ne olduğu hakkında bazı fikirler verecektir ve artıları ve eksileri ne vardır.

Adapters for Zend_Translate

  • Array
    • PHP diziler Küçük sayfalarını kullanmak;
    • basit kullanım; sadece programcılar için
  • Csv
    • Virgül ayrılmış (.csv/. Txt) dosyaları kullanın
    • Basit metin dosyası biçimi; hızlı; unicode karakter ile olası sorunlar
  • Gettext
    • Ikili gettext (. * Mo) dosyaları linux GNU standart kullanın;
    • evreli; çeviri için araçlara ihtiyacı
  • Ini
    • Basit ini (*. Ini) dosyaları kullanın
    • Basit metin dosyası biçimi; hızlı; unicode karakter ile olası sorunlar
  • Tbx
    • TermBase değişimi (.tbx/. Xml) dosyalarını kullanın
    • Uygulamalar arası terminoloji dizeleri için endüstri standardı; XML biçimi
  • Tmx
    • TMK kullanım (.tmx/. Xml) dosyaları
    • Uygulamalar arası çeviri için endüstri standardı; XML biçiminde; okunabilir insan
  • Qt
    • Qt dilbilimci (*. Ts) dosyaları kullanın
    • Çapraz platform uygulama çerçevesi; XML biçiminde; okunabilir insan
  • Xliff
    • Xliff kullanın (.xliff/. Xml) dosyaları
    • Bir basit TMX olarak biçimi, ancak bununla ilgili; XML biçiminde; okunabilir insan
  • XmlTm
    • Xmltm kullanın (*. Xml) dosyaları
    • XML belge çeviri belleği için endüstri standardı; XML biçiminde; okunabilir insan

Eğer çeviriler editting / eklemek için web arayüz sağlamak için gerekiyorsa, o zaman veritabanı iyi bir fikirdir.

Ancak, çeviriler statik, eğer, ben gettext hatta düz PHP dizi kullanabilirsiniz.

Eğer Zend_Translate yararlanabilirsiniz ya yol.

Küçük karşılaştırma, Zend öğretici ilk iki:

  1. Plain PHP arrays: Küçük sayfalar; basit kullanım; sadece programcılar için.
  2. Gettext: linux için GNU standart; evreli; çeviri için araçlara ihtiyacı vardır.
  3. Database: Dinamik; Kötü performansı.

Sadece bir üretim sistemi üzerinde (12 dil ve sayım) son zamanlarda kendimi bu ele sahip ve ben bir hibrid sistem öneririm yol boyunca bazı önemli performans sorunları çalıştırmak sonra.

1) bir veritabanında dil dizeleri ve çevirileri Mağaza - Bu kolay / güncelleme ile etkileşim yapacak / öğeleri kaldırmak artı normal yedekleme rutin bir parçası olacaktır.

2) sunucuda düz dosyalar halinde dilleri Önbellek ve sayfada görüntülemek için gerekli olanlar dışında çizin.

Burada faydaları çoktur - çoğunlukla hızlı! Ben transfer sırasında MySQL için bağlantı havai veya herhangi bir trafik yavaşlama ile ilgili değilim. (Özellikle önemlidir DB sunucusunu yerel değilse).

Bu aynı zamanda kullanımı çok kolay hale getirecek. Bir php tefrika dizi olarak dosyasında veritabanından veri depolamak ve depolama yükü küçültmek için dosyanın içeriğini Gzip (bu aynı zamanda hızlı benim kıyaslama yapar).

Example:

$lang = array(
    'hello' => 'Hallo',
    'good_morning' => 'Guten Tag',
    'logout_message' = > 'We are sorry to see you go, come again!'    
);

$storage_lang = gzcompress( serialize( $lang ) );

// WRITE THIS INTO A FILE SUCH AS 'my_page.de'

Bir kullanıcının yapması ilk kez sistemini yüklerken bir file_exists('/files/languages/my_page.de'). Dosya varsa o zaman içeriği, un-gzip ve un-serialize yük ve gitmek için hazır.

Example

$file_contents = get_contents( 'my_page.de' );
$lang = unserialize( gzuncompress( $file_contents ) );

Eğer ... hatta küçük yükü tutmak sistemdeki her sayfa için önbelleğe alma belirli yapmak ve dilini göstermek için dosya uzantısını kullanabilirsiniz görebileceğiniz gibi (my_page.en, my_page.de, my_page.fr)

Dosya mevcut değilse o zaman gziplemek ve eksik dosya yazma, serialize, dizinizi oluşturmak, DB sorgu - Aynı anda sadece gerekli sayfa çok sayfayı görüntülemek için devam o dizi inşa ve var herkes mutlu.

Son olarak, bu olmayan programcılar için erişilebilir güncelleme sayfaları oluşturmanıza olanak verir, ancak değişikliklerin sistem tarafından yeniden inşa edilebilmesi için, önbellek dosyaları kaldırmak için ne zaman karar vererek görünür zaman da kontrol eder.

Warnings and Pitfalls

Ben veritabanında her şeyi muhafaza zaman bizim trafik çivili zaman doğrudan bazı BÜYÜK yavaşlamalar çarptı.

Güncellemeler acı ve hata eğilimli çünkü düz dosya dizilerde onları tutmaya çalışıyorum sadece bu kadar sorun oldu.

Önbellek dosyaları içeriğini benim testlerde yaklaşık 20% daha yavaş dil sistemi yapılmış sıkıştırmak gzip.

Emin olun dilleri içeren veritabanı tüm alanları UTF8-genel-ci ayarlanır (veya UTF8 seçeneklerden en az biri, benim kullanım için genel-ci iyi bulmak). Bunu yapmazsanız size (vb Çince, Japonca gibi) veri tabanında olmayan unicode karakter setlerini depolamak mümkün olmayacaktır

Extension: In response to a comment below, be sure to set your database tables up with page level language strings in mind.

id      string              page        global
1       hello               NULL          1
2       good_morning        my_page.php   0

Üstbilgi veya altbilgiler kadar gösterir bir şey, yaratılan her önbellek dosyasında sorgulanan olacak küresel bir bayrak var, aksi duyarlı sistem tutmak Sayfası onları sorgulayabilir.

PHP dizileri tavsiye ederim, onlar kolay erişim için bir GUI etrafında inşa edilebilir.

Ben dizileri ile benim yapmak. Aslında made an article just about this uzun zaman önce.