How to load locale from POST/GET parameter

This page will summarize how to load a resource bundle dynamically from a GET/POST parameter.  1.) In your mail xhtml template, make sure ...

This page will summarize how to load a resource bundle dynamically from a GET/POST parameter. 

1.) In your mail xhtml template, make sure that you define f:view locale before the h:body tag:

<f:view locale="#{languageBean.currentLocale}" />

2.) Create a LanguageBean managed-bean:

import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;

import javax.enterprise.context.SessionScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

 * @author Edward P. Legaspi
 * @since Jan 17, 2013
public class LanguageBean implements Serializable {
 private static final long serialVersionUID = 1L;
 private static Map supportedLocales;
 private Logger log = LoggerFactory.getLogger(LanguageBean.class);

 private transient Locale currentLocale;

 static {
  supportedLocales = new LinkedHashMap<>();
  supportedLocales.put("English", Locale.US);
  supportedLocales.put("日本語 言語", Locale.JAPAN);

 public Map getSupportedLocales() {
  return supportedLocales;

 public Locale getCurrentLocale() {
  if (currentLocale == null || currentLocale.equals("")) {
   currentLocale = Locale.US;

  return currentLocale;

 public void setCurrentLocale(Locale currentLocale) {
  this.currentLocale = currentLocale;

 public String switchLanguage(String language) {
  log.debug("changing locale to={}", language);
  if (language.equals("EN")) {
   currentLocale = Locale.US;
  } else {
   currentLocale = Locale.JAPAN;

  return FacesContext.getCurrentInstance().getViewRoot().getViewId() + "?faces-redirect=true";

 public String getEntrustLocale() {
  if (currentLocale == Locale.US) {
   return "9";
  } else {
   return "28";

3.) The flags:
<ul class="right">
 <li><p:commandLink immediate="true"
   <h:graphicImage library="img" name="flags/us.png"></h:graphicImage>
 <li><p:commandLink immediate="true"
   <h:graphicImage library="img" name="flags/jp.png"></h:graphicImage>

4.) Now in your receiver bean's PostConstruct annotated method, read the context parameter and set the locale:
public void init() throws RuntimeException, IOException {
 ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();

 Map requestParameters = context.getRequestParameterMap(); 
 // set locale
 try {
 } catch (IllegalArgumentException | NullPointerException e) {

5.) For the initial page load, the first time a request has been receive you need to manually reload the page for the locale to take effect:
<script type="text/javascript">
 window.onload = function() {
  if (!window.location.hash) {
   window.location = window.location + '#loaded';


java-getting-started 7825744616385787268

Post a Comment Default Comments