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

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

Шрифт:

8. Упростите жизнь для своих переводчиков, используя строки с полными предложениями вместо замены слов с помощью

%s
и
?:
. Например:

if (/* возникла ошибка */) { /* ВЕРНО */

 /* Использовать несколько строк для упрощения перевода. */

 if (input_type == INPUT_FILE)

fprintf(stderr, _("%s: cannot read file: %s\n"),

argv[0], strerror(errno));

 else

fprintf(stderr, _("%s: cannot read pipe: %s\n"),

argv[0], strerror(errno));

Это лучше, чем

if (/* возникла ошибка */) { /* НЕВЕРНО */

 fprintf(stderr, _("%s: cannot read %s: %s\n"), argv[0],

 input_type == INPUT_FILE ? _("file") : _("pipe"),

 strerror(errno));

}

Как только что показано, хорошей мыслью является включение комментария, сообщающего о намеренном использовании нескольких строк, чтобы упростить перевод сообщений.

13.3.8. Создание переводов

После интернационализации программы необходимо подготовить переводы. Это осуществляется с помощью нескольких инструментов уровня оболочки. Мы начнем с интернационализированной версии

ch06-echodate.c
из раздела 6.1.4 «Преобразование разложенного времени в
time_t
»:

/* ch13-echodate.c --- демонстрация переводов */

#include <stdio.h>

#include <time.h>

#include <locale.h>

#define ENABLE_NLS 1

#include "gettext.h"

#define _(msgid) gettext(msgid)

#define N_(msgid) msgid

int main (void) {

 struct tm tm;

 time_t then;

 setlocale(LC_ALL, "");

 bindtextdomain("echodate", ".");

 textdomain("echodate");

 printf("%s", _("Enter a Date/time as YYYY/MM/DD HH:MM:SS : "));

 scanf("%d/%d/%d %d:%d:%d",

&tm.tm_year, &tm.tm_mon, &tm.tm_mday,

&tm.tm_hour, &tm.tm_min, &tm.tm_sec);

 /* Проверка ошибок для краткости опущена. */

 tm.tm_year -= 1900;

 tm.tm_mon -= 1;

 tm.tm_isdst = -1; /* О летнем времени ничего не известно */

 then = mktime(&tm);

 printf(_("Got: %s"), ctime(&then));

 exit(0);

}

Мы намеренно использовали

"gettext.h"
, а не
<gettext.h>
. Если наше приложение поставляется с отдельной копией библиотеки
gettext
, тогда
"gettext.h"
найдет ее, избежав использования системной копии. С другой стороны, если имеется лишь системная копия, она будет найдена, если локальной копии нет. Общеизвестно, что ситуация усложнена фактом наличия на системах Solaris библиотеки
gettext
, которая не имеет всех возможностей версии GNU.

Переходя к созданию переводов, первым шагом является извлечение переводимых строк. Это осуществляется программой

xgettext
:

$ xgettext --keyword=_ --keyword=N_ \

> – -default-domain=echodate ch13-echodate.с

Опции

– -keyword
сообщает
xgettext
, что нужно искать макросы
_
и
N_
. Программа уже знает, как извлекать строки из
gettext
и ее вариантов, а также из
gettext_noop
.

Вывод

xgettext
называется переносимым объектным файлом. Имя файла по умолчанию
messages.ро
, что соответствует текстовому домену по умолчанию
"messages"
. Опция
– -default-domain
обозначает текстовый домен для использования в имени выходного файла. В данном случае, файл назван
echodate.ро
. Вот его содержание:

# SOME DESCRIPTIVE TITLE. /* Шаблон, нужно отредактировать */

# Copyright (С) YEAR THE PACKAGE'S COPYRIGHT HOLDER

  • Читать дальше
  • 1
  • ...
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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