在Laravel Translatable BootForms

时间:2016-09-25 22:47:51

标签: laravel laravel-5.2

我是Laravel Translatable BootForms的新手,我想知道一些事情。

当我使用此代码时:

{!!
    TranslatableBootForm::text('Nom', 'name')
        ->required()
!!}

渲染如下:

A list of languages I don't remember having configured

我不知道这个语言列表的来源。

我只想列出我的数据库中指定的一些语言,就像我使用此解决方法一样:

@foreach($availableLangs as $availableLang)
    {!!
        TranslatableBootForm::text('Nom', 'name')
        ->renderLocale($availableLang['locale'])
    !!}
@endforeach

这给了我这个:

The intended render

我的两个问题是:

  • 此语言列表来自何处?
  • 如何用我自己的语言列表替换它?

回答第一个问题可能导致第二个问题的自动回答,但是)

1 个答案:

答案 0 :(得分:0)

在Laravel中,您应该始终尝试阅读服务提供商,他们提供有关项目结构的重要线索。让我们尝试跟踪函数调用的跟踪:

TranslatableBootForm是一个外观,它根据以下行从服务容器解析为translatable-bootform的实例:

protected static function getFacadeAccessor() { return 'translatable-bootform'; }

现在,在文件TranslatableBootFormsServiceProvider.php中,我们可以看到translatable-bootformTranslatableBootForm的实例。因此,当您致电TranslatableBootForm::text时,您将使用Facade解析为TranslatableBootForm的实例

打开TranslatableBootForm课程,我们找不到text方法,因此应该有__call方法。 __call方法始终返回从方法render返回的任何内容。这就是行动发生的地方。

在那里读取代码,你会发现它从一个名为locales的方法获取了语言环境,它将与func_get_args()函数相交,以获得你传递给它的任何语言。因此renderLocale或简称render也会做同样的事情。

方法locales只返回一个在类中默认为空的数组。如果我们返回TranslatableBootFormsServiceProvider,我们会看到有一条重要的路线:

$formBuilder->setLocales($this->getLocales());

Translatable\TranslatableWrapper获取区域设置,这只是另一个包中此文件的包装:https://github.com/dimsav/laravel-translatable/blob/master/src/Translatable/Translatable.php

查看laravel-translatable包中的配置文件,我们可以看到以下语言: https://github.com/dimsav/laravel-translatable/blob/master/src/config/translatable.php

解决方案

现在,您只需复制translatable.php文件夹中的文件config并设置您的区域设置。

或者,您创建了一个新的服务提供商MyTranslatableBootFormsServiceProvider

class MyTranslatableBootFormsServiceProvider extends TranslatableBootFormsServiceProvider 
{

    /**
     * Get Translatable's locales.
     * 
     * @return array
     */
    protected function getLocales()
    {
        // You can return a config key
        // return config('yourconfig.locales');
        // Or directly the array containing the languages
        return ['en', 'fr', 'nl'];

    }
}

然后,您将在config/app.php而非原始TranslatableBootFormsServiceProvider

中使用此提供商

声明: 我没有尝试过代码,你可能有一个bug,但是你现在知道如何找到适合Laravel包的方法。