aewebsolutions / laravel-translator
Laravel 多语言和翻译管理包
Requires
- php: >=5.4.0
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
数组中添加应用程序支持的所有语言环境。例如,如果应用程序支持 en、fr 和 es 语言环境,则数组将如下所示
'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的route
或URL::route
方法。
route('apple_path', ['color' => 'red']);
如果您请求另一个区域设置,使用点表示法。为了获取备用区域设置的路线,将区域设置(或设置true)作为第四个参数传递。
route('es.apple_path', ['color' => 'red'] ); route('es.apple_path', ['color' => 'red'], true, 'en' );
此外,您还可以获取所有受支持区域设置的URL。调用Route::routes
或routes
新方法。
$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的created
、updated
或deleted
事件时,仅针对受损组自动刷新缓存。
方法
TranslatorRespository(外观:Translator)
TranslatorURL(外观:URL)
TranslatorURL扩展URLGenerator。
许可
Laravel Translator在MIT许可下授权。
版权所有2016 Ángel Espro