Если внести исправления в базовый класс, от этого выиграют все языки. Конечно, этот метод нельзя будет применить, если есть методы для конкретных языков, которые уже заменяют исправленный метод. В таком случае надо обновить классы только для одного или нескольких языков, тогда как если бы программист просто целый класс, пришлось бы прове
рять все языки.
Кроме того, переводчик может просто начать переводить строки. Хотя в нашем подходе использованы объекты, переводчику необязательно вначале работать с ними, и он может просто игнорировать первые несколько строк в локали, которые определяют класс. Если переводчик захочет потом исправить перевод, ему будет нетрудно это сделать.
Использование объектов и переключение между языками
Если работать с объектами так, как описано выше, то кажется невозможным переключать язык объекта, скажем, с английского на немецкий. Однако можно создать объект, который с самого начала выводит правильный язык. Эта задача решается очень просто. Мы проверим, доступен ли требуемый язык, создадим объект, используя оператор switch, а затем создадим экземпляр этого объекта в качестве члена класса, содержащего все базовые функции. Таким образом мы сможем переключать объект вывода или, скорее, языки вывода, не разрушая исходный объект, содержащий все свойства и данные.
Объект вывода недолжен содержать какую-либо информацию, отсутствующую в родительском объекте, чтобы можно было удалить объект вывода без ущерба для родительского объекта.
Преобразование имеющихся программ
Обсудив в общих словах создание хорошей системы перевода, посмотрим, как преобразовать существующую программу.
Непереведенная программа
Займемся функцией, которая может входить в какой-нибудь большой сценарий и осуществляет перемещение по файловой системе. Мы уже встречали эту небольшую функцию в разделе «Динамические строки». Она всего лишь выводит строку с указанием количества файлов в конкретном каталоге. Вот как выглядит функция до перевода:
function outNumFiles($count) {
if (Scount 0) { echo("No files. ");
} elseif ($count ==1) { echo("1 file.");
} else {
echo("Scount files. ");
)
\
Перевод программы
Если установка РНР поддерживает Gettext, можно воспользоваться этой библиотекой для хранения строк. Если нет, то нетрудно создать оболочку, которая выбирает строки из массива. Эта оболочка действует так же, как
gettext() или _( ), возвращая исходную строку, если нельзя найти перевод: