2011-12-14 3 views
0

저는 현재 매우 다양한 언어로 사용할 수있는 응용 프로그램을 설계하고 있으며 많은 연구를 거쳐 resouceBundles를 사용하기로 되돌 렸습니다. 나는 jsf 1.2와 glassfish 3.1과 함께 java se 1.6과 java ee 6을 사용하고있다.JSF ResourceBundle을 다시로드하는 방법은 무엇입니까?

나는 인터넷을 통해 다음과 같은 코드를 얻었고 이해할 수 있도록 배열했다. 이제 질문은 ResourceBundle이로드된다. 괜찮아요, 그러나 그것은 새로 고쳐지지 않습니다 .. 내가 너무 많은 다른 ResourceBundle.clearCache() 메서드를 시도했지만 그 중 아무도 작동하는 것 같습니다 ...

컨트롤 클래스에서 유의하십시오 로케일을 확인하고 데이터를로드 그것을 맞추기. 이것은 나중에 데이터베이스 기반 시스템으로 대체 될 것입니다. LocalTestControl.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 LocalTest.java :이

CODE_SAMPLE ... 난 기본 구조 작업이 있는지 확인하는 유일한 테스트 코드입니다

그리고

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

가능한 중복 [웹 응용 프로그램의 자원 번들을 다시로드하는 방법? (http://stackoverflow.com/questions/4325164/how-to-reload-resource-bundle-in-web-application) – BalusC

답변

0

이 같은 수행 할 수 있습니다,

  1. 먼저 로케일 코드를 사용하여 여러 ApplicationResources를 만듭니다
    • ApplicationResources.properties (기본 파일)
    • ApplicationResources_es.properties (스페인어 파일, 즉)
  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

관련 문제