Аргерих Л. О языке РНР. Часть 5. Страница 44


Не применяйте gettext() с РНР при отсутствии инфраструктуры, необходи­мой для ее работы через Сеть. Если решено использовать gettextO, то при пе­реходе на другой сервер, не поддерживающий эту библиотеку, придется моди­фицировать все команды вывода. Кроме того, лучше от нее отказаться при на­писании сценария, распространяемого среди разных многочисленных поль­зователей, поскольку это лишит большинство из них радости работы с ним.

С другой стороны, если gettext () станет стандартным компонентом РНР, это будет замечательная библиотека. В нескольких распространенных тексто­вых редакторах, например в emacs, есть специальная поддержка редактиро­вания файлов . ро.

Расширение системы с помощью объектов

Мы видели, как просто локализуются сценарии в результате размещения строк в массивах или в случае применения Gettext. Можно воспользоваться обеими системами локализации, но следует изучить возможность их рекон­струкции с помощью объектов. Идея состоит в том, чтобы собрать в одном классе все функции, осуществляющие вывод. Функции должны быть доста­точно общими и иметь возможность работы со многими языками путем простой подстановки переведенных строк. Одним из членов класса должен быть массив, в котором содержатся строки, необходимые функциям.

Важно отметить, что этот базовый класс не содержит в себе каких-либо строк. С массивом нельзя работать, пока в него не введены строки. Мы созда­дим новый класс, наследующий все методы базового класса. Все, что требу­ется от этого класса, - это заполнить строки, используемые методами выво­да в родительском классе.

Преимущества объектов

Большое преимущество состоит в том, что новый класс может переопреде­лять методы базового класса. Это звучит тривиально, пока не поймешь, что многие базовые функции вывода, необходимые любому специалисту по ло­кализации, можно написать в виде общих методов. Бывает так, что большая часть методов дает прекрасный результат для ряда языков, но один из них не годится в некотором особом случае конкретного языка. Тогда переводчик берет базовую функцию и заново реализует ее так, как считает нужным. Как правило, можно просто скопировать код исходной функции и добавить к не­му дополнительную проверку.

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