administrcms/localization

此软件包最新版本(0.1)没有提供许可信息。

0.1 2019-10-25 05:56 UTC

This package is auto-updated.

Last update: 2024-08-24 22:45:32 UTC


README

尽管它是为与aministr包一起使用而编写的,但您可以使用此包与Laravel 5.2独立使用。

它仍在开发中。

安装

使用 Composer

composer require administrcms/localization

添加服务提供者

\Administr\Localization\LocalizationServiceProvider::class,

外观

'Locale'    => \Administr\Localization\LocalizationFacade::class,

在您的App Kernel中注册中间件,并确保在注册它之前注册会话中间件

\Administr\Localization\LocalizationMiddleware::class,

它做什么

它基本上检查并持久化当前语言到会话中,并假设您在路由中使用参数来指定语言。如果您使用不同的方法来更改语言,您可以注册自己的中间件并利用此包中包含的Localizator类。

它还创建了一个用于存储可用语言的表,并在命名空间 Administr\Localization\Language 下有一个Language模型。如果您数据库中有多语言数据,它还提供了一个 Translatable 模型,该模型扩展了基本Eloquent模型并增加了翻译功能。

可翻译模型的使用

您需要创建两个表 - 一个用于存储非可翻译的主要模型数据,另一个用于存储翻译。

它们可能看起来像这样

Schema::create('people', function (Blueprint $table) {
    $table->increments('id');
    $table->boolean('is_visible')->default(0);
    $table->timestamps();
});

Schema::create('people_translations', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('language_id')->unsigned();
    $table->integer('person_id')->unsigned();

    $table->string('name', 100);
    $table->string('position', 100);

    $table->timestamps();

    $table->foreign('language_id')->references('id')->on('administr_languages')->onDelete('cascade');
    $table->foreign('person_id')->references('id')->on('people')->onDelete('cascade');
});

相应的模型

// Person.php

namespace App\Models;

use Administr\Localization\Models\Translatable;

class Person extends Translatable
{
    protected $table = 'people';
    protected $fillable = ['is_visible', 'name', 'position'];
    protected $translatable = ['name', 'position'];
}

// PersonTranslation.php

use Illuminate\Database\Eloquent\Model;

class PersonTranslation extends Model
{
    protected $table = 'people_translations';
    protected $fillable = ['language_id', 'name', 'position'];
}

然后在您的应用程序代码中

 // Get the first model with translation in the current app locale
$person = Person::translated()->first();

 // Translated in the language with id of 1
$person = Person::translated(1)->first();

// Translated in the language with code of 'bg'.
// Have in mind that when you do it like this,
// an additional query will be made to find the language id.
$person = Person::translated('bg')->first();

$person->name; // You can access the translation model properties through the main model

// Create an instance of the main model
// with a translation in the current locale.
// If you do not pass translatable fields,
// only the main model will be persisted.
Person::create([
    'name'      => 'Miroslav Vitanov',
    'position'  => 'Developer',
]);

// Updates the model and the translation that was
// created in the current locale.
Person::find(1)->update([
    'name'      => 'Miroslav Vitanov',
    'position'  => 'PHP Developer',
]);

// Translate a model in another language.
// You can pass a locale code or language id.
Person::find(1)->translate('bg')
->fill([
   'name'      => 'Мирослав Витанов',
   'position'  => 'Програмист',
])
->save();

// Check if any translations exist
$person->hasTranslations();

// Check if a translation with language id exists
$person->isTranslatedIn(1);

// Get all translations
$person->translations;

// When a model is serialized to an array,
// it will include the current translation
$person->toArray();