[ Laravel 5.3 文档 ] 视图 & 模板 —— 本地化

1、简介

Laravel 的本地化特性允许你在应用中轻松实现多种语言支持。语言字符串默认存放在resources/lang目录中,在该目录中应该包含应用支持的每种语言的子目录:

/resources
    /lang
        /en
            messages.php
        /es
            messages.php

所有语言文件都返回一个键值对数组,例如:

<?php

return [
    'welcome' => 'Welcome to our application'
];

配置Locale选项

应用默认语言存放在配置文件config/app.php中,当然,你可以修改该值来匹配应用需要。你还可以在运行时使用App门面上的setLocale方法改变当前语言:

Route::get('welcome/{locale}', function ($locale) {
    App::setLocale($locale);
    //
});

你还可以配置一个“备用语言”,当当前语言不包含给定语言行时备用语言被返回。和默认语言一样,备用语言也在配置文件config/app.php中配置:

'fallback_locale' => 'en',

判断当前的本地化语言

你可以使用App门面上的 getLocaleisLocale 方法来获取当前的本地化语言或者检查是否与给定本地化匹配:

$locale = App::getLocale();

if (App::isLocale('en')) {
    //
}

2、获取语言行

你可以使用帮助函数trans从语言文件中获取行,该方法接收文件和语言行的键作为第一个参数,例如,让我们在语言文件resources/lang/messages.php中获取语言行welcome

echo trans('messages.welcome');

当然如果你使用Blade模板引擎,可以使用{{ }}语法打印语言行或者使用 @lang 指令:

{{ trans('messages.welcome') }}

@lang('messages.welcome')

如果指定的语言行不存在,trans函数将返回语言行的键,所以,使用上面的例子,如果语言行不存在的话,trans函数将返回messages.welcome

替换语言行中的参数

如果需要的话,你可以在语言行中定义占位符,所有的占位符都有一个:前缀,例如,你可以用占位符名称定义一个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函数获取给定行数的语言行,在本例中,由于行数大于1,将会返回语言行的复数形式:

echo trans_choice('messages.apples', 10);

Laravel 翻译器由 Symfony 翻译组件提供,因此你可以创建更复杂的复数规则:

'apples' => '{0} There are none|[1,19] There are some|[20,Inf] There are many',

3、覆盖Vendor包的语言文件

有些包可以处理自己的语言文件。你可以通过将自己的文件放在resources/lang/vendor/{package}/{locale}目录下来覆盖它们而不是破坏这些包的核心文件来调整这些句子。

所以,举个例子,如果你需要覆盖名为skyrim/hearthfire的包中的messages.php文件里的英文句子,可以创建一个resources/lang/vendor/hearthfire/en/messages.php文件。在这个文件中只需要定义你想要覆盖的句子,你没有覆盖的句子仍然从该包原来的语言文件中加载。

学院君 has written 960 articles

Laravel学院院长,终身学习者

积分:109122 等级:P12 职业:手艺人 城市:杭州

7 条回复

  1. Florence Florence says:
    @ 潘亮 Obama had it his way we never would have the intel to kill Osama since it was obtained by waairbotrdeng. Obama's action would be to say "pretty please, tell us what you you know".
  2. Rusty Rusty says:
    That's a smart way of thinikng about it.
  3. 学院君 学院君 says:
    @ 学院君 看下底层源码,应该可以:public function transChoice($id, $number, array $parameters = [], $domain = 'messages', $locale = null)作为第三个参数传进去试试
  4. ycbcjq ycbcjq says:
    想问个问题:在使用语言包复数的时候,还可以同时使用占位符吗?怎么使用啊
  5. 工控资料窝 工控资料窝 says:
    非常具有实用性。谢谢

登录后才能进行评论,立即登录?