即取即用地修改WordPress插件、主题的字段翻译

本站所有文章均为博主人工写作,绝无AI辅助成分,请放心参阅。

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;
}

即取即用地定制WordPress插件、主题的字段翻译

有些插件和主题的字段是带参数的,比如上面截图中的问候语,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。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

关注我们的微信公众号-JennyStudio 本站记录了近几年的工作中遇到的一些技术问题和解决过程,“作品集”还收录了本人的大部分作品展示。除了本博客外,我们的工作室网站 – JennyStudio,内有更多作品回顾和展示。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注