Как перезагрузить JSF ResourceBundle? - PullRequest
0 голосов
/ 14 декабря 2011

В настоящее время я разрабатываю приложение, которое должно быть доступно на многих языках, и после долгих исследований я вернулся к использованию resouceBundles.Я использую java se 1.6 и java ee 6 с jsf 1.2 и glassfish 3.1 ..

Я получил следующие коды со всего интернета и расставил их так, чтобы имело смысл ... Теперь вопрос в том,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 - Комплект ресурсовControl

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:

<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>

Любая помощь и совет очень ценятся.

1 Ответ

0 голосов
/ 16 декабря 2011

вы можете сделать что-то вроде этого:

  1. Сначала создайте несколько ApplicationResources с помощью кодов локали:
    • ApplicationResources.properties (файл по умолчанию)
    • ApplicationResources_es.properties (испанский файл, т. Е.)
  2. Измените face-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

...