CodeIgniter多语言核心是URI、路由、控制器、语言加载四者严丝合缝;需正则剥离语言段、MY_Controller中先设语言再加载、语言目录命名严格规范,否则lang()->line()静默返回空。

CodeIgniter 多语言隐藏技巧,核心不是“藏”,而是让语言切换不干扰路由、不破坏加载链路——老鸟盯的从来不是界面是否显示语言码,而是 URI、路由、控制器、语言加载四者是否严丝合缝。稍有错位,$this->lang->line() 就静默返回空,连 warning 都没有。
语言段必须在路由最前剥离
URL 像 /zh_cn/login 时,CI 默认会把 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] 标志,否则重写可能被后续规则截断。
MY_Controller 里语言切换必须“先设再载”
$config['language'] 在 config.php 里只是默认值,运行时不随 URL 变。要在 application/core/MY_Controller.php 构造函数中手动处理:
- 先调
parent::__construct(),否则$this->uri->segment(1)拿不到值 - 读取第一段 URI(如
zh_cn),用in_array()判断是否合法 - 立即执行
$this->config->set_item('language', $lang) - 紧接着
$this->lang->load('common', $lang),否则视图里lang('xxx')还是旧语言 - 若需即时生效,补一句
$this->lang->is_loaded = [];清缓存
语言目录和文件命名有硬约束
CI 只认 application/language/ 下的结构,且容不得半点松动:
- 子目录名必须全小写 + 下划线,如
zh_cn,不能是zh-CN、ZH_CN或zhcn - 语言文件必须以
_lang.php结尾,例如common_lang.php - 键名不能含空格或特殊字符:
$lang['user login'] = '登录';无效,得写成$lang['user_login'] = '登录'; - 漏掉任一条件,
$this->lang->load()表面成功,但后续line()调用就返回空字符串
RestServer 等扩展需单独适配
如果你用了 RestServer 或其他第三方库,它的语言路径和键名往往和 CI 主流不一致:
- RestServer 默认语言标识是
simplified-chinese,不是zh_cn - 它不走 CI 的
$this->lang加载机制,得显式调用$this->lang->load('rest_controller', 'simplified-chinese') - 键名也常不同,比如
error_message可能叫rest_invalid_api_key,不能直接复用 common_lang.php
不复杂但容易忽略。


















