CodeIgniter多语言需手动对齐URI标识、路由剥离、动态设置及规范语言文件:语言包须置于application/language/下,子目录名小写下划线(如zh_cn),文件名以_lang.php结尾,键名仅含字母数字下划线;路由须在config/routes.php靠前位置用正则剥离语言段;基控制器MY_Controller中需在parent::__construct()后读取URI首段、设language配置并加载对应语言包;RestServer语言路径与键名均独立,需单独配置。

语言包目录与命名必须合规
所有语言文件必须放在 application/language/ 下,且满足三项硬性要求:
- 子目录名全小写、下划线分隔,例如
zh_cn、en_us;不能是zh-CN、zhcn或ZH_CN - 语言文件名以
_lang.php结尾,如common_lang.php、form_lang.php - 键名只能含字母、数字和下划线,不能有空格或特殊字符;
$lang['user login'] = '登录';是无效的,必须写成$lang['user_login'] = '登录';
路由必须提前剥离语言段
如果 URL 是 /zh_cn/login,默认会被 CodeIgniter 当作控制器 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', 'simplified-chinese');


















