Всюду по 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
он реализован в php
. 😉 В основном, ваша реализация широко используется во многих проектах, которые умирают, заявляя о своей поддержке интернационализации и новаторском изобретении колеса, но не заботятся о результатах и не знают хорошего от плохого.
Это тот же ответ, что и для всех вопросов:
Что лучше с [высокореализованным и широко используемым решением], чем с [моей взломанной взломанной нообской реализацией]?
Я не критикую, мы все это делали, пытаясь убедить себя, что мы умники, а другие – программисты с избытком. Это часть пути к обучению. Я на самом деле постоянно это делаю, изобретая колесо или хвастаясь своими друзьями / коллегами о каком-то кодеке KISS, который я взломал. Со временем вы просто делаете это все меньше и меньше, и я полагаю, вы прекратите делать это в тот день, когда вы действительно заслуживаете этого 🙂
Преимущество gettext по сравнению с другими решениями, такими как ваши, строковые таблицы Java или ресурсы Windows, заключается в том, что он делает исходный код более удобочитаемым.
Сравните это:
printf(_("No photo available (error %d)."), err);
с этим:
printf(i18n(NO_PHOTO), err); // or some variant of the same thing
В первом случае вы можете увидеть сообщение прямо в коде, и вы точно знаете, что он делает. В последнем случае вы видите только символическую константу и должны искать точные спецификаторы текста и формата.