alaaeta/translation

翻译键的库

v1.4.6 2023-09-03 08:30 UTC

This package is auto-updated.

Last update: 2024-09-03 10:31:12 UTC


README

描述

Translation 是一个针对 Laravel 9 的开发者友好、数据库驱动、自动翻译器。您是否希望在您的应用程序中正常写入文本,然后自动将其翻译、添加到数据库并在运行时进行缓存?以下是一个例子

通过 Composer 安装的推荐方法

composer require alaaeta/translation

控制器

public function index()
{
    return view('home.index');
}

视图

@extends('layout.default')

{{ _t('Welcome to our home page') }}

查看

Welcome to our home page

当您访问页面时,您不会注意到任何不同,但如果您查看您的数据库,您的默认应用程序区域设置已经创建,并且附带了该区域设置的翻译。

现在,如果我们设置区域设置为不同的东西,比如阿拉伯语(ar),它将自动为您翻译。

控制器

public function index()
{
    app()->setLocale('ar');
    
    return view('home.index');
}

视图

@extends('layout.default')

{{ _t('Welcome to our home page') }}

查看

Welcome to our home page

我们甚至可以使用占位符来表示动态内容

视图

{{ _t('Welcome :name, to our home page', ['name' => 'John']) }}

查看

Welcome John, to our home page

安装

发布配置

php artisan vendor:publish --tag=translation-config

运行迁移

php artisan migrate

您已经准备好出发了!

用法

在您的应用程序的任何地方,都可以使用简写函数(可以在配置文件中禁用)

_t('Translate me!')

或者

Translation::translate('Translate me!')

这通常在 blade 视图中最有用

{{ _t('Translate me!') }}

您还可以通过仅插入您的内容轻松翻译模型

{{ _t($post->title) }}

或使用占位符

{{ _t('Post :title', ['title' => $post->title]) }}

在您的 translations 数据库表中,您将会有

| id | key | value | language_code |
  1        'Translate me!'         'Translate me!'        'en'

要为用户会话切换语言,您只需调用

app()->setLocale('en') // Setting to Englisg locale

当调用 app()->setLocale($code) 方法时,会自动创建区域设置,当调用翻译函数时,它将自动为新区域设置创建新的翻译记录,并带有默认区域设置的翻译。默认区域设置取自 laravel 的 app.php 配置文件。

这将在您的 translations 表中

| id | key | value | language_code |
  1        'Translate me!'         'Translate me!'        'en'
  1        'Translate me!'         'Translate me!'        'ar'

现在您可以更新新记录上的翻译,并且它将在调用它的任何地方显示

_t('Translate me!')`
需要翻译单个文本而不设置用户的默认区域设置吗?

只需将区域设置传递给上面翻译函数中的第三个参数,如下所示

视图

{{ _t('Our website also supports english!', [], 'en') }}

<br>

{{ _t('And arabic!', [], 'ar') }}

这对于在不更改整个站点语言的情况下向用户展示您的网站支持不同语言非常有用。您还可以像往常一样执行替换操作

视图

{{ _t('Hello :name, we also support french!', ['name' => 'John Doe'], 'ar') }}

查看

Bonjour John Doe , nous soutenons aussi le français !

执行此操作还会在您的数据库中创建区域设置,保存翻译,并在需要时将其缓存。

您必须提供自己的方式来更新翻译(控制器/视图等)使用提供的 eloquent 模型。

注入翻译

v1.3.4 版本开始,您现在可以在不使用外观的情况下将 Translation 合同注入到您的控制器中

use Alaaeta\Translation\Contracts\Translation;

class BlogController extends Controller
{
    /**
     * @var Translation
     */
    protected $translation;
    
    /**
     * Constructor.
     *
     * @param Translation $translation
     */
    public function __construct(Translation $translation)
    {
        $this->translation = $translation;
    }
    
    /**
     * Returns all blog entries.
     *
     * @return Illuminate\View\View
     */
    public function index()
    {
        $title = $this->translation->translate('My Blog');
        
        $entries = Blog::all();
        
        return view('pages.blog.index', compact('title', 'entries'));
    }
}

模型

默认情况下,翻译模型包含在配置文件中并选中。如果您想使用自己的模型,您必须创建它们并实现它们的特性。以下是一个例子

翻译模型

use Stevebauman\Translation\Traits\TranslationTrait;
use Illuminate\Database\Eloquent\Model;

class Translation extends Model
{
    use TranslationTrait;

    /**
     * The locale translations table.
     *
     * @var string
     */
    protected $table = 'translations';

    /**
     * The fillable locale translation attributes.
     *
     * @var array
     */
    protected $fillable = [
        'key',
        'value',
        'language_code',
    ];
   
}

创建翻译模型后,将其插入到 translation.php 配置文件中

|--------------------------------------------------------------------------
| Translation Model
|--------------------------------------------------------------------------
|
|  The translation model is used for storing translations.
|
*/

'translation' => App\Models\Translation::class,

路由

使用区域设置前缀翻译您的网站非常简单。首先在您的 app/Http/Kernel.php 文件中,插入区域设置中间件

/**
 * The application's route middleware.
 *
 * @var array
 */
protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    
    // Insert Locale Middleware
    'locale' => \Stevebauman\Translation\Middleware\LocaleMiddleware::class
];

现在,在您的 app/Http/routes.php 文件中,在路由组前缀中插入中间件和以下翻译方法

Route::group(['prefix' => Translation::getRoutePrefix(), 'middleware' => ['locale']], function()
{
    Route::get('home', function ()
    {
        return view('home');
    });
});

现在您应该能够访问类似以下的路由

https:///home
https:///en/home
https:///fr/home