大卫·佩尔松 / li3_translate
Lithium PHP 框架的翻译行为
Requires
- php: ^5.5 || ^7
- composer/installers: ^1
- unionofrad/li3_behaviors: ^2
- unionofrad/lithium: ^1.1
This package is not auto-updated.
Last update: 2020-12-03 01:02:40 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
注意事项
当模型已经保存了数据时,不应更改区域设置。否则将需要手动迁移。
我尚未测试此插件的白名单和其他功能。如果您发现某个案例无法工作,请记录一个问题。