ZetCode

Symfony 翻译

最后修改于 2020 年 7 月 5 日

Symfony 翻译教程展示了如何在 Symfony 中处理不同语言。

国际化和本地化是将计算机软件适应不同语言和文化。

Symfony 翻译

为了国际化和本地化,Symfony 包含 symfony/translation 包来完成这些任务。

翻译文件的格式必须遵循: domain.locale.loaderdomain 是一个可选的组织消息分组的方式。默认域名是 messageslocale 定义了翻译文件的区域设置;例如 en, sk, 或 de。loader 是加载和解析文件的方式;例如 xlf, php, 或 yaml。

翻译文本可以写入不同的文件格式。Symfony 翻译组件支持多种翻译格式,如 XLIFF, PHP, Qt, .po, .mo, JSON, CSV 或 INI。推荐的格式是 XLIFF。

翻译文件可以放在三个不同的目录中,其中第一个位置优先级最高:translations/, src/Resources/%bundle name%/translations/, 或 Resources/translations/

Symfony 翻译示例

在接下来的示例中,我们将创建一个简单的 Web 应用程序,它会根据区域设置返回一条消息。我们使用默认的 messages 域名。

$ symfony new symtrans
$ cd symtrans

我们创建一个新项目并进入新创建的项目目录。

$ php bin/console --version
Symfony 5.0.8 (env: dev, debug: true)

我们使用 Symfony 5.0.8。

$ composer req annotations translation

我们安装 annotationstranslation 包。

$ composer req maker --dev

我们安装 maker 组件。

config/packages/translation.yaml
framework:
    default_locale: '%locale%'
    translator:
        paths:
            - '%kernel.project_dir%/translations'
        fallbacks:
            - '%locale%'

translation.yaml 文件中,我们定义了默认区域设置。它使用 %locale% 参数,该参数在 services.yaml 配置文件中设置。

config/services.yaml
parameters:
    locale: 'en'
...

默认情况下,我们的默认区域设置为英语。

translations/messages.en.xlf
<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" target-language="en" datatype="plaintext"
            original="file.ext">
        <body>
            <trans-unit id="text.message">
                <source>text.message</source>
                <target>Today is a beautiful day</target>
            </trans-unit>
        </body>
    </file>
</xliff>

这是英语的翻译文件。

<trans-unit id="text.message">
    <source>text.message</source>
    <target>Today is a beautiful day</target>
</trans-unit>

我们有一个翻译单元。翻译单元由 ID 标识。

translations/messages.sk.xlf
<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" target-language="sk" datatype="plaintext"
            original="file.ext">
        <body>
            <trans-unit id="text.message">
                <source>text.message</source>
                <target>Dnes je krásny deň.</target>
            </trans-unit>
        </body>
    </file>
</xliff>

这是斯洛伐克语的翻译文件。

$ php bin/console cache:clear

请注意,我们可能需要清除缓存。

$ php bin/console make:controller HomeController

我们创建一个 HomeController

src/Controller/HomeController.php
<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;

class HomeController extends AbstractController
{
    /**
     * @Route("/", name="home")
     * @param TranslatorInterface $translator
     * @return Response
     */
    public function index(TranslatorInterface $translator): Response
    {
        $translated = $translator->trans('text.message',[], null, 'sk');

        return new Response($translated);
    }
}

HomeController 返回一条翻译后的消息。

public function index(TranslatorInterface $translator): Response
{

我们注入 TranslatorInterface 以获取 Symfony 翻译服务。

$translated = $translator->trans('text.message',[], null, 'sk');

翻译器的 trans() 方法翻译给定消息。最后一个参数是区域设置。在我们的例子中,我们使用了斯洛伐克语区域设置,因此我们期望收到一条斯洛伐克语的消息。

$ symfony serve

我们启动服务器。

$ curl localhost:8000
Dnes je krásny deň.

我们使用 curl 生成一个 GET 请求,并收到一条斯洛伐克语的消息。

使用 Twig 模板

接下来我们将使用 Twig 模板。

$ composer req twig

我们安装 Twig。

src/Controller/HomeController.php
<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;

class HomeController extends AbstractController
{
    /**
     * @Route("/", name="home")
     * @param TranslatorInterface $translator
     * @return Response
     */
    public function index(TranslatorInterface $translator): Response
    {
        $message = $translator->trans('text.message',[], null, 'sk');

        return $this->render('home/index.html.twig', [
            'message' => $message
        ]);
    }
}

控制器翻译消息并渲染 Twig 模板。它将翻译后的消息发送到模板。

templates/home/index.html.twig
{% extends 'base.html.twig' %}

{% block title %}Home page{% endblock %}

{% block body %}

{% trans %}%message%{% endtrans %}

{% endblock %}

在模板中,我们使用 Twig 的 {% trans %}{% endtrans %} 指令显示消息。

templates/base.html.twig
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}{% endblock %}
    </head>
    <body>
        {% block body %}{% endblock %}
        {% block javascripts %}{% endblock %}
    </body>
</html>

这是自动生成的基模板文件。

在本教程中,我们学习了如何在 Symfony 中处理翻译。

查看所有 Symfony 教程