codeigniter多语言只显示默认中文,根本原因是语言切换机制未生效:路由未剥离语言段、语言目录/文件命名不合规、控制器未手动切换语言且顺序错误、ci4与ci3配置差异被忽略,导致$lang->line()始终返回中文。

CodeIgniter 多语言只显示默认中文,通常不是“中文被强制启用”,而是语言切换机制未生效、语言加载路径错配或路由未正确剥离语言段,导致 $this->lang->line() 始终返回中文(即默认语言)的值,而其他语言完全不触发。
核心问题在于:CodeIgniter 的多语言系统是被动加载、严格路径依赖、无自动 fallback 机制的。它不会因为你访问 /en_us/login 就自动切到英文——必须手动对齐 URI、路由、控制器和语言加载四个环节,缺一不可。
语言目录结构与命名是否合规?
CodeIgniter 只认特定格式的语言目录和文件:
- 子目录名必须全小写 + 下划线,如
zh_cn、en_us,不能是zh-CN、EN_US或zhcn - 语言文件必须放在
app/Language/(CI4)或application/language/(CI3)下对应子目录中 - 文件名必须以
_lang.php结尾,例如common_lang.php - 键名不能含空格或特殊字符:
$lang['user_login'] = '登录';✅,$lang['user login'] = '登录';❌(会静默失效)
若英文语言包目录为 en-us 或文件叫 common.php,CI 就根本读不到,自然只回退到默认中文。
路由是否提前剥离了语言段?
URL 如 /en_us/login 若没在路由层处理,CI 会把 en_us 当作控制器名,直接 404,根本进不了你的控制器去切换语言。
必须在 app/Config/Routes.php(CI4)或 application/config/routes.php(CI3)靠前位置添加:
$routes->addRedirect('^(zh_cn|en_us|ja_jp)/(.+)', '$2');
$routes->addRedirect('^(zh_cn|en_us|ja_jp)$', 'home/index');
注意:
- 正则中不能有空格,
(zh_cn | en_us)会失效 - 这两条必须放在
$routes->set404Override()和泛匹配规则(如$routes->add('(:any)', 'Home::index'))之前 - Apache 的
.htaccess需带[L]标志,避免重写被后续规则覆盖
控制器里是否真正切换了语言?
$config['language'] 在 app/Config/App.php 中设的只是启动时默认值,运行时不会随 URL 自动变。
你必须在基控制器(如 App\Controllers\BaseController 或 MY_Controller)中:
- 先调
parent::__construct()(否则$this->uri不可用) - 用
$this->uri->getSegment(1)取出第一个路径段(如en_us) - 判断是否为合法语言码(
in_array($lang, ['zh_cn', 'en_us'])) - 执行
$this->config->setItem('language', $lang) -
紧接着
$this->lang->load('common', $lang) - 若需立即生效,清空已加载缓存:
$this->lang->is_loaded = []
漏掉第4步或第5步,视图中 lang('xxx') 仍用旧语言;顺序颠倒(先 load 再 setItem),也会加载失败。
CI4 与 CI3 的关键差异提醒
- CI4 使用
app/Language/{locale}/,且推荐 BCP 47 格式(如zh-Hans、en-US),但需确保目录名和$supportedLocales一致 - CI4 启用内容协商需设置
public bool $negotiateLocale = true;和public array $supportedLocales = ['zh-Hans', 'en-US'];,但它仅对 HTTP 请求生效,CLI 不支持 - CI4 的
lang()辅助函数依赖当前 locale,而 locale 必须通过$this->request->getLocale()或手动setLocale()设置,不能只靠 config
如果用了 CI4 却沿用 CI3 的 zh_cn 目录结构,或没调 setLocale(),就会始终走默认 locale(通常是 en 或 zh-Hans),造成“只显示默认中文”的假象。











