aenzenith/laravel-localizable

一个允许在模型属性中轻松实现本地化的包

1.0.0 2023-01-15 02:56 UTC

This package is auto-updated.

Last update: 2024-09-15 06:55:32 UTC


README

此特性提供了一种高效且用户友好的解决方案,可在Laravel应用程序中本地化模型字段。它允许您设置可本地化的字段,而无需添加新的数据库字段,并能够将现有表字段翻译成不同的语言,而无需添加新字段。此特性通过简化可本地化字段的管理和维护,简化了Laravel模型的本地化过程。

安装

要安装此包,可以使用以下命令

composer require aenzenith/laravel-localizable

安装完成后,您需要运行以下命令以准备包以便使用

php artisan migrate

php artisan vendor:publish --provider="Aenzenith\LaravelLocalizable\LocalizableServiceProvider"

通过发布,您可以从config/localizable.php配置文件访问配置文件

使用方法

设置地区列表

您可以通过在config/localizable.php配置文件中将新语言以语言代码和语言名称的形式添加到地区数组中,修改将使用的地区。例如,如果您想将西班牙语和德语添加到可用语言列表中,只需将以下行添加到您的配置文件中

'locales' => [
    'en' => 'English',
    'fr' => 'French',
    /* */
    'es' => 'Spanish',
    'de' => 'German',
],

Localizable特性和$localizable属性添加到您的模型中

use Aenzenith\LaravelLocalizable\Localizable;

class Content extends Model
{
    use HasFactory, Localizable;

    protected $localizable = [
        'title',
        'content',
    ];

    /* ... */
}

添加到$localizable数组中的字段不需要在数据库表中具有对应的字段。这允许您独立于数据库添加可本地化的属性,从而为您提供了处理本地化而无需更改底层表结构的灵活性。

但是,如果您希望本地化模型中的现有字段,则添加到$localizable数组中的字段将在检索模型时以本地化形式返回,而无需对表结构进行任何更改。

本地化过程

您可以使用getLocalizables方法获取模型每个地区的可本地化字段,以便将它们传递到前端。例如

    $localizables = Content::getLocalizables();

    //you can pass also locales list with config('localizable.locales') for language names

    return view('content.create', compact('localizables'));

localizables变量将添加到您的视图数据中

{
  "localizables": {
    "en": {
      "title": null,
      "content": null
    },
    "fr": {
      "title": null,
      "content": null
    },
    "es": {
      "title": null,
      "content": null
    },
    "de": {
      "title": null,
      "content": null
    }
  }
}

您可以使用添加到$localizable数组中的字段创建表单,并将localizables变量传递到表单中。然后,您可以使用localizables变量在表单中创建本地化字段。

这里是一个使用localizables变量的表单示例

<form action="{{ route('content.store') }}" method="POST">
  @csrf @foreach ($localizables as $locale => $fields)
  <div>
    <label>({{ $locale }}) Title</label>
    <input type="text" name="localizations[{{ $locale }}][title]" />
  </div>
  <div>
    <label>({{ $locale }}) Content</label>
    <textarea name="localizations[{{ $locale }}][content]"></textarea>
  </div>
  @endforeach

  <button type="submit">Submit</button>
</form>

在Vue.js和Inertia.js中

    return Inertia::render('Content/Create', [
        'localizables' => Content::getLocalizables(),
    ]);
import { useForm } from "@inertiajs/inertia";
import { defineProps } from "vue";

const props = defineProps({
  localizables: {
    type: Object,
    required: true,
  },
});

const form = useForm({
  localizations: props.localizables,
});

const submit = () => {
  form.post(route("content.store"));
};
<template>
  <form>
    <div v-for="(fields, locale) in localizables" :key="locale">
      <div>
        <label>({{ $locale }}) Title</label>
        <input type="text" v-model="form.localizations[locale].title" />
      </div>
      <div>
        <label>({{ $locale }}) Content</label>
        <textarea v-model="form.localizations[locale].content"></textarea>
      </div>
    </div>

    <button type="button" @click="submit()">Submit</button>
  </form>
</template>

虽然使用localizables变量在表单中创建本地化字段是一个选项,但它不是必需的。您有自由使用您首选的前端框架以符合您项目具体需求和要求的样式设计这些字段。您只需确保在保存到后端时传递正确的参数给使用的方法。以下您可以找到关于控制器方法的信息。

在控制器中保存模型时,您可以使用以下本地化方法来处理本地化数据

  1. localize方法允许您将模型特定字段本地化为特定地区。它接受三个参数:localefieldvalue。例如
    $content = new Content();
    $content->save();

    $content->localize('en', 'title', 'English Title');
    $content->localize('en', 'content', 'English Content');

    $content->localize('fr', 'title', 'French Title');
    $content->localize('fr', 'content', 'French Content');
  1. localizeMany方法允许您将模型多个字段本地化为特定地区。它接受两个参数:locale和一个包含字段及其值的关联数组。例如
    $content->localizeMany(
        'en',
        [
            'title' => 'English Title',
            'content' => 'English Content'
        ]
    );

    $content->localizeMany(
        'fr',
        [
            'title' => 'French Title',
            'content' => 'French Content'
        ]
    );
  1. localizeManyLocales方法允许您将模型本地化为多个地区。它接受一个数组,其中键是地区,值是字段及其值的数组。例如
    $content->localizeManyLocales(
        [
            'en' => [
                'title' => 'English Title',
                'content' => 'English Content'
            ],
            'fr' => [
                'title' => 'French Title',
                'content' => 'French Content'
            ]
        ]
    );

如果您使用 getLocalizables 方法获取本地化数据并在前端进行处理,可以使用 localizeManyLocales 方法轻松创建本地化值。例如

    $content->localizeManyLocales($request->localizations);

检索更新本地化

在调用模型后,您可以使用 getLocalizations 方法获取本地化数据。

    $content = Content::first()->getLocalizations();
    /* or */
    $content = Content::first();
    $content->getLocalizations();

localizations 属性将被添加到您的模型数据中

{
  "localizations": {
    "en": {
      "title": "Englist Title",
      "content": "English Content"
    },
    "fr": {
      "title": "French Title",
      "content": "French Content"
    },
    "es": {
      "title": null,
      "content": null
    },
    "de": {
      "title": null,
      "content": null
    }
  }
}

然后您可以在前端处理本地化值,并将更新的值轻松传递给 localizeManyLocales 方法。例如

    $content->localizeManyLocales($request->localizations);

获取本地化数据

本地化数据将根据应用程序区域自动返回。要更改应用程序区域,可以使用 setLocale 方法。

    app()->setLocale('fr');

如果 $localizable 中添加的字段没有记录,将返回 config/localizable.php 中的 field_fallback_value。如果您想将其返回为 null,请将 field_fallback 选项设置为 false

    'field_fallback' => true,

    'field_fallback_value' => 'This field is not localized yet.',

所有本地化数据都将存储在 localizations 表中。当模型被删除时,相关的本地化数据将被自动删除。

许可证

MIT

支持

如果您有任何问题或建议,请随时联系我。您也可以在 GitHub 上提交一个 issue。

"Buy Me A Coffee"