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


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

рять все языки.

Кроме того, переводчик может просто начать переводить строки. Хотя в на­шем подходе использованы объекты, переводчику необязательно вначале работать с ними, и он может просто игнорировать первые несколько строк в локали, которые определяют класс. Если переводчик захочет потом испра­вить перевод, ему будет нетрудно это сделать.

Использование объектов и переключение между языками

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

Объект вывода недолжен содержать какую-либо информацию, отсутствую­щую в родительском объекте, чтобы можно было удалить объект вывода без ущерба для родительского объекта.

Преобразование имеющихся программ

Обсудив в общих словах создание хорошей системы перевода, посмотрим, как преобразовать существующую программу.

Непереведенная программа

Займемся функцией, которая может входить в какой-нибудь большой сце­нарий и осуществляет перемещение по файловой системе. Мы уже встреча­ли эту небольшую функцию в разделе «Динамические строки». Она всего лишь выводит строку с указанием количества файлов в конкретном катало­ге. Вот как выглядит функция до перевода:

function outNumFiles($count) {

if (Scount 0) { echo("No files. ");

} elseif ($count ==1) { echo("1 file.");

} else {

echo("Scount files. ");

)

\

Перевод программы

Если установка РНР поддерживает Gettext, можно воспользоваться этой библиотекой для хранения строк. Если нет, то нетрудно создать оболочку, которая выбирает строки из массива. Эта оболочка действует так же, как

gettext() или _( ), возвращая исходную строку, если нельзя найти перевод: