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

Tipik gettext çalışma akışı. Soldaki de.po örneği, msgmerge aracılığıyla çevirilerin "yenilenmesini" gösterir.
Gettext'in temel arayüzü, kullanıcının orijinal dilde (genellikle İngilizce) göreceği bir dizeyi kabul eden `​gettext(const char*)​` işlevidir. Yazma süresinden tasarruf etmek ve kod karmaşasını azaltmak için, bu işlev genellikle `_` : 

```
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: 

```
/// 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): 

```
#. 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: 

```
#: 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: 

```
// 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:

```
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: 

```
#: 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
--------

1. ↑  "History of gettext() et al? - comp.unix.solaris". *Compgroups.net*. 23 Mart 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Nisan 2016.
2. ↑  "Index of /pub/gnu/gettext". 25 Haziran 2002 tarihinde kaynağından arşivlendi. Erişim tarihi: 17 Mart 2021.
3. ↑  "Bridging the Digital Divide in South Africa | Linux Journal". *www.linuxjournal.com*. Linux Journal. 1 Kasım 2002. 17 Eylül 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 17 Eylül 2019.
4. ↑  "Introduction to Internationalization Programming | Linux Journal". *www.linuxjournal.com*. Linux Journal. 1 Kasım 2002. 17 Eylül 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 17 Eylül 2019.
5. ↑  "Message Translation". *The GNU C Library*. 18 Aralık 2003 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Nisan 2020.
6. ↑  "0001122: POSIX should include gettext() and friends - Austin Group Defect Tracker". *Austin Group Defect Tracker*. 21 Ağustos 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Nisan 2020.
7. ↑  "The Programmer's View". *gettext 0.10.35*. 30 Nisan 1998. 21 Ağustos 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Nisan 2020.
8. ↑  "GNU gettext utilities: List of Programming Languages". 28 Nisan 2007 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Nisan 2020.
9. ↑  "po4a". *po4a.org*. 21 Ağustos 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Nisan 2020.
10. ↑  "The essential toolkit for localization engineers". *Translate Toolkit*. 7 Aralık 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Nisan 2020.
11. ↑  "About catgets". *gnu.org*. 28 Nisan 2007 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Ekim 2017.
12. ↑  "GNU gettext utilities: sh". 28 Nisan 2007 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Nisan 2020.
13. ↑  "GNU gettext utilities: bash". 28 Nisan 2007 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Nisan 2020.
14. 1 2  "GNU gettext utilities: PO Files". *Gnu.org*. 10 Ağustos 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Nisan 2016.
15. ↑  "How to Translate With GetText PO and POT Files". *Icanlocalize.com*. 5 Temmuz 2010 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Nisan 2016.
16. ↑  "Files Conveying Translations". *Gnu.org*. 28 Nisan 2007 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Nisan 2014.
17. ↑  "msgfmt Invocation". *GNU gettext utilities*. 28 Nisan 2007 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Nisan 2020.
18. ↑  "GNU gettext utilities: Locale Environment Variables". *Gnu.org*. 5 Eylül 2008 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Nisan 2016.
19. ↑  "Language Plural Rules". *unicode.org*. 21 Ekim 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Nisan 2020.
20. ↑  "Google Code Archive - Long-term storage for Google Code Project Hosting". *Code.google.com*. 13 Aralık 2010 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Nisan 2016.
21. ↑  "turquoiseowl/i18n: Smart internationalization for ASP.NET". *GitHub.com*. 27 Aralık 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Nisan 2016.
22. ↑  "NGettext.Wpf - Proper internationalization support for WPF (via NGettext)". 30 Mart 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Nisan 2020.
23. ↑  "libintl-perl - An Internationalization Library for Perl That Aims To Be Compatible With the Uniforum Message Translations System as Implemented For Example in GNU Gettext". *github.com*. 24 Nisan 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 14 Eylül 2017.
24. ↑  "Gettext". *php.net*. 1 Ekim 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Ekim 2017.
25. ↑  "gettext — Multilingual internationalization services — Python 3.7.0 documentation". *docs.python.org*. 6 Ekim 2008 tarihinde kaynağından arşivlendi. Erişim tarihi: 21 Eylül 2018.
26. ↑  "makkarpov/scalingua: A simple gettext-like internationalization library for Scala". *github.com*. 24 Nisan 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 28 Nisan 2016.
27. ↑  "DanielBaulig/node-gettext: An adaption of Joshua I. Miller's Javascript Gettext library for node.js". *GitHub.com*. 3 Ağustos 2014 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Nisan 2016.
28. ↑  "hulab/POLocalizedString: gettext for iOS/OS X/watchOS/tvOS". *GitHub*. hulab. 19 Eylül 2019. 24 Nisan 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Nisan 2020.
29. ↑  "microsoft/LocalizedStringKit: Generate .strings files directly from your code". *GitHub*. Microsoft. 12 Şubat 2020. 11 Şubat 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Nisan 2020.