Alt temada üst tema çevirisini geçersiz kıl


12

load_theme_textdomain()Birçok dilde çevrilmiş tüm dizeleri yüklemek için doğru bir şekilde kullanan bir ana tema var .

Sonra load_child_theme_textdomain()dizeleri için aynı şeyi elde etmek için kullanılan bir çocuk teması oluşturdum .

Ana temada, alt temada değiştirmek / geçersiz kılmak istediğim belirli bir dil için belirli çevrilmiş dizeler var.

Bir şablon dosya üzerinde olup olmadığını biliyorum Ben dosyayı değiştirmek ve sadece bu dizeleri için textdomain değiştirmek, ama ne yazık ki bahsettiğim olanlar birçok yerde ve aynı zamanda kontrol panelinde kullanılır (yani bazı filtre / eylem fonksiyonları içinde ).

Benim sorum şu: alt şablon dosyalarını veya işlevlerini değiştirmek zorunda kalmadan alt temanın içindeki bu çevrilmiş dizeleri değiştirmenin bir yolu var mı?

Bilmiyorum, belki alt temanın diller klasörü içine bir parent-theme.mo dosyası ekleyerek sadece bu dizeleri ya da bunun gibi bir şey ekleyerek bilmiyorum .

Yanıtlar:


9

Sanırım bir çözüm buldum, ama biraz önce

Öncül

load_theme_textdomain()ve load_child_theme_textdomain()temel olarak eşittir, tek fark kullandıkları varsayılan yoldur:

  • geçerli dili alırlar (kullanarak get_locale()) ve göreli .mo dosyasını argüman olarak iletilen yola eklerler ;
  • daha sonra load_textdomain()hem textdomain hem de sonuçta ortaya çıkan .mo dosyasına giden yolu bağımsız değişken olarak çağırırlar.

Sonra load_textdomain.mo dosyasını genel textdomain değişkenine yükler, ancak kaynaktan okuyabileceğimiz gibi :

Alan adı zaten mevcutsa çeviriler birleştirilir.

Her iki kümede de aynı dize varsa, orijinal değerden çeviri alınır.

Bu nedenle, yalnızca istediğimiz tema üst öğesinin dizelerini geçersiz kılmak / değiştirmek için , üst tema .mo dosyasını yüklemeden önce , yalnızca çevrilen dizeleri içeren üst metin alanı için özel bir .mo dosyası yüklememiz gerekir .


Çözüm

Sonunda, alt tema dilleri klasörüne ana temanın adını (sadece kolaylık sağlamak için) içeren bir klasör oluşturdum ve içine üst metin alanı için özel bir .mo dosyaları (dilde, xx_XX.moformda, xx_XXdil kodu nerede ).

Sonra eylem functions.phpsırasında after_setup_themealt tema dosyama, alt tema metin etki alanı için .mo dosyasını yükleyen satırın yanına bir satır ekledim :

add_action( 'after_setup_theme', function () {
    // load custom translation file for the parent theme
    load_theme_textdomain( 'parent-textdomain', get_stylesheet_directory() . '/languages/parent-theme' );
    // load translation file for the child theme
    load_child_theme_textdomain( 'my-child-theme', get_stylesheet_directory() . '/languages' );
} );

Alt functions.phptemanın dosyası üst öğeden önce yüklendiğinden, bu dizeler üst tema çevirisine göre önceliğe sahip olacaktır (veya add_actionişlevin üçüncü parametresini kullanarak önceliği ayarlayabilirdim ).


Not: Öncüllerde aynı olacağını söylediğim gibi kullanmak load_child_theme_textdomainyerine kullanabilirdim load_theme_textdomain.


4

Alt tema klasörünüzdeki dil dosyalarını kullanabilirsiniz. Öncelikle üst temanın hangi metin alanını kullandığını bilmelisiniz. Ardından .po ve .mo dosyalarını yalnızca adınızla dosya adı olarak oluşturun (örn. De_DE.po / de_DE.mo veya nl_NL.po / nl_NL.mo) ve alt tema dizininizdeki "diller" Örneğin.

Daha sonra metin alanını şu şekilde başlatabilirsiniz load_child_theme_textdomain():

load_child_theme_textdomain( 'the_text_domain', get_stylesheet_directory() . '/languages/' );

Üst tema PHP dosyaları gibi __()veya _e()içindeki işlev çağrılarını arayarak metin alanını bulabileceğinizi unutmayın . İkinci parametre metin alanıdır:__( 'Translated text string', 'text_domain' );


thanks @redelschaap, sonunda alt textdomain için kullandığınız birinden üst textdomain için farklı bir klasör kullandığınız sürece çözüm işe yarayacaktı: bu yakalamak oldu! :)
d79

Alt temanızın içinden birden çok metin alanı yükleyebilirsiniz. Ancak, aynı tema için dosyaları yüklerken çeviriler birleştirildiğinden, tüm çeviriler için üst tema metin alanını da kullanabilirsiniz.
redelschaap

0

Wordpress 5.0.1 için 2019 güncellemesi.

  1. Dosyalarda ebeveyn veya çocuk sümüğü bulunmamalıdır. Örneğin, İspanyolca Meksika çevirisi sağlamanın child-theme-name / diller / es_MX.po ve /child-theme-name/languages/es_MX.mo dosyalarına sahip olması gerekir
  2. Child theme function.php dosyasının aşağıdaki kodu olması gerekir. Load_child_theme_textdomain () işlevinin ilk parametresinin çocuğun değil PARENT tema bilgi dosyası olduğuna dikkat edin:
function child_theme_slug_setup() {
    load_child_theme_textdomain( 'parent-theme-slug', get_stylesheet_directory() . '/languages' );
}
add_action( 'after_setup_theme', 'child_theme_slug_setup' );
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.