Метод loadJsonTranslationsFrom Laravel 5 не загружает все файлы перевода JSON из пакетов - PullRequest
1 голос
/ 22 октября 2019

Я разделил логику своего приложения на несколько пакетов, и каждый из них инкапсулирует свои собственные файлы (представления, контроллеры, модели, ресурсы, миграции);все работает нормально, но у меня проблемы с переводами.

В AppServiceProvider каждого пакета я вызываю функцию loadJsonTranslationsFrom и передаю путь, где находится файл перевода JSON, например,$this->loadJsonTranslationsFrom(__DIR__ . '/../../resources/lang').

Этот метод работает нормально после загрузки файла перевода JSON из основного проекта и одного из пакетов, но до этого функция не может загрузить остальные файлы.

После долгих поисков я решил отладить файлы фреймворка вручную, затем изменил файл vendor/laravel/framework/src/Illuminate/Translation/FileLoader.php следующим образом:

В функции addJsonPath($path) (строка 174) я добавил dump($this) чтобы напечатать текущее состояние экземпляра загрузчика, после строки $this->jsonPaths[] = $path (строка 176):

    /**
     * Add a new JSON path to the loader.
     *
     * @param  string  $path
     * @return void
     */
    public function addJsonPath($path)
    {
        $this->jsonPaths[] = $path;
        dump($this);
    }

В функции loadJsonPaths($locale) (строка 139) я добавил dump('debug'), чтобы проверить, когдаэта строка вызывается после самого начала функции:

    /**
     * Load a locale from the given JSON file path.
     *
     * @param  string  $locale
     * @return array
     *
     * @throws \RuntimeException
     */
    protected function loadJsonPaths($locale)
    {
        dump('debug');
        return collect(array_merge($this->jsonPaths, [$this->path]))
        ...
    }

После этих изменений я обнаружил, что функция loadJsonPaths вызывается до того, как другие пакеты загрузят свои соответствующие переводы. Файлы, это вывод:

FileLoader {#164 ▼
  #files: Filesystem {#156}
  #path: "/home/user/Projects/html/myerp/resources/lang"
  #jsonPaths: array:1 [▼
    0 => "/home/user/Projects/html/myerp/vendor/myerp/reports/src/Providers/../../resources/lang"
  ]
  #hints: []
}

"debug"

FileLoader {#164 ▼
  #files: Filesystem {#156}
  #path: "/home/user/Projects/html/myerp/resources/lang"
  #jsonPaths: array:2 [▼
    0 => "/home/user/Projects/html/myerp/vendor/myerp/reports/src/Providers/../../resources/lang"
    1 => "/home/user/Projects/html/myerp/vendor/myerp/communications/src/Providers/../../resources/lang"
  ]
  #hints: array:1 [▶]
}

FileLoader {#164 ▼
  #files: Filesystem {#156}
  #path: "/home/user/Projects/html/myerp/resources/lang"
  #jsonPaths: array:3 [▼
    0 => "/home/user/Projects/html/myerp/vendor/myerp/reports/src/Providers/../../resources/lang"
    1 => "/home/user/Projects/html/myerp/vendor/myerp/communications/src/Providers/../../resources/lang"
    2 => "/home/user/Projects/html/myerp/vendor/myerp/payments/src/Providers/../../resources/lang"
  ]
  #hints: array:2 [▶]
}

FileLoader {#164 ▼
  #files: Filesystem {#156}
  #path: "/home/user/Projects/html/myerp/resources/lang"
  #jsonPaths: array:3 [▼
    0 => "/home/user/Projects/html/myerp/vendor/myerp/reports/src/Providers/../../resources/lang"
    1 => "/home/user/Projects/html/myerp/vendor/myerp/communications/src/Providers/../../resources/lang"
    2 => "/home/user/Projects/html/myerp/vendor/myerp/payments/src/Providers/../../resources/lang"
    3 => "/home/user/Projects/html/myerp/vendor/myerp/persons/src/Providers/../../resources/lang"
  ]
  #hints: array:2 [▶]
}

Как вы можете видеть, это поведение приводит к тому, что загружаются только файлы перевода JSON основного проекта и первого пакета.

Мои вопросыявляются:

Это правильное поведение? Как я могу переопределить это поведение и загрузить файлы перевода всех пакетов?

Я использую Laravel 5.7 поверх PHP 7.1

Надеюсь, вы могли бы помочь мне, заранее спасибо.

1 Ответ

2 голосов
/ 22 октября 2019

Laravel работает так, как задумано, когда дело доходит до регистрации и загрузки файлов перевода JSON из ваших различных пакетов. Похоже, что происходит в вашем reports пакете , использующем перевод, в результате чего переводчик говорит: «Хорошо, принесите мне все переводы, чтобы я мог найти нужную мне строку». раньше, чем ожидалось.

Трудно сказать вам, где или почему это может произойти, не видя, как вы загружаете эти пакеты и / или где вы можете использовать перевод. Лучшая рекомендация, которую я имею, - установить Xdebug и добавить точку останова вместо вашей строки dump('debug')Это расскажет вам, какой след стека произошел, чтобы достичь, и может помочь вам проследить, почему переводы загружаются, когда вы не ожидаете.

Альтернативой может быть использование коротких ключевых переводов, которые располагаются в пространстве имен и загружаются независимо, а не в целом и вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...