Yii2:如何强制使用fallback MessageFormatter方法?

The*_*der 7 php internationalization yii2

我的网站是一个托管服务提供商,它在服务器上提供了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提供的后备方法,哪种方法可以正常工作?

Biz*_*ley 3

你可以尝试一下这种hacky方法。

将代码复制yii\i18n\MessageFormatter到新文件中。为其命名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);
}
Run Code Online (Sandbox Code Playgroud)

不要更改任何其他内容(包括命名空间)。

现在让我们使用 Yii 映射。

在应用程序中找到一个可以放置每次在引导阶段运行的代码的位置。common/config/bootstrap.php如果您正在使用“高级模板”之类的项目,那么这样做的好地方。

添加这一行:

Yii::$classMap['yii\i18n\MessageFormatter'] = 'path/to/your/MessageFormatter.php';
Run Code Online (Sandbox Code Playgroud)

显然,将路径更改为您选择的路径。现在,Yii 自动加载器将从您的文件而不是原始 Yii 供应商文件夹加载此类(如指南的类自动加载部分所述)。

在修改的文件MessageFormatter方法中,永远不会检查库的存在intl,因此默认使用后备。

这个技巧的缺点是每次更改原始 Yii 文件时都需要手动更新文件(因此几乎每次升级 Yii 版本时)。


另一种方法是在应用程序中配置 I18N 组件以使用您的自定义组件,MessageFormatter您可以在其中扩展原始文件并覆盖format()其中的方法,而无需修改类映射。