本地化
介绍
Laravel 的本地化功能提供了一种方便的方法来检索各种语言的字符串,使您可以轻松地在应用程序中支持多种语言。语言字符串存储在 resources/lang
目录中的文件中。在此目录中,每种应用程序支持的语言都应有一个子目录:
/resources
/lang
/en
messages.php
/es
messages.php
所有语言文件返回一个键值对数组。例如:
<?php
return [
'welcome' => '欢迎使用我们的应用程序'
];
对于按地区划分的语言,您应根据 ISO 15897 命名语言目录。例如,"en_GB" 应用于英式英语,而不是 "en-gb"。
配置语言环境
应用程序的默认语言存储在 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
所有语言文件返回一个键值对数组。例如:
<?php
// resources/lang/en/messages.php
return [
'welcome' => '欢迎使用我们的应用程序'
];
使用翻译字符串作为键
对于翻译需求较多的应用程序,使用“短键”定义每个字符串在视图中引用时可能会很快变得混乱。因此,Laravel 还提供了使用字符串的“默认”翻译作为键来定义翻译字符串的支持。
使用翻译字符串作为键的翻译文件存储为 resources/lang
目录中的 JSON 文件。例如,如果您的应用程序有西班牙语翻译,您应该创建一个 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' => '欢迎, :name',
要在检索翻译字符串时替换占位符,请将替换数组作为第二个参数传递给 __
函数:
echo __('messages.welcome', ['name' => 'dayle']);
如果您的占位符包含所有大写字母,或仅首字母大写,翻译后的值将相应地大写:
'welcome' => '欢迎, :NAME', // 欢迎, DAYLE
'goodbye' => '再见, :Name', // 再见, Dayle
复数化
复数化是一个复杂的问题,因为不同的语言有各种复杂的复数化规则。通过使用“管道”字符,您可以区分字符串的单数和复数形式:
'apples' => '有一个苹果|有很多苹果',
您甚至可以创建更复杂的复数化规则,为多个数字范围指定翻译字符串:
'apples' => '{0} 没有苹果|[1,19] 有一些苹果|[20,*] 有很多苹果',
在定义了具有复数化选项的翻译字符串后,您可以使用 trans_choice
函数来检索给定“计数”的行。在此示例中,由于计数大于一,因此返回翻译字符串的复数形式:
echo trans_choice('messages.apples', 10);
您还可以在复数化字符串中定义占位符属性。这些占位符可以通过将数组作为第三个参数传递给 trans_choice
函数来替换:
'minutes_ago' => '{1} :value 分钟前|[2,*] :value 分钟前',
echo trans_choice('time.minutes_ago', 5, ['value' => 5]);
如果您想显示传递给 trans_choice
函数的整数值,可以使用 :count
占位符:
'apples' => '{0} 没有苹果|{1} 有一个苹果|[2,*] 有 :count 个苹果',
覆盖包语言文件
某些包可能附带自己的语言文件。您可以通过在 resources/lang/vendor/{package}/{locale}
目录中放置文件来覆盖它们,而不是更改包的核心文件以调整这些行。
例如,如果您需要覆盖名为 skyrim/hearthfire
的包的 messages.php
中的英文翻译字符串,您应该在以下位置放置一个语言文件:resources/lang/vendor/hearthfire/en/messages.php
。在此文件中,您只需定义要覆盖的翻译字符串。任何未覆盖的翻译字符串仍将从包的原始语言文件中加载。