logo

本地化

概述

Nova 可以使用 Laravel 的 localization services 进行完全本地化。在安装过程中运行 nova:install 命令后。你的应用程序将包含一个 lang/vendor/nova 翻译目录。

在此目录下,您可以自定义 en.json 文件或为你的语言创建新的 JSON 翻译文件。此外,en 目录还包含一些 Nova 使用的附加验证翻译行。

创建新的本地化文件

要快速为你的语言创建一个新的翻译文件,你可以执行 nova:translate Artisan 命令。该命令将简单复制默认的 en.json 翻译文件,让你可以开始将字符串翻译成自己的语言:

bash
php artisan nova:translate es

用户区域设置重写

Laravel Nova 前端库,包括浏览器、Numbro.js、Luxon 和其他库,默认情况下都会使用 app()->getLocale() 所提供的本地化值。但是,如果你的应用程序只使用 ISO 639-1 语言代码 (en),你可以考虑将语言迁移到 IETF 语言标记 (en-USen-GB),以便在 Nova 使用的各种前端库中获得更广泛的支持。

要将你现有的本地化映射到 IETF 语言标记,你可以使用 Nova::userLocale 方法。通常,你应在应用程序的 NovaServiceProviderboot 方法中调用该方法:

php
use Laravel\Nova\Nova;

Nova::userLocale(function () {
    return match (app()->getLocale()) {
        'en' => 'en-US',
        'de' => 'de-DE',
        default => null,
    };
});

资源

可通过覆盖资源类上的 labelsingularLabel 方法对资源名称进行本地化:

php
/**
 * 获取资源的可显示标签。
 *
 * @return string
 */
public static function label()
{
    return __('Posts');
}

/**
 * 获取资源的可显示单数标签。
 *
 * @return string
 */
public static function singularLabel()
{
    return __('Post');
}

要自定义资源的创建和更新按钮的标签,可以覆盖资源上的 createButtonLabelupdateButtonLabel 方法:

php
/**
 * 获取创建资源按钮的文本。
 *
 * @return string|null
 */
public static function createButtonLabel()
{
    return __('Publish Post');
}

/**
 * 获取更新资源按钮的文本。
 *
 * @return string|null
 */
public static function updateButtonLabel()
{
    return __('Save Changes');
}

字段

在将字段附加到资源时,可以对字段名称进行本地化。所有字段的第一个参数都是显示名称,你可以对其进行自定义。例如,你可以这样本地化电子邮件地址字段的标题:

php
use Laravel\Nova\Fields\Text;

Text::make(__('Email Address'), 'email_address');

关联

关联字段名称可以通过本地化传给字段定义的第一个参数来定制。Nova 关联字段的第二和第三个参数分别是关联方法名称和相关 Nova 资源:

php
use App\Nova\Post;
use Laravel\Nova\Fields\HasMany;

HasMany::make(__('Posts'), 'posts', Post::class);

此外,你还应覆盖相关资源上的 labelsingularLabel 方法:

php
/**
 * 获取资源的可显示标签。
 *
 * @return string
 */
public static function label()
{
    return __('Posts');
}

/**
 * 获取资源的可显示单数标签。
 *
 * @return string
 */
public static function singularLabel()
{
    return __('Post');
}

过滤器

过滤器名称可通过覆盖过滤器类上的 name 方法进行本地化:

php
/**
 * 获取过滤器的可显示名称。
 *
 * @return string
 */
public function name()
{
    return __('Admin Users');
}

镜头

镜头名称可通过覆盖镜头类的 name 方法进行本地化:

php
/**
 * 获取镜头的可显示名称。
 *
 * @return string
 */
public function name()
{
    return __('Most Valuable Users');
}

动作

可通过覆盖动作类的 name 方法来本地化动作名称:

php
/**
 * 获取动作的可显示名称。
 *
 * @return string
 */
public function name()
{
    return __('Email Account Profile');
}

指标

可通过覆盖指标类上的 name 方法对指标名称进行本地化:

php
/**
 * 获取指标的可显示名称。
 *
 * @return string
 */
public function name()
{
    return __('Total Users');
}

前端

要将本地化传播到前端,你应调用 NovaServiceProvider 中的 Nova::translations 方法:

php
Nova::serving(function () {
    Nova::translations($pathToFile);
});

你还可以传递一个由 键/值 对组成的数组,代表每个本地化:

php
Nova::serving(function () {
    Nova::translations([
        'Total Users' => 'Total Users'
    ]);
});

与 Laravel 一样,你可以在自定义 Vue 组件中使用 __ 助手来访问这些翻译。为此,请在 Inertia 页面组件或 Vue 组件中添加以下混合函数:

vue
<template>
  <h2>{{ __('Total Users') }}</h2>
</template>

<script>
import { Localization } from 'laravel-nova'

export default {
  mixins: [Localization]

  // ...
}
</script>

如果你的组件使用 Vue Composition API,你可以使用 useLocalization 可组合来本地化你的组件:

vue
<template>
  <h2>{{ __('Total Users') }}</h2>
</template>

<script setup>
import { useLocalization } from 'laravel-nova'

const { __ } = useLocalization()

// ...
</script>