somar / translation
翻译包
Requires
- php: >=8.0
- illuminate/support: >=5.0
This package is auto-updated.
Last update: 2024-09-29 17:23:29 UTC
README
此包允许您在数据库中管理模型及其翻译。
安装
- 此包可用于Laravel 8.0或更高版本。您可以通过Composer安装此包
composer require somar/translation
- 可选:服务提供程序将自动注册。或者,您也可以手动在config/app.php文件中添加服务提供程序
'providers' => [ // ... Somar\Translation\TranslationServiceProvider::class, ];
- 您应该发布迁移和种子文件
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
- 运行迁移:在迁移发布后,您可以通过以下命令创建此包的表格
php artisan migrate
- 运行种子
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表来管理语言或对其进行修改。
- 在app/Http/Kernel.php类中列出$middleware属性中的中间件类
protected $middlewareGroups = [ 'api' => [ \Somar\Translation\Middleware\RequestLanguage::class, // ... ], ];
使用说明
设置可翻译模型类
- 确定您想要翻译某些列的表的表格后,通过继承TranslatableModel修改此表的模型,如下所示
use Somar\Translation\Database\TranslatableModel; class Test extends TranslatableModel { // ... }
- 添加一个名为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 语言
- 获取所有语言:返回应用中的语言
Get: https://www.your-domain.com/languages
- 添加新语言:以表单数据的形式发送 'title',就像在 TranslatableModel 中插入一样
Post: https://www.your-domain.com/languages
- 删除语言
Delete: https://www.your-domain.com/languages/:id
在翻译值中进行搜索
您可以使用以下作用域来完成此操作
WhereTranslation
如下例所示
$searchValue = 'your_search_value';
$products = Product::whereTranslation('name', $searchValue)->get();