构建 Laravel 翻译包 - 翻译整理

发布时间 作者:

Building a Laravel Translation Package – Wrangling Translations image

正如我们在本系列的 早期文章 中所讨论的,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 CSSVue.js,这两个框架已被 Laravel 社区广泛采用。

Joe Dixon photo

ubisend 的创始人兼首席技术官。两个小英雄的父亲,丈夫,开发者,偶尔环球旅行者。

Cube

Laravel 新闻通讯

加入 40,000 多名其他开发者,绝不错过任何新技巧、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动完成和本地和生产环境的即时反馈进行调试。

Tinkerwell
No Compromises logo

无妥协

Joel 和 Aaron,来自 No Compromises 播客的两位经验丰富的开发者,现在可以为您的 Laravel 项目提供服务。 ⬧ 固定价格 7500 美元/月。 ⬧ 无需冗长的销售流程。 ⬧ 无需合同。 ⬧ 100% 退款保证。

无妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,确保您的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

使用旧版 Laravel?即时、自动的 Laravel 升级和代码现代化,让您的应用程序保持新鲜。

Shift
Bacancy logo

Bacancy

为您的项目配备一位经验丰富的 Laravel 开发人员,拥有 4-6 年的经验,每月只需 2500 美元。获得 160 小时的专业知识和 15 天的无风险试用。立即预约通话!

Bacancy
Lucky Media logo

Lucky Media

立即获得幸运 - Laravel 开发的理想选择,拥有十多年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar:Laravel 电子商务

Laravel 电子商务。一个开源包,将现代无头电子商务功能的强大功能带到 Laravel。

Lunar:Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 工作板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit:Laravel SaaS 启动工具包

SaaSykit 是一个 Laravel SaaS 启动工具包,包含运行现代 SaaS 所需的所有功能。付款、漂亮结账、管理面板、用户仪表板、身份验证、就绪组件、统计信息、博客、文档等等。

SaaSykit:Laravel SaaS 启动工具包
Rector logo

Rector

您无缝 Laravel 升级的合作伙伴,降低成本,加速创新,帮助企业取得成功。

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成增强您的 PHP 应用程序,使开发者能够轻松高效地构建应用程序。支持事务性、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解灵活、现代的 MongoDB 数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

将 Swagger UI 添加到您的 Laravel 应用程序

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel 提示构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包为您的 Laravel 应用程序添加评论

阅读文章