flobbos/laravel-translatable-db

Laravel多语言模型包

1.4.7 2020-02-26 16:56 UTC

This package is auto-updated.

Last update: 2024-08-25 16:54:08 UTC


README

Laravel Translatable DB

轻松为模型添加多语言支持

该包基于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 步:模型

  1. 可翻译模型Country应该使用特性Flobbos\TranslatableDB\TranslatableDB
  2. 翻译模型的约定为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

然后您需要手动为需要的路由注册中间件。