CodeIgniter 4 实现 URL 语言前缀需配置分组路由、中间件校验 locale、翻译资源按语言目录组织,并动态生成带前缀链接。

CodeIgniter 4 实现 URL 带语言前缀(如 /zh/home、/en/about),核心在于路由识别 + 语言段提取 + 中间件拦截 + 翻译服务集成。它不是开箱即用的功能,需手动配置,但结构清晰、可控性强。
定义带语言前缀的路由规则
CI4 不支持自动路由匹配语言前缀,必须显式声明。语言段应作为第一个路径段,后续路径保持原有语义。
- 在
app/Config/Routes.php中启用分组路由,并为每种语言分别注册:
$routes->group('{locale}', ['namespace' => 'App\Controllers'], function ($routes) {
$routes->get('/', 'Home::index');
$routes->get('/about', 'Page::about');
$routes->get('/contact', 'Page::contact');
});
- 其中
{locale}是通配符,匹配任意语言代码(如zh、en、ja); - CI4 会将匹配值自动注入控制器方法(如
public function index(string $locale)),也可通过$this->request->getUri()->getSegment(1)获取; - 避免使用固定字符串如
/zh/单独写死——那样要为每种语言重复写一遍路由,难以维护。
用中间件提取并设置当前语言
仅靠路由匹配不够,还需在请求生命周期早期解析语言段、校验有效性、存入会话或请求上下文,供后续翻译逻辑使用。
- 创建中间件(如
app/Filters/LocaleFilter.php),在before()方法中处理: - 从 URI 第一个路径段读取语言码:
$locale = $request->getUri()->getSegment(1);; - 验证是否在白名单内(如
['zh', 'en', 'ja']),否则重定向到默认语言或返回 404; - 将有效语言存入 Session:
session()->set('locale', $locale),或绑定到请求属性:$request->setLocale($locale); - 注意:不要直接修改原始 URI 或用
array_unshift()操作路径段,否则易引发重定向循环(尤其当baseURL含子目录时)。
统一管理翻译资源与调用方式
语言前缀只是入口标识,真正实现多语言需配套翻译机制。
- 把翻译文件放在
app/Language/{locale}/下,例如:app/Language/zh/messages.php定义return ['welcome' => '欢迎'];; - 在控制器或视图中使用
lang('welcome')函数,CI4 会根据当前语言自动加载对应语言包; - 若使用 PO/MO 文件,可借助第三方库(如
php-gettext),并在中间件中初始化其语言环境(bind_textdomain_codeset+textdomain); - 建议封装一个
LanguageService,提供getCurrent()、switchTo(string $code)等方法,解耦业务逻辑。
生成带语言前缀的链接和重定向
用户切换语言或点击导航时,链接必须保留当前路径,仅替换语言段。
- 不要硬编码
/zh/contact,而是动态构建:base_url($locale . '/contact'); - 更稳妥的方式是用辅助函数解析当前路径(去掉第一段),再拼接新语言:
$path = implode('/', array_slice($segments, 2));→$url = base_url($newLocale . '/' . $path);; - 重定向时使用
return redirect()->to($url);,确保浏览器地址栏实时更新; - 前端可配合 JS 自动捕获语言切换按钮事件,提交到
/locale/switch接口完成跳转,提升体验。


















