Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 199

Автор Роббинс ΠΡ€Π½ΠΎΠ»ΡŒΠ΄

13.3.4. Π£ΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ использования

gettext()

Π’Ρ‹Π·ΠΎΠ²

gettext()
Π² исходном ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ слуТит Π΄Π²ΡƒΠΌ цСлям. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠ½ осущСствляСт ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π²ΠΎ врСмя исполнСния, Ρ‡Ρ‚ΠΎ являСтся Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ² Π³Π»Π°Π²Π½Ρ‹ΠΌ. Однако, ΠΎΠ½ слуТит Ρ‚Π°ΠΊΠΆΠ΅ для ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠΈ строк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ пСрСвСсти. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π°
xgettext
Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ исходный ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ всС ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ пСрСвСсти. (Π”Π°Π»Π΅Π΅ Π² Π³Π»Π°Π²Π΅ ΠΌΡ‹ ΠΊΡ€Π°Ρ‚ΠΊΠΎ рассмотрим это.)

Рассмотрим всС-Ρ‚Π°ΠΊΠΈ случай, ΠΊΠΎΠ³Π΄Π° статичСскиС строки Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ нСпосрСдствСнно:

static char *copyrights[] = {

Β "Copyright 2004, Jane Programmer",

Β "Permission is granted ...",

Β /* ... Π—Π΄Π΅ΡΡŒ ΠΊΡƒΡ‡Π° Π»Π΅Π³Π°Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ */

Β NULL

};

void copyright(void) {

Β int i;

Β for (i = 0; copyrights[i] != NULL, i++)

Β  printf("%s\n", gettext(copyrights[i]));

}

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ вывСсти ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ строк ΠΎΠ± авторских ΠΏΡ€Π°Π²Π°Ρ…, Ссли ΠΎΠ½ΠΈ доступны. Однако, ΠΊΠ°ΠΊ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‰Π΅Π΅ устройство

xgettext
ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ эти строки? ΠœΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… Π² Π²Ρ‹Π·ΠΎΠ²Ρ‹
gettext()
, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π²ΠΎ врСмя компиляции:

/

* ΠŸΠ›ΠžΠ₯ΠžΠ™ ΠšΠžΠ”: Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ */

static char *copyrights[] = {

Β gettext("Copyright 2004, Jane Programmer"),

Β gettext("Permission is granted ..."),

Β /* ... Π—Π΄Π΅ΡΡŒ ΠΊΡƒΡ‡Π° Π»Π΅Π³Π°Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ */

Β NULL

};

13.3.4.1. ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: "

gettext.h
"

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ вмСстС с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ GNU

gettext
Π½Π° любой систСмС Unix, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ GNU/Linux. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π» описываСт, Ρ‡Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для GNU/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
, Π½ΠΈ собствСнная ΠΈΡ… вСрсия. Помимо ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ, этот Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» опрСдСляСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ макрос:

/* Π’Ρ‹Π·ΠΎΠ² псСвдофункции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слуТит Π² качСствС ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π° для

Β Β  автоматичСского извлСчСния сообщСний, Π½ΠΎ Π½Π΅ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ²

Β Β  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"