Bu kötü görünmüyor. Bunu birçok kez kullanılan gördüm.
Ancak dil başına bir dosyada farklı dizelerini ayırmak olacaktır. Dosyaları büyük olsun, en azından, ya da eğer, dil başına modül başına bir dosya.
(Eğer herhangi bir önbellek diğer sistemine güvenmek yoksa) Sonra çeviri sınıfı yeni bir dil kullanılacak her zaman dil dosyalarını yüklemek ve önbelleğe alabilir.
Ne demek istediğimi küçük bir örnek
class Translator {
private $lang = array();
private function findString($str,$lang) {
if (array_key_exists($str, $this->lang[$lang])) {
return $this->lang[$lang][$str];
}
return $str;
}
private function splitStrings($str) {
return explode('=',trim($str));
}
public function __($str,$lang) {
if (!array_key_exists($lang, $this->lang)) {
if (file_exists($lang.'.txt')) {
$strings = array_map(array($this,'splitStrings'),file($lang.'.txt'));
foreach ($strings as $k => $v) {
$this->lang[$lang][$v[0]] = $v[1];
}
return $this->findString($str, $lang);
}
else {
return $str;
}
}
else {
return $this->findString($str, $lang);
}
}
}
Bu arayacaktır. Dil bu gibi girdileri yaptıktan sonra adını txt dosyaları
Foo=FOO
Bar=BAR
Her zaman herhangi bir çeviri bulmak olmaması durumunda orijinal dize geri düşüyor.
Bu çok basit bir örnek. Ama daha büyük bir çerçeveye gerek var eğer kendiniz bunu yaparken benim görüşüme göre yanlış bir şey yok.
Her zaman bunu yapabilirsiniz çok daha basit bir şekilde kullanmak ve 'EN_Example.txt' adlı bir dosya oluşturmak için
class Example extends Translator {
private $lang = 'EN';
private $package = 'Example';
public function __($str) {
return parent::__($str, $this->lang . '_' . $this->package);
}
}
Bazen değişkenleri içeren dizeleri çevirmek istiyoruz. Böyle bir yaklaşım, ben zaman zaman kullanmak kadar basit buldukları bu.
// Translate string "Fox=FOX %s %s"
$e = new Example();
// Translated string with substituted arguments
$s = printf($e->__('Fox'),'arg 1','arg 2');
Ayrıca printf işlevi bu gibi __()
fonksiyonu içine konabilir değişken değişimi entegre
public function __() {
if (func_num_args() < 1) {
return false;
}
$args = func_get_args();
$str = array_shift($args);
if (count($args)) {
return vsprintf(parent::__($str, $this->lang . '_' . $this->package),$args);
}
else {
return parent::__($str, $this->lang . '_' . $this->package);
}
}