Yii2 多语言配置 - i18n 国际化

原理

国际化 i18nYii2 的核心组件,应用 bootstrapi18n 就会被实例化。

// yii2/base/Application.php
public function coreComponents()
{
    return [
        'log' => ['class' => 'yii\log\Dispatcher'],
        'view' => ['class' => 'yii\web\View'],
        'formatter' => ['class' => 'yii\i18n\Formatter'],
        'i18n' => ['class' => 'yii\i18n\I18N'],
        'mailer' => ['class' => 'yii\swiftmailer\Mailer'],
        'urlManager' => ['class' => 'yii\web\UrlManager'],
        'assetManager' => ['class' => 'yii\web\AssetManager'],
        'security' => ['class' => 'yii\base\Security'],
    ];
}

默认情况 i18n 会把实现交给 yii\i18n\PhpMessageSource 类,这也是项目中最常用的方式。在不修改应用配置的情况下,只需要将多语言的 php 文件放到 @app/messages 目录下即可。如 zh-CN 中文配置 @app/messages/zh-CN/app.php,文件名必须为 app.php

除此外还有 yii\i18n\GettextMessageSourceyii\i18n\DbMessageSource 可用。

// yii2/i18n/I18N.php
public function init()
{
    parent::init();
    if (!isset($this->translations['yii']) && !isset($this->translations['yii*'])) {
        $this->translations['yii'] = [
            'class' => 'yii\i18n\PhpMessageSource',
            'sourceLanguage' => 'en-US',
            'basePath' => '@yii/messages',
        ];
    }

    if (!isset($this->translations['app']) && !isset($this->translations['app*'])) {
        $this->translations['app'] = [
            'class' => 'yii\i18n\PhpMessageSource',
            'sourceLanguage' => Yii::$app->sourceLanguage,
            'basePath' => '@app/messages',
        ];
    }
}

如何配置,如何使用?关键要理解 i18n 是如何根据配置文件加载多语言文件的。

// yii2/i18n/I18N.php
public function getMessageSource($category)
{
    // 判断 $category 在配置中是否存在
    // 1. 先进行完全匹配
    // 2. 再匹配结尾带 * 的配置
    // 3. 最后直接引用 * 配置
    // 如果某步成功,就把任务交给 PhpMessageSource,
    // 并将 $category 传递给 PhpMessageSource
}

// yii2/i18n/PhpMessageSource.php
protected function getMessageFilePath($category, $language)
{
    // PhpMessageSource 关键任务是找到多语言文件的路径
    // 根据 $category 获取多语言文件的路径
    // 1. 先从 fileMap 配置中获取路径
    // 2. 再用 $category 拼接路径
    // loadMessages() 方法根据路径加载多语言数据返回 I18N
}

使用

  1. 简单配置

    配置文件如下:

    'i18n' => [ 
        'translations' => [ 
            'demo' => [ 
                'class' => 'yii\i18n\PhpMessageSource', 
                'basePath' => '@app/messages',
            ],
        ],
    ], 

    文件存放位置:

    @app/messages/zh-CN/demo.php

    引用:

    Yii::t('demo', 'key');
  2. 分层级,通过文件目录实现

    配置文件如下:

    'i18n' => [ 
        'translations' => [ 
            'demo*' => [ 
                'class' => 'yii\i18n\PhpMessageSource', 
                'basePath' => '@app/messages',
            ],
        ],
    ], 

    文件存放位置:

    @app/messages/zh-CN/demo/common.php

    引用:

    Yii::t('demo/common', 'key');
  3. 分层级,通过配置实现

    配置文件如下:

    'i18n' => [ 
        'translations' => [ 
            'demo*' => [ 
                'class' => 'yii\i18n\PhpMessageSource', 
                'basePath' => '@app/messages',
                'fileMap' => [
                    // 文件名应该与键名对应,即 common.php
                    // 此处只是为了说明问题
                    'demo/common' => 'main.php'
                ]
            ],
        ],
    ], 

    文件存放位置:

    @app/messages/zh-CN/main.php

    引用:

    Yii::t('demo/common', 'key');
  4. 模块中独立配置

    在模块入口文件 Module.php 中,增加如下代码

    public function init()
    {
        parent::init();
    
        if ( !isset(Yii::$app->get('i18n')->translations['demo*']) ) {
            Yii::$app->get('i18n')->translations['demo*'] = [
                'class' => 'yii\i18n\PhpMessageSource', 
                'basePath' => __DIR__ . '/messages', 
                'fileMap' => [
                    'demo/common' => 'common.php',
                ],
            ];
        }
    }

    多语言文件放在模块的 ./messages/ 目录下。

    引用:

    Yii::t('demo/common', 'key');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值