【发布时间】:2015-03-28 13:16:52
【问题描述】:
我正在使用 CakePHP 2.6.x
我的应用已本地化为法语和英语。英语是默认设置。
我的翻译文件目前如下所示:
/app/Locale/eng/LC_MESSAGES/default.po
/app/Locale/fra/LC_MESSAGES/default.po
在我看来,我通常可以像这样显示当前语言的本地化文本:
echo __("Foo");
但是,在某些情况下,我需要覆盖当前语言并返回特定语言的翻译。我的理解是__d() 就是为了这个。但是,以下内容对我不起作用:
echo __d("fra", "Foo");
[更正:__d 不是为了这个。]
这似乎总是返回当前语言的翻译。基本上只是链接__()。
经过多次反复试验,我重命名了法语 .PO 文件...
/app/Locale/fra/LC_MESSAGES/fra.po
...然后__d("fra", "Foo"); 确实按预期工作。但随后__() 不再 工作了。更改文件名后,__() 的所有实例都以默认语言返回文本。
我做错了什么?如何让__d() 和_() 同时工作?或者问同样问题的另一种方式:如何在同一请求中更改 __() 使用的语言?
更新
我的第一直觉是尝试一下 Lars 在下面建议的方法。但由于某种原因,它不起作用。我在电子邮件视图中执行以下操作:
Configure::write("Config.language", "fra");
$this->log(Configure::read("Config.language")); //'fra'
$this->log( __("yes") ); //'yes'
请注意,配置语言设置正确。但是__() 会忽略它,并且无论如何都会呼应当前的语言。 (顺便说一句,我检查过,是/oui 在 PO 文件中)
【问题讨论】:
-
可能的快速解决方法:在 LC_MESSAGES 目录中创建一个从 default.po 到 fra.po 的符号链接,例如
ln -s default.po fra.po. -
@marian0 嗯。那个黑客可能会奏效,但我怀疑它会在未来给我带来痛苦:-)。我真的需要弄清楚我做错了什么导致 Cake 的 l10n 不能按预期工作。
-
我认为您尝试做的事情是不可能的。
__d函数不用于覆盖语言,它用于选择另一个语言文件在当前设置的语言中。 -
不,恐怕不会。您可以在执行
__之前切换语言,然后再切换回来,我猜。当你选择走这条路时,你想达到什么目标? -
如果配置的语言没有被使用,尽管有正确的文件可用,请检查会话中是否设置了语言(
CakeSession::read('Config.language')),这是在Configure上使用的,并确保您在更改翻译后已清除缓存tmp/cache/persistent。
标签: php cakephp localization internationalization gettext