php - Laravel 5 字段名本地化

标签 php mysql laravel laravel-blade laravel-5

我有一个系统,我可以在同一个 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') !!}

这样,您的模板中就会有非常干净的代码,而无需通过硬编码方式创建标签。

只是一个示例实现:

  1. 创建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);
    }
    
  2. 创建app/Services/Translator.php文件:

    <?php
    
    namespace App\Services;
    
    class Translator
    {
        public function get($text)
        {
            return "This is translated text for " . $text;
        }
    }
    
  3. app/Providers/AppServiceProvider.php中的register函数中添加:

        $this->app->singleton(
            'App\Services\Translator',
            'App\Services\Translator'
        );
    
  4. composer.json 文件中添加到 autoload 部分加载帮助程序文件,因此它应如下所示:

    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/"
        },
      "files": [
        "app/Helpers/functions.php"
      ]
    },
    
  5. 在控制台中运行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 模型,您可以添加 titletext 属性的访问器(您不能有 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/

相关文章:

php - 从网站删除 Google Drive 上的电子表格

php - 如何使用 PHP 和 SQL 创建 "Recent Activity"部分?

mysql - 合并 2 个 Sql 结果行

java - 将 Mysql 转换为 Sqlite 数据库

php - 多个文件上传 Angular + Laravel

php - 如何关闭 laravel Debug模式

php - 如何防止长时间运行的进程中的浏览器超时?

php - 动态获取 PHP 类命名空间

php - 无法使用 INNER JOIN 使用 PDO 连接另一个表

php - 如何在 Laravel 中为 auth Controller 设置新的保护