Nasıl benim çok dilli uygulama benim nesneye çevrilmiş metni geçmelidir?

1 Cevap php

Şimdiye kadar, ben örneğin, benim veritabanında bir 'sözlük' tablosu korumuştur:

+-----------+---------------------------------------+-----------------------------------------------+--------+
| phrase    | en                                    | fr                                            | etc... |
+-----------+---------------------------------------+-----------------------------------------------+--------+
| generated | Generated in %1$01.2f seconds at %2$s | Créée en %1$01.2f secondes à %2$s aujourd'hui | ...    |
| submit    | Submit...                             | Envoyer...                                    | ...    |
+-----------+---------------------------------------+-----------------------------------------------+--------+

Ben o zaman ilgilendiğiniz yerel eşleşen sütun için veritabanındaki tüm satırları seçmek gerekir (veya hız db arama bir dosyadan önbelleği okuma) ve $lng adında bir diziye sözlüğü dökümü .

Sonra benim görünümünde böyle HTML yardımcı nesneleri olacak:

$html->input(array('type' => 'submit', 'value' => $lng['submit'], etc...));
...
$html->div(array('value' => sprintf($lng['generated'], $generated, date('H:i')), etc...));

Çeviriler de PDF, XLS ve AJAX yanıtları görünebilir.

Benim yaklaşımla sorun şimdiye kadar ben şimdi global $lng; UI kodu tükürmesi bir işlevi vardır her sınıfta yükler olması ..

Nasıl diğer insanlar nesnesine çeviri alabilirim? O globallerinin aslında kötü değil, bir senaryo var mı? Bu sözlük terimleri tüm statik olduğunda erişimcilerle bir sınıf oluşturmak için delilik olurdu?

Addendum

Ben bir bağımlılık olarak sözlük, bunu kolaylaştırmak için Lng sınıfında bağımlılık enjeksiyon kullanabilirsiniz sayede bu durum bütün bunlar bir HTML sınıfı, bir PDF sınıfını, JSON sınıfı, vb gibi farklı çeviriler test için?

1 Cevap

Hızlı ve basit bir çözüm olarak sadece lng bir fonksiyon yapmak:

 $html->input(array('type' => 'submit', 'value' => lng('submit'), etc...));

Başka bir düşünce: Eğer html yardımcıları kullanıyorsanız eğer gibi, bir dize kimliği geçmek böylece, neden, i18n onları haberdar yapmazlar

 $html->input(array('type' => 'submit', 'value' => '@submit', etc...));

ve giriş () fonksiyonunda 'LNG (xxx)' ile '@ xxx' yerine

Ayrıca gettext bir seçenek olabilir.