aozisik/translatable

此包已被弃用,不再维护。未建议替代包。

Translatable是一个包,可以帮助你在模型上拥有可翻译字段。这些字段将以JSON格式存储您的翻译,并在您尝试访问这些字段时自动获取到您当前的应用程序语言环境。您也可以通过使用某些方法来获取您选择的特定语言。

dev-master 2015-03-16 09:39 UTC

This package is auto-updated.

Last update: 2021-10-10 07:08:14 UTC


README

#Laravel Translatable# 构建状态 最新不稳定版本 许可证

此包旨在与Laravel 4和Eloquent ORM一起使用。

它不需要额外的迁移,也不需要对您当前的数据模型进行任何更改,也不需要进行重大的代码修改。实现非常简单直接。

我设计了此包作为启用Eloquent模型字段可翻译的简单方式。您只需添加TranslatableTrait即可。

转到您的composer.json并添加以下行

	"aozisik/translatable": "dev-master"

示例实现

<?php
use Aozisik\Translatable\TranslatableTrait;

class Books extends \Eloquent {

	use TranslatableTrait;

	protected $guarded = ['id'];
	protected $localizedFields = ['name', 'description'];
	
}

您Book模型中的名称和描述字段现在是可翻译的。

##工作原理##

在添加"TranslatableTrait"特性后,您的模型将开始动态翻译本地化字段。但是,如果您之前在表中保存了没有特性数据的记录,可能会得到意外的结果。

如果您是从零开始,Translatable的工作方式如下

  • 当您访问一个属性时,比如$book->name,translatable会自动将其翻译成激活的语言*

  • 当您设置一个属性且设置的值是字符串时,它将被假定为此字符串是激活的语言*

  • 要一次性存储多语言翻译,您必须将一个数组分配给属性。数组中的键应与语言代码相对应。

      $book->name = array('en' => 'Book', 'fr' => 'Le Livre', 'de' => 'Das Buch');
      $book->save;
    

在此记录中,数据库中的name字段看起来像这样:{"en":"Book","fr":"Le Livre","de":"Das Buch"}

相当简单!但是,请注意,字段指定的输入长度可能不足以存储JSON的长字符串。

因此,您通常最好使用TEXT来存储本地化字段,而不是VARCHAR(255)。

如何获取特定语言的翻译

您可能需要获取除激活语言之外的特定语言的翻译。

这可以这样做

$book->getTranslation('name', 'de); // Das Buch
$book->getTranslation('name', 'en); // Book
$book->getTranslation('name', 'fr); // Le Livre

$book->name; // Book, if App::getLocale() returns "en"    

激活语言由App::getLocale()确定

优点和缺点##

让我们从优点开始

  • 无需额外表格来存储翻译
  • 不需要对代码进行重大修改
  • 无需迁移,无需配置,无需其他操作

只需将特性添加到您的模型中,它就可以立即工作。

然而,也有一些缺点

  • 排序可能成问题,因为本地化字段基本上会存储JSON序列化
  • 如果您有现有数据,您应该以与该特性相同的格式存储它们。
  • 根据您的当前数据库设计,您可能需要将一些VARCHAR转换为TEXT。

总的来说,我认为这是一个非常实用的方法,并且实现起来相当简单。

我愿意接受建议。欢迎提交pull请求和错误报告。