我如何扩展laravel翻译器(任何其他组件)?

时间:2015-06-03 09:11:55

标签: laravel

我想为Illuminate\Translate\Translator实现一些额外的功能。

所以,我在~/vendor目录中创建我的文件夹,放置My/Traslator类,它将实现Symfony\Component\Translation\TranslatorInterface。正确?

在我的包中扩展laravel翻译类(否则会复制很多功能)是否可以?

如果没问题 - 将需要绑定到当前的laravel版本以保持代码稳定。但是,如果最终用户laravel版本与我的包中所需的版本不同,会发生什么?

我应该怎么做才能让laravel在应用程序中使用我的翻译类(外墙等)?

2 个答案:

答案 0 :(得分:3)

此页面包含更多信息:http://laravel.com/docs/5.0/extending#container-based-extension

所以你需要做的是:

  1. 从供应商目录
  2. 扩展内置类
  3. 创建一个新的服务提供商,将您的翻译类添加到服务容器
  4. config / app.php 文件中的Laravel翻译服务提供商替换为您的翻译服务提供商的名称空间
  5. 现在,当您从服务容器中直接(app('translator'))或使用Lang外观要求翻译服务提供商时,它将返回您的翻译课程而不是Laravel的。

答案 1 :(得分:0)

  1. 制作一个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
    
    }
    
  2. TranslationServiceProvider内创建自己的app/providers(只需复制laravel翻译服务提供商,并将其使用Translator的行更改为您自己的Translator类,其中您已覆盖所需的内容)< / p>

    <?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'];
     }
    }
    
    1. 注释或删除config / app.php中的Laravels转换器服务行:

      //Illuminate\Translation\TranslationServiceProvider::class,

    2. 在同一阵列中添加您自己的提供程序

      App\Providers\TranslationServiceProvider::class,