mosab/translation

v1.0.2 2023-05-29 17:49 UTC

This package is auto-updated.

Last update: 2024-09-29 20:46:07 UTC


README

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

安装

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

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

  • 在TranslationsLanguageSeeder中的$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' => [
            \Mosab\Translation\Middleware\RequestLanguage::class,
            // ...
        ],
    ];

使用说明

设置可翻译模型类

  1. 确定您想要翻译某些列的表的表格后,通过继承TranslatableModel修改此表的模型,如下所示
use Mosab\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方法:当您删除模型时,其翻译将从translation表中自动删除。

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"
		}
	}
}

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

Accept-Language : en;

默认情况下,如果您未发送accept-language头信息,它将默认采用英语。所有这些功能均由RequestLanguage中间件提供。