🌐 多语言
ThinkAdmin 基于 ThinkPHP 提供完善的多语言包管理功能,支持国际化应用开发。
🚀 主要功能
- 多语言支持: 支持多种语言包切换
- 分层管理: 全局、应用、动态三种语言包类型
- 灵活配置: 支持动态配置语言参数
- 数据字典: 支持数据库存储的动态语言包
- 自动加载: 自动加载对应语言包文件
- 缓存优化: 支持语言包缓存提升性能
📋 语言包类型
全局语言包
- 作用范围: 所有应用都可以使用
- 文件位置:
/lang/LANG.php或 ThinkLibrary 中定义 - 命名规则: 文件名称需要与配置名一致
- 使用场景: 通用语言包,如系统提示、错误信息等
应用语言包
- 作用范围: 仅在当前应用有效
- 文件位置:
app/MODULE/lang/LANG.php - 命名规则: 文件名称需要与配置名一致
- 使用场景: 应用特定的语言包
动态语言包
- 存储方式: 存储在数据字典中
- 内置语言包: "英文字典"、"英文菜单"
- 自定义支持: 支持自定义读取规则
- 使用场景: 方便后期修补错漏的语言包
⚙️ 配置说明
基础配置
- 默认语言:
zh-cn(中文) - 配置文件:
config/lang.php - 切换方式: 后台系统参数配置
- 缓存机制: 支持语言包缓存提升性能
- 自动检测: 支持浏览器语言自动检测
语言包文件
- 全局语言包:
/lang/LANG.php - 应用语言包:
app/MODULE/lang/LANG.php - 动态语言包: 数据字典存储
- 文件格式: 支持 PHP 数组格式
- 编码要求: 建议使用 UTF-8 编码
语言切换
- 实时切换: 支持运行时动态切换语言
- 用户偏好: 支持用户个人语言偏好设置
- 会话保持: 语言设置在用户会话中保持
- 默认回退: 支持语言回退到默认语言
性能优化
- 缓存机制: 语言包自动缓存减少文件读取
- 懒加载: 按需加载语言包内容
- 内存优化: 优化语言包内存使用
- 文件监控: 支持语言包文件变更监控
全局语言包
顾名思义,全局语言包可以在所有应用使用,例如在 ThinkLibrary 中定义的通用语言包。
在框架根目录 /lang/LANG.php 也可以定义指定语言 LANG 的全局语言包,文件名称需要与配置名一致。
示例: /lang/zh-cn.php
<?php
// /lang/zh-cn.php
return [
'system_name' => 'ThinkAdmin',
'welcome' => '欢迎使用',
'login_success' => '登录成功',
'operation_success' => '操作成功',
'operation_failed' => '操作失败',
];应用语言包
仅在当前应用有效,在应用目录下的 app/MODULE/lang/LANG.php 定义,如 app/admin/lang/en-us.php,文件名称需要与配置名一致。
示例: app/admin/lang/zh-cn.php
<?php
// app/admin/lang/zh-cn.php
return [
'user_management' => '用户管理',
'add_user' => '添加用户',
'edit_user' => '编辑用户',
'delete_user' => '删除用户',
];示例: app/admin/lang/en-us.php
<?php
// app/admin/lang/en-us.php
return [
'user_management' => 'User Management',
'add_user' => 'Add User',
'edit_user' => 'Edit User',
'delete_user' => 'Delete User',
];动态语言包
动态语言包是写在数据字典,方便后期修补错漏的语言包,已内置的语言包有 "英文字典"、"英文菜单",其他语言包需要自行编写读取规则。
使用动态语言包
动态语言包存储在数据字典中,可以通过后台系统管理界面进行编辑,无需修改代码文件。
内置动态语言包:
- 英文字典 (
en-dict): 用于英文翻译字典 - 英文菜单 (
en-menu): 用于英文菜单翻译
自定义动态语言包:
<?php
// 在 Service.php 或 sys.php 中注册动态语言包读取规则
use think\facade\Lang;
// 注册动态语言包
Lang::set([
'custom_pack' => function($name) {
// 从数据库读取语言包数据
return \think\facade\Db::name('SystemDict')
->where(['type' => 'custom_pack', 'name' => $name])
->value('content');
}
]);参照代码:案例

代码中使用
在控制器中使用
<?php
declare(strict_types=1);
namespace app\admin\controller;
use think\admin\Controller;
use think\facade\Lang;
/**
* 示例控制器
* @class Example
* @package app\admin\controller
*/
class Example extends Controller
{
public function index()
{
// 使用 lang() 函数获取语言包
$message = lang('welcome');
// 使用 Lang::get() 方法
$title = Lang::get('user_management');
// 带参数的语言包
$info = lang('welcome_user', ['name' => '张三']);
$this->assign('message', $message);
return $this->fetch();
}
}在模板中使用
<!-- 使用 lang() 函数 -->
<h1>{:lang('welcome')}</h1>
<!-- 使用 |lang 过滤器 -->
<p>{$title|lang}</p>
<!-- 带参数的语言包 -->
<p>{:lang('welcome_user', ['name' => $user['name']])}</p>语言包文件格式
语言包文件必须返回一个关联数组:
<?php
// /lang/zh-cn.php
return [
// 简单键值对
'key' => '值',
// 带参数的语言包(使用占位符)
'welcome_user' => '欢迎,{name}!',
'user_count' => '共有 {count} 个用户',
// 嵌套数组(支持多级)
'menu' => [
'user' => '用户管理',
'role' => '角色管理',
],
];使用嵌套语言包:
// 获取嵌套语言包
$menu = lang('menu.user'); // 返回 '用户管理'