Yii2:如何强制使用fallback MessageFormatter方法?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Yii2:如何强制使用fallback MessageFormatter方法?相关的知识,希望对你有一定的参考价值。
我的网站是一个托管服务提供商,它在服务器上提供了MessageFormatter类(Linux,php 7.0.27),但它是一个旧的ICU版本(4.2.1),不支持我的消息{number,plural,=0{# available} =1{# available} other{# available}}
并给出错误:
消息模式无效:构造函数失败
msgfmt_create:消息格式化程序创建失败:U_ILLEGAL_CHARACTER
...因为=1
和=2
符号。
我无法对服务器进行更改,因此我如何强制使用Yii2提供的后备方法,哪种方法可以正常工作?
有这种hacky方式你可以尝试。
将yiii18nMessageFormatter
代码复制到新文件。将其命名为MessageFormatter.php
并将其放置在应用程序中的某处(但不在vendor
文件夹中)。
在这个新文件中,将format()
方法更改为:
public function format($pattern, $params, $language)
{
$this->_errorCode = 0;
$this->_errorMessage = '';
if ($params === []) {
return $pattern;
}
return $this->fallbackFormat($pattern, $params, $language);
}
不要更改任何其他内容(包括命名空间)。
现在让我们使用Yii映射。
当您可以在bootstrapping phase中放置将每次运行的代码时,在应用程序中找到一个位置。如果您使用“高级模板”式项目,那么common/config/bootstrap.php
的好地方就是这个。
添加此行:
Yii::$classMap['yiii18nMessageFormatter'] = 'path/to/your/MessageFormatter.php';
显然改变了你选择的路径。现在,Yii自动加载器将从您的文件加载此类,而不是原始的Yii供应商文件夹(如本指南的Class Autoloading部分所述)。
在修改后的文件MessageFormatter
方法中,从不检查intl
库的存在,因此使用fallback作为默认值。
这个技巧的缺点是每次更改原始Yii文件时都需要手动更新文件(所以几乎每次升级Yii版本时)。
另一种方法是在您的应用程序中配置I18N组件以使用您的自定义MessageFormatter
,您可以在其中扩展原始文件并在不修改类映射的情况下覆盖format()
方法。
以上是关于Yii2:如何强制使用fallback MessageFormatter方法?的主要内容,如果未能解决你的问题,请参考以下文章