Internationalization Yii2更改区域设置格式

Internationalization Yii2更改区域设置格式,internationalization,formatting,locale,yii2,Internationalization,Formatting,Locale,Yii2,我正在从yii1.x迁移到Yii2。 在yii1.x中,您可以定义/更改文件中的本地化格式(类似于/app/i18n/en.php),您可以在其中设置所有所需的格式,以便以后使用。 现在在Yii2这已经不存在了 我有4种语言,每种语言都有不同的设置。如果我需要一个新的格式化函数,我应该怎么做? 例如,我想为商店的价格制定一种格式,每种语言的价格都不同 DE - 1.234,56 EN - 1,234.567 SK - 1234,5 CZ - 1 234,5678 因此,我创建了一个新的格式化程

我正在从yii1.x迁移到Yii2。 在yii1.x中,您可以定义/更改文件中的本地化格式(类似于
/app/i18n/en.php
),您可以在其中设置所有所需的格式,以便以后使用。 现在在Yii2这已经不存在了

我有4种语言,每种语言都有不同的设置。如果我需要一个新的格式化函数,我应该怎么做? 例如,我想为商店的价格制定一种格式,每种语言的价格都不同

DE - 1.234,56
EN - 1,234.567
SK - 1234,5
CZ - 1 234,5678
因此,我创建了一个新的格式化程序函数
Yii::$app->formatter->asPrice(1234.567890)

我是否必须在函数内编程
开关
,并检查语言?如果我需要更多这样的功能,那将非常不方便,而且会有很多口是心非的地方。如果我以后有了一种新的语言,我将不得不用一个新的
案例来调整所有这些函数。
必须有更好的解决办法。有什么想法吗

更新

我想你们没明白我的问题。。我知道我可以设置语言环境,并使用asDecimal或类似的函数。但问题是,我不能专门定制格式化选项——它会自动采用intl PHP扩展中定义的格式。我需要专门定制这些格式的可能性。例如,EN的默认值是2位小数,但我需要3位小数。在哪里可以设置此项?

您可以按如下方式使用:

Yii::$app->formatter->locale = 'en-US';
echo Yii::$app->formatter->asDate('2014-01-01'); // output: January 1, 2014
Yii::$app->formatter->locale = 'de-DE';
echo Yii::$app->formatter->asDate('2014-01-01'); // output: 1. Januar 2014
Yii::$app->formatter->locale = 'ru-RU';
echo Yii::$app->formatter->asDate('2014-01-01'); // output: 1 января 2014 г.

所以,如果您有一个带有语言的表,您可以在那里设置语言环境,并在主布局中定义“Yii::$app->formatter->locale=$lang->locale”,其中$lang是与当前语言匹配的语言模型(类)的对象。

为什么不使用asDecimal

echo Yii::$app->formatter->asDecimal(1234.5678);

DE - 1.234,568
EN - 1,234.568
SK - 1 234,568
CZ - 1 234,568
或者您可以尝试以下方法:

    private $_priceDecimals = [ 'de_DE' => 2, 'en_EN' => 3, 'sk_SK' => 1, 'cz_CZ' => 4];

    public function asPrice($value)
    {
        return $this->asDecimal( 
            $value, 
            isset($this->_priceDecimals[$this->locale]) ? $this->_priceDecimals[$this->locale] : null
        );
    }

我想你没有理解我的问题。。我知道我可以设置区域设置,并使用asDate函数。但问题是,我不能专门定制格式化选项——它会根据Intl PHP扩展和语言环境自动采用某种格式。我需要专门定制格式的可能性。很明显,使用区域设置创建单独的配置文件怎么样?比如说_locale.php基于所选语言选择区域设置。添加所有需要的格式
'formatter'=>['dateFormat'=>'dd.MM.yyyy','decimalSeparator'=>',','千分表'=>','currencyCode'=>'EUR',],
并与\yii\helpers\ArrayHelper::merge()方法主文件和_语言环境文件合并。我以前没有这样用过,但它只是一个版本。嗯,这似乎是一个比较好的选择。但据我所知,当时没有默认选项来改变这一点..嗯,但现在的问题是,什么时候做这件事。。在配置中,我还不知道当前的语言…如何从会话中获取语言?如果您在session.com中存储语言,请查看我的更新-问题是asDecimal采用了一些格式,我需要更改这些格式