gettext kullanan yazılımların kullanımı
Önceki gettext İleti Katalogları Sonraki
gettext kullanan yazılımların kullanımı
Geçtiğimiz bölümde yazılımcının yazılımının iletilerini uluslararasılaştırmak için ne yapabileceği açıklandı. Ancak, sonuçta görmek istediği iletiyi kullanıcı seçecektir. Kullanıcı onları anlayabilmelidir.
POSIX yerel modeli, kullanılan yereli seçmede LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC ve LC_TIME ortam değişkenlerini kullanır. Evvelce açıklandığı gibi gettext ayrıca bunları da kullanır.
Bunun nasıl olduğunu anlayabilmek için bir ileti kataloğunun yerini bulmakta kullanılan dosya isminin hangi bileşenlerden oluştuğuna bakalım:
dizin_ismi/yerel_dil/LC_kategori/alan_ismi.mo
dizin_ismi için öntanımlı değer sisteme özeldir. C kütüphanesi yapılandırılırken --prefix seçeneği ile belirtilen dizine göre hesaplanır. --prefix değeri normalde /usr ya da / dizinidir. dizin_ismi ise genellikle:
/usr/share/locale
dizinidir. İleti kataloglarını içeren .mo dosyaları sistemden bağımsız dosyalar olduklarından /usr/share öneki tercih edilmiştir. bindtextdomain işlevinin ikinci parametresinde sadece dizin_ismi ile belirtilen parça verilir. İşlev dosya yolunun geri kalanını aşağıda açıklandığı gibi oluşturur.
kategori yerel kategorisinin ismidir. gettext ve dgettext için bu daima LC_MESSAGES'dır. dcgettext işlevinde ise bu değer üçünci argümanda belirtilir. Ancak evvelce da açıklandığı gibi LC_MESSAGES kategorsinden başka bir kategori belirtmekten kaçınılmalıdır.
yerel_dil elemanı kategoriyi içeren dildir. Bu değer setlocale işlevindeki gibi kullanıcının dil seçimine bağlı olarak belirlenir. Bazı ortam değişkenlerine belli bir öncelik sırasına göre bakarak bu değer belirlenir. Bu sıra şöyledir:
    LANGUAGE
    LC_ALL
    LC_xxx
    LANG
Çok bildik görünüyor. Bu sıralama LANGUAGE ortam değişkeni dışında setlocale işlevinin kullandığı sıralama ile aynıdır. Peki ama neden LANGUAGE değişkenine bakıyoruz?
Bunun sebebi bu değişkenlerin değerlerinden elde edilecek sözdiziminin setlocale işlevinden farklı olmasıdır. Eğer LC_ALL değişkenine aşağıdaki genişletilmiş sözdizimine uygun bir değer atarsak, setlocale işlevi bu değeri asla kullanamayacaktır. Bir ek değişkenle bu sorun aşıldığı gibi, bu değişken sayesinde kullanıcının ileti dilini yerel ayarlarından bağımsız olarak belirleyebilme imkanı vardır.
LC_xxx değişkenlerinin değerleri sadece bir yerele ait belirtimi içerebilirken LANGUAGE değişkeninin değerinde çok sayıda dil iki nokta imleriyle ayrılarak belirtilebilir. Böylece kullanıcı tercih ettiği dilleri bu değişken sayesinde bir öncelik sırasıyla belirtebilir.
Dosya ismini oluşturan son parça olan alan_ismi ya textdomain işlevi ile etkinleştirilen ya da dgettext veya dcgettext işlevinde ilk parametre olarak blirtilen yazılım kodunun alan ismidir; başka bir deyişle yazılımcının pakete verdiği isimdir. Örneğin GNU C kütüphanesi için alan ismi libc'dir.
Yazılımcının bu işlemi nasıl yapacağını gösteren bir örnek kod parçası:
{
  setlocale (LC_ALL, "");
  textdomain ("test-package");
  bindtextdomain ("test-package", "/usr/local/share/locale");
  puts (gettext ("Hello, world!"));
}
Yazılım ilk çalıştırıldığında öntanımlı alan messages, öntanımlı yerel "C"dir. setlocale çağrısı yereli kullanıcının atadığı ortam değişkenlerine bağlı olarak değiştirir. Yukarıda bahsedildiği gibi ileti kataloglarının yerini bulmak için gettext işlevleri LC_MESSAGES kategorisini, karakter kümesi dönüşümü için LC_CTYPE kategorisini kullanıyordu. setlocale çağrısı ile bunlar kullanıcının seçimlerine göre belirlenmiş oluyor. textdomain çağrısı ile test-package alan isimli ileti kataloğunun kullanılacağını, bindtextdomain çağrısı ile de bu kataloğun bulunacağı yeri /usr/local/share/locale olarak belirtmiş oluyoruz.
Kullanıcı LANGUAGE ortam değişkenine tr değerini atarsa gettext işlevi
/usr/local/share/locale/tr/LC_MESSAGES/test-package.mo
iletiği kataloğunu kullanacaktır.
Bu örnekte LANGUAGE ortam değişkenine tr değerini atadığımızı varsaydık. Eğer kullanıcı bunun yerine değeri tr_TR.UTF-8 olan LC_ALL ortam değişkenini kullanmak isteseydi ne olacaktı? Yukarıda bu gibi durumlara pek sık rastlanmadığından bahsetmiştik. Örneğin, kullanıcının tercih ettiği dil olarak son çare resmi dil değilse kullanıcı kendi lehçesini tercih edebilir.
gettext bu gibi duramlara da hazırlıklıdır. İşlevler bu değişkenin değerinin biçimini tanır. Değeri parçalarına ayırarak içinden kendi kullanacağı değeri alır. Bu işlem şüphesiz bir önkabule dayanır. Ortam değişkeninin değerini oluşturan biçim az ya da çok standarttır. X/Open belirtimi şöyledir:
dil[_ülke[.karakterkümesi]][@değiştirici]
Yerel ismi şu sıraya göre ayıklanır:
  1. karakterkümesi
  2. normalleştirilmiş karakterkümesi
  3. ülke
  4. değiştirici
dil alanı bilinen sebeplerle asla kaldırılmayacaktır.
Burada yeni olan normalleştirilmiş karakterkümesi girdisidir. Çoğu kişi standart haline gelmiş isimleri yanlış hatırlar ve örneğin ISO-8859-9 yerine iso8859-9, iso_8859-9, 88599, 8859-9 gibi değerler yazabilirler. normalleştirilmiş karakterkümesi değeri şu kurallar izlenerek oluşturulur:
  1. Sayılar ve harfler dışında tüm karakterler kaldırılır.
  2. Harflerin tamamı küçük harfe dönüştürülür.
  3. Rakamlar "iso" dizgesi ile öncelenmemişse öncelenir.
Örneğimizdeki isim iso88599 olarak normalleştirilir. Böylece kullanıcıya yerel ismini belirtirken daha fazla serbestlik sağlanmış olur.
Ancak bu kadar genişletilmiş işlevsellik bile aynı dili belirtirken kullanılabilen farklı isimler için bir çözüm sağlamaz (örneğin, tr ve turkish). Hem yerel gerçeklemesi hem de gettext bu gibi durumlarda yardımseverdir.
/usr/share/locale/locale.alias dosyası (C kütüphanesini derlerken /usr yerine ne belirttiyseniz, /usr yerine onu yazın) dil isimleriyle yerel isimlerini eşleştiren bir liste içerir. Sistem yöneticisi bu listeye yeni girdiler eklemekte özgürdür. Ortam değişkenleri ile seçilmiş isim bu listedekilerle karşılaştırılır. Bir eşleşme bulunursa ikinci sütundaki değer kullanılır.
Önceki Üst Ana Başlık Sonraki
GUI Yazılımlarının Sorunları Başlangıç gettext için Yardımcı Uygulamalar
Bir Linux Kitaplığı Sayfası