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

为PerlMason i18n进行字符串提取的自动化方法?,第1张

概述我目前正致力于将一个非常大的Perl / Mason Web应用程序国际化,作为一个团队(这是否使这成为一个死亡之旅?).该应用程序已接近20年,并以相对老派的Perl风格编写;它不使用Moose或其他OO模块.我目前正计划使用 Locale::Maketext::Gettext进行消息查找,并使用GNU Gettext目录文件. 我一直在尝试开发一些工具来帮助我们的bigass代码库中的字符串 我目前正致力于将一个非常大的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 perluse strict;use warnings;use Carp;use PPI;my $doc = PPI::document->new(shift);# See PPI::Node for docs on findmy $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 methodsub 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.或者,您可以检查字符串的内容以确定它是否重要.

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

总结

以上是内存溢出为你收集整理的为Perl / Mason i18n进行字符串提取的自动化方法?全部内容,希望文章能够帮你解决为Perl / Mason i18n进行字符串提取的自动化方法?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1239315.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存