CakePHP 本地化拒绝工作
Posted
技术标签:
【中文标题】CakePHP 本地化拒绝工作【英文标题】:CakePHP localization refuses to work 【发布时间】:2015-01-18 21:24:26 【问题描述】:我正在使用 Cakephp v2.5.6,我正在关注 this documentation 关于 CakePHP 本地化。我已经阅读了 100 遍,但仍然无法正常工作!
使用蛋糕控制台i18n
任务,我创建了以下文件...
app/Locale/default.pot
app/Locale/fra/LC_MESSAGES/default.po
app/Locale/fra/LC_MESSAGES/default.mo
...我使用 Poedit 翻译了一些字符串(用于测试):
在 bootstrap.php 我有:
Configure::write('Config.language', 'fra');
(我也尝试将它放在我的 AppController 的 beforeFilter()
中,但也没有用)
在我看来,我有:
<?php
Debugger::dump( Configure::read('Config.language') );
Debugger::dump( CakeSession::read('Config.language') );
echo __('Find a Place');
?>
但是当我加载页面时,我只看到:
'fra'
null
Find a Place
为什么??????!!!!!!
更新 1 @ndm 提出了一些关于缓存的担忧......
在我的持久缓存中出现以下文件:
.../temp/cache/persistent/myapp_cake_core_cake_fra
.../temp/cache/persistent/myapp_cake_core_default_fra
.../temp/cache/persistent/myapp_cake_core_file_map
.../temp/cache/persistent/myapp_cake_core_method_cache
更新 2 按照@ndm 的建议,我删除了 .po 文件中除了一个翻译之外的所有内容,并且成功了!
# LANGUAGE translation of CakePHP Application
# Copyright YEAR NAME <EMAIL@ADDRESS>
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"POT-Creation-Date: 2014-11-20 11:30-0500\n"
"PO-Revision-Date: 2014-11-20 11:43-0500\n"
"Last-Translator: SDP\n"
"Language-Team: <EMAIL@ADDRESS>\n"
"Language: fr_CA\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 1.6.10\n"
#: View/Elements/nav--main.ctp:3
#, fuzzy
msgid "Find a Place"
msgstr "Trouver une place"
显然我的文件有问题,但这很奇怪,因为它是由 Poedit 生成的全新文件,并且它通过“验证”功能没有问题。它只是说还有很多条目尚未翻译。
我从文件中删除的行如下所示:
...
#: Controller/FavoritesController.php:38;73;101
msgid "Invalid favorite"
msgstr ""
#: Controller/FavoritesController.php:53;77
msgid "The favorite has been saved."
msgstr ""
#: Controller/FavoritesController.php:56;80
msgid "The favorite could not be saved. Please, try again."
msgstr ""
...
这有什么问题吗?
【问题讨论】:
第一步尝试删除缓存 (app/tmp/cache/persistent
)。
@ndm 好主意。但这并没有改变任何东西。
其他一些事情要尝试,检查是否正在生成有效的缓存文件(*_default_fra),使用一个手动创建的 .po
文件进行测试,该文件仅包含一个 msgid/msgstr 对,检查是否会话中设置了一个区域设置 (CakeSession::read('Config.language')
),因为这将优先(并且不要忘记测试之间的清除缓存:))。
@ndm 啊哈!我在上面发布了缓存文件,CakeSession
返回null
,我认为这是正确的,因为我还没有设置它......但是砍掉 .po 文件中的所有额外条目有效!剩下的一个有效!很明显,该文件有问题。但我无法想象是什么。它是从 i18n cake 任务输出的 .pot 文件生成的全新文件。有很多缺失的条目是一个问题吗?我以为应该没问题的。任何想法如何调试 .po 文件?
您现在是否只使用.po
文件,即您是否删除了.mo
文件?在这种情况下,问题可能是条目被标记为fuzzy
,这通常会导致它不会被编译到.mo
文件中,除非明确要求(对于msgfmt
,这将是-f, --use-fuzzy
选项,不确定 poedit 如何编译文件)。今晚就是这样,该睡觉了:)
【参考方案1】:
未编译模糊条目
因此,正如我们在 cmets 中发现的那样,这里的问题是有问题的翻译已被标记为 fuzzy
,并且这些条目不会被编译到 .mo
文件中,除非使用 -f
明确请求或--use-fuzzy
标志与msgfmt
。
当 .pot
和 po
文件合并时,条目会自动标记为模糊,两个 msgid
字符串非常接近但不完全匹配,并且由于这些匹配可能不正确,因此默认情况下不匹配编译。
我应该在您的屏幕截图中看到,它在工具栏和状态栏中清楚地显示 Fuzzy,我怀疑带有黄色标记的条目是模糊的,但它已经非常迟到了。
CakePHP 使用 .mo
文件而不是 .po
文件
一些 Cake 背景信息,即使(目前)没有记录,CakePHP 将使用 .mo
文件而不是 .po
文件,以防它们存在。
这些编译后的二进制变体通常解析速度更快(比较 I18n::loadMo()
和 I18n::loadPo()
),因为格式更简单(没有 cmets,删除了不必要的(如模糊)翻译等...)并且可以预期是有效的,当然.po
文件可能包含不应该使用的条目,比如那些模糊的:)
【讨论】:
以上是关于CakePHP 本地化拒绝工作的主要内容,如果未能解决你的问题,请参考以下文章
使用 XAMPP 将 cakePHP 应用程序部署到本地主机
无法在本地环境中使用 docker 连接到 cakephp 中的 mysql 数据库
作为 Azure 应用服务运行时,UserPrincipal.DisplayName 抛出 COMException“访问被拒绝”,在本地开发笔记本电脑上工作正常