简介
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 中文文档》