kilicos
kilicos

Reputation: 99

How to read a specific language.properties file?

Here's my problem. I need to generate PDF in particular language chosen by user. Some informations are in language.properties files and I cannot manage to read other files than the current site language.

For example current language is Spanish and User select German. I'd like to read language_de.properties.

I've tried to use:

String Lang=LanguageUtil.get(LanguageUtil.getLocale('de'), "Mykey");

but without sucess, it always returns "Mykey"

If I use :

String Lang=LanguageUtil.get(HttpServletRequest, "Mykey");

It works, but It's the site language and not the one I want.

Any Ideas?

Upvotes: 2

Views: 5184

Answers (3)

André Kreienbring
André Kreienbring

Reputation: 2509

For those who need this to be a little more generic.

Add a small class to your portlet that accesses the portlets 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);
    }
}

and export it with the help of the bnd.bnd file of the portlet like:

Export-Package: [path.to.my.util]

This way it can be used in OSGI modules and regular JAVA classes for example like this:

[MyPortlet]LanguageUtil.get(serviceContext.getLocale(), "my-language-string");

Upvotes: 1

kilicos
kilicos

Reputation: 99

ok got it to work. I added a class for each language in my module language

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);}

thanks for help

Upvotes: 1

Tobias Liefke
Tobias Liefke

Reputation: 9022

One option is that you have forgotten to define de_DE in your portal-ext.properties for locales.enabled:

#
# Specify the locales that are enabled by default.
#
locales.enabled=en_US,de_DE,es_ES

Another possibility is that the locale is not enabled for your portal instance. You should check that in the admin UI of your instance.

In both cases LanguageUtil.getLocale('de') will return null - and this will return the given key from LanguageUtil.get. You can verify that by printing the result of LanguageUtil.getLocale('de') and LanguageUtil.getLocale('de_DE') (should both be null). Just add the locale to the enabled ones and you are good.

A third option applies, if you have defined the messages in the resource bundle of your portlet (usually you define the messages in a hook or OSGI bundle to use them in more than one portlet). In that case LanguageUtil.get(Locale, String) doesn't know which portlet you are in and can't access the resource bundle of that portlet. That's the difference to LanguageUtil.get(HttpServletRequest, String), which retrieves the portlet from the request.

In that case you have to retrieve the resource bundle from the config given to your Portlet.init(PortletConfig) method. Or you mimic the implementation of LanguageUtil.get(HttpServletRequest, String) with a locale specific parameter:

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);
  }

}

Upvotes: 2

Related Questions