Хороший способ создания сценариев, поддерживающих переводы? - PullRequest
1 голос
/ 19 января 2010

Я создаю cms с открытым исходным кодом, и мне просто интересно, что является лучшим способом добавить локализации? Я уже решил хранить их в файлах, похожих на lang.en.php. Я бы взял массивы, но в каком виде?

$lang['xyz'] = "Text goes here!";
$lang['Text goes here!'] = "Translated text!";

Или я должен создать свой собственный анализатор и добавить локализации в файл, например:

"Text goes here!" = "Translated text!";

А потом просто разбери его.

Что бы вы предложили? Я пытался найти, но безрезультатно.

Марти Лайн

Ответы [ 4 ]

0 голосов
/ 19 января 2010

Как вы будете управлять формой множественного числа?

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

На польском мы используем, например, Плик (файл) это способ:

      1 plik
      2,3,4 pliki
      5-21 pliko'w
      22-24 pliki
      25-31 pliko'w

По этой причине я предлагаю вам использовать gettext, потому что все сделано для вас.

0 голосов
/ 19 января 2010

Я думаю, что вы должны использовать способ Joomla. Языковые файлы должны иметь расширение ini:

FOO=translation
BAR=translation2

затем вы анализируете файл с помощью функции parse_ini_file и получаете массив перевода:

$dictionary=parse_ini_file("english.ini");

    function translate($text)
    {
       global $dictionary;
       if(isset($dictionary[strtoupper($text)])) return $dictionary[strtoupper($text)];
       else return $text;
    }
0 голосов
/ 19 января 2010

Это не так просто, как вы думаете, вам действительно нужны сотни строк в массиве для перевода I deleted 45 comments или I deleted 192 comments?и т.д.

Было бы очень полезно, если бы вы могли вызвать функцию перевода с помощью: translate('I deleted %d comments', $number);

<?php
    $dict = parse_ini_file('lang.ini');

    function translate($text){
        global $dict;
        $args = func_get_args();
        if(isset($dict[$text])){
            // I am not sure how to convert %d in $args[.], maybe someone else could provide a regular expression for this.
        } else {
            return $text;
        }
    }
?>
0 голосов
/ 19 января 2010

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

По сути, вы должны написать каждую строку с именем функции tr("How are you?").Затем создайте функцию для ее перевода:

include('lang.es.php');
function tr($txt) {
   global $tr;
   if(array_key_exists($txt,$tr)) {
     return $tr($txt);
   }
   return $txt;
}

И в lang.es.php укажите:

$tr = array();
$tr["How are you?"] = "¿Como Estas?";

Возможно, вы захотите сделать printf(tr("How are you, %s?"), $name); для переменных или правильносуществительные, которые не должны переводиться.

...