【问题标题】:Use multiple domains in gettext in a PHP application在 PHP 应用程序的 gettext 中使用多个域
【发布时间】:2012-03-12 14:01:26
【问题描述】:

我所说的域是指 gettext 域。我有这个代码

$domain = "default";
$locale = 'en_US';
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain($domain, 'my_path'); 
bind_textdomain_codeset($domain, 'UTF-8');    
textdomain($domain);

所以它将使用 my_path/en_US/LC_MESSAGES/default.po

但我想使用超过 1 个文件,所以我可以 override 覆盖 default.po 中的值 使用另一个 po 文件,如 admin.po、blog.po 等

【问题讨论】:

  • override 是什么意思?您想在两个 .po 文件中定义相同的 msgid 吗?
  • 我猜他总是想加载default.mo,但也想加载特定页面的mo文件。在我看来,这是完全没有必要的,并且会使整个应用程序变得更加复杂而没有真正的收益。此外,您将无法在不同的 po 文件中重用字符串。例如,如果您在“admin.po”中有一个字符串“cancel”,稍后您在“blog.po”中也需要它,您将不得不复制它们,或者将它们移动到 default.po 等。太复杂了。 ..
  • 我不明白 domain 是什么意思,以及为什么我们需要 domain。能否给出一些解释或相关链接?

标签: php gettext


【解决方案1】:

首先定义所有您的域,如下所示:

bindtextdomain('domain1', DIR_LOCALE);
bindtextdomain('domain2', DIR_LOCALE);
bindtextdomain('domain3', DIR_LOCALE);
textdomain('domain1'); // set default domain for _() function

现在,如果您想从不同的域中获取字符串,您可以使用 dgettext()dcgettext()(如果不是来自 LC_MESSAGES)从不同的指定域中仅检索单个字符串。示例:

echo dgettext('domain2', "msgid");

【讨论】:

  • 是否需要为 DIR_LOCALE2 定义目录结构,例如 "loc2/en_US/LC_MESSAGES/default.po" "loc3/en_US/LC_MESSAGES/default.po"
  • 如果多个 mo 文件具有不同的 msgid,我如何将它们一起加载。每个 gettext 都对此提供支持吗?
  • 您必须在 dgettext 函数上使用函数第一个参数。我稍后会发布我的用例,但@DanMan 这是迄今为止更好的答案。
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多