I18n yii2 получить все сообщения

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
AZA
Сообщения: 53
Зарегистрирован: 2018.01.02, 17:13

I18n yii2 получить все сообщения

Сообщение AZA »

Приветствую,подскажите как получить все сообщения определенного языка в I18n .
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: I18n yii2 получить все сообщения

Сообщение samdark »

1. Перекрыть метод loadMessages в своём MessageSource, сделав его public.
2. Использовать.
Аватара пользователя
AZA
Сообщения: 53
Зарегистрирован: 2018.01.02, 17:13

Re: I18n yii2 получить все сообщения

Сообщение AZA »

samdark писал(а): 2019.04.04, 02:29 1. Перекрыть метод loadMessages в своём MessageSource, сделав его public.
2. Использовать.
Ну вот я в корне проекта в папку 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;
    }
}
в web.php задал новый PhpMessageSource

Код: Выделить всё

'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',
                    ],
                ],
            ],
        ],
как мне теперь вызывать метод?)
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: I18n yii2 получить все сообщения

Сообщение samdark »

Напрямую.
Аватара пользователя
AZA
Сообщения: 53
Зарегистрирован: 2018.01.02, 17:13

Re: I18n yii2 получить все сообщения

Сообщение AZA »

На прямую не видит,отдает пустой массив...

Код: Выделить всё

  
public  function  actionTest()
    {
        $lang = new PhpMessageSource();
        return ['test'=> $lang->loadMessages('app','ru')];
    } 
Аватара пользователя
AZA
Сообщения: 53
Зарегистрирован: 2018.01.02, 17:13

Re: I18n yii2 получить все сообщения

Сообщение AZA »

Кто нибудь,подскажите что не так....
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: I18n yii2 получить все сообщения

Сообщение samdark »

Сконфигурировать нужно перед вызовом loadMessages().
Аватара пользователя
AZA
Сообщения: 53
Зарегистрирован: 2018.01.02, 17:13

Re: I18n yii2 получить все сообщения

Сообщение AZA »

samdark писал(а): 2019.04.09, 00:31 Сконфигурировать нужно перед вызовом loadMessages().
Сконфигурировать в конфиге web.php? Так он уже настроен.. Если нет.То как?
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: I18n yii2 получить все сообщения

Сообщение someweb »

Где же он настроен. Откуда конструктор объекта должен знать, что надо взять данные из какого то левого файла?
Создайте так (из конфига приложения)

Код: Выделить всё

$lang = ...
Сорри, так нельзя, скорее всего там уже будет объект.
Получите так:

Код: Выделить всё

$lang = Yii::$app->i18n->getMessageSource('app*')
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Аватара пользователя
AZA
Сообщения: 53
Зарегистрирован: 2018.01.02, 17:13

Re: I18n yii2 получить все сообщения

Сообщение AZA »

someweb писал(а): 2019.04.10, 09:28 Где же он настроен. Откуда конструктор объекта должен знать, что надо взять данные из какого то левого файла?
Создайте так (из конфига приложения)

Код: Выделить всё

$lang = ...
Сорри, так нельзя, скорее всего там уже будет объект.
Получите так:

Код: Выделить всё

$lang = Yii::$app->i18n->getMessageSource('app*')
Не видит он метод в i18n.
Тот метод ,который предлагаешь возвращает файлы перевода.А НУЖНО получать фразы определенной категории и языка.
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: I18n yii2 получить все сообщения

Сообщение someweb »

Все он видит.
Yii::$app->i18n->getMessageSource('app*') возвращает ваш PhpMessageSource с public loadMessage(), который вы должны были указать в конфиге i18n: 'class' => 'app\lang\PhpMessageSource',
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Ответить