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

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

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

Π’Π°Π±Π»ΠΈΡ†Π° 13.4. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ спСцификации эры

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ НаправлСниС Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ '+' ΠΈΠ»ΠΈ '-'. '+' ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ эра отсчитываСтся ΠΎΡ‚ числСнно мСньшСго Π³ΠΎΠ΄Π° ΠΊ числСнно Π±ΠΎΠ»ΡŒΡˆΠ΅ΠΌΡƒ Π³ΠΎΠ΄Ρƒ, Π° '-' ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ порядок БмСшСниС Π‘Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΠΉ ΠΊ Π΄Π°Ρ‚Π΅ Π½Π°Ρ‡Π°Π»Π° эры Π³ΠΎΠ΄ Π”Π°Ρ‚Π° Π½Π°Ρ‡Π°Π»Π° Π”Π°Ρ‚Π° Π½Π°Ρ‡Π°Π»Π° эры Π² Π²ΠΈΠ΄Π΅ 'Π³Π³Π³Π³/ΠΌΠΌ/Π΄Π΄'. Π­Ρ‚ΠΎ соотвСтствСнно Π³ΠΎΠ΄, мСсяц ΠΈ дСнь. Π“ΠΎΠ΄Ρ‹ Π΄ΠΎ Π½.э ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ для Π³Π³Π³Π³ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния Π”Π°Ρ‚Π° ΠΊΠΎΠ½Ρ†Π° Π”Π°Ρ‚Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ эры Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ самом Π²ΠΈΠ΄Π΅. Допустимы Π΄Π²Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π²ΠΈΠ΄Π°: -* ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«Π½Π°Ρ‡Π°Π»ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈΒ», Π° +* ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«ΠΊΠΎΠ½Π΅Ρ† Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈΒ» НазваниС эры НазваниС эры, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ спСцификации прСобразования %EC Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strftime() Π€ΠΎΡ€ΠΌΠ°Ρ‚ эры Π€ΠΎΡ€ΠΌΠ°Ρ‚ Π³ΠΎΠ΄Π° Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… эры, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ спСцификации прСобразования %EY Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strftime()

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ALT_DIGITS Ρ‚Π°ΠΊΠΆΠ΅ нуТдаСтся Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ объяснСнии. НСкоторыС Π»ΠΎΠΊΠ°Π»ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Β«Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ†ΠΈΡ„Ρ€Ρ‹Β». (РассмотритС арабский язык, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ дСсятичная систСма счислСния, Π½ΠΎ изобраТСния для Ρ†ΠΈΡ„Ρ€ 0–9 Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Или рассмотритС Π³ΠΈΠΏΠΎΡ‚Π΅Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ локаль Β«Π”Ρ€Π΅Π²Π½Π΅Π³ΠΎ Π ΠΈΠΌΠ°Β», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΡƒΡŽ римскиС Ρ†ΠΈΡ„Ρ€Ρ‹.) Они ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… спСцификациях прСобразования %OC Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strftime(). Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для 'nl_langinfo(ALT_DIGITS)' являСтся раздСляСмым Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ с запятой списком строк символов для Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ†ΠΈΡ„Ρ€. ΠŸΠ΅Ρ€Π²Π°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для 0, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ для 1 ΠΈ Ρ‚.Π΄. POSIX ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ прСдоставлСны Π΄ΠΎ 100 Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… символов. Π‘ΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ограничСния Π»ΠΎΠΊΠ°Π»Π΅ΠΉ использованиСм символов Ρ†ΠΈΡ„Ρ€ ASCII, ΠΊΠΎΠ³Π΄Π° Ρƒ Π»ΠΎΠΊΠ°Π»ΠΈ Π΅ΡΡ‚ΡŒ собствСнная систСма счислСния.

НаконСц, 'nl_langinfo(CRNCYSTR)' Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ символ мСстной Π²Π°Π»ΡŽΡ‚Ρ‹. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ символ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, Ссли это '-', '+' ΠΈΠ»ΠΈ '.', ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ символ:

- Π‘ΠΈΠΌΠ²ΠΎΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.

+ Π‘ΠΈΠΌΠ²ΠΎΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ послС значСния.

. Π‘ΠΈΠΌΠ²ΠΎΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ символ основания (Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ дСсятичной Π΄Ρ€ΠΎΠ±ΠΈ).

13.3. ДинамичСский ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ сообщСний ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ

Волько Ρ‡Ρ‚ΠΎ освСщСнныС интСрфСйсы стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ простыС части ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Для Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹Ρ…, числовых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Π΄Π°Ρ‚Ρ‹, Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ для ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ сортировки строк, примСняСтся ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ посрСдством Ρ‚Π°Π±Π»ΠΈΡ† спСцифичных для Π»ΠΎΠΊΠ°Π»ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ списки Π½Π°Π·Π²Π°Π½ΠΈΠΉ мСсяцСв ΠΈ Π΄Π½Π΅ΠΉ).

Однако, большая Ρ‡Π°ΡΡ‚ΡŒ взаимодСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с тСкстовой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ осущСствляСтся Π² Π²ΠΈΠ΄Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… сообщСний, Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² нСобходимости избСТания мноТСства вСрсий ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ лишь содСрТаниСм строк сообщСний. РСшСниСм Π΄Π΅-Ρ„Π°ΠΊΡ‚ΠΎ Π² ΠΌΠΈΡ€Π΅ GNU являСтся GNU gettext. (GNU ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ с элСмСнтами мСню; ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ большого инструмСнтария ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса свой способ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.)

GNU gettext Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° сообщСний ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки Π²ΠΎ врСмя исполнСния. Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ этот ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ нСсколько шагов, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свои Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Когда сама ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π°, нСсколько ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Π΄Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ называСтся списком сообщСний (message catalog).

13.3.1. Установка тСкстового Π΄ΠΎΠΌΠ΅Π½Π°: textdomain()

Π—Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ мноТСство ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²: ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹, написанныС Π½Π° Π‘ ΠΈΠ»ΠΈ C++ ΠΈΠ»ΠΈ Π½Π° языках сцСнариСв, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ возмоТностям gettext, Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ gawk ΠΈΠ»ΠΈ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° Bash ВсС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ прилоТСния Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ тСкстовый Π΄ΠΎΠΌΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся строкой, ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. (ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Β«gawkΒ» ΠΈΠ»ΠΈ Β«coreutilsΒ»; ΠΏΠ΅Ρ€Π²ΠΎΠ΅ являСтся простой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, Π° послСднСС β€” Ρ†Π΅Π»Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.) ВСкстовый Π΄ΠΎΠΌΠ΅Π½ устанавливаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ textdomain():

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


char* textdomain(const char *domainname)

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ со строкой, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Π½Π° тСкстовый Π΄ΠΎΠΌΠ΅Π½, Π² составС ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² main(). Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ являСтся Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ тСкстовым Π΄ΠΎΠΌΠ΅Π½ΠΎΠΌ. Если Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ domainname Ρ€Π°Π²Π΅Π½ NULL, возвращаСтся Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π΄ΠΎΠΌΠ΅Π½; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, ΠΎΠ½ устанавливаСтся Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° послСднСС возвращаСтся. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ ошибки.

Если тСкстовый Π΄ΠΎΠΌΠ΅Π½ Π½Π΅ установлСн с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ textdomain(), ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Β«messagesΒ».

13.3.2. ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ сообщСний: gettext()

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ послС установки тСкстового Π΄ΠΎΠΌΠ΅Π½Π° шагом являСтся использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gettext() (ΠΈΠ»ΠΈ Π΅Π΅ разновидности) для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки, которая Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Π°. НСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ слуТбы ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°:

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