【发布时间】:2017-06-26 17:58:54
【问题描述】:
我目前一直在涉足 yii2 的国际化模块,但遇到了一个奇怪的行为,正在徘徊。
为什么Yii::t('app','NEXT')、Yii::t('app','next') 和Yii::t('app','Next') 需要单独翻译?
我将翻译存储在数据库中。有什么办法可以使翻译不区分大小写吗?或者有什么具体原因会这样吗?
【问题讨论】:
标签: php yii2 internationalization
我目前一直在涉足 yii2 的国际化模块,但遇到了一个奇怪的行为,正在徘徊。
为什么Yii::t('app','NEXT')、Yii::t('app','next') 和Yii::t('app','Next') 需要单独翻译?
我将翻译存储在数据库中。有什么办法可以使翻译不区分大小写吗?或者有什么具体原因会这样吗?
【问题讨论】:
标签: php yii2 internationalization
我相信这是一种预期的行为,因为在某些页面中打印“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'),它会为您获取单词“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);
}
}
..接下来,打开您的web.php 设置文件并配置“i18n”组件类,如下所示:
'components' => [
'i18n' => [
'class' => 'app\components\NewI18N', // Here it is
'translations' => [
'app*' => [
'class' => 'yii\i18n\PhpMessageSource',
'basePath' => '@app/messages',
],
],
],
...
就是这样!在第二种方法中,您不必使用第三方Translator 类,只需调用您熟悉的Yii::t() 方法,它会自动降低字符串。
【讨论】: