【发布时间】:2017-08-04 21:50:07
【问题描述】:
我最近从我用 Cakephp 构建的应用程序中提取了字符串,这要归功于他们出色的 i18n Shell。 然后我做了一个翻译(从法语到英语)并将文件放在 src/Locale 中:
src/
Locale/
default.po
fr/
default.po
Locale/文件夹中的第一个default.po格式如下:
msgid "View"
msgstr ""
fr/文件夹中的default.po:
msgid "View"
msgstr "Vue"
在我的 App Controller 中,我想测试一下翻译:
public function initialize()
{
parent::initialize();
I18n::locale('fr');
...
}
但我收到以下错误:
我试图在网上查找信息,但找不到任何东西。我也试过几台机器。
我做错了什么?
谢谢大家!
编辑:
Cake 版本是 3.3.12
调试套件版本为 3.3.12
错误日志:
2017-03-14 17:18:54 Error: [IntlException] Constructor failed
Request URL: /
Stack Trace:
#0 /www/fitadmin/admin/vendor/cakephp/cakephp/src/I18n/Formatter/IcuFormatter.php(89): MessageFormatter->__construct('fr', '{0, number, #, ...')
#1 /www/fitadmin/admin/vendor/cakephp/cakephp/src/I18n/Formatter/IcuFormatter.php(52): Cake\I18n\Formatter\IcuFormatter->_formatMessage('fr', '{0, number, #, ...', Array)
#2 /www/fitadmin/admin/vendor/cakephp/cakephp/src/I18n/Translator.php(150): Cake\I18n\Formatter\IcuFormatter->format('fr', '{0, number, #, ...', Array)
#3 /www/fitadmin/admin/vendor/cakephp/cakephp/src/I18n/functions.php(84): Cake\I18n\Translator->translate('{0,number,#,###...', Array)
#4 /www/fitadmin/admin/vendor/cakephp/cakephp/src/I18n/Number.php(92): __d('cake', '{0,number,#,###...', 2.2256164550781)
#5 /www/fitadmin/admin/vendor/cakephp/debug_kit/src/Panel/TimerPanel.php(125): Cake\I18n\Number::toReadableSize(2333728)
#6 /www/fitadmin/admin/vendor/cakephp/debug_kit/src/ToolbarService.php(191): DebugKit\Panel\TimerPanel->summary()
#7 /www/fitadmin/admin/vendor/cakephp/debug_kit/src/Routing/Filter/DebugBarFilter.php(139): DebugKit\ToolbarService->saveData(Object(Cake\Network\Request), Object(Cake\Network\Response))
#8 /www/fitadmin/admin/vendor/cakephp/cakephp/src/Event/EventManager.php(426): DebugKit\Routing\Filter\DebugBarFilter->afterDispatch(Object(Cake\Event\Event), Object(Cake\Network\Request), Object(Cake\Network\Response))
#9 /www/fitadmin/admin/vendor/cakephp/cakephp/src/Event/EventManager.php(391): Cake\Event\EventManager->_callListener(Array, Object(Cake\Event\Event))
#10 /www/fitadmin/admin/vendor/cakephp/cakephp/src/Event/EventDispatcherTrait.php(78): Cake\Event\EventManager->dispatch(Object(Cake\Event\Event))
#11 /www/fitadmin/admin/vendor/cakephp/cakephp/src/Http/ActionDispatcher.php(100): Cake\Http\ActionDispatcher->dispatchEvent('Dispatcher.afte...', Array)
#12 /www/fitadmin/admin/vendor/cakephp/cakephp/src/Http/BaseApplication.php(83): Cake\Http\ActionDispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
#13 /www/fitadmin/admin/vendor/cakephp/cakephp/src/Http/Runner.php(65): Cake\Http\BaseApplication->__invoke(Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response), Object(Cake\Http\Runner))
#14 /www/fitadmin/admin/vendor/cakephp/cakephp/src/Routing/Middleware/RoutingMiddleware.php(62): Cake\Http\Runner->__invoke(Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response))
#15 /www/fitadmin/admin/vendor/cakephp/cakephp/src/Http/Runner.php(65): Cake\Routing\Middleware\RoutingMiddleware->__invoke(Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response), Object(Cake\Http\Runner))
#16 /www/fitadmin/admin/vendor/cakephp/cakephp/src/Routing/Middleware/AssetMiddleware.php(88): Cake\Http\Runner->__invoke(Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response))
#17 /www/fitadmin/admin/vendor/cakephp/cakephp/src/Http/Runner.php(65): Cake\Routing\Middleware\AssetMiddleware->__invoke(Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response), Object(Cake\Http\Runner))
#18 /www/fitadmin/admin/vendor/cakephp/cakephp/src/Error/Middleware/ErrorHandlerMiddleware.php(81): Cake\Http\Runner->__invoke(Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response))
#19 /www/fitadmin/admin/vendor/cakephp/cakephp/src/Http/Runner.php(65): Cake\Error\Middleware\ErrorHandlerMiddleware->__invoke(Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response), Object(Cake\Http\Runner))
#20 /www/fitadmin/admin/vendor/cakephp/cakephp/src/Http/Runner.php(51): Cake\Http\Runner->__invoke(Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response))
#21 /www/fitadmin/admin/vendor/cakephp/cakephp/src/Http/Server.php(90): Cake\Http\Runner->run(Object(Cake\Http\MiddlewareQueue), Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response))
#22 /www/fitadmin/admin/webroot/index.php(37): Cake\Http\Server->run()
#23 {main}
【问题讨论】:
-
您是否在控制器顶部添加了此
use Cake\I18n\I18n;行?而且您的本地代码也可能错误。应该是br_FR -
无论何时收到错误,请始终发布 full 堆栈跟踪(最好从日志中以正确可读的方式复制),因为您可以看到调试工具包不知何故涉及。另外,请务必提及您的 确切 CakePHP 版本(
vendor/cakephp/cakephp/VERSION.txt中的最后一行),在这种情况下还要提及调试工具包版本 (vendor/cakephp/debug_kit/VERSION.txt) - 谢谢! -
@tarikul05 是的,我添加了使用
Cake\I18n\I18n。而且我不确定 bf_FR,从 core cakephp 语言环境文件夹中查看这个示例:link) -
@ndm 是的,对此感到抱歉!我编辑了我的帖子:-)
-
如果这不是输出中的怪癖,
Cake\I18n\Translator::translate()中的格式模式会发生变化,其中的空格无效 ({0, number, #, ...)。您是否为这些数字模式添加了翻译?是在您的default.po文件中,还是在其他可能存在的消息文件中?
标签: cakephp internationalization translation intl po