Gelişkin gettext işlevleri
Önceki gettext İleti Katalogları Sonraki
Gelişkin gettext işlevleri
Şimdiye kadar bahsedilen gettext işlevleriyle ilgili tüm mevcut yaklaşımlarda (ve catgets işlevlerinin de tamamında) tamamen gözardı edilmiş gerçek dünyaya özgü bir sorun vardır. Burada çoğul biçimlerin nasıl elde edildiğinden bahsedeceğiz. (Ç.N: Türkçe için sorun değil ama diğer diller için başlı başına bir sorun olduğunu birazdan farkedeceksiniz.)
Kimsenin uluslararasılaştırma ile fazla ilgilenmediği zamanlarda (hatta, sonrasında da) Unix kaynak koduna baktığınızda şuna benzer kodlar görürdünüz[93]:
   printf ("%d file%s deleted", n, n == 1 ? "" : "s");
Kodu uluslararsılaştırmaya çalışan kişlerden gelen ilk tepkilerden sonra ya böyle formülasyonlardan vazgeçildi ya da şöyle dizgeler kullanılmaya başlandı:
   if (n == 1)
     printf ("%d file deleted", n);
   else
     printf ("%d files deleted", n);
Ancak bu da soruna çözüm olmadı. Miktarlı nesne isimlerine sadece `s' gibi tek bir ek alan dillere çözüm olurken, tamamına bir çözüm sağlayamadı. Çünkü çoğul biçimlerin elde edilmesi her dil ailesinde farklıydı. Bunların arasında (hatta dil ailesindeki diller içinde bile) farklı olabilen iki şey vardır:
Bunun sonucu olarak, uygulama yazarları kodlarında bu sorunu çözümlemekle uğraşmak istemezler. Bu sadece kendi dillerinde yerelleştirme yapanların sorunu gibi görünse de gettext'in genişletilmiş arayüzü buna bir çözüm içerir.
Bu ek işlevler bir anahtar dizge yerine iki anahtar dizge ve bir sayısal argüman alırlar. Sayısal argümanı ve ilk dizgeyi bir anahtar olarak kullanarak, gerçeklenim, çevirmen tarafından belirlenen doğru çoğul biçim kurallarını seçer. Normal gettext davranışına benzer şekilde, bir ileti kataloğu bulunamadığı zaman bu iki dizge dönüş değerini oluştururlar. Germen dili kuralları gereğince, ilk dizgenin tekil biçimde, ikinci dizgenin çoğul biçimde olduğu varsayılır.
Bunun sonucu olarak, dil katalogları olmayan yazılımlar iletileri Germen dili kullanılıyormuş gibi basarlar. Bu bir sınırlama olarak görülebilir ancak, GNU C Kütüphanesi (keza GNU gettext) GNU paketinin bir parçası olarak yazılmıştır ve GNU projelerinin kodlama standartları yazılımın İngilizce yazılmasını gerektirdiğinden, kaçınılmaz olarak bu böyle olacaktır.
char *ngettext
(const char       *msgid1,
 const char       *msgid2,
 unsigned long int n)
işlev
ngettext işlevi ileti kataloğunun bulunması bakımından gettext işlevi gibidir. Ancak, iki ek argüman alır. msgid1 ile belirtilen dizge tekil biçimli ileti üretir. Ayrıca katalogdaki iletiyi aramak için anahtar olarak kullanılır. msgid2 ile belirtilen dizge ise çoğul biçimli girdi/girdiler üretir. n parametresi çoğul biçimlerin sayısını belirler. Bir ileti kataloğu bulunamamışsa, işlev, n == 1 ise msgid1 ile, aksi takdirde msgid2 ile döner.
İşlevin kullanımına bir örnek:
printf (ngettext ("%d file removed", "%d files removed", n), n);
n değerinin printf işlevinde de kullanıldığına dikkat edin. Sadece ngettext işlevinin argümanı olması yeterli değildir.
char *dngettext
(const char       *alanadı,
 const char       *msgid1,
 const char       *msgid2,
 unsigned long int n)
işlev
dngettext işlevi ileti kataloğunun seçilmesi bakımından dgettext işlevi gibidir. Ancak, iki ek argüman alır. Tekil/Çoğul dizgelerin elde edilmesi bakımından da ngettext işlevi gibidir.
char *dcngettext
(const char       *alanadı,
 const char       *msgid1,
 const char       *msgid2,
 unsigned long int n,
 int               kategori)
işlev
dcngettext işlevi ileti kataloğunun seçilmesi bakımından dcgettext işlevi gibidir. Ancak, iki ek argüman alır. Tekil/Çoğul dizgelerin elde edilmesi bakımından da ngettext işlevi gibidir.


[93] Ç.N. -- Böyle bir dizgeyi Türkçe'ye çevirirken şöyle yapardık:
"%d dosya silindi. %s"
Ve siz iletiyi genellikle şöyle görürdünüz: "5 dosya silindi. s"
Önceki Üst Ana Başlık Sonraki
gettext kataloğunun yeri Başlangıç Çoğul Biçimler Sorunu
Bir Linux Kitaplığı Sayfası