Что хорошего в gettext для языковых файлов? - PullRequest
7 голосов
/ 12 сентября 2009

Везде в SO, когда речь заходит о создании мультиязычного приложения на PHP, все говорят, что gettext - лучший способ сделать это. Я просто хочу знать, почему?

Например, что делает этот метод ниже, менее эффективным, чем использование gettext?

<?PHP
//Have seperate language files for each language I add, this would be english file
function lang($phrase){
    static $lang = array(
        'NO_PHOTO' => 'No photo\'s available',
        'NEW_MEMBER' => 'This user is new'
    );
    return $lang[$phrase];
}
//Then in application where there is text from the site and not from users I would do something like this
echo lang('NO_PHOTO');  // No photo's available would show here
?>

Ответы [ 4 ]

13 голосов
/ 12 сентября 2009

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

Еще одна хорошая вещь (может быть, следствие, или причина, или и то и другое, на самом деле) в том, что существует несколько инструментов, таких как, например, Poedit для редактирования файлов gettext: не нужно проходить через некоторый исходный код PHP (или любой другой) . И это очень важно:

  • это означает, что нетехнические люди могут редактировать файлы локализации gettext
    • может быть, это не кажется тебе важным сейчас,
    • но если вы работаете с большим приложением с открытым исходным кодом, оно станет важным, если оно будет успешным, и многим это нужно на своем родном языке.
  • это означает, что они не рискуют сломать приложение (например, "ошибка синтаксического анализа" из-за несоответствия в кавычках ;-))
6 голосов
/ 12 сентября 2009

В вашей «реализации» есть несколько недостатков.

  • В отличие от gettext он реализован в php. ; -)
  • Сохраняет весь перевод в памяти независимо от того, используете вы его или нет
  • Что еще хуже, он создает весь массив данных всякий раз, когда вам нужна одна строка (это занимает некоторое время и довольно много памяти в PHP)
  • Невозможно обработать формы множественного числа для многих языков
  • Код, использующий этот перевод, трудно читаемый
  • Код, использующий этот перевод, не имеет встроенного отступления для использования в случае отсутствия перевода.

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

4 голосов
/ 12 сентября 2009

Это тот же ответ, что и на все вопросы выглядит так:

Что лучше с [достойно доказано и широко используемое решение] чем с [моей вздорной дерзкой нубой осуществление]

  • Это было здесь в течение долгого времени, хотите верьте, хотите нет, если опытный разработчик работал над этим, использовал его и хвалил, вероятно, по какой-то причине.
  • Это стандарт, и поэтому, даже если ваше решение будет лучше, цена за его нарушение может не стоить.
  • Он может сделать на 1000 больше, чем ваша реализация, потому что он разработан с учетом глобального масштаба, тогда как ваша идея направлена ​​только на решение вашей проблемы.

Я не критикую, мы все это сделали, пытаясь убедить себя в том, что мы умные, а другие - излишне программисты. Это часть способа учиться. Я на самом деле постоянно это делаю, изобретая велосипед или хвастаясь своими друзьями / коллегами о каком-то взломанном коде KISS. Со временем вы просто делаете это все реже и реже, и я полагаю, вы перестанете делать это в тот день, когда вы действительно заслуживаете этого: -)

1 голос
/ 29 декабря 2009

Преимущество gettext по сравнению с другими решениями, такими как ваше, строковые таблицы Java или ресурсы Windows, заключается в том, что он делает исходный код более читабельным.

Сравните это:

printf(_("No photo available (error %d)."), err);

с этим:

printf(i18n(NO_PHOTO), err);
// or some variant of the same thing

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

...