简介
Laravel 的本地化功能提供了一种方便的方式来获取各种语言中的字符串,允许你的应用轻松支持多种语言。语言字符串存放在 resources/lang 目录下的文件中。这个目录下需要有支持的每种语言的子目录:
/resources
/lang
/en
messages.php
/es
messages.php所有的语言文件都返回一个有键值的数组,例如:
<?php
return [
'welcome' => 'Welcome to our application'
];配置本地化
应用默认的语言存放在 config/app.php 配置文件中。当然,你可以更改这个值来适应你应用的需要。你还可以通过 App facade 的 setLocale 方法在程序运行时更改生效的语言:
Route::get('welcome/{locale}', function ($locale) {
App::setLocale($locale);
//
});你还可以配置一个“备用语言”,当生效语言不包含在给定的语言行中时它将会被使用:
'fallback_locale' => 'en',
确定当前本地化
你可以使用 App facade 的 getLocale 和 isLocale 方法查明当前本地化或检查本地化是否是给定的值:
$locale = App::getLocale();
if (App::isLocale('en')) {
//
}获取语言行
你可以使用 trans 辅助方法从语言文件获取语言行。trans 方法接收文件和语言行键值作为它的第一个参数。例如,让我们获取 resources/lang/messages.php 语言文件的 welcome 语言行:
echo trans('messages.welcome');当然,如果你使用 Blade 模板引擎,你可以使用 {{ }} 语法或 @lang 指令输出语言行:
{{ trans('messages.welcome') }}
@lang('messages.welcome')如果指定的语言行不存在,trans 方法将会返回语言行的键值。所有,当使用上面的例子时,如果语言行不存在,trans 方法将会返回 messages.welcome。
替换语言行中的参数
如果你需要,还可以在语言行中定义占位符。所有的占位符都以 : 为前缀。例如,你可以在欢迎信息中定义一个名称占位符:
'welcome' => 'Welcome, :name',
当获取语言行时要替换占位符,传递一个更换的数组作为 trans 方法的第二个参数:
echo trans('messages.welcome', ['name' => 'dayle']);如果你的占位符包含大写字母,或者只有第一个字符是大写的,翻译值也将相应的转为大写:
'welcome' => 'Welcome, :NAME', // Welcome, DAYLE 'goodbye' => 'Goodbye, :Name', // Goodbye, Dayle
多元化
多元化是一个复杂的问题,因为不同的语言对于多元化有多种复杂的规则。通过“管道(|)”字符,你可以区分单数与复数形式:
'apples' => 'There is one apple|There are many apples',
当定义一个具有多元化选项的语言行后,你可以通过 trans_choice 函数来获取指定“数量”的行。在这个例子中,由于数量大于一,语言行的复数形式将会被返回:
echo trans_choice('messages.apples', 10);由于 Laravel 的翻译器是由 Symfony Translation 组件驱动的,你还可以创建更复杂的多元化,它可以为不同的数量范围指定语言行:
'apples' => '{0} There are none|[1,19] There are some|[20,Inf] There are many',重新包语言文件
有些包可能会提供它们自己的语言文件。你可以通过把这些文件放置到 resources/lang/vendor/{package}/{locale} 目录重写它们,而不是更改包的核心文件来调整它们。
例如,你想更改 skyrim/hearthfire 包 messages.php 文件的语言行,你需要放置一个 resources/lang/vendor/hearthfire/en/messages.php 语言文件。在这个文件中,你可以只定义你想覆盖的语言行。你没有覆盖的语言行都会从包的原始语言文件中加载。
该篇属于专题:《Laravel 5.3 中文文档》