0

我有一個包含許多模塊的國際化項目。每個模塊都有自己的一套軟件包組成:正確的java.util.ResourceBundle組織

- database-module 
    + com_naugler_project_database.properties 
    + com_naugler_project_database_fr.properties 
- mapping-module 
    + com_naugler_project_mapping.properties 
    + com_naugler_project_mapping_fr.properties 

然而,許多國際條款是多餘的(如「OK」或「取消」),我想在一個地方這些條款,便於維護和發展。

我發現的ResourceBundle繼承this helpful explanation,但它看起來好像一個(不是?)共同祖先就不能正確地國際化,因爲:

- common-module 
    + com_naugler_project.properties 
    + com_naugler_project_fr.properties   <-- this is not an ancestor 
- database-module 
    + com_naugler_project_database.properties 
    + com_naugler_project_database_fr.properties <-- of this 

難道我的方式把我捆組織基地?提供共同國際化祖先的正確方法是什麼?

+0

張貼後我發現這個:http://stackoverflow.com/q/2067336/779982,但我仍然喜歡一些反饋... – naugler 2012-07-10 15:27:58

+0

要模擬資源包繼承,請參閱:https://stackoverflow.com/a/4615268/59087 – 2017-10-27 16:25:46

回答

3

你想要什麼似乎是資源的層次結構,也就是說,你可能想要一個類從over(或由某個特定的部分和一些共同的部分組成)派生。

基本上,ResourceBundle不是爲它設計的,而是你自己設計的。

但是你想要一些建議,我想。

  • 確保通用術語是真的常見。這就是「OK」,「Cancel」,「Next>」,「< Previous」,「Open」,「File」等等在他們的上下文中會有共同的翻譯。我的意思是翻譯這樣的標準項目只需要一次是相當安全的,但是如果你想在不同的上下文中使用它們,你仍然需要另一個條目。爲什麼?因爲「打開」按鈕翻譯與許多語言中的「打開」對話標題翻譯不同。

  • 將所有.properties文件移到一個位置(例如名爲「resources」的目錄)。當然,具體的模塊文件應分開到不同的子目錄...

    • 創建資源工廠將返回ResourceBundle類的一個實例(或您自己的門面 - 這種做法實際上將讓你有一些共同的包)。
  • 好做法對於大型應用程序是創建一些語言包,那就是語言資源分離到它們自己的目錄(即/資源/ EN,/資源/ FR,/資源/ ZH-漢斯)。然而,這種方法的問題在於,您需要自己實施資源回退(藉助您在問題中提到的文章,層次結構實際上是資源加載層次結構)。這意味着一些特殊情況,如從語言標記「nb」退回到「否」,但不會從「nn」退回;從「zh-CN」和「zh-SG」回落到「zh-Hans」,然後回到「zh」,但從「zh-HK」和「zh-TW」以及「zh-MO」回落到「zh」 --Hant「,然後轉換爲默認語言,而不是從」pt-BR「下降到」pt「(而是回落到默認語言)。

似乎很多工作?那麼,但之後的維護工作將會很少。

有一件事可能會派上用場PropertyResourceBundle有兩個構造函數可以讓你加載你想要的任何屬性文件,即:PropertyResourceBundle(InputStream stream)PropertyResourceBundle(Reader reader)。老實說,在大型項目中,標準的Res​​ourceBundle機制有太多限制,所以你真的需要你自己的資源訪問層...

+0

優秀但令人失望的答案,謝謝。 #1是非常好的一點,我沒有充分考慮這一點。 #3可能非常接近我最終要做的事情(對資源包進行分類以改變確定候選包名稱的方法)。 – naugler 2012-07-11 14:55:07

+0

@naugler:子類化ResourceBundle的問題是有些方法是最終的。這很愚蠢,但我無法幫助它。 – 2012-07-11 15:15:10

1

PawełDyda指出,資源包本身不支持類層次結構解析。然而,我公司剛剛發佈的Rincl項目應該只是做你正在尋找的東西---並處理UTF-8 .properties文件和XML屬性文件。它甚至可以爲你提供消息格式。

正如在Rincl quick start中所述,您可以簡單地實施Rincled,然後致電getResources(); Rincl將加載資源包即使在父類或接口中聲明:

public class MyClass extends BaseClass implements Rincled { 
    … 

    final String userName = "Jane Doe"; 
    //Retrieve the formatted user label based upon the current locale. 
    //en-US: "Settings for user Jane Doe." 
    //pt-BR: "Definições para usuário Jane Doe." 
    final String userLabel = getResources().getString("user-label", userName); 
    … 

Rincl可在http://rincl.io/intro和Java國際化甚至是完全lesson。有很多新功能出現,但最新版本應該已經爲你工作。如果您有任何疑問或問題,請告知我。