Symfony 翻译教程

Symfony 翻译教程显示了如何在 Symfony 中使用不同的语言。

国际化和本地化正在使计算机软件适应不同的语言和文化。

Symfony 翻译

对于国际化和本地化,Symfony 包含用于这些任务的symfony/translation程序包。

翻原文件具有以下强制格式: domain.locale.loader。 domain是将消息组织成组的一种可选方式。 默认域为messages。 locale定义翻原文件的语言环境; 例如 zh,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域。

$ composer create-project symfony/skeleton symtrans

使用composer,我们创建一个新的 Symfony 骨架项目。

$ cd symtrans

我们转到项目目录。

$ composer require symfony/translation    
$ composer require annotations
$ composer require maker

我们安装了三个软件包:symfony/translationannotationsmaker

$ composer require server --dev

我们安装开发 Web 服务器。

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 clear:cache

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

$ php bin/console make:controller HomeController

我们创建一个HomeController

src/Controller/HomeController.php

<?php

namespace App\Controller;

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

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

        return new Response($translated);
    }
}

HomeController返回翻译后的消息。

public function index(TranslatorInterface $translator)
{

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

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

转换程序的trans()方法转换给定的消息。 最后一个参数是语言环境。 在我们的案例中,我们使用了斯洛伐克语区域设置,因此我们希望在斯洛伐克语中输入一条消息。

$ php bin/console server:start

我们启动服务器。

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

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

使用 Twig 模板

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

$ composer require twig

我们安装 Twig。

HomeController.php

<?php

namespace App\Controller;

use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Translation\TranslatorInterface;

class HomeController extends Controller
{
    /**
     * @Route("/home", name="home")
     */
    public function index(TranslatorInterface $translator)
    {

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

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

控制器翻译消息并呈现 Twing 模板。 它向模板发送翻译后的消息。

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>

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