organi/translatables

2.10.0 2023-02-13 13:36 UTC

This package is auto-updated.

Last update: 2024-08-29 07:43:28 UTC


README

您可以通过 composer 安装此包

composer require organi/translatables

您可以使用以下命令发布和运行迁移

php artisan vendor:publish --provider="Organi\Translatables\TranslatablesServiceProvider" --tag="translatables-migrations"
php artisan migrate

您可以使用以下命令发布配置文件

php artisan vendor:publish --provider="Organi\Translatables\TranslatablesServiceProvider" --tag="translatables-config"

这是已发布配置文件的内容

return [
    'accepted_locales' => [
        'nl', 'en', 'fr', 'de',
    ],
];

用法

使您的 eloquent 模型可翻译。

为您的模型创建一个 _translations 表。

Schema::create('products', function (Blueprint $table) {
    $table->id();
    $table->string('code');
    $table->timestamps();
});

Schema::create('products_translations', function (Blueprint $table) {
    $table->translations('translations');
    $table->string('name');
    $table->text('description');
});

HasTranslations 特性添加到您的模型中,并包含可翻译字段的 localizable 数组。

use Organi\Translatables\Traits\HasTranslations;

class Product extends Model
{
    use HasTranslations;

    /**
     * The attributes that should be translatable.
     */
    protected array $localizable = [
        'name', 'description'
    ];
}

设置可翻译字段

现在您可以为模型的名字属性添加一个翻译。

use Organi\Translatables\Models\Translation;
...
$product->name = Translation::make([
    'nl' => 'Lorem ipsum dolor sit amet',
    'en' => 'Lorem ipsum dolor sit amet',
    'fr' => 'Lorem ipsum dolor sit amet',
]);

您也可以设置一个数组,模型将把它转换为翻译

$product->name = [
    'nl' => 'Lorem ipsum dolor sit amet',
    'en' => 'Lorem ipsum dolor sit amet',
    'fr' => 'Lorem ipsum dolor sit amet',
];

您也可以将属性设置为任何非数组的值。在这种情况下,应用默认区域设置将设置为该值。

$product->name = 'Lorem ipsum dolor sit amet';

/* returns:
Organi\Translatables\Models\Translation {
  translations: array:4 [
    "nl" => "Lorem ipsum dolor sit amet"
    "en" => ""
    "fr" => ""
  ]
}
*/

或者为单个区域设置设置多个翻译

$product->setTranslations('nl', [
    'name' => 'Lorem ipsum dolor sit amet',
    'description' => 'Lorem ipsum dolor sit amet',
]);

或者为单个区域设置单个翻译

$product->setTranslation('nl', 'name', 'Lorem ipsum dolor sit amet');

或者为所有区域设置单个字符串

$product->setAllLocales('title', 'Lorem ipsum dolor sit amet');

获取可翻译字段

获取可翻译字段将返回一个 Translation 对象。

将其转换为字符串将自动采用活动区域设置值。一些选项是

echo $product->name;

$dt->title->__toString(),

(string) $dt->title

或者您可以获取特定区域设置

echo $product->name->get('en');

在可翻译字段上过滤

此包提供了一个 whereTranslation 函数。

$product = Product::whereTranslation('title', 'Lorem ipsum dolor sit amet')->first();

在可翻译字段上排序

此包提供了一个 orderByTranslation 函数。函数有 3 个参数

  • field: 用于排序的字段
  • locale: 用于排序的区域设置
  • direction (可选,默认为 asc): ascdesc
$products = Product::orderByTranslation('title')->get();