打算让LitePress的翻译平台与应用市场联动,也就是说在翻译平台翻译了一个插件的描述信息后在应用市场自动调用译文展示。这样我们就可以凭借机器翻译来汉化整个WordPress仓库的所有插件的描述信息了。
最近我学乖了,一旦要实现什么新功能,而wordpress.org刚好有的时候,我就会在梳理自己的方案的同时去翻wordpress.org的源码,看看世界顶尖的高手们是如何实现这个功能的。这老实说也节省了我大量的试错时间。
废话先不多说了,wordpress.org的插件和主题目录多语言支持的原理很简单:他们实现了一个类似__()的translate_post_content函数,不过这个新实现的函数不是从mo文件读取翻译的,而是直接从GlotPress的数据中检索。
同时他们会在内容输出时为数据结果应用the_content过滤器:
apply_filters( 'the_content', $content[ $section_slug ], $section_slug )
这样之后就只需要在这个过滤器上挂上对应的函数来将原文内容传递给他们实现的translate_post_content函数进行翻译即可。
当然现在还有个问题——原文是包含HTML标签的一整段文字,我们还需要对DOM树进行解析,提取出内容文本。
PS:上面解析DOM树的方案是我一开始想的,后来看了wordpress.org的解决方案后,简直无地自容。
他们有这样一个函数:
public function mark_gp_original( $original_id, $original, $content ) {
$marker = "___TRANSLATION_{$original_id}___";
if ( $original === $content ) {
$content = $marker;
} else {
$original = preg_quote( $original, '/' );
if ( false === strpos( $content, '<' ) ) {
$content = preg_replace( "/b{$original}b/", $marker, $content );
} else {
$content = preg_replace( "/(<([a-z0-9]*)b[^>]*>){$original}(</\2>)/m", "${1}{$marker}${3}", $content );
}
}
return $content;
}
没错,直接不讲武德的用正则替换HTML标签中包含的内容……