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» придется использовать два разных слова.
Чтобы понять, в чем проблема, посмотрим, как должна выглядеть функция, правильно выводящая данные на польском языке: