使用 Laravel 进行多语言数据库管理

Posted

技术标签:

【中文标题】使用 Laravel 进行多语言数据库管理【英文标题】:Multilanguage database management with Laravel 【发布时间】:2013-10-06 00:03:03 【问题描述】:

我正在 Laravel 中创建一个带有后端的应用程序。后端需要管理下载到应用程序的对象集合。对象必须根据设备语言进行本地化。

在 Laravel 中是否有一种简单的方法可以做到这一点?也许是一个雄辩的或 Laravel 插件?我想避免自己编写本地化支持。

(Laravel 内置的本地化只针对界面,不支持 Eloquent 对象)

【问题讨论】:

【参考方案1】:

您需要自己编写。首先,您必须为您的数据库表建模以支持多语言内容,然后在您的模型中您将能够说以下内容:

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();

【讨论】:

每次添加语言时,都需要迁移并为模型添加额外代码。或者为了避免范围管理,您可以使其成为动态范围。 Posts::find($id)->content->localize('en')->get();参考:laravel.com/docs/8.x/eloquent#dynamic-scopes【参考方案2】:

Glad To Help 的回答似乎非常适合具有多种语言的多语言网站。 我发现当您的网站只有两种/三种语言时,这样做有点笨拙。

我所做的是为每个可翻译字段设置两列。 对于我在数据库title_entitle_es 中的title 属性。 之后,在控制器中只需设置此方法进行自动翻译。

public function getTitleAttribute()

    $locale = App::getLocale();
    $column = "title_" . $locale;
    return $this->$column;

现在当您调用Post::find($id)->title 时,它会自动获取当前语言的那个。

希望对您有所帮助。 干杯!

【讨论】:

我认为这是错误的方法。这是因为如果要添加新语言,还必须更改数据库中的列【参考方案3】:

我做了类似但更通用的

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');

【讨论】:

我认为这是错误的方法。这是因为如果要添加新语言,还必须更改数据库中的列【参考方案4】:

按照@user1067281 的回答,我找到了一个很棒的多语言网站高级教程。

您应该完全检查一下:https://medium.com/laravel-4/26cdc75e4810

【讨论】:

请考虑添加解释,而不仅仅是链接。 新的。感谢@Onik 的提示【参考方案5】:

有一些 Eloquent 模型和静态语言资源的翻译包。你可以组合它们,这取决于你的场景。

当您只想通过外联网(有点前端)翻译您的资源或将翻译外包给第三方(如客户或内容创建者)时,这些软件包可能很有用,因此这些软件包将您的翻译文件存储在数据库中:https://github.com/barryvdh/laravel-translation-managerhttps://github.com/joedixon/laravel-translation

为了让您的 Eloquent 模型支持多语言,请将其存储为 JSON 数组。如果您正在创建一种类似于 CMS 的应用程序,您将需要多语言标题或内容正文。以下软件包可能有助于实现这一目标:https://github.com/Astrotomic/laravel-translatablehttps://github.com/spatie/laravel-translatable

【讨论】:

以上是关于使用 Laravel 进行多语言数据库管理的主要内容,如果未能解决你的问题,请参考以下文章

Nuxt + Laravel 上的多语言站点,带有来自后端的语言环境

Laravel 5 多语言网站,网址中带有语言前缀

使用/ Laravel多语言在Google上定位良好?

Laravel 5 - 多语言网站(LTR 和 RTL)

多语言支持的最佳状态管理?

Codeigniter:如何使用数据库和用户会话数据构建多语言网站?