好的。我一直在网上试图找到一种方法来进行国际化,而不会让人头疼;我终于找到了手段。在构建参数中包含区域设置,并执行-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
。好工作错误信息!使用原始构建路径和所有...
答案 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的更多信息。