catgets Kullanımı
Önceki X/Open İleti Kataloglarının İşlenmesi Sonraki
catgets Kullanımı
catgets işlevleri iki farklı yolla kullanılabilir: X/Open belirtiminden hiç sapmadan ve GNU oluşumlarını kullanarak. Önce ilk yöntemin nasıl kullanıldığına bakacağız, böylece ikinci yöntemin yani GNU oluşumlarının getirilerini daha iyi anlayabileceğiz.
Sembolik isimleri kullanmadan
İleti X/Open biçimi katalog dosyalarında sembolik isimlere izin verilmediğinden bu seferlik sadece numaralarla çalışacağız. Yazılımı geliştirmeye başlarken çevrilebilir dizgelerin hepsini şu biçimde bir kodla değiştirmelisiniz:
catgets (catdesc, set, msg, "dizge")
catdesc parametresi, yazılım başında normalde bir kere yapılan bir catopen çağrısından alınır. "dizge" çevirlecek dizgedir. Set ve ileti numaralarının başlatılması sorun olur.
Büyükçe bir yazılımda aynı anda çok sayıda geliştirici çalışırsa numara ayırma işleminin eşgüdümü önem kazanır. Aynı demet numarası ile iki farklı dizge indislenemediğinden, birbirinin aynı dizgeler ile birbirinin aynı çeviriler için numaraların yeniden kullanılması tercih edilir. (Bir dilde aynı olan dizgeler başka bir dilde bağlama bağlı olarak farklı dizgeler olabilir; bir de bu var...)
Numara ayırma işlemi yazılımın farklı parçalarında farklı Set numaraları kullanılarak biraz olsun rahatlatılabilir. Böylece eşgüdümlenecek geliştirici sayısı düşürülebilir. Yine de ayırma ile ilgili listeler tutulabilir ve hataların giderilmesi kolaylaştırılabilir. Bu hatalar derleyici ya da catgets işlevleri tarafından saptanamaz. Sadece yazılımın kullanıcısı yanlış iletinin basıldığını görür. En kötü durumda, yanlış olarak tanımlanamayan iletiler çok sinir bozucu olabilir. Doğrularla yanlışlar birbirine karışır ve bu bir felaketle sonuçlanır.
Sembolik isimleri kullanarak
Önceki bölümde bahsedilen sorunlardan şu sonuçları çıkarabiliriz:
  1. Numaralar bir kere ayrıldıktan sonra onları değiştirmek gerekirse bu çok zor olur.
  2. Numaralar dizgenin içeriği hakkında hiçbir fikir vermediğinden karışıklıklar olabilir.
Sürekli olarak sembolik isimleri kullanarak ve dizge içeriğini bir sembolik isimle eşleyen bir yöntem sağlanarak bu iki sorundan kurtulmak mümkündür. Bu yöntemim yazılımcıya maliyeti yazılımı geliştirirken bir yandan da ileti kataloğunu yazmasıdır.
Yazılım derlenmeden önce sembolik isimlerin numaralarla eşleştirilmesi gerektiğinden bunun böyle olması gerekir. Önceki bölümde gencat uygulaması tanıtılırken isimlerle eşleşmeleri içeren bir başlık dosyasının nasıl üretileceğinden bahsedilmişti. Örneğin, önceki örnekteki katalog dosyasının isminin ex.msg olduğu kabul ederek,
gencat -H ex.h -o ex.cat ex.msg
komutuyla şu içeriğe sahip bir başlık dosyası üretilir:
#define SetTwoSet 0x2   /* ex.msg:8 */

#define SetOneSet 0x1   /* ex.msg:4 */
#define SetOnetwo 0x2   /* ex.msg:6 */
Görüldüğü gibi, kaynak dosyasında verilen sembollerden eşsiz belirteçler üretmek için yeni semboller elde edilmiş ve bunlar numaralara atanmıştır. Kaynak dosyayı okuyarak ve kuralları bilerek başlık dosyasının içeriğini tahmin etmek mümkündür ama bu gerekli değildir. gencat uygulaması herşeyi dikkatlice yapabilir. Bütün geliştiriciler, projenin kaynak dosyalarının bağımlılık listesine üretilen başlık dosyasını koymalı ve girdi dosyaları değiştiğinde başlığı üretecek kuralları eklemelidir.
Sembollerden makro isimlerinin elde edilmesi ile ilgili olarak da bir kaç laf etmek lazım. Her makro ismi iki parçadan oluşur: İleti kümesinin ismi artı iletinin ismi ya da özel bir dizge olarak Set. Yani, SetOnetwo makrosu ile ileti katalog dosyasındaki SetOne ileti kümesinin two isimli iletisine erişilir.
Diğer isimler ileti kümelerinin isimlerini belirtir. Özel Set dizgesi ileti belirtecinin yerine kullanılır.
Eğer koddaki SetOne kümesinin ikinci dizgesi C kodunda kullanılmak istenirse şöyle yapılırdı:
catgets (catdesc, SetOneSet, SetOnetwo,
         "   Kimliği \"two\" olan ileti, buna 2 değeri atanacaktır")
İşlevin bu yöntemle yazılması C kaynak kodunda herhangi bir değişiklik gerekmeksizin ileti numarasını hatta Set numarasını değiştirmek mümkün olacaktır. (Dizgenin metni normalde aynı görünür; bu sadece bu örnek içindir.)
Bunları yazılım geliştirirken nasıl kullanacağız?
Sembolik sürüm numaraları ile çalışma yöntemini göstermek için burada küçük bir örneğe yer verdik. Çok karmaşık ve ünlü bir selamlama yazılımını yazmak istediğimizi varsayalım. Koda şöyle başlardık:
#include <stdio.h>
int
main (void)
{
  printf ("Hello, world!\n");
  return 0;
}
Şimdi iletileri uluslararasılaştıralım ve böylece kullanıcı iletiyi kendi diline çevirebilsin.
#include <nl_types.h>
#include <stdio.h>
#include "msgnrs.h"
int
main (void)
{
  nl_catd catdesc = catopen ("hello.cat", NL_CAT_LOCALE);
  printf (catgets (catdesc, SetMainSet, SetMainHello,
                    "Hello, world!\n"));
  catclose (catdesc);
  return 0;
}
Katalog nesnesinin nasıl açıldığını ve diğer işlev çağrılarında kullanılacak tanımlayıcının nasıl döndürüldüğünü görüyoruz. Buradaki işlevler makul davranacağından işlevlerde herhangi bir başarısızlık sınaması yapmamız aslında gerekmiyor. Sadece bir çeviri döndürecekler.
Burada SetMainSet ve SetMainHello sabitleri belirsiz kaldı. Bunlar iletiyi tanımlayan sembolik isimlerdir. Katalog dosyasındaki bilgiyle eşleşen gerçek tanımlarını elde etmek için ileti kataloğunu oluşturup onu gencat uygulaması ile işlemeliyiz.
$ Turkish messages for the famous greeting program.
$quote "

$set Main
Hello "Merhaba Dünyalı!\n"
Yazılımımızı artık derleyebiliriz. Katalog kaynak dosyasının isminin hello.msg ve yazılım kaynak dosyasının isminin hello.c olduğunu varsayıyoruz:
$ gencat -H msgnrs.h -o hello.cat hello.msg
$ cat msgnrs.h
#define MainSet 0x1     /* hello.msg:4 */
#define MainHello 0x1   /* hello.msg:5 */
$ gcc -o hello hello.c -I.
$ cp hello.cat /usr/share/locale/tr/LC_MESSAGES
$ echo $LC_ALL
tr
$ ./hello
Merhaba Dünyalı!
$
gencat çağrısı ile ileti kataloğunun ikilik biçimi ile birlikte msgnrs.h başlık dosyasını da elde ettik. İlk olarak hello.c'yi derledik, sonra da hello.cat'i catopen işlevinin bulabileceği yere yerleştirdik. Katalog dosyasını doğru yere yerleştirip yerleştirmediğimizi LC_ALL ortam değişkeninin değerine bakarak sınamayı unutmuyoruz. (Ç.N. -- Özgün metinde "tr" değil "de" var ama "de" değerli bir "LC_ALL" ne kadar mümkün?; yazar burada biraz dikkatsizmiş sanırım. Değişken LC_ALL değil LANGUAGE olmalıydı, çünkü LC_ALL ortam değişkeninin değeri normalde bir boş dizgedir; ortam değişkeni olarak anlamlı değildir ama bir C makrosu olarak anlamlıdır.)
Önceki Üst Ana Başlık Sonraki
İleti Kataloğu Dosyalarının Üretilmesi Başlangıç İleti Çevirilerinde Uniforum Yaklaşımı
Bir Linux Kitaplığı Sayfası