Yii2:如何强制使用回退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提供的回退方法,该方法工作得很好?
你可以试试这种冒险的方式。
将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映射。
当您可以将每次在引导阶段运行的代码放到应用程序中时找到一个位置。 如果您使用的是“高级模板”项目,那么最好使用common/config/bootstrap.php
。
在那里添加这一行:
Yii::$classMap['yiii18nMessageFormatter'] = 'path/to/your/MessageFormatter.php';
显然改变你选择的路径。 现在,Yii自动加载器将从您的文件加载此类,而不是原始的Yii供应商文件夹(如指南的类自动加载部分所述)。
在修改后的文件MessageFormatter
方法中, intl
库的存在从不被检查,所以fallback被用作默认值。
这个技巧的缺点是每次更改原始Yii文件时都需要手动更新文件(因此几乎每次升级Yii版本时都会如此)。
另一种方法是在您的应用程序中配置I18N组件,以使用您的自定义MessageFormatter
,您可以在其中扩展原始文件并在其中修改format()
方法而不修改类映射。
上一篇: Yii2: How to force using fallback MessageFormatter method?