2013-05-31 37 views
0

在Flash Builder 4.7(含3.5 AIR),我想語言環境爲en_US和de_DE這個添加到Flex移動應用程序,這原本也不過才ru_RU。試圖語言環境添加到Flex移動應用程序:ResourceManager的是空

I.e.最初我只有-locale ru_RU在項目屬性 - > Flex編譯器和源代碼中的硬編碼俄文文本(一切工作正常)。

但研究Adobe docs Localization in Flex – Part 1: Compiling resources into an applicationAdding new locales我已經改變了Flex編譯器(標誌)後:-locale ru_RU en_US de_DE

enter image description here

並增加src\locale\{locale}到源路徑:

enter image description here

最後我創建了分區和文件

src\locale\ru_RU\resources.properties 
src\locale\en_US\resources.properties 
src\locale\de_DE\resources.properties 

這裏EN_US \ resources.properties內容:

menu.play=Play via 
menu.weekly=Weekly rating 
menu.daily=Daily misere 
menu.settings=Settings 

的AIR 3.5 SDK目錄已經包含了3個子目錄本身:

C:\Program Files\Adobe\Adobe Flash Builder 4.7 (64 Bit)\sdks\4.6.0 (AIR 3.5)\ 

frameworks\projects\framework\bundles\ru_RU 
frameworks\projects\framework\bundles\en_US 
frameworks\projects\framework\bundles\de_DE 

,所以我沒有用過copylocale實用程序(對吧?)

在我的源代碼中我改變了第一個視圖:

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

[Bindable] 
private var _ac:ArrayCollection = new ArrayCollection([ 
    { icon: OK_ICON, view: OK, label: resourceManager.getString('resources','menu.play'), msg: 'Odnoklassniki.ru' }, 
    { icon: MR_ICON, view: MR, label: resourceManager.getString('resources','menu.play'), msg: 'Mail.ru' }, 
    { icon: VK_ICON, view: VK, label: resourceManager.getString('resources','menu.play'), msg: 'Vk.com' }, 
    { icon: FB_ICON, view: FB, label: resourceManager.getString('resources','menu.play'), msg: 'Facebook.com' }, 
    { icon: GG_ICON, view: GG, label: resourceManager.getString('resources','menu.play'), msg: 'Google+' } 
]); 

但是,新代碼在運行時彈出,說resourceManager爲空。

請問我錯過了什麼?

我應該初始化resourceManager不知何故?

+1

不知道這是否是你的一個問題,但是我發現沒有定義編譯器參數爲'-locale = en_US,則ru_RU'編譯器將無法識別多個參數。 –

回答

1

這只是一個猜測,但它似乎很有道理:

你試圖初始化ArrayCollection時使用的ResourceManager。這種類型的變量初始化發生在創建類時,並且很可能Flex沒有足夠的時間來完成它在視圖中執行的所有操作(如初始化它的屬性resourceManager)。

如果在視圖調度「creationComplete」事件後填充ArrayCollection,則應該保證resourceManager不再爲空。或許你可以嘗試一些得到「初始化」做這個工作有點早「creationComplete」之前分派的其他Flex生命週期事件的...

+0

就是這樣,謝謝!將它移動到'initialize'階段,現在它工作。更改區域設置時,是否必須手動更新'_ac'?我已經添加了一個按鈕''click =「resourceManager.localeChain = ['de_DE']」'但是'_ac'和使用它的List不會自己更新。 –

+1

「通常情況下」,你不應該這樣做......自從我這麼做已經太久了,所以這可能是不正確的。我將「normal」放在引號中,因爲簡單用例如下所示:''通過像這樣綁定,我相信resourceManager將調度事件觸發另一個調用以在語言更改時獲取字符串。然而,在你的情況下,你的'ArrayCollection'的元素只是對象(不是'EventDispatcher'),所以dataProvider中的元素沒有監聽綁定事件,並且不知道lang已經改變。 –

+1

您可以重構您的列表,以便dataProvider包含字符串的資源包ID,而不是字符串本身。然後在項目渲染器中,使用一個綁定表達式,就像我在上面的註釋中一樣,在渲染器中使用適當的字符串填充標籤。我不確定這是否會影響性能(可能會影響列表的滾動性能)。 –

0

你缺少語言環境代碼之間的編譯器參數的逗號。

如果你想要把你的當地人src目錄下,像我這樣做,你可以添加以下編譯參數

-locale=en_US,fr_FR,zh_CN,pt_BR -allow-source-path-overlap=true -source-path=locale/{locale} 
相關問題