flobbos / laravel-translatable-db
Laravel多语言模型包
Requires
- php: >=7.1.0
- illuminate/support: >=5.5.0
README
轻松为模型添加多语言支持
该包基于https://github.com/dimsav/laravel-translatable,但有所不同的是,它根据language_id
加载翻译,而不是从翻译表中基于字符串的locale
。
该包只处理检索翻译内容。如果您想轻松存储内容,请查看https://github.com/Flobbos/laravel-crudable,该包以兼容的方式在数据库中保存内容。
文档
演示
获取翻译属性
$greece = Country::where('code', 'gr')->first(); echo $greece->translate('en')->name; // Greece App::setLocale('en'); echo $greece->name; // Greece App::setLocale('de'); echo $greece->name; // Griechenland
Laravel 兼容性
安装
安装包
通过执行以下命令将包添加到您的composer.json中。
composer require flobbos/laravel-translatable-db
接下来,将服务提供者添加到config/app.php
。如果自动发现不起作用,此步骤不是必需的。
Flobbos\TranslatableDB\TranslatableDBServiceProvider::class,
迁移方法 1
在此示例中,我们想翻译模型Country
。我们需要一个额外的表country_translations
和一个额外的表languages
。
Schema::create('languages', function(Blueprint $table) { $table->increments('id'); $table->string('locale'); $table->string('name'); } Schema::create('countries', function(Blueprint $table) { $table->increments('id'); $table->string('code'); $table->timestamps(); }); Schema::create('country_translations', function(Blueprint $table) { $table->increments('id'); $table->integer('country_id')->unsigned(); $table->string('name'); $table->string('language_id')->index(); $table->unique(['country_id','language_id']); $table->foreign('country_id')->references('id')->on('countries')->onDelete('cascade'); $table->foreign('language_id')->references('id')->on('languages')->onDelete('cascade'); });
迁移方法 2
Schema::create('languages', function(Blueprint $table) { $table->increments('id'); $table->string('locale'); $table->string('name'); } Schema::create('countries', function(Blueprint $table) { $table->increments('id'); $table->string('code'); $table->string('name'); //the original name lives in this table $table->timestamps(); }); Schema::create('country_translations', function(Blueprint $table) { $table->increments('id'); $table->integer('country_id')->unsigned(); $table->string('name'); $table->string('language_id')->index(); $table->unique(['country_id','language_id']); $table->foreign('country_id')->references('id')->on('countries')->onDelete('cascade'); $table->foreign('language_id')->references('id')->on('languages')->onDelete('cascade'); });
方法 2 假设默认翻译与要翻译的模型位于同一表中。在这种情况下,您必须设置
public $fallbackAttributes = ['name'];
然后将从原始模型的表中检索默认翻译。
第 3 步:模型
- 可翻译模型
Country
应该使用特性Flobbos\TranslatableDB\TranslatableDB
。 - 翻译模型的约定为
CountryTranslation
。
// models/Country.php class Country extends Eloquent { use \Flobbos\TranslatableDB\TranslatableDB; public $translatedAttributes = ['name']; public $fallbackAttributes = ['name']; protected $fillable = ['code']; //protected $fillable = ['code','name']; //if method 2 was used /** * The relations to eager load on every query. * * @var array */ // (optionaly) // protected $with = ['translations']; } // models/CountryTranslation.php class CountryTranslation extends Eloquent { public $timestamps = false; protected $fillable = ['name']; }
数组$translatedAttributes
包含在"Translation"模型中翻译的字段名称。
第 4 步:发布配置
Laravel ^5.3.*
php artisan vendor:publish
使用此命令初始化配置并修改位于app/config/translatable.php
下的创建的文件。
配置
数据库使用
如果您想从数据库中的表加载语言,需要在配置中将其设置为true。
'use_db' => true,
语言模型
默认情况下,语言模型设置为App\Language
,但可以是任何您想要的内容。
'language_model' => 'App\Whatever'
语言数组
如果您更喜欢使用配置文件来存储基于语言的信息,您可以设置语言数组以满足您的需求。我们仍然将依靠语言_id作为每个语言的标识符。
'language_array' => [ 'de' => ['name' => 'Deutsch', 'language_id' => '1'], 'en' => ['name' => 'English', 'language_id' => '2'], 'fr' => ['name' => 'Français', 'language_id' => '3'] ]
后备
有时翻译可能会缺失。在这种情况下,我们可以使用后备翻译来防止页面上出现缺失内容。
'use_fallback' => true,
如果您不想使用后备,只需将其设置为false,如果没有合适的翻译可用,您将得到null
。
默认后备
默认后备根据包中的数据库或非数据库使用情况而异。您可以在配置中通过以下任一选项设置这些选项:
'fallback_locale' => 'de'
或
'fallback_locale_id' => 1,
本地模式
有时内容已经添加到需要翻译的表中。为了防止将现有内容迁移到我们的翻译表中造成混乱,我们有一个选项可以使用本地模式。这将假设默认内容位于翻译模型的表中。
'native_mode' => true
地区键
用于在翻译表中查找对应翻译的键。我们假设使用language_id,因为这是在整个包中使用的,但您可以根据需要在此处设置。
'locale_key' => 'language_id',
这还将设置由中间件推送到请求的值。
地区列
我们需要通过调用app()->getLocale()
来识别当前地区,并在数据库中找到对应的语言。如果您的语言标识符在数据库中不是'locale',您可以在此处设置。
'locale_column' => 'locale',
转换为数组翻译
当您的翻译模型以数组或JSON格式输出时,情况会变得复杂。如果翻译没有加载到模型中,则在调用任一函数时都会被省略。使用此设置,您可以强制将翻译推入模型。注意不要进行不必要的n次查询!
'to_array_always_loads_translations' => true,
中间件默认值
如果您不想在所有路由上使用中间件,则将其设置为false,并在需要的地方添加中间件。
'middleware_default' => false
翻译模型
定义翻译模型类时使用的约定是在关键字后附加Translation
。
因此,如果您的模型是\MyApp\Models\Country
,则默认翻译为\MyApp\Models\CountryTranslation
。
要使用自定义类作为翻译模型,请将包括命名空间在内的翻译类定义为参数。例如
<?php namespace MyApp\Models; use Flobbos\TranslatableDB\TranslatableDB; use Illuminate\Database\Eloquent\Model as Eloquent; class Country extends Eloquent { use TranslatableDB\TranslatableDB; public $translationModel = MyApp\Models\CountryAwesomeTranslation::class; }
多态翻译
有时翻译在多态表中。为了使此功能正常工作,您需要对您的模型进行以下更改。
namespace MyApp\Models; use Flobbos\TranslatableDB\TranslatableDB; use Flobbos\TranslatableDB\Contracts\PolyTrans; use Illuminate\Database\Eloquent\Model as Eloquent; class Country extends Eloquent implements PolyTrans { use TranslatableDB; public $translationModel = MyApp\Models\CountryAwesomeTranslation::class; //Set your polymorphic key here protected $translationForeignKey = 'translatable'; }
通过实现PolyTrans合约,TranslatableDB知道需要以不同的方式处理翻译。翻译键也需要设置,因为否则TranslatableDB会自动设置键,这在多态关系中将不起作用。
中间件
默认值
默认情况下,中间件由服务提供者推送到内核。如果配置中将DB使用设置为true,则中间件解析配置中设置的翻译模型,并将'language_id'参数加载到每个请求中。使用此language_id属性,可以自动将相应的翻译加载到模型中。
自定义
如果您只想从数据库中加载特定路由的翻译内容,您可以在配置中设置此选项
'middleware_default' => false
然后您需要手动为需要的路由注册中间件。