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,它们是独立命名空间和加载的,而不是作为一个整体并组合的。
我将应用程序的逻辑拆分为多个包,每个包都封装了自己的文件(视图、控制器、模型、资源、迁移);一切正常,但我在翻译方面遇到了问题。
在每个包的 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,它们是独立命名空间和加载的,而不是作为一个整体并组合的。