我正在使用 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 ""
...
有什么问题吗?
最佳答案
未编译模糊条目
因此,正如我们在评论中指出的那样,这里的问题是有问题的翻译已被标记为 fuzzy
,并且此类条目未被编译到 .mo
中文件,除非使用 -f
或 --use-fuzzy
标志和 msgfmt
明确请求。
合并.pot
和po
文件时,条目自动标记为模糊,两个msgid
字符串非常接近但不完全匹配,并且由于这些匹配可能不正确,它们在默认情况下不会被编译。
我应该在你的屏幕截图中看到,它在工具栏和状态栏中清楚地写着Fuzzy,我怀疑黄色标记的条目是那些模糊的,但它已经非常晚了。
CakePHP 使用 .mo
文件而不是 .po
文件
一些 Cake 背景信息,即使(当前)未记录,CakePHP 将使用 .mo
文件而不是 .po
文件,以防它们存在。
这些编译后的二进制变体通常解析起来更快(比较 I18n::loadMo()
和 I18n::loadPo()
),因为格式更简单(没有注释,删除了不必要的(如模糊的)翻译等......)并且可以预期是有效的,当然 .po
文件可能包含不应该使用的条目,比如那些模糊的条目:)
关于php - CakePHP 本地化无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27049384/