Localization In Spring Framework

Merhabalar arkadaşlar.

Bu yazıda sizlere Spring Framework içerisinde yerelleştirme (Internalization) konusunu örnekleyeceğim.

Bu yazıdaki kodlar aklıma geldikçe üzerine eklemeler yaparak halen geliştirmekte olduğum MemberRestAPI projesinde yer almaktadır. Kodlara şuaradan ulaşabilirsiniz: https://github.com/ilkgunel/MemberRestAPIProject

Yerelleştirme konusu basit hali ile kullanıcılara bir takım mesajların kullanıcıların dillerinde gösterilmesi mevzusudur. Biz de yazımız içerisinde Rest API üzerinde gelen dil parametresine göre mesaj dönümünü göreceğiz.

ApplicationCofig.java

package com.ilkaygunel.application;

import java.util.Locale;

import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.stereotype.Component;

@Component
public class ApplicationConfig {

	private static ResourceBundleMessageSource messageSourceInstance = null;

	public String getValueOfProperty(String propertyName, String localeValue) {

		if (messageSourceInstance == null) {
			messageSourceInstance = new ResourceBundleMessageSource();
			messageSourceInstance.setBasenames("messageTexts");
			messageSourceInstance.setDefaultEncoding("UTF-8");
		}

		return messageSourceInstance.getMessage(propertyName, null, new Locale(localeValue));

	}
}

ApplicationConfig sınıfımız gelen dil parametresine ilgili mesajı dönecek olan metodu barındıran sınıftır.

  • Sınıfımız diğer sınıflaramız içerisinde çağırılıp kullanbilmek için ilk olarak @Componenet notasyonu ile işaretlendi.

  • Sınıfımız içerisinde her mesaj getiriminde yeniden oluşturulmasın, bir tane oluşturulup bellekte kalsın diyerek static bir ResourceBundleMessageSource nesnesi tanımlı.

  • getValueOfProperty(…) metodu kendisine verilen anahtar bilgisine ait mesajı kendisine gelen dil parametresine göre dönecek metottur. İçerisinde eğer messageSourceInstance o an için oluşturulmamış durumda ise ResourceBundleMessageSource sınıfından bir nesne oluşturuyor. Bu nesneye setBasenames() metodu ile sonu en ya da tr olarak biten dosyalardaki prefix kelimeyi atıyoruz. Bizim örneğimizde Türkçe ve İngilizce mesajları tutan dosyalarımızın isimleri messageTexts_tr.properties ve messageTexts_en.properties şeklinde olduğu için setBaseNames metoduna messageTexts değerini veriyoruz. Encoding değerini de atadıktan sonra nesnemiz hazır hale geliyor.

  • Son adımda ResourceBundleMessageSource sınıfındaki getMessage(…) metoduna ilgili anahtar kelimeyi (propertyName) ve dil parametresini geçirerek mesajı bize döndürüyor.

MemberSaveService.java

Şimdi MemberSaveService sınıfı içerisindeki addOneMember(…) metodu ile yerelleştirme işlemini örneklemiş olacağız. Metot şu şekilde:

public MemberOperationPojo addOneMember(Member member, String role, Logger LOGGER) {
        MemberOperationPojo memberOperationPojo = new MemberOperationPojo();
        try {
            LOGGER.log(Level.INFO, applicationConfig.getValueOfProperty(role + "_memberAddingMethod", member.getMemberLanguageCode()));
            member.setPassword(getHashedPassword(member.getPassword()));
            member.setEnabled(false);
            addMemberRolesObject(role, member);
            addActivationToken(member);
            memberRepository.save(member);
            mailUtil.sendActivationMail(member.getEmail(), member.getActivationToken());
            memberOperationPojo.setResult(applicationConfig.getValueOfProperty(role + "_memberAddingSuccessfull",member.getMemberLanguageCode()));

            List<Member> memberList = new ArrayList<>();
            memberList.add(member);

            memberOperationPojo.setMemberList(memberList);
            LOGGER.log(Level.INFO, applicationConfig.getValueOfProperty(role + "_memberAddingSuccessfull",member.getMemberLanguageCode()) + member);
        } catch (Exception e) {
            LOGGER.log(Level.SEVERE, applicationConfig.getValueOfProperty(role + "_memberAddingFaled",member.getMemberLanguageCode()) + e.getMessage());
            memberOperationPojo.setErrorCode(ErrorCodes.ERROR_10.getErrorCode());
            memberOperationPojo.setResult(e.getMessage());
        }
        return memberOperationPojo;
    }
  • addOneMember(…) metodumuz içerisinde ilk olarak loglama işlemine dikkat edelim.INFO seviyesindeki loglama sırasında neyin loglanacağı applicationConfig.getValueOfProperty(role + “_memberAddingMethod”, member.getMemberLanguageCode()) ifadesi ile az önce ApplicationConfig sınıfı içerisinde gördüğümüz getValueOfProperty(…) metodu ile belirleniyor. Anahtar olarak role + “_memberAddingMethod” ifadesi geçiriliyor. role ifadesi burada ROLE_USER ya da ROLE_ADMIN olacaktır. member.getMemberLanguageCode() ifadesi ile de gelen dil parametresini geçiriyoruz.

  • memberOperationPojo.setResult(…) ifadesi ile de dönülecek API response’unda yer alacak mesaj bilgisi gelen dile göre çekilip koyulacak.

messageTexts_en.properties

İngilizce karşılıkları tutan dosyada bu yazı için kullanacağımız metin şu şekilde:

ROLE_USER_memberAddingMethod=One user member adding method is running!

messageTexts_tr.properties

Türkçe karşılıkları tutan dosyada da anahtara karşılık gelen değer şöyle:

ROLE_USER_memberAddingMethod=Tekil kullanıcı üye ekleme metodu çalışıyor!

Ekran Görüntüleri memberLanguageCode parametresini içeren JSON datasını ilgili adres’e POST ediyorum.

Ben memberLanguageCode olarak tr gönderdiğim için dönen JSON datasının result alanında yukarıda gördüğümüz Türkçe mesaj metni dönüyor.

Şimdi memberLanguageCode olarak en değerini gönderiyorum:

Dönen JSON datasının result alanında İngilizce metin dönüyor:

Şimdi bir de log dosyalarımıza bakalım.

Log dosyamızda 3:39:54’de atılan log Türkçe metin içerirken 3:44:57’de atılan log İngilizce metin içermektedir.

Bu yazıda anlatacaklarım bu kadar arkadaşlar. Başka bir yazıda görüşmek üzere.

Görüşene kadar sağlıcakla kalın.

Selam ve Sevgilerimle