問題描述
我有一個父主題正確使用 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。