如何在运行时使用Laravel注册新的语言密钥?

时间:2016-12-22 03:27:39

标签: php laravel laravel-5.2 laravel-5.1 laravel-5.3

我用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我添加了新密钥?

1 个答案:

答案 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);
    }
}