問題描述
創建一個翻譯準備好的插件的最好方法是什麼?
它不一定要從一開始就翻譯出來,但它必須易於翻譯,因此來自不同文化的其他開發人員可以參與插件的本地化過程。
最佳解決方案
寫入本地化的想法
不要使用 echo 或 print()來產生文本輸出,而是使用 WordPress 函數__()和_e():
/** Not localization friendly */
echo "Welcome to my plugin";
// OR
print("Welcome to my plugin");
/** Localization friendly */
_e('Welcome to my plugin', 'my-plugin');
// OR
$my_text = __('Welcome to my plugin', 'my-plugin');
echo $my_text;
_e()和__()將提供當前語言的翻譯作為第一個參數提供的文本。 _e()將輸出文本,而__()將返回。
第二個參數是文本域,您將使用它來告訴 WordPress,作為第一個參數提供的文本屬於此插件,您可以使用任何您想要的名稱,但我更喜歡使用與我用於插件的名稱相同的名稱目錄文件,我覺得它比較直觀。
如何輸出動態文本:「Hello< username>」?
用__()和 sprintf():
/** Get the username */
$username = 'Magictrick';
/** Not localization friendly */
echo "Hello $username";
/** Localization friendly */
printf(__('Hello %s', 'my-plugin'), $username);
// OR
$my_text = sprintf(__('Hello %s', 'my-plugin'), $username);
echo $my_text;
2. 準備.pot /.po /.mo 文件
定義
-
.pot 文件:由插件開發人員處理,它用作創建新翻譯的起點,WordPress 不使用它。
-
.po 文件:您或其他人啓動的翻譯文件,可能已完成,WordPress 不會使用它。
-
A.mo 文件:當您保存.po 文件時,由 Poedit 自動創建,只要您創建或更新.po 文件,您可以使用這些文件進行上傳,即可上傳 re-upload 。 WordPress 從.mo 文件獲取翻譯。
打開 Poedit 並創建一個新的目錄 (文件> 新 Catallog …) 與這些設置:
-
項目信息:使用您 (或您的團隊) 信息,語言和國家/地區應符合您的插件默認語言
-
路徑:
-
基本路徑:
. -
路徑:刪除所有& 添加
..,(我們將把語言文件存儲在一個名為 languages 的 plugin 子目錄中)
-
-
關鍵字:刪除所有& 加入
__和_e
將目錄保存為/my_wordpress_blog/wp-content/plugins/my-plugin/languages/my-plugin.pot,並通過按更新按鈕掃描您的插件文件以進行可翻譯的文本。更新完成後關閉該目錄,您不需要更新該文件,除非您添加新的可翻譯字符串 (即__()或_e()) 插入到您的插件。
現在我們來創建第一個翻譯 (我將使用 fr_FR):
使用 Podeit,從 POT 文件創建目錄 (文件> POT 文件中的新目錄…):
-
項目信息:使用您 (或您的團隊) 信息,更改語言和國家,我將使用法國和法國
-
路徑:不要改變
-
關鍵詞:別開玩笑
將目錄保存為/my_wordpress_blog/wp-content/plugins/my-plugin/languages/my-plugin-fr_FR.po 。翻譯部分或全部字符串,再次保存.po 文件,同時上傳.po 和.mo 文件。
請注意,每當保存.po 文件時,.mo 文件都將使用相同的名稱生成,所以.po 文件的文件名至關重要,它由插入文本域 (my-plugin) 和語言區域設置 (fr_FR) 的連接組成, ,總是為你的.po 文件命名這樣的插件:[textdomain] – [locale] .po,這裏有一些例子:
-
意大利語/意大利語:
wpcf7-it_IT.po -
葡萄牙語/巴西:
wpcf7-pt_BR.po -
阿拉伯語:
wpcf7-ar.po… 是的!
每當插件使用新文本更新時,請更新 po 文件,翻譯新字符串並重新上傳.po 和.mo 文件
3. 指示插件加載當前語言的翻譯文本
在插件的某處,您必須告訴 WordPress 使用您的.mo 文件,您可以在插件文件的開頭使用此代碼:
function my_plugin_init() {
load_plugin_textdomain( 'my-plugin', false, 'my-plugin/languages' );
}
add_action('init', 'my_plugin_init');
在 load_plugin_textdomain 功能的第 1 和第 3 參數中用插件名替換 my-plugin 。
4. 測試和排除故障
某些原因可能無法正常工作:
-
字符串不會導入到.pot 或.po 文件中
-
â†「錯誤的目錄設置 (路徑或關鍵字或兩者)
-
-
文字未在 WordPress 網站上翻譯
-
→.mo 文件丟失或文件名錯誤
-
→未使用文本域 (用
_e('my text', 'my-plugin')替換_e('my text')) -
→文本域未加載 (使用正確的參數上面的示例,WP 不會警告你有關錯誤)
-
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。