【问题标题】:How to read a specific language.properties file?如何读取特定的 language.properties 文件?
【发布时间】: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。

标签: liferay-7


【解决方案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
      • 我添加了第三个选项。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多