Liferay 7 Language Properties Hook
Liferay 7 Language Properties Hook tutorial will drive you on overriding liferay core language properties.
Types of language properties:
- Liferay core language properties : Application level properties which is accessible to all modules: “portal-impl/content/” folder
- Liferay module language properties: Module level properties
In this tutorial, we will see overriding Liferay DXP core language properties and next tutorial will give you example to override liferay module language properties,
Liferay 7 Core Language Properties Hook:
- Create liferay language module project. In Eclipse: File -> New -> Liferay Module Project and select project template Name as “activator” and click on Finish. We will make the activator to component later.
- Delete the generated package along with activator and create new package: org.javasavvy.hook.language
- edit bnd.bnd
- Remove the bundle activator
- Update the Bundle-Symbolic Name to ” org.javasavvy.hook.language”
- bnd.bnd file is:
-
Bundle-Name: hooks-language Bundle-SymbolicName:org.javasavvy.hook.content.language Bundle-Version: 1.0.2
-
- Edit the build.gradle and add below dependencies. Right click on project and select -> Gradle ->Refresh Gradle Project to refresh the gradle dependencies.
-
dependencies { compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel", version: "2.0.0" compileOnly group: "com.liferay.portal", name: "com.liferay.util.taglib", version: "2.0.0" compileOnly group: "javax.portlet", name: "portlet-api", version: "2.0" compileOnly group: "javax.servlet", name: "javax.servlet-api", version: "3.0.1" compileOnly group: "jstl", name: "jstl", version: "1.2" compileOnly group: "org.osgi", name: "org.osgi.compendium", version: "5.0.0" compile group: "org.osgi", name:"org.osgi.service.component.annotations", version:"1.3.0" }
-
- Create the Component class: CustomLanguageComponent.java
- Add the @Component annotation with below config:
-
@Component( property = { "language.id=en_US" }, service = ResourceBundle.class )
-
- In the @Component annotation,provide language.id from below locales which ever you want to override. language.id does not take multple locales, need to create new module again if you wish to override language properties for another locale. This is only limitation.
-
locales=ar_SA,eu_ES,bg_BG,ca_AD,ca_ES,zh_CN,zh_TW,hr_HR,cs_CZ,da_DK,nl_NL,nl_BE,en_US,en_GB,en_AU,et_EE, fi_FI,fr_FR,fr_CA,gl_ES,de_DE,el_GR,iw_IL,hi_IN,hu_HU,in_ID,it_IT,ja_JP,ko_KR,lo_LA,lt_LT,nb_NO,fa_IR, pl_PL,pt_BR,pt_PT,ro_RO,ru_RU,sr_RS,sr_RS_latin,sl_SI,sk_SK,es_ES,sv_SE,tr_TR,uk_UA,vi_VN sv_SE,tr_TR,uk_UA,vi_VN
-
- Create the content folder in src/main/resource
- Create Language.properties and Language_en.properties files
- Project Structure is:
- CustomLanguageComponent.java:
- This class need to extend ResourceBundle
- Resource.getBundlle(“{foldername.Language}”)
-
package org.javasavvy.hook.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=en_US" }, service = ResourceBundle.class ) public class CustomLanguageComponent extends ResourceBundle { ResourceBundle bundle = ResourceBundle.getBundle("content.Language", UTF8Control.INSTANCE); @Override protected Object handleGetObject(String key) { System.out.println("getting key"+key); return bundle.getObject(key); } @Override public Enumeration<String> getKeys() { return bundle.getKeys(); } }
- Authenticate with invalid credentials and you can see customized error message:
some times, you might get the below exception. to fix this, move the Language.properties to /src/main/resource/content folder.
java.util.MissingResourceException: Can’t find bundle for base name content.Language, locale en_US
Download Liferay DXP Language Hook Code