Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

13.1. Введение

Центральной концепцией является окружение, место, в котором работает программа. Локали содержат в себе следующие сведения: локальный набор символов; сведения о формате отображения даты и времени; форматирование и отображение денежных сумм; форматирование и отображение числовых значений (с или без разделителей тысяч, какой символ используется в качестве разделителя дробной части числа и т.д.).

Интернационализация является процессом написания (или изменения) программы таким образом, что она может работать с различными локалями. Локализация является процессом приспособления интернационализированной программы для определенной локали. Часто вместо этих терминов используют сокращения i18n и l10n соответственно. (Числовое значение указывает, сколько букв в середине слова, а эти сокращения имеют небольшое сходство с полными терминами. [136] Их также гораздо легче набирать.) Другим часто встречающимся термином является поддержка родного языка, обозначаемая как NLS [137] ; NLS обозначает программную поддержку для i18n и l10n.

136

От английских слов i(nternationalizatio)n и l(ocalizatio)n —Примеч. перев.

137

NLS — native language support — Примеч. перев.

Кроме того, некоторые люди используют термин глобализация (сокращенно g10n) для обозначения процесса подготовки всех возможных локализаций для интернационализированной программы. Другими словами, подготовки программы для глобального использования.

Возможности NLS существуют на двух уровнях. Первым уровнем является библиотека С. Она предоставляет сведения о локали; процедуры для обработки большей части низкоуровневых подробностей работы по форматированию даты/времени, числовых и денежных значений; и процедуры для корректного для данной локали сопоставления регулярных выражений и классификации символов и сравнений. Именно возможности библиотеки появляются в стандартах С и POSIX.

На уровне приложения GNU

gettext
предоставляет команды и библиотеку для локализации программы: т.е. для возможности вывода сообщений на одном или более естественных языках. GNU
gettext
основана на плане, первоначально разработанном Sun Microsystems для Solaris [138] ; однако, она была реализована с нуля и теперь предоставляет расширения к первоначальному
gettext
Solaris. GNU
gettext
является стандартом де-факто для локализации программ, особенно в мире GNU.

138

Существует более ранний дизайн, известный как

catgets
. Хотя он стандартизован POSIX, его гораздо сложнее использовать, и мы его не рекомендуем — Примеч. автора.

В дополнение к локалям и

gettext
стандарт С предоставляет возможности для работы с несколькими наборами символов и с их кодировками — способом представления больших наборов символов с помощью меньшего числа байтов. Мы кратко затронем эти проблемы в конце главы.

13.2. Локали и библиотека С

Специфичное для локали поведение управляется посредством установки переменных окружения, описывающих, какую локаль (локали) использовать для той или иной информации. Число доступных локалей, предлагаемых каждой конкретной операционной системой, колеблется от менее чем десяти на некоторых коммерческих системах Unix до сотен локалей на системах GNU/Linux. ('

locale -a
' выводит полный список доступных локалей.)

Гарантируется существование двух локалей, «С» и «POSIX». Они действуют в качестве локали по умолчанию, предоставляя окружение 7-разрядного ASCII, поведение которого такое же, как на традиционных системах Unix без поддержки локалей. В противном случае, локали обозначают язык, страну, а также могут включать сведения о наборе символов. Например, '

it_IT
' используется для итальянского языка в Италии с использованием системного набора символов по умолчанию, a '
it_IT.UTF-8
' использует кодировку UTF-8 для набора символов Unicode.

Дополнительные подробности об именах локалей можно найти в справочной странице GNU/Linux setlocale(3). Обычно дистрибутивы GNU/Linux устанавливают для системы локаль по умолчанию при ее установке, основываясь на языке, выбранном тем кто устанавливал ее, и пользователям больше не приходится об этом беспокоиться.

13.2.1. Категории локалей и переменные окружения

Заголовочный файл

<locale.h>
определяет функции и структуры локали. Категории локали определяют разновидности информации, которые будут для программы зависимы от локали. Категории доступны в виде набора именованных констант. Они перечислены в табл. 13.1.

Таблица 13.1. Константы категорий локалей ISO С, определенные в

<locale.h>

Категория Значение
LC_ALL
Эта категория включает всю возможную информацию локали. Она состоит из оставшейся части элементов этой таблицы
LC_COLLATE
Категория для сравнения строк (обсуждаемого ниже) и областей регулярных выражений
LC_CTYPE
Категория для классификации символов (заглавные, строчные и т.д.) Это влияет на сопоставление регулярных выражений и функции
isXXX
в
<ctype.h>
LC_MESSAGES
Категория для специфичных для локали сообщений. Эта категория вступает в игру с GNU
gettext
, которая обсуждает далее в главе
LC_MONETARY
Категория для форматирования денежной информации, такой, как локальные и международные символы для местной валюты (например, $ против USD для доллара США), форматирования отрицательных величин и т.д.
LC_NUMERIC
Категория для форматирования числовых значений
LC_TIME
Категория для форматирования дат и времени

Эти категории определены различными стандартами. Некоторые системы могут поддерживать дополнительные категории, такие, как

LC_TELEPHONE
или
LC_ADDRESS
. Однако, они не стандартизованы; любой программе, которой нужно их использовать, но которая все равно должна быть переносимой, следует использовать
#ifdef
для окружения соответствующих разделов.

По умолчанию, программы С и библиотека С ведут себя так, как если бы они находились в локали «С» или «POSIX» для обеспечения обратной совместимости со старыми системами. Однако, вызвав

setlocale
(как описано ниже), программа может включить действие локали. После того, как программа это сделала, пользователь может, установив переменные окружения, включать и выключать возможности локали, которые будет иметь программа.

Переменные окружения имеют те же самые имена, что и перечисленные в табл. 13.1 категории локалей. Таким образом, команда —

export LC_NUMERIС=en_DK LC_TIME=C

— определяет, что числа должны выводиться в соответствии с локалью '

en_DK
' (английский язык в Дании), но что значения даты и времени должны выводиться в соответствии с обычной локалью '
С
'. (Этот пример просто иллюстрирует, что вы можете указывать для различных категорий различные локали; это не является чем-то обязательным, что вы должны делать.)

Переменная окружения

LC_ALL
перекрывает все другие переменные
LC_xxx
. Если
LC_ALL
не установлена, библиотека ищет определенные переменные (
LC_CTYPE
,
LC_MONETARY
и т.д.). Наконец, если ни одна из них не установлена, библиотека ищет переменную
LANG
. Вот небольшая демонстрация с использованием
gawk
:

$ unset LC_ALL LANG /* Удалить переменные по умолчанию */

Поделиться:
Популярные книги

Дважды одаренный. Том III

Тарс Элиан
3. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
юмористическое фэнтези
5.40
рейтинг книги
Дважды одаренный. Том III

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.85
рейтинг книги
Архонт

Последний Паладин. Том 7

Саваровский Роман
7. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 7

Том 3. Рассказы 1896-1899

Горький Максим
3. Собрание сочинений в тридцати томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 3. Рассказы 1896-1899

Последний рейд

Сай Ярослав
5. Медорфенов
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Последний рейд

Тигриный лог

Чеснокова Юлия Олеговна
Детективы:
прочие детективы
7.00
рейтинг книги
Тигриный лог

История всемирной литературы Т.6

Бердников Георгий Петрович
Научно-образовательная:
история
культурология
литературоведение
6.25
рейтинг книги
История всемирной литературы Т.6

Геррон

Левински Шарль
Проза:
современная проза
7.71
рейтинг книги
Геррон

Лекарь

Назимов Константин Геннадьевич
2. Травник
Фантастика:
фэнтези
5.25
рейтинг книги
Лекарь

UNIX: взаимодействие процессов

Стивенс Уильям Ричард
Компьютеры и Интернет:
программирование
5.00
рейтинг книги
UNIX: взаимодействие процессов

Вечный. Книга V

Рокотов Алексей
5. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга V

Цикл "Идеальный мир для Лекаря". Компиляция. Книги 1-30

Сапфир Олег
Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Цикл Идеальный мир для Лекаря. Компиляция. Книги 1-30

Локки 4 Потомок бога

Решетов Евгений Валерьевич
4. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Локки 4 Потомок бога

Разоблаченная Изида. Том II

Блаватская Елена Петровна
2. Теософия
Религия и эзотерика:
эзотерика
5.00
рейтинг книги
Разоблаченная Изида. Том II