问题描述
创建一个翻译准备好的插件的最好方法是什么?
它不一定要从一开始就翻译出来,但它必须易于翻译,因此来自不同文化的其他开发人员可以参与插件的本地化过程。
最佳解决方案
写入本地化的想法
不要使用 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。