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, а могут прошить строки в коде, как выше.