首先,您需要自己的 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"/>