Ş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:
Çoğul biçimlerin kurgulanışı farklıdır. Bu bazı düzensizlikler içeren dillerle ilgili bir sorundur. Örneğin, Almanca'da bu çok belirgindir. İngilizce ve Almanca aynı dil ailesine (Germen) mensup oldukları halde çoğul isim biçiminin (`s' ekleme) kurgulanışında farklılıklar vardır.
Çoğul biçimlerin sayısı farklıdır. Bir tekil, bir de çoğul biçim bulunan Romen ve Germen dillerine aşina olanlar için bu biraz şaşırtıcıdır (Türkçe'den başka dil bilmeyene daha da şaşırtıcı, çünkü Türkçe'de böyle bir olgu *hiç* yok; 1 elma, 5 armut deriz; 1 elma, 5 armutlar demeyiz).
Ancak, diğer dil ailelerine bir biçimden çok sayıda biçime kadar değişik biçimler sözkonusudur. Bu konuda daha ayrıntılı bilgi ayrı bir bölümde verilmiştir.
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.