Hello.
Trying to deal with app internationalization.
How can I get translated message in spite of case sensitivity?
For example, my message source (CPhpMessageSource):
<?php
return array(
'username' => 'пользователь',
'password' => 'пароль',
);
I need to get this:
Yii::t('main', 'username'); // must return 'пользователь'
Yii::t('main', 'Username'); // must return 'Пользователь'
Yii::t('main', 'USERNAME'); // must return 'ПОЛЬЗОВАТЕЛЬ'
I had to override CPhpMessageSource class to implement it. Are there any alternatives?
<?php
/**
* Case-insensitive modification of default CPhpMessageSource class
*/
class PhpMessageSource extends CPhpMessageSource {
private $_messages = array();
protected function translateMessage($category, $message, $language) {
$key = $language . '.' . $category;
if (!isset($this->_messages[$key])) {
$this->_messages[$key] = $this->loadMessages($category, $language);
}
$encoding = Yii::app()->charset;
$lcMessage = mb_strtolower($message, $encoding);
if (isset($this->_messages[$key][$lcMessage]) && $this->_messages[$key][$lcMessage] !== '') {
$result = $this->_messages[$key][$lcMessage];
if ($message == $lcMessage) {
$result = mb_strtolower($result, $encoding);
}
else if ($message == mb_strtoupper($message, $encoding)) {
$result = mb_strtoupper($result, $encoding);
}
else {
$tmpMessage = $lcMessage;
$tmpFirstLetter = mb_strtoupper(mb_substr($tmpMessage, 0, 1, $encoding), $encoding);
$tmpMessage = $tmpFirstLetter.mb_substr($tmpMessage, 1, mb_strlen($tmpMessage, $encoding), $encoding);
if ($message == $tmpMessage) {
$result = mb_strtolower($result, $encoding);
$resultFirstLetter = mb_strtoupper(mb_substr($result, 0, 1, $encoding), $encoding);
$result = $resultFirstLetter.mb_substr($result, 1, mb_strlen($result, $encoding), $encoding);
}
}
return $result;
}
else if ($this->hasEventHandler('onMissingTranslation')) {
$event = new CMissingTranslationEvent($this, $category, $message, $language);
$this->onMissingTranslation($event);
return $event->message;
}
else {
return $message;
}
}
}