ci4.7.2语言支持需将文件置于app/language/zh_cn/(全小写下划线)下,文件名任意但须返回关联数组,键名禁空格;用lang('key', 'zh_cn')调用,需手动setlocale()并配置路由剥离语言段。

language 目录结构和文件命名必须严格匹配
CodeIgniter 4.7.2 不再沿用 CI3 的 application/language/zh_cn/common_lang.php 路径,而是改用 app/Language/ 下按语言目录组织的结构,且**语言目录名必须全小写、下划线分隔(如 zh_cn),不能是 zh-CN 或 zhcn**。
每个语言子目录里放 PHP 文件,文件名任意(不再强制 _lang.php 后缀),但推荐用语义化名称,比如 Home.php、Auth.php;文件内返回一个关联数组:
<?php return [
'welcome_message' => '欢迎来到网站',
'user_login' => '用户登录',
];
键名仍禁止空格和特殊字符:'user login' 会失效,必须写成 'user_login'。
常见错误现象:文件放在 app/Language/zh_CN/(大写 CN)或 app/Language/zh-cn/(短横线),导致 lang('welcome_message', 'zh_cn') 静默返回 null。
怎么在控制器里加载并使用翻译
CI4 使用全局函数 lang() 替代 CI3 的 $this->lang->line(),它默认读取当前配置语言,也可显式传入语言码:
- 先确保
$config['language'] = 'zh_cn';在app/Config/App.php中设为默认值(仅作 fallback) - 在控制器中动态切换时,调用
service('language')->setLocale('zh_cn')(注意不是set_item) - 使用
lang('welcome_message')读取;或跨语言查:lang('welcome_message', 'en_us')
关键点:CI4 的语言服务不依赖 URI 段自动识别——你得自己从 URL 提取语言码(比如 $this->request->getUri()->getSegment(1)),然后手动 setLocale()。漏掉这步,lang() 就永远只读默认语言。
路由怎么剥离语言段避免 404
如果 URL 是 /zh_cn/login,CI4 默认会把 zh_cn 当作控制器名,直接报 404。必须在 app/Config/Routes.php 顶部加重写规则:
$routes->addRedirect('/zh_cn/(:any)', '/$1', 307);
$routes->addRedirect('/en_us/(:any)', '/$1', 307);
// 或更通用的正则(需开启 PCRE UTF-8 支持)
$routes->setTranslateURIDashes(false); // 确保短横线不被转成下划线
$routes->add('^(zh_cn|en_us|ja_jp|ko_kr)/(:any)', '$2', ['filter' => 'no-auto-route']);
注意:add() 规则优先级高于默认路由,必须放在 $routes->set404Override() 和 $routes->get('/', ...) 之前;否则语言段进不了逻辑,控制器收不到真实路径。
Apache 用户还要检查 .htaccess 是否带 [L] 标志,否则重写可能被后续规则覆盖。
RestServer 接口怎么单独配语言
如果你用了 chriskacerguis/codeigniter-restserver,它的语言加载机制和主框架不一致:它默认走 app/Language/,但某些版本会尝试加载 simplified-chinese 这类非标准目录名,而 CI4 只认 zh_cn。
解决方案只有显式加载:
- 在 API 控制器构造函数里,先
$this->response = service('language')->setLocale($lang)->getLine('error_invalid_token'); - 或者绕过服务,直接
lang('error_invalid_token', $lang)——只要$lang是合法目录名(zh_cn),就能命中
容易被忽略的是:CI4 的语言缓存是按 locale + 文件名哈希的,一旦你改了语言目录名或文件内容,要清 writable/cache/ 下的 language 相关文件,否则旧翻译还在生效。











