|
| ||||||||||||
| ||||||||||||
11. Локализация и Интернационализация
Пока я описывал, как заставить различные программы понять кириллицу. Обычно каждая программа требовала, чтобы это был ее собственный метод, как правило, чрезвычайно отличный от других. Кроме того, у некоторых программ была незавершенная поддержка языков, отличных от английского, не говоря уж об их неспособности взаимодействовать, используя родной язык пользователя вместо английского. Проблемы, перечисленные выше, сильно подавляют, так как программное обеспечение редко создается только для местного рынка. Переработка существенных частей программного обеспечения каждый раз при входе на новый международному рынок очень неэффективна; а интернациональная поддержка, осуществляемая собственными средствами программы, уникальным и присущим только ей способом, в терминах долгосрочного планирования также не блестящая идея. Следовательно, возникает потребность в стандартизации. И стандарт есть. Все связанное с вышеперечисленными проблемами разделено в соответствии c двумя базисными концепциями: localization и internationalization. Под локализацией мы имеем в виду создание программ, способных обрабатывать различные языковые соглашения для различных стран. Позвольте привести пример. Формат даты, принятый в Соединенных Штатах, имеет вид ММ/ДД/ГГ. Однако в России наиболее популярный формат -- ДД.ММ.ГГ. Другие проблемы включают в себя представление времени, форматы числа и представления валюты. Кроме этого, один из наиболее важных аспектов локализации -- это определение соответствующих классов символов, то есть определение, какие символы в наборе символов являются "кирпичиками" языка (буквами) и как они упорядочиваются. С другой стороны, локализация не работает со шрифтами. Интернационализация (или i18n для краткости), как предполагается, решает проблемы, связанные со способностью программы взаимодействовать с пользователем на его родном языке. Обе эти концепции должны быть стандартизованы, давая программистам непротиворечивый путь создания программ, работающих в национальной среде. Хотя стандартизация еще в процессе, но много ее частей уже фактически являются стандартом, так что они могут использоваться без особых проблем. Я опишу общую схему создания программ, использующих описанные выше возможности стандартным способом. Так как это заслуживает отдельного документа, я буду давать только очень общее описание и указатели на более полные источники.
11.1 Locale
Одно из основных понятий локализации -- locale. Под locale подразумевается набор соглашений, специфических для отдельно взятого языка в отдельно взятой стране. В общем случае говорить, что locale определяется только страной, неправильно. Например, в Канаде могут быть определены два locale -- язык Канада / Английский и язык Канада / Французский. Более того, язык Канада / Английский не является эквивалентом языку Великобритания / Английский или Американский / Английский, точно так же Канада / Французский язык -- не эквивалент языку Франция / Французский или языку Швейцария / Французский. Более подробное описание проблем/возможностей/достоинств локализации на русском языке можно найти на страничке Локализация, как она есть.
Locale с точки зрения пользователя
Каждая locale -- это специальная база данных, определяющая, по крайней мере, следующие правила и соглашения:
Настройка локали
Прежде всего -- подробная документация о локали имеется на www.sensi.org/~alec/locale Обращайтесь туда, если вам нужны нестандартные варианты (например, отключение русскоязычного интерфейса с сохранением правильной сортировки и т.д.) Документацию по иксовой локали можно найти по адресу www.tsu.ru/~pascal/x_locale/ Вот инструкция для нетерпеливых (только для glibc). Вам нужно:
Гораздо же честнее сделать отдельный настоящий каталог:
Некоторые дистрибутивы неправильно включают
LANG=ru LC_ALL=ru_RU.KOI8-R Это НЕПРАВИЛЬНО, почему так делать нельзя -- описано ниже. А теперь поговорим о том же, но гораздо подробнее. Итак: Как включить локализацию?
Если на UNIX машине (с POSIX:1996) средства locale правильно установлены и программы правильно написаны, то локализация включается путем задания строки окружения LANG:
$ export LANG={язык}
Если такой строки окружения нет, то работает значение локализации
по умолчанию: Если ваша система имеет полный набор утилит POSIX.2, то узнать
установленные в системе и допустимые значения для
$ locale -a
По новому стандарту (POSIX.2 приложение E (?)) значения локализации записываются в форме:
language_TERRITORY.Codeset
или формально:
language[_TERRITORY[.Codeset[@modifier]]]
Стандарт
Для русского языка
$ export LANG="ru_RU.KOI8-R" Согласно стандарту допустимы также короткие именования значений
$ export LANG=ru $ export LANG=ru_RU $ export LANG=ru_RU.KOI8-R Однако, если вы указываете короткое имя, может оказаться, что ваша кодировка оказывается вовсе не KOI8-R (почему следует использовать именно koi8-r, описано в разделе Символы и кодировки). Лучше не пользоваться значениями по умолчанию, а указывать точное длинное имя. Во FreeBSD 2.x так и есть. Для Linux -- зависит от дистрибутива. В коммерческих реализациях (Solaris, SCO, AIX etc) как правило используется значение LANG="ru_RU", или укороченное LANG="ru" (и как правило, Codeset ISO8859-5 по умолчанию). Некоторые могут пожелать сделать себе локализацию в другом наборе символов:
Если система локализована не полностью и использовать полное
переключение на другой язык (с помощью Если вас раздражают русские даты, сообщения и man-ы, но нужно обрабатывать русские буквы и т.д., то сделайте:
$ export LANG="C" $ export LC_CTYPE="ru_RU.KOI8-R" $ export LC_COLLATE="ru_RU.KOI8-R" $ export LC_TIME="C" Не рекомендуется использовать строку окружения:
$ export LC_ALL={язык}
поскольку формально такой категории локализации нет, она
"виртуальная" и обозначает "одновременно все категории". Из-за этого
во многих реализациях
$ export LC_NUMERIC="POSIX" Посмотреть текущие значения категорий локализации можно все той же утилитой locale (без параметров).
$ locale
ПРИМЕЧАНИЕ: В некоторых современных системах начинает появляться локализация в UNICODE. Включается она заданием строки окружения LANG="ru_RU.UTF-8" для России.
Устаревшая процедура установки Locale
В RedHat Linux (как, вероятно, и во многих других дистрибутивах Linux),
имеются фактически две базы
данных locale: одна для библиотеки C ( Чтобы изменить значение locale по умолчанию, обычно
достаточно установить системную переменную
LANG=ru_SU export LANG Вы можете проверить действие этой команды сразу же, если запустите
команду RedHat 5.x определяет KOI8-R locale как Иногда вы можете захотеть изменить только один аспект locale
без изменения других. Например, вы можете захотеть (Бог знает
почему) пользоваться
LANG=ru_SU LC_NUMERIC=POSIX export LANG LC_NUMERIC Подробнее см.
Теперь давайте держаться поближе к специфике Linux.
К сожалению, в Linux Чтобы проверить, для каких языков у вас есть locale, выполните
' Что касается библиотек
Locale зависимое программирование
С locale программа не должна знать о различных символьных преобразованиях и правилах сравнения, описанных выше. Вместо этого они используют специальный API, который действует по правилам, определенным locale. Кроме того, нет необходимости для программы пользоваться только одной locale для соблюдения всех правил -- возможно пользоваться другими правилами, описанных в других locale (хотя такой метод не очень хорош). Из man
Программа может быть сделана переносимой для всех locale, вызывая Довольно легко определить четыре уровня программной локализации:
Для выяснения подробностей смотрите, например, ( Voropay1 ) или ( SingleUnix ).
11.2 интернационализация
В то время как локализация описывает, как адаптировать программу к иностранному окружению, интернационализация (или i18n для краткости) детализирует способы общения программы с не-англоговорящим пользователем. Прежде это делалось с помощью создания абстракций сообщений для вывода их из кода программы. Теперь такой механизм (более или менее) стандартизирован. И, конечно, есть его free реализации! Проект GNU, наконец, стал на путь создания
интернационализированных прикладных программ. Ulrich Drepper
( Просьба о сотрудничестве: Если вы хотите изучить пакет
Вперед Назад Содержание |
|
CITForum © 1997–2025