Laravel:没有为包加载自定义语言文件



我正在使用spatie的包mailcoach来主持我自己的电子邮件营销。但是,我想编辑语言文件。关于Laravel文档,这可以通过以下方式完成:

例如,如果您需要覆盖英文翻译messages.php中的字符串用于名为skyrim/hearthfire的包,您应将语言文件放在:resources/lang/vender/hearthfire/en/messages.php

因此,在我的情况下,包被称为spatie/laravel-mailcoach,它将在resources/lang/vendor/laravel-mailcoach/de/messages.php中解析。然而,我面临两个问题。

  1. 当我从包中发布语言文件时,文件夹被称为mailcoach,而不是laravel-mailcoach。然而,我(同时(尝试了这两种方法,但我的语言文件都没有加载。这怎么可能?

  2. 我想加载一个.json文件,而不是.php文件。我假设它将如上所述工作。这意味着正确的路径文件将是resources/lang/vendor/laravel-mailcoach/de.json。这是正确的吗?

如果2是正确的,为什么Laravel仍然加载错误的语言文件?

我对IlluminateTranslationTranslator文件进行了一些挖掘,并为get方法添加了一个dd($this),该方法将检索给定密钥的正确翻译。我发现了以下内容:

IlluminateTranslationTranslator {#604 ▼
#loader: IlluminateTranslationFileLoader {#603 ▼
#files: IlluminateFilesystemFilesystem {#92}
#path: "Programmieren/MyWebsiteProject/resources/lang"
#jsonPaths: array:4 [▼
0 => "Programmieren/MyWebsiteProject/vendor/arcanedev/log-viewer/translations"
1 => "Programmieren/MyWebsiteProject/vendor/llaski/nova-scheduled-jobs/src/../resources/lang"
2 => "Programmieren/MyWebsiteProject/resources/lang/vendor/nova-scheduled-jobs"
3 => "Programmieren/MyWebsiteProject/vendor/spatie/laravel-mailcoach/src/../resources/lang/"
]
#hints: array:3 [▼
"log-viewer" => "Programmieren/MyWebsiteProject/vendor/arcanedev/log-viewer/translations"
"NovaScheduledJobs" => "Programmieren/MyWebsiteProject/vendor/llaski/nova-scheduled-jobs/src/../resources/lang"
"validationRules" => "Programmieren/MyWebsiteProject/vendor/spatie/laravel-validation-rules/src/../resources/lang/"
]
}
#locale: "de"
#fallback: "en"
#loaded: array:1 [▼
"*" => array:1 [▼
"*" => array:1 [▼
"de" => array:403 [▼
...
// my translations
...
]
]
]
]
#selector: null
#parsed: []
}

正如您在jsonPaths数组中看到的,mailcoach语言文件不是我的resources/lang/vendor/laravel-mailcoachresources/lang/vendor/mailcoach文件夹中的文件,而是原始文件。

有人能解释一下为什么会发生这种情况,而resources/lang/vendor下的文件却没有被加载吗?

有趣的是,当我在AppServiceProvider中的boot函数中添加行$this->loadJsonTranslationsFrom(resource_path() . '/lang/vendor/mailcoach');时,上面的jsonPaths数组又得到了一个正确的项Programmieren/MyWebsiteProject/resources/lang/vendor/mailcoach

然后我的自定义语言文件也在使用,但原始文件仍在加载中。这怎么可能?

除此之外,我想知道为什么我甚至必须注册我的自定义语言文件?这不是正常的行为。。。我想找出这个错误/问题。

问候

我相信我找到了解决方案(使用Laravel 8.x(:

vendor/laravel/framework/src/Illuminate/Translation/FileLoader.php中,参见

protected function loadNamespaceOverrides(array $lines, $locale, $group, $namespace)
{
$file = "{$this->path}/vendor/{$namespace}/{$locale}/{$group}.php";
if ($this->files->exists($file)) {
return array_replace_recursive($lines, $this->files->getRequire($file));
}
return $lines;
}

基于此,我假设不是包名称(如skyrim/hearthfire中的hearthfire(才是真正的交易,而是包的命名空间——在我的情况下,我使用的是statamic/cmsstatamic而不是cms,因此将文件放在中

resources/lang/vendor/statamic/de/messages.php

为我工作。

最新更新