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

杰塞切尼科罗斯

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

在每个包的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转换文件。

我的问题是:

这是正确的行为吗?如何覆盖此行为并加载所有软件包的翻译文件?

我在PHP 7.1上使用Laravel 5.7

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

亚琛·罗伯茨(Aachen Roberts)

Laravel从各种包中注册和加载JSON转换文件时,按预期工作。似乎正在发生的情况是您的reports软件包中有某种东西正在使用翻译,导致翻译者继续说:“好吧,把所有的翻译给我,这样我就可以找到所需的字符串。” 早于预期。

在不了解如何加载这些程序包和/或可能在何处使用转换的情况下,很难告诉您可能在何处或为什么发生。我最好的建议是安装Xdebug并添加断点代替您的dump('debug')行。这将告诉您发生了什么堆栈跟踪,并可以帮助您回溯为什么在您不期望的时候加载翻译。

一种替代方法是使用短键转换,这些键转换是独立命名空间和加载的,而不是整体加载和组合的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章