我还没有在 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 进行翻译是没有意义的。您应该在有翻译的地方缓存表,因为如果每次要显示翻译时都运行查询,那将浪费数据库性能。
编辑
我不知道我是否理解你,但可能你需要翻译你已经拥有的财产记录。
您可以稍微修改一下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 !!}