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 _ : 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:
msginitlocale = frinput = 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.