Мне очень нравится следующий подход:
один файл - сам переводчик:
class Translator{
private static $strs = array();
private static $currlang = 'en';
public static function loadTranslation($lang, $strs){
if (empty(self::$strs[$lang]))
self::$strs[$lang] = array();
self::$strs[$lang] = array_merge(self::$strs[$lang], $strs);
}
public static function setDefaultLang($lang){
self::$currlang = $lang;
}
public static function translate($key, $lang=""){
if ($lang == "") $lang = self::$currlang;
$str = self::$strs[$lang][$key];
if (empty($str)){
$str = "$lang.$key";
}
return $str;
}
public static function freeUnused(){
foreach(self::$strs as $lang => $data){
if ($lang != self::$currlang){
$lstr = self::$strs[$lang]['langname'];
self::$strs[$lang] = array();
self::$strs[$lang]['langname'] = $lstr;
}
}
}
public static function getLangList(){
$list = array();
foreach(self::$strs as $lang => $data){
$h['name'] = $lang;
$h['desc'] = self::$strs[$lang]['langname'];
$h['current'] = $lang == self::$currlang;
$list[] = $h;
}
return $list;
}
public static function &getAllStrings($lang){
return self::$strs[$lang];
}
}
function generateTemplateStrings($arr){
$trans = array();
foreach($arr as $totrans){
$trans[$totrans] = Translator::translate($totrans);
}
return $trans;
}
языковые файлы могут быть просто include()
d и выглядеть так:
В файле En.php:
Translator::loadTranslation('en', array(
'textfield_1' => 'This is some Textfield',
'another_textfield ' => 'This is a longer Text showing how this is used',
));
de.php:
Translator::loadTranslation('de', array(
'textfield_1' => 'Dies ist ein Textfeld',
'another_textfield ' => 'Dies ist ein längerer Text, welcher aufzeigt, wie das hier funktioniert.',
));
в вашем приложении вы можете перевести одну строку следующим образом:
$string = Translator::translate('textfield_1')
или даже куча строк:
$strings = generateTemplateStrings(array('textfield_1', 'another_textfield'));
Поскольку языковые файлы могут быть просто включены, вы можете сложить их очень легко и, скажем, сначала включить глобальный файл, а затем включить файлы из подмодулей, которые могут либо добавлять новые строки, либо заменять уже определенные (что не работа с define()
-методом).
Поскольку это чистый PHP, его даже можно легко кэшировать с помощью кода операции.
У меня даже есть сценарии, вокруг которых генерируются CSV-файлы, содержащие нетранслируемые строки из файла, и что еще лучше: преобразовать переведенный CSV-файл обратно в языковой файл.
У меня есть это решение для продуктивного использования с 2004 года, и я очень доволен этим.
Конечно, вы можете даже расширить его соглашениями для множественного числа, например. Локализация числовых форматов - это то, что вам нужно сделать, используя другие средства - на ум приходит расширение intl.