如何读取特定的 language.properties 文件?
Posted
技术标签:
【中文标题】如何读取特定的 language.properties 文件?【英文标题】:How to read a specific language.properties file? 【发布时间】:2018-12-10 21:14:35 【问题描述】:这是我的问题。我需要以用户选择的特定语言生成 PDF。有些信息在 language.properties 文件中,我无法读取当前站点语言以外的其他文件。
例如,当前语言是西班牙语,用户选择德语。我想阅读 language_de.properties。
我试过用:
String Lang=LanguageUtil.get(LanguageUtil.getLocale('de'), "Mykey");
但没有成功,它总是返回“Mykey”
如果我使用:
String Lang=LanguageUtil.get(HttpServletRequest, "Mykey");
它有效,但它是网站语言,而不是我想要的。
有什么想法吗?
【问题讨论】:
你指的是哪个 language.properties?来自 Liferay、钩子或 OSGI 模块的那些?还是来自 portlet.xml (resource-bundle
) 的那些?
我使用语言文件,从模块语言到全局到所有 portlet。
【参考方案1】:
对于那些需要更通用一点的人。
向您的 portlet 添加一个访问 portlet ResourceBundle 的小类:
public class [MyPortlet]LanguageUtil
public static String get (Locale locale, String key)
ResourceBundle resourceBundle = ResourceBundle.getBundle("content.Language", locale, UTF8Control.INSTANCE);
return LanguageUtil.get(resourceBundle, key);
public static String format (Locale locale, String pattern, Object[] arguments)
ResourceBundle resourceBundle = ResourceBundle.getBundle("content.Language", locale, UTF8Control.INSTANCE);
return LanguageUtil.format(resourceBundle, pattern, arguments);
并在 portlet 的 bnd.bnd 文件的帮助下将其导出,例如:
Export-Package: [path.to.my.util]
这样它可以在 OSGI 模块和常规 JAVA 类中使用,例如:
[MyPortlet]LanguageUtil.get(serviceContext.getLocale(), "my-language-string");
【讨论】:
【参考方案2】:好的,让它工作。 我在我的模块语言中为每种语言添加了一个类
import java.util.Enumeration;
import java.util.ResourceBundle;
import org.osgi.service.component.annotations.Component;
import com.liferay.portal.kernel.language.UTF8Control;
@Component(
property = "language.id=es_ES" ,
service = ResourceBundle.class
)
public class EsResourceBundle extends ResourceBundle
@Override
protected Object handleGetObject(String key)
return _resourceBundle.getObject(key);
@Override
public Enumeration<String> getKeys()
return _resourceBundle.getKeys();
private final ResourceBundle _resourceBundle = ResourceBundle.getBundle(
"content.Language_es_ES", UTF8Control.INSTANCE);
感谢帮助
【讨论】:
【参考方案3】:一个选项是您忘记在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);
【讨论】:
locales are active,我只选择了 nl、es、fr 和 en。我的文件被命名为例如 Language_fr.properties。 Locale selloc=LanguageUtil.getLocale("es");不为空,我得到 es_ES 我添加了第三个选项。以上是关于如何读取特定的 language.properties 文件?的主要内容,如果未能解决你的问题,请参考以下文章