Laravel 文档阅读:国际化

翻译、衍生自:https://learnku.com/docs/laravel/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。在此文件中,你应该只定义要覆盖的内容,没有定义的还是使用原来包语言文件里的翻译内容。

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 6年前 加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2
nickfan

多语言对于国内的业务项目最难的是基本上视图层都是公司里的初中级开发人员编写的页面数量最多,而对应的英语水平层次不齐,规范执行的彻底性也比较难保证,项目一赶进度就变成了先中文写页面有需求了再做国际化。
让英文字面做key,这最后搞出来的key是惨不忍睹,还是规范langkey比较重要。

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!