本地化

未匹配的标注
本文档最新版为 9.x,旧版本可能放弃维护,推荐阅读最新版!

本地化

介绍

Laravel的本地化功能提供了一种方便的方式来检索多种语言的字符串,从而使您可以轻松地在应用程序中支持多种语言。 语言字符串存储在resources / lang目录中的文件中。 在此目录中,应存在应用程序支持的每种语言的子目录:

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

所有语言文件都返回一个包含字符串格式的键的数组。 例如:

<?php

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

注意:对于因地区而异的语言,应根据ISO 15897命名语言目录。例如,对于英式英语,应使用“ en_GB”而不是“ en-gb”。

配置语言环境

您的应用程序的默认语言存储在config / app.php配置文件中。 您可以修改此值以适合您的应用程序的需求。 您还可以在运行时使用App的静态方法,setLocale方法更改正在使用的语言:

Route::get('welcome/{locale}', function ($locale) {
    if (! in_array($locale, ['en', 'es', 'fr'])) {
        abort(400);
    }

    App::setLocale($locale);

    //
});

您可以配置“备用语言”,当活动语言不包含给定的翻译字符串时将使用该语言。 像默认语言一样,备用语言也可以在config / app.php配置文件中进行配置:

'fallback_locale' => 'en',

判断当前的语言环境

您可以使用 App 门面中的 getLocaleisLocale 方法来判断当前的语言环境或检查当前的语言环境是否是给定的值:

$locale = App::getLocale();

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

定义翻译字符串

使用短键

通常情况下,翻译字符串存储于 resources/lang 目录下的文件中。在此目录中,应用所支持的语言都应该对应一个子目录:

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

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

<?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 指令不会转义任何输出。使用该命令时,您需要 完全承担 对转义您自己的输出的工作。

翻译字符串中的参数替换

如果需要,您可以在翻译字符串中定义占位符。所有的占位符都以 : 作为前缀。例如,您可以定义一个带有 name 作为占位符的 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);

您亦可在复数字符串中定义一个占位符。这些占位符可以被 trans_choice 函数的第三个数组函数替换:

'minutes_ago' => '{1} :value minute ago|[2,*] :value minutes ago',

echo trans_choice('time.minutes_ago', 5, ['value' => 5]);

您可以使用 :count 占位符来在显示传递给 trans_choice 函数的整数值:

'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 中。在这个文件中,您只需要定义您希望重写的翻译字符串。任何没有被重写的翻译字符串仍从原始的包的语言文件中加载。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/laravel/8.x/loc...

译文地址:https://learnku.com/docs/laravel/8.x/loc...

上一篇 下一篇
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
贡献者:4