CakePHP本地化拒绝工作

时间:2014-11-20 20:54:46

标签: php cakephp localization internationalization poedit

我正在使用CakePHP v2.5.6,并且我在CakePHP本地化之后关注this documentation。我已经阅读了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&{39} 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生成的全新文件,它通过了&#34; Validate&#34;功能没有问题。它只是说有很多条目尚未翻译。

我从文件中删除的行如下所示:

...
#: 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 ""
...

有什么问题吗?

1 个答案:

答案 0 :(得分:5)

未编译模糊条目

正如我们在评论中所述,这里的问题是问题翻译已标记为fuzzy,并且此类条目未编译到.mo文件中,除非明确请求使用标有-f的{​​{1}}或--use-fuzzy

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

我应该在你的截图中看到,在工具栏和状态栏中清楚地显示模糊,我怀疑黄色标记的条目是模糊的,但它是已经很晚了。

CakePHP在msgid个文件

上使用.mo个文件

一个小小的Cake背景信息,即使(当前)没有文档,CakePHP将使用.po个文件而不是.mo个文件,以防它们存在。

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