Thursday, January 21, 2016

Java'da Yerelleştirme

Java'da karakter katarı, zaman ve para birimleri ile çalışırken yerelleştirmeye ihtiyaç duyuyoruz. Örneğin "izmir" karakter katarını ekrana büyük harflerle yazmak istersek aşağıdaki kod "IZMIR" olarak yazacaktır: 
String city= "izmir";
System.out.println(city.toUpperCase());
Neyse ki String sınıfını yazanlar toUpperCase metodunun farklı diller için çalışan versiyonunu kodlamışlar:
String city= "izmir";
Locale tr= new Locale("tr","TR");
System.out.println(city.toUpperCase(tr));
Şimdi artık uygulamayı çalıştırdığımızda, ekranda olması gerektiği gibi "İZMİR" görüyoruz. toUpperCase metoduna parametre olarak Locale sınıfından yarattığımız ve Türkçe'yi ("tr") ve Türkiye'yi ("TR") tanımlayan bir nesne veriyoruz. 
Yerelleştirmeye zaman ile çalışırken de ihtiyaç duyuyoruz:
ZonedDateTime birthDate = ZonedDateTime.now();
Locale tr = new Locale("tr", "TR");
DateTimeFormatter dtf = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withLocale(tr);
System.out.println(dtf.format(birthDate));
Yerelleştirmeye ihtiyaç duyduğumuz diğer bir alan para birimleri:
double money= 12_345.67;
Locale tr= new Locale("tr","TR");
DecimalFormat nf= (DecimalFormat) DecimalFormat.getCurrencyInstance(tr);
DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(tr);
dfs.setCurrencySymbol("\u20BA");
nf.setDecimalFormatSymbols(dfs);
System.out.println(nf.format(money));
Bu uygulamayı çalıştırdığımızda ekranda aşağıdaki çıktıyı göreceğiz:
12.345,67 ₺
Ekranda kullanıcıya gösterdiğimiz iletilerin de yerelleştirmesi gerekir. Örneğin, ekrana rapor üreten bir kodun, rapor üretim tarihini içeren iletisini, yerelleştirmeye çalışalım. Bunun için öncelikle, yerelleştirme desteği vermek istediğimiz her dil için bir metin dosyası oluşturuyoruz:
messages_tr.properties:
label.generate.time=Bu rapor {0} tarihinde üretilmiştir.
messages_en.properties:
label.generate.time=This report is generated at {0}.
Dosya adı iki parçadan oluşuyor: temel ad (örneğimizde messages) ve yerelleştirmek istediğimiz dilin ISO2 standardındaki kodu (tr ya da en gibi). Bu iki parça arasına alt çizgi (_) yerleştiriyoruz. Dosyanın uzantısını ise properties olarak veriyoruz. Dosyanın içeriği ise anahtar ve değer ikilisinden oluşuyor. Anahtar ile değer arasına eşitlik (=) sembolü atıyoruz. Anahtar (örneğimizde "label.generate.time") tüm yerelleştirme dosyalarında aynı olmalı, değer kısmı ise yerelleştirdiğimiz dile göre bir dosyadan diğerine değişecektir. Kodda ise bir dil dosyasından diğerine değişmeyen anahtar kelimeyi kullanıyoruz:
String BUNDLE_BASENAME = "messages";
Locale tr_TR = new Locale("tr", "TR");
ResourceBundle bundle = ResourceBundle.getBundle(BUNDLE_BASENAME, locale);
DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, locale);
Date now = new Date();
MessageFormat formatter = new MessageFormat(bundle.getString("label.generate.time"), locale);
System.out.println(formatter.format(new Object[] { df.format(now) }));
Değer kısmı, örneğimizde olduğu gibi parametrik olabilir. Parametreleri kıvırcık parantez  ({}) içinde parametre numarası vererek tanımlıyoruz: {0}, {1} gibi.



No comments:

Post a Comment