我目前正在使用yii2的国际化模块,但遇到了一种奇怪的行为并且正在徘徊。
为什么Yii::t('app','NEXT')
,Yii::t('app','next')
和Yii::t('app','Next')
需要单独翻译?
我将翻译存储在数据库中。有什么办法可以让翻译不区分大小写吗?或者有一个特定的原因,为什么会这样?
答案 0 :(得分:6)
我认为这是一种预期的行为,因为在某些页面中打印“NEXT”和“next”看起来确实不同。所以,例如,如果我想看某个地方'КЕЛЕСІ'而不是'келесі',而且我只收到小写的结果,那么首先会让我感到困惑。
无论如何,最好将该功能初始化区分大小写,并且您可以根据需要使其不区分大小写(或制作任何字符串运算符)。
轻松但不推荐
最简单的方法是使用静态函数定义一个类,在这里你可以降低任何输入,然后调用前 public double[] GetTrainingValues(int index)
{
double[] values = new double[TrainingSet.Count];
values[index] = 1.0;
return values;
}
函数。
Yii::t()
然后,您不会致电namespace app\components; // your namespace here
class Translator {
public static function t($category, $message, $params = [], $language = null)
{
return \Yii::t($category, strtolower($message), $params, $language);
}
}
,而是使用Yii::t('app', 'Next')
,而是会为您提取“下一个”字词的翻译
第二个(更优雅)的解决方案:
将覆盖在Translator::t('app', 'Next')
设置中配置的主I18N组件。
首先,您应该创建一个类并从web.php
组件继承它:
yii\i18n\I18N
..接下来,打开您的namespace app\components;
use yii\i18n\I18N;
class NewI18N extends I18N
{
public function translate($category, $message, $params, $language)
{
return parent::translate($category, strtolower($message), $params, $language);
}
}
设置文件并配置'i18n'组件类如下:
web.php
这就是全部!在第二种方法中,您不必使用第三方'components' => [
'i18n' => [
'class' => 'app\components\NewI18N', // Here it is
'translations' => [
'app*' => [
'class' => 'yii\i18n\PhpMessageSource',
'basePath' => '@app/messages',
],
],
],
...
类,只需调用熟悉的Translator
方法,它就会自动降低字符串。