logo

本地化

概述

Nova 可以使用 Laravel 的 本地化服务 进行完全本地化。在安装过程中运行 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
/**
 * Get the displayable label of the resource.
 *
 * @return string
 */
public static function label()
{
    return __('Posts');
}

/**
 * Get the displayable singular label of the resource.
 *
 * @return string
 */
public static function singularLabel()
{
    return __('Post');
}

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

php
/**
 * Get the text for the create resource button.
 *
 * @return string|null
 */
public static function createButtonLabel()
{
    return __('Publish Post');
}

/**
 * Get the text for the update resource button.
 *
 * @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
/**
 * Get the displayable label of the resource.
 *
 * @return string
 */
public static function label()
{
    return __('Posts');
}

/**
 * Get the displayable singular label of the resource.
 *
 * @return string
 */
public static function singularLabel()
{
    return __('Post');
}

过滤器

过滤器名称可以通过覆盖过滤器类上的name方法来本地化

php
/**
 * Get the displayable name of the filter.
 *
 * @return string
 */
public function name()
{
    return __('Admin Users');
}

透镜

透镜名称可以通过覆盖透镜类上的name方法来本地化

php
/**
 * Get the displayable name of the lens.
 *
 * @return string
 */
public function name()
{
    return __('Most Valuable Users');
}

操作

操作名称可以通过覆盖操作类上的name方法来本地化

php
/**
 * Get the displayable name of the action.
 *
 * @return string
 */
public function name()
{
    return __('Email Account Profile');
}

指标

指标名称可以通过覆盖指标类上的name方法来本地化

php
/**
 * Get the displayable name of the metric.
 *
 * @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 组件中使用__助手来访问这些翻译。为此,请将以下 mixin 添加到您的 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>