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

ava*_*sin 6 laravel

我想为Illuminate\Translate\Translator.

所以,我在~/vendor目录中创建我的文件夹,放置在那里的My/Traslator类,这将实现 Symfony\Component\Translation\TranslatorInterface. 对?

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

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

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

lew*_*s4u 7

  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
    
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建您自己的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)
    1. 注释掉或删除 config/app.php 中的 Laravel 翻译服务行:

      //Illuminate\Translation\TranslationServiceProvider::class,

    2. 在同一个数组中添加您自己的 Provider

      App\Providers\TranslationServiceProvider::class,


Mar*_*ean 5

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

所以你需要做的是:

  1. 从供应商目录扩展内置类
  2. 创建一个新的服务提供者,将您的翻译类添加到服务容器
  3. 在您更换Laravel的翻译服务提供商配置/ app.php文件用的命名空间翻译服务提供商

现在,当您从服务容器中请求翻译服务提供者时——无论是直接 ( app('translator')) 还是通过Langfaçade,它都会返回您的翻译类而不是 Laravel 的。