构建 Laravel 翻译包 - 翻译整理
发布时间 作者: Joe Dixon
正如我们在本系列的 早期文章 中所讨论的,Laravel 翻译默认情况下存储在语言文件中。这些文件可以是 PHP 数组样式语法或纯 JSON 文件。
Laravel 翻译包与这些文件交互以实现以下目标:
- 列出所有语言
- 添加语言
- 列出所有翻译
- 添加翻译
- 更新现有翻译
该包的计划类似于 Laravel 的许多功能,即公开多个驱动程序来支持翻译管理。第一个驱动程序将利用 Laravel 现有的基于文件的翻译,并计划稍后添加数据库驱动程序。考虑到这一点,我们首先定义一个契约,驱动程序将实现该契约以确保所有必需的方法都可供包使用。
文件驱动程序需要询问文件系统以按所需格式返回数据。这涉及大量过滤、映射和迭代,因此我们将大量依赖 Laravel 的 集合.
列出语言
要生成语言集合,我们使用文件系统从配置的语言路径获取目录数组,并将结果包装在集合中。
$directories = Collection::make($this->disk->directories($this->languageFilesPath));
接下来,我们利用 mapWithKeys
函数迭代目录,从路径中剥离语言(它将是最后一个段)并返回一个键 => 值数组。
return $directories->mapWithKeys(function ($directory) { $language = basename($directory); return [$language => $language];});
结果看起来像这样:
// $this->allLanguages()->toArray(); [ ‘en’ => ‘en’, ‘fr’ => ‘fr’, ‘es’ => ‘es’,];
添加语言
要创建新语言,我们需要在配置的语言路径中添加一个新目录和一个空的 JSON 文件,并以我们添加的语言命名。
$this->disk->makeDirectory(“{$this->languageFilesPath}/$language”); if (! $this->disk->exists(“{$this->languageFilesPath}/{$language}.json”)) { $this->disk->put( “{$this->languageFilesPath}/$language.json”, json_encode((object) [], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) );}
然后,我们使用文件系统将一个包含空的 JSON 编码数组的新文件添加到语言路径中。
使用 JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT
常量可确保生成的 JSON 格式正确。
列出翻译
列出翻译时,我们希望确保区分组(数组样式)翻译和单个(JSON 样式)翻译。
组 要获取组翻译,我们可以使用文件系统从语言目录获取所有文件。
$groups Collection($this->disk->allFiles(“{$this->languageFilesPath}/{$language}“));
然后,要获取翻译,我们可以迭代目录中的所有文件,并使用文件系统的 getRequire
方法要求该文件,这使我们能够直接访问数组。
$groups->mapWithKeys(function ($group) { return [$group->getBasename(‘.php’) => $this->disk->getRequire($group->getPathname())];});
结果看起来像这样:
[ ‘auth’ => [ ‘failed’ => ‘These credentials do not match our records’, ],]
单个
我们可以通过对文件内容使用 json_decode
来获取单个翻译。
if ($this->disk->exists($this->languageFilesPath.“/$language.json”)) { return new Collection(json_decode($this->disk->get($singlePath), true));}
结果看起来像这样:
[ ‘hello’ => ‘hello’,]
添加/更新翻译
翻译的添加和更新方式基本相同。首先,我们以数组格式获取应添加翻译的文件的内容。然后,我们检查要添加的键是否已存在。如果存在,我们更新该值;如果不存在,我们将新的键值对追加到数组中。最后,整个数组将被写回文件。
组
$translations = $this->getGroupTranslationsFor($language);$values = $translations->get($group);$values[$key] = $value;$translations->put($group, $values);$this->disk->put( “{$this->languageFilesPath}/{$language}/{$group}.php”, “<?php\n\nreturn “.var_export($translations, true).‘;’.\PHP_EOL);
单个
$translations = $this->getSingleTranslationsFor($language);$translations->put($key, $value);$this->disk->put( “{$this->languageFilesPath}/$language.json”, json_encode((object) $translations, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
为了清楚起见,一些代码示例已被截断。您可以在下面看到本文中提到的文件的完整代码。
此驱动程序为我们提供了可以构建的基础。下次,我们将构建将在包中发布的用户界面。它结合了 Tailwind CSS 和 Vue.js,这两个框架已被 Laravel 社区广泛采用。