CodeIgniter语言类仅处理静态文本翻译,数据库多语言需自建结构:推荐用分离表(如article_translations)按locale关联查询;次选JSON字段存储;须封装模型方法统一获取,并在后台支持多语言编辑与级联删除。

CodeIgniter 的语言类($this->lang)只负责静态文本的翻译,比如按钮文字、提示信息、表单标签等。它不处理数据库内容的多语言切换——数据库里的文章标题、产品描述、菜单名称等内容,需要你自己设计多语言存储结构和读取逻辑。
下面分三块说清楚怎么做:
数据库字段设计支持多语言
最常见也推荐的方式是:为每个需多语言的内容建独立语言表,或用 JSON 字段存多语言值。
-
✅ 推荐方式:分离表结构
比如articles表存通用字段(id, created_at),另建article_translations表:CREATE TABLE article_translations ( id INT PRIMARY KEY AUTO_INCREMENT, article_id INT NOT NULL, locale VARCHAR(10) NOT NULL, -- 如 'zh_cn', 'en_us' title VARCHAR(255), content TEXT, slug VARCHAR(100), UNIQUE KEY(article_id, locale) );查询时根据当前语言码(如
$this->config->item('language'))JOIN 或 WHERE 匹配:$lang = $this->config->item('language'); // 'zh_cn' $this->db->join('article_translations', "articles.id = article_translations.article_id AND article_translations.locale = '$lang'"); -
⚠️ 简化方式:JSON 字段(适合字段少、语言不多)
在articles表中加一个title_i18n JSON字段,存:{"zh_cn": "用户指南", "en_us": "User Guide", "ja_jp": "ユーザーガイド"}PHP 中取出后解码,再按
$lang取值:$titles = json_decode($row->title_i18n, true); $title = $titles[$lang] ?? $titles['en_us'];
控制器里统一获取当前语言内容
别在每个方法里重复判断语言,建议封装成模型方法或服务类:
// 在 Article_model.php 中
public function get_by_id($id) {
$lang = $this->config->item('language');
return $this->db->select('a.*, t.title, t.content')
->from('articles a')
->join('article_translations t', "a.id = t.article_id AND t.locale = '{$lang}'")
->where('a.id', $id)
->get()->row();
}注意:$lang 必须是已正确设置的(即 MY_Controller 中已完成 $this->config->set_item('language', $lang)),否则会查不到数据。
后台管理需支持多语言编辑
- 前端表单要为每种语言提供输入框(如 Tab 切换或折叠面板);
- 提交时把各语言内容分别写入
article_translations表,主表articles只存非语言相关字段; - 删除文章时,连带删掉所有对应翻译记录(或用外键
ON DELETE CASCADE)。
不推荐的做法:
❌ 在同一张表里为每种语言建一列(如 title_zh, title_en)——扩展性差、迁移难、查询冗余。
基本上就这些。数据库多语言不是框架自动搞定的,但结构清晰、逻辑集中后,维护和切换都很稳。


















