0

我正在尝试向 Flex 移动应用程序添加更多语言环境,并准备了一个简单的测试用例来演示我目前遇到的问题:

截屏:

截屏

TestLang.mxml(只需添加到 Flash Builder 4.7 中的空白项目):

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               initialize="init()">

    <fx:Metadata>
        [ResourceBundle("resources")]
    </fx:Metadata> 

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import spark.events.IndexChangeEvent;

            [Bindable]
            private var _locales:ArrayCollection = new ArrayCollection();

            [Bindable]
            private var _numbers:ArrayCollection = new ArrayCollection();

            private function init():void {
                resourceManager.localeChain = [ 'de_DE' ];

                _locales.addItem({ locale: 'en_US', label: 'English' });
                _locales.addItem({ locale: 'ru_RU', label: 'Русский' });
                _locales.addItem({ locale: 'de_DE', label: 'Deutsch' });

                localize();
            }

            private function localize():void {
                _numbers.removeAll();
                _numbers.addItem({ label: resourceManager.getString('resources', 'menu.one') });
                _numbers.addItem({ label: resourceManager.getString('resources', 'menu.two') });
                _numbers.addItem({ label: resourceManager.getString('resources', 'menu.three') });
                _numbers.addItem({ label: resourceManager.getString('resources', 'menu.four') });
                _numbers.addItem({ label: resourceManager.getString('resources', 'menu.five') });
            }

            protected function changeLocale(event:IndexChangeEvent):void {
                var list:List = event.target as List;
                var item:Object = list.selectedItem;
                resourceManager.localeChain = [ item.str ]; // XXX
                localize();
            }

        ]]>
    </fx:Script> 

    <s:layout>
        <s:VerticalLayout />
    </s:layout>

    <s:List 
        width="100%" 
        height="50%"
        change="changeLocale(event)"
        dataProvider="{_locales}">
        <s:itemRenderer>
            <fx:Component>
                <s:IconItemRenderer labelField="label" />
            </fx:Component>
        </s:itemRenderer>
    </s:List>

    <s:List 
        width="100%" 
        height="50%"
        dataProvider="{_numbers}">
        <s:itemRenderer>
            <fx:Component>
                <s:IconItemRenderer labelField="label" />
            </fx:Component>
        </s:itemRenderer>
    </s:List>

</s:Application>

src/locale/en_US/resource.properties:

menu.one=One
menu.two=Two
menu.three=Three
menu.four=Four
menu.five=Five
menu.title=English

src/locale/de_DE/resource.properties:

menu.one=Eins
menu.two=Zwei
menu.three=Drei
menu.four=Vier
menu.five=Fünf
menu.title=Deutsch

src/locale/ru_RU/resource.properties:

menu.one=Один
menu.two=Два
menu.three=Три
menu.four=Четыре
menu.five=Пять
menu.title=Русский

在项目属性中,我添加了Flex Build Path -> Source path ofsrc\locale\{locale}

Flex 编译器参数-locale de_DE ru_RU en_US -allow-source-path-overlap=true

在上面的屏幕截图中,您可以看到最初正确显示了德语区域设置。

但是当你触摸上面的 List 来改变语言环境时,下面的 List 就会变成空的。

请问为什么会这样?

我已经阅读了 Adob​​e 文档使用 ResourceManager 和其他少数人在运行时更改语言环境,但还没有弄清楚原因。

resourceManager.localeChain分配一个新数组时,语言环境切换是同步发生还是应该监听某个事件?

4

1 回答 1

0

我有一个复制粘贴错误!正确的行是

resourceManager.localeChain = [ item.locale ];

我决定保留我的问题和这个答案,以防有人正在寻找一个在运行时切换 Flex 语言环境的简单测试用例。

于 2013-06-04T22:09:37.897 回答