一个选项是您忘记在portal-ext.properties 中为locales.enabled 定义de_DE:
#
# Specify the locales that are enabled by default.
#
locales.enabled=en_US,de_DE,es_ES
另一种可能是您的门户实例没有启用区域设置。您应该在实例的管理 UI 中进行检查。
在这两种情况下,LanguageUtil.getLocale('de') 将返回 null - 这将返回来自 LanguageUtil.get 的给定密钥。您可以通过打印LanguageUtil.getLocale('de') 和LanguageUtil.getLocale('de_DE') 的结果来验证这一点(都应该是null)。只需将区域设置添加到启用的区域即可。
第三个 选项适用,如果您在 portlet 的资源包中定义了消息(通常您在钩子或 OSGI 包中定义消息以在多个 portlet 中使用它们)。在这种情况下,LanguageUtil.get(Locale, String) 不知道您在哪个 portlet 中,也无法访问该 portlet 的资源包。这与LanguageUtil.get(HttpServletRequest, String) 不同,后者从请求中检索portlet。
在这种情况下,您必须从提供给 Portlet.init(PortletConfig) 方法的配置中检索资源包。或者您使用特定于语言环境的参数来模仿 LanguageUtil.get(HttpServletRequest, String) 的实现:
public class MyLanguageUtil {
public static String get(HttpServletRequest request, Locale locale, String key) {
if (request == null) {
return key;
}
PortletConfig portletConfig = (PortletConfig) request.getAttribute("javax.portlet.config");
if (portletConfig != null) {
ResourceBundle resourceBundle = portletConfig.getResourceBundle(locale);
if (resourceBundle.containsKey(key)) {
return LanguageUtil.get(resourceBundle, key, key);
}
}
return LanguageUtil.get(locale, key);
}
}