Вход/Регистрация
Linux программирование в примерах
вернуться

Роббинс Арнольд

Шрифт:

/* Каноническая первая программа, локализованная версия. */

#include <stdio.h>

#include <locale.h>

#include <libintl.h>

int main(void) {

 setlocale(LC_ALL, "");

 printf("%s\n", gettext("hello, world"));

 return 0;

}

Хотя сообщение является простой строкой, мы не используем ее непосредственно в форматирующей строке

printf
, поскольку в общем перевод может содержать символы
%
.

Вскоре, в разделе 13.3.4 «Упрощение использования

gettext
», мы увидим, как облегчить использование
gettext
в крупномасштабных, реальных программах.

13.3.3. Работа с множественными числами:

ngettext

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

printf("%d word%s misspelled\n", nwords, nwords > 1 ? "s" : "");

/* или */

printf("%d %s misspelled\n", nwords, nwords == 1 ? "word" : "words").

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

s
для большинства слов). Во-вторых, во многих языках, особенно в Восточной Европе, имеются несколько форм множественного числа, каждая из которых указывает на то, сколько объектов обозначает форма. Соответственно даже код наподобие следующего не будет достаточным:

if (nwords == l)

 printf("one word misspelled\n");

else

 printf("%d words misspelled\n", nwords);

Решением является параллельный набор процедур специально для форматирования множественных значений:

#include <libintl.h> /* GLIBC */

char *ngettext(const char *msgid, const char *msgid_plural,

 unsigned long int n);

char *dngettext(const char *domainname, const char *msgid,

 const char *msgid_plural, unsigned long int n);

char *dcngettext(const char *domainname, const char *nmgid,

 const char *msgid_plural, unsigned long int n,

 int category)

Помимо первоначального аргумента

msgid
, эти функции принимают дополнительные аргументы:

const char *msgid_plural

Строка по умолчанию для использования в качестве множественного числа. Вскоре будут примеры.

unsigned long int n

Число имеющихся элементов.

Список сообщений каждой локали указывает, как переводить множественные числа. [145] Функция

ngettext
(и ее варианты) проверяет
n
и на основании спецификации в списке сообщений возвращает соответствующий перевод
msgid
. Если в списке нет перевода для
msgid
, или находясь в локали «С»,
ngettext
возвращает
msgid
, если '
n == 1
'; в противном случае она возвращает
msgid_plural
. Таким образом, наш пример ошибочных слов выглядит следующим образом:

145

Подробности приведены в документации GNU

gettext
. Здесь мы концентрируемся на потребностях разработчика, а не переводчика — Примеч. автора.

printf("%s\n", ngettext("%d word misspelled", "%d words misspelled", nwords), nwords);

Обратите внимание, что

nwords
должен быть передан
ngettext
для выбора форматирующей строки, а затем
printf
для форматирования. Вдобавок, будьте осмотрительны и не используйте макрос или выражение, значение которого каждый раз изменяется, как в случае '
n++
'! Такое может случиться, если вы осуществляете глобальное редактирование, добавляя вызовы
ngettext
и не обращая на это внимания.

13.3.4. Упрощение использования

gettext

Вызов

gettext
в исходном коде программы служит двум целям. Во-первых, он осуществляет перевод во время исполнения, что является в конце концов главным. Однако, он служит также для отметки строк, которые нужно перевести. Утилита
xgettext
читает исходный код программы и извлекает все оригинальные строки, которые нужно перевести. (Далее в главе мы кратко рассмотрим это.)

  • Читать дальше
  • 1
  • ...
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: