本地化 介绍 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 门面中的 getLocale 和 isLocale 方法来判断当前的语言环境或检查当前的语言环境是否是给定的值: ``` $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 中。在这个文件中,您只需要定义您希望重写的翻译字符串。任何没有被重写的翻译字符串仍从原始的包的语言文件中加载。