【问题标题】:Laravel 5 fieldnames localizationLaravel 5 字段名本地化
【发布时间】:2015-05-07 00:16:33
【问题描述】:

我有一个系统,我在同一个 mysql 记录中但在不同的字段中进行翻译。

示例:

title_en varchar(255)
title_de varchar(255)
title_fr varchar(255)

当然还有内容和 seo 字段,例如 text_en、description_en 等。

我现在要在刀片模板中使用收集数据是这样的:

<h1>{{$page->{'title_' . App::getLocale()} }}</h1>
{!! $page->{'text_' . App::getLocale()} !!}

这可行,但它是这样做的方法吗?什么是最佳做法?

【问题讨论】:

    标签: php mysql laravel blade laravel-5


    【解决方案1】:

    我还没有在 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.phpregister 函数中添加:

          $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 进行翻译是没有意义的。您应该在有翻译的地方缓存表,因为如果每次要显示翻译时都运行查询,那将浪费数据库性能。

    编辑

    我不知道我是否理解你,但可能你需要翻译你已经拥有的财产记录。

    您可以稍微修改一下trtx 函数并以这种方式使用它:

    {{ trtx($page, 'title') }} {{ trtx($page, 'title', 'fr') }}
    

    (在这种情况下,您根本不需要使用Translate

    但如果我使用Eloquent(你没有提到它),你也可以用更简洁的方式来做。对于您的Page 模型,您可以为titletext 属性添加访问器(数据库中的表中不能有titletext 列):

    public function getTitleAtrtribute() 
    {    
        return $this->{'title_'.\App::getLocale()};
    }
    public function getTextAtrtribute() 
    {    
        return $this->{'text_'.\App::getLocale()};
    }
    

    现在在您的 Blade 模板中,您可以只使用:

    <h1>{{ $page->title }}</h1>
    {!! $page->text !!}
    

    【讨论】:

    • 非常有帮助,谢谢!尤其是第二次编辑。在我的非框架时代,我也是这样做的,我对这个框架替代方案非常满意 :-)
    猜你喜欢
    • 2015-07-02
    • 2017-04-25
    • 2015-07-04
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 2017-02-25
    • 2015-07-28
    • 1970-01-01
    相关资源
    最近更新 更多