如何读取特定的 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 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查是不是允许用户读取/写入特定注册表项?

如何使用 ATA 命令读取磁盘的特定扇区?

如何读取特定的 language.properties 文件?

js读取文本,如何把读取到的某些内容替换成特定内容?

如何读取特定数量的字符

如何从R中的大型固定宽度文件中读取特定列