CodeIgniter 4 多语言支持需通过中间件在控制器前完成语言识别、切换与初始化,支持URL前缀、Cookie/Session及Accept-Language检测,验证后调用setLocale并预加载语言包,配合路由配置实现自动本地化。

CodeIgniter 4 的多语言支持与中间件配合使用,核心在于**在请求进入控制器前,由中间件完成语言环境的识别、切换和初始化**,避免每个控制器重复处理,同时确保后续所有系统组件(如语言文件、验证错误、日期格式等)都基于正确语言运行。
语言检测逻辑放在中间件里
CI4 不自带自动语言检测,需手动实现。中间件是执行该逻辑的理想位置——它在控制器构造函数之前运行,能尽早影响整个请求生命周期。
- 从 URL 路径前缀提取语言码(如 /zh/home、/en/about)
- 检查 Cookie 或 Session 中保存的用户偏好语言
- 回退到浏览器 Accept-Language 头部解析(可选,注意兼容性)
- 验证语言码是否在配置的允许列表中(如 ['en', 'zh', 'ja']),防止非法值注入
动态设置 Locale 并加载对应语言包
检测出有效语言后,中间件需立即生效:
- 调用 Services::language() 获取语言服务实例
- 用 $lang->setLocale('zh') 切换当前语言环境
- (可选)调用 service('language')->load('auth') 预加载常用语言组,避免控制器中首次调用延迟
- 将选定语言写入 Session 或 Cookie,供下次请求复用
路由与语言前缀协同配置
要让中间件能可靠读取语言前缀,路由必须支持带语言段的路径:
- 在 app/Config/Routes.php 中启用多语言路由规则,例如:
$routes->setTranslatedRoutes(true);
或手动定义:
$routes->add('(:any)/(:segment)', 'Home::index/$2', ['namespace' => 'App\Controllers']); - 确保中间件注册在全局或分组路由中,覆盖所有需要多语言的路径
- 静态资源(CSS/JS/图片)和 API 接口通常不走语言前缀,可单独排除,避免中间件误处理
保持视图与验证消息自动本地化
中间件完成语言设置后,CI4 内置组件会自动响应:
- view() 渲染时自动查找 app/Language/zh/**.php 下的语言文件
- 表单验证规则(如 required、valid_email)的错误提示自动翻译
- lang('auth.login') 等语言标签函数返回对应语言内容
- 日期格式、数字格式等也随 locale 变化(需启用 intl 扩展)
不复杂但容易忽略:中间件必须在 app/Config/Filter.php 中正确注册并启用,且顺序不能晚于语言依赖项;同时确保 app/Config/App.php 中的 $charset 和 $locale 设置为通用默认值(如 en),而非硬编码具体语言。


















