function outNumFiles($count) {
if ($count == 0)
return "Nie ma plikyw.";
} elseif ({count == return "1 plik.";
} elseif ({count <= 4)йр return
} elseif ($count <:= 21) {
return "Scount plikyw."; } else {
$last_digit = substr($count, -1); if ($last_digit >= 2 && $last_digit <= 4) { return "$count pliki.";
} else {
return "Scount plikyw.";
}
}
}
Функция стала несколько сложнее. В польском языке есть несколько форм слова «file», и правила переключения между вариантами тоже становятся сложнее. Это показывает следующий пример вывода функции для польского языка (рис. 22.2):
Такого рода выдача плохо согласуется с системой, используемой с английским или датским языком. Раньше было только три случая: ноль файлов, один файл и несколько файлов. В польской функции различаются 6 случаев: ноль файлов, один файл, больше одного и меньше четырех файлов, больше 4 и меньше 22, а также больше 21, когда последняя цифра больше 1 и меньше 5. И еще один случай — когда последняя цифра не попадает в диапазон.
Если мы хотим гарантировать возможность перевода нашей программы на все языки, то должны обеспечить поддержку как английской/датской системы чисел, так и польской.
По существу, нам требуются разные функции для разных групп языков. Можно попробовать дать функциям уникальные имена для каждого языка, что равносильно копированию всего кода в разные файлы. Тогда возвращаются все проблемы, связанные с обеспечением синхронизации различных функций/файлов. Более искусным является решение, использующее объекты, а не файлы.
Применение объектов
для диверсификации перевода
Объекты позволяют дочерним объектам переопределять некоторые методы родительского класса. В случае применения объектов не надо беспокоиться о том, используется ли функция базового класса вывода или метод, переопределенный каким-нибудь потомком базового класса. Любой вызываемый метод должен вызывать подходящую строку.
Начнем с базового класса вывода. Этот класс должен содержать только функции, нейтральные к языку, чтобы дочерним классам не пришлось переопределять слишком много методов. Наш базовый класс выглядит так:
<?php
class Basic_Output {
var $strings;
function _($string) {
if <isset($this->strings[$string])) {
return $this->strings[$string]; } else {
return Sstring;
}
>
function {
return $this->_($string);
}
function {
if ($count == 0) M
return $this->gettext("No files."); } elseif (Scount == 1) {