Bir eklentiyi çevirdiniz, dosyanız sunucuda duruyor, ama ekranınız hâlâ İngilizce; aslında bozuk bir şey yok. WordPress her eklenti için tek bir dosya arar ve onu dilinize, dosya adına ve klasöre göre seçer. Bu üçünden biri tek bir karakterle bile tutmazsa WordPress hiçbir şey söylemez, size İngilizceyi gösterir.
Türkçe sitelerde en sık rastlanan hata da burada, dosyanın adındaki trile başlar. O yüzden çevirinizi henüz düzenlemeyin ve önce WordPress’in sizin için gerçekte hangi dosyayı okuduğunu bulun. Aşağıdaki her kontrol bir test sitesinde, her metne geldiği dosyanın adını yazan küçük bir eklentiyle yapıldı.
WordPress hangi dili istiyor?
WordPress’te iki dil ayarı vardır ve yönetim ekranlarınız, belki de hiç düşünmediğiniz ayarı izler:
| Ayar | Nerede bulursunuz | Neyi belirler |
|---|---|---|
| Site dili | Ayarlar› Genel› Site Dili | sitenizin herkese açık sayfaları |
| Profil diliniz | Kullanıcılar› Profil› Dil | gördüğünüz her yönetim ekranı |
Siteyi Türkçeye, kendi profilinizi İngilizceye ayarlarsanız test sitesinin gösterdiğini görürsünüz: doğru bir çeviri dosyası yerindeyken bile eklentinin yönetim sayfası İngilizce kalır.
Profilinizde sitenin varsayılanı seçiliyse profiliniz site dilini izler. Orada bir dil seçiliyse yönetim ekranlarınızda o dil geçerli olur, hem de yalnızca sizin için; aynı ekranı bir iş arkadaşınız başka bir dilde görebilir.
Dosya adı: tr değil, tr_TR
Bir eklentinin çeviri dosyasının adı metin-alani-yerel.mobiçimindedir. Metin alanı (text domain) eklentinin kimliğidir ve çoğu zaman klasörünün adıyla aynıdır. Yerel ise WordPress’in kullandığı tam koddur ve Türkçe için bu kod trdeğil, tr_TR‘dir:
| Dosya adı | Sonuç |
|---|---|
eklentim-tr.mo | okunmaz, ekran İngilizce kalır |
eklentim-tr_TR.mo | okunur |
Test sitesinde diliniz Türkçeyken yalnızca i18n-lab-tr.modosyası vardı ve sayfa İngilizce kaldı. Dosyanın adını i18n-lab-tr_TR.moyaptığınızda aynı sayfa Türkçeye döner.

Kendi dosyanızın adını kontrol ederken büyük ve küçük harflere, alt çizgiye dikkat edin, çünkü WordPress adı tr_TRolarak arar.
wp-content/languages içindeki dosya kazanır
Bir eklentinin çevirisi iki yerden gelebilir: – wp-content/languages/plugins/klasöründen; WordPress, translate.wordpress.org üzerinden indirdiği dil paketlerini buraya koyar; – eklentinin kendi languagesklasöründen; bu klasör ancak eklenti onu load_plugin_textdomain()ile WordPress’e bildirirse sayılır.
WordPress önce wp-content/languages/plugins/klasörüne bakar.Aynı metni, geldiği yeri yazarak iki klasöre de koyduğunuzda sayfanız dil paketindekini gösterir ve eklenti klasöründeki dosyayı istediğiniz kadar değiştirseniz de ekranınızda hiçbir şey değişmez.
Tersi de geçerlidir: eklentiniz load_plugin_textdomain()çağırmıyorsa yalnızca wp-content/languages/plugins/klasöründen çevrilir ve kendi klasöründeki dosyanız, onu oraya taşıyana kadar işe yaramaz.
Dil paketleri translate.wordpress.org’dan gelir. Bir eklenti, bir dildeki ilk paketini ancak kararlı metinlerinin %90’ı orada çevrildiğinde alır. Türkçe çevirisi bu eşiğin altında kalan eklentilerde translate.wordpress.org’da gördüğünüz yarım çeviri sitenize gelmez, bu yüzden çevirisi yarı yarıya hazır olan bir eklenti sitenizde tamamen İngilizce kalır.
Düzelttiğiniz bir dosyayı nasıl derleyeceğiniz ve nereye koyacağınız WordPress PO dosyaları MO dosyalarına nasıl derleniryazısında.
Yanındaki .l10n.php dosyası
WordPress 6.5’ten bu yana, .modosyanızla aynı adı taşıyan bir .l10n.phpdosyası onun yerine yüklenir. Test sitesinde dil paketinin .modosyasının yanındaki .l10n.phpkazandı; yanında hiç .moolmayan bir .l10n.phpde aynı şekilde kazandı.
Bir .modosyasını düzenleyip yeniden derlediniz ve hiçbir şey değişmediyse, aynı adlı bir .l10n.phparayın. Onu PO dosyanızdan wp i18n make-phpile yeniden üretin ya da .mookunsun diye silin.
Çoğu kişiyi şaşırtan bir fark var: msgfmt, fuzzy işaretli girdileri .modosyasına koymaz ve bu girdiler İngilizce kalır. WP-CLI 2.12.0’daki wp i18n make-phpise fuzzy girdiyi dosyaya aldı ve test sayfası onun onaylanmamış çevirisini gösterdi.
PHP dosyanızı üretmeden önce tutmak istediğiniz girdilerdeki fuzzy işaretini kaldırın, ötekileri boş bırakın.
JavaScript metinleri ayrı dosya ister
Bir betiğin sayfanıza yazdığı metin .modosyasına hiç uğramaz. Bunun için metin alanının, yerelin ve betiğin eklenti içindeki yolunun MD5 özetinin adını taşıyan bir JSON dosyasına ihtiyacınız var, örneğin eklentim-tr_TR-0a1b2c….json. wp i18n make-jsonbu dosyayı PO dosyanızdan üretir, eklentinizin de wp_set_script_translations()çağırması gerekir.
Test sitesinden bilmeniz gereken iki sonuç çıktı: – JSON dosyası yoksaPHP metniniz Türkçe, betiğinizin metni İngilizce olur, hem de aynı ekranda. – Bir dil paketi varsaeklentinin kendi klasöründeki JSON dosyanız yok sayılır ve betiğinizin metni İngilizceye düşer. JSON dosyasını kazanan dosyanın yanına koyun.
Ekranınız yarı Türkçe, yarı İngilizceyse buradan başlayın.
Çeviriyi erken yükleyen kod
WordPress 6.7’den bu yana, initeyleminden önce çeviri isteyen bir eklenti hata günlüğünüze bir uyarı yazar. Uyarı, Türkçe bir sitede de İngilizce gelir:
Translation loading for the eklentim domain was triggered too early.
This is usually an indicator for some code in the plugin or theme running
too early. Translations should be loaded at the init action or later.WP_DEBUG_LOGayarını açın ve wp-content/debug.logdosyanızda eklentinin metin alanını arayın. Test sitesinde, eklentinin dosyası yüklenirken çevrilen bir metin İngilizce kaldı, sayfanızın geri kalanı ise çevrilmişti ve günlüğünüzde de bu uyarı yer aldı.
Bunu bir dosyayla düzeltemezsiniz, o yüzden uyarıyı eklentinin geliştiricisine gönderin, çünkü ilgili kodun initya da sonrasına taşınması gerekir.
Doğrulama
Metni hangi dosyanın verdiğini söyleyebildiğinizde ve o dosya yokken ekranınız değiştiğinde nedeni bulmuşsunuz demektir.
| Kontrol | Beklenen |
|---|---|
| Sayfayı profil diliniz Türkçeyken açın | Türkçe. Değilse ilk bölümebakın. |
Metni verdiğini düşündüğünüz dosyanın adını değiştirin, örneğin .mo.offyapın, sayfayı yenileyin | Değişmeli.Metin İngilizceye ya da başka bir dosyanın sürümüne dönmeli. |
| Adı geri alın, sayfayı yenileyin | Çeviri geri gelir. |
| Aynı ekranda bir PHP metnine ve bir betik metnine bakın | İkisi de çevrilmiş. Değilse JavaScriptbölümüne bakın. |
debug.logdosyasında metin alanını arayın | “triggered too early” satırı olmamalı. |
Ad değiştirme işi sizin için kesinleştirir. Test sitesinde dil paketindeki .modosyasının adı değişince metin eklenti klasöründeki sürüme geçti, yani düzenlediğiniz dosya ekranınızda görünen dosya hiç olmamıştı.
Dosyanızın adını değiştirdiğinizde hiçbir şey değişmiyorsa WordPress onu okumuyordu; o zaman bir .l10n.phpdosyası, başka bir klasörde ikinci bir kopya ya da size eski sürümü sunan bir sayfa önbelleği arayın.
Tek .modosyasının adını değiştirdiğinizde PHP metniniz İngilizceye döner, betiğinizin metni ise Türkçe kalır; her metin türünün kendi dosyası olduğu için siz de her birine ayrı bakarsınız.
AIOWS nasıl yardımcı olur?
AIOWS Dil Derleyici
Dil Derleyici AIOWS çevirilerinizi yönetir, ama AIOWS bu çevirileri bu yazıdaki eklentiden farklı yüklediği için yukarıdaki tuzaklar sizin için farklı işler.
Bilerek önce kendi klasörünü okur.AIOWS, birlikte gönderdiği diller olan Almanca ve Türkçe için kendi languagesklasöründeki dosyayı yükler ve onu wp-content/languages/plugins/altındaki, kendi metin alanına ait bir dil paketinin yerine koyar. Oradaki eski bir paket yeni sürümle gelen metinleri gizleyemez: test sitesinde başka bir etiket taşıyan bir paket .move .l10n.phpolarak yerleştirildiğinde AIOWS ekranlarınızda hiçbir şey değişmedi.
Size neyin eksik olduğunu gösterir.Tarasekmesi AIOWS’un kodunu her PO dosyanızla karşılaştırır ve her yerel için çevrilmiş, boş, yinelenen ve eksik girdileri raporlar. Boşve Eksik kaynak kapsamısütunlarını okuyun: eksik olanı onlar gösterir; Kapsameksik bir metni hiçbir zaman %100’e yuvarlamaz.

msgfmt olmadan da güvenle derler.Derle, AIOWS PO dosyalarınızı MO dosyalarına dönüştürür; sunucunuz izin veriyorsa GNU msgfmtile, vermiyorsa kendi derleyicisiyle. İkisi de fuzzy ve çevrilmemiş girdileri dışarıda bırakır, yani yarım kalmış bir metin size boş bir yer değil, İngilizcesini gösterir.
Başka yerde düzenlediğiniz dosyayı alır.Yükle / Yönetsekmesi, örneğin Poedit’te düzenlediğiniz bir .poya da .modosyasını alır ve AIOWS’un onu okuduğu klasöre koyar. Aynı adlı dosya değiştirilir, ama oradaki her dosyayı aynı ekrandan indirebilirsiniz.
Sınırları açıkça şöyle. Derlerken eski .modosyasının yedeğini tutmaz; geri dönmek isteyebileceğiniz dosyayı önce indirin. Yalnızca AIOWS’un kendi languagesklasörüyle çalışır; öteki eklentilerinizin ve temanızın çevirilerini msgfmt, Poedit ya da WP-CLI ile siz derlersiniz. Yalnızca .modosyası yazar, .l10n.phpve betikler için JSON yazmaz. Başka eklentilerin nasıl yüklendiğini de incelemez: profil dilini, erken çağrıları ya da bir dosyanın ikinci kopyasını yukarıdaki doğrulamayla siz kontrol edersiniz.
AIOWS Dil Derleyici’yi inceleyinAIOWS planlarını karşılaştırın
Sık sorulanlar
Çeviriyi yükledim, önbelleği temizledim. Neden hâlâ İngilizce?Önce profil dilinize, sonra dosya adındaki tr_TR‘ye, sonra da wp-content/languages/plugins/içindeki bir dosyanın sizinkinin önüne geçip geçmediğine bakın.
translate.wordpress.org’da Türkçe çeviri var, sitemde neden yok?Çeviri %90 eşiğinin altındaysa o dil için paket oluşturulmaz; eksik metinleri orada tamamlayabilir ya da kendi tr_TRdosyanızı kullanabilirsiniz.
Eklenti ön yüzde çevrilmiş, yönetim panelinde değil. Neden?Yönetim panelinizi profil diliniz, herkese açık sayfalarınızı site dili belirler.
Kendi çevirim güncellemede korunur mu?Eklenti klasöründeki bir dosya, güncelleme o klasörü değiştirdiğinde gider; PO dosyanızı başka bir yerde saklayın ve güncellemelerden sonra yeniden derleyin.
Hangi metinlerin eksik olduğunu nerede görürüm?PO dosyanızda ya da düzenleyicinizin çevrilmemiş girdiler listesinde. AIOWS için Tarasekmesi bunları dil başına sayar. Dil dosyalarını okumanın ayrıntıları WordPress dil dosyaları nasıl taranır ve yönetiliryazısında.
Kaynaklar
- 6.7 sürümünde uluslararasılaştırma iyileştirmeleri (İngilizce) — Make WordPress Core
- 6.5 sürümünde I18N iyileştirmeleri, Performant Translations (İngilizce) — Make WordPress Core
- load_plugin_textdomain() (İngilizce) — WordPress Developer Resources
- wp_set_script_translations() (İngilizce) — WordPress Developer Resources
- Eklenti ve tema yazarları kılavuzu (İngilizce) — WordPress Polyglots Handbook



