codeigniter多语言配置不生效是因为uri、路由、控制器、语言加载四者未严格对齐:language目录子目录须全小写加下划线(如zh_cn),文件名以_lang.php结尾,键名不含空格或特殊字符;路由需用正则剥离语言段;my_controller中须先set_item('language', $lang)再load()并清缓存;restserver语言路径独立且键名不同,需显式加载。

改完 CodeIgniter 的多语言配置文件却不生效,不是配置没保存,而是框架运行时根本没按你预期的方式加载语言——它不认 config.php 里写的 $config['language'],也不自动根据 URL 或用户选择切换。必须让 URI、路由、控制器、语言加载四者严格对齐,漏掉任一环,$this->lang->line() 就静默返回空字符串,还不报错。
检查 language 目录结构和文件命名
CodeIgniter 只从 application/language/ 下读取语言包,且要求非常严格:
- 子目录名必须全小写、下划线分隔,比如
zh_cn或en_us;zh-CN、zhcn、ZH_CN都无效 - 语言文件必须以
_lang.php结尾,例如common_lang.php,不能是common.php或common_langs.php - 键名不能含空格或特殊字符:
$lang['user login'] = '登录';是错的,得写成$lang['user_login'] = '登录'; - 文件内必须用
$lang数组赋值,不能用$lang_zh_cn或其它变量名
确认路由已提前剥离语言段
如果 URL 是 /zh_cn/login,默认会被当成访问控制器 zh_cn、方法 login,直接 404。必须在 application/config/routes.php 靠前位置加正则规则:
$route['^(zh_cn|en_us|ja_jp|ko_kr)/(.+)$'] = '$2';$route['^(zh_cn|en_us|ja_jp|ko_kr)$'] = 'home/index';- 这两条要放在
$route['default_controller']之后、泛匹配规则(如$route['(:any)'])之前 - 括号内不能有空格,
(zh_cn | en_us)会失效 - Apache 的
.htaccess要带[L]标志,否则重写可能被后续规则干扰
在 MY_Controller 中手动设置并加载语言
$config['language'] 在 config.php 里只是全局默认值,运行时不会随 URL 自动切换。必须在 application/core/MY_Controller.php 构造函数中处理:
- 先调
parent::__construct(),再读$this->uri->segment(1)(否则 segment 为空) - 判断是否为合法语言码,比如
in_array($lang, ['zh_cn', 'en_us']) - 执行
$this->config->set_item('language', $lang) - 紧接着
$this->lang->load('common', $lang),否则视图中lang('xxx')仍是旧语言 - 若需立即生效,还得清缓存:
$this->lang->is_loaded = [];
注意 RestServer 等扩展的语言路径差异
如果你用了 CodeIgniter RestServer,它的语言路径是独立的,键名也不一致:
- RestServer 默认语言文件放在
application/libraries/REST_Controller/language/ - 键名可能是
simplified-chinese,而不是zh_cn,需显式加载:$this->lang->load('rest_controller', 'simplified-chinese'); - 不要假设它和主框架共用同一套语言目录或命名规则











