【问题标题】:Gettext placeholders获取文本占位符
【发布时间】:2011-07-23 16:21:04
【问题描述】:

我正在用 PHP + CodeIgniter 构建一个多语言应用程序。我已经决定使用 gettext 进行 UI 文本翻译,到目前为止,它已被证明是高效且易于使用的。

但现在我遇到了一件非常烦人的事情:gettext() 函数只接受一个参数,而我想要从 Zend Framework 的 gettext 适配器获得的类似 printf 的行为,我可以在其中使用 %1$s、@ 987654324@ 等作为占位符,然后将替换字符串指定为 Zend 视图的 translate() 函数的附加参数。

我不想放弃 gettext,因为 .po 文件和 poEdit 易于翻译管理(毕竟,我只需单击一下即可更新它)。我有哪些选择?

我已经尝试编写一个助手来与 gettext 交互:通过 gettext 运行第一个参数,然后在结果字符串上运行 strtr。您还有其他/更好的方法可以推荐吗?

【问题讨论】:

  • 我确实知道您说过您不想放弃 gettext,但您应该知道您可以一起使用 Zend_Translate 和 CI,而不会有太多麻烦。 The manual says 可以读取 .mo 文件。我不确定这些与.po 文件有何不同,因此我将其作为评论而不是答案发布的原因。手册确实说“POEdit”适用于该格式。
  • .mo.po 编译后的样子。 Gettext 读取.mo,但.po 是人​​类可读的,这就是您编辑的内容:)。是的,使用 Zend_Translate 绝对是一个值得考虑的选择。

标签: php internationalization gettext placeholder


【解决方案1】:

其实很简单,你可以像这样定义一个可变参数函数:

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

现在myGettext('%u %s in a %s', 3, 'monkeys', 'tree') 将返回预期的字符串,其中占位符替换为剩余的参数。您显然还需要实现一个复数感知函数来调用ngettext()

关于 poEdit,你必须修改它搜索的关键字,我上次使用它已经有一段时间了,但它很简单,我面临的唯一问题是识别关键字以支持复数 (see this)。

希望对你有帮助!

【讨论】:

  • 这或多或少是我的助手所做的,但代码更简单(单行与四行,呵呵)。 poEdit 确实可以定义关键字——这就是我在 Zend Framework 的translatesetLabelsetDescription 函数中获取可翻译字符串的方式:)。谢谢,我喜欢你的方法。
  • 这并不完全是一个“问题”,但是是的,我将我的助手更改为您建议的内容,它不仅像魅力一样工作,而且我也喜欢代码量它需要:D。再次感谢。
  • @mingos:哦,太好了。我很高兴我能提供一些帮助。 ;)
猜你喜欢
  • 2015-12-26
  • 2011-06-28
  • 2013-11-20
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 2020-05-27
相关资源
最近更新 更多