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,
const char *dirname);
ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ Π²ΠΊΠ»ΡΡΠ°ΡΡ '.' Π΄Π»Ρ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΠΈ /tmp. ΠΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΡΠ΄ΠΎΠ±Π½ΡΠΌ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΡΠΎΠΌΡ:
char *td_dir;
setlocale(LC_ALL, "");
textdomain("killerapp");
if ((td_dir = getenv("KILLERAPP_TD_DIR")) != NULL)
bindtextdomain("killerapp", td_dir);
bindtextdomain() Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π²ΡΠ·Π²Π°Π½Π° Π΄ΠΎ Π²ΡΠ·ΠΎΠ²ΠΎΠ² Π»ΡΠ±ΠΎΠΉ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈΠ· ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° gettext(). ΠΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 13.3.8 Β«Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΎΠ²Β»
13.3.7. ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΠΈΠ½ΡΠ΅ΡΠ½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ
Π Π½Π°ΡΡΠΎΡΡΠ΅ΠΌΡ ΠΌΠΎΠΌΠ΅Π½ΡΡ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ Π²ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ½ΡΠ΅ΡΠ½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°. ΠΠ°Π½Π½ΡΠΉ ΡΠ°Π·Π΄Π΅Π» ΠΏΠΎΠ΄Π²ΠΎΠ΄ΠΈΡ ΠΈΡΠΎΠ³ΠΈ.
1. ΠΠΊΠ»ΡΡΠΈΡΠ΅ Π² ΡΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» gettext.h, Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π΄Π»Ρ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ² _() ΠΈ N_() Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π²ΠΎ Π²ΡΠ΅ Π²Π°ΡΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ Π½Π° Π‘. ΠΠ΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ ENABLE_NLS.
2. ΠΡΠ·ΠΎΠ²ΠΈΡΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ setlocale(). ΠΡΠΎΡΠ΅ Π²ΡΠ΅Π³ΠΎ Π²ΡΠ·Π²Π°ΡΡ 'setlocale(LC_ALL, "")', Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ Π±ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ°Π·Π±ΠΎΡΡΠΈΠ²ΡΠΌ Π² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ.
3. ΠΡΠ±Π΅ΡΠΈΡΠ΅ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ Π΄ΠΎΠΌΠ΅Π½ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Π΅Π³ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ textdomain().
4. ΠΡΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ²ΡΠΆΠΈΡΠ΅ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ Π΄ΠΎΠΌΠ΅Π½ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠΌ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ bindtextdomain().
5. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ strfmon(), strftime() ΠΈ ΡΠ»Π°Π³ '. ΠΡΠ»ΠΈ Π½ΡΠΆΠ½Π° Π΄ΡΡΠ³Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π»ΠΎΠΊΠ°Π»ΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ nl_langinfo(), ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π² ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠΈ Ρ strftime().
6. ΠΠΎΠΌΠ΅ΡΡΡΠ΅ Π²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Π½Ρ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌΠΈ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ _() ΠΈΠ»ΠΈ N_().
Π₯ΠΎΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ°ΠΊ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ getopt_long() (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» 2.1.2 Β«ΠΠ»ΠΈΠ½Π½ΡΠ΅ ΠΎΠΏΡΠΈΠΈ GNUΒ»), Π²Ρ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π½Π΅ Π·Π°Ρ ΠΎΡΠΈΡΠ΅, ΡΡΠΎΠ±Ρ ΠΈΠΌΠ΅Π½Π° Π΄Π»ΠΈΠ½Π½ΡΡ ΠΎΠΏΡΠΈΠΉ Π±ΡΠ»ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π°. ΠΠ΅ ΡΡΠ΅Π±ΡΡΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΠΈ ΠΏΡΠΎΡΡΡΠ΅ ΡΠΎΡΠΌΠ°ΡΠΈΡΡΡΡΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ "%d %d\n", ΡΠ°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ.
7. Π Π½ΡΠΆΠ½ΡΡ ΠΌΠ΅ΡΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ngettext() (ΠΈΠ»ΠΈ Π΅Π΅ Π²Π°ΡΠΈΠ°Π½ΡΡ) Π΄Π»Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ 1 ΠΈΠ»ΠΈ Π±ΠΎΠ»ΡΡΠ΅ 1.
8. Π£ΠΏΡΠΎΡΡΠΈΡΠ΅ ΠΆΠΈΠ·Π½Ρ Π΄Π»Ρ ΡΠ²ΠΎΠΈΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΠΈΠΊΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΡΠΎΠΊΠΈ Ρ ΠΏΠΎΠ»Π½ΡΠΌΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ Π²ΠΌΠ΅ΡΡΠΎ Π·Π°ΠΌΠ΅Π½Ρ ΡΠ»ΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ %s ΠΈ ?:. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
if (/* Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ° */) { /* ΠΠΠ ΠΠ */
/* ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΠΊ Π΄Π»Ρ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π°. */
if (input_type == INPUT_FILE)
fprintf(stderr, _("%s: cannot read file: %s\n"),
argv[0], strerror(errno));
else
fprintf(stderr, _("%s: cannot read pipe: %s\n"),
argv[0], strerror(errno));
ΠΡΠΎ Π»ΡΡΡΠ΅, ΡΠ΅ΠΌ
if (/* Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ° */) { /* ΠΠΠΠΠ ΠΠ */
fprintf(stderr, _("%s: cannot read %s: %s\n"), argv[0],
input_type == INPUT_FILE ? _("file") : _("pipe"),
strerror(errno));
}
ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Ρ ΠΎΡΠΎΡΠ΅ΠΉ ΠΌΡΡΠ»ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, ΡΠΎΠΎΠ±ΡΠ°ΡΡΠ΅Π³ΠΎ ΠΎ Π½Π°ΠΌΠ΅ΡΠ΅Π½Π½ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΡΡΠΎΠΊ, ΡΡΠΎΠ±Ρ ΡΠΏΡΠΎΡΡΠΈΡΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ.
13.3.8. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΎΠ²
ΠΠΎΡΠ»Π΅ ΠΈΠ½ΡΠ΅ΡΠ½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Ρ. ΠΡΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΡΡΠΎΠ²Π½Ρ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ. ΠΡ Π½Π°ΡΠ½Π΅ΠΌ Ρ ΠΈΠ½ΡΠ΅ΡΠ½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ch06-echodate.c ΠΈΠ· ΡΠ°Π·Π΄Π΅Π»Π° 6.1.4 Β«ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π² time_tΒ»:
/* ch13-echodate.c --- Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΎΠ² */
#include <stdio.h>
#include <time.h>
#include <locale.h>
#define ENABLE_NLS 1
#include "gettext.h"
#define _(msgid) gettext(msgid)
#define N_(msgid) msgid
int main (void) {
struct tm tm;
time_t then;
setlocale(LC_ALL, "");
bindtextdomain("echodate", ".");
textdomain("echodate");
printf("%s", _("Enter a Date/time as YYYY/MM/DD HH:MM:SS : "));
scanf("%d/%d/%d %d:%d:%d",
&tm.tm_year, &tm.tm_mon, &tm.tm_mday,
&tm.tm_hour, &tm.tm_min, &tm.tm_sec);
/* ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ Π΄Π»Ρ ΠΊΡΠ°ΡΠΊΠΎΡΡΠΈ ΠΎΠΏΡΡΠ΅Π½Π°. */
tm.tm_year -= 1900;
tm.tm_mon -= 1;
tm.tm_isdst = -1; /* Π Π»Π΅ΡΠ½Π΅ΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ */
then = mktime(&tm);
printf(_("Got: %s"), ctime(&then));
exit(0);
}
ΠΡ Π½Π°ΠΌΠ΅ΡΠ΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ "gettext.h", Π° Π½Π΅ <gettext.h>. ΠΡΠ»ΠΈ Π½Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ gettext, ΡΠΎΠ³Π΄Π° "gettext.h" Π½Π°ΠΉΠ΄Π΅Ρ Π΅Π΅, ΠΈΠ·Π±Π΅ΠΆΠ°Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ. Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, Π΅ΡΠ»ΠΈ ΠΈΠΌΠ΅Π΅ΡΡΡ Π»ΠΈΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½Π°Ρ ΠΊΠΎΠΏΠΈΡ, ΠΎΠ½Π° Π±ΡΠ΄Π΅Ρ Π½Π°ΠΉΠ΄Π΅Π½Π°, Π΅ΡΠ»ΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ Π½Π΅Ρ. ΠΠ±ΡΠ΅ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΡΠΎ ΡΠΈΡΡΠ°ΡΠΈΡ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½Π° ΡΠ°ΠΊΡΠΎΠΌ Π½Π°Π»ΠΈΡΠΈΡ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Solaris Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ gettext, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π²ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ GNU.
ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄Ρ ΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΎΠ², ΠΏΠ΅ΡΠ²ΡΠΌ ΡΠ°Π³ΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΠΌΡΡ ΡΡΡΠΎΠΊ. ΠΡΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ xgettext:
$ xgettext --keyword=_ --keyword=N_ \
> --default-domain=echodate ch13-echodate.Ρ
ΠΠΏΡΠΈΠΈ --keyword ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ xgettext, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΊΠ°ΡΡ ΠΌΠ°ΠΊΡΠΎΡΡ _() ΠΈ N_(). ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΆΠ΅ Π·Π½Π°Π΅Ρ, ΠΊΠ°ΠΊ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡ ΡΡΡΠΎΠΊΠΈ ΠΈΠ· gettext() ΠΈ Π΅Π΅ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ· gettext_noop().
ΠΡΠ²ΠΎΠ΄ xgettext Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ. ΠΠΌΡ ΡΠ°ΠΉΠ»Π° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ messages.ΡΠΎ, ΡΡΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌΡ Π΄ΠΎΠΌΠ΅Π½Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ "messages". ΠΠΏΡΠΈΡ --default-domain ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ Π΄ΠΎΠΌΠ΅Π½ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΈΠΌΠ΅Π½ΠΈ Π²ΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΠ°ΠΉΠ» Π½Π°Π·Π²Π°Π½ echodate.ΡΠΎ. ΠΠΎΡ Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅:
# SOME DESCRIPTIVE TITLE. /* Π¨Π°Π±Π»ΠΎΠ½, Π½ΡΠΆΠ½ΠΎ ΠΎΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ */
# Copyright (Π‘) YEAR THE PACKAGE'S COPYRIGHT HOLDER