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
#define _(Dizi) Dizi 
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.

Information and documents on Pardus web pages can be used freely anywhere with original source credit.
For information and suggestion(s) please write to info_at_pardus.org.tr
TÜBİTAK - UEKAE, PK.74 41470, Gebze / Kocaeli.