16 Mart 2014 Pazar

Locale İşlemleri

Locale ile ilgili notlarım aşağıda.

KabukTan Locale'i Ayarlamak
bash'in başında aşağıdaki satırları yazmak gerek.

LANG=C
export LANG

JVM ve Locale
Türkçe çalıştırmak için aşağıdaki gibi yapılabilir.
java -Duser.country = TR -Duser.language = tr 

Locale ve Stream
C++
facet nedir?
C++ dilinde locale ile ilgili formatlama bilgileri facet temel sınıfından türeyen hiyerarşide tutulur. facet sınıfı kopyalanamaz. C++ standardında bir çok facet sınıfı hazır geliyor. Örneğin ctype sınıfının std::locale::facet sınıfında türediği burada görülebilir.

Aşağıdaki facet şeklini de buradan aldım ve kalıtım görülebilir.


facet'ten türetme
Kendi facet sınıfımızı hazır gelen sınıflardan kalıtarak oluşturabiliriz. Örnekte rakamlar hariç diğer tüm karakterleri boşluk (space) olarak okuyan bir ctype facet var.

struct digits_only: std::ctype<char> {
digits_only
(): std::ctype<char>(get_table()) {}

static std::ctype_base::mask const* get_table() {
static std::vector<std::ctype_base::mask>
rc
(std::ctype<char>::table_size,std::ctype_base::space);

std
::fill(&rc['0'], &rc['9'], std::ctype_base::digit);
return &rc[0];
}
};

locale nedir?
Bir locale bir çok facet'ten oluşmaktadır. Aşağıdaki şekili buradan aldım ve bunu gösteriyor.

Locale Sınıfına Facet Nasıl Yerleştirilir
En kolay yöntemi locale sınıfının constructor metoduna facet nesnesini parametre olarak verilmesi. Örnek: Facet sınıfının desctructor metodu protected olduğu için heap'te yaratılması gerekir.
std::locale numbers(std::locale(), new digits_only);
 
Clasic Locale ve Facet Kullanımı
Örnek:

std::stringstream ss;
local_time_facet* output_facet = new local_time_facet();
ss.imbue(std::locale(std::locale::classic(), output_facet));
output_facet->format("%Y-%m-%dT%H:%M:%S %Q");
ss << ldt;
Stream'in Kendi Locale Nesnesi ve Facet Kullanımı
getloc() metodu ile stream'in locale nesnesi alınabilir.
Örnek:

Locale ve Ülke Hakkında Bilgi
C#
System.Globalization.CultureInfo sınıfı
Bu sınıfı kullanarak ülke hakkında bir çok bilgiyi alabilmek mümkün. Örnek:

System.Globalization.CultureInfo c = new System.Globalization.CultureInfo("en-GB");

  var a = c.DisplayName;
  var b = c.EnglishName;
  var d = c.LCID;
  var e = c.Name;
  var f = c.NativeName;
  var g = c.TextInfo;
  var h = c.ThreeLetterISOLanguageName;
  var i = c.ThreeLetterWindowsLanguageName;
  var j = c.TwoLetterISOLanguageName;

System.Globalization.RegionInfo sınıfı
Bu sınıf ile ülke hakkında diğer bilgiler alınabilir. Örnek:


Locale İle Ayraçlar
Her ülkenin tarih, para, zaman için belirlediği ayraçlar var. Nesneler toString() veya benzeri bir metodları çağrılınca, otomatik olarak seçili locale'i kullanarak string oluştururlar.

Ayraçlara Göre Formatlama Yapan Metodlar
Win32
GetDateFormat metodu
Örnek:
SYSTEMTIME create_local_time;

TCHAR time
[128] = {0};
const TCHAR *format = _T("yyyy/MM/dd");
GetLocalTime(&create_local_time);
GetDateFormat( LOCALE_USER_DEFAULT, 0, &create_local_time, format, time, 128);
Locale ve String Karşılaştırma
Bazı ülkelerde farklı karakterler aynı gibi algılanıyor. Örneğin Almanca'da Hauptstrasse ve Hauptstraße aynı kelimeler. Bu kelimeleri farklı işlemek istersek StringComparer sınıfını kullanarak aşağıdaki gibi yapabiliriz.


InvariantCulture 
Eğer bizim verdiğimiz ayraçlar kullanılsın istiyorsak InvariantCulture kullanılabilir.
C#
Örnek:
Örnekte DateTime nesnesi 'M/d/yyyy' verilse bile 06-26-2013 şeklinde bir string oluşturuyor. Çünkü ayraçları sistem ayarlarından alıyor. InvariantCulture ile bizim verdiğimiz ayraçları kullanmasını sağlıyoruz.
Console.WriteLine(DateTime.Now.ToString("M/d/yyyy", CultureInfo.InvariantCulture));

Hiç yorum yok:

Yorum Gönder