В комплект AIR 1.1 SDK включена инфраструктура локализации HTML. Она определяется файлом AIRLocalizer.js JavaScript. Файл AIRLocalizer.js находится в каталоге frameworks комплекта AIR SDK. В нем задан класс air.Localizer, обеспечивающий поддержку многоязычных приложений.
Загрузка кода HTML-инфраструктуры локализации AIR
Чтобы воспользоваться многоязычной функциональностью, скопируйте файл AIRLocalizer.js в своей проект. Затем включите его в основной HTML-файл приложения, заключив в тег script:
<script src="AIRLocalizer.js" type="text/javascript" charset="utf-8"></script>
Код JavaScript может вызвать объект
air.Localizer.localizer
:
<script>
var localizer = air.Localizer.localizer;
</script>
air.Localizer.localizer
— это единый объект, определяющий методы и свойства использования локализованных ресурсов. Класс Localizer содержит ряд методов DRM:
Класс Localizer содержит ряд статичных свойств.
Свойство
|
Описание
|
localizer
|
Возвращает ссылку на единственный в приложении объект Localizer.
|
ultimateFallbackLocale
|
Локаль, используемая, когда приложение не поддерживает выбор пользователя. См. раздел «
Определение цепочки локалей
».
|
Указание поддерживаемых языков
Для идентификации языков, поддерживаемых приложением, в файле дескриптора приложения используется элемент
<supportedLanguages>
. Этот элемент можно применять только для iOS, связанной среды выполнения Mac и приложений Android. Он игнорируется в приложениях любых других типов.
Если элемент
<supportedLanguages>
не указан, по умолчанию упаковщик выполняет следующие действия в зависимости от типа приложения:
-
iOS — все языки, поддерживаемые средой выполнения AIR, представлены в магазине приложений iOS как поддерживаемые языки приложения.
-
Связанная среда Mac — приложения, упакованные в пакет связанной среды, не содержат информации о языке.
-
Android — комплект приложений содержит ресурсы для всех языков, поддерживаемых исполнительной средой AIR.
Дополнительные сведения см. в описании элемента
supportedLanguages
.
Определение пакетов ресурсов
Инфраструктура локализации HTML считывает локализованные строки из файлов
локализации
. Файл локализации — это набор значений, привязанных к ключам и последовательно собранных в текстовый файл. Файл локализации иногда называют
пакетом
.
Создайте в каталоге приложения подкаталог с названием locale. (Можно также использовать другое имя, см. раздел «
Изменение параметров Localizer в AIR HTML
».) Здесь будут храниться файлы локализации. Этот каталог известен как
каталог пакетов
.
Для каждой локали, которая поддерживается приложением, создайте подкаталог каталога пакетов. Назовите каждый подкаталог в соответствии с кодом локали. Например, для французского каталога используйте имя «fr», а для английского — «en». С помощью знака подчеркивания (_) можно определить локаль, содержащую язык и код страны. Например, каталог для английского (США) может называться «en_us». (Также можно использовать дефис, в этом случае каталог будет называться «en-us». Инфраструктура локализации распознает оба варианта.)
В подкаталог locale можно добавить сколь угодно много файлов ресурсов. Как правило, файл локализации создается для каждого языка (и помещается в каталог соответствующего языка). Инфраструктура локализации HTML содержит метод
getFile()
, позволяющий считывать содержимое файла (см. раздел «
Получение ресурсов для определенной локали
».
Файлы с расширением .properties называются файлами свойств локализации. Они используются для определения пар «ключ-значение» той или иной локали. Файл свойств задает строковое значение на каждой строке. Например, ниже показано, как задать строковое значение
"Hello in English."
для ключа с именем
greeting
:
greeting=Hello in English.
В файле свойств содержится следующий текст и задаются шесть пар «ключ-значение»:
title=Sample Application
greeting=Hello in English.
exitMessage=Thank you for using the application.
color1=Red
color2=Green
color3=Blue
Этом примере показана английская версия файла свойств из каталога en.
Французская версия этого файла будет помещена в каталог fr:
title=Application Example
greeting=Bonjour en français.
exitMessage=Merci d'avoir utilisé cette application.
color1=Rouge
color2=Vert
color3=Bleu
Для разных типов информации можно задать разные файлы ресурсов. Скажем, в файле legal.properties может храниться какой-нибудь шаблонный юридический документ (к примеру, информация об авторских правах). Эти ресурсы можно повторно использовать в различных приложения Точно так же можно задать файлы для определения локализованного содержимого разных частей пользовательского интерфейса.
В этих файлах следует использовать кодировку UTF-8, чтобы языки отображались корректно.
Управление цепочками локалей
Когда приложение загружает файл AIRLocalizer.js, оно исследует доступные локали. Эти локали соответствуют подкаталогам каталога пакетов (см. раздел «
Определение пакетов ресурсов
»). Список поддерживаемых локалей называется
цепочкой локалей
. Файл AIRLocalizer.js автоматически определяет порядок локалей в цепочке на основании соответствующих параметров операционной системы. (Свойство
Capabilities.languages
содержит список языков пользовательского интерфейса операционной системы, в порядке предпочтения.)
Поэтому, если в приложении определены ресурсы для локалей «en», «en_US» и «en_UK», инфраструктура Localizer AIR HTML упорядочивает цепочку локалей соответственно. Если приложение запускается в системе, где основной локалью является «en», цепочка локалей будет иметь порядок
["en", "en_US", "en_UK"]
. В этом случае приложение сначала будет искать ресурсы в пакете «en», потом в «en_US».
Однако, если основной локалью в системе является «en-US», то порядок будет таков:
["en_US", "en", en_UK"]
. В этом случае приложение сперва обратится к пакету «en_US», а потом к «en».
По умолчанию, первая локаль в цепочке считается стандартом по умолчанию. Можно попросить пользователя выбрать локаль при первом запуске приложения. Затем можно сохранить этот выбор в файле настроек и при последующих запусках сразу включать эту локаль.
Могут использоваться строки ресурсов любой локали из цепочки. Если в какой-то из локалей строка ресурсов не задана, приложение обратится к следующей подходящей строке из другой локали.
Для изменения настроек цепочки локалей вызовите метод
setLocaleChain()
объекта Localizer. См. раздел «
Определение цепочки локалей
».
Обновление элементов DOM с использованием локализованного содержимого
Элемент приложения может обращаться к ключу в файле свойств локализации. Например, элемент
title
в примере ниже задает атрибут
local_innerHTML
. Инфраструктура локализации использует этот атрибут для нахождения локализованного значения. По умолчанию, инфраструктура ищет атрибуты, имена которых начинаются с
"local_"
. Она обновляет атрибуты с совпадающей частью имени после
"local_"
. В этом случае инфраструктура задает атрибут
innerHTML
элемента
title
. Атрибут
innerHTML
использует значение, заданное для ключа
mainWindowTitle
в файле свойств по умолчанию (default.properties):
<title local_innerHTML="default.mainWindowTitle"/>
Если в текущей локали нет подходящего значения, тогда инфраструктура локализации просматривает остальные локали цепочки. Используется ближайшая локаль в цепочке, в которой значение определено.
В примере ниже в тексте (атрибут
innerHTML
attribute) элемента
p
используется значение ключа
greeting
, заданное в файле свойств по умолчанию:
<p local_innerHTML="default.greeting" />
В примере ниже в атрибуте value (и отображаемом тексте) элемента
input
используется значение ключа
btnBlue
из файла свойств по умолчанию:
<input type="button" local_value="default.btnBlue" />
Чтобы обновить модель DOM HTML и использовать строки, заданные в текущей цепочке ключей, вызовите метод
update()
объекта Localizer. Вызов метода
update()
позволяет объекту Localizer разобрать DOM и выполнить необходимые действия над найденными атрибутами локализации (
"local_..."
):
air.Localizer.localizer.update();
Можно задать значения для атрибута (например, «innerHTML») и соответствующего ему атрибута локализации (например, «local_innerHTML»). В этом случае инфраструктура локализации перепишет значение атрибута, только если найдет совпадающее значение в цепочке. Например, следующий элемент задает атрибуты
value
и
local_value
:
<input type="text" value="Blue" local_value="default.btnBlue"/>
Можно обновить и отдельный элемент DOM. См. следующий раздел «
Обновление элементов DOM для использования текущей локали
».
По умолчанию Localizer AIR HTML использует
"local_"
в качестве префикса для атрибутов, определяющий параметры локализации элемента. Например, по умолчанию атрибут
local_innerHTML
определяет имя пакета и ресурса для значения
innerHTML
элемента. Кроме того, по умолчанию атрибут
local_value
определяет имя пакета и ресурса для значения
value
элемента. Localizer можно изменить, чтобы использовать другой префикс атрибута (не
"local_"
). См. раздел «
Изменение параметров Localizer в AIR HTML
».
Обновление элементов DOM для использования текущей локали
Когда объект Localizer обновляет модель DOM HTML, помеченные элементы вынуждены использовать значения атрибутов, основанные на строках, которые заданы в текущей цепочке локалей. Чтобы Localizer HTML обновил DOM HTML, вызовите метод
update()
объекта
Localizer
:
air.Localizer.localizer.update();
Чтобы обновить только отдельный элемент DOM, передайте его в качестве параметра методу
update()
. Метод
update()
имеет только один параметр,
parentNode
, и тот не обязателен. Если параметр
parentNode
задан, он определяет локализуемый элемент DOM. При вызове метода
update()
и указании параметра
parentNode
задаются локализованные значения для всех дочерних элементов, которые указывают атрибуты локализации.
Рассмотрим элемент
div
:
<div id="colorsDiv">
<h1 local_innerHTML="default.lblColors" ></h1>
<p><input type="button" local_value="default.btnBlue" /></p>
<p><input type="button" local_value="default.btnRed" /></p>
<p><input type="button" local_value="default.btnGreen" /></p>
</div>
Чтобы обновить этот элемент и использовать локализованные строки, заданные в цепочке локалей, воспользуйтесь следующим кодом JavaScript:
var divElement = window.document.getElementById("colorsDiv");
air.Localizer.localizer.update(divElement);
Если значение ключа не найдено в цепочке локалей, инфраструктура использует значение атрибута
"local_"
. Положим, в предыдущем примере инфраструктуре не удалось найти значение для ключа
lblColors
(ни в одном из файлов default.properties в цепочке локалей). Тогда в качестве значения
innerHTML
будет использоваться
"default.lblColors"
. Использование этого значения сообщает разработчику, что каких-то ресурсов недостает.
Метод
update()
отправляет событие
resourceNotFound
, когда не может найти ресурс в цепочке локалей. Константа
air.Localizer.RESOURCE_NOT_FOUND
задает строку
"resourceNotFound"
. У этого события есть три свойства:
bundleName
,
resourceName
и
locale
. Свойство
bundleName
— это имя пакета, в котором не удалось обнаружить ресурс. Свойство
resourceName
— это имя ресурса, который не удалось обнаружить. Свойство
locale
— это имя локали, в которой не удалось обнаружить ресурс.
Метод
update()
отправляет событие
bundleNotFound
, когда не может найти указанный пакет. Константа
air.Localizer.BUNDLE_NOT_FOUND
задает строку
"bundleNotFound"
. У события есть два свойства:
bundleName
и
locale
. Свойство
bundleName
— это имя пакета, в котором не удалось обнаружить ресурс. Свойство
locale
— это имя локали, в которой не удалось обнаружить ресурс.
Метод
update()
работает асинхронно (и асинхронно отправляет события
resourceNotFound
и
bundleNotFound
). Следующий код задает прослушиватели для событий
resourceNotFound
и
bundleNotFound
:
air.Localizer.localizer.addEventListener(air.Localizer.RESOURCE_NOT_FOUND, rnfHandler);
air.Localizer.localizer.addEventListener(air.Localizer.BUNDLE_NOT_FOUND, rnfHandler);
air.Localizer.localizer.update();
function rnfHandler(event)
{
alert(event.bundleName + ": " + event.resourceName + ":." + event.locale);
}
function bnfHandler(event)
{
alert(event.bundleName + ":." + event.locale);
}
Изменение параметров Localizer в AIR HTML
Метод
setBundlesDirectory()
объекта Localizer позволят изменить путь к каталогу пакетов. Метод
setLocalAttributePrefix()
объекта Localizer позволяет изменить путь к каталогу пакетов и значения атрибутов, используемых объектом Localizer.
Каталог пакетов по умолчанию определен как подкаталог locale в каталоге приложения. Можно задать другой каталог, вызвав метод
setBundlesDirectory()
объекта Localizer. Этот метод принимает один параметр,
path
, задающий в виде строки путь к нужному каталогу пакетов. Значением параметра
path
может быть одно из следующих:
-
объект String, определяющий относительный путь к каталогу, например
"locales"
-
объект String, задающий действительный URL-адрес, использующий схемы URL-адресов
app
,
app-storage
или
file
, например
"app://languages"
(
не
используйте схему
http
)
-
объект File
Сведения об URL-адресах и путях к каталогам см. в следующих источниках:
Например, в коде ниже в качестве каталога пакетов задается подкаталог languages каталога хранилища приложения (не каталога приложения):
air.Localizer.localizer.setBundlesDirectory("languages");
В качестве параметра
path
должен передаваться действительный путь. В противном случае метод генерирует исключение BundlePathNotFoundError.
"BundlePathNotFoundError"
является значением свойства
name
этой ошибки, а свойство
message
указывает недействительный путь.
По умолчанию Localizer AIR HTML использует
"local_"
в качестве префикса для атрибутов, определяющий параметры локализации элемента. Например, атрибут
local_innerHTML
определяет имена пакета и ресурса в значении
innerHTML
следующего элемента
input
:
<p local_innerHTML="default.greeting" />
Метод
setLocalAttributePrefix()
объекта Localizer позволяет использовать префикс атрибута, отличный от
"local_"
. Статический метод принимает один параметр — строку, которая используется в качестве префикса атрибута. Например, в коде ниже инфраструктура локализации использует в качестве префикса атрибута «loc_»:
air.Localizer.localizer.setLocalAttributePrefix("loc_");
Этот префикс можно изменять. Например, это может потребоваться, если префикс по умолчанию (
"local_"
) приводит к конфликту с именем другого атрибута в коде. При вызове этого метода используйте допустимые символы для HTML-атрибутов. (Например, знак пробела использовать нельзя.)
Дополнительные сведения об использовании атрибутов локализации в HTML-элементах см. в разделе «
Обновление элементов DOM с использованием локализованного содержимого
».
Параметры каталога пакетов и префикса атрибута не сохраняются между разными сеансами приложения. Если вы используете собственный каталог пакетов или префикс атрибута, его потребуется задавать каждый раз при запуске приложения.
Определение цепочки локалей
По умолчанию, когда загружается файл AIRLocalizer.js, он задает цепочку локалей. Эту цепочку определяют локали, доступные в каталоге пакетов и параметры языка пользовательского интерфейса системы. (Дополнительные сведения см. в разделе «
Управление цепочками локалей
».)
Для изменения настроек цепочки локалей вызовите статический метод
setLocaleChain()
объекта Localizer. Например, этот метод можно вызвать, если пользователь указал, какой язык предпочитает. Метод
setLocaleChain(
) принимает один параметр,
chain
, представляющий собой массив локалей, например
["fr_FR","fr","fr_CA"]
. Инфраструктура ищет ресурсы (в последовательности операций) в том порядке, в каком идут локали в массиве. Если ресурс не удается найти в первой локали, то поиск продолжается в ресурсах других локалей. Если аргумент
chain
отсутствует, не является массивом или является пустым массивом, то функция дает сбой и генерирует исключение IllegalArgumentsError.
Статический метод
getLocaleChain()
объекта Localizer возвращает объект Array со списком локалей в текущей цепочке.
Приведенный ниже код читает текущую цепочку локалей и добавляет в начало две французских локали:
var currentChain = air.Localizer.localizer.getLocaleChain();
newLocales = ["fr_FR", "fr"];
air.Localizer.localizer.setLocaleChain(newLocales.concat(currentChain));
При обновлении цепочки локалей метод
setLocaleChain()
отправляет событие
"change"
. Константа
air.Localizer.LOCALE_CHANGE
определяет строку
"change"
. Событие имеет единственное свойство,
localeChain
, представляющее собой массив кодов локалей в новой цепочке. В коде ниже задается прослушиватель для этого события:
var currentChain = air.Localizer.localizer.getLocaleChain();
newLocales = ["fr_FR", "fr"];
localizer.addEventListener(air.Localizer.LOCALE_CHANGE, changeHandler);
air.Localizer.localizer.setLocaleChain(newLocales.concat(currentChain));
function changeHandler(event)
{
alert(event.localeChain);
}
Статическое свойство
air.Localizer.ultimateFallbackLocale
представляет локаль, которая используется, если приложение не поддерживает пользовательские установки. Значение по умолчанию равно
"en"
. Можно задать и другую локаль, как показано ниже:
air.Localizer.ultimateFallbackLocale = "fr";
Получение ресурсов для определенной локали
Метод
getString()
объекта Localizer возвращает строку, определенную для ресурса в той или иной локали. При вызове этого метода значение
locale
задавать необязательно. В этом случае метод просматривает всю цепочку локалей и возвращает строку в первой же локали, которая содержит искомое имя ресурса. Ниже перечислены параметры этого метода:
Параметр
|
Описание
|
|
Пакет, содержащий ресурс. Это имя файла свойств без расширения .properties. (Например, если этот параметр равен
"alerts"
, код Localizer просматривает файлы локализации alerts.properties.)
|
|
Имя ресурса.
|
|
Необязательно. Массив строк для замены пронумерованных тегов в строке замещения. Например, рассмотрим вызов функции, где параметр
templateArgs
равен
["Raúl", "4"]
, а совпадающая строка ресурса —
"Hello, {0}. You have {1} new messages."
("Здравствуйте, {0}. У вас {1} новых сообщения."). В этом случае функция возвратит запись
"Hello, Raúl. You have 4 new messages."
("Здравствуйте, Рауль. У вас 4 новых сообщения"). Чтобы игнорировать это значение, передайте
null
.
|
|
Необязательно. Код локали (например,
"en"
,
"en_us"
или
"fr"
). Если локаль задана, а подходящих значений не обнаружено, метод не будет искать значения в остальных локалях цепочки. Если код локали не задан, функция возвращает строку в первой локали из цепочки, в которой обнаруживается нужное значение имени ресурса.
|
Инфраструктура локализации может обновлять отмеченные атрибуты DOM HTML. Однако локализованные строки могут использоваться иными способами. Например, можно использовать строку в каком-нибудь динамически создаваемом HTML-файле или в качестве значения параметра при вызове функции. В приведенном ниже коде в вызове функции
alert()
участвует строка, определенная в ресурсе
error114
в файле свойств по умолчанию для локали fr_FR:
alert(air.Localizer.localizer.getString("default", "error114", null, "fr_FR"));
Когда метод
getString()
не может найти ресурс в определенном пакете, он отправляет событие
resourceNotFound
. Константа
air.Localizer.RESOURCE_NOT_FOUND
задает строку
"resourceNotFound"
. У этого события есть три свойства:
bundleName
,
resourceName
и
locale
. Свойство
bundleName
— это имя пакета, в котором не удалось обнаружить ресурс. Свойство
resourceName
— это имя ресурса, который не удалось обнаружить. Свойство
locale
— это имя локали, в которой не удалось обнаружить ресурс.
Метод
getString()
отправляет событие
bundleNotFound
, когда не может найти указанный пакет. Константа
air.Localizer.BUNDLE_NOT_FOUND
задает строку
"bundleNotFound"
. У события есть два свойства:
bundleName
и
locale
. Свойство
bundleName
— это имя пакета, в котором не удалось обнаружить ресурс. Свойство
locale
— это имя локали, в которой не удалось обнаружить ресурс.
Метод
getString()
работает асинхронно (и асинхронно отправляет события
resourceNotFound
и
bundleNotFound
). Следующий код задает прослушиватели для событий
resourceNotFound
и
bundleNotFound
:
air.Localizerlocalizer.addEventListener(air.Localizer.RESOURCE_NOT_FOUND, rnfHandler);
air.Localizerlocalizer.addEventListener(air.Localizer.BUNDLE_NOT_FOUND, bnfHandler);
var str = air.Localizer.localizer.getString("default", "error114", null, "fr_FR");
function rnfHandler(event)
{
alert(event.bundleName + ": " + event.resourceName + ":." + event.locale);
}
function bnfHandler(event)
{
alert(event.bundleName + ":." + event.locale);
}
Метод
getResourceBundle()
объекта Localizer возвращает указанный пакет для заданного языка (параметр locale). Возвращаемое методом значение является объектом со свойствами, соответствующими ключам в пакете. (Если приложение не может найти указанный пакет, метод возвращает значение
null
.)
Метод использует два параметра:
locale
и
bundleName
.
Параметр
|
Описание
|
|
Локаль (например,
"fr"
).
|
|
Имя пакета.
|
Например, в следующем коде вызывается метод
document.write()
для загрузки пакета по умолчанию для локали (fr). Затем вызывается метод
document.write()
для записи значений ключей
str1
и
str2
в этом пакете:
var aboutWin = window.open();
var bundle = localizer.getResourceBundle("fr", "default");
aboutWin.document.write(bundle.str1);
aboutWin.document.write("<br/>");
aboutWin.document.write(bundle.str2);
aboutWin.document.write("<br/>");
Метод
getResourceBundle()
отправляет событие
bundleNotFound
, когда не может найти указанный пакет. Константа
air.Localizer.BUNDLE_NOT_FOUND
задает строку
"bundleNotFound"
. У события есть два свойства:
bundleName
и
locale
. Свойство
bundleName
— это имя пакета, в котором не удалось обнаружить ресурс. Свойство
locale
— это имя локали, в которой не удалось обнаружить ресурс.
Метод
getFile()
объекта Localizer возвращает содержимое пакета для данной локали в виде строки. Файл пакета считывается как файл UTF-8. У этого метода есть ряд параметров:
Параметр
|
Описание
|
|
Имя файла ресурса (например,
"about.html"
).
|
|
Необязательно. Массив строк для замены пронумерованных тегов в строке замещения. Например, рассмотрим вызов функции, где параметр
templateArgs
равен
["Raúl", "4"]
, а совпадающая строка ресурса содержит две строки:
<html>
<body>Hello, {0}. You have {1} new messages.</body>
</html>
В этом случае функция возвратит строку с двумя строками:
<html>
<body>Hello, Raúl. You have 4 new messages. </body>
</html>
|
|
Используемый код локали, например
"en_GB"
. Если локаль задана, а подходящих файлов не обнаружено, метод не будет продолжать поиск в остальных локалях цепочки. Если код локали
не
задан, функция возвращает текст в первой же локали цепочки, в котором удается найти файл, соответствующий
resourceFileName
.
|
Например, в коде ниже метод
document.write()
вызывается с помощью содержимого файла about.html локали fr:
var aboutWin = window.open();
var aboutHtml = localizer.getFile("about.html", null, "fr");
aboutWin.document.close();
aboutWin.document.write(aboutHtml);
Метод
getFile()
отправляет событие
fileNotFound
, когда не может найти ресурс в цепочке локалей. Константа
air.Localizer.FILE_NOT_FOUND
определяет строку
"resourceNotFound"
. Метод
getFile()
работает асинхронно (и асинхронно отправляет событие
fileNotFound
). У события есть два свойства:
fileName
и
locale
. Свойство
fileName
— это имя файла, который не удалось найти. Свойство
locale
— это имя локали, в которой не удалось обнаружить ресурс. В коде ниже задается прослушиватель для этого события:
air.Localizer.localizer.addEventListener(air.Localizer.FILE_NOT_FOUND, fnfHandler);
air.Localizer.localizer.getFile("missing.html", null, "fr");
function fnfHandler(event)
{
alert(event.fileName + ": " + event.locale);
}
|
|
|