php - 为什么yii2的国际化模块区分大小写?

标签 php yii2 internationalization

我目前一直在研究 yii2 的国际化模块,但遇到了一个奇怪的行为,并且在徘徊。

为什么 Yii::t('app','NEXT'), Yii::t('app','next') Yii::t('app','Next') 需要单独翻译吗?

我将翻译存储在数据库中。有什么办法可以使翻译不区分大小写吗?或者有什么具体原因吗?

最佳答案

我相信这是预期的行为,因为在某些页面中打印“NEXT”和“next”看起来肯定不同。因此,例如,如果我想在某个地方看到“КЕЛЕСІ”而不是“келесі”,并且我只会收到小写的结果,这首先会让我感到困惑。

无论如何,该功能最初区分大小写会更好,您可以根据需要使其不区分大小写(或制作任何字符串运算符)。

简单但不推荐

最简单的方法是定义一个带有静态函数的类,您可以在其中降低任何输入,然后调用前一个 Yii::t() 函数。

namespace app\components; // your namespace here

class Translator {
    public static function t($category, $message, $params = [], $language = null)
    {
        return \Yii::t($category, strtolower($message), $params, $language);
    }
}

然后您将使用 Translator::t('app', 'Next') 而不是调用 Yii::t('app', 'Next') > 它将为您获取“下一个”一词的翻译


第二种(更优雅的)解决方案:

是覆盖在 web.php 设置中配置的主要 I18N 组件。 首先你应该创建一个类并从 yii\i18n\I18N 组件继承它:

namespace app\components;

use yii\i18n\I18N;

class NewI18N extends I18N
{
    public function translate($category, $message, $params, $language)
    {
        return parent::translate($category, strtolower($message), $params, $language);
    }
}

..接下来,打开您的 web.php 设置文件并配置“i18n”组件类,如下所示:

'components' => [
    'i18n' => [
        'class' => 'app\components\NewI18N', // Here it is
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                'basePath' => '@app/messages',
            ],
        ],
    ],
...

就是这样!在第二种方法中,您不必使用第三方 Translator 类,只需调用您熟悉的 Yii::t() 方法,它会自动降低字符串。

关于php - 为什么yii2的国际化模块区分大小写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44765779/

相关文章:

php - 使用 preg_match() 显示字符串的前 n 段

angularjs - Yii2 + AngularJS 在一个应用程序中 - 如何?

jquery - 在单页应用程序中显示通过 JSON 发送的日期

javascript - 发布请求抛出 net::ERR_HTTP2_PROTOCOL_ERROR

php - HTML 页面上的 preg_replace 给出 net::ERR_INVALID_CHUNKED_ENCODING

javascript - 在 yii2 中如何根据角色更改 Dropdown 数据?

symfony - 操作 Symfony Intl 提供的国家列表和表单选择类型

java - 如何获取本地化的日期模式字符串?

php - 使用 PHP 分页 MySQL 结果

php - Yii2 从表单保存用户提交的数据时链接两个模型不起作用