yii框架实现多语言切换需配置i18n组件、组织翻译文件(如@app/messages/zh-cn/app.php)、通过action动态设置yii::$app->language并持久化,支持自动检测浏览器语言作为初始值。

Yii 框架内置了完善的国际化(i18n)支持,实现多语言切换并不复杂,关键在于配置、翻译文件组织和动态语言切换逻辑的正确处理。
配置应用支持多语言
在 config/web.php(或 main.php)中启用 i18n 组件,并设置默认语言和可用语言列表:
'components' => [
'i18n' => [
'translations' => [
'*' => [
'class' => 'yii\i18n\PhpMessageSource',
'basePath' => '@app/messages',
'sourceLanguage' => 'en-US',
'fileMap' => [
'app' => 'app.php',
],
],
],
],
'language' => 'zh-CN', // 当前前端显示语言(可动态改)
'sourceLanguage' => 'en-US', // 源语言,即代码中使用的原始语言
],
注意:language 是运行时生效的语言,建议不要写死,而是从用户会话、URL 或 Cookie 中动态赋值。
组织翻译文件结构
Yii 默认按 语言代码/分类名.php 存放翻译内容。例如:
- @app/messages/zh-CN/app.php
- @app/messages/en-US/app.php
- @app/messages/ja-JP/app.php
每个 PHP 文件返回一个键值对数组:
// @app/messages/zh-CN/app.php
return [
'Hello' => '你好',
'Welcome to {siteName}' => '欢迎来到 {siteName}',
];
模板中用 Yii::t('app', 'Hello') 调用,框架会自动根据当前 Yii::$app->language 加载对应文件。
实现语言切换功能
语言切换本质是修改 Yii::$app->language 并持久化选择(如存入 session 或 cookie)。推荐通过一个控制器动作完成:
- 接收目标语言参数(如
zh-CN、en-US) - 校验是否在允许列表中(防非法输入)
- 写入 session 或 cookie
- 重定向回原页面(保留 URL)
示例 Action:
public function actionSetLang($lang)
{
$allowed = ['zh-CN', 'en-US', 'ja-JP'];
if (in_array($lang, $allowed)) {
Yii::$app->session->set('language', $lang);
Yii::$app->language = $lang;
}
return $this->redirect(Yii::$app->request->referrer ?: '/');
}
在布局或导航中添加语言切换链接:
<a href="<?=%20Url::to(['site/set-lang',%20'lang'%20=>%20'zh-CN'])%20?>">中文</a> <a href="<?=%20Url::to(['site/set-lang',%20'lang'%20=>%20'en-US'])%20?>">English</a>
自动检测并初始化语言
首次访问时,可结合浏览器 Accept-Language 自动设置初始语言(但需谨慎,避免覆盖用户手动选择):
// 在应用启动前或 beforeAction 中
$userLang = Yii::$app->request->getPreferredLanguage(['zh-CN', 'en-US', 'ja-JP']);
$storedLang = Yii::$app->session->get('language');
Yii::$app->language = $storedLang ?: $userLang;
这样既尊重用户偏好,又保留手动切换的优先级。











