如何准备WordPress插件翻译?


Answers:


38

1.考虑本地化

不要使用echoprint()产生文本输出,而是使用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 <用户名>”?

__()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文件,就可以上传或重新上传它们。 WordPress从.mo文件获取翻译

打开Poedit并使用以下设置创建一个新目录 (文件›新目录...)

  • 项目信息:使用您(或您的团队)信息,语言和国家/地区应与您的插件默认语言匹配
  • 路径:
    • 基本路径: .
    • 路径:全部删除并添加..,(我们会将语言文件存储在名为language的插件子目录中)
  • 关键字:全部删除并添加___e

目录另存为,然后按更新按钮扫描插件文件中的可翻译文本。更新完成后,关闭该目录,除非您将新的可翻译字符串(即或)添加到插件中,否则无需更新该文件。/my_wordpress_blog/wp-content/plugins/my-plugin/languages/my-plugin.pot__()_e()

现在让我们创建第一个翻译(我将使用fr_FR):

使用Podeit创建一个从POT文件目录 (文件>从POT文件添加新目录...)

  • 项目信息:使用您(或您的团队)的信息,更改语言和国家,我将使用法语和法语
  • 路径:不变
  • 关键字:不要乱撞

目录另存为。翻译部分或全部字符串,再次保存 .po文件,然后上传 .po和.mo文件。/my_wordpress_blog/wp-content/plugins/my-plugin/languages/my-plugin-fr_FR.po

请注意,每当您保存一个.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');

my-pluginload_plugin_textdomain函数的第1和第3参数中用您的插件名称替换。

4.测试并排除故障

可能无法正常工作的一些原因:

  • 字符串不会导入到.pot或.po文件中
    • →错误的目录设置(路径或关键字或两者)
  • 文字未在WordPress网站上翻译
    • →缺少该语言的.mo文件或文件名错误
    • →未使用文本域(替换_e('my text')_e('my text', 'my-plugin')
    • →未加载文本域(使用上面带有正确参数的示例,WP不会警告您错误)

3
+1不错的文章:)看一下本文:以正确的方式加载WordPress语言文件,“ 减轻在WordPress中加载语言文件的痛苦的实用准则 ”。:::::: GlotpressPolyglots组可能也值得一提。
brasofilo

感谢您的指导!值得一提的是,在每个使用_e()和__()的方法中都需要调用load_plugin_textdomain()
Andreas

2

Nabil的答案相当完整,但提供了一个简单的变体:

  1. 您的插件在WordPress.org插件存储库中

  2. 您愿意要求您的插件只能与WordPress 4.6或更高版本一起使用。

步骤如下:

  1. 在您插件的readme.txt文件中,添加 Requires at least: 4.6。参见https://developer.wordpress.org/plugins/wordpress-org/how-your-readme-txt-works/

  2. 如果尚未将插件上传到WordPress插件存储库。参见https://wordpress.org/plugins/developers/add/

  3. 查找插件的子域/文本域。为此,请转到WordPress插件存储库上的插件页面。该网址将类似于https://wordpress.org/plugins/your-plugin-slug/。URL的最后一部分“ your-plugin-slug”是您的插件的slug。这就是您用于翻译功能的文本域的方式。

  4. 在插件中使用WordPress的翻译功能(如__e(‘hello’, ‘my-plugin-domain’);)。只要确保使用上一步中获得的正确的插件文本域即可。有关更多信息,请参见https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/

如果执行上述步骤,WordPress将负责:

  • 通过您的插件解析所有可翻译的字符串(无需安装和运行Poedit或其他任何工具)
  • 使任何人都可以轻松地在translate.wordpress.org上贡献您的插件的翻译(无需拥有自己的专用于翻译您的插件的网站,或具有自定义流程的翻译人员将翻译提交给您)
  • 当有人使用您的插件时,WordPress将负责检查是否将其翻译成他们的语言,如果是,则以他们的语言显示(不需要他们,或者您将翻译文件加载到他们的网站上)

(从我的博客文章中回答:https : //cmljnelson.blog/2019/01/01/the-really-lazy-way-to-translate-a-wordpress-plugin/


我不确定为什么这被否决了。这是我为使wordpress.org/plugins/print-my-blog准备就绪(并且插件已成功翻译)而所做的工作
thespacecamel

这是否意味着如果某个插件/主题不在WordPress插件存储库中,而是在其中使用了插件的文本域,则wordpress会加载错误的翻译文件?
bodo

好问题@bodo。如果某个插件指示使用wp.org仓库中另一个插件的文本域,我认为WordPress将很高兴使用wp.org插件的翻译文件。但是抱歉,我不确定。
thespacecamel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.