Страница 1 из 1

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

Добавлено: 2019.04.03, 19:55
AZA
Приветствую,подскажите как получить все сообщения определенного языка в I18n .

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

Добавлено: 2019.04.04, 02:29
samdark
1. Перекрыть метод loadMessages в своём MessageSource, сделав его public.
2. Использовать.

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

Добавлено: 2019.04.07, 12:48
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',
                    ],
                ],
            ],
        ],
как мне теперь вызывать метод?)

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

Добавлено: 2019.04.07, 21:09
samdark
Напрямую.

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

Добавлено: 2019.04.07, 21:46
AZA
На прямую не видит,отдает пустой массив...

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

  
public  function  actionTest()
    {
        $lang = new PhpMessageSource();
        return ['test'=> $lang->loadMessages('app','ru')];
    } 

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

Добавлено: 2019.04.08, 18:54
AZA
Кто нибудь,подскажите что не так....

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

Добавлено: 2019.04.09, 00:31
samdark
Сконфигурировать нужно перед вызовом loadMessages().

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

Добавлено: 2019.04.10, 02:48
AZA
samdark писал(а):
2019.04.09, 00:31
Сконфигурировать нужно перед вызовом loadMessages().
Сконфигурировать в конфиге web.php? Так он уже настроен.. Если нет.То как?

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

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

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

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

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

$lang = Yii::$app->i18n->getMessageSource('app*')

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

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

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

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

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

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

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

Добавлено: 2019.04.10, 16:50
someweb
Все он видит.
Yii::$app->i18n->getMessageSource('app*') возвращает ваш PhpMessageSource с public loadMessage(), который вы должны были указать в конфиге i18n: 'class' => 'app\lang\PhpMessageSource',