在Laravel 5中给出以下文件结构(en
相同):
resources/
de/
list.php
countries.php
mail.php
pages/
pageA.json
pageB.json
我想知道:
__(..)
或@lang(..)
是否因文件pages
与.json
文件的存在而受到干扰?
如何加载语言文件?
这是我自己设法找到的:
函数__('list.button_send')
使用getFromJson($key, array $replace = [], $locale = null)
$key = 'list.button_send'
这是该功能的主要部分:
$locale = $locale ?: $this->locale;
// For JSON translations, there is only one file per locale, so we will simply load
// that file and then we will be ready to check the array for the key. These are
// only one level deep so we do not need to do any fancy searching through it.
$this->load('*', '*', $locale);
$line = $this->loaded['*']['*'][$locale][$key] ?? null;
我已经对评论感到困惑 - 我的翻译在三个不同的*.php
文件中。 Taylor为什么要谈论单个JSON文件?但是如果我们忽略它并继续,就会发现load
函数看起来像这样:
// The loader is responsible for returning the array of language lines for the
// given namespace, group, and locale. We'll set the lines in this array of
// lines that have already been loaded so that we can easily access them.
$lines = $this->loader->load($locale, $group, $namespace);
$this->loaded[$namespace][$group][$locale] = $lines;
我不知道为什么需要使用$namespace
和$group
来调用此函数,因为我们认为它们始终位于*
内Translator
类。但也忽略了这一点,我来到了有趣的部分:什么是$lines
?我猜它是一个形式的数组
$lines = ['list' => ... , 'countries' => ..., 'mail' => ...];
将回答我的问题:
他们不会干涉
如果有人在lang中访问单键,那么lang中的所有语言文件(意味着该目录中的所有*.php
)都会加载并存储在{{ 1}}对象。
然而,我无法证实我的猜测。为了做到这一点,我需要找出Translator
实际上做了什么。但$this->loader->load($locale, $group, $namespace);
在构造函数中通过依赖注入分配,我找不到它的定义。