本地化
简介
Laravel 的本地化功能提供了一种获取各种语言字符串的便捷方式,可以让应用轻松支持多语言。语言字符串存储在 resources/lang
目录下的文件中。应用支持的每种语言在该目录下都应该有一个子目录:
/resources
/lang
/en
messages.php
/es
messages.php
所有语言文件返回一个键为字符串的数组。例如:
return [
'welcome' => 'Welcome to our application'
];
配置语言
应用默认的语言存储在 config/app.php
配置文件中。当然,可以修改此值来满足应用的需要。也可以在运行时使用 App
Facade 的 setLocale
方法来更改激活语言:
Route::get('welcome/{locale}', function ($locale) {
App::setLocale($locale);
//
});
可以配置一个「备用语言」,当激活语言不包含在给定的翻译字符串时使用该语言。和默认语言一样,备用语言也在 config/app.php
配置文件中配置:
'fallback_locale' => 'en',
判断当前语言
可以使用 App
Facade 的 getLocale
和 isLocale
方法来判断当前语言或者检查语言是否是给定的值:
$locale = App::getLocale();
if (App::isLocale('en')) {
//
}
定义翻译字符串
使用短键
通常,翻译字符串存储在 resources/lang
目录下的文件中。应用支持的每种语言在该目录下都应该有一个子目录:
/resources
/lang
/en
messages.php
/es
messages.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
指令不转义任何输出。使用该指令时,您要 完全负责 转义自己的输出。
替换翻译字符串中的参数
如果愿意,可以在翻译字符串中定义占位符。所有占位符都要以 :
作为前缀。例如,可以使用占位符来定义一条欢迎信息:
'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
函数来获取给定「计数」的行。在本示例中,由于计数大于一,因此返回翻译字符串的复数形式:
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]);
如果要显示传递给 trans_choice
函数的整数值,可以使用 :count
占位符:
'apples' => '{0} There are none|{1} There is one|[2,*] There are :count',
重写扩展包语言文件
一些扩展包可能带有它们自己的语言文件。可以通过将文件放在 resources/lang/vendor/{package}/{locale}
目录下来重写它们,而不是更改扩展包的核心文件来调整这些行。
例如,如果需要重写名为 skyrim/hearthfire
的扩展包的 messages.php
中的英文翻译字符串,应该将语言文件放在:resources/lang/vendor/hearthfire/en/messages.php
。在该文件中,应该只定义要重写的翻译字符串。任何没有重写的翻译字符串仍会从扩展包的原始语言文件中加载。