2011-12-14 44 views
0

我目前正在設計一個應用程序,需要在許多不同的語言中使用,經過大量的研究後,我才恢復使用resouceBundles。我用jsf 1.2和glassfish 3.1使用java se 1.6和java ee 6 ..如何重新加載JSF ResourceBundle?

我從互聯網上得到了下面的代碼,並以一種合理的方式安排它。現在問題是,ResourceBundle加載好吧,但它沒有得到刷新..我嘗試了很多不同的ResourceBundle.clearCache()方法,但沒有一個似乎在工作...

請注意在Control類中,我正在檢查語言環境並加載數據以適應這一點。這將在稍後由數據庫支持的系統取代。這僅僅是測試代碼,以確保我有底層結構的工作...

CODE_SAMPLE:LocalTest.java - 資源包

public class LocalTester extends ResourceBundle { 

    protected static final String BUNDLE_NAME = "local.lantest.LocalTester"; 
    protected static final Control UTF8_CONTROL = new LocalTesterControl(); 

    public LocalTester() { 
     setParent(ResourceBundle.getBundle(BUNDLE_NAME, FacesContext.getCurrentInstance().getViewRoot().getLocale(), UTF8_CONTROL)); 
    } 

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

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

    public static Control getUTF8_CONTROL() { 
     return UTF8_CONTROL; 
    } 
} 

CODE_SAMPLE:LocalTestControl.java - 資源包控制

public class LocalTesterControl extends Control { 

    @Override 
    public boolean needsReload(String baseName, Locale locale, String format, ClassLoader loader, ResourceBundle bundle, long loadTime) { 
     return true; 
    } 

    @Override 
    public long getTimeToLive(String baseName, Locale locale) { 
     return TTL_DONT_CACHE; 
    } 

    @Override 
    public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) 
      throws IllegalAccessException, InstantiationException, IOException { 

     System.out.println("---------------------------LOADING LOCALE PACK-------------------------------------"); 
     System.out.println("Printing baseName = " + baseName); 
     System.out.println("Printing locale.getLanguage() = " + locale.getLanguage()); 
     System.out.println("Printing locale.getDisplayLanguage() = " + locale.getDisplayLanguage()); 

     ResourceBundle rbdl; 

     if (locale.getLanguage().compareTo("fr") == 0) { 
      System.out.println("------- LOAD FRENCH language pack load"); 
      rbdl = new ListResourceBundle() { 

       @Override 
       protected Object[][] getContents() { 
        Object[][] aa = { 
         {"welcome", "FR- Welcome" + (new Date().toString())}, 
         {"message", "FR- message"}, 
         {"signoff", "FR- Sign Off"}, 
         {"parametWelcome", "FR-Para Meter Welcome... {0} is parameter..."}, 
         {"numberParaFormat", "FR-NUMBER parameter = {0}...."} 
        }; 
        return aa; 
       } 
      }; 
     } else if (locale.getLanguage().compareTo("es") == 0) { 
      System.out.println("------- LOAD ESPANIOLA language pack load"); 
      rbdl = new ListResourceBundle() { 

       @Override 
       protected Object[][] getContents() { 
        Object[][] aa = { 
         {"welcome", "ES- Welcome" + (new Date().toString())}, 
         {"message", "ES- message"}, 
         {"signoff", "ES- Sign Off"}, 
         {"parametWelcome", "ES-Para Meter Welcome... {0} is parameter..."}, 
         {"numberParaFormat", "ES-NUMBER parameter = {0}...."} 
        }; 
        return aa; 
       } 
      }; 
     } else { 
      System.out.println("------- LOAD DEFAULT language pack load"); 
      rbdl = new ListResourceBundle() { 

       @Override 
       protected Object[][] getContents() { 
        Object[][] aa = { 
         {"welcome", "EN- Welcome" + (new Date().toString())}, 
         {"message", "EN- message"}, 
         {"signoff", "EN- Sign Off"}, 
         {"parametWelcome", "EN-Para Meter Welcome... {0} is parameter..."}, 
         {"numberParaFormat", "EN-NUMBER parameter = {0}...."}, 
         {"notrans", "EN- No Language Translation"} 
        }; 
        return aa; 
       } 
      }; 
     } 

     return rbdl; 
    } 
} 

最後的面孔配置:

<faces-config version="2.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"> 
    <application> 
     <resource-bundle> 
      <base-name>local.lantest.LocalTester</base-name> 
      <var>bundi</var> 
     </resource-bundle> 
     <locale-config> 
      <default-locale>en</default-locale> 
      <supported-locale>en</supported-locale> 
      <supported-locale>es</supported-locale> 
      <supported-locale>fr</supported-locale> 
     </locale-config> 
    </application> 

</faces-config> 

任何HEL p和建議是非常重要的。

+0

可能重複[如何重新加載Web應用程序資源包?( http://stackoverflow.com/questions/4325164/how-to-reload-resource-bundle-in-web-application) – BalusC 2011-12-16 10:11:10

回答

0

你可以做這樣的事情:

  1. 首先,使用本地代碼創建幾個ApplicationResources:
    • ApplicationResources.properties(默認文件)
    • ApplicationResources_es.properties(西班牙語文件,IE)
  2. 修改faces-config.xml以支持不同的語言環境:
<application> 
    <locale-config> 
    <default-locale>en</default-locale> 
    <supported-locale>en</supported-locale> 
    <supported-locale>es</supported-locale> 
    </locale-config> 
    <message-bundle>com.business.resources.ApplicationResources</message-bundle> 
</application> 

編輯您的JSF和補充:

<f:loadBundle basename="com.business.resources.ApplicationResources" var="msg"/> 

你可以看到下面的網站區域設置列表:http://www.science.co.il/language/locale-codes.asp