Language Support (Internalization)
- Çok Ülke Desteği (Internalization)
Geliştirdiğimiz bazı uygulamaların birden çok dili desteklemesi gerekebilir. Bu gibi durumlarda uygulama içindeki birçok bölümde revizyonlara gitmemiz gerekir.
Örneğin sayıların yazılış formatında ondalıklı bölümün ve 3 basamaklı bölümlerin yazılışında nokta veya virgül ayarlaması, tarih ayarlaması gibi...Bunların yanında bütün menülerin, mesajların buton vb. grafiksel elemanların içeriklerinin de seçilen dile göre ayarlanması gerekir.
- Kaynak Paketi (Resource Bundle)
Uygulamanın içindeki menü başlıkları, butonlar, mesajlar gibi elemanların birden fazla dile destek vermesini sağlamak için ResourceBundle sınıfı kullanılır. Bu sınıf ile birden fazla dil desteği sağlayabiliriz. Ne yazık ki Javada bu işi yapmak biraz uzun ve uğraştırıcıdır..Uygulamanızın destek vereceği her dil için ResourceBundle sınıfından bir sınıf türetip ilgili dile ait kaynakları bu sınıfn içinde tanımlamamız gerekir. Örneğin Almanya için hazırladğımız kaynak dosyası adı ProgramResources_de_DEolabilir. Burada küçük harflerle yazılı “de” dili, “DE” ise cografi bölgeyi belirtmektedir. Bütün Almanca konuşan ülkeler için tek
bir sınıf hazırlamak istersek ProgramResources_de sınıf kullanırız. En genel sınıf adı; Progr Diyelim ki Almanca dili için genel bir sınıf oluşturduk
(ProgramResources_de) bunun yanında İngilizce için de bir sınıf oluşturduk (ProgramResources_en). Bu sınıfların yanında kendiliğinden seçilecek (default) bir sınıf da oluşturmamız gerekli. Bu sınıf sistem ayarı yukarıdakilerden birine ayarlanmadığında kullanılır. Bu sınıfın adı da ProgramResources olur.
Bütün bu sınıfları oluşturduğunuzda artık uygulamanızın içinde kullanabilirsiniz. Bunu ResourceBundle sınıfının nesnesini oluşturarak yaparız.
ResourceBundlecurrentResources=ResourceBundle.getBundle("ProgramResources", currentLocale); getBundlemetodu o anda sistemde tanımlı bölgesel ayarlara göre aşağıdaki sırada ProgramResources_... dosyalarını yüklemeye çalışır.
ProgramResources_language_country_variant
ProgramResources_language_country
ProgramResources_language
ProgramResources
Bunların başarısız olması durumunda default olarak hazıladığımz ProgramResourcess sınıfını yükler
Örneğin
ProgramResources_de_DEkaynağınız var ve ResourceBundle bunu
yükledi. Bu durumda bile
ProgramResources_deve
ProgramResourcessınıflarını yükler. Bu sınıflar ana sınıflar görevini görür. Eğer bir
kaynak ProgramResources_de_DEiçinde bulunamazsa sırasıyla
ProgramResources_deve
ProgramResourcessınıflarında aranıp bulunandan eklenir.
Kaynakları Bohçaya Doldurmak:
ResourceBundle sınıfları oluşturmak için sınıflarınız bu sınıftan
türemelidir. Her sınıf bir tablo gibi bilgi barındrır. Çoklu dil desteği sağlayacağnız her bir metin için (buton etiketleri, menü elemanları vs.) bir anahtar kelime belirleyip bu kelimeye değer atayarak dil desteğini sağlayabiliriz.
Programınız içinde dil desteğini sağlarken ResourceBundle nesnesinin getString metodu kullanılır.
String hesaplaButonuEtiketi = resources.getString(“hesaplaKey");//hesaplaKey anahtar kelimesine karşılık gelen ilgili dildeki metni yükle.
Bütün kaynaklar bir string olmak zorunda değildir. Bazı durumlarda nesne de olabilirler. Bu durumda
ResourceBundle nesnesinin getObject metodu kullanılır.
Color backgroundColor=(Color)resources.getObject("backgroundColor");
double[] kagitBoyutu = (double[])resources.getObject("kagitBoyutu");
ResourceBundle sınıfından türettiğimiz sınıfın iki abstract metodun üzerine yazmaları gerekir.
Bunlar;
Enumeration getKeys()
Object handleGetObject(Stringkey)
Bir önceki slayttaki getObject ve getString metotları parametre olarak verilen anahtar kelimelerin ilgili dildeki karşılığı olan metni bulmak için handleGetObject metodunu çağırırlar. Bu metoda bizim get.. metotlarına yazdığımız anahtar kelime parametre olarak gönderilir.İngilizce ve Almanca iki bohça sınıfı aşağıdaki gibidir.
public class ProgramResourcesextends ResourceBundle{
public Enumeration getKeys(){
return Collections.enumeration(Arrays.asList(keys));
}
private String[] keys={ "computeButton", "backgroundColor",
"defaultPaperSize" };
//anahtar kelimelerin dizisi
}public class ProgramResources_de extends ProgramResources{
public Object handleGetObject(String key){
if (key.equals("computeButton")) return "Rechnen";
else if (key.equals("backgroundColor")return Color.black;
else if (key.equals("defaultPaperSize")
return new double[] { 210, 297 };
}
}
public class ProgramResources_en_US extends ProgramResources{
public Object handleGetObject(String key){
if (key.equals("computeButton"))return "Compute";
else if (key.equals("backgroundColor")return Color.blue;
else if (key.equals("defaultPaperSize")
return new double[] { 216, 279 };
}
}
Bu şekilde her anahtar kelime için kod yazmak biraz uğraştırıcı olabilir. Bu nedenle Java ile gelen ListResourceBundleve PropertyResourceBundlesınıfı kullanılarak daha kolay sınıflar oluşturulabilir.
ListResourceBundlesınıfı ile bütün kaynakları bir nesne dizisine atayabilirsiniz. Öncelikle programın iskeletini oluşturup daha sonra anahtar kelimeleri ekleyeceğiz.
public class ProgramResources_language_country
extends ListResourceBundle{
public Object[][] getContents() { return contents; }
private static final Object[][] contents ={
// içerik bilgisi buraya gelecek
}
}
Örneğin;
public class ProgramResources_en_US extends ListResourceBundle{
public Object[][] getContents() { return contents; }
private static final Object[][] contents ={
{ "computeButton", "Compute" },
{ "backgroundColor", Color.blue },
{ "defaultPaperSize", new double[] { 216, 279 } }
}}
ListResourceBundle sınıfını kullanmanız durumunda uygulama içinde
getObject() metodu kullanarak anahtar kelimeleri çağırmalısınız.
Bir diğer alternatif yöntem ise bütün özelliklerin string olmasıdurumunda
geçerlidir. PropertyResourceBundleile sadece string den oluşan
anahtar kelimlerle işlem yapmak çok daha kolaydır.
PropertyResourceBundleile bütün String verileri bir properties dosyasına
ekleyip buradan kullanabilirsiniz. Bu dosya daha önce veritabanıiçin
kullanıdığımız dosya ile aynıdır. Buradaki yapının farkı ise dosyanın
isimlendirilmesidir, örneğin üç adet metin dosyası oluşturup isimlerini
aşağıdaki gibi verin:
ProgramStrings.properties
Progra ProgramStrings_de_DE.properties
daha sonra dosyaların içine aynı anahtar kelimeleri farklı değerlerle ekleyin
computeButton=Rechnen
backgroundColor=black
defaultPaperSize=210x297
Özellik dosyalarını kullanmak için yine ResourceBundle nesnesi oluştruruz.
ResourceBundle bundle= ResourceBundle.getBundle("ProgramStrings",
locale);
getBundlemetodu ilgili özellik dosyasını yükleyip PropertyResourceBundlenesnesine çevirir.PropertyResourceBundlesınıfını doğrudan
kullanmayın, getBundle metodu ile kullanmak önerilen biçimdir.
PropertyResourceBundlesınıfı anahtar kelimeleri ayrı bir metin dosyasında tuttuğundan içeriğinin değiştirilmesi kolaydır, bu nedenle oldukça
kullanışlıdır. Diğer taraftan bu yöntem ile sadece metin içerikleri tutabiliriz. Eğer metin haricinde sayı veya nesne tutmamız gerekiyor ise bunları
ListResourceBundle sınıfına ekleyip buradan kullanabiliriz.
GUI’de Çoklu Dil
Çoklu dil desteğini sağlarken bir butona basıldığında butonun
command name özelliğinden alınıyorsa bu durum çoklu dil için
sorun çıkarabilir.
public void actionPerformed(ActionEvent evt)
{
String arg = evt.getActionCommand();
if (arg.equals("Cancel"))
doCancel();
else . . .
}
Yukarıdaki kod yerine aşağıdaki şekilde kullanın.
JButton cancelButton = new JButton("Cancel");
cancelButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
doCancel(); }
});mStrings_en.properties
Metnin olusumu icin Didem Doğan,Ayşenur Demir arkadaslarimiza tesekkur ederiz.
Hiç yorum yok:
Yorum Gönder