Объектно-ориентированная технология дает решение всех этих проблем. Объекты удобны тем, что переводчики могут начать просто с перевода массива строк, как в прежней системе.
Перед применением новой системы надо сделать несколько вещей. Прежде всего, язык функции декодирования должен быть нейтральным, т. е. она будет возвращать только числа. Интерпретировать эти числа в специфическом для языка контексте должна какая-то другая функция. После этого код вывода можно поместить в класс, назвав его, например, locale_common. Все переводы будут тогда действовать внутри собственного класса, например:
<?php /"
* Provides all the strings, needed by locale_common to produce English
* output.
*
* ©author Martin Geisler
4
class locale^en extends locale_common {
/** This constructor provides all the strings used. * @param array This is just passed on to locale_cornmon() -/'
furiet ion locale_en ($ input)
$this->strings['list_sentences_and'] = and : $this->stringst'list_sentences_comlna,] = ', '; $this->strings['list_sentences_final_and'] = \and'; $this->strings['location'] = 'This is a report
'for %s%s%s.';
.'. $this->strings['minutes'] = ' minutes';
$this->strings['time_format'] = 'The report was made' .
'%s ago, at ' , '%s%s%s UTC.';
}
?>
Этот класс просто загружает массив $st rings с английскими строками. Троекратное повторение %s предназначено для того, чтобы можно было размечать данные другими кодами, помимо просто <Ь>. Например, первый %s можно заменить элементом <font color=" red ">, второй - фактическими данными, а третий - тегом </font>. Таким образом, появляется выбор в стиле маркировки.
На этом заканчивается рассказ о том, как можно полностью интернационализировать сценарий из реальной жизни.
Резюме
В этой главе мы рассмотрели способы интернационализации программ с минимальной затратой сил. Было рассмотрено несколько технологий - чистый РНР с объектами или без них и библиотека Gettext.
Мы также узнали, как получить из броузера информацию о предпочтительном для пользователя языке. На основе этой информации можно отправлять страницы с правильной кодировкой символов.
Наконец, мы разобрали простые примеры, которые могут послужить твердой основой для расширения и экспериментов. Кроме того, мы преодолели некоторые более практические проблемы программирования, показав способы их решения, отличные от обычного подхода, и архитектурные решения для получения реальных результатов в нелинейных языковых конструкциях.