WordPress的本地化最标准的手段是通过翻译文件进行翻译,之前写过一篇博客“WordPress很多插件不支持中文怎么办?”简单地介绍了实现方法。即使你不会写一行代码,也能通过Poedit这款软件对WP的主题和插件进行翻译。
不过有时候我们会需要对某个页面的某个字段,进行特别标注的翻译,不使用po文件里的翻译,这怎么实现呢?
其实很简单,通过gettext钩子,单独写一个函数返回特定的翻译内容即可:
1 2 3 4 5 6 | //from: https://blog.brain1981.com add_filter('gettext', 'brain1981_change_translation', 20, 3); function brain1981_change_translation( $translated_text, $untranslated_text, $domain ){ //... do something return $translated_text; } |
注意函数的最后一个参数$domain(域)其实可以用来限制修改文字的插件或主题,比如我们经常修改的WooCommerce的“域”,就是“woocommerce”,所以如果要修改WooCommerce的某个字段,比如用户主面板的标题,原文“Dashboard”,我想要改成“Main Panel”,就可以这样写代码:
1 2 3 4 5 6 7 8 9 10 11 12 | //from: https://blog.brain1981.com add_filter('gettext', 'brain1981_change_translation', 20, 3); function brain1981_change_translation( $translated_text, $untranslated_text, $domain ){ if( $domain == 'woocommerce'){ switch( $untranslated_text ) { case 'Dashboard': $translated_text = __( 'Main Panel','woocommerce' ); break; } } return $translated_text; } |
有些插件和主题的字段是带参数的,比如上面截图中的问候语,Hello brain shi(not brain shi? Log out)。这句话中的brain shi就是我的用户名,是一个参数,且出现了两次,这样的文本怎么修改呢?我们可以先用Poedit打开翻译文件,找到这个字符串,搜索带“Hello”的字符串就很快能找到:
字符串如下
Hello %1$s (not %1$s? <a href="%2$s">Log out</a>) |
这其中的%1$s就是姓名参数,%2$s是WooCommerce的登出连接参数,这些我们都应该保留,这里我举例要吧Hello换成Howdy,可以简单地用这样的代码:
1 2 3 4 5 6 7 | //from: https://blog.brain1981.com add_filter('gettext', 'brain1981_change_translation', 20, 3); function brain1981_change_translation( $translated_text, $untranslated_text, $domain ){ $translated_text = str_ireplace( 'Hello %1$s (not %1$s? <a href="%2$s">Log out</a>)', 'Howdy %1$s (not %1$s? <a href="%2$s">Log out</a>)', $untranslated_text ); //use str_ireplace to replace any specific text return $translated_text; } |
替换效果如下:
我们更可以用is_singular、is_admin、is_frontpage等模板探测函数,和$domain参数配合着用,实现精准的查找替换指定位置的文字,比如这样:
1 2 3 4 5 6 7 8 | //from: https://blog.brain1981.com add_filter('gettext', 'brain1981_change_translation', 20, 3); function brain1981_change_translation( $translated_text, $untranslated_text, $domain ){ if( $domain == 'woocommerce' && is_singular() ){ //... do something } return $translated_text; } |
大家可以进一步举一反三。
这样做的好处是可以不用修改翻译文件,直接在主题内插入少量代码,实现指定文字修改。因为如果主题或插件的作者正在维护翻译文件,你更新的翻译势必会被下一次的主题或插件更新所覆盖,就需要用本文的方式予以保留了。
本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.brain1981.com/3058.html。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。