Laravel 5 loadJsonTranslationsFrom 方法不会从包中加载所有 JSON 翻译文件

Laravel 5 loadJsonTranslationsFrom method does not load all JSON translation files from packages

我将应用程序的逻辑拆分为多个包,每个包都封装了自己的文件(视图、控制器、模型、资源、迁移);一切正常,但我在翻译方面遇到了问题。

在每个包的 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

希望你能帮助我,在此先感谢。

Laravel 在从您的各种包中注册和加载 JSON 翻译文件时按预期工作。似乎正在发生的事情是 reports 包中的某些东西 使用 翻译,导致翻译器继续并比预期更早说 "Okay, get me all the translations so I can find the string I need."。

如果不了解您如何加载这些包,很难告诉您发生这种情况的位置或原因,and/or您可能在其中使用翻译。我最好的建议是 install Xdebug 并添加一个断点来代替 dump('debug') 行。这将告诉您发生了什么堆栈跟踪,并可以帮助您追溯为什么在您不期望的时候加载了翻译。

另一种方法是使用 short key translations,它们是独立命名空间和加载的,而不是作为一个整体并组合的。