平台开发中,欢迎参与测试。你可以在 QQ群:1046115671 中与我们交流,或是直接在社区发帖。(PS:翻译平台暂不可用,如需参与翻译请仍前往 wp-china.org )

    wordpress.org的插件目录中,多语言插件信息的展现原理

    • 孙锡源
      楼主

      打算让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标签中包含的内容……

  • 孙锡源
    楼主

    目前litepress.cn上该功能的实现遇到了一个很难解决的问题。那就是通过爬虫爬取到的产品详情的文本是经过wordpress.org预处理过的,已经和glotpress里面的原文对应不上了……

    一个可能是解决方案是根据插件的readme.txt文件仿照wordpress.org的算法以生成原始html。

  • 孙锡源
    楼主

    至于逆向wordpress.org的预处理过程的话,是基本不现实的。

    举个例子,比如wordpress.org会把-转换为,而有的插件本身就是用的。于是我无法得知这个到底是wordpress.org转换的还是插件原本的,于是我无法对其逆向处理。

  • 孙锡源
    楼主

    刚蹲坑的时候突然茅塞顿开,还拿-举例子:我可以在翻译匹配时将网页文本和glotpress原文中的所有都先转换为-,这样无论是经过wordpress.org转移为了还是它原本就是都已经无所谓了,最后再执行正则匹配翻译就可以了。

  • 正在查看 3 条回复
    • 哎呀,回复话题必需登录。