Spring Resource bundle with ResourceBundleMessageSource example

In Spring, you can use ResourceBundleMessageSource to resolve text messages from properties file, base on the selected locales. See following example :

1. Directory Structure

Review directory structure of this example.

directory structure of this example

2. Properties file

Create two properties files, one for English characters (messages_en_US.properties), other one for Chinese characters (messages_zh_CN.properties). Put it into the project class path (see figure above).

File : messages_en_US.properties


customer.name=Yong Mook Kim, age : {0}, URL : {1}

File : messages_zh_CN.properties


customer.name=\ufeff\u6768\u6728\u91d1, age : {0}, URL : {1}

The ‘\ufeff\u6768\u6728\u91d1‘ is Unicode characters in Chinese.

Note
To display the Chinese characters correctly, you have to use “native2ascii” tool to convert the Chinese characters into Unicode characters.

3. Bean configuration file

Include the properties file into the bean configuration file. Both “messages_en_US.properties” and “messages_zh_CN.properties” are consider one file in Spring, you just need to include the file name once, and Spring will find the correct locale automatically.


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<bean id="messageSource"
		class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename">
			<value>locale\customer\messages</value>
		</property>
	</bean>

</beans>

P.S Assume both files are located at “resources\locale\customer\” folder.

4. Run it


package com.mkyong.common;

import java.util.Locale;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
	public static void main(String[] args) {
		
		ApplicationContext context 
			= new ClassPathXmlApplicationContext("locale.xml");

		String name = context.getMessage("customer.name", 
				new Object[] { 28,"http://www.mkyong.com" }, Locale.US);

		System.out.println("Customer name (English) : " + name);

		String namechinese = context.getMessage("customer.name", 
				new Object[] {28, "http://www.mkyong.com" }, 
                                        Locale.SIMPLIFIED_CHINESE);

		System.out.println("Customer name (Chinese) : " + namechinese);

	}
}

Output

output
Explanation

1. In context.getMessage(), the second argument is message parameters, you have to pass it as object array. You can just pass a null if no parameter values available.


	context.getMessage("customer.name",null, Locale.US);

2. The Locale.US will retrieve the messages from ‘messages_en_US.properties‘, while Locale.SIMPLIFIED_CHINESE will retrieve the messages from ‘messages_zh_CN.properties‘.

More …
Read this article to know how to access the MessageSource inside a bean.

Download Source Code

About the Author

author image
mkyong
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider make a donation to these charities.

Comments

Leave a Reply

avatar
newest oldest most voted
Emre Türki?
Guest
Emre Türki?

You forgot “customer” package under “locale” man, in the directory structure. just a heads up. and thanks for these great tutorials. keep up the good work

Sumit
Guest
Sumit

instead of property files like messages.properties, i want to load the translations from a web service. Can we achieve that?

Guest
Guest
Guest

But eclipse helios can’t display the Chinese customer name, it displays like ???

Ahmed
Guest
Ahmed

Thanks a lot. you saved my day.

trackback
Issues with Spring’s ResourceBundleMessageSource « Amit's Tech Blog

[…] resolve text messages from properties file, based on the selected locales. Follow this link for an introductory example on how to do […]

Gaston
Guest
Gaston
Hi, I’m trying to configure a maven webapp using Spring 3 and ResourceBundleMessageSource in an Ubuntu 32 bits OS. I’m having the following error: javax.servlet.ServletException: javax.servlet.jsp.JspTagException: No message found under code ‘welcome’ for locale ‘en_US’. I understand the error message, but double checked the war file and the properties files are in the expected folder (resources) and it contains the “missing” tag. After running out of ideas I found this post and to my concern I see I have everything in place. I thought I may have anything missing so I downloaded your source and built… and it’s not working.… Read more »
Gaston
Guest
Gaston

Never mind, writing this made me go through all the config again – Problem was that in windows you configure your paths with backslashes (\) while in Ubuntu you need to use slashes (/). I have your example working now, so I’ll go through my code

Thanks!

VIJAY
Guest
VIJAY

Thanks dude.. :-)

Piyush Upadhyay
Guest
Piyush Upadhyay

You are here got u…

Lukas
Guest
Lukas

Hello i have got question what i must doing if my properties file isnt locale in war file ??
When i have got resouce bundle file (.properties) store on hard drive ??

JC
Guest
JC

How can I use the messages defined in the resource bundle in a JSP file? What tag should I use? fmt:message or spring:message? How to pass the arguments?

Rahul SIngh
Guest
Rahul SIngh
Hi I m using below code for resolving text messages, but in out put i m not getting all the index values.Please let me where i m doing wrong. package ResolvindTextMessages; import java.util.Locale; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * * @author Jasvinder */ public class MainClass { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("ResolvindtextMessages/newXMLDocument.xml"); Locale locale = Locale.US; String tesst1 = ac.getMessage("course",new Object[]{24},locale); System.out.println("SEE THIS"+" "+tesst1 ); } } package ResolvindTextMessages; import java.util.Locale; import org.springframework.context.MessageSourceResolvable; import org.springframework.context.NoSuchMessageException; import org.springframework.context.support.ResourceBundleMessageSource.*; public interface MessageSource { String getMessage(MessageSourceResolvable resolvable,Locale locale) throws NoSuchMessageException; String getMessage(String code,Object[] args,Locale locale) throws NoSuchMessageException;… Read more »
trackback
Spring Tutorials

[…] Resource bundle with ResourceBundleMessageSource example ResourceBundleMessageSource is the most common class to resolve text messages for different locales. […]

trackback
Spring – How to access MessageSource in bean (MessageSourceAware) | Spring

[…] on March 19, 2010 at 2:38 am by mkyong In last tutorial, you are able to get the MessageSource via ApplicationContext. But for a bean to get the MessageSource, you have to implement the MessageSourceAware […]

trackback
where can i get the latest jrock news? | Ticket Tips and News

[…] Spring – resource bundle with ResourceBundleMessageSource example … […]