本地化

简介

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 的 getLocaleisLocale 方法来判断当前语言或者检查语言是否是给定的值:

$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。在该文件中,应该只定义要重写的翻译字符串。任何没有重写的翻译字符串仍会从扩展包的原始语言文件中加载。