Aralık 03 2008
Struts 2 Internalization ( i18n )
Etiketler : internalization, j2ee, java, JSP, Struts 2, xml
Yaptığımız projelerde en çok başımızı ağrıtan yerlerden biride çoklu dil desteği özelliğini geliştirmektir. Struts 2 de, Internalization(i18n) işlemini yazılımcı açısından kolaylaştıran bir yapı sunmuştur. Bu yazımda sizlere struts 2 de internalization işleminin nasıl yapıldığından bahsedeceğim.
Struts 2 projelerinde internalization işlemini gerçekleştirmek için öncelikle src/struts.properties dosyamızda “struts.custom.i18n.resources” değerini “i18n” olarak belirtmemiz gerekmektedir. struts.properties dosyasının içeriği aşağıdaki gibi olmalıdır;
struts.ui.theme=simple struts.custom.i18n.resources=i18n struts.i18n.encoding=UTF-8 struts.action.extension=action
Daha sonra Login.java mızın bulunduğu dizin olan src/net/gokhansabir/login dizininin altına dil dosyalarımızı yaratalım. Ben sadece İngilizce ve Türkçe için yapıyorum.
Türkçe dil dosyamızı Login_tr.properties olarak yaratıyoruz. Dosya içeriğide aşağıdaki gibi olmalıdır;
gks.login.form.username=Kullan\u0131c\u0131 Ad\u0131 gks.login.form.password=\u015eifre gks.login.form.login=G\u00f6nder gks.success.message=Ba\u015far\u0131l\u0131
Türkçe karakterlerin yerine kodlarını yazıyoruz. Yukarda gördüğünüz gks.login.form.username değişkeni, bizim Login.jsp’ de “Kullanıcı Adı” yazısını ekranda göstermek için kullandığımız s:text struts 2 tagının name özelliğine verdiğimiz değerdir. Şifre, gönder butonu ve başarılı yazısı içinde aynısı geçerlidir. WebContent/jsp/login/ dizini altında yer alan Login.jsp nin içeriğide aşağıdaki gibi olmalıdır;
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Sign On</title>
</head>
<body>
<s:form action="Login_showLogin" >
<s:fielderror />
<s:actionerror/>
<table>
<tr>
<td><s:text name="gks.login.form.username" /> </td>
<td><s:textfield name="username" /></td>
</tr>
<tr>
<td><s:text name="gks.login.form.password" /></td>
<td><s:password name="password"/></td>
</tr>
<tr>
<td colspan="2">
<s:submit key="gks.login.form.login" action="Login_doLogin" />
</td>
</tr>
</table>
</s:form>
</body>
</html>
Kullanıcı adı ve şifre doğru ise karşımıza çıkacak mesajı içeren WebContent/jsp/success/ dizini altındaki Success.jsp içeriğide aşağıdaki gibi olmalıdır;
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Sign On</title>
</head>
<body>
<s:text name="gks.success.message" />
</body>
</html>
JSP’lerimizi verdik hatırlatma olması açısından Login.java içeriğinide tekrar vermek istiyorum;
package net.gokhansabir.login;
import com.opensymphony.xwork2.ActionSupport;
public class Login extends ActionSupport{
public String showLogin() throws Exception {
return net.gokhansabir.util.Constant.SUCCESS;
}
public String showErorr() throws Exception {
return net.gokhansabir.util.Constant.ERROR;
}
public String showEnter() throws Exception {
return net.gokhansabir.util.Constant.LOGGEDIN;
}
public String execute() throws Exception {
return showLogin();
}
public String doLogin(){
if(getUsername().trim().equals("gokhansabir@gmail.com")
&& getPassword().equals("123456"))
return net.gokhansabir.util.Constant.LOGGEDIN;
else{
addActionError("Usename or password doesn't match!!!");
return net.gokhansabir.util.Constant.ERROR;
}
}
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Evet artık işlemimiz bitmek üzere sıra geldi İngilizce dil dosyamızı hazırlamaya. Türkçe dil dosyamız ile aynı dizinde olacak ve aynı değişkenleri kapsayacak tek farkı değişkenlere Türkçe değerler değilde İngilizce değerlerin eşitlenecek olmasıdır.
İngilizce dil dosyamızı Login_en.properties olarak yaratıyoruz. Dosya içeriğide aşağıdaki gibi olmalıdır;
gks.login.form.username=User Name gks.login.form.password=Password gks.login.form.login=Send gks.success.message=success
Evet artık işlemimiz bitti. Şimdi yaptığımız uygulamayı test edebiliriz.Fakat test etmeden önce bişeyi daha söylemem gerekiyor. Oda nasıl test edeceğiniz :))
http://localhost:8080/LoginForm/Login_showLogin.action?request_locale=en
http://localhost:8080/LoginForm/Login_showLogin.action?request_locale=tr
Yukarıdaki adreslerde de göreceğiniz gibi request_locale değişkeni ile sisteme en veya tr değerlerini gönderdiğiniz takdirde sistem seçmiş olduğunuz dil ile işleme devam edecektir. Örneği İndir




struts 1 e çok aşina olamamakla beraber struts 2 sanırım her action için dil dosyası belirtebiliyoruz. Sanırım bu performans açısından özellikle büyük çaplı projelerde iyi bir şey. Ancak her action için .properties oluşturmak gerçekten zahmetli.
yazınızda türkçe karakterlerin farklı yazıldıgını gördüm.
struts.i18n.encoding=UTF-8
struts.properties dosyasında utf-8 bildirinmesi durumda böyle bir sorunla karşilaşılmadıgını düşünuyorum
struts.custom.i18n.resources=globalMessage
olarak belirtikten sonra ana src dizini altıda
globalMessage_tr
ve
globalMessage_en dosyalarını oluşturdum
ve artık ingilizce türkçe destegim vardı
burada karşılaştıgım bir sorunuda belirtmek isterim
globalMessage.properties dosyasına
?request_locale=en dediğim halde erişemiyordum çünkü local jvm tr dil ayarındaydı. bende globalMessage_en diye oluşturmakta buldum çareyi.Dokumantasyonun içnde struts2-showcase-2.1.6.war ilgili örnek mevcut ancak onda böyle bir sorun olmuyor sanırım
struts 2.1.6 kullanıyorum
Teşekkürler..
Paylaşım İçin Teşekkürler