Spring – 15 – MessageSource

Merhaba Arkadaslar
Bu bolumde Spring’te Internationalization (il18n) destegini saglayan MessageSource arabirimini  ve MessageSourceAware arabirimini inceleyecegiz.
MessageSource arabirimi org.springframework.context paketinde yer alir

package org.springframework.context;
public interface MessageSource {
... 
...
}

ApplicationContext arabirimi MessageSource arabirimin kalitmaktadir (extends)

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
...
}

Gercek bir uygulama cogu zaman farkli dil destegi ihtiyaci olacaktir.
Bunu saglayabilmek icin ilgili dil dosyalarinin hazirlanmasi ve Spring tarafindan bu dosyalarin kullanilmasi yeterli olacaktir.

Spring , MessageSource arabirimi icin implementation olarak su siniflari saglar;

  • ResourceBundleMessageSource
  • ReloadableResourceBundleMessageSource
  • StaticMessageSource

StaticMessageSource un kullanilmasi pek onerilmez. ResourceBundleMessageSource ile ReloadableResourceBundleMessageSource ayni sekilde calisir ,ReloadableResourceBundleMessageSource source file/kaynak dosyasi icin reloading islemi zamanlanmis/scheduled olarak yapilabilir.

Ornegimizde ResourceBundleMessageSource sinifini kullanalalim.

ResourceBundleMessageSource

Oncelikle projemizde yeni bir “Source Folder” olusturalim.  Tabi bunu yapmak zorunda degiliz dilersek “src”  dizinini de kullanabiliriz. Message dosyalarini farkli bir “Source Folder” da kullanmak istersek ;

Projemizde sag tiklayip New –> Source Folder

source folder

Sonraki adim olarak yeni properties dosyalari olusturacagiz. Burada onemli nokta properties dosyalarimin isimlerinin sonunda Locale bilgisi yer almalidir. Ornegin en_US , tr_TR gibi ;
properties dosyalarini resources/locale dizininde olusturduk.

source folder2

springMessages_en_US.properties

order.information= Order Id : {0} , Order Price : {1} {2}

springMessages_tr_TR.properties

order.information= Ürün Id : {0} , Ürün fiyatı : {1} {2}

Bean tanimi icin XML konfigurasyon dosyamizi olusturalim ;

19.messageSource.xml

org.springframework.context.support.ResourceBundleMessageSource tipinde bir bean tanimini olusturuyoruz.

  • id messageSource olmalidir. Aksi durumda hata aliriz ;
    org.springframework.context.NoSuchMessageException
  • basename property degeri ile kullanilacak message properties dosyalarinin bilgisini veriyoruz. Dizin olarak resource/local dizininde oldugu icin ve resource dizini Source Folder oldugu icin direkt locale dizini ile baslayabiliriz.
  • defaultEncoding property bilgisi ile encoding bilgisi veriyoruz. Farkli dilleri kullandigimizda UTF-8 kullanmamiz uygun olacaktir.
...
<bean id="messageSource"
	class="org.springframework.context.support.ResourceBundleMessageSource">
	<property name="basename" value="locale/springMessages" />
	<property name="defaultEncoding" value="UTF-8" />
</bean>
...

ResourceBundleMessageSourceTest.java

package _19.messageSource.test;

import java.util.Locale;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ResourceBundleMessageSourceTest {

	public static void main(String[] args) {

		ApplicationContext ctx = new ClassPathXmlApplicationContext("19.messageSource.xml");

		String orderInformationUS = ctx.getMessage("order.information", 
				new Object[]{"1000", "100", "$"}, Locale.US);

		String orderInformationTR = ctx.getMessage("order.information", 
				new Object[]{"1000", "100", "TL"}, new Locale("tr", "TR"));
                String noMessage = ctx.getMessage("customer",null, "guest" ,Locale.UK );

		System.out.println(orderInformationUS);
		System.out.println(orderInformationTR);
                System.out.println(noMessage);
		((ClassPathXmlApplicationContext) ctx).close();
	}
}

ApplicationContext arabirimi MessageSource arabirimini kalitmaktadir.

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver {...
}

getMessage metotlarini inceleyecek olursak overloaded versiyonlari bulunmaktadir.

String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException;
String getMessage(String code, Object[] args, String defaultMessage, Locale locale);
  • order.information bilgisi properties dosyalarimizdaki mesajimizin ismine karsilik gelmektedir.
  • new Object[] array’i ile mesajimiza parametre gecebiliriz. {0} , {1} , {2} … olarak tanimladigimiz alanlara parametre geciyoruz.
  • getMessage , Ucuncu parametre olarak Locale tipinde degisken almaktadir. Locale.US verdigimizde springMessages_en_US.properties dosyasi Locale(“tr”,”TR”) bilgisini verdigimizde springMessages_tr_TR.properties dosyasi kullanilacaktir.
  • getMessage metodunun overloaded versiyonunda String defaultMessage parametresi yer almaktadir. Boylelikle eger tanimli bir mesaj yoksa varsayilan olarak bir mesaj kullanabiliriz.

Ornegimizi calistirdigimizda ;

Order Id : 1000 , Order Price : 100 $
Ürün Id : 1000 , Ürün fiyatı : 100 TL
guest

MessageSourceAware

MessageSourceAware arabirimi setMessageSource metoduna sahiptir. MessageSourceAware arabirimini uygulayan bir sinif icin otomatik olarak setMessageSource setter metodu calisir. Boylelikle MessageSource icin otomatik olarak inject islemi gerceklesecektir.

MessageService.java

package _20.messageSourceAware.service;

import org.springframework.context.MessageSource;
import org.springframework.context.MessageSourceAware;

public class MessageService implements MessageSourceAware {

	private MessageSource messageSource;

	@Override
	public void setMessageSource(MessageSource messageSource) {
		this.messageSource = messageSource;
	}

	public MessageSource getMessageSource() {
		return messageSource;
	}

}

20.messageSourceAware.xml

<bean id="messageService" class="_20.messageSourceAware.service.MessageService" />

<bean id="messageSource"
	class="org.springframework.context.support.ResourceBundleMessageSource">
	<property name="basename" value="locale/springMessages" />
	<property name="defaultEncoding" value="UTF-8" />
</bean>

MessageSourceAwareTest.java

package _20.messageSourceAware.test;

import java.util.Locale;

import org.springframework.context.ApplicationContext;
import org.springframework.context.MessageSource;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import _20.messageSourceAware.service.MessageService;

public class MessageSourceAwareTest {

	public static void main(String[] args) {

		ApplicationContext ctx = new ClassPathXmlApplicationContext("20.messageSourceAware.xml");

		MessageService messageService = ctx.getBean("messageService", MessageService.class);
		MessageSource messageSource = messageService.getMessageSource();

		String messageEN = messageSource.getMessage("order.information", new Object[] { "1000", "100", "$" },
				Locale.US);
		String messageTR = messageSource.getMessage("order.information", new Object[] { "1000", "100", "TL" },
				new Locale("tr", "TR"));

		System.out.println(messageEN);
		System.out.println(messageTR);
		
		((ClassPathXmlApplicationContext) ctx).close();

	}

}

Ornegimizi calistirdigimizda ;

Order Id : 1000 , Order Price : 100 $
Ürün Id : 1000 , Ürün fiyatı : 100 TL

Github kaynak dosyalar/ source folder
leventerguder/injavawetrust-spring-tutorial

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *