大卫·佩尔松/li3_translate

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

Lithium PHP 框架的翻译行为

安装: 1,780

依赖项: 7

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 1

类型:lithium-library

v2.1.0 2018-07-04 16:31 UTC

README

此行为允许您将不同地区/语言的文本内容存储在您的数据库中,通过基于锂的模型。您还可以简单地搜索和检索特定地区的数据。

目前该插件与 MongoDB 以及锂支持的任何关系型数据库兼容。

安装

通过 composer 安装插件(这将同时拉取任何依赖项)

composer require davidpersson/li3_translate

使用方法

在您希望具有可翻译功能的模型中,请添加以下内容

// ...
class Artists extends \lithium\data\Model {

   use li3_behaviors\data\model\Behaviors;

   protected static $_actsAs = [
       'Translatable' => [
           'default' => 'ja',
           'locales' => ['en', 'it', 'ja'],
           'fields' => ['name']
       ]
   ];
	
   // ...
  • 默认选项是必需的,尤其是如果您在单个创建或保存命令中保存多种语言。需要一个基础语言来收集内容并验证。

  • 您要使用的区域设置相当直观,它只是告诉插件您希望支持哪些语言。

  • 为了不重复太多数据,字段数组告诉行为哪些字段需要本地化。未包含在此处的字段将是简单字段,不会附加区域。

该插件的良好使用示例可以在单元测试中看到,但这里是一个简要描述。

保存数据

使用默认区域设置保存数据时,您基本上不需要做任何更改。当与原始数据一起保存翻译数据时,请使用以下语法(所有语法都等效)

$user = Users::create([
	'profile' => 'Dreaded Rasta',
	'name' => 'Richard',
	'i18n.name.it' => 'Ricardo'
]);

$user = Users::create([
	'name' => 'Richard',
	'profile' => 'Dreaded Rasta',
	'i18n' => [
		'name' => [
			'it' => 'Ricardo'
		]
	]
]);

$user = Users::create([
	'profile' => 'Dreaded Rasta', 
	'name' => 'Richard'
]);
$user->translate('name', 'it', 'Ricardo');

仅保存翻译数据 时,即更新已存在的记录时,请使用以下语法。请注意,在这种情况下,原始数据(对于默认区域)必须已经存在。

$user = Users::find('first', ['conditions' => ['name' => 'Richard']]);

$user->save([
	'i18n.name.it' => 'Ricardo'
]);

// ... or ...

$user->translate('name', 'it', 'Ricardo');
$user->save();

检索翻译实体

$user = Users::find('first', [
	'conditions' => ['i18n.name.it' => 'Ricardo']
]);

$user = Users::find('all', [
	'order' => ['i18n.name.it' => 'ASC']
]);

如果您不想使用 translate() 方法来翻译单个字段,但想将记录翻译为单个区域,请使用以下语法。然后您可以像平常一样检索字段数据。

$user = Users::find('first', [
	'conditions' => ['id' => 23],
	'translate' => 'it'
]);

$user->name; // returns 'Ricardo'.

这对于显示目的很有用。保存数据时请使用上面描述的语法。

如果您不知道要搜索的翻译,可以通过以下方式搜索翻译

$users = Users::all(['conditions' => ['i18n.name' => 'Ricardo']]);

即时禁用翻译

您可以禁用为记录自动检索翻译

$user = Users::find('first', [
	'conditions' => ['name' => 'Richard'], 
	'translate' => false
]);

并且禁用在保存时运行行为

$user->save(null, ['translate' => false]);

访问翻译

$user = Users::find('first', ['conditions' => ['name' => 'Richard']]);

$user->translate('name', 'it'); // returns 'Ricardo';
$user->translate('name'); // returns ['en' => 'Richard', 'it' => 'Ricardo'];
$user->name; // returns 'Richard', as the default locale is `en`.

验证

当翻译出现在待保存数据中时,所有翻译都将与基础规则进行验证。

$user = Users::create([
	'profile' => 'Dreaded Rasta', 
	'name' => 'Richard'
]);
$user->validate(['translate' => false]);

数据模型

翻译数据与实体存储在一起。对于MongoDB,将使用子文档;对于关系型数据库,则使用特殊字段名。

  • <user>

    • name => Richard
    • profile
    • <i18n>
      • name
        • it => Ricardo
  • <user>

    • name => Richard
    • profile
    • i18n_name_it => Ricardo

注意事项

当模型已经保存了数据时,不应更改区域设置。否则将需要手动迁移。

我尚未测试此插件的白名单和其他功能。如果您发现某个案例无法工作,请记录一个问题。