首页 > 解决方案 > Laravel 5 loadJsonTranslationsFrom 方法不会从包中加载所有 JSON 翻译文件

问题描述

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

在每个包的 AppServiceProvider 中,我调用该函数loadJsonTranslationsFrom并传递 JSON 翻译文件所在的路径,例如$this->loadJsonTranslationsFrom(__DIR__ . '/../../resources/lang').

在从主项目和其中一个包加载 JSON 翻译文件后,此方法工作正常,但在此之前,该函数无法加载其余文件。

经过大量搜索,我决定手动调试框架文件,然后vendor/laravel/framework/src/Illuminate/Translation/FileLoader.php按以下方式修改文件:

在函数中addJsonPath($path)(第 174 行),我在行(第 176 行)dump($this)之后添加了打印加载器实例的当前状态:$this->jsonPaths[] = $path

    /**
     * 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

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

标签: phplaraveltranslationlaravel-5.7

解决方案


在从各种包中注册和加载 JSON 翻译文件时,Laravel 正在按预期工作。似乎正在发生的事情是您的reports包中的某些内容正在使用翻译,导致翻译人员继续说“好的,给我所有的翻译,这样我就可以找到我需要的字符串。” 比预期的要早。

如果不了解您如何加载这些包和/或您可能在哪里使用翻译,就很难告诉您可能发生在哪里或为什么会发生这种情况。我最好的建议是安装 Xdebug并添加一个断点来代替你的dump('debug')行。这将告诉您已经发生了哪些堆栈跟踪,并可以帮助您追溯为什么翻译在您不期望的情况下被加载。

另一种方法是使用短键翻译,它们是独立的命名空间和加载,而不是作为一个整体和组合。


推荐阅读