gettext - gettext

metin almak
Orijinal yazar(lar) Güneş Mikrosistemleri
Geliştirici(ler) çeşitli
İlk sürüm 1990 ; 31 yıl önce ( 1990 )
kararlı sürüm
0.21 / 27 Temmuz 2020 ; 12 ay önce ( 2020-07-27 )
depo OpenSolaris ve GNU gettext'e dayalı çeşitli
İşletim sistemi Çapraz platform
Tip Uluslararasılaştırma ve yerelleştirme
Lisans Çeşitli ücretsiz yazılım lisansları
İnternet sitesi www .gnu .org /software /gettext /

Olarak işlem , gettext'lerle bir olan uluslararası ve yerelleştirme yaygın dilli programları yazmak için kullanılan (i18n ve l10n) sistemi Unix benzeri bilgisayar işletim sistemleri . Gettext'in ana faydalarından biri, programlamayı çeviriden ayırmasıdır. Gettext en sık kullanılan uygulamasıdır GNU gettext tarafından yayınlanan, GNU Projesi'nin çalışma zamanı kütüphanesi 1995 yılında libintl . gettext, ismin herhangi bir sayıda çoğul biçimi için farklı dizgiler kullanma seçeneği sunar , ancak dilbilgisel cinsiyet desteği yoktur .

Tarih

Başlangıçta, POSIX, mesajların yerelleştirilmesi için hiçbir yol sağlamadı. 1980'lerin sonlarında, 1988 Uniforum gettext ve 1989 X/Open catget'ları (XPG-3 § 5) olmak üzere iki öneri ortaya atıldı. Sun Microsystems ilk gettext'i 1993'te hayata geçirdi. Unix ve POSIX geliştiricileri, ne tür bir arabirim kullanılacağı konusunda hiçbir zaman tam olarak anlaşamadılar (diğer seçenek X/Open catget'larıdır), glibc dahil pek çok C kitaplığı her ikisini de uyguladı. Ağustos 2019 itibariyle, gettext'in POSIX'in bir parçası olup olmayacağı , eski düşmanının kullanım dışı kalmasına rağmen Austin Group'ta hala bir tartışma konusuydu. Bahsedilen endişeler, sistem tarafından ayarlanan yerel ayarlara ( çoklu iş parçacığı sorunlarına maruz kalan küresel bir değişken) bağımlılığını ve geniş dizeleri içeren daha yeni C dili uzantılarını desteklemesini içeriyordu.

GNU Projesi gettext mesaj-as-tuşunun yaklaşımı daha basit ve daha kolay olduğuna karar verdi. (Catget'ler de dahil olmak üzere diğer sistemlerin çoğu, geliştiricinin her dize için "anahtar" adlar bulmasını gerektirir.) 1995'te sistemin ücretsiz bir yazılım uygulaması olan GNU gettext'i piyasaya sürdüler . Gettext, GNU ya da değil, o zamandan beri birçok programlama dili. po'nun basitliği ve yaygın editör desteği, metin belgeleri için program dışı bağlamlarda veya po4a (her şey için po) gibi dönüştürücüler ve böyle bir köprü sağlamak için ortaya çıkan Translate Toolkit gibi diğer yerelleştirme biçimleri arasında bir aracı olarak benimsenmesine bile yol açar.

Operasyon

Programlama

Image
Tipik gettext iş akışı. Soldaki de.po örneği, çevirilerin msgmerge aracılığıyla "yenilendiğini" gösterir.

gettext'in temel arayüzü , kullanıcının orijinal dilde, genellikle İngilizce'de göreceği gettext(const char*)bir dizgiyi kabul eden fonksiyondur . Yazarak zamandan tasarruf etmek ve kod dağınıklığı azaltmak için, bu fonksiyon yaygın olduğu Aliased için _:

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 çeviri olmadığında orijinal dizeyi döndürür. Bu, programlı bir kimliğin (genellikle bir tamsayı) kullanıldığı POSIX catgets() , AmigaOS GetString() veya Microsoft Windows'un aksinedirLoadString() . Aynı orijinal dildeki metnin farklı anlamlara sahip olabileceği durumu ele almak için gettext, cgettext()ek bir "bağlam" dizesini kabul eden işlevlere sahiptir .

xgettextkaynaklardan .potayıklanan tüm çevrilebilir dizelerin bir listesini içeren bir (Taşınabilir Nesne Şablonu) dosyası üretmek için kaynaklar üzerinde çalıştırılır . İle başlayan yorumlar, ///çevirmenlere ipuçları vermek için kullanılır, ancak kapsamı daha da sınırlamak için diğer önekler de yapılandırılabilir. Böyle yaygın bir önek TRANSLATORS:.

Örneğin, yorum içeren bir girdi dosyası şöyle görünebilir:

/// TRANSLATORS: %s contains the user's name as specified in Preferences
printf(_("My name is %s.\n"), my_name);

xgettext komutu kullanılarak çalıştırılır:

xgettext -c /

Ortaya çıkan .pot dosyası, yorumla birlikte şöyle görünür (xgettext'in dizeyi C dilinde bir printf biçimi 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'in gettext.shbenzer dillerde sağladığı birçok işlevi sağlayan , içerilebilecek bir kitaplık sağlar. GNU bash , bir $"msgid"işlev sağlamak için C kitaplığına bağlı olmasına rağmen, basit gettext işlevi için basitleştirilmiş bir yapıya sahiptir gettext().

çeviri

Çevirmen programı .pokullanarak şablondan bir (Taşınabilir Nesne) dosyası türetir msginit, ardından çevirileri doldurur. msginitçevirileri başlatır, böylece örneğin bir Fransızca çeviri için çalıştırılacak komut şöyle olur:

msginit --locale=fr --input=name.pot

Bu oluşturacaktır fr.po. Çevirmen daha sonra elde edilen dosyayı elle veya Poedit gibi bir çeviri aracıyla veya dosyalar için düzenleme moduyla Emacs ile düzenler .po. Düzenlenmiş bir giriş şöyle görünür:

#: src/name.c:36
msgid "My name is %s.\n"
msgstr "Je m'appelle %s.\n"

Son olarak, .po dosyaları msgfmtikili .mo(Makine Nesnesi) dosyalarıyla derlenir . GNU gettext, .gmobaşka bir gettext uygulamasına sahip sistemlerde kendi dosya adı uzantısını kullanabilir . Bunlar artık yazılım paketi ile dağıtıma hazırdır.

GNU , programlama dili tarafından kullanılan biçim dizgisi ilemsgfmt ilgili bazı kontrolleri de gerçekleştirebilir . MO dışında dile özgü biçimlerde çıktı alınmasına da olanak tanır; X / Open eşdeğerdir . gencat

Geliştirme iş akışının sonraki aşamalarında, msgmergeeski bir çeviriyi daha yeni bir şablona "güncellemek" için kullanılabilir. Orada da msgunfmtters derleme için .modosyaları ve toplu işlem için diğer birçok kamu.

Koşma

Kullanıcı, Unix tipi sistemlerde, ortam değişkenini ayarlar LC_MESSAGESve program, bunun için bir .modosya varsa, seçilen dilde dizeleri görüntüler .

GNU türevlerindeki kullanıcılar LANGUAGEbunun yerine ortam değişkenini de kullanabilir . Unix değişkeninden temel farkı, geri dönüş için iki nokta üst üste ile ayrılmış birden çok dili desteklemesidir.

Çoğul hali

ngettext()Arayüz dizede bir ismin sayım oluşturuyor. Sözleşmesinde olduğu gettext()gibi, genellikle N_pratik kullanımda takma adı verilir . Kod örneğini düşünün:

// parameters: english singular, english plural, integer count
printf(ngettext("%d translated message", "%d translated messages", 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 bir C stili üçlü operatör kullanılarak belirtilen bazı meta verileri depolar . Diyelim ki Sloven dili için tercüme yapmak istiyoruz :

msgid ""
msgstr ""
"..."
"Language: sl\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n"

Şu anda dört çoğul form olduğundan, son po şöyle görünecektir:

#: src/msgfmt.c:876
#, c-format
msgid "%d translated message"
msgid_plural "%d translated messages"
msgstr[0] "%d prevedenih sporočil"
msgstr[1] "%d prevedeno sporočilo"
msgstr[2] "%d prevedeni sporočili"
msgstr[3] "%d prevedena sporočila"

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

Uygulamalar

Ek olarak C :, gettext'lerle aşağıdaki uygulamaları vardır C # ikisi için ASP.NET ve için WPF , Perl , PHP , Python , Scala ve node.js .

GNU gettext, Objective-C için yerel desteğe sahiptir, ancak Swift programlama dili için henüz bir destek yoktur . Bu Cocoa platformlarında yaygın olarak kullanılan bir gettext uygulaması POLocalizedString'dir. iOS için Microsoft Outlook ekibi, gettext benzeri bir API'ye sahip bir LocalizedStringsKit kitaplığı da sağlar.

Ayrıca bakınız

Referanslar

Dış bağlantılar