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

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

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

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. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, наш ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹Ρ… слов выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

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

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ nwords Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ngettext() для Π²Ρ‹Π±ΠΎΡ€Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки, Π° Π·Π°Ρ‚Π΅ΠΌ printf() для форматирования. Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ, Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ макрос ΠΈΠ»ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· измСняСтся, ΠΊΠ°ΠΊ Π² случаС 'n++'! Π’Π°ΠΊΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ, Ссли Π²Ρ‹ осущСствляСтС глобальноС Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, добавляя Π²Ρ‹Π·ΠΎΠ²Ρ‹ ngettext() ΠΈ Π½Π΅ обращая Π½Π° это внимания.

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"

#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));

}


int main(void) {

 setlocale(LC_ALL, ""); /* gettext.h gets <locale.h> for us too */

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

 copyright();

 exit(0);

}

Π­Ρ‚ΠΈ макросы скромны, ΠΈ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ всС GNU ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ GNU gettext, ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ этому соглашСнию. Если Π²Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ GNU gettext, Π²Π°ΠΌ Ρ‚ΠΎΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ этому соглашСнию.

13.3.4.2. Волько GLIBC: <libintl.h>

Для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ лишь Π½Π° систСмах с GLIBC, использованиС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ макросов ΠΏΠΎΡ…ΠΎΠΆΠ΅, Π½ΠΎ ΠΏΡ€ΠΎΡ‰Π΅:

#include <stdio.h>

#include <libintl.h>

#define _(msgid) gettext(msgid)

#define N_(msgid) msgid

/* ... всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Ρ‚ΠΎ ΠΆΠ΅ ... */

Как ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Ρ€Π°Π½Π΅Π΅, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» <libintl.h> ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ gettext() ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Π°ΠΌ всС Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ _() ΠΈ N_(), Π½ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ ENABLE_NLS ΠΈΠ»ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ с исходным ΠΊΠΎΠ΄ΠΎΠΌ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ„Π°ΠΉΠ»Π° gettext.h.

13.3.5. ΠŸΠ΅Ρ€Π΅ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° порядка слов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ printf()

Иногда ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°Ρ… порядок слов, СстСствСнный для английского языка, Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках. НапримСр, Π½Π° английском ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄ опрСдСляСмыми ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ, Π° Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… языках β€” послС. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ прСдставляСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ:

char *animal_color, *animal;


if (...) {

 animal_color = _("brown");

 animal = _("cat");

} else if (...) {

 ...

} else {

 ...

}

printf(_("the %s %s looks at you enquiringly.\n"), animal_color, color);

Π—Π΄Π΅ΡΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ строка, animal_color ΠΈ animal Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² Π²Ρ‹Π·ΠΎΠ² gettext(). Однако, послС ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ порядок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Π²ΠΎ врСмя исполнСния.