codeigniter 4 官方多语言支持基于 language system,采用“语言文件+语言标识符+服务注入”方式,语言包存于 app/language/ 下按语言代码分目录,通过 language() 辅助函数或 language 服务安全调用翻译,动态切换需用 service('language')->setlocale() 并结合 session 持久化,避免手动加载或 ci3 风格语法。

CodeIgniter 4 官方多语言支持的核心是 Language System,最新稳定版(v4.5+)推荐采用“语言文件 + 语言标识符 + 服务注入”的组合方式,不依赖第三方扩展,也不用硬编码切换逻辑。
语言文件按标准结构组织
语言包统一放在 app/Language/ 下,按语言代码分目录:
- app/Language/en/ → 英文(默认语言)
- app/Language/zh-CN/ → 简体中文
- app/Language/ja/ → 日文
每个目录内为 PHP 返回关联数组的文件,例如:app/Language/zh-CN/General.php
$lang = [
'welcome_message' => '欢迎使用系统',
'user_not_found' => '用户不存在',
];
在控制器或视图中安全调用翻译
推荐通过 language() 辅助函数或 Language 服务获取,自动识别当前活动语言:
- 控制器中:
$this->language->getLine('welcome_message') - 视图中:
lang('welcome_message')(需先加载language辅助函数) - 模板中也可用
= lang('user_not_found') ?>
注意:不要直接 new Language() 或手动 require 语言文件——会绕过框架的语言上下文管理。
动态切换语言的可靠做法
语言切换应基于用户偏好(如 session、cookie 或 URL 参数),但必须通过 Services::language() 设置生效:
- 设置当前请求语言:
service('language')->setLocale('zh-CN') - 该设置仅对本次请求有效,不影响其他用户
- 若需持久化,建议存入 session:
session()->set('locale', 'zh-CN'),并在 BaseController 构造函数中读取并设置
示例(BaseController 中):
public function __construct()
{
parent::__construct();
$locale = session()->get('locale') ?? config('App')->defaultLocale;
service('language')->setLocale($locale);
}
避免常见陷阱
以下写法已过时或存在风险,不推荐:
- 手动 include 语言文件(破坏自动加载与缓存)
- 在构造函数中调用
setLocale()前未调用parent::__construct()(导致 service 不可用) - 把语言键写成变量拼接:
lang('error_'.$code)→ 应预定义全部键名,确保可被扫描和翻译 - 混用 CI3 风格的
$this->lang->line()(CI4 已移除该语法)
语言键命名建议全小写+下划线,保持一致性,便于后续对接翻译平台或导出 PO 文件。











