somar/translation

V1.2 2024-04-29 16:31 UTC

This package is auto-updated.

Last update: 2024-09-29 17:23:29 UTC


README

此包允许您在数据库中管理模型及其翻译。

安装

  1. 此包可用于Laravel 8.0或更高版本。您可以通过Composer安装此包
composer require somar/translation
  1. 可选:服务提供程序将自动注册。或者,您也可以手动在config/app.php文件中添加服务提供程序
'providers' => [
    // ...
    Somar\Translation\TranslationServiceProvider::class,
];
  1. 您应该发布迁移和种子文件
php artisan vendor:publish --provider="Somar\Translation\TranslationServiceProvider"
  • 如果您只想发布迁移文件
php artisan vendor:publish --provider="Somar\Translation\TranslationServiceProvider" --tag=migrations
  • 如果您只想发布种子文件
php artisan vendor:publish --provider="Somar\Translation\TranslationServiceProvider" --tag=seeders
  1. 运行迁移:在迁移发布后,您可以通过以下命令创建此包的表格
php artisan migrate
  1. 运行种子
php artisan db:seeder --class=TranslationsLanguageSeeder

在执行种子后,您的项目将自动支持阿拉伯语和英语。但是,如果您想添加新语言,您必须以下列方式添加此语言

  • 在TranslatableLanguageSeeder中的$all_languages变量中添加新语言的代码,例如
RequestLanguage::$all_languages = ['en', 'ar', 'code for new language'];
  • 然后您可以添加新语言
TranslationsLanguage::create([
    'code'  => 'code for new language',
    'title' => 'new language name',
]);

注意:您可以通过直接处理translations_languages表来管理语言或对其进行修改。

  1. 在app/Http/Kernel.php类中列出$middleware属性中的中间件类
protected $middlewareGroups = [
        'api' => [
            \Somar\Translation\Middleware\RequestLanguage::class,
            // ...
        ],
    ];

使用说明

设置可翻译模型类

  1. 确定您想要翻译某些列的表的表格后,通过继承TranslatableModel修改此表的模型,如下所示
use Somar\Translation\Database\TranslatableModel;

class Test extends TranslatableModel
{
    // ...
}
  1. 添加一个名为translatable的新受保护变量,此变量的类型必须是数组。您应该在translatable变量中添加您想要从该模型翻译的列。例如
class Employee extends TranslatableModel
{
    // ...
    protected $fillable = [
        'salary'
    ];

    protected $translatable = [
        'name',
        'position',
    ];
}

注意:您不应在迁移文件中添加您想要翻译的列。只需添加没有翻译的另一个列。例如

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('employees', function (Blueprint $table) {
            $table->id();
            $table->float('salary');
            $table->timestamps();
        });
    }
     /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('employees');
    }
}

因为可翻译列将自动存储在数据库中的translations表中。

插入可翻译模型

当您需要插入新记录时,您应该实例化一个新的模型实例并设置模型上的属性。然后,在模型实例上调用save方法。请注意,当您为特定列添加翻译时,您必须将值指定为

  • 字符串值,然后所有翻译值都将具有相同的值。
  • 或作为数组键 => 值。例如
class EmployeeController extends Controller
{
    // ...
    public function store(Request $request)
    {
        // Validate the request...

        $employee = new Employee();

        $employee->name = [
            'en'  => 'name in english',
            'ar'  => 'name in arabic',
        ];
        $employee->position = [
            'en'  => 'position in english',
            'ar'  => 'position in arabic',
        ];
        $employee->salary = 5000,

        $employee->save();
    }
}

您可以使用create方法“保存”新模型,如下所示

class EmployeeController extends Controller
{
    // ...
    public function store(Request $request)
    {
        // Validate the request...

        $employee = Employee::create([
            'name'     => 'translation name',
            'position' => 'translation position',
            'salary'   => 5000,
        ]);
    }
}

如果您想要为请求添加验证,可以使用名为translation_rule()的函数,此方法强制用户以系统支持的所有语言输入值。例如

class EmployeeController extends Controller
{
    // ...
    public function store(Request $request)
    {
        $request->validate([
            'name'      => ['required', 'array', translation_rule()],
            'position'  => ['required', 'array', translation_rule()],
            'salary'    => ['required']
        ]);

        $employee = new Employee();

        $employee->name = $request->name,
        $employee->position = $request->position,
        $employee->salary = $request->salary,

        $employee->save();
    }
}

更新可翻译模型

save方法还可以用于更新数据库中已存在的模型。要更新模型,您应该检索它并设置您想要更新的任何属性。然后,您应该调用模型的save方法。当您更新任何可翻译列时,旧的翻译值将从translations表中删除,并将新的翻译值插入此表。例如

class EmployeeController extends Controller
{
    // ...
    public function update($id ,Request $request)
    {
        // Validate the request...

       $employee = Employee::find($id);

       $employee->name = [
            'en'  => 'name in english',
            'ar'  => 'name in arabic',
        ];
        $employee->position = [
            'en'  => 'position in english',
            'ar'  => 'position in arabic',
        ];

        $employee->save();
    }
}

您可以使用update方法“更新”模型,如下所示

class EmployeeController extends Controller
{
    // ...
    public function update($id ,Request $request)
    {
        // Validate the request...

       $employee = Employee::find($id);

       $employee->update = [
            'name'     => ['en'=> 'name in english','ar'=> 'name in arabic'],
            'position' => ['en'=> 'position in english','ar'=> 'position in arabic'],
       ];
    }
}

删除可翻译模型

要删除模型,您可以调用模型实例上的delete方法:当您删除模型时,其翻译将自动从翻译表中删除。

class EmployeeController extends Controller
{
    // ...
    public function destroy($id)
    {
       $employee = Employee::find($id);

       $employee->delete();
    }
}

检索可翻译模型

当您需要检索模型时,您可以通过这种方式进行

class EmployeeController extends Controller
{
    // ...
    public function show($id)
    {
        $employee = Employee::find($id);

        return $employee;
    }
}

然后以这种方式返回模型及其翻译

{
	"id": 1,
	"name": "name in english",
	"position": "position in english",
	"salary": 5000,
	"translations": {
		"name": {
			"ar": "name in arabic",
			"en": "name in english"
		},
		"position": {
			"ar": "position in english",
			"en": "position in arabic"
		}
	}
}

在此包中,您可以通过发送您想要的语言代码在headers中指定您想要返回的可翻译列的语言,如下所示

Accept-Language : en;

默认情况下,如果您不发送 accept-language 头部信息,系统将使用英语作为默认语言。所有这些功能均由 RequestLanguage 中间件提供。

控制语言

获取所有可用语言

为了确保前后端兼容性,尤其是在前端使用诸如 i18n 这样的著名翻译库时,您需要确保语言代码与语言通用代码相同。为此,输入的代码将根据 Json 文件进行控制。前端可以获取这些语言并将它们显示在下拉列表中,以确保兼容性。

https://www.your-domain.com/languages/available

CRUD 语言

  1. 获取所有语言:返回应用中的语言
Get: https://www.your-domain.com/languages
  1. 添加新语言:以表单数据的形式发送 'title',就像在 TranslatableModel 中插入一样
Post: https://www.your-domain.com/languages
  1. 删除语言
Delete: https://www.your-domain.com/languages/:id

在翻译值中进行搜索

您可以使用以下作用域来完成此操作

WhereTranslation

如下例所示

$searchValue = 'your_search_value';

$products = Product::whereTranslation('name', $searchValue)->get();