加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

为Perl / Mason i18n进行字符串提取的自动化方法?

发布时间:2020-12-16 06:16:46 所属栏目:大数据 来源:网络整理
导读:我目前正致力于将一个非常大的Perl / Mason Web应用程序国际化,作为一个团队(这是否使这成为一个死亡之旅?).该应用程序已接近20年,并以相对老派的Perl风格编写;它不使用Moose或其他OO模块.我目前正计划使用 Locale::Maketext::Gettext进行消息查找,并使用GN
我目前正致力于将一个非常大的Perl / Mason Web应用程序国际化,作为一个团队(这是否使这成为一个死亡之旅?).该应用程序已接近20年,并以相对老派的Perl风格编写;它不使用Moose或其他OO模块.我目前正计划使用 Locale::Maketext::Gettext进行消息查找,并使用GNU Gettext目录文件.

我一直在尝试开发一些工具来帮助我们的bigass代码库中的字符串提取.目前,我所拥有的只是一个相对简单的Perl脚本,用于解析源代码查找字符串文字,向用户提示某些上下文以及字符串是否应标记为翻译,如果是,则标记它.

对于我需要标记的字符串而言,我可以忽略的字符串太多了.源中的许多字符串不是面向用户的,例如散列键或类型比较

if (ref($db_obj) eq 'A::Type::Of::Db::Module')

我对每个提议的字符串应用了一些启发式方法,看看我是否可以忽略它(例如,我忽略用于哈希查找的字符串,因为我们的代码库中99%的时间都不是面向用户的).然而,尽管如此,我的程序向我显示的大约90%的字符串是我不关心的.

有没有更好的方法可以帮助自动化我的字符串提取任务(即比从源中获取每个字符串文字更聪明的东西)?是否有任何可以处理Perl和Mason源的商业程序?

另外,我对一个优秀的工具有一个(相当愚蠢的)想法,我的工作流程如下.是否值得努力实现这样的事情(可能会非常快速地处理80%的工作),或者我应该提交一个艰苦,恼人的手动字符串提取过程?

>首先从源中提取每个字符串文字,然后将其放入Gettext PO文件中.
>然后,编写一个Mason插件来解析应用程序所服务的每个页面的HTML,目的是记录用户正在看到的字符串.
>使用应用程序中的地狱并尝试覆盖所有用例,构建面向用户的字符串存储.
>给定用户看到的这个字符串存储,对目录文件中的字符串进行模糊匹配,并跟踪与UI匹配的目录条目.
>最后,目录文件中未匹配的任何内容都可能不是面向用户的,因此请从目录中删除它们.

解决方法

我所知道的Perl工具没有智能提取可能需要国际化的字符串而不能提取国际化的字符串.您应该在编写代码时在代码中标记它们,但正如您所说,没有完成.

您可以使用PPI智能地进行字符串提取.

#!/usr/bin/env perl

use strict;
use warnings;

use Carp;
use PPI;

my $doc = PPI::Document->new(shift);

# See PPI::Node for docs on find
my $strings = $doc->find(sub {
    my($top,$element) = @_;
    print ref $element,"n";

    # Look for any quoted string or here doc.
    # Does not pick up unquoted hash keys.
    return $element->isa("PPI::Token::Quote")   ||
           $element->isa("PPI::Token::HereDoc");
});

# Display the content and location.
for my $string (@$strings) {
    my($line,$row,$col) = @{ $string->location };
    print  "Found string at line $line starting at character $col.n";
    printf "String content: '%s'n",string_content($string);
}


# *sigh* PPI::Token::HereDoc doesn't have a string method
sub string_content {
    my $string = shift;
    return $string->isa("PPI::Token::Quote")   ? $string->string :
           $string->isa("PPI::Token::HereDoc") ? $string->heredoc :
           croak "$string is neither a here-doc nor a quote";
}

您可以对字符串周围的标记进行更复杂的检查,以确定它是否具有重要意义.有关详细信息,请参见PPI::Element和PPI::Node.或者,您可以检查字符串的内容以确定它是否重要.

我不能走多远,因为“重要”取决于你.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读