ÖzelliklerEklentiFiyatlandırmaKaynaklar
Dili Değiştir
Kaynaklarmsgctxt Kullanımı: Gettext Çevirilerine Bağlam Ekleme

msgctxt Kullanımı: Gettext Çevirilerine Bağlam Ekleme

SimplePoTranslate Team15 Mayıs 2026
msgctxt Kullanımı: Gettext Çevirilerine Bağlam Ekleme

İngilizce "Book" kelimesini Almancaya çevirirsiniz ve çevirmeniniz kendinden emin bir şekilde "Buch" cevabını verir. Üç hafta sonra bir hata raporu gelir: rezervasyon formunuzdaki "Book a table" düğmesi şimdi "Buch a table" olarak okunuyor - isim hali, fiil hali değil. Kelime doğruydu. Bağlam eksikti. Bu, yazılım yerelleştirmesindeki en yaygın sessiz hatalardan biridir ve çözümü Gettext'te onlarca yıldır mevcuttur: msgctxt.

Tek bir İngilizce dizenin bir yerde doğru, başka bir yerde anlamsız olduğu bir çeviri yayınladıysanız, belirsizlik sorununa çarpmışsınız demektir. Aynı kaynak kelime, göründüğü yere bağlı olarak farklı çevirilere karşılık gelir. msgctxt olmadan, çevirmen (insan veya yapay zeka) bu durumları birbirinden ayıramaz, çünkü gördükleri tek şey msgid "Book" çıplak dizesidir. Bu rehber, msgctxt'nin Gettext'te nasıl çalıştığını, kaynak kodunuzu _x() ve _ex() ile nasıl işaretleyeceğinizi, bunun .po dosyalarınızda nasıl göründüğünü ve bağlamdan haberdar bir çeviri hattının bu dizeleri büyük ölçekte doğru bir şekilde elde etmenin neden tek güvenilir yolu olduğunu açıklar.

Belirsizlik Sorunu: Tek Kelime, Birçok Anlam

Doğal dil, tek bir İngilizce belirtece dönüşen ancak diğer dillerde birden çok kelimeye ayrılan kelimelerle doludur. Çevirmen yalnızca kaynak dizeyi görür, bu nedenle birbiriyle ilgisiz iki kullanıcı arayüzü öğesi aynı İngilizce kelimeyi paylaştığında, aynı msgid'i paylaşırlar - ve Gettext bunları tek bir girişte birleştirir.

Diller Arasında Ayrılan Kelimeler

Üç klasik örneği ele alalım:

  • "Book" - isim hali (bir raftaki nesne) ve fiil hali ("uçuş rezervasyonu yap"). Almanca: Buch ve buchen.
  • "Post" - içerik yayınlamak ve posta göndermek. Fransızca: publier ve courrier.
  • "Order" - bir sıra/sıralama ve bir satın alma. İspanyolca: orden ve pedido.

İngilizcede, kodunuz her iki yerde de aynı değişmez dizeyi kullanır:

// Somewhere in a library catalog screen
echo __( 'Book', 'mytextdomain' );

// Somewhere in a reservation form button
echo __( 'Book', 'mytextdomain' );

Özdeş Dizeler Tek Bir Girişte Nasıl Birleşir

wp i18n make-pot veya xgettext komutunu çalıştırdığınızda, her iki çağrı da tek bir .po girişinde birleşir:

#: catalog.php:42 reservation-form.php:88
msgid "Book"
msgstr ""

Doldurulacak tam olarak bir msgstr vardır. Çevirmen ne seçerse seçsin, iki ekrandan biri yanlış olacaktır. Çevirmen sorunu anlasa bile bunu düzeltemez, çünkü formatın kendisi bir msgid için iki çeviri sağlamalarına izin vermez. Belirsizlik verinin içine işlenmiştir.

msgctxt Nedir ve Belirsizliği Nasıl Giderir?

msgctxt, bir çeviri girişine eklenmiş bir bağlam dizgisidir. Kısa cevap: msgid'in yanına ikinci bir anahtar ekler, böylece Gettext (bağlam, msgid)'i benzersiz bir çift olarak ele alır. Aynı msgid'ye sahip ancak farklı msgctxt'ye sahip iki giriş, iki ayrı, bağımsız olarak çevrilebilir dize haline gelir.

Gettext'in arama modelinde, bir çeviri normalde yalnızca kaynak dizeyle anahtarlanır. msgctxt ile anahtar, bağlam artı kaynağın birleşimi olur. Mekanizmanın tamamı budur ve bu kadar temiz çalışmasının nedeni budur: görüntülenen metni değil, yalnızca dahili arama anahtarını değiştiriyorsunuz.

Bir .po Dosyasındaki msgctxt Satırı

Bir .po dosyasında, bağlam msgid'in hemen üzerinde kendi satırında görünür:

#: catalog.php:42
msgctxt "noun"
msgid "Book"
msgstr "Buch"

#: reservation-form.php:88
msgctxt "verb"
msgid "Book"
msgstr "Reservieren"

Şimdi iki giriş var. Özdeş msgid değerlerine ancak farklı msgctxt değerlerine sahipler, bu yüzden her biri kendi msgstr'sini alır. Katalog Buch'u oluşturur; rezervasyon düğmesi Reservieren'i oluşturur. Çalışma zamanı doğru olanı seçer çünkü kodunuz hangi bağlamı kullanacağını ona söylemiştir.

Bunu yukarıdaki bozuk tek girişli sürümle karşılaştırın. Fark, çeviri kalitesi değil - veri modelinin doğru cevabın var olmasına bile izin verip vermediğidir.

Kodunuzu İşaretleme: _x() ve _ex()

.po şablonunuza msgctxt yaymak için, düz çeviri işlevi yerine bağlamdan haberdar bir çeviri işlevini çağırırsınız. WordPress'te bunlar _x() ve onun yankılayan kardeşi _ex()'dir; ham Gettext'te pgettext()'e karşılık gelirler.

_x() ve _ex() Arasında Seçim Yapmak

Düz __() işlevi dizeyi ve metin alanını alır. Bağlam varyantı, bağlamı ikinci argüman olarak ekler:

// Without context - ambiguous
__( 'Book', 'mytextdomain' );

// With context - the second argument is the msgctxt
_x( 'Book', 'noun', 'mytextdomain' );        // returns the translated string
_ex( 'Book', 'verb', 'mytextdomain' );       // echoes it directly

// Real-world disambiguation
_x( 'Post', 'verb: publish content', 'mytextdomain' );
_x( 'Post', 'noun: mail item', 'mytextdomain' );
_x( 'Order', 'sequence or sorting', 'mytextdomain' );
_x( 'Order', 'customer purchase', 'mytextdomain' );

İkinci argüman bağlam etiketidir. Kullanıcılarınıza asla gösterilmez - yalnızca Gettext araması ve çeviriyi yapan kişi (veya şey) için belirsizliği gidermek amacıyla mevcuttur. Bağlamları kısa, açıklayıcı ipuçları olarak yazın: 'isim', 'fiil', 'düğme etiketi', 'yönetici menüsü'. '1' gibi belirsiz bir bağlam teknik olarak geçerli olsa da çevirmen için işe yaramazdır.

Şablonu yeniden oluşturduğunuzda, çıkarıcı bu çağrıları tanır ve msgctxt satırını yayar. Poedit ve diğer PO düzenleyicileri gibi araçlar daha sonra girişleri bağlama göre görünür şekilde gruplandırır, böylece insan bir çevirmen "Book (isim)" ve "Book (fiil)"in iki farklı iş olduğunu hemen görür. Ayıklama araç zincirinizi hala kuruyor veya değişkenlerin bu dizelerle nasıl etkileşime girdiğini anlamaya çalışıyorsanız, kod değişkenlerini bozmadan PO dosyalarını çevirme hakkındaki rehberimiz, çevredeki iş akışını ayrıntılı olarak ele almaktadır.

Neden Deneyimsiz Çevirmenler - ve Birçok Yapay Zeka Aracı - Bunu Yanlış Yapar

İşte rahatsız edici kısım. Kaynağınıza msgctxt eklemek gerekli ancak yeterli değildir. Bağlam, yalnızca çeviriyi yapan şey onu gerçekten okursa yardımcı olur.

Atılan Bağlam Hata Modu

Deneyimsiz bir toplu çeviri betiği şunu yapar: girişler üzerinde döngü kurar, her msgid'yi alır, bir çeviri API'sine gönderir ve sonucu msgstr'ye yazar. msgctxt satırına asla bakmaz. Bu nedenle, dikkatlice _x( 'Book', 'noun' ) ve _x( 'Book', 'verb' ) yazmış olsanız bile, betik iki aynı istek gönderir - "Book'u çevir" - ve aynı cevabı ikisine de yapıştırır. Tüm işaretleme çabanız son adımda boşa gider.

Birçok genel amaçlı yapay zeka çeviri aracının aynı kör noktası vardır. Metin çevirmek için yapılmışlardır ve msgctxt metin değil, meta veridir. Araç, .po dosyanızı modele göndermeden önce bir dize listesine düzleştirirse, bağlam asla modelin istemine ulaşmaz. Herhangi bir sinyalden yoksun olan model, kelimenin istatistiksel olarak en yaygın anlamına - genellikle "Book" için isim hali, "Post" için yayınlama anlamı - varsayılan olarak döner ve azınlık durumunu sessizce yanlış çevirir. Bir hata görmezsiniz. Haftalar sonra bir Alman kullanıcıdan bir hata raporu görürsünüz.

Bağlam ve Çoğullar Aynı Temel Nedeni Paylaşır

Burası aynı zamanda çoğul işleme ve bağlamın kesiştiği noktadır, çünkü her ikisi de aracın dosyayı düz metin olarak ele almak yerine Gettext'in yapısını anlamasına bağlıdır. Dizeleriniz sayıya dayalı formlar içeriyorsa, aynı yapısal farkındalık önemlidir - bunu Gettext çoğullarını anlama rehberimizde ayrıntılı olarak inceliyoruz.

Bağlamdan Haberdar Bir İş Akışı msgctxt'yi Nasıl Kullanır?

msgctxt'ye saygı duyan bir çeviri hattı, deneyimsiz betiğin tam tersini yapar. .po dosyasını yapılandırılmış veri olarak ayrıştırır, her girişin bağlamını kaynak dizesine bağlı tutar ve bu bağlamı istemin bir parçası olarak yapay zekaya iletir - böylece model, "Book" kelimesini soyut olarak değil, özellikle bir fiil olarak çevirdiğini bilir.

Birinci Sınıf Sinyal Olarak Bağlam

SimplePoTranslate soruna tam olarak böyle yaklaşıyor. Bağlamdan haberdar yapay zekası, msgctxt satırını birinci sınıf bir sinyal olarak okur: iki giriş aynı msgid'yi paylaşıyor ancak bağlamda farklılık gösteriyorsa, aslında oldukları ayrı dizeler olarak çevrilirler ve bağlam ipucu modelin kelime seçimini bilgilendirir. Sonuç olarak, "Book (isim)" Buch olarak dönerken, "Book (fiil)" buchen veya reservieren olarak döner - otomatik olarak, her belirsiz terimi elle düzeltmenize gerek kalmadan.

Aynı derecede önemli olarak, iş akışı msgctxt satırını çıktıda korur. Daha zayıf bir araç, gidiş-dönüş sırasında bağlamı çıkararak, iki girişinizi sessizce tek bir girişe indirgeyebilir ve bir sonraki birleştirmede belirsizliği yeniden ortaya çıkarabilir. Tam Gettext desteği, bağlamın çeviriyi, .mo derlemesini ve daha sonraki herhangi bir yeniden içe aktarmayı atlatması anlamına gelir - böylece belirsizliği gidermeniz tek seferlik manuel bir yama değil, kalıcıdır. Bu dizelerin içindeki yer tutucular için Sözdizimi Kilitleme ile birleştiğinde, hem bağlamsal olarak doğru hem de yapısal olarak sağlam çeviriler elde edersiniz.

İşaretleme kararı hala sizindir - belirli bir "Book"un bir fiil olduğunu sadece siz bilirsiniz. Ancak kaynağınızı _x() ve _ex() ile açıkladıktan sonra, bağlamdan haberdar bir iş akışı, bu açıklamayı her hedef dilde, dize bazında denetim yapmadan doğru çevirilere dönüştürür.

Sonuç

Belirsizlik sorunu - tek bir İngilizce kelime, birçok anlam - göz ardı edebileceğiniz bir tuhaflık değil; Gettext'in dizeleri depolama şeklinin yapısal bir özelliğidir. Çözüm msgctxt'dir: kaynağınızdaki belirsiz dizeleri _x() ve _ex() ile açıklayın, her oluşuma açık bir bağlam etiketi verin ve Gettext'in çeviriyi (bağlam, msgid) çifti üzerinde anahtarlamasını sağlayın. Bu kısım size bağlıdır ve dakikalar sürer.

Daha zor kısım, çeviri adımınızın bu bağlamı göz ardı etmek yerine gerçekten dikkate aldığından emin olmaktır. Deneyimsiz betikler ve yalnızca metin tabanlı yapay zeka araçları msgctxt'yi göz ardı eder ve engellemeye çalıştığınız hatayı yeniden ortaya çıkarır. Bağlamdan haberdar bir iş akışı, bağlamı okur, her belirsizliği giderilmiş girişi doğru bir şekilde çevirir ve derleme ve yeniden içe aktarmalar yoluyla onu korur.

Bağlamdan habersiz yanlış çevirileri göndermeyi bırakmaya hazır mısınız? SimplePoTranslate'i ücretsiz deneyin — kredi kartı gerekmez. Ücretsiz katman, gerçek .po ve .pot dosyalarını tam msgctxt bağlam desteğiyle işler, böylece belirsizliği giderilmiş dizeleriniz ilk seferde doğru çevrilir.