Yii2 翻译存储在数据库中的数据
Yii2 translating data stored in database
我正在使用 Yii2 框架,并且已经使用本指南配置了 i18n 组件:
http://thecodeninja.net/2014/12/i18n-with-yii-2-advanced-template/
因此,我现在可以使用 Yii::t()
函数翻译 php 文件中的字符串。使用 $ ./yii message/extract
控制台命令提取可翻译的字符串,生成正确的翻译文件。
我现在需要显示数据库中存储的字符串的翻译。
我可以使用 Yii:t()
和变量而不是字符串作为参数,像这样
echo Yii:t('app', $some_string_from_db );
并使用类似这样的代码创建一个新的 php 文件
<?php
function dbStringsToTranslate() {
$o = Yii::t('app','db english string 1');
$o.= Yii::t('app','db english string 2');
$o.= Yii::t('app','db english string 3');
return $o;
}
这样 $ ./yii message/extract
命令将找到所需的翻译。
这工作正常,但当然 $ ./yii message/extract
会在我使用 Yii:t()
和变量的任何地方抛出一些警告。
Skipping line 39. Make sure both category and message are static strings.
我认为这没什么大不了的,但是,这是我的问题:
这是翻译存储在数据库中的字符串的正确方法吗?
有没有更好的方法来完成这个?
您可以查看此扩展程序。 https://github.com/creocoder/yii2-translateable 它允许将行为附加到模型以支持多种语言。
我现在在项目中使用,很好用
我遇到了同样的问题,我找到了 this module 的解决方案。在模块配置中,您有 'tables' 数组,您可以在其中指定应翻译 table(s) 中的哪些字段。
然后,该模块有自己的 'scan' 操作(相当于 message/extract),它将所有 translatable 字符串添加到数据库(使用 DbMessageSource): all Yii::t、指定的数据库字段等等(甚至 javascript,请查看文档)。它还有一个漂亮的用户界面来进行翻译,太棒了!
例如,使用以下配置,将扫描来自 table 国籍的字段名称并添加其翻译(即国家名称):
'modules' => [
'translatemanager' => [
'class' => 'lajax\translatemanager\Module',
...
'tables' => [ // Properties of individual tables
[
'connection' => 'db', // connection identifier
'table' => 'nationality', // table name
'columns' => ['name'], // names of multilingual fields
'category' => 'database-table-name',// the category is the database table name
'categoryPrefix' => 'lx-' //
]
]
],
],
您可以生成带有一些假 Yii:t()
调用的 php 文件。
例如:
$filename = Yii::getAlias('@frontend/runtime/fake-category-translations.php');
$str = '<?php' . PHP_EOL;
foreach (Category::find()->all() as $category) {
$str .= "Yii::t('category', '{$category->name}');" . PHP_EOL;
}
file_put_contents($filename, $str);
在输出中,此文件将如下所示:
<?php
Yii::t('category', 'Art & Design');
Yii::t('category', 'Creativity');
Yii::t('category', 'Educational');
Yii::t('category', 'Education');
Yii::t('category', 'Lifestyle');
Yii::t('category', 'Casual');
所以,现在您可以调用控制台方法来搜索未翻译的字符串:
php yii message/extract @frontend/messages/config.php
我知道这已经过时了,但我在休息时遇到了同样的问题 API,这就是我解决它的方法。请注意,保存时我使用了
$post->comment = Yii::t('app', 'My Nice Comment here');
$post->save();
class Post extends ActiveRecord
{
public function fields()
{
$fields = parent::fields();
$fields['comment'] = function ($model) {
return Yii::t('app', $model->comment);
};
return $fields;
}
}
我正在使用 Yii2 框架,并且已经使用本指南配置了 i18n 组件: http://thecodeninja.net/2014/12/i18n-with-yii-2-advanced-template/
因此,我现在可以使用 Yii::t()
函数翻译 php 文件中的字符串。使用 $ ./yii message/extract
控制台命令提取可翻译的字符串,生成正确的翻译文件。
我现在需要显示数据库中存储的字符串的翻译。
我可以使用 Yii:t()
和变量而不是字符串作为参数,像这样
echo Yii:t('app', $some_string_from_db );
并使用类似这样的代码创建一个新的 php 文件
<?php
function dbStringsToTranslate() {
$o = Yii::t('app','db english string 1');
$o.= Yii::t('app','db english string 2');
$o.= Yii::t('app','db english string 3');
return $o;
}
这样 $ ./yii message/extract
命令将找到所需的翻译。
这工作正常,但当然 $ ./yii message/extract
会在我使用 Yii:t()
和变量的任何地方抛出一些警告。
Skipping line 39. Make sure both category and message are static strings.
我认为这没什么大不了的,但是,这是我的问题:
这是翻译存储在数据库中的字符串的正确方法吗?
有没有更好的方法来完成这个?
您可以查看此扩展程序。 https://github.com/creocoder/yii2-translateable 它允许将行为附加到模型以支持多种语言。
我现在在项目中使用,很好用
我遇到了同样的问题,我找到了 this module 的解决方案。在模块配置中,您有 'tables' 数组,您可以在其中指定应翻译 table(s) 中的哪些字段。 然后,该模块有自己的 'scan' 操作(相当于 message/extract),它将所有 translatable 字符串添加到数据库(使用 DbMessageSource): all Yii::t、指定的数据库字段等等(甚至 javascript,请查看文档)。它还有一个漂亮的用户界面来进行翻译,太棒了!
例如,使用以下配置,将扫描来自 table 国籍的字段名称并添加其翻译(即国家名称):
'modules' => [
'translatemanager' => [
'class' => 'lajax\translatemanager\Module',
...
'tables' => [ // Properties of individual tables
[
'connection' => 'db', // connection identifier
'table' => 'nationality', // table name
'columns' => ['name'], // names of multilingual fields
'category' => 'database-table-name',// the category is the database table name
'categoryPrefix' => 'lx-' //
]
]
],
],
您可以生成带有一些假 Yii:t()
调用的 php 文件。
例如:
$filename = Yii::getAlias('@frontend/runtime/fake-category-translations.php');
$str = '<?php' . PHP_EOL;
foreach (Category::find()->all() as $category) {
$str .= "Yii::t('category', '{$category->name}');" . PHP_EOL;
}
file_put_contents($filename, $str);
在输出中,此文件将如下所示:
<?php
Yii::t('category', 'Art & Design');
Yii::t('category', 'Creativity');
Yii::t('category', 'Educational');
Yii::t('category', 'Education');
Yii::t('category', 'Lifestyle');
Yii::t('category', 'Casual');
所以,现在您可以调用控制台方法来搜索未翻译的字符串:
php yii message/extract @frontend/messages/config.php
我知道这已经过时了,但我在休息时遇到了同样的问题 API,这就是我解决它的方法。请注意,保存时我使用了
$post->comment = Yii::t('app', 'My Nice Comment here');
$post->save();
class Post extends ActiveRecord
{
public function fields()
{
$fields = parent::fields();
$fields['comment'] = function ($model) {
return Yii::t('app', $model->comment);
};
return $fields;
}
}