我正在Laravel中创建一个带有后端的应用程序。后端需要管理下载到应用程序的对象集合。必须根据设备语言对对象进行本地化。
在Laravel有一个简单的方法吗?也许是一个雄辩的或Laravel插件?我想避免自己编写本地化支持。
(Laravel内置的本地化仅适用于界面,它不支持Eloquent对象)
答案 0 :(得分:10)
您需要自己编写。首先,您必须为数据库表建模以支持多语言内容,然后在您的模型中,您将能够说出类似的内容:
class Content extends Eloquent
{
public function scopeEnglish($query)
{
return $query->where('language', '=', 'en');
}
public function scopeSpanish($query)
{
return $query->where('language', '=', 'es');
}
}
class Post extends Eloquent
{
public function content()
{
return $this->hasMany('Content');
}
}
然后您就可以使用它:
$englishContent = Posts::find($id)->content->english()->get();
$spanishContent = Posts::find($id)->content->spanish()->get();
答案 1 :(得分:7)
很高兴帮助的答案似乎非常适合多种语言的多语言网站。 我发现当你的网站只有两种/三种语言时,这样做很笨拙。
我所做的是为每个可翻译字段提供两列。
对于我在数据库title
和title_en
中的title_es
属性。
之后,在控制器中设置此方法以进行自动翻译。
public function getTitleAttribute()
{
$locale = App::getLocale();
$column = "title_" . $locale;
return $this->{$column};
}
现在,当您致电Post::find($id)->title
时,它会自动获取当前语言的一个。
希望它有所帮助。 干杯!
答案 2 :(得分:5)
我做了类似但更普遍的
Schema::create('index', function(Blueprint $table) {
$table->increments('id');
$table->string('title_uk');
$table->string('title_ru');
$table->string('title_en');
$table->string('heading_uk');
$table->string('heading_ru');
$table->string('heading_en');
$table->string('photo');
$table->timestamps();
});
模型
public function TextTrans($text)
{
$locale=App::getLocale();
$column=$text.'_'.$locale;
return $this->{$column};
}
现在我对每个语言版本以及每个字段都不会规定具体的功能,并导致所有这些:
$text=Index::find('1');
$text->TextTrans('title');
$text->TextTrans('heading');
答案 3 :(得分:1)
在@ user1067281回答之后,我找到了一个很棒的多语言网站高级教程。
答案 4 :(得分:0)
有一些 Eloquent 模型和静态语言资源的翻译包。您可以将它们组合起来,这取决于您的场景。
当您只想通过外联网(有点前端)翻译资源或将翻译外包给第三方(如客户或内容创建者)时,这些包可能很有用,因此这些包将您的翻译文件存储在数据库中:
https://github.com/barryvdh/laravel-translation-manager
https://github.com/joedixon/laravel-translation
为了使您的 Eloquent 模型多语言,请将其存储为 JSON 数组。如果您正在创建一种类似 CMS 的应用程序,您将需要多语言标题或内容正文。以下软件包可能有助于实现这一点:
https://github.com/Astrotomic/laravel-translatable
https://github.com/spatie/laravel-translatable