在 Laravel 中,我们收到最多的请求之一就是引入对多语言 Web 应用程序的更好支持。市面上已经存在一些包,它们为 Laravel 添加了一些不错的功能,可以更好地处理多语言项目的要求,但是构建这类应用程序时最让人头疼的问题之一就是管理翻译键。
在以前的 Laravel 版本中,可以使用 trans()
或 trans_choice()
辅助函数插入翻译后的行。
trans('auth.verification_number_instructions')
然后,您必须在项目支持的每种语言中都包含该键的翻译。因此,对于英语,您需要有一个名为 resources/lang/en/auth.php
的文件,内容如下
<?php return [ 'auth.verification_number_instructions' => 'Please enter your 4-digit verification number:'];
对于小型项目,翻译键的数量有限,所以管理起来并不难。然而,对于大型项目来说,想出易于理解和记忆的翻译键是一件非常痛苦的事情。因此,Laravel 5.4 附带了一个新的翻译辅助函数
__("Please enter your 4-digit verification number:")
这个新函数将查找一个 resources/lang/en.json
文件,对其进行解码,并根据应用程序当前语言返回相应的翻译值。JSON 文件如下所示
{"Please enter your 4-digit verification number:": "men fadlak adkhel raqam al tareef"}
这个新功能将允许开发人员在编写应用程序时使用简单的语言行,并将管理翻译的需求推迟到后期。
至于我们为什么使用 JSON 文件,是因为 JSON 易于人类和计算机软件阅读。我们认为,将翻译存储在 JSON 中将为包开发者创造更好的工具来处理应用程序翻译。
将参数传递给翻译器
使用 __()
方法,您可以像在以前的 Laravel 版本中一样将参数传递给翻译器
__( "Hello :name, you have :unread messages", ['name' => $user->name, 'unread' => $notifications->count])
这里的新东西是,即使没有找到语言行,也会进行参数替换。这意味着您甚至不必为应用程序的主语言构建翻译文件。因此,在上面的示例中,即使没有 en.json
文件,方法的输出也将类似于
你好 Mohamed,你有 23 条消息。
Blade 中的翻译行
在 5.4 版本中,Laravel 引入了对 @trans blade 指令的一个新增强功能,您可以执行以下操作。
@trans(['name' => $user->name, 'unread' => $notifications->count]) Hello :name, you have :unread messages.@endtrans
我们认为这种语法可以确保长翻译行的可读性更好。