Yii2翻译存储在数据库中的数据

时间:2015-10-15 20:35:26

标签: php database internationalization yii2 language-translation

我正在使用Yii2 Framework,并已使用本指南配置了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.

我认为这不是什么大问题,但是,这是我的问题:

这是翻译存储在数据库中的字符串的正确方法吗?

有没有更好的方法来实现这一目标?

4 个答案:

答案 0 :(得分:3)

您可以查看此扩展程序。 https://github.com/creocoder/yii2-translateable它允许将行为附加到模型以支持多种语言。

我现在在项目中使用它,它很容易使用。

答案 1 :(得分:2)

我遇到了同样的问题,我找到了this module的解决方案。在模块配置中,您有'tables'数组,您可以在其中指定应转换哪些表的哪个(哪些)字段。 然后,模块有自己的“扫描”操作(相当于消息/提取),它将所有可翻译的字符串添加到数据库(使用DbMessageSource):所有Yii :: t,指定的数据库字段,以及许多更多(甚至是javascript,检查文档)。它还有一个很好的用户界面来进行翻译,真棒!

例如,通过以下配置,将扫描并添加来自表国籍的字段名称以进行翻译(即国家/地区名称):

'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-'           // 
        ]
    ]
],

],

答案 2 :(得分:0)

您可以通过伪造的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

答案 3 :(得分:0)

我知道这很旧,但是我使用rest 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;
    }
}