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

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

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

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 (/* <i>Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка</i> */) { /* Π’Π•Π ΠΠž */

Β /* Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько строк для упрощСния ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°. */

Β if (input_type == INPUT_FILE)

Β  fprintf(stderr, _(&quot;%s: cannot read file: %s\n&quot;),

Β Β  argv[0], strerror(errno));

Β else

Β  fprintf(stderr, _(&quot;%s: cannot read pipe: %s\n&quot;),

Β Β  argv[0], strerror(errno));

Π­Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ

if (/* <i>Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка</i> */) { /* ΠΠ•Π’Π•Π ΠΠž */

Β fprintf(stderr, _(&quot;%s: cannot read %s: %s\n&quot;), argv[0],

Β input_type == INPUT_FILE ? _(&quot;file&quot;) : _(&quot;pipe&quot;),

Β strerror(errno));

}

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΌΡ‹ΡΠ»ΡŒΡŽ являСтся Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ коммСнтария, ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠΌ использовании Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ сообщСний.

13.3.8. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ²

ПослС ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹. Π­Ρ‚ΠΎ осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… инструмСнтов уровня ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ. ΠœΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ вСрсии

ch06-echodate.c
ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 6.1.4 Β«ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π°Π·Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π²
time_t
Β»:

/* ch13-echodate.c --- дСмонстрация ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ² */

#include &lt;stdio.h&gt;

#include &lt;time.h&gt;

#include &lt;locale.h&gt;

#define ENABLE_NLS 1

#include &quot;gettext.h&quot;

#define _(msgid) gettext(msgid)

#define N_(msgid) msgid

int main (void) {

Β struct tm tm;

Β time_t then;

Β setlocale(LC_ALL, &quot;&quot;);

Β bindtextdomain(&quot;echodate&quot;, &quot;.&quot;);

Β textdomain(&quot;echodate&quot;);

Β printf(&quot;%s&quot;, _(&quot;Enter a Date/time as YYYY/MM/DD HH:MM:SS : &quot;));

Β scanf(&quot;%d/%d/%d %d:%d:%d&quot;,

Β  &amp;tm.tm_year, &amp;tm.tm_mon, &amp;tm.tm_mday,

Β  &amp;tm.tm_hour, &amp;tm.tm_min, &amp;tm.tm_sec);

Β /* ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ошибок для краткости ΠΎΠΏΡƒΡ‰Π΅Π½Π°. */

Β tm.tm_year -= 1900;

Β tm.tm_mon -= 1;

Β tm.tm_isdst = -1; /* О Π»Π΅Ρ‚Π½Π΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ извСстно */

Β then = mktime(&amp;tm);

Β printf(_(&quot;Got: %s&quot;), ctime(&amp;then));

Β exit(0);

}

ΠœΡ‹ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ использовали

&quot;gettext.h&quot;
, Π° Π½Π΅
&lt;gettext.h&gt;
. Если нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ поставляСтся с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
gettext
, Ρ‚ΠΎΠ³Π΄Π°
&quot;gettext.h&quot;
Π½Π°ΠΉΠ΄Π΅Ρ‚ Π΅Π΅, ΠΈΠ·Π±Π΅ΠΆΠ°Π² использования систСмной ΠΊΠΎΠΏΠΈΠΈ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли имССтся лишь систСмная копия, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½Π°, Ссли локальной ΠΊΠΎΠΏΠΈΠΈ Π½Π΅Ρ‚. ΠžΠ±Ρ‰Π΅ΠΈΠ·Π²Π΅ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ ситуация услоТнСна Ρ„Π°ΠΊΡ‚ΠΎΠΌ наличия Π½Π° систСмах Solaris Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
gettext
, которая Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ всСх возмоТностСй вСрсии GNU.