Nova 可以使用 Laravel 的 本地化服务 进行完全本地化。在安装过程中运行 nova:install
命令后,您的应用程序将包含一个 lang/vendor/nova
翻译目录。
在这个目录中,您可以自定义 en.json
文件或为您的语言创建一个新的 JSON 翻译文件。此外,en
目录包含一些额外的验证翻译行,这些行由 Nova 使用。
要快速为您的语言创建一个新的翻译文件,您可以执行 nova:translate
Artisan 命令。此命令将简单地复制默认的 en.json
翻译文件,允许您开始将字符串翻译成您自己的语言
php artisan nova:translate es
Laravel Nova 前端库,包括浏览器、Numbro.js、Luxon 和其他库,默认情况下将使用通过 app()->getLocale()
可用的区域设置值。但是,如果您的应用程序仅使用 ISO 639-1 语言代码 (en
),您可能希望考虑将您的语言迁移到 IETF 语言标签 (en-US
、en-GB
),以便在 Nova 使用的各种前端库中获得更广泛的支持。
要将您现有的区域设置映射到 IETF 语言标签,您可以使用 Nova::userLocale
方法。通常,您应该在应用程序的 NovaServiceProvider
的 boot
方法中调用此方法
use Laravel\Nova\Nova;
Nova::userLocale(function () {
return match (app()->getLocale()) {
'en' => 'en-US',
'de' => 'de-DE',
default => null,
};
});
可以通过覆盖资源类上的 label
和 singularLabel
方法来本地化资源名称
/**
* 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');
}
要自定义资源的创建和更新按钮的标签,您可以覆盖资源上的 createButtonLabel
和 updateButtonLabel
方法
/**
* 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');
}
当您将字段附加到资源时,字段名称可以被本地化。所有字段的第一个参数是它的显示名称,您可以自定义它。例如,您可以像这样本地化电子邮件地址字段的标题
use Laravel\Nova\Fields\Text;
Text::make(__('Email Address'), 'email_address');
关系字段名称可以通过本地化传递给字段定义的第一个参数来自定义。Nova 关系字段的第二个和第三个参数分别是关系方法名称和相关的 Nova 资源
use App\Nova\Post;
use Laravel\Nova\Fields\HasMany;
HasMany::make(__('Posts'), 'posts', Post::class);
此外,您还应该覆盖相关资源上的label
和singularLabel
方法
/**
* 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
方法来本地化
/**
* Get the displayable name of the filter.
*
* @return string
*/
public function name()
{
return __('Admin Users');
}
透镜名称可以通过覆盖透镜类上的name
方法来本地化
/**
* Get the displayable name of the lens.
*
* @return string
*/
public function name()
{
return __('Most Valuable Users');
}
操作名称可以通过覆盖操作类上的name
方法来本地化
/**
* Get the displayable name of the action.
*
* @return string
*/
public function name()
{
return __('Email Account Profile');
}
指标名称可以通过覆盖指标类上的name
方法来本地化
/**
* Get the displayable name of the metric.
*
* @return string
*/
public function name()
{
return __('Total Users');
}
要将您的本地化传播到前端,您应该在您的NovaServiceProvider
中调用Nova::translations
方法
Nova::serving(function () {
Nova::translations($pathToFile);
});
您也可以传递一个键值对数组,表示每个本地化
Nova::serving(function () {
Nova::translations([
'Total Users' => 'Total Users'
]);
});
与 Laravel 一样,您可以在自定义 Vue 组件中使用__
助手来访问这些翻译。为此,请将以下 mixin 添加到您的 Inertia 页面组件或 Vue 组件
<template>
<h2>{{ __('Total Users') }}</h2>
</template>
<script>
import { Localization } from 'laravel-nova'
export default {
mixins: [Localization]
// ...
}
</script>
如果您的组件使用 Vue Composition API,您可以使用useLocalization
可组合项来本地化您的组件
<template>
<h2>{{ __('Total Users') }}</h2>
</template>
<script setup>
import { useLocalization } from 'laravel-nova'
const { __ } = useLocalization()
// ...
</script>