我正在使用 PHP 的 gettext 函数进行本地化。我正在使用 Poedit 进行实际翻译,凭借其“从源代码更新”功能,提取所有需要翻译的字符串真的很容易 - 除了 heredoc 语法之外。
Poedit 使用 xgettext 程序从 PHP 源文件生成 .po 文件。当 PHP 代码如下所示时,它可以很好地工作:
echo "<h1>". _("test") ."</h1>";
但是下面的内容没有被提取出来(注意需要使用一个伪 t-object):
echo <<<EOD
<h1>{$->_('test')}
EOD;
在 PHP 代码中,您可以通过以下方式解决该问题:
<?php
$t = _('test');
echo <<<EOD
<h1>$t</h1>
EOD
?>
但我真的更希望 xgettext 程序可以从 heredoc block 中提取字符串。
A workaround for that has been suggested在 PHP 文档注释中。解决方法是告诉 xgettext 程序将 PHP 源文件视为 Python 代码。但是在 Poedit 中使用这种方法会导致 xgettext 解析器出现很多语法错误。
有谁知道让 xgettext 从 PHP heredoc 语法中提取翻译的解决方法?
已在 gettext 项目的工单系统上打开了一个有点相关的工单:http://savannah.gnu.org/bugs/?27740这是否表明可以改进对 heredoc 语法的支持?
最佳答案
我是您在帖子中提到的 gettext 票证的记者。 当我提交票证时,我的想法完全不同,更多的是这样的:
<?php
$msg = _(<<<TXT
He said: "Hello world!".
TXT
);
?>
Gettext 不能从这样的 heredoc/nowdoc 字符串中提取文本,但这在翻译大段文本时非常有用。
就我而言,我在 CLI PHP 脚本中使用 gettext 来翻译包含 XML 标记的文本 block 。该标记是原始文本的一部分,也必须进行翻译。必须手动转义标记中的每一个引号或撇号使得消息在 POedit 或任何其他编辑器中很难阅读。
在您的情况下,您似乎希望提取 (heredoc/nowdoc) 字符串中的内插代码。通过在实际使用插值之前准备文本,您可以轻松解决此问题:
<?php
$t = _('test');
echo <<<EOD
<h1>$t</h1>
EOD
?>
我不认为这应该被视为错误,因为与您使用 heredoc 语法发布的代码完全等价的是:
<?php
echo "<h1>{$t->_('test')}</h1>";
?>
gettext 也无法从中提取“测试”消息。
关于php - 从 PHP heredoc 语法中提取 gettext 翻译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2227880/
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
在Ruby类中,我重写了三个方法,并且在每个方法中,我基本上做同样的事情:classExampleClassdefconfirmation_required?is_allowed&&superenddefpostpone_email_change?is_allowed&&superenddefreconfirmation_required?is_allowed&&superendend有更简洁的语法吗?如何缩短代码? 最佳答案 如何使用别名?classExampleClassdefconfirmation_required?is_a
可能已经问过了,但我找不到它。这里有2个常见的情况(对我来说,在编程Rails时......)用ruby编写是令人沮丧的:"astring".match(/abc(.+)abc/)[1]在这种情况下,我得到一个错误,因为字符串不匹配,因此在nil上调用[]运算符。我想找到的是比以下内容更好的替代方法:temp="astring".match(/abc(.+)abc/);temp.nil??nil:temp[1]简而言之,如果不匹配,则简单地返回nil而不会出错第二种情况是这样的:var=something.very.long.and.tedious.to.writevar=some
我正在学习Ruby的基础知识(刚刚开始),我遇到了Hash.[]method.它被引入a=["foo",1,"bar",2]=>["foo",1,"bar",2]Hash[*a]=>{"foo"=>1,"bar"=>2}稍加思索,我发现Hash[*a]等同于Hash.[](*a)或Hash.[]*一个。我的问题是为什么会这样。是什么让您将*a放在方括号内,是否有某种规则可以在何时何地使用“it”?编辑:我的措辞似乎造成了一些困惑。我不是在问数组扩展。我明白了。我的问题基本上是:如果[]是方法名称,为什么可以将参数放在括号内?这看起来几乎——但不完全是——就像说如果你有一个方法Foo.d
我正在尝试使用ruby编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?
Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba
这个问题在这里已经有了答案:WhatisRuby'sdouble-colon`::`?(12个答案)关闭8年前。什么是::?@song||=::TwelveDaysSong.new
在添加一些空格以使代码更具可读性时(与上面的代码对齐),我遇到了这个:classCdefx42endendm=C.new现在这将给出“错误数量的参数”:m.x*m.x这将给出“语法错误,意外的tSTAR,期待$end”:2/m.x*m.x这里的解析器到底发生了什么?我使用Ruby1.9.2和2.1.5进行了测试。 最佳答案 *用于运算符(42*42)和参数解包(myfun*[42,42])。当你这样做时:m.x*m.x2/m.x*m.xRuby将此解释为参数解包,而不是*运算符(即乘法)。如果您不熟悉它,参数解包(有时也称为“spl