nat*_*ral 4 php internationalization yii2
我目前正在涉足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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,而不是打电话给Yii::t('app', 'Next')你,它将使用Translator::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);
}
}
Run Code Online (Sandbox Code Playgroud)
..接下来,打开您的web.php设置文件并配置'i18n'组件类如下:
'components' => [
'i18n' => [
'class' => 'app\components\NewI18N', // Here it is
'translations' => [
'app*' => [
'class' => 'yii\i18n\PhpMessageSource',
'basePath' => '@app/messages',
],
],
],
...
Run Code Online (Sandbox Code Playgroud)
就这样!在第二种方法中,您不必使用第三方Translator类,只需调用您熟悉的Yii::t()方法,它就会自动降低字符串.