2012-01-25 48 views
1

我們在JSF 2.0中有一個UI,它分爲兩部分:一部分位於用戶語言環境中,另一部分位於所選語言環境中。例如,如果用戶是決定選擇英語的法國人,則該頁面的一些組件是法語的,其他一些是英語的。一個視圖中的多個語言環境/軟件包

是否有可能實現這一目標?

簡單f:loadBundle不接受任何語言環境,並使用其父母f:view中定義的語言環境,因此看起來我們只能爲每個視圖定義一個語言環境。

也許我們可以使用多個f:view?我們嘗試了一下,但服務器沒有太多抱怨,但JavaDoc說f:view是「Container for 全部 JavaServer Faces核心和自定義組件動作在頁面」,所以我不會猜測這樣做應該是安全的。

回答

3

這是不可能通過<f:loadBundle>手段。在整個視圖中的確只能有一個區域設置,並且不允許嵌套<f:view>標籤(技術上它可以工作,但嵌套標籤將被忽略)。

最好的辦法是創建延伸ResourceBundle託管bean,包裝在所需的語言環境和委託給它的調用包。事情是這樣的:

@ManagedBean 
@RequestScoped 
public class BundleBean extends ResourceBundle { 

    private ResourceBundle wrapped; 

    public BundleBean() { 
     // You can get/supply the locale as a parameter or property. 
     // Again, just a basic kickoff example. 
     wrapped = ResourceBundle.getBundle("com.example.i18n.text", new Locale("fr")); 
    } 

    @Override 
    protected Object handleGetObject(String key) { 
     return wrapped.getObject(key); 
    } 

    @Override 
    public Enumeration<String> getKeys() { 
     return wrapped.getKeys(); 
    } 

} 

你可以用它通常的方式:

#{bundleBean.someKey} 
#{bundleBean['some.key.with.periods']} 
+0

我想過一個'Bean'其中包含了'ResourceBundle',但是使它_extends_'ResourceBundle'是真聰明,因爲它清楚地簡化JSF頁面中使用它。 順便說一句,是什麼讓我們在這裏做這樣'#{} myBean.someKey電話'就算豆沒有一個明確的'getSomeKey()'方法? 'ResourceBundle'有什麼特別之處? –

+0

這是正確的。 ''ResourceBundleEL''有特殊待遇['ResourceBundleELResolver'](http://docs.oracle.com/javaee/6/api/javax/el/ResourceBundleELResolver.html)。 – BalusC

+0

那麼,這將完全做我們需要的工作。非常感謝! –

0

爲什麼不乾脆把英語值缺省資源束(一種不帶後綴)?這樣,如果當前語言環境沒有匹配的字符串,它會顯示。

+0

這不正是OP所要求的:*「分爲兩部分:一部分在用戶區域,另一部分在選定區域」*。我想它是某種後端管理屏幕的一部分。 – BalusC

+0

我同意@BalusC,他回答合適。 –

相關問題