Laravel 文档阅读:国际化

翻译、衍生自:https://laravel.com/docs/5.5/localization

简介

Laravel 对国际化的支持非常友好,允许项目支持多种语言。当你看到它的文件夹结构就非常清晰了。

/resources
    /lang
        /en
            messages.php
        /zh-CN
            messages.php

Laravel 的国际化文件都放在 resources/lang 下面,每种语言对应其中的一个子文件夹,en 指英文国际化文件,zh-CN 指中文简体的国际化文件,你可以按照实际需要创建新的语言文件夹和里面的国际化文件。

所有的国际化文件都是返回一个数组,数组的键是字符串类型的:

<?php

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

配置语言环境

项目使用的默认语言是在 config/app.php 配置文件里设定的,你可以按照实际需要修改它。

    /*
    |--------------------------------------------------------------------------
    | Application Locale Configuration
    |--------------------------------------------------------------------------
    |
    | The application locale determines the default locale that will be used
    | by the translation service provider. You are free to set this value
    | to any of the locales which will be supported by the application.
    |
    */

    'locale' => 'zh-CN',

也可以使用 App 门面的 setLocale 方法灵活改变语言环境。

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

    //
});

「回退语言」也是支持的,所谓的回退语言是指当默认语言的国际化文本没有提供时,就会使用回退语言的对应国际化文本,这个也是在 config/app.php 中配置的:

    /*
    |--------------------------------------------------------------------------
    | Application Fallback Locale
    |--------------------------------------------------------------------------
    |
    | The fallback locale determines the locale to use when the current one
    | is not available. You may change the value to correspond to any of
    | the language folders that are provided through your application.
    |
    */

    'fallback_locale' => 'en',

判断当前的语言环境

可以使用 App 门面的 getLocale 方法获得当前的语言环境,使用 isLocale 方法检验当前的语言环境是否是给定的值:

$locale = App::getLocale();

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

定义翻译字符串

使用简短的键

已经说过,国际化文本保存在 resources/lang 目录下。此目录下的每个子目录对应项目中支持的一种语言。

/resources
    /lang
        /en
            messages.php
        /zh-CN
            messages.php

所有的语言文件都简单的返回一个数组,数组的键是字符串类型的:

<?php

// resources/lang/en/messages.php

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

使用翻译字符串作为键

如果一个项目中有大量需要国际化的页面字段,这时定义前面这种「简短的键」,就会面临问题——有时很难分清长相相似的键的区别和在哪里使用了它们。所以,有时使用翻译字符串作为键不失为一种好方法。

使用翻译字符串作为键的翻译文件是以 JSON 格式存储在 resources/lang 中的。例如,如果项目支持西班牙文。

// config/app.php

'locale' => 'es',

那么对应的,就要创建一个 resources/lang/es.json 文件:

{
    "I love programming.": "Me encanta programar."
}

获得翻译字符串

使用全局辅助函数 __ 来获得翻译字符串, __ 函数的第一个参数使用 (指使用翻译字符串作为键的键) 或者是 文件.键 的形式。

echo __('messages.welcome');

echo __('I love programming.');

如果使用 Blade 模板引擎打印国际化文本,可以使用 {{ }} 语法或者使用 @lang 指令:

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

@lang('messages.welcome')

如果没有找到对应的翻译字符串,__ 函数就会返回翻译字符串键本身。对于上面的例子,如果翻译字符串不存在,__ 函数就会返回「messages.welcome」这个内容。

在翻译字符串中定义占位符

也可以在翻译字符串中定义占位符,所有的占位符使用 : 作为前缀。例如,把用户名作为占位符:

'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 函数获得给定「数量」的字符串文本。在下面的例子中,因为数量大于 1,所以就会返回翻译字符串的复数形式:

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

覆盖包语言文件

一些包自带语言文件,你不用更改软件包的核心文件来调整默认的翻译,直接创建 resources/lang/vendor/{package}/{locale} 文件夹就可以覆盖它们。

例如,对于包 skyrim/hearthfire,如果要覆盖包中 messages.php 文件里的英文翻译,就应该创建一个文件 resources/lang/vendor/hearthfire/en/messages.php。在此文件中,你应该只定义要覆盖的内容,没有定义的还是使用原来包语言文件里的翻译内容。