Программирование Многоязычных приложений PHP

У меня была эта проблема со сторонними модулями Apache, это часто встречается, когда они не настроены должным образом и вызывают сбой службы. Я создал бы резервную копию ваших модулей и протестировал бы сервис с каждым из них.

13
задан Jason S 16 January 2009 в 17:21
поделиться

9 ответов

Странный. Люди, кажется, игнорируют очевидное решение. Ваша идея определенных для локали файлов прекрасна. Имейте 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) { ... }
}

на самом деле совершенно законны. Используйте их.

11
ответ дан 1 December 2019 в 20:44
поделиться

Можно использовать gettext или что-то, что поддерживает gettext, а также больше, такой как Zend_Translate.

Править:

Только для точности, Zend_Translate поддерживает gettext без gettext модуля. Вы видите здесь много различных типов входа, который это поддерживает.

При использовании массивов, равно как и предложено, можно также использовать это с Zend_Translate. Точка быть при использовании массивов сегодня и gettext, xml или чего-то еще завтра Вы только, должно изменить Вашу конфигурацию для Zend_Translate.

8
ответ дан 1 December 2019 в 20:44
поделиться

Я действительно люблю следующий подход:

один файл является самим переводчиком:

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-расширение приходит на ум.

3
ответ дан 1 December 2019 в 20:44
поделиться

Благодаря всем людям для Ваших подходов и решений. Я приехал сюда с тем же сомнением beggining, и я могу conlude, которые для использования "определяют метод", более реалистично, как, даже с нечетной проблемой, которая не использует очень стильные методы с другими библиотеками или некоторыми, будучи реалистичной и в продуктивных взглядах, так легка поддержать, и понять, таким образом, можно получить другую канавку языков, не программирующую чуваков навыков.

Я полагаю лучше, что метод массивов, поскольку Вы не должны распределять это большое многоязычный для получения некоторого traductions, кроме того, Вы используете меньше памяти, поскольку Вы загружаете только необходимые строки traducted.

О вещи, что, они не могут быть переопределены; хорошо, обычно если Вы определяете константы, то, потому что они не нуждаются или не должны быть изменены, так в случае необходимости, что можно использовать раздел для определенных строк и переменных.

Я addmint, что мне не нравится способ, которым они определяют взгляды файлов, но, возьмите в количестве, что Ваши посетители не волнуются вообще о способе, которым реализована идиома, идеальные допустимые реализации, и Вы будете, может легко получить некоторый traductions.

3
ответ дан 1 December 2019 в 20:44
поделиться

Вы могли бы хотеть посмотреть на платформу как CakePHP или CodeIgniter, которые подают интернационализировавшие намного легче заявки записи. Это не просто строки, которые необходимо рассмотреть - вещи как числовые форматы и форматы даты также должны составляться

2
ответ дан 1 December 2019 в 20:44
поделиться

Ваше решение должно хорошо работать, пока оно только предназначается для перевода. Как другие упомянули, существует много других базируемых переменных локали, таких как валюта и форматы даты.

Серьезный подход к подаванию Вашей защищенной от локали заявки должен был бы использовать Zend_Locale объединенный с Zend_Translate.

Zend_Locale позволяет Вам легко обнаруживать локаль пользователя или устанавливать его, если Вы желаете. Этот класс полезен для того, чтобы автоматически установить корректный формат валюты, например.

Zend_Translate позволяет Вам легко переводить текст с помощью нескольких различных форматов:

  • Массив
  • CSV
  • Gettext
  • Ini
  • Tbx
  • Tmx
  • QT
  • Xliff
  • XmlTm
2
ответ дан 1 December 2019 в 20:44
поделиться

Ваш подход осуществим в случае, где Вы включаете другой 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 для нахождения полезных ресурсов.

0
ответ дан 1 December 2019 в 20:44
поделиться

Одна подсказка для Вас, должен создать функцию, которая возвращает переведенную строку, и если это не находится в хеш-таблице, затем возвратите ключ хеша, Вы запросили с чем-то как * позади нее уведомить Вас, чтобы ей был нужен перевод.

0
ответ дан 1 December 2019 в 20:44
поделиться

Вот то, как я делаю это:

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];

}

Это может быть слишком просто для Ваших потребностей, но я нахожу это очень осуществимым. Это также делает очень легким поддержать несколько версий текста.

0
ответ дан 1 December 2019 в 20:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: