Flex i18n问题(在onCreationComplete中选择Locale)

时间:2011-11-12 08:59:20

标签: flex flash-builder flex4.5

好的。我一直在网上试图找到一种方法来进行国际化,而不会让人头疼;我终于找到了手段。在构建参数中包含区域设置,并执行-locale locale/{locale}事务以使它们成为资源管理器的属性文件(即:src文件夹中的locale/en_GB/lang.properties。)

问题:我似乎无法在启动时设置用户的语言环境。我收到一些关于“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);
}

当我设置语言环境时,但是当UI中的对象尝试获取其值时,不会抛出实际错误。完整的错误消息如下:

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]

有趣的事实: 我的名字不是Vellum(?) 2.我的sdk不在E:\dev\4.5.1 ...它在C:\Program Files\Adobe\Adobe Flash Builder 4.5.1\sdks\4.5.1。好工作错误信息!使用原始构建路径和所有...

2 个答案:

答案 0 :(得分:1)

这个问题的实际“修复”令人厌恶,但它确实有效:

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文档(如此精彩的东西)又一次,过时了。在Flex4.5中使用this.setStyle("locale", locale)实际上是错误的。而是更新resourceManager的languageChain以将首选语言环境作为第一个首选项。

根据丑陋的命名行广告,这是从LocaleID中获取“en_GB”的唯一方法。无论是那个还是字符串连接,这也很难看。太糟糕了,resourceManager并没有将破折号视为应该的下划线。

答案 1 :(得分:0)

locale style应该有一个字符串值;但是您使用LocaleID对象进行设置。我很确定你想这样做:

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

以下是LocaleID object的更多信息。