catgets İşlevleri
Önceki X/Open İleti Kataloglarının İşlenmesi Sonraki
catgets İşlevleri
nl_catd catopen
(const char *katalog,
 int         seçenek)
işlev
catopen işlevi katalog ile belirtilen ileti dosyalarını bulmaya çaılışır ve bulduğunda yükler. Dönüş değeri geçirimsiz türdedir ve diğer işlev çağrılarında yüklü kataloğu belirtmek için kullanılabilir.
İşlev başarısız olursa katalog yüklenmemiş demektir ve dönüş değeri(nl_catd) -1'dir. errno genel değişkeni başarısızlığın sebebini belirten bir hata kodu içerir. İşlev çağrısının başarılı olması katalogdaki tüm iletilerin çevrilmiş olduğu anlamına gelmez.
Katalog dosyasının yeri yazılımın kullanıcısının kararını açıklaması sağlanarak belirlenir. Kullanılacak dile karar vermek kullanıcıya bırakılır ve kimi zaman başka bir katalog dosyaları kullanmak yararlı olur. Bunun tamamı kullanıcı tarafından bazı ortam değişkenleri kullanılarak belirtilebilir.
İlk sorun ileti kataloglarının bulunduğu yeri bulmaktır. Her yazılımın farklı dosyalar için kendi yeri olabileceği gibi, katalog dosyaları dillere göre gruplanarak tüm yazılımlar için aynı bir yerde de tutulabilir.
catopen işlevine yazılımın katalog dosyalarının nerede bulacağı kullanıcı tarafından NLSPATH ortam değişkenine yazılarak belirtilebilir. Bu değerin farklı dil ve yereller için kullanılabilir olması gerektiğinden, değer basit bir dizge olamayacaktır. Dizgenin kendine özgü bir biçimi vardır (printf'in biçim dizgesi gibi). Bir örnek:
    /usr/share/locale/%L/%N:/usr/share/locale/%L/LC_MESSAGES/%N
Görüleceği üzere, iki nokta imleri ile ayırarak birden fazla dizin belirtilebilir. Biçim dizgesinde dikkati çeken ikinci durum %L ve %N belirteçleridir. catopen işlevi bunların çeşitlerini ve yerlerine neleri yerleştireceğini bilir.
%N
Bu biçim elemanı katalog dosyasının isminin yerine geçer. Değeri, catopen işlevine belirtilen katalog argümanının değeridir.
%L
Bu biçim elemanı ileti çevirileri için seçili yerelin isminin yerine geçer. Bunun nasıl saptanacağı aşağıda anlatılmıştır.
%l
(Küçük L harfi.) Bu biçim elemanı yerel isminin dil elemanının yerine geçer. Seçili yereli betimleyen bu dizgenin şu biçimde olması beklenir:
dil[_ülke[.karakter_kümesi]]
Bu biçim elemanı bu dizgenin dil parçasını ifade eder.
%t
Bu biçim elemanı yerel isminin ülke elemanının yerine geçer. Yerel isminin biçimi yukarda verilmişti.
%c
Bu biçim elemanı yerel isminin karakter_kümesi elemanının yerine geçer. Yerel isminin biçimi yukarda verilmişti.
%%
% karakteri bir önceleme karakteri gibi kullanıldığından kendisini de öncelemesi gerekir. %% belirteci aynen printf işlevindeki gibi çalışır.
NLSPATH kullanılarak, kullanılacak farklı dillerin ileti kataloglarının aranacağı dizinler keyfi olarak belirlenebilir. Eğer NLSPATH ortam değişkeni ortamda mevcut değilse, öntanımlı değeri:
 önek/share/locale/%L/%N:önek/share/locale/%L/LC_MESSAGES/%N
Burada önek, GNU C kütüphanesi derlenirken configure betiğine --prefix seçeneğinde belirtilen dizindir (bu dizin çoğu zaman ya /usr ya da boş dizgedir).
Sorun artık hangisinin kullanılacağına karar vermektir. Karar, yukarıda bahsedilen biçim elemanlarının nelerle ikame edileceğidir. Herşeyden önce, ileti kataloğunun ismi içinde bir dosya yolu belirtebilir (yani dosya ismi bölü işaretleri içerir). Bu durumda NLSPATH ortam değişkeni kullanılmaz. Katalog yazılımda belirtildiği gibi mevcut olmalıdır; şüphesiz, bu çalışma dizinine görelidir. Bu istenen bir durum değildir ve katalog isimleri bu yöntemle yazılmamalıdır. Bununla beraber, catgets arayüzünü kullanan platformlar bakımından bu davranış taşınabilir olmayacaktır.
Aksi takdirde, standart ortamdaki ortam değişkenlerinin değerlerine bakılır. Hangi değişkenlere bakılacağına catopen işlevinin seçenek parametresine bakarak karar verilir. Eğer bu değer NL_CAT_LOCALE (nl_types.h dosyasında tanımlıdır) ise, catopen işlevi LC_MESSAGES kategorisi için seçili yerelin ismini kullanır.
Eğer seçenek sıfırsa LANG ortam değişkenine bakılır. Bu davranış, yerel kavramının POSIX yerelleri seviyesinde henüz aşılamadığı erken dönemlerden günümüze ulaşmıştır.
Ortam değişkeninin içerdiği yerel ismi yukarıda açıklandığı gibi dil[_ülke[.karakter_kümesi]]biçiminde olmalıdır. Hiç ortam değişkeni bulunamazsa, çevirilerin kullanılmayacağı anlamına gelen "C" yereli kullanılır.
Bir hata oluştuğunda errno genel değişkenine şunlar atanabilir:
EBADF
Katalog mevcut değil.
ENOMSG
Set/ileti demeti ileti kataloğundaki mevcut bir elemanın ismi değil.
Kimi zaman hatalara karşı sınama yapmak faydalı olduğu halde yazılımlar normalde herhangi bir sınamadan kaçınacaktır. Bir çevirinin yokluğu özgün ileti varsa sorun olmaz, çevrilmemiş ileti basılır. Bu durumu kullanıcı ya olduğu gibi kabul eder ya da iletinin neden çevrilmediğini araştırır.
Lütfen dikkat edin, o an seçili yerelin saptanması ve çeviri kataloğunun bulunması için setlocale çağrısı yapmak gerekmez. catopen işlevi bu değerleri ortam değişkenlerinden doğrudan kendisi okur.
char *catgets
(nl_catd     katalogtanıtıcı,
 int         set,
 int         ileti,
 const char *dizge)
işlev
catgets işlevi önceki bir catopen çağrısı ile açılmış ileti kataloğuna erişmekte kullanılır. katalogtanıtıcı parametresi önceki bir catopen çağrısının dönüş değeri olmalıdır.
Sonraki iki parametre, set ve ileti, ileti kataloğu dosyalarının iç düzeni ile ilgilidir. Bu aşağıda ayrıntılı olarak açıklanmıştır. Şimdilik, kataloğun çeşitli set ve iletiler içeren herbiri numaralanmış evrelerden oluştuğunu bilmemiz yeterli olacaktır. Ne set numarasının ne de ileti numarasının bir önemi vardır. Keyfi olarak seçilmiş olabilirler. Fakat her iletinin (başka biriyle aynı olmadıkça) kendine özel eşsiz bir set/ileti çifti ve ileti numarası olmalıdır.
Kullanıcı tarafından seçilen dil için ileti kataloğunun bulunacağı garanti olmadığından son parametre olan dizge ile bu duruma bir çözüm getirilmiştir. Eğer ileti ile eşleşen bir dizge bulunamazsa dizge döndürülür. Bunu yazılımcı açısından anlamı:
  • dizge parametresi kabul edilebilir bir metin içermelidir (bu ayrıca umulan dizge dönmediğinde bu duruma dair bir ipucu elde edilmesini sağlayabilmelidir).
  • tüm dizge argümanları aynı dilde yazılmış olmalıdır.
catgets işlevinin dönüş değeri her durumda geçerli bir dizgedir. Ya ileti kataloğundaki bir çeviridir ya da dizge parametresi ile belirtilendir. Çevirinin kullanılıp kullanılmayacağına karar veren kod şöyledir:
{
  char *trans = catgets (desc, set, msg, input_string);
  if (trans == input_string)
    {
      /* Birşeyler yanlış gitmiş.  */
    }
}
Destekleyici bir işlevsellik olmadıkça catgets işlevlerini kullanarak yazılım geliştirmek biraz tatsız olur. Her set/ileti numarası demetinin eşsiz olması gerektiğinden yazılımcı kodu yazarken aynı zamanda iletilerin listesini de tutmalı ve aynı proje üzerinde çalışan yazılımcılar arasında koordinasyon sağlanmış olmalıdır. Bunun nasıl biraz daha esnetilebileceğini catgets Kullanımı bölümünde göreceğiz.
int catclose
(nl_catd katalogtanıtıcı)
işlev
catclose işlevi önceki bir catopen çağrısı ile açılmış bir ileti kataloğu ile ilgili özkaynakları serbest bırakmakta kullanılır. Eğer özkaynaklar başarıyla serbest bırakılmışsa işlev 0 ile aksi takdirde -1 ile döner ve errno değişkenine hata durumu atanır. Eğer katalogtanıtıcı ile belirtilen katalog tanıtıcı geçersizse, errno değişkenine EBADF atanır.
Önceki Üst Ana Başlık Sonraki
X/Open İleti Kataloglarının İşlenmesi Başlangıç İleti Kataloğu Dosyalarının Biçimi
Bir Linux Kitaplığı Sayfası