我想为Illuminate\Translate\Translator
.
所以,我在~/vendor
目录中创建我的文件夹,放置在那里的My/Traslator
类,这将实现 Symfony\Component\Translation\TranslatorInterface
. 对?
可以在我的包中扩展 laravel 翻译器类(否则很多功能将被复制)吗?
如果没问题 - 有必要绑定到当前的 Laravel 版本以保持代码稳定。但是,如果最终用户的 laravel 版本与我的软件包中所需的版本不同,会发生什么?
那么我应该怎么做才能让 laravel 在应用程序(外观等)中使用我的翻译器类?
创建一个 Translator 类并扩展它Illuminate\Translation\Translator
<?php
namespace App\Helpers;
use Illuminate\Translation\Translator as LaravelTranslator;
class Translator extends LaravelTranslator
{
// here you can overwrite any functions you want/need
}
Run Code Online (Sandbox Code Playgroud)创建您自己的TranslationServiceProvider
内部app/providers
(只需复制 laravel 翻译服务提供者并将其使用 Translator 的行更改为您自己的 Translator 类,您已覆盖了所需的内容)
<?php
namespace App\Providers;
use App\Helpers\Translator; // <= Your own class
use Illuminate\Translation\FileLoader;
use Illuminate\Support\ServiceProvider;
class TranslationServiceProvider extends ServiceProvider
{
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->registerLoader();
$this->app->singleton('translator', function ($app) {
$loader = $app['translation.loader'];
// When registering the translator component, we'll need to set the default
// locale as well as the fallback locale. So, we'll grab the application
// configuration so we can easily get both of these values from there.
$locale = $app['config']['app.locale'];
$trans = new Translator($loader, $locale);
$trans->setFallback($app['config']['app.fallback_locale']);
return $trans;
});
}
/**
* Register the translation line loader.
*
* @return void
*/
protected function registerLoader()
{
$this->app->singleton('translation.loader', function ($app) {
return new FileLoader($app['files'], $app['path.lang']);
});
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return ['translator', 'translation.loader'];
}
}
Run Code Online (Sandbox Code Playgroud)
注释掉或删除 config/app.php 中的 Laravel 翻译服务行:
//Illuminate\Translation\TranslationServiceProvider::class,
在同一个数组中添加您自己的 Provider
App\Providers\TranslationServiceProvider::class,
此页面有更多信息:http : //laravel.com/docs/5.0/extending#container-based-extension
所以你需要做的是:
现在,当您从服务容器中请求翻译服务提供者时——无论是直接 ( app('translator')
) 还是通过Lang
façade,它都会返回您的翻译类而不是 Laravel 的。
归档时间: |
|
查看次数: |
2835 次 |
最近记录: |