从db获取的messages.properties

时间:2012-01-31 13:41:15

标签: java spring jsf internationalization

  

可能重复:
  Design question regarding Java EE entity with multiple language support

我正在研究JSF应用程序的i18n。 我需要从数据库中获取通常位于messages.properties中的所有标准jsf消息。有一些简单的方法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

我想我找到了答案:

public class DBMessagesBundle extends ResourceBundle {
    @Override
    protected String handleGetObject(String key){
        ...
    }

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

和FacesConfig.xml

    <application>
...
        <message-bundle>mypackage.DBMessagesBundle</message-bundle>
    </application>

感谢您的帮助。

答案 1 :(得分:0)

首先,您需要自己的MessageSource。看一下AbstractMessageSource并扩展它:

public class CustomResourceBundleMessageSource extends AbstractMessageSource {

    @Autowired
    LocalizationStore localizationStore;

    @Override
    protected MessageFormat resolveCode(String code, Locale locale){
        MessageFormat messageFormat = null;
        ResourceBundle bundle = localizationStore.getBundle(locale);
        try {
            messageFormat = getMessageFormat(bundle, code, locale);
        } catch (MissingResourceException | NullPointerException ex) {
            //Return just the code in case this is used for logging, or throw, your choice
            return createMessageFormat(code, locale);
        }
        return messageFormat;
    }

    protected MessageFormat getMessageFormat(ResourceBundle bundle, String code, Locale locale) throws MissingResourceException {
        String msg = bundle.getString(code);
        return createMessageFormat(msg, locale);
    }
}

您的商店必须返回ResourceBundle:

这很大程度上取决于您的数据库模型。我建议在getBundle()方法上使用@Cachable,因为您的本地化不太可能经常更改,并且根据您的数据库模型,它可能很昂贵。返回的对象只需要为ResourceBundle实现以下方法:

public class DBResourceBundle extends ResourceBundle {
    @Override
    protected String handleGetObject(String key){
        ...
    }

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

最后,您需要在配置中注册MessageSource bean:

<bean id="messageSource" class="com.example.CustomResourceBundleMessageSource"/>