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


return $this->gettext("l file."); } else {

return sprintf($this->gettext("%s files."), $count);

)

}

>

?>

Этот класс содержит оболочки для наших функций-оболочек Gettext, а так­же нашу функцию outNumFiles(). Затем мы создадим другой класс для выво­да на английском языке, который унаследует члены-переменные и методы базового класса:

<7 php

class English_0utput extends Basic_0utput {

// Здесь делать нечего, поскольку по умолчанию строки // содержат текст на английском языке!

1 ?>

Как и в Gettext, наша функция gettext() возвращает исходную строку, если не может найти ее в массиве, поэтому все строки автоматически обращаются в английский язык.

Если мы создадим объект типа English_0utput, он сможет отправлять на эк­ран правильно форматированные строки на английском языке:

Job] = new English_Output( ) ; echo($obj->outNumFiles(3)); // 3 files.

Перевод на датский должен использовать тот же базовый класс, что и для английского. Он выглядит так:

<?php

class Danish Output extends Basic Output f

function Danish OutputQ {

$this->strings = array(

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

}

}

?>

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

Если мы решим, что нам нужен датский, а не английский, то будем созда­вать объект для вывода датского, а не английского. Метод будет применять­ся тот же самый:

$obj = new Danish_Output(); echo($obj->outNumFiles(5)), // 5 filer.

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

<?php

class Polish_0utput extends Basic_0utput {

function outNumFiles($count) {

if (Scount == 0) {

return "Niema plikyw."; } elseif (Scount ==1) { return "1 plik. ";

elseif ($count <= 4) return "Scount pliki."; HHjelseiC (Scount <= 21) {

return "Scount plikyw.";

} else {

$last_digit = substr(Scount, -1); if (Slast_digit >= 2 && Slast_digit :<= 4) {

return

f^fi e^se Я

return

}

}

I

}

?>

Польский объект не использует массив $st ring, объявленный в родитель­ском классе, потому что функция outNumFiles() сама предоставляет все стро­ки. Хотя мы и стараемся отделить строки от кода, в данном случае мы имеем пример прямо противоположный. Обоснованием служит то, что только ядро приложения не должно иметь в коде жестко прошитых строк. Локали могут переопределять методы базового класса, как хотят - могут использовать массив $st rings, а могут прошить строки в коде, как выше.