我目前一直在研究 yii2 的国际化模块,但遇到了一个奇怪的行为,并且在徘徊。
为什么 Yii::t('app','NEXT')
, Yii::t('app','next')
和 Yii::t('app','Next')
需要单独翻译吗?
我将翻译存储在数据库中。有什么办法可以使翻译不区分大小写吗?或者有什么具体原因吗?
最佳答案
我相信这是预期的行为,因为在某些页面中打印“NEXT”和“next”看起来肯定不同。因此,例如,如果我想在某个地方看到“КЕЛЕСІ”而不是“келесі”,并且我只会收到小写的结果,这首先会让我感到困惑。
无论如何,该功能最初区分大小写会更好,您可以根据需要使其不区分大小写(或制作任何字符串运算符)。
简单但不推荐
最简单的方法是定义一个带有静态函数的类,您可以在其中降低任何输入,然后调用前一个 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);
}
}
然后您将使用 Translator::t('app', 'Next')
而不是调用 Yii::t('app', 'Next')
> 它将为您获取“下一个”一词的翻译
第二种(更优雅的)解决方案:
是覆盖在 web.php
设置中配置的主要 I18N 组件。
首先你应该创建一个类并从 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);
}
}
..接下来,打开您的 web.php
设置文件并配置“i18n”组件类,如下所示:
'components' => [
'i18n' => [
'class' => 'app\components\NewI18N', // Here it is
'translations' => [
'app*' => [
'class' => 'yii\i18n\PhpMessageSource',
'basePath' => '@app/messages',
],
],
],
...
就是这样!在第二种方法中,您不必使用第三方 Translator
类,只需调用您熟悉的 Yii::t()
方法,它会自动降低字符串。
关于php - 为什么yii2的国际化模块区分大小写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44765779/