我是Laravel Translatable BootForms的新手,我想知道一些事情。
当我使用此代码时:
{!!
TranslatableBootForm::text('Nom', 'name')
->required()
!!}
渲染如下:
我不知道这个语言列表的来源。
我只想列出我的数据库中指定的一些语言,就像我使用此解决方法一样:
@foreach($availableLangs as $availableLang)
{!!
TranslatableBootForm::text('Nom', 'name')
->renderLocale($availableLang['locale'])
!!}
@endforeach
这给了我这个:
我的两个问题是:
回答第一个问题可能导致第二个问题的自动回答,但是)
答案 0 :(得分:0)
在Laravel中,您应该始终尝试阅读服务提供商,他们提供有关项目结构的重要线索。让我们尝试跟踪函数调用的跟踪:
TranslatableBootForm
是一个外观,它根据以下行从服务容器解析为translatable-bootform
的实例:
protected static function getFacadeAccessor() { return 'translatable-bootform'; }
现在,在文件TranslatableBootFormsServiceProvider.php
中,我们可以看到translatable-bootform
是TranslatableBootForm
的实例。因此,当您致电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包的方法。