CodeIgniter多语言支持需语言路径、路由规则、控制器加载三者严丝合缝,否则$this->lang->line()静默返回空;必须规范目录名(如zh_cn)、文件名(_lang.php)、键名(下划线),路由提前剥离语言段,基控制器中set_item后显式load并清缓存。

语言包目录结构与命名规范
语言文件必须放在 application/language/ 下,且满足以下硬性要求:
- 子目录名全小写、下划线分隔,例如
zh_cn、en_us,不能用zh-CN或zhcn - 语言文件名以
_lang.php结尾,如common_lang.php、form_lang.php - 键名只能含字母、数字和下划线,不能有空格或特殊字符;
$lang['user login'] = '登录';是无效的,必须写成$lang['user_login'] = '登录'; - 每个语言文件内定义的数组必须叫
$lang,且不能重复声明或覆盖
路由必须提前剥离语言段
如果 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)'])之前 - Apache 的
.htaccess中重写规则需带[L]标志,防止被后续规则干扰
控制器中手动切换语言并重载
$config['language'] 只是全局默认值,运行时不会随 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/language/,而非application/language/ - 语言码命名不同,例如主框架用
zh_cn,RestServer 用simplified-chinese - 错误提示键名也不同,如
rest_invalid_api_key,不能复用主框架的common_lang.php - 必须显式加载:
$this->lang->load('rest_controller', 'simplified-chinese');


















