Что такого хорошего в gettext для языковых файлов?

StackOverflow https://stackoverflow.com/questions/1415661

  •  06-07-2019
  •  | 
  •  

Вопрос

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

Например, что делает этот метод ниже менее эффективным, чем использование 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
?>
Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

Что может быть лучше с [Hightly Dofred и Gorebound Case Solution], чем с [My Hacky Cocky Noob реализация]?

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

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

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

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

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

с этим:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top