Uluslararasılaştırma
3.1.1 Temel Kullanım
'gettext' programlama arabirimi, Sun tarafından 1990 yılında Uniforum'a
gönderilen bir öneriden yola çıkmıştır. Bugün için OpenI18N standardı
tarafından belirlenir. Temel özelliği programların en az değişiklikle
çevrilebilir hale getirilebilmesidir.
Burdaki çağrıları kullanabilmek için öncelikle 'libintl.h' adlı başlık
dosyası include edilir. Bunu gettext çağrılarının kullanıldığı kod
dosyalarında ve gettext ile çevrilen format string'lerini kullanan
printf, sprintf, vb fonksiyonlarının bulunduğu dosyalarda yapmalısınız.
Çeviri sistemin en temel işlevleri; çevrilecek iletilerin bulunduğu
alanı belirlemek, ve iletiye karşılık gelen çeviriyi almaktır. Tüm
programların iletilerinin aynı alanda tutulması, bakım ve yönetim
açısından zor olacağı için bu alan kavramı kullanılır. Çeviri alanı,
-
char *textdomain (const char *domain_name);
fonksiyonu ile belirlenir. domain_name seçilecek alan adını içeren
bir C string'idir. NULL değerini taşıması durumunda seçimi değiştirmeden
o an aktif olan alan adını öğrenebilirsiniz. Alanın dosya sisteminde
hangi dizinden çevirilere bakacağını;
-
char *bindtextdomain (const char *domain_name,
const char *dir_name);
ile belirleyebilirsiniz. Bu işlemler genellikle programın başında
yapılır. Bir örnek:
-
setlocale (LC_ALL, NULL);
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
Burada ilk önce, setlocale çağrısı ile standart C kitaplığının tüm
kategorilerde kullanıcının seçtiği yerelleştirmeyi kullanması sağlanmakta.
Daha sonra ise alana ait dizin seçilmekte ve alan etkinleştirilmektedir.
PACKAGE ve LOCALEDIR makroları, autoconf sistemi tarafından "ornek"
ve "/usr/share/locale" olarak ayarlanmıştır. Bu
durumda bu satırlar çalıştığında Türkçe için /usr/share/locale/tr/LC_MESSAGES/ornek.mo"
adlı dosyadan çeviriler yüklenecek ve kullanıma hazır hale gelecektir.
Bu alandan bir ileti çevirisi almak için ise,
-
char *gettext (const char *msgid);
fonksiyonu kullanılır. Dönüş değeri, verilen iletinin, o an seçili
alan içinde, kullanıcının ayarladığı dile çevrilmiş halidir. Bu çağrıyı
alanı değiştirip tekrar yaparsanız, ikinci sonuç yeni seçilen alandan
gelir. Optimizasyon açısından döngü içinde kullanmamakta yarar görülebilirse
de, GNU gettext alan değişmediği sürece çeviri sonuçlarını cache'lediğinden
bu o kadar önemli değildir. Kullanıcının dilinde bir çeviri olmadığı
durumlarda gettext, msgid iletisini aynen geri verir.
-
printf (gettext ("Hello dear translator, 6 * 9 = %d"), 42);
Örnekte görüldüğü gibi kullanılan yazı dizilerini gettext fonksiyonu
içine almak gibi çok kolay bir işlem ile program çevrilebilir hale
gelmekte. Çevrilecek iletiler başka bazı sistemlerdeki gibi özel ID
ler ile belirtilmek yerine direk kendi metni ile aranmakta. Tabi bunu
daha da kolaylaştırmak için C dilinin makro özelliğinden yararlanabiliriz:
-
#define _(Dizi) gettext (Dizi)
printf (_("Hello dear translator, 6 * 9 = %d"), 42);
Böylece her ileti başına yalnızca 3 karakter (altçizgi, parantez aç,
parantez kapa) israf etmiş oluyoruz. Program yazmaya başlarken bir
i18n.h başlık dosyası yaratıp içine bu makroyu
biçiminde koyarsanız ve iletilerinizi _(...) ile kuşatırsanız, ilerde
programın çevrilmesi gerektiğinde tek yapmanız gereken bu i18n.h dosyasını
değiştirip, programınızı gettext kitaplığı ile bağlamak olacaktır.
Yeni programlarınıza başlarken çeviri alt yapısını bütünüyle eklemeseniz
bile, bu basit işi yapıp, ilerde kolaylık sağlamanızı şiddetle öneriyoruz!
Programınızda bu değişiklikleri yaptıktan sonra çağıracağınız xgettext
adlı program, tüm kodu tarayıp gettext ve _ ile işaretlenmiş metinleri
PROGRAMADI.pot adlı bir dosyada toplar. Daha sonra çevirmenler bu
özel biçimli dosyadan birer kopya çıkarıp içindeki metinleri çevirerek
programınızı kolayca başka bir dile taşıyabilir.