Gettext

Bilgi işlemde **gettext**, Unix benzeri bilgisayar işletim sistemlerinde çok dilli programlar yazmak için yaygın olarak kullanılan bir uluslararasılaştırma ve yerelleştirme (i18n ve l10n) sistemidir. Gettext'in temel faydalarından biri, programlamayı çevirmekten ayırmasıdır. Gettext'in en sık kullanılan uygulaması, 1995 yılında GNU Projesi tarafından yayınlanan GNU gettext'idir  .Çalışma zamanı kitaplığı libintl'dir. Gettext, çok sayıda isim türü için farklı dizeler kullanma seçeneği sunar, ancak dilbilgisel cinsiyet için desteği yoktur.

## Tarih
Başlangıçta POSIX, mesajları yerelleştirmek için hiçbir yol sunmamaktaydı. 1980'lerin sonlarında, 1988 Uniforum gettext ve 1989 X / Open catgets (XPG-3 § 5) adlı iki öneride bulunuldu. Sun Microsystems 1993'te ilk gettext'i uygulamaya soktu. Unix ve POSIX geliştiricileri, ne tür bir arayüz kullanacakları konusunda hiçbir zaman anlaşamadılar (diğer seçenek X / Open catgets), glibc dahil olmak üzere birçok C standart kütüphanesi her ikisini de uygulamaya soktu. Ağustos 2019'dan itibaren gettext'in POSIX'in bir parçası olması gerekip gerekmediği, eski rakibinin zaten kullanım dışı kalmasına rağmen, Austin Grubu'nda hala tartışma konusu mahiyetindedir. Belirtilen endişeler, sistem ayarlı yerel ayara bağımlılığını (çoklu iş parçacığı sorunlarına maruz kalan küresel bir değişken) ve geniş dizeleri içeren daha yeni C dili uzantılarını desteklemesini içeriyordu.

GNU Projesi, gettext'in anahtar olarak mesaj yaklaşımının daha basit ve daha kolay olduğuna karar verdi. (Catgets dahil olmak üzere diğer birçok sistem, geliştiricinin her dize için "anahtar" adları bulmasını gerektirir.)  1995 yılında sistemin ücretsiz bir yazılım uygulaması olan GNU gettext yayınlandı. Gettext, GNU ya da değil, birçok programlama diline taşındı. Po ve yaygın editör desteğinin basitliği, metin belgeleri için program dışı bağlamlarda veya diğer yerelleştirme formatları arasında, po4a (herhangi bir şey için po) ve böyle bir köprü sağlamak için ortaya çıkan Çevirme Araç Seti gibi bir ara geçiş olarak benimsenmesine yol açtı.

## Operasyon

### Programlama

Gettext'in temel arayüzü, kullanıcının orijinal dilde (genellikle İngilizce) göreceği bir dizeyi kabul eden  işlevidir. Yazma süresinden tasarruf etmek ve kod karmaşasını azaltmak için, bu işlev genellikle  `_` : 
```c
printf(gettext("My name is %s.\n"), my_name);
printf(_("My name is %s.\n"), my_name); // same, but shorter
```

`gettext()` daha sonra sağlanan dizeleri çevirileri aramak için anahtar olarak kullanır ve herhangi bir çeviri olmadığında orijinal dizeyi çevirir. Bu, programlı bir kimliğin (genellikle bir tam sayı) kullanıldığı POSIX `catgets()`, AmigaOS `GetString()` veya Microsoft Windows `LoadString()` işlevinin tersidir. Aynı orijinal dil metninin farklı anlamları olabileceği durumu ele almak için, gettext ek bir "bağlam" dizesini kabul eden `cgettext()` gibi işlevlere sahiptir.

`xgettext`, kaynaklardan çıkarılan tüm çevrilebilir dizelerin bir listesini içeren bir `.pot` (Taşınabilir Nesne Şablonu) dosyası oluşturmak için kaynaklarda çalıştırılır. `///`ile başlayan yorumlar çevirmenlere ipuçları vermek için kullanılır, ancak diğer ön ek de kapsamı daha da sınırlayacak şekilde yapılandırılabilir. Bu tür bir yaygın ön ek, `TRANSLATORS:`

Örneğin, yorumu olan bir girdi dosyası şu şekilde görünebilir: 
```c
/// TRANSLATORS: %s contains the user's name as specified in Preferences
printf(_("My name is %s.\n"), my_name);
```

`xgettext` şu komut kullanılarak çalıştırılır: 
  xgettext -c / 
Sonuçta ortaya çıkan .pot dosyası, yorumda şöyle görünür (xgettext dizesinin bir C dili printf biçiminde dizesi olarak tanıdığını unutmayın): 
```gettext
#. TRANSLATORS: %s contains the user's name as specified in Preferences
#, c-format
#: src/name.c:36
msgid "My name is %s.\n"
msgstr ""
```

POSIX kabuk betiğinde gettext, `gettext.sh` benzer dillerde sağladığı birçok işlevi sağlayan bir `gettext.sh` kütüphanesi sağlar. GNU bash ayrıca basit gettext işlevi için basitleştirilmiş bir yapı `$"msgid"`, ancak bir `gettext()` işlevi sağlamak için C kütüphanesine bağlı haldedir.

### Çevriliyor
Çevirmen, `msginit` programını kullanarak şablondan bir `.po` (Taşınabilir Nesne) dosyası `msginit`  türetir, onra çevirileri doldurur. `msginit` çevirileri başlatır, örneğin bir Fransızca çeviri için çalıştırılacak komut şöyle olur: 
  msginit—locale = fr—input = ad.pot 
Bu `fr.po` .ile uygulamaya geçer. Çevirmen daha sonra elde edilen dosyayı el ile veya Poedit gibi bir çeviri aracıyla veya `.po` dosyalarını düzenleme moduyla Emacs ile düzenler. Düzenlenmiş bir giriş şuna benzer: 
```gettext
#: src/name.c:36
msgid "My name is %s.\n"
msgstr "Je m'appelle %s.\n"
```

Son olarak, .po dosyaları `msgfmt` ile ikili `.mo` (Makine Nesnesi) dosyalarına derlenir. GNU gettext, başka bir gettext uygulaması olan sistemlerde kendi dosya adı uzantısı `.gmo` kullanabilir. Bunlar artık yazılım paketi ile beraber dağıtım için hazırdır.

GNU `msgfmt` ayrıca programlama dili tarafından kullanılan format dizesiyle ilgili bazı kontroller yapabilir. Aynı zamanda MO dışındaki dile özgü formatlarda çıktı alınmasını sağlayabilir.

Gelişimsel iş akışının sonraki aşamalarında, `msgmerge` eski bir çeviriyi daha yeni bir şablona "güncellemek" adına kullanılabilir. Ayrıca ters derleme `.mo` dosyaları için `msgunfmt` ve toplu işlem için birçok diğer yardımcı program da mevcuttur.

### İşlem
Unix tipi sistemlerde kullanıcı `LC_MESSAGES` ortam değişkenini ayarlar ve bunun için bir `.mo` dosyası mevcutsa program seçilen dilde dizeleri görüntüler.

GNU varyantlarındaki kullanıcılar bunun yerine `LANGUAGE` ortam değişkenini de kullanabilir. Unix değişkeninden temel farkı, geri dönüş için " **:** " işaretiyle ayrılmış birden çok dili desteklemesidir.

## Çoğul hali
`ngettext()` arayüzü, dizedeki bir ismin sayısını hesaplar. `gettext()` kuralında olduğu gibi, pratik kullanımda genellikle `N_` ile takma adıdır. Kod örneği: 
```c
// parameters: english singular, english plural, integer count
printf(ngettext("I have written an article.\n", "I have written %d articles.\n", n), n);
```

PO dosyasının `""` (boş dize) girişindeki bir başlık, bir tanesi dilin kullandığı çoğul biçim olan ve genellikle C stili üçlü ifade kullanılarak belirtilen bazı meta verilerini depolar. Diyelim ki

İrlandaca için tercüme etmek istiyoruz:
```gettext
msgid ""
msgstr ""
"..."
"Language: ga\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;\n"
```

Şimdi üç çoğul form olduğundan, son po şöyle görünecektir: 
```gettext
#: src/wiki.c:29
msgid "I have written an article.\n"
msgid_plural "I have written %d articles.\n"
msgstr[0] "Irish speaker needed"
msgstr[1] ""
msgstr[2] ""
```

Diller için başvuru çoğul kuralları Unicode konsorsiyumu tarafından sağlanır. msginit ayrıca belirli bir dil için bir dosya oluştururken uygun olanı önceden doldurur.

## Uygulamalar
C'ye ek olarak, gettext aşağıdaki uygulamalara sahiptir: Her iki ASP için C # . NET  ve WPF için, Perl, PHP, Python, Scala, ve Node.js uygulamalarına da sahiptir.

GNU gettext'in Objective-C yerel desteği mevcut, ancak Swift programlama dili için henüz herhangi bir desteği yok. Bu Cocoa platformlarında yaygın olarak kullanılan bir gettext uygulaması POLocalizedString'dir. İOS için Microsoft Outlook ekibi, gettext benzeri bir API içeren bir LocalizedStringsKit kütüphanesi de sağlar.

## Ayrıca bakınız
* poEdit

## Kaynakça