У меня была эта проблема со сторонними модулями Apache, это часто встречается, когда они не настроены должным образом и вызывают сбой службы. Я создал бы резервную копию ваших модулей и протестировал бы сервис с каждым из них.
Странный. Люди, кажется, игнорируют очевидное решение. Ваша идея определенных для локали файлов прекрасна. Имейте en.php:
define('LOGIN_INCORRECT','Your login details are incorrect.');
...
Затем принятие Вас имеет глобальный файл конфигурации/констант (который я предложил бы по многим причинам), имейте код как это:
if ($language == 'en') {
reqire_once 'en.php';
} else if ($language == 'de') {
require_once 'de.php';
}
Можно определить функции для числа и дисплея валюты, сравнение/сортировка (т.е. немецкий, французский и английский язык, у всех есть различные методы сопоставления), и т.д.
Люди часто забывают, что PHP является динамическим языком так вещи как это:
if ($language == 'en') {
function cmp($a, $b) { ... }
} else if ($language == 'de') {
function cmp($a, $b) { ... }
}
на самом деле совершенно законны. Используйте их.
Можно использовать gettext или что-то, что поддерживает gettext, а также больше, такой как Zend_Translate.
Править:
Только для точности, Zend_Translate поддерживает gettext без gettext модуля. Вы видите здесь много различных типов входа, который это поддерживает.
При использовании массивов, равно как и предложено, можно также использовать это с Zend_Translate. Точка быть при использовании массивов сегодня и gettext, xml или чего-то еще завтра Вы только, должно изменить Вашу конфигурацию для Zend_Translate.
Я действительно люблю следующий подход:
один файл является самим переводчиком:
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, и я так очень доволен этим.
Конечно, можно даже расширить его с помощью конвенций для pluralizing, например. Локализация числовых форматов является чем-то, что необходимо было бы сделать использование других средств, хотя - intl-расширение приходит на ум.
Благодаря всем людям для Ваших подходов и решений. Я приехал сюда с тем же сомнением beggining, и я могу conlude, которые для использования "определяют метод", более реалистично, как, даже с нечетной проблемой, которая не использует очень стильные методы с другими библиотеками или некоторыми, будучи реалистичной и в продуктивных взглядах, так легка поддержать, и понять, таким образом, можно получить другую канавку языков, не программирующую чуваков навыков.
Я полагаю лучше, что метод массивов, поскольку Вы не должны распределять это большое многоязычный для получения некоторого traductions, кроме того, Вы используете меньше памяти, поскольку Вы загружаете только необходимые строки traducted.
О вещи, что, они не могут быть переопределены; хорошо, обычно если Вы определяете константы, то, потому что они не нуждаются или не должны быть изменены, так в случае необходимости, что можно использовать раздел для определенных строк и переменных.
Я addmint, что мне не нравится способ, которым они определяют взгляды файлов, но, возьмите в количестве, что Ваши посетители не волнуются вообще о способе, которым реализована идиома, идеальные допустимые реализации, и Вы будете, может легко получить некоторый traductions.
Вы могли бы хотеть посмотреть на платформу как CakePHP или CodeIgniter, которые подают интернационализировавшие намного легче заявки записи. Это не просто строки, которые необходимо рассмотреть - вещи как числовые форматы и форматы даты также должны составляться
Ваше решение должно хорошо работать, пока оно только предназначается для перевода. Как другие упомянули, существует много других базируемых переменных локали, таких как валюта и форматы даты.
Серьезный подход к подаванию Вашей защищенной от локали заявки должен был бы использовать Zend_Locale
объединенный с Zend_Translate
.
Zend_Locale
позволяет Вам легко обнаруживать локаль пользователя или устанавливать его, если Вы желаете. Этот класс полезен для того, чтобы автоматически установить корректный формат валюты, например.
Zend_Translate
позволяет Вам легко переводить текст с помощью нескольких различных форматов:
Ваш подход осуществим в случае, где Вы включаете другой constantfiles, в зависимости от которого языка выбрал пользователь.
Вы могли также пропустить постоянную часть и просто определить большую хеш-таблицу с константой => перевод для предотвращения катастрофических отказов в пространстве имен.
файл: en.php
$constants = Array( 'CONSTANT_KEY' => 'Translated string' );
файл: functions.php
function getConstant($key, $fallback) { // ... return constant or fallback here. }
Однако когда дело доходит до большого объема данных, этот подход будет трудно поддержать. Существует несколько других подходов, которые могли бы служить Вашей цели лучше, например, идеальное решение - то, где все Ваши константы хранятся в глобальном пространстве памяти для Вашего всего сайта, чтобы не иметь каждый reguest/thread, сохраняющий все эти переведенные данные в памяти. Это требует некоторого вида php подход модуля. Gettext как кто-то здесь предположил, мог бы использовать тот подход.
Google для локализации PHP для нахождения полезных ресурсов.
Одна подсказка для Вас, должен создать функцию, которая возвращает переведенную строку, и если это не находится в хеш-таблице, затем возвратите ключ хеша, Вы запросили с чем-то как * позади нее уведомить Вас, чтобы ей был нужен перевод.
Вот то, как я делаю это:
parent_script.php:
$lang_pick = "EN"; //use your own method to set language choice
require_once('trans_index.php');
echo $txt['hello'];
trans_index.php:
$text = array();
$text['hello'] = array (
"EN"=> "Hello",
"FR"=> "Bonjour",
"DE"=> "Guten Tag",
"IT"=> "Ciao"
); //as many as needed
foreach($text as $key => $val) {
$txt[$key] = $text[$key][$lang_pick];
}
Это может быть слишком просто для Ваших потребностей, но я нахожу это очень осуществимым. Это также делает очень легким поддержать несколько версий текста.