Gettext占位符

6
我正在使用PHP + CodeIgniter构建一个多语言应用程序。我已经决定使用gettext进行用户界面文本翻译,到目前为止,它被证明是高效且易于使用的。
但现在我遇到了一个非常烦人的问题:gettext()函数只接受一个参数,而我想要像Zend Framework的gettext适配器一样获得类似printf的行为,其中我可以使用%1$s、%2$s等作为占位符,然后将替换字符串指定为Zend视图的translate()函数的附加参数。
由于.po文件和poEdit的简单翻译管理(毕竟我可以通过单击更新它),我不希望放弃gettext。有什么选择吗?
我已经尝试编写一个助手与gettext交互:将第一个参数传递给gettext,然后对结果字符串运行strtr。您会推荐其他/更好的方法吗?

我知道你说你不想放弃gettext,但你应该知道你可以在不太麻烦的情况下同时使用Zend_Translate和CI。手册上说它可以读取.mo文件。我不确定它们与.po文件有什么不同,这就是为什么我将其发布为评论而不是答案的原因。手册确实说“POEdit”可以使用该格式。 - Charles
.mo 是在编译 .po 后生成的文件。Gettext 读取 .mo,但是 .po 是人类可读的,这是你需要编辑的 :). 是的,考虑使用 Zend_Translate 绝对是一个不错的选择。 - mingos
1个回答

7

实际上很简单,您可以像这样定义一个可变参数函数:

function myGettext($id)
{
    return vsprintf(gettext($id), array_slice(func_get_args(), 1));
}

现在执行myGettext('%u %s in a %s', 3, 'monkeys', 'tree')将返回一个字符串,其中占位符由剩余的参数替换。您显然还需要实现一个调用ngettext()的复数感知函数。
关于poEdit,您需要修改它搜索的关键字。我很久以前就用过它,但是它非常简单,我面临的唯一问题是识别支持复数的关键字(请参见这个)。
希望这有所帮助!

这大致就是我的助手所做的事情,但代码更简单(一行代码而不是四行,呵呵)。poEdit确实有定义关键字的可能性 - 这就是我如何在Zend Framework的translatesetLabelsetDescription函数中捕获可翻译字符串的方式 :). 谢谢,我喜欢你的方法。 - mingos
这并不是一个“问题”,但是我按照你的建议更改了我的辅助程序,现在它不仅像魔法一样工作,而且我也很喜欢它所需的代码量:D。再次感谢。 - mingos
@mingos:哦,太好了。我很高兴能帮到你。 ;) - Alix Axel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接