多语言

Dcat Admin中使用多语言翻译非常方便,数据表格、数据表单、数据详情和模型树的字段都支持自动读取语言包翻译,具体可参考表格字段翻译表单字段翻译数据详情字段翻译

语言包文件

语言包文件类型大概如下

  1. resources/lang
  2. ├── ...
  3. └── en
  4. ├── admin.php # 系统内容语言包,包括菜单标题翻译等都在里面
  5. ├── global.php # 控制器公共语言包
  6. ├── {xxx}.php # 控制器语言包,一个控制器对应一个语言包
  7. └── ...

控制器语言包名称需要与控制器名相对应,例如控制器名UserProfileController,则对应的语言包为resources/lang/{当前语言}/user-profile.php(需要转化为小写中划线风格)。

控制器语言包内容格式

控制器语言包(包括global.php)中的内容分为三个类别:

  • fields 数据字段的翻译,这个类别下放置数据字段的翻译
  • labels 自定义内容翻译,这个类别下是对数据字段外的内容翻译,可以是任何自定义内容
  • options 枚举选项翻译

下面是例子:

假设控制器语言包user-profile.php内容如下:

  1. <?php
  2. return [
  3. 'labels' => [
  4. 'UserProfile' => '用户中心',
  5. 'list' => '列表',
  6. 'pagination' => [
  7. 'range' => '从 :first 到 :last ,总共 :total 条',
  8. ],
  9. ],
  10. 'fields' => [
  11. 'name' => '名称',
  12. 'published' => '发布',
  13. 'author' => '作者',
  14. 'status' => '状态',
  15. ],
  16. 'options' => [
  17. 'status' => [
  18. 0 => '未激活',
  19. 1 => '已激活',
  20. ],
  21. ],
  22. ];

则语言包可以这么使用

  1. class UserProfileController extend AdminController
  2. {
  3. public function title()
  4. {
  5. // labels翻译示例,最终翻译成 “用户中心”
  6. return admin_trans_label('UserProfile');
  7. }
  8. // fields和options翻译示例
  9. public function grid()
  10. {
  11. $grid = new Grid(new UserProfile());
  12. // 显示调用语言包翻译,这里会把 “name” 字段翻译成 “名称”
  13. $grid->name(admin_trans_field('name'));
  14. // 隐式使用语言包翻译,“author” 字段会自动翻译成 “作者”
  15. $grid->author;
  16. // 调用options翻译
  17. $grid->status()->using(admin_trans('user-profile.options.status'));
  18. return $grid;
  19. }
  20. }

使用

admin_trans_field

这个函数用于翻译fields类别下内容,会自动找对应控制器下的翻译文件,如果翻译不存在会去找global.php中的翻译。

  1. admin_trans_field('name');

admin_trans_label

这个函数用于翻译labels类别下内容,会自动找对应控制器下的翻译文件,如果翻译不存在会去找global.php中的翻译。

  1. admin_trans_label('Posts');
  2. admin_trans_label('pagination.range', ['first' => 1, 'last' => 1, 'total' => 0]);

admin_trans_option

这个函数用于翻译options类别下内容,会自动找对应控制器下的翻译文件,如果翻译不存在会去找global.php中的翻译。

  1. admin_trans_option(1, 'status');

admin_trans

此方法与Laravel框架自带的trans方法用法没有区别,唯一的区别是:当翻译的内容找不到时,会去global.php中再找一次。

  1. // 先去 user.php 中找 first_name 的翻译,如果找不到会去 global.php 中找
  2. admin_trans('user.first_name');

公共翻译文件

所有常用的翻译都可以放在resources/lang/{当前语言}/global.php中,当控制器翻译文件不存在时会读取公共翻译文件翻译。

  1. <?php
  2. return [
  3. 'fields' => [
  4. 'id' => 'ID',
  5. 'name' => '名称',
  6. 'username' => '用户名',
  7. 'email' => '邮箱',
  8. 'password' => '密码',
  9. ],
  10. 'labels' => [
  11. 'list' => '列表',
  12. 'edit' => '编辑',
  13. 'detail' => '详细',
  14. 'create' => '创建',
  15. 'root' => '顶级',
  16. 'scaffold' => '代码生成器',
  17. ],
  18. 'options' => [
  19. ],
  20. ];

默认面包屑翻译

例如你的访问路径是/admin/my-users,控制器是MyUserController,那么则可以在控制器对应的翻译文件中加上

  1. return [
  2. 'labels' => [
  3. 'my-users' => '用户',
  4. ],
  5. ...
  6. ];