php - CakePHP 本地化无法工作

标签 php cakephp localization internationalization poedit

我正在使用 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 翻译了一些字符串(用于测试):

enter image description here

在 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 明确请求。

合并.potpo文件时,条目自动标记为模糊,两个msgid字符串非常接近但不完全匹配,并且由于这些匹配可能不正确,它们在默认情况下不会被编译。

我应该在你的屏幕截图中看到,它在工具栏和状态栏中清楚地写着Fuzzy,我怀疑黄色标记的条目是那些模糊的,但它已经非常晚了。

CakePHP 使用 .mo 文件而不是 .po 文件

一些 Cake 背景信息,即使(当前)未记录,CakePHP 将使用 .mo 文件而不是 .po 文件,以防它们存在。

这些编译后的二进制变体通常解析起来更快(比较 I18n::loadMo()I18n::loadPo() ),因为格式更简单(没有注释,删除了不必要的(如模糊的)翻译等......)并且可以预期是有效的,当然 .po 文件可能包含不应该使用的条目,比如那些模糊的条目:)

关于php - CakePHP 本地化无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27049384/

相关文章:

validation - 在更新表单中禁用验证 - CakePHP

php - 为什么要使用 CakePHP 的 HTML Helpers?

java 字符串格式 : numbers with localization

php - Slim 忽略 try catch block

php - Symfony2 : accessing variables defined in config. yml 和 config_*.yml

php - 使用 PHPWord 动态表行

iphone - 将 localized.strings 转换为电子表格?

java - PHP exec() jar java 文件不返回任何输出

html - Cakephp 2.4.5 烘焙 View 中的自定义 HTML

ios - 在 iOS 应用程序(iPhone 和 iPad)中手动选择语言