【问题标题】:Cakephp i18n - Constructor failed - Intl ExceptionCakephp i18n - 构造函数失败 - 国际异常
【发布时间】: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


【解决方案1】:

供参考: 我遇到了同样的问题,结果证明是我的 .po 文件中的语法错误。就我而言:

msgid "My name is {0}"
msgstr "Jag heter {}"

注意翻译字符串中的无效占位符{},当然应该是{0}

【讨论】:

    【解决方案2】:

    阅读@ndm 的评论后,我查看了我的 .po 文件并尝试从 cakephp 供应商文件夹中删除翻译。我注意到有一些不应该存在的绝对路径(C: /xampp/...)。

    成功了……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      相关资源
      最近更新 更多