我正在使用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
中解析。然而,我面临两个问题。
-
当我从包中发布语言文件时,文件夹被称为
mailcoach
,而不是laravel-mailcoach
。然而,我(同时(尝试了这两种方法,但我的语言文件都没有加载。这怎么可能? -
我想加载一个
.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-mailcoach
或resources/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/cms
statamic
而不是cms
,因此将文件放在中
resources/lang/vendor/statamic/de/messages.php
为我工作。