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

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

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

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

char *gettext(const char *msgid);

char *dgettext(const char *domainname, const char *msgid);

char *dcgettext(const char *domainname, const char *msgid, int category);

АргумСнты, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² этих функциях, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

const char *msgid

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌΠ°Ρ строка. Она дСйствуСт Π² качСствС ΠΊΠ»ΡŽΡ‡Π° ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ².

const char *domainname

ВСкстовый Π΄ΠΎΠΌΠ΅Π½, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, хотя

main()
Π²Ρ‹Π·Π²Π°Π»Π°
textdomain()
для установки собствСнного Π΄ΠΎΠΌΠ΅Π½Π° прилоТСния, сообщСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… тСкстовых Π΄ΠΎΠΌΠ΅Π½ΠΎΠ². (Π­Ρ‚ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΊ сообщСниям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² тСкстовом Π΄ΠΎΠΌΠ΅Π½Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΎΡ‚ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ стороны.)

int category

Одна ΠΈΠ· описанных Ρ€Π°Π½Π΅Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² (

LC_TIME
ΠΈ Ρ‚.ΠΏ.). Π”ΠΎΠΌΠ΅Π½ΠΎΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π°Π½ΡŒΡˆΠ΅ установлСно с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
textdomain()
(Β«
messages
», Ссли
textdomain()
Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»Π°ΡΡŒ). ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠ΅ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ являСтся
LC_MESSAGES
. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ,
main()
Π΄Π΅Π»Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ²:

textdomain("killerapp");

Π’ΠΎΠ³Π΄Π° '

gettext("my message")
' эквивалСнтно '
dgettext("killerapp", "my message")
'. ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, эквивалСнтны '
dcgettext("killerapp", "my message", LC_MESSAGES)
'.

Π’ 99,9% Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π±Ρ‹Π²Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

gettext()
. Однако, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ тСкстовыми Π΄ΠΎΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈΠ»ΠΈ катСгориями Π»ΠΎΠΊΠ°Π»Π΅ΠΉ. Π‘ΠΊΠΎΡ€Π΅Π΅ всСго, эта Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ потрСбуСтся ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ автономная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠΎΡ‡Ρ‚ΠΈ навСрняка Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свой собствСнный тСкстовый Π΄ΠΎΠΌΠ΅Π½.

ВсС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ строки. Π‘Ρ‚Ρ€ΠΎΠΊΠ° являСтся Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌ Π΄Π°Π½Π½ΠΎΠ³ΠΎ

msgid
, Π»ΠΈΠ±ΠΎ, Ссли ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π½Π΅ сущСствуСт, ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ строкой. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, всСгда имССтся ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Π΄Π°ΠΆΠ΅ Ссли это ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ сообщСниС (ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° английском). НапримСр:

/* ΠšΠ°Π½ΠΎΠ½ΠΈΡ‡Π΅ΡΠΊΠ°Ρ пСрвая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, локализованная вСрсия. */

#include <stdio.h>

#include <locale.h>

#include <libintl.h>

int main(void) {

Β setlocale(LC_ALL, "");

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

Β return 0;

}

Π₯отя сообщСниС являСтся простой строкой, ΠΌΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π΅ нСпосрСдствСнно Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строкС

printf()
, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΎΠ±Ρ‰Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ символы
%
.

ВскорС, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 13.3.4 Β«Π£ΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ использования

gettext()
Β», ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ использованиС
gettext()
Π² ΠΊΡ€ΡƒΠΏΠ½ΠΎΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹Ρ…, Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ….

13.3.3. Π Π°Π±ΠΎΡ‚Π° с мноТСствСнными числами:

ngettext()

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π²ΠΎ мноТСствСнном числС доставляСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ трудности. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠ³ Π±Ρ‹ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

printf("%d word%s misspelled\n", nwords, nwords > 1 ? "s" : "");

/* ΠΈΠ»ΠΈ */

printf("%d %s misspelled\n", nwords, nwords == 1 ? "word" : "words").

Π­Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для английского языка, Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ становится Ρ‚Ρ€ΡƒΠ΄Π½Ρ‹ΠΌ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… языках мноТСствСнноС число Π½Π΅ образуСтся с Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ, ΠΊΠ°ΠΊ Π² английском (Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ суффикса

s
для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° слов). Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… языках, особСнно Π² Восточной Π•Π²Ρ€ΠΎΠΏΠ΅, ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ нСсколько Ρ„ΠΎΡ€ΠΌ мноТСствСнного числа, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, сколько ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°. БоотвСтствСнно Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ΄ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ достаточным:

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()
ΠΈ Π½Π΅ обращая Π½Π° это внимания.