Revision: Thu, 13 Feb 2025 10:39:35 GMT

组件 — 国际化

Spiral i18n 组件基于 symfony/translator 包,并提供兼容的接口。Web 扩展包默认包含了此扩展。

安装

要在其他构建中启用此扩展,请:

composer require spiral/translator

在您的应用程序中注册引导程序 I18nBootloader

php
app/src/Application/Kernel.php
public function defineBootloaders(): array
{
    return [
        // ...
        \Spiral\Bootloader\I18nBootloader::class,
        // ...
    ];
}

阅读更多关于引导程序的信息,请参阅 框架 — 引导程序 部分。

使用

默认情况下,翻译器组件将自动加载位于 app/locale/{lang} 目录下的所有 locale 文件。

要获取可用 locale 列表:

php
namespace App\Endpoint\Web;

use Spiral\Translator\TranslatorInterface;

class HomeController
{
    public function index(TranslatorInterface $translator): void
    {
        dump($translator->getCatalogueManager()->getLocales());
    }
}

要更改 locale,请使用 setLocale 方法。

注意 建议在中间件或领域核心中使用 setLocale 方法,然后适当地重置原始 locale。

配置

框架自动提供一个默认配置,位于 Spiral\Bootloader\I18nBootloader 中。如果您需要自定义设置,可以在 app/config/translator.php 中定义它们:

配置文件

以下是一个典型的配置示例:

php
app/config/translator.php
use Symfony\Component\Translation\Dumper;
use Symfony\Component\Translation\Loader;

return [
    'locale' => env('LOCALE', 'en'),
    'fallbackLocale' => env('LOCALE', 'en'),
    'directory' => directory('locale'),
    'autoRegister' => env('DEBUG', true),
    // available locale loaders (the key is extension)
    'loaders' => [
        'php'  => Loader\PhpFileLoader::class,
        'po'   => Loader\PoFileLoader::class,
        'csv'  => Loader\CsvFileLoader::class,
        'json' => Loader\JsonFileLoader::class
    ],
    // export methods
    'dumpers'  => [
        'php'  => Dumper\PhpFileDumper::class,
        'po'   => Dumper\PoFileDumper::class,
        'csv'  => Dumper\CsvFileDumper::class,
        'json' => Dumper\JsonFileDumper::class,
    ],
    'domains' => [
        // by default we can store all messages in one domain
        'messages' => ['*']
    ]
];

关键点:

  1. Locale 设置: locale 是您的主要语言,而 fallbackLocale 是应用程序在指定的语言不可用时将使用的默认语言。
  2. 目录设置: 这是语言文件所在的位置。默认情况下,它设置为 app/locale 目录。
  3. Loaders 和 Dumpers: 这些是处理从翻译文件中读取和写入的类。

更改 Locale 文件的目录

如果您想为您的语言文件使用不同的目录,请修改 directory 选项:

php
app/config/translator.php
return [
    'directory' => directory('locale'),
];

有时,您可能需要来自多个位置的翻译。例如,当您使用带有自己翻译的外部包时。

要指定多个目录,请使用 directories

php
app/config/translator.php
return [
    'directory' => directory('locale'),
    // ...
    'directories' => [
        directory('vendor/package/name/locale'),
        ...
    ],
    // ...
];

您也可以使用 Spiral\Bootloader\I18nBootloader 引导程序添加新目录:

php
use Spiral\Boot\Bootloader\Bootloader;
use Spiral\Bootloader\I18nBootloader;

final class AppBootloader extends Bootloader
{
    public function init(I18nBootloader $i18n): void
    {
        $i18n->addDirectory('some/directory');
    }
}

注意 如果翻译文件之间存在冲突,主应用程序中的文件将优先于其他目录。

导入和导出

可以将应用程序 locale 包导出为以下格式:

  • PHP
  • GetText PO
  • CSV
  • JSON

导出 Locale

要导出应用程序 locale 包,请运行:

php app.php i18n:export en ./

注意 将 locale en 导出到当前目录。

您应该看到在该目录下创建了文件 messages.en.php。要以其他格式导出:

php app.php i18n:export en ./ -d po

此命令将 locale 导出为 GetText 格式。

生成 Locale

框架能够使用静态代码索引自动生成 locale 文件。 运行命令 i18n:index 以查找所有声明的字符串。

php app.php i18n:index -vv

导入 Locale

将 locale 导入到项目中,将文件放置在 app/locale/{lang} 目录中。使用 GetTextPHPJSON 格式。

视图本地化

Spiral 包含一个适用于 TwigStempler 引擎的视图处理过程,用于翻译视图源代码。 翻译后的视图将存储在单独的视图缓存中,并且它提供了在没有任何性能损失的情况下翻译视图的能力。

视图翻译

要激活视图翻译,请启用引导程序 Spiral\Bootloader\Views\TranslatedCacheBootloader。 确保在视图引擎引导程序之前添加此引导程序:

php
app/src/Application/Kernel.php
public function defineBootloaders(): array
{
    return [
         // ...
         \Spiral\Views\Bootloader\ViewsBootloader::class,
         \Spiral\Bootloader\Views\TranslatedCacheBootloader::class,
         // ...
    ];
}

阅读更多关于引导程序的信息,请参阅 框架 — 引导程序 部分。

在您的模板中使用 [[ string ]] 包裹要翻译的字符串:

html
[[hello world]]

注意 在您的应用程序中更改 locale 以切换视图中的翻译。

Say Trait

可以使用专门的 trait Spiral\Translator\Traits\TranslatorTrait 将翻译功能添加到任何应用程序对象。

使用

我们可以将翻译器 trait 添加到控制器:

php
namespace App\Endpoint\Web;

use Spiral\Translator\Traits\TranslatorTrait;

class HomeController
{
    use TranslatorTrait;

    public function index(): string
    {
        return $this->say('hello world!');
    }
}

注意 运行 'i18n:index' 以索引字符串调用。

类消息

在消息由逻辑定义且无法索引的情况下,使用常量或属性来声明类消息,每个用 [[]] 包裹的字符串都将被自动索引。

php
class HomeController 
{
    use TranslatorTrait;

    protected const MESSAGES = [
        'error'   => '[[An error]]',
        'success' => '[[Success]]'
    ];

    public function index(): string
    {
        echo $this->say(self::MESSAGES['error']);
    }
}

事件

事件 描述
Spiral\Translator\Event\LocaleUpdated 此事件将在更改 locale 触发。

注意 要了解更多关于调度事件的信息,请参阅我们文档中的 事件 部分。