I18n yii2 получить все сообщения
I18n yii2 получить все сообщения
Приветствую,подскажите как получить все сообщения определенного языка в I18n .
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: I18n yii2 получить все сообщения
1. Перекрыть метод loadMessages в своём MessageSource, сделав его public.
2. Использовать.
2. Использовать.
Нравится Yii? Давайте сделаем его лучше!.
Re: I18n yii2 получить все сообщения
Ну вот я в корне проекта в папку lang,положил класс
Код: Выделить всё
<?php
namespace app\lang;
class PhpMessageSource extends \yii\i18n\PhpMessageSource
{
/**
* Loads the message translation for the specified $language and $category.
* If translation for specific locale code such as `en-US` isn't found it
* tries more generic `en`. When both are present, the `en-US` messages will be merged
* over `en`. See [[loadFallbackMessages]] for details.
* If the $language is less specific than [[sourceLanguage]], the method will try to
* load the messages for [[sourceLanguage]]. For example: [[sourceLanguage]] is `en-GB`,
* $language is `en`. The method will load the messages for `en` and merge them over `en-GB`.
*
* @param string $category the message category
* @param string $language the target language
* @return array the loaded messages. The keys are original messages, and the values are the translated messages.
* @see loadFallbackMessages
* @see sourceLanguage
*/
public function loadMessages($category, $language)
{
$messageFile = $this->getMessageFilePath($category, $language);
$messages = $this->loadMessagesFromFile($messageFile);
$fallbackLanguage = substr($language, 0, 2);
$fallbackSourceLanguage = substr($this->sourceLanguage, 0, 2);
if ($language !== $fallbackLanguage) {
$messages = $this->loadFallbackMessages($category, $fallbackLanguage, $messages, $messageFile);
} elseif ($language === $fallbackSourceLanguage) {
$messages = $this->loadFallbackMessages($category, $this->sourceLanguage, $messages, $messageFile);
} else {
if ($messages === null) {
Yii::warning("The message file for category '$category' does not exist: $messageFile", __METHOD__);
}
}
return (array) $messages;
}
}
Код: Выделить всё
'i18n' => [
'translations' => [
'app*' => [
'class' => 'app\lang\PhpMessageSource',
'basePath' => '@app/lang',
'fileMap' => [
'app' => 'app.php',
'app/error' => 'error/main.php',
'app/error_rest' => 'error/rest.php',
],
],
],
],
Re: I18n yii2 получить все сообщения
На прямую не видит,отдает пустой массив...
Код: Выделить всё
public function actionTest()
{
$lang = new PhpMessageSource();
return ['test'=> $lang->loadMessages('app','ru')];
}
Re: I18n yii2 получить все сообщения
Кто нибудь,подскажите что не так....
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: I18n yii2 получить все сообщения
Сконфигурировать нужно перед вызовом loadMessages().
Нравится Yii? Давайте сделаем его лучше!.
Re: I18n yii2 получить все сообщения
Где же он настроен. Откуда конструктор объекта должен знать, что надо взять данные из какого то левого файла?
Создайте так (из конфига приложения)
Сорри, так нельзя, скорее всего там уже будет объект.
Получите так:
Создайте так (из конфига приложения)
Код: Выделить всё
$lang = ...
Получите так:
Код: Выделить всё
$lang = Yii::$app->i18n->getMessageSource('app*')
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Re: I18n yii2 получить все сообщения
Не видит он метод в i18n.someweb писал(а): ↑2019.04.10, 09:28 Где же он настроен. Откуда конструктор объекта должен знать, что надо взять данные из какого то левого файла?
Создайте так (из конфига приложения)Сорри, так нельзя, скорее всего там уже будет объект.Код: Выделить всё
$lang = ...
Получите так:Код: Выделить всё
$lang = Yii::$app->i18n->getMessageSource('app*')
Тот метод ,который предлагаешь возвращает файлы перевода.А НУЖНО получать фразы определенной категории и языка.
Re: I18n yii2 получить все сообщения
Все он видит.
Yii::$app->i18n->getMessageSource('app*') возвращает ваш PhpMessageSource с public loadMessage(), который вы должны были указать в конфиге i18n: 'class' => 'app\lang\PhpMessageSource',
Yii::$app->i18n->getMessageSource('app*') возвращает ваш PhpMessageSource с public loadMessage(), который вы должны были указать в конфиге i18n: 'class' => 'app\lang\PhpMessageSource',
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.