Проблемы с Flex i18n (выбор локали в onCreationComplete) - PullRequest
0 голосов
/ 12 ноября 2011

Хорошо.Я ходил по сети, пытаясь найти способ сделать интернационализацию без головной боли;и я наконец нашел средства.Включение локали в ваши параметры сборки и выполнение этой операции -locale locale/{locale}, чтобы сделать их файлами свойств для менеджера ресурсов (то есть: locale/en_GB/lang.properties в папке src.)

Проблема: Кажется, я не могуустановить локаль пользователя при запуске.Я получаю сообщение об ошибке «Индекс LocaleID вне диапазона» (что странно, поскольку LocaleID основан на строке ..?)

Эта часть работает нормально:

<fx:Script> 
    <![CDATA[
        // Shorthand resource management.
        private function getLang(key:String):String
        { return resourceManager.getString(key, 'lang'); }
    ]]>
</fx:Script>

Эта часть не работает:

protected function creationCompleteHandler(event:FlexEvent):void
{
    var locale:LocaleID = new LocaleID("en_GB");
    trace(locale.getLanguage()); // en
    trace(locale.getRegion()); // GB
    trace(locale.name); // en-GB

    if (!empty(saveData.data.lang)) // empty checks if str == null or trim(str).length == 0
        locale = new LocaleID(saveData.data.lang);

    this.setStyle("locale", locale);
}

Фактическая ошибка не выдается, когда я устанавливаю локаль, но когда объекты в пользовательском интерфейсе пытаются получить свои значения.Полное сообщение об ошибке ниже:

RangeError: Property locale value [object LocaleID] is out of range
    at flashx.textLayout.property::Property$/defaultErrorHandler()[C:\Vellum\branches\v2\2.0\dev\output\openSource\textLayout\src\flashx\textLayout\property\Property.as:31]
    at flashx.textLayout.property::Property/setHelper()[C:\Vellum\branches\v2\2.0\dev\output\openSource\textLayout\src\flashx\textLayout\property\Property.as:230]
    at flashx.textLayout.formats::TextLayoutFormat/setStyleByProperty()[C:\Vellum\branches\v2\2.0\dev\output\openSource\textLayout\src\flashx\textLayout\formats\TextLayoutFormat.as:628]
    at flashx.textLayout.formats::TextLayoutFormat/set locale()[C:\Vellum\branches\v2\2.0\dev\output\openSource\textLayout\src\flashx\textLayout\formats\TextLayoutFormat.as:1271]
    at spark.core::CSSTextLayoutFormat()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\core\CSSTextLayoutFormat.as:75]
    at spark.components::RichEditableText/updateStylesIfChanged()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\components\RichEditableText.as:3619]
    at spark.components::RichEditableText/commitProperties()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\components\RichEditableText.as:2491]
    at mx.core::UIComponent/validateProperties()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\core\UIComponent.as:8209]
    at mx.managers::LayoutManager/validateProperties()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\managers\LayoutManager.as:597]
    at mx.managers::LayoutManager/doPhasedInstantiation()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\managers\LayoutManager.as:813]
    at mx.managers::LayoutManager/doPhasedInstantiationCallback()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\managers\LayoutManager.as:1180]

Интересные факты : 1. Меня зовут не Веллум (?) 2. Мой SDK не находится в E:\dev\4.5.1 ... этов C:\Program Files\Adobe\Adobe Flash Builder 4.5.1\sdks\4.5.1.Хорошие сообщения об ошибках работы!Используя оригинальные пути сборки и все ...

Ответы [ 2 ]

1 голос
/ 12 ноября 2011

Фактическое «исправление» для этой проблемы было отвратительным, но оно работало:

protected function creationCompleteHandler(event:FlexEvent):void
{
    var locale:String = LocaleID.DEFAULT.name.replace("-", "_"); // en_GB

    if (!empty(saveData.data.lang)) // empty checks if str == null or trim(str).length == 0
        locale = saveData.data.lang;

    resourceManager.localeChain = [locale, "en_GB"];
}

Почему?Потому что кажется, что документы Flex (такие замечательные вещи) снова устарели.Использование this.setStyle("locale", locale) на самом деле ошибочно в Flex4.5.Вместо этого вы обновляете languageChain в resourceManager, чтобы включить предпочитаемый языковой стандарт в качестве первого предпочтения.

Реклама в строке с уродливыми именами, это единственный способ получить en_GB из LocaleID.Либо это, либо конкатенация строк, что тоже довольно уродливо.Жаль, что resourceManager не использует черточки так, как следует.

0 голосов
/ 12 ноября 2011

Стиль locale должен иметь строковое значение; но вы устанавливаете его с помощью объекта LocaleID. Я уверен, что вы хотите сделать это:

this.setStyle("locale", "en_GB");

Вот еще немного информации об объекте LocaleID .

...