我有一个系统,我可以在同一个 mysql 记录中但在不同的字段中进行翻译。
示例:
title_en varchar(255)
title_de varchar(255)
title_fr varchar(255)
当然还有内容和 seo 字段,如 text_en、description_en 等。
我现在在 Blade 模板中使用收集数据的方法如下:
<h1>{{$page->{'title_' . App::getLocale()} }}</h1>
{!! $page->{'text_' . App::getLocale()} !!}
这可行,但这是实现的方法吗?最佳实践是什么?
最佳答案
我还没有在 Laravel 中创建带有翻译的页面,但如果我是你,我会为此创建辅助方法,并且我会在我的模板中使用类似的方法:
<h1>{{ trtx('title') }}</h1>
{!! trtx('text') !!}
这样,您的模板中就会有非常干净的代码,而无需通过硬编码方式创建标签。
只是一个示例实现:
创建
app/helpers/functions.php
文件:<?php function trtx($title, $locale = null) { if ($locale == null) { $locale = App::getLocale(); } $trans = App::make('App\Services\Translator'); return $trans->get($title . '_' . $locale); }
创建
app/Services/Translator.php
文件:<?php namespace App\Services; class Translator { public function get($text) { return "This is translated text for " . $text; } }
在
app/Providers/AppServiceProvider.php
中的register
函数中添加:$this->app->singleton( 'App\Services\Translator', 'App\Services\Translator' );
在
composer.json
文件中添加到autoload
部分加载帮助程序文件,因此它应如下所示:"autoload": { "classmap": [ "database" ], "psr-4": { "App\\": "app/" }, "files": [ "app/Helpers/functions.php" ] },
在控制台中运行
composer dump-autoload
,然后在控制台中运行php artisan clear-compiled
现在它应该可以工作了,如果您输入模板:
{{ trtx('title') }} {{ trtx('title', 'fr') }}
您将得到:
This is translated text for title_en This is translated text for title_fr
当然,现在您应该在 Translator
类中实现从数据库获取翻译的真正方法。当然,一直使用 DB 进行翻译是没有意义的。您应该缓存有翻译的表,因为如果每次要显示翻译时都运行查询,则会浪费数据库性能。
编辑
我不知道我是否理解您的意思,但您可能需要翻译您已有的属性(property)记录。
您可以稍微修改一下 trtx
函数并以这种方式使用它:
{{ trtx($page, 'title') }} {{ trtx($page, 'title', 'fr') }}
(在这种情况下,您根本不需要使用 Translate
)
但是如果我使用Eloquent
(你还没有提到它),你也可以用更干净的方式来做。对于您的 Page
模型,您可以添加 title
和 text
属性的访问器(您不能有 title
或 >text
数据库表中的列):
public function getTitleAtrtribute()
{
return $this->{'title_'.\App::getLocale()};
}
public function getTextAtrtribute()
{
return $this->{'text_'.\App::getLocale()};
}
现在在您的 Blade
模板中您可以使用:
<h1>{{ $page->title }}</h1>
{!! $page->text !!}
关于php - Laravel 5 字段名本地化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28881056/