Задача
Необходимо отслеживать различные каталоги сообщений и изображения.
Решение
Есть два приема, позволяющих упростить управление ресурсами локализации. Первый заключается в создании нового объекта языка, например канадского английского, унаследованного от существующего родственного языка, такого как американский английский. Достаточно заменить слова и фразы нового объекта, отличающиеся от слов
и фраз оригинального языка.
Второй прием: надо отметить, какие фразы нового языка еще нуждаются в переводе, и поместить в объект нового языка заглушки, которые должны иметь те же самые значения, что и в базовом языке. Обнаружив одинаковые значения в базовом и в новом языках, можно затем сгенерировать список слов и фраз, подлежащих переводу.
Обсуждение
Программа catalog-compare.php, показанная в примере 16.2, выводит сообщения, совпадающие в обоих каталогах, а также сообщения, которые отсутствуют в одном каталоге, но присутствуют в другом.
Пример 16.2. catalog-compare.php
$base = 'pc_MC_'.$_SERVER['argv'];
$other = 'pc_MC_'.$_SERVER['argv'];require 'pc_MC_Base.php';
require "$base.php";
require "$other.php";
$base_obj = new $base;
$other_obj = new $other;
/* Проверяем сообщения другого класса, которые совпадают
* с сообщениями базового класса или они находятся
* в базовом классе, но отсутствуют в другом классе */
foreach ($base_obj->messages as $k => $v) {
if (isset($other_obj->messages[$k])) {
if ($v == $other_obj->messages[$k]) {
print "SAME: $k\n";
}
} else {
print "MISSING: $k\n";
}
}
/* Проверяем сообщения другого класса, которые
* отсутствуют в базовом классе */
foreach ($other_obj->messages as $k => $v) {
if (! isset($base_obj->messages[$k])) {
print "MISSING (BASE): $k\n";
}
}
Чтобы воспользоваться этой программой, поместите каждый объект каталога сообщений в файл с тем же именем, что и имя объекта (т. е. класс pc_MC_en_US должен находиться в файле с именем pc_MC_en_US.php, а класс pc_MC_es_US – в файле pc_MC_es_US.php). Затем вызовите программу из командной строки с двумя именами локалей в качестве аргументов:
% php catalog-compare.php en_US es_US
В контексте веб-разработки целесообразным может оказаться использование отдельной локали и каталога сообщений для каждого запроса.
Локаль может поступить из броузера (в заголовке Accept-Language) или может быть установлена в явном виде сервером (для отображения одного и того же содержания на разных языках могут быть установлены разные виртуальные хосты). Если для выбора каталога сообщений для каждого запроса требуется один и тот же код, то можно реализовать класс каталога сообщений следующим образом:
$classname = "pc_MC_$locale.php";
require 'pc_MC_Base.php';
require $classname.'.php';
$MC = new $classname;