aewebsolutions/laravel-translator

Laravel 多语言和翻译管理包

1.0.0 2016-04-25 22:45 UTC

This package is not auto-updated.

Last update: 2024-09-20 19:04:27 UTC


README

Laravel Translator 是最完整、最容易使用的 Laravel 多语言和翻译管理器。

通过扩展 Laravel 的 Router 和 URLGenerator,我们可以以 Laravel 的方式处理多个语言环境。同时,翻译存储库允许我们处理这些语言环境的翻译。

值得一提的是,如果我们愿意,可以为应用的主要语言环境预留一个非前缀的 URL。这样,从所有支持的语言环境中,我们只为主要语言环境有一个更清晰的 URL(例如,www.site.com/apple),而其他语言环境使用前缀(例如,www.site.com/fr/apple)。

想了解更多关于开发者的信息,请访问 www.aesolucionesweb.com.ar

代码示例

//Set a route
Route::get('apple', [
  'locales' => ['en', 'es'],
  'as' => 'apple_path',
  'uses' => 'fruitsController@apple' 
]);

//Get a URL from a route name
route('es.apple_path');

//Get a translated text
echo tt('fruits.apple'); 

//Get a title for current locale
$article = App\Article::find(1);
echo $article->title;

兼容性

Laravel 5.*

功能

  • 路由和 URL 管理器。
  • 完整的仓库以翻译整个应用。
  • Eloquent 扩展以在模型内部翻译属性。
  • 支持模式。
  • 缓存优化。

安装

将仓库文件添加到您的项目中。

使用 Composer 安装 Laravel Translator 是最佳方式。要安装最新版本,请运行以下命令。

composer require aewebsolutions/laravel-translator

集成

然后,您必须在 config/app.php 中添加两行。首先,将新的提供者添加到 $providers 数组中

Translator\TranslatorServiceProvider::class,

其次,为了能够正确访问 TranslatorRespository,您必须将新的外观添加到 $aliases 数组中

'Translator' => Translator\Facades\TranslatorFacade::class,

可选地,如果您希望使用我们的模式支持来轻松创建可翻译的表,您需要替换 Schema 外观。因此,注释或删除 Laravel 的,并添加新的一个

//'Schema'    => Illuminate\Support\Facades\Schema::class,
'Schema'    => Translator\Facades\Schema::class,

发布

一些文件需要从 vendor 目录复制。只需运行以下命令

php artisan vendor:publish --provider="Translator\TranslatorServiceProvider"

此命令将发布以下文件

  • app\Translation.php:一个 Eloquent 模型来处理 translations 表,
  • database\migrations\2016_01_01_000000_create_translations_table.php:一个迁移文件,将创建 translations 表,
  • config/translation.php:一个配置文件。

迁移

必须在数据库中创建一个 translations 表。运行 Artisan 的 migrate 命令就足够了。但如果您需要向 translations 表添加额外列,
您可以在迁移文件中的 Schema::up 中添加它们。此外,您还需要将它们添加到 App\Translation::$fillable 数组属性中。

然后,运行

php artisan migrate

扩展 Router

App\Http\Kernel 添加一行,以扩展 Laravel 的 Router。

class Kernel extends HttpKernel
{
    use \Translator\Traits\KernelRouterExtender;
    //etc.
}

配置

配置设置可以在 config/translator.php 中找到,其中包含大量信息。对于基本用法,您必须在 $locales_available 数组中添加应用程序支持的所有语言环境。例如,如果应用程序支持 enfres 语言环境,则数组将如下所示

'locales_available' => [  'es', 'en' , 'fr' ],

主要语言环境从应用程序的默认语言环境(在 config/app.php 文件中的 locale)获取其值。因此,请确保正确设置它。

用法

路由

基础

此路由器是 Laravel 的扩展,因此您将找到与您所知完全相同的原始功能。

所有工作路由必须至少有一个可用的语言环境。

Route::get('apple', [
 'locales' => 'en',  
 'uses' => 'fruitsController@apple'
]);

您可以关联多个区域设置,而不仅仅是单个区域设置。此外,如果您需要将路由对整个受支持的区域设置组可用,您可以使用“all”关键字。

Route::get('apple', ['locales' => ['en', 'es'] ,  'uses' => 'fruitsController@apple'  ]);
Route::get('peach', ['locales' => 'all' ,  'uses' => 'fruitsController@peach'  ]);

使用默认设置,以下URI将在应用程序中为上述路由可用。

  • /apple
  • /es/apple
  • /peach
  • /es/peach
  • /fr/peach

请求其中的任何一个,当前区域设置将自动设置。

值得注意的是,URI是动态生成的,以优化性能。路由器不需要使用多重规则,只需使用与请求的区域设置匹配的规则。想象一下40条路由规则和10种语言;而不是不必要的路由规则乘法,您将得到您需要的:40条规则。

您可以将区域设置分配给一个组,而不仅仅是单个路由。

Route::group([ 'locales' =>  'en' , 'prefix' => 'fruits' ], function(){

    Route::get('apple/{color}', ['locales' => 'es', 'as' =>  'apple_path',  'uses' => 'fruitsController@apple' ]);
    
    Route::get('peach/{color}', [ 'as' =>  'peach_path',  'uses' => 'fruitsController@peach' ]);
    
});

URL

要从当前区域设置的路由名称获取相对或绝对URL,就像通常一样,调用Laravel的routeURL::route方法。

    route('apple_path', ['color' => 'red']);

如果您请求另一个区域设置,使用点表示法。为了获取备用区域设置的路线,将区域设置(或设置true)作为第四个参数传递。

    route('es.apple_path', ['color' => 'red'] );
    route('es.apple_path', ['color' => 'red'], true, 'en' );

此外,您还可以获取所有受支持区域设置的URL。调用Route::routesroutes新方法。

$url = routes('apple_path', ['color' => 'red'] );
echo $url->es;
echo $url->en;

Laravel的URL::current已被修改。现在,您可以传递一个区域设置作为可选的第一个参数。

URL::current('es');

翻译存储库

Laravel翻译器帮助您轻松地翻译应用程序,处理数据库中的翻译。可以直接通过App\Translation Eloquent模型来管理翻译。但是,您应该使用提供的存储库来保证稳定性。Translator外观可能就是您需要的。

获取

您可以使用Translator::text方法或更好的tt助手来获取已翻译的文本。这就像Laravel的trans一样。tt方法接受一个区域设置(可选),一个组名和一个针作为其第一个参数,使用点表示法:locale.group.needle。假设当前区域设置是'en'

echo tt('fruits.apple');  // output: apple
echo tt('es.fruits.apple'); // manzana

有时一个文本可能没有可用的区域设置的翻译;因此,显示主区域设置。通过将其第三个参数设置为false,您可以避免这种行为。

echo tt('fr.fruits.apple'); // apple
echo tt('fr.fruits.apple', [], false); // NULL

就像trans一样,您可以进行替换

echo tt('messages.welcome');  //output: Hi, :name.
echo tt('messages.welcome', ['name' => 'John']);  //output: Hi, John.

复数Translator::choice与Laravel的trans_choice(请参阅Laravel文档)类似,但具有更多参数。

echo Translator::choice('en.fruits.apple', 5, ['color' => 'red'], false);  // red apples.
echo tt('en.fruits.apple');  // :color apple|apples.

最后,如果您需要从组.needle获取所有文本,请使用Transalor::texts

$texts = Transalor::texts('fruits.apple');
echo $texts->en; // apple
echo $texts->es; // manzana
echo $texts->fr; // NULL

创建

您可以为特定区域设置创建一个文本。

Translator::create('es.fruits.peach', 'durazno');

或同时创建多个区域设置。

Translator::create(‘fruits.peach‘, [
  'es' => 'durazno', 
  'en' => 'peach',
  'fr' => 'pêche'
]);

此外,您还可以添加额外属性。当然,额外的列属性应该已经添加到translations表中,并且应该包含在App\Translation::$fillable数组属性中。

Translator::create('fruits.peach', [
  'es' => 'durazno',  
  'en' => 'peach',
  'fr' => 'pêche'
 ], [
  'type' => 'infotext',
  'description' => 'Prunus persica‘s fruit'
]);

更新

更新文本。

更新特定区域设置或一组文本,带有或不带有额外属性。

Translator::update('es.fruits.peach', 'melocotón');
Translator::update('fruits.peach', [
  'es' => 'melocotón',
  'en' => 'peach'
],[
  'type' => 'information'
]);
更新文本的组名或针。

组和针是敏感属性,这意味着它们不能轻易更新,否则会弄乱。简而言之,区域设置.group.needle不能有重复。因此,即使您尝试,Translator::update方法也不会允许您更改这些属性。相反,您必须使用Translator::updateGroupNeedle

// Change the whole group name:
Translator::updateGroupNeedle('fruits', 'juicy_fruits');

// Change the needle, but not the group:
Translator::updateGroupNeedle('fruits.peach', 'fruits.yellow_peach');

//Change a single group.needle:
Translator::updateGroupNeedle('fruits.peach', 'juicy_fruits.peach');

删除

使用提供的存储库,删除也很容易。

//Delete the whole group
Translator::delete('fruits'); 

//Delete the group.needle for all locales
Translator::delete('fruits.apple');

//Delete a group.needle for a specific locale
Translator::delete('es.fruits.apple');

可翻译模型

Laravel翻译器不仅包括Translator存储库,还包括Eloquent扩展,可以直接在您的模型中管理多种语言。假设您需要一个Article模型。如果您能够获取像这样的属性,这将真正有用:

$article = App\Article::find(1);
echo $article->title; 
// output would be 'My title' if locale were 'en', 
// but 'Mi título' if locale were 'es';

创建表

可翻译的列具有清晰的语法:column_name_locale。为了简化创建,您可以选择使用我们的Schema扩展(请记住包含facade。参见#安装)。您只需调用$table->localize(['column_name'])即可为应用程序中可用的每个区域设置乘以column_name。您还可以将区域设置数组作为第二个参数传递。

Schema::create('articles', function ($table) {
    $table->increments('id');
    $table->text('body');
    $table->string('title');
    $table->timestamps();

    $table->localize([ 'title', 'body' ]);
});

模型

必须完成两件事:将您的模型扩展到Translator\Eloquent\Model,并填充$translatable受保护属性。

class Article extends Translator\Eloquent\Model
{
    protected $translatable = ['title', 'body'];

    protected $fillable = ['title', 'body'];

}

现在,您可以通过这种方式获取可翻译的属性:

$article = App\Article::find(1);
echo $article->title; // output 'My Title'

$title = $article->trans('title');
echo $title->es; // output 'Mi título

更新插入填充当前区域设置的行,您可以像平时一样操作。但是,如果您需要同时管理多个区域设置,您可以使用数组,如下所示

//Modify an article
$article = App\Article::find(1);
$article->title = [
    'es' => 'Mi título en español',
    'en' => 'My Title in English'
];
$article->save();

//Insert an article
$article = new App\Article;
$article->fill([
    'title' => [
        'es' => 'Mi título en español',
        'en' => 'My Title in English'
    ]
]);
$article->save();

缓存

为了减少数据库查询,组应该存储在缓存中。只需查看conf/translator.php,并确保$cache设置为TRUE。Laravel Translation使用您的应用程序的缓存设置。

如果您正在使用(您应该使用)提供的存储库来创建、更新或删除翻译,那么缓存不需要手动刷新。只需确保cache_auto_flush设置为TRUE,每次触发Translator的createdupdateddeleted事件时,仅针对受损组自动刷新缓存。

方法

TranslatorRespository(外观:Translator)

TranslatorURL(外观:URL)

TranslatorURL扩展URLGenerator。

许可

Laravel Translator在MIT许可下授权。

版权所有2016 Ángel Espro