本地化
本地化
介绍
Laravel的本地化功能提供了一种方便的方式来检索多种语言的字符串,从而使您可以轻松地在应用程序中支持多种语言。 语言字符串存储在resources / lang
目录中的文件中。 在此目录中,应存在应用程序支持的每种语言的子目录:
/resources
/lang
/en
messages.php
/es
messages.php
所有语言文件都返回一个包含字符串格式的键的数组。 例如:
<?php
return [
'welcome' => 'Welcome to our application',
];
注意:对于因地区而异的语言,应根据ISO 15897命名语言目录。例如,对于英式英语,应使用“ en_GB”而不是“ en-gb”。
配置语言环境
您的应用程序的默认语言存储在config / app.php
配置文件中。 您可以修改此值以适合您的应用程序的需求。 您还可以在运行时使用App的静态方法,setLocale方法更改正在使用的语言:
Route::get('welcome/{locale}', function ($locale) {
if (! in_array($locale, ['en', 'es', 'fr'])) {
abort(400);
}
App::setLocale($locale);
//
});
您可以配置“备用语言”,当活动语言不包含给定的翻译字符串时将使用该语言。 像默认语言一样,备用语言也可以在config / app.php
配置文件中进行配置:
'fallback_locale' => 'en',
判断当前的语言环境
您可以使用 App
门面中的 getLocale
和 isLocale
方法来判断当前的语言环境或检查当前的语言环境是否是给定的值:
$locale = App::getLocale();
if (App::isLocale('en')) {
//
}
定义翻译字符串
使用短键
通常情况下,翻译字符串存储于 resources/lang
目录下的文件中。在此目录中,应用所支持的语言都应该对应一个子目录:
/resources
/lang
/en
messages.php
/es
messages.php
所有的语言文件都应返回一个键值对数组。例如:
<?php
// resources/lang/en/messages.php
return [
'welcome' => 'Welcome to our application',
];
将翻译字符串作为键
当应用拥有庞大的翻译需求时,为每一个字符串定义一个「短键」后,在视图中引用它们可能很容易造成混乱。因此, Laravel 也提供了将翻译字符串作为键来定义翻译字符串的方式。
使用翻译字符串作为键的翻译文件需要以 JSON 的格式存储于 resources/lang
目录中。例如,您可以创建一个 resources/lang/es.json
文件:
{
"I love programming.": "Me encanta programar."
}
解析翻译字符串
您可以使用 __
辅助函数从语言文件中解析翻译字符串。 __
方法第一个参数接收文件和翻译字符串的键。举个例子,让我们来解析 resources/lang/messages.php
翻译文件中的 welcome
翻译字符串:
echo __('messages.welcome');
echo __('I love programming.');
如果您使用 Blade 模板引擎,您可以使用 {{ }}
语法或使用 @lang
指令来输出翻译字符串:
{{ __('messages.welcome') }}
@lang('messages.welcome')
如果指定的翻译字符串不存在,那么 __
函数将会返回您所指定的键。因此,如果像下面这样使用,当翻译字符串不存在时, __
函数将会返回 messages.welcome
。
注意:
@lang
指令不会转义任何输出。使用该命令时,您需要 完全承担 对转义您自己的输出的工作。
翻译字符串中的参数替换
如果需要,您可以在翻译字符串中定义占位符。所有的占位符都以 :
作为前缀。例如,您可以定义一个带有 name 作为占位符的 welcome 消息:
'welcome' => 'Welcome, :name',
在解析一个翻译字符串时要替换占位符的时候,请将用于替换的字符串以第二个参数的形式传递给 __
方法:
echo __('messages.welcome', ['name' => 'dayle']);
如果您的占位符是以大写字母命名的或是首字母大写时,翻译值将会与其匹配:
'welcome' => 'Welcome, :NAME', // Welcome, DAYLE
'goodbye' => 'Goodbye, :Name', // Goodbye, Dayle
复数
复数是一个复杂的问题,不同的语言对复数有不同的规则。您使用「管道」符来区分单数还是复数的形式:
'apples' => 'There is one apple|There are many apples',
您甚至可以创建更复杂的复数规则,为多个数字范围指定翻译字符串:
'apples' => '{0} There are none|[1,19] There are some|[20,*] There are many',
在定义了具有复数选项的翻译字符串之后,您可以传递「数量」给 trans_choice
函数来解析翻译字符串。此时,如果给定的数量大于 1 ,将会返回复数形式的翻译字符串:
echo trans_choice('messages.apples', 10);
您亦可在复数字符串中定义一个占位符。这些占位符可以被 trans_choice
函数的第三个数组函数替换:
'minutes_ago' => '{1} :value minute ago|[2,*] :value minutes ago',
echo trans_choice('time.minutes_ago', 5, ['value' => 5]);
您可以使用 :count
占位符来在显示传递给 trans_choice
函数的整数值:
'apples' => '{0} There are none|{1} There is one|[2,*] There are :count',
重写扩展包的语言文件Overriding Package Language Files
某些包可能会附带它们自己的语言文件。您可以重写这些语言文件并将其置于 resources/lang/vendor/{package}/{locale}
目录中,而不是修改包的核心文件。
因此,如果您需要重写名为 skyrim/hearthfire
的包中的 messages.php
文件中的英语翻译字符串,则需要把语言文件置于 resources/lang/vendor/hearthfire/en/messages.php
中。在这个文件中,您只需要定义您希望重写的翻译字符串。任何没有被重写的翻译字符串仍从原始的包的语言文件中加载。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: