Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii2转换存储在数据库中的数据_Php_Database_Internationalization_Yii2_Language Translation - Fatal编程技术网

Php Yii2转换存储在数据库中的数据

Php Yii2转换存储在数据库中的数据,php,database,internationalization,yii2,language-translation,Php,Database,Internationalization,Yii2,Language Translation,我正在使用Yi2框架,并且已经使用以下指南配置了i18n组件: 因此,我现在可以使用Yii::t()函数翻译php文件中的字符串。使用$./yii message/extract控制台命令提取可翻译字符串,该命令生成正确的翻译文件 我现在需要显示数据库中存储的字符串的翻译 我可以将Yii:t() echo Yii:t('app', $some_string_from_db ); 用下面的代码创建一个新的php文件 <?php function dbStringsToTranslat

我正在使用Yi2框架,并且已经使用以下指南配置了i18n组件:

因此,我现在可以使用
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;
} 
我认为这没什么大不了的,但我的问题是:

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


是否有更好的方法来完成此任务?

您可以查看此扩展。它允许将行为附加到模型以支持多种语言


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

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

例如,使用以下配置,将扫描表National中的字段名并添加其翻译(即国家名称):


],

您可以通过一些伪
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);

我知道这很古老,但我在RESTAPI中遇到了同样的问题,下面是我如何着手解决它的。请注意,在保存时,我使用了

$post->comment=Yii::t('app','My Nice comment here');
$post->save();

问题是,i18n在Yii2上的主要重点是翻译UI文本,而不是充当应用程序中数据的翻译器。我不建议使用i18n来实现这一点,如果没有“Yii2方式解决方案”,您可以找到其他方式。这似乎很有希望。我一直在尝试使用这种行为,但它没有按预期工作。Translation的模型验证失败。未设置密钥属性。我尝试了一张新唱片和一张现有唱片,结果是一样的。您正在使用扩展的当前版本吗?我通过composer安装了它。您可以通过….轻松修复它。。。。等等,你刚才是不是收回了你的观点。。。隐马尔可夫模型。。。我想祝你好运。事实上我确实找到了解决这个问题的办法。这就是你的观点。我真的很感谢你的帮助,它非常有用。我是stackoverflow的新手,我刚刚注意到我可以改进你的答案。明天当我有了所有的信息后,我会这样做。只需将外键设置为非必需。这将使它工作,它花了我一些时间来想出一个简单的解决办法。我将更新扩展以反映这一点。太好了!!就这样!这比我的解决方法简单多了。我在保存模型之前手动设置了该属性。谢谢分享。
'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-'           // 
        ]
    ]
],
$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
class Post extends ActiveRecord
{
    public function fields()
    {
        $fields = parent::fields();
        
        $fields['comment'] = function ($model) {
            return Yii::t('app', $model->comment);
        };

        return $fields;
    }
}