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

论坛首页 论坛 经验分享 wordpress.org的插件目录中,多语言插件信息的展现原理

正在查看 3 条回复
  • 作者
    帖子
    • #20807
      孙锡源
      管理员
        @ibadboy
        楼主
        坏蛋的博客
        ibadboy.net

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

      • #20835
        孙锡源
        管理员
          @ibadboy
          楼主
          坏蛋的博客
          ibadboy.net

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

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

        • #20836
          孙锡源
          管理员
            @ibadboy
            楼主
            坏蛋的博客
            ibadboy.net

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

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

          • #20837
            孙锡源
            管理员
              @ibadboy
              楼主
              坏蛋的博客
              ibadboy.net

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

              • #20872
                耗子
                管理员
                  @haozi
                  耗子博客
                  hzbk.net

                  下次把床搬进厕所,不用出来了。解决问题嗖嗖的。

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