問題描述

我有一個父主題正確使用 load_theme_textdomain()加載所有翻譯的字符串在許多語言。

然後我創建了一個使用 load_child_theme_textdomain()的子主題,為其字符串實現同樣的功能。

在父主題中有一些特定語言的翻譯字符串,我想在子主題中替換/覆蓋。

我知道如果他們在一個模板文件,我可以替換文件,只是改變這些字符串的文本域,但不幸的是,我在説的是在許多地方,也在儀錶板中使用 (所以在一些過濾器/動作功能) 。

所以我的問題是:有沒有辦法替換這些翻譯的字符串的子主題,而不必替換父模板文件或函數?

我不知道,也許在這個孩子主題的 languages 文件夾裏面添加一個 parent-theme.mo 文件,只有這些字符串被翻譯,或者是這樣的。

最佳解決方案

我想我找到了一個解決方案,但之前有一點

Premise

load_theme_textdomain()load_child_theme_textdomain()基本相同,唯一的區別是使用默認路徑:

  • 他們獲得當前語言 (使用 get_locale()),並將相對的.mo 文件添加到作為參數傳遞的路徑;

  • 然後他們將 load_textdomain()作為參數傳遞給.mo 文件的文本域和生成的路徑。

然後 load_textdomain 將.mo 文件加載到全局文本域變量中,但是我們可以從 source 讀取:

If the domain already exists, the translations will be merged.

If both sets have the same string, the translation from the original value will be taken.

因此,為了覆蓋/替換我們想要的主題父項的字符串,我們需要在父主題加載.mo 文件之前加載父文本域的自定義.mo 文件,其中只包含那些已翻譯的字符串。


解決方案

最後,我創建了一個文件夾,其父主題名稱 (僅為了方便起見) 到子主題語言文件夾中,並將其自定義的.mo 文件放在父文本域中 (一個用於語言,在 xx_XX.mo 表單中) ,其中 xx_XX 是語言代碼) 。

然後在 after_setup_theme 操作期間在我的小孩主題 functions.php 文件中添加了一行,靠近為我的子主題文本域加載.mo 文件的行:

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' );
} );

因為孩子主題的 functions.php 文件是在父母之前加載的,所以這組字符串將優先於父主題翻譯 (或者我可以使用 add_action 函數的第三個參數設置優先級) 。


注意:我可以使用 load_child_theme_textdomain 而不是 load_theme_textdomain,如前所述,它將是一樣的。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。