【发布时间】: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 如何编译文件)。今晚就是这样,该睡觉了:)
标签: php cakephp localization internationalization poedit