Main steps
1. Create a folder in the2. Create a file with ".properties" extension in the created folder. In my case "labels.properties"
1 2 3 4 | login = LOGIN DEMO message = message: password = password: user = user: |
3. Create additional files referring to the locales. For instance "labels_es.properties" for Spanish locales.
1 2 3 4 | login = DEMO DE ACCESO AL SISTEMA message = mensaje: password = contraseña: user = usuario: |
4. There are basically 3 ways to inform a xhtml file how to access the resource bundles. The first one is using the file faces-config.xml, the second one is using <f:loadbundle ..> in the xml file and the third one is accessing the resource bundle by means of a request scoped bean referenced in the xhtml file.
4.1 (Using faces-context.xml) (See Veeramani Kalyanasundaram)
4.1.a Modify the faces-config.xml file (in the webaypp/WEB-INF folder)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?xml version="1.0" encoding="UTF-8"?> <faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd" version="2.2"> <application> <resource-bundle> <base-name>bundles.labels</base-name> <var>label</var> </resource-bundle> </application> </faces-config> |
Notes:
a. To access the resource bundles, we need to reference the file bundle/labels.properties as bundles.labels in the <base-name> xml tag
b. We assign a variable named label that is a map to the "localized" properties (marked in the <var> tag), and can be referenced within any xhtml file as if it were a bean!.
4.1.b The login xhtml file (whose name is test03-loginbean-lang.xhtml) is:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui"> <h:head> </h:head> <h:body> <h:form> <p:panel header="#{label.login}"> #{label.user} <p:keyboard value="#{loginBean.user}"/> <br /> #{label.password} <p:keyboard value="#{loginBean.password}"/> <br /> #{label.message} <h:outputText value="#{loginBean.myError}"/> </p:panel> <p:commandButton value="Submit"/> <p:commandButton value="Login" action="#{loginBean.login}"/> </h:form> </h:body> </html>
The labels have been replaced with references to the label variable displayed in red colour.
4.2 (using <f:loadbundle..> in the xhtml file. (See Veeramani Kalyanasundaram)
4.2.1 Let's copy the file test03-loginbean-lang.xhtml into test04-loginbean-lang.xhtml, and in the h:head part add this code <f:loadBundle basename="bundles.labels" var="label" /> where basename refers the path to our bundle/labels.properties and var refers to a variable to hold the i18n properties
The test04-loginbean-lang.xhtml is
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui"> <h:head> <f:loadBundle basename="bundles.labels" var="label" /> </h:head> <h:body> <h:form> <p:panel header="#{label.login}"> #{label.user} <p:keyboard value="#{loginBean.user}"/> <br /> #{label.password} <p:keyboard value="#{loginBean.password}"/> <br /> #{label.message} <h:outputText value="#{loginBean.myError}"/> </p:panel> <p:commandButton value="Submit"/>c <p:commandButton value="Login" action="#{loginBean.login}"/> </h:form> </h:body> </html> |
See <f:loadbundle..> in line number 6
4.3 accessing through a bean. (See Balusc in Stackoverflow)
BalusC suggested: "Put it in request map yourself in (post)constructor of a request scoped bean which is referenced in the view."
This means that if you pass the resource bundle to the "ExternalContext map", the bundle will be accessible by the xhtml file.
4.3.1 Let's copy the LoginBean.java to LoginBean and copy the code proposed by BalusC in a new method called init() (annotated by @PostConstruct)
LoginBeanBundle.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | package org.ximodante.jsf.login; import java.io.Serializable; import java.util.ResourceBundle; import javax.annotation.PostConstruct; import javax.enterprise.context.RequestScoped; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.inject.Named; import lombok.Getter; import lombok.Setter; @Named @RequestScoped public class LoginBeanBundle implements Serializable{ private static final long serialVersionUID = 1L; @Getter @Setter private String user; @Getter @Setter private String password; @Getter private String myError=""; public String login () { if (user.equalsIgnoreCase("ximo") && password.equals("password")) { return "test02-application-page"; } else { myError="Bad User/password"; return "test02-login-page"; } } @PostConstruct private void init() { FacesContext facesContext=FacesContext.getCurrentInstance(); ResourceBundle bundle = ResourceBundle.getBundle("bundles.labels", facesContext.getViewRoot().getLocale()); ExternalContext externalContext=facesContext.getExternalContext(); externalContext.getRequestMap().put("label", bundle); } } |
Notes:
a. To access the resource bundles, we need to reference the file bundle/labels.properties as bundles.labels in the ResourceBundle.getBundle method
b. We save the resource bundle into the RequestMap assigning a property named label that is a map to the "localized" properties. Now it can be accessed by the xhtml file.
To simplify let's copy the test03-loginbean-lang.xhtml into test05-loginbeanbundle-lang.xhtm and replace LoginBean with LoginBeanBundle.
The test05-loginbeanbundle-lang.xhtm is
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui"> <h:head> </h:head> <h:body> <h:form> <p:panel header="#{label.login}"> #{label.user} <p:keyboard value="#{loginBeanBundle.user}"/> <br /> #{label.password} <p:keyboard value="#{lloginBeanBundle.password}"/> <br /> #{label.message} <h:outputText value="#{loginBeanBundle.myError}"/> </p:panel> <p:commandButton value="Submit"/> <p:commandButton value="Login" action="#{loginBeanBundle.login}"/> </h:form> </h:body> </html> |
loginBeanBundle is the new bean.
Happy coding!
Comments
Post a Comment