多语言
<h1>多语言</h1>
<p>在<code>Dcat Admin</code>中使用多语言翻译非常方便,数据表格、数据表单、数据详情和模型树的字段都支持自动读取语言包翻译,具体可参考<a href="model-grid-trans.md">表格字段翻译</a>、<a href="model-form-trans.md">表单字段翻译</a>、<a href="model-show-trans.md">数据详情字段翻译</a>。</p>
<h2>语言包文件</h2>
<p>语言包文件类型大概如下</p>
<pre><code class="language-bash">resources/lang
├── ...
└── en
├── admin.php # 系统内容语言包,包括菜单标题翻译等都在里面
├── global.php # 控制器公共语言包
├── {xxx}.php # 控制器语言包,一个控制器对应一个语言包
└── ... </code></pre>
<p>控制器语言包名称需要与控制器名相对应,例如控制器名<code>UserProfileController</code>,则对应的语言包为<code>resources/lang/{当前语言}/user-profile.php</code>(需要转化为小写中划线风格)。</p>
<h2>控制器语言包内容格式</h2>
<p>控制器语言包(包括<code>global.php</code>)中的内容分为三个类别:</p>
<ul>
<li><code>fields</code> 数据字段的翻译,这个类别下放置数据字段的翻译</li>
<li><code>labels</code> 自定义内容翻译,这个类别下是对数据字段外的内容翻译,可以是任何自定义内容</li>
<li><code>options</code> 枚举选项翻译</li>
</ul>
<p>下面是例子:</p>
<p>假设控制器语言包<code>user-profile.php</code>内容如下:</p>
<pre><code class="language-php">&lt;?php
return [
'labels' =&gt; [
'UserProfile' =&gt; '用户中心',
'list' =&gt; '列表',
'pagination' =&gt; [
'range' =&gt; '从 :first 到 :last ,总共 :total 条',
],
],
'fields' =&gt; [
'name' =&gt; '名称',
'published' =&gt; '发布',
'author' =&gt; '作者',
'status' =&gt; '状态',
],
'options' =&gt; [
'status' =&gt; [
0 =&gt; '未激活',
1 =&gt; '已激活',
],
],
];</code></pre>
<p>则语言包可以这么使用</p>
<pre><code class="language-php">class UserProfileController extend AdminController
{
public function title()
{
// labels翻译示例,最终翻译成 “用户中心”
return admin_trans_label('UserProfile');
}
// fields和options翻译示例
public function grid()
{
$grid = new Grid(new UserProfile());
// 显示调用语言包翻译,这里会把 “name” 字段翻译成 “名称”
$grid-&gt;name(admin_trans_field('name'));
// 隐式使用语言包翻译,“author” 字段会自动翻译成 “作者”
$grid-&gt;author;
// 调用options翻译
$grid-&gt;status()-&gt;using(admin_trans('user-profile.options.status'));
return $grid;
}
}</code></pre>
<h2>使用</h2>
<h3>admin_trans_field</h3>
<p>这个函数用于翻译<code>fields</code>类别下内容,会自动找对应控制器下的翻译文件,如果翻译不存在会去找<code>global.php</code>中的翻译。</p>
<pre><code class="language-php">admin_trans_field('name');</code></pre>
<h3>admin_trans_label</h3>
<p>这个函数用于翻译<code>labels</code>类别下内容,会自动找对应控制器下的翻译文件,如果翻译不存在会去找<code>global.php</code>中的翻译。</p>
<pre><code class="language-php">admin_trans_label('Posts');
admin_trans_label('pagination.range', ['first' =&gt; 1, 'last' =&gt; 1, 'total' =&gt; 0]);</code></pre>
<h3>admin_trans_option</h3>
<p>这个函数用于翻译<code>options</code>类别下内容,会自动找对应控制器下的翻译文件,如果翻译不存在会去找<code>global.php</code>中的翻译。</p>
<pre><code class="language-php">admin_trans_option(1, 'status');</code></pre>
<h3>admin_trans</h3>
<p>此方法与<code>Laravel</code>框架自带的<code>trans</code>方法用法没有区别,唯一的区别是:当翻译的内容找不到时,会去<code>global.php</code>中再找一次。</p>
<pre><code class="language-php">// 先去 user.php 中找 first_name 的翻译,如果找不到会去 global.php 中找
admin_trans('user.first_name');</code></pre>
<h2>公共翻译文件</h2>
<p>所有常用的翻译都可以放在<code>resources/lang/{当前语言}/global.php</code>中,当控制器翻译文件不存在时会读取公共翻译文件翻译。</p>
<pre><code class="language-php">&lt;?php
return [
'fields' =&gt; [
'id' =&gt; 'ID',
'name' =&gt; '名称',
'username' =&gt; '用户名',
'email' =&gt; '邮箱',
'password' =&gt; '密码',
],
'labels' =&gt; [
'list' =&gt; '列表',
'edit' =&gt; '编辑',
'detail' =&gt; '详细',
'create' =&gt; '创建',
'root' =&gt; '顶级',
'scaffold' =&gt; '代码生成器',
],
'options' =&gt; [
],
];</code></pre>
<h2>默认面包屑翻译</h2>
<p>例如你的访问路径是<code>/admin/my-users</code>,控制器是<code>MyUserController</code>,那么则可以在控制器对应的翻译文件中加上</p>
<pre><code class="language-php">return [
'labels' =&gt; [
'my-users' =&gt; '用户',
],
...
];</code></pre>