khalyomede / laravel-translate
翻译JSON文件中缺失的键,CI友好。
Requires
- php: >=8.2.0
- stillat/blade-parser: 1.*
Requires (Dev)
- driftingly/rector-laravel: 1.2.0
- friendsofphp/php-cs-fixer: 3.54.0
- larastan/larastan: 2.9.5
- nunomaduro/collision: 8.1.1
- orchestra/testbench: 9.0.4
- phpstan/phpstan: 1.10.67
- rector/rector: 1.0.4
README
翻译JSON文件中缺失的键,CI友好。
摘要
关于
我有了一个Web应用程序,我总是在推送代码时添加了新的翻译键,却忘记在其他支持的语言中翻译它。我也经常忘记添加应该翻译的“静态”模型字段(这些字段大多数时间都与参考表相关)。
我创建了这个包来帮助我在推送和部署到生产环境之前找出哪些键我没有翻译。我也在我的CI上使用它,以防我忘记在本地运行检查。
特性
- 可以通过解析Blade和PHP文件添加缺失的翻译(支持
__(),trans(),trans_choice(),@lang()和@choice()函数) - 可以使用
--dry-run选项仅检查缺失的键(并返回一个非零代码,这对于CI很有用) - 可以排序已翻译的键
- 可以删除未使用的键
- 可以翻译模型的列值
先决条件
该包假设您严重依赖JSON文件而不是PHP文件来存储翻译。它将拉取所有非短键翻译(如validation.required,home.headline,...)并将它们放在您的“lang/[lang].json”文件中。
我也建议使用纯英文作为您的翻译键,出于各种原因
- 使用
__("您必须订阅高级计划才能使用此功能。")比使用__("plan.subscribe.warn_message")更容易理解文件 - 您不需要花费几分钟来试图找出表示文本的最佳短键名,您只需使用文本作为键即可
- 您可以轻松地将"[lang].json"文件传递给公司(或第三方服务)以翻译您选择的语言的键
- 如果您没有可计数的翻译,您可以省略配置“en”翻译,因为您的键正是您的英文翻译(如果找不到语言文件,Laravel会打印键)
安装
安装包
composer require --dev khalyomede/laravel-translate
发布配置文件
php artisan vendor:publish --tag "translate"
示例
1. 检查缺失的翻译
使用--dry-run调用命令仅检查缺失的键而不会写入缺失的键。
php artisan translate --dry-run
您可以通过编辑config/translate.php文件添加更多语言。
return [ "langs" => [ "fr", "en", "pt", ], // ... ];
2. 添加缺失的翻译
不带标志调用命令以实际写入缺失的键。
php artisan translate
您可以通过编辑config/translate.php文件添加更多语言。
return [ "langs" => [ "fr", "en", "pt", ], // ... ];
3. 自定义要解析的文件夹
默认情况下,文件夹“app”和“resources/views”是唯一被解析的。如果您需要添加更多,只需更改配置文件“config/translate.php”中的文件夹。
return [ // ... "include" => [ "app", "resources/views", ], // ... ];
这将指示命令在文件夹中查找所有以.php或.blade.php结尾的文件(通过递归搜索)。
4. 删除未找到的翻译键
如果您确定您的代码中所有键都可以由命令“找到”,则可以启用一个配置来自动删除未找到的键。转到配置文件“config/translate.php”。
return [ "remove_missing_keys" => true, // ... ];
5. 翻译模型数据
当您使用任何翻译函数来显示模型列的翻译文本时,并且此模型似乎是一个静态种子表,否则不会更改,您可能希望从要翻译的列中提取所有文本。
使用 translate.models 配置键,您就可以做到这一点。前往 "config/translate.php" 文件。
use App\Models\UserType; return [ // ... "models" => [ UserType::class => "name", ], // ... ];
如果您为同一模型有多个列,您也可以传递一个数组。
use App\Models\Post; return [ // ... "models" => [ Post::class => [ "title", "description", ], ], // ... ];
您以模型名称作为键,以从其中提取翻译的列名称作为值。
这假设您像这样翻译模型,例如:
@php $userTypes = App\Models\UserType::all(); @endphp <select name="user_type"> <option>All</option> @foreach ($userTypes as $userType) <option value="{{ $userType->id }}>@lang($userType->name)</option> @endforeach </select>
6. 添加键的原始数组
当您有一些不在 Eloquent 模型中或像 @lang("Hello world") 这样的硬编码字符串中的翻译键时,但您仍然希望将其包含在翻译键列表中,您可以构建一个自定义数组或集合并将其提供给命令。
在您的 "config/translate.php" 文件中添加如下内容:
use App\Constants\InvoiceStatus; return [ // ... "translatables" => [ fn () => [ InvoiceStatus::PENDING, InvoiceStatus::SENT, InvoiceStatus::PAID ], ] ];
如果您愿意,也可以返回一个集合。
use App\Constants\InvoiceStatus; return [ // ... "translatables" => [ fn () => collect([InvoiceStatus::PENDING, InvoiceStatus::SENT, InvoiceStatus::PAID]), ] ];
您可以拥有多个可翻译的内容。
use App\Constants\InvoiceStatus; use App\Enums\UserRole; return [ // ... "translatables" => [ fn () => collect(InvoiceStatus::PENDING, InvoiceStatus::SENT, InvoiceStatus::PAID]), fn () => collect(UserRole::cases())->map(fn (UserRole $userRole): string => $userRole->toString()), ] ];
7. 忽略键
如果您注意到某些内容没有按预期工作,您总是可以忽略一些键,直到您找到解决方案。
前往您的配置文件 "config/translate.php"。
return [ // ... "ignore_keys" => [ "Welcome", ] // ... ];
测试
composer run test
composer run analyse
composer run lint
composer run scan
composer run security
composer run updates
或者
composer run all