🌐 多语言

ThinkAdmin 基于 ThinkPHP 提供完善的多语言包管理功能,支持国际化应用开发。

🚀 主要功能

  • 多语言支持: 支持多种语言包切换
  • 分层管理: 全局、应用、动态三种语言包类型
  • 灵活配置: 支持动态配置语言参数
  • 数据字典: 支持数据库存储的动态语言包
  • 自动加载: 自动加载对应语言包文件
  • 缓存优化: 支持语言包缓存提升性能

📋 语言包类型

全局语言包

  • 作用范围: 所有应用都可以使用
  • 文件位置: /lang/LANG.phpThinkLibrary 中定义
  • 命名规则: 文件名称需要与配置名一致
  • 使用场景: 通用语言包,如系统提示、错误信息等

应用语言包

  • 作用范围: 仅在当前应用有效
  • 文件位置: 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');
    }
]);

参照代码:案例

config-language.png

代码中使用

在控制器中使用

<?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'); // 返回 '用户管理'
最近更新:
Contributors: 邹景立, Anyon