gpt4 book ai didi

php - Yii2:如何强制使用后备 MessageFormatter 方法?

转载 作者:可可西里 更新时间:2023-11-01 12:57:20 26 4
gpt4 key购买 nike

我的网站有一个托管提供商,该提供商在服务器(Linux,PHP 7.0.27)上提供 MessageFormatter 类,但它是一个旧的 ICU 版本(4.2.1),不支持我的消息 { number,plural,=0{# available} =1{# available} other{# available}} 并给出错误:

Message pattern is invalid: Constructor failed

msgfmt_create: message formatter creation failed: U_ILLEGAL_CHARACTER

...因为 =1=2 符号。

我无法对服务器进行更改,那么我如何才能强制使用 Yii2 提供的回退方法,它工作得很好?

最佳答案

您可以尝试这种 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);
}

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

现在让我们使用 Yii 映射。

在您的应用程序中找到一个可以放置每次都会运行的代码的位置 bootstrapping phase .如果您正在使用类似“高级模板”的项目,那么这里是 common/config/bootstrap.php 的好地方。

在那里添加这一行:

Yii::$classMap['yii\i18n\MessageFormatter'] = 'path/to/your/MessageFormatter.php';

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

在修改后的文件中,MessageFormatter 方法是否存在 intl 库从未被检查,因此默认使用 fallback。

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


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

关于php - Yii2:如何强制使用后备 MessageFormatter 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48672978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com