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


function _($string)

{

global Sstrings;

if (isset($strings[$string])) {

return $strings[$string]; } else {

return Sstring;

}

}

function gettext(Sstring) <

return _($string);

}

Этот код работает благодаря замечательным массивам в РНР, позволяющим использовать строки в качестве ключей. Изменения в программе невелики, но сильны:

function outNumFiles($count) {

if (Scount <= 0) {

print(_("No files.")); } elseif (Scount == 1) { print(_("1 file.")); } else {

printf(_("%s files."), Scount);

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

При интернационализации программ всегда следует помнить о языках, ко­торые могут обращаться с числами непривычным образом. Если написать процедуры вывода в стиле, который охватывает употребление этих языков, то снимается забота с экспертов по локализации, поскольку им не придется писать код. Мы воспользуемся функцией sprintf в части else для формати­рования выходной строки при наличии многих

Для того чтобы изменить язык в версии, написанной с применением Gettext, надо выполнить действия, описанные выше в разделе «GNU Gettext». В дру­гом варианте для изменения языка следует включить файл, содержащий другое определение rings, отличное от прежнего, в котором она имела значение Null. В случае локализации сценария для датского языка массив $st rings должен выглядеть так:

{strings = array(

'No files.' => 'Ingen filer. '1 file.' => 1 fil.', '%s files.' => '%s filer.');

Сохраните этот код в отдельном файле, включаемом в файл, содержащий код для outNumFiles(), Датский перевод работает отлично, но только потому, что грамматические структуры датского и английского вполне аналогичны - получается точное отображение каждого английского слова в датское. Это иллюстрирует массив:

{mapping = array (

'No' => Ingen', 'files' => 'filer', : 'file' =>

Ясно, что на совпадение логики для обоих языков можно рассчитывать, только если такое соответствие определяется. Только тогда перевод окажет­ся совершенным. Логика окажется нежизнеспособной, если для перевода английского слова «file» придется использовать два разных слова.

Чтобы понять, в чем проблема, посмотрим, как должна выглядеть функция, правильно выводящая данные на польском языке: