我用Laravel 5.3编写了一个脚本,用于检查lang键是否在运行时存在于给定语言中。如果密钥不存在,则会将其添加到文件中。
但是,如果第一次围绕密钥不存在而我添加它,那么我会在同一个请求中进行另一次检查""要查看密钥是否存在,它会说它不存在。因此,加载的语言不会意识到我向文件中添加了新的密钥,因为Laravel将密钥加载到内存中,而我只是写入硬盘上的文件。
我正在检查当前是否存在密钥
Lang::has($key, $language, false);
当我评估Illuminate\Translation\Translator
类时,我看到load方法检查组是否加载,它不再加载它。
这是Laravel代码
/**
* Load the specified language group.
*
* @param string $namespace
* @param string $group
* @param string $locale
* @return void
*/
public function load($namespace, $group, $locale)
{
if ($this->isLoaded($namespace, $group, $locale)) {
return;
}
// 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;
}
有没有办法强制Laravel每次请求时都会阅读这种语言?或者,有没有办法将键添加到当前内存中的键?我如何告诉laravel我添加了新密钥?
答案 0 :(得分:3)
如您所知,Laravel将翻译加载到内存中以提供高性能。
为了满足您的需求,您需要将消息添加到内存中的集合中,并手动将其添加到文件中。
Laravel为您提供了一个名为addLines
的函数,它允许您向内存中的集合添加行。
$messages =
[
'file1.key1' = >'message',
'file2.key1' => 'message 2',
...
...
...
];
Lang::addLines($messages, 'fr');
这是方法
/**
* Add translation lines to the given locale.
*
* @param array $lines
* @param string $locale
* @param string $namespace
* @return void
*/
public function addLines(array $lines, $locale, $namespace = '*')
{
foreach ($lines as $key => $value) {
list($group, $item) = explode('.', $key, 2);
Arr::set($this->loaded, "$namespace.$group.$locale.$item", $value);
}
}