Internationalization Yii2更改区域设置格式
我正在从yii1.x迁移到Yii2。 在yii1.x中,您可以定义/更改文件中的本地化格式(类似于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 因此,我创建了一个新的格式化程
/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采用了一些格式,我需要更改这些格式