创建可翻译的插件的最佳方法是什么?

它不必从一开始就进行翻译,但必须易于翻译,以便来自不同文化背景的开发人员都可以参与插件的本地化过程。

#1 楼

1.在编写时要牢记本地化

不要使用echoprint()产生文本输出,而应使用WordPress函数__()_e(): -php prettyprint-override“> /** 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()一起使用:准备.pot / .po / .mo文件

定义



.pot文件:由插件开发人员处理并且它被用作创建新翻译的起点,而WordPress则不使用它。

.po文件:是您或其他人开始并且可能已经完成的翻译文件,WordPress却没有使用它。

A.mo文件:每当您保存.po文件时,Poedit都会自动创建该文件。您可以使用这些文件进行的操作是,只要您创建或更新.po文件。 WordPress从.mo文件获取翻译。

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


项目信息:使用您(或您的团队)的信息,语言和国家/地区应与您的插件默认语言匹配。并添加/** 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; (我们将把语言文件存储在名为language的插件子目录中)


关键字:全部删除并添加...


将目录另存为__,并按更新按钮扫描插件文件中的可翻译文本。更新完成后,关闭该目录,除非您将新的可翻译字符串(即包含在_e/my_wordpress_blog/wp-content/plugins/my-plugin/languages/my-plugin.pot中)添加到插件中,否则无需更新该文件。现在让我们创建第一个翻译(我将使用fr_FR):

使用Podeit,从POT文件创建目录
(文件›从POT文件中新建目录...):


项目信息:使用您(或您的团队)信息,更改语言和国家,我将使用法语和法国
路径:请勿更改
关键字:请勿更改
/>
将目录另存为__()。翻译部分或全部字符串,再次保存.po文件,再上传.po和.mo文件。

请注意,每当您保存.po文件时,都会生成一个.mo文件,同样,.po文件的文件名至关重要,它由插件文本域(我的插件)和语言环境(fr_FR)的串联组成,请始终为插件命名您的.po文件,如下所示:[textdomain ]-[locale] .po,下面是一些示例:


意大利/意大利:_e()

葡萄牙/巴西:/my_wordpress_blog/wp-content/plugins/my-plugin/languages/my-plugin-fr_FR.po

阿拉伯语:wpcf7-it_IT.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');


wpcf7-pt_BR.po替换为wpcf7-ar.po函数的第一个和第三个参数中的插件名称。

4。测试并排除故障

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


字符串没有导入到.pot或.po文件中

→错误的目录设置(路径或关键字或二者兼有)
site

→缺少该语言的.mo文件或文件名错误
→未使用文本域(用my-plugin替换load_plugin_textdomain
→未加载文本域(使用示例上面带有正确参数的WP不会警告您有关错误的信息)




评论


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

–brasofilo
13年1月13日,0:27



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

–安德烈亚斯(Andreas)
13年5月8日在5:40

#2 楼

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


您的插件在WordPress.org插件存储库中
您愿意要求您的插件只能工作WordPress 4.6或更高版本。

步骤如下:如果尚未安装,请参见https://developer.wordpress.org/plugins/wordpress-org/how-your-readme-txt-works/
,将您的插件上传到WordPress插件存储库。请参阅https://wordpress.org/plugins/developers/add/。
查找插件的slug / text域。为此,请转到WordPress插件存储库上的插件页面。该网址将类似于https://wordpress.org/plugins/your-plugin-slug/。 URL的最后一部分“您的插件”是您的插件。这就是翻译功能的文本域所使用的内容。
在插件中使用WordPress的翻译功能(例如Requires at least: 4.6)。只要确保使用上一步中获得的正确的插件文本域即可。有关更多信息,请参见https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/。

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


通过您的插件解析所有可翻译的字符串(无需安装和运行Poedit或任何工具)
使任何人都可以轻松地在翻译时为您的插件提供翻译。 wordpress.org(无需拥有自己的网站来专门翻译您的插件,也无需具有定制的翻译程序即可将翻译提交给您的翻译程序)
当有人使用您的插件时,WordPress将负责检查其翻译内容转换成他们的语言,如果可以的话,以他们的语言显示(不需要他们,也不需要您将翻译文件加载到他们的网站上)

(我的博客文章的答案在这里:https:/ /cmljnelson.blog/2019/01/01/the-really-lazy-way-to-translate-a-wordpress-plugin/)

评论


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

–太空骆驼
19-3-25的1:21

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

– bodo
19年4月14日在9:40

好问题@bodo。如果某个插件指示使用wp.org存储库中另一个插件的文本域,我认为WordPress将很乐意使用wp.org插件的翻译文件。但是抱歉,我不确定。

–太空骆驼
19年4月23日在22:51