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

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

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

#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()
. Однако, послС ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ порядок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Π²ΠΎ врСмя исполнСния.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ это, вСрсия сСмСйства

printf()
POSIX (Π½ΠΎ Π½Π΅ ISO Π‘) допускаСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² описатСлС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ полоТСния. Он ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΡƒ дСсятичного числа, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт символ
$
, сразу послС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ символа
%
. НапримСр
printf("%2$s, %1s\n", "world", "hello")
;

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ полоТСния ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΈΠ· списка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, отсчСт начинаСтся с 1 ΠΈ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ саму Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ строку. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π·Π½Π°ΠΌΠ΅Π½ΠΈΡ‚ΠΎΠ΅ сообщСниС '

hello, world
' Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС.

GLIBC ΠΈ Solaris Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ эту Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это Ρ‡Π°ΡΡ‚ΡŒ POSIX, Ссли

printf()
вашСго поставщика Unix Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π΅Π΅, ΠΎΠ½Π° вскорС Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ.

Π—Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ полоТСния ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ

printf()
, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΏΠΎΠ»Π΅ΠΉ ΠΈ точности. Π’ΠΎΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π° для использования ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ полоТСния:

β€’Β Π€ΠΎΡ€ΠΌΠ° с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ полоТСния Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒΡΡ с Ρ„ΠΎΡ€ΠΌΠΎΠΉ Π±Π΅Π· Π½Π΅Π΅. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΈΠ»ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ полоТСния, ΠΈΠ»ΠΈ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ Π΅Π³ΠΎ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ,

%%
ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ всСгда.

‒ Если Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строкС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ N-ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π² этой строкС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΆΠ΅ всС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π΄ΠΎ N. БоотвСтствСнно, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π½Π΅Π²Π΅Ρ€Π½ΠΎ

printf("%3$s %1$s\n", "hello", "cruel", "world")
;

‒ Бсылка Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сдСлана ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ полоТСния нСсколько Ρ€Π°Π·. НС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ спСцификаторы Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° всСгда двиТутся Ρ‡Π΅Ρ€Π΅Π· список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

Π­Ρ‚Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для нСпосрСдствСнного использования программистами ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΎΠ½Π° скорСС для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠΎΠ². НапримСр, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки,

"The %s %s looks at you enquiringly.\n"
, Π½Π° французский ΠΌΠΎΠ³ Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ:

"Le %2$s %1$s te regarde d'un aire interrogateur.\n"

(Π”Π°ΠΆΠ΅ этот ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π½Π΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π΅Π½: Π°Ρ€Ρ‚ΠΈΠΊΠ»ΡŒ Β«LeΒ» ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€ΠΎΠ΄. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρƒ трудная Π·Π°Π΄Π°Ρ‡Π°!)

13.3.6. ВСстированиС ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ² Π² ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅

ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ сообщСний Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ называСтся списком сообщСний (message catalog). Π­Ρ‚ΠΎΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ примСняСтся Ρ‚Π°ΠΊΠΆΠ΅ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΈΠ· ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ² сообщСний Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ язык. Когда ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° установлСна, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Ρ‚Π°ΠΊΠΆΠ΅ устанавливаСтся Π² стандартноС мСсто, Π³Π΄Π΅

gettext()
ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎ врСмя исполнСния Π½Π°ΠΉΡ‚ΠΈ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄.

ΠœΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ Π½Π΅ Π² стандартном, Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, особСнно для тСстирования ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ОсобСнно Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… систСмах, Ρƒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ для установки Ρ„Π°ΠΉΠ»ΠΎΠ² Π² систСмныС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ. Ѐункция

bindtextdomain()
Π΄Π°Π΅Ρ‚
gettext()
Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ мСсто для поиска ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ²:

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

char *bindtextdomain(const char *domainname,