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

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

Шрифт:

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

gettext.h
, который поставляется с дистрибутивом GNU
gettext
. Этот файл обрабатывает несколько проблем переносимости и компиляции, упрощая использование
gettext
в ваших собственных программах:

#define ENABLELNLS 1 /* ENABLE_NLS должен быть true, чтобы gettext работала */

#include "gettext.h" /* Вместо <libintl.h> */

Если макрос

ENABLE_NLS
не определен [146] или установлен в ноль,
gettext.h
развертывает вызовы
gettext
в первый аргумент. Это делает возможным перенос кода, использующего
gettext
, на системы, в которых не установлены ни GNU
gettext
, ни собственная их версия. Помимо прочего, этот заголовочный файл определяет следующий макрос:

/* Вызов псевдофункции, который служит в качестве маркера для

146

Этот макрос обычно определяется автоматически программой

configure
, либо в специальном заголовке, либо в командной строке компилятора
configure
создается с помощью Autoconf и Automake — Примеч. автора.

автоматического извлечения сообщений, но не осуществляющий вызов

gettext. Перевод времени исполнения осуществляется в другом

месте кода. Аргумент String должен быть символической строкой.

Сцепленные строки и другие строковые выражения не будут работать.

Разворачивание макроса не параметризовано, так что он подходит для

инициализации статических переменных 'char[]' или 'const char[]'. */

#define gettext_noop(String) String

Комментарий самодостаточен. С помощью этого макроса мы можем теперь перейти ко второму шагу. Мы перепишем код следующим образом:

#define ENABLE_NLS 1

#include "gettext.h"

static char copyrights[] =

 gettext_noop("Copyright 2004, Jane Programmer\n"

 "Permission is granted ...\n"

 /* ... Здесь куча легальностей */

 "So there.");

void copyright(void) {

 printf("%s\n", gettext(copyrights));

}

Обратите внимание, что мы сделали два изменения. Во-первых,

copyrights
теперь является одной длинной строкой, созданной с использованием возможности конкатенации строк стандартного C. Эта простая строка затем включена в вызов
gettext_noop
. Нам нужна одна строка, чтобы легальности могли быть переведены в виде одного элемента

Второе изменение заключается в непосредственном выводе перевода в виде одной строки в

copyright
.

К этому времени вы, возможно, думаете: «Вот здорово, набирать каждый раз '

gettext(...)
' довольно неприятно». Ну, вы правы. Это не только создает лишнюю работу по набиванию, но также и затрудняет чтение исходного кода. Соответственно, когда вы используете заголовочный файл
gettext.h
, руководство GNU
gettext
рекомендует включить два других макроса с именами
_
и
N_
следующим образом:

#define ENABLE_NLS 1

#include "gettext.h"

#define _(msgid) gettext(msgid)

#define N_(msgid) msgid

Такой подход снижает накладные расходы по использованию

gettext
всего лишь тремя дополнительными символами для переводимой строковой константы и всего лишь четырьмя символами для статических строк:

#include <stdio.h>

#define ENABLE_NLS 1

#include "gettext.h"

#define _(msgid) gettext(msgid)

#define N_(msgid) msgid

...

static char copyrights[] =

 N_("Copyright 2004, Jane Programmer\n"

 "Permission is granted ...\n"

 /* ... Здесь куча легальностей */

 "So there.");

void copyright(void) {

 printf("%s\n", gettext(copyrights));

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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