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

Всюду по 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 ?> 

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

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

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

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

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

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

Это тот же ответ, что и для всех вопросов:

Что лучше с [высокореализованным и широко используемым решением], чем с [моей взломанной взломанной нообской реализацией]?

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

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

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

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

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

с этим:

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

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