# Symfony 翻译教程

> 原文： [http://zetcode.com/symfony/translation/](http://zetcode.com/symfony/translation/)

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`域。

```php
$ composer create-project symfony/skeleton symtrans

```

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

```php
$ cd symtrans

```

我们转到项目目录。

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

```

我们安装了三个软件包：`symfony/translation`，`annotations`和`maker`。

```php
$ composer require server --dev

```

我们安装开发 Web 服务器。

`config/packages/translation.yaml`

```php
framework:
    default_locale: '%locale%'
    translator:
        paths:
            - '%kernel.project_dir%/translations'
        fallbacks:
            - '%locale%'

```

在`translation.yaml`文件中，我们定义了默认语言环境。 它使用`%locale%`参数，该参数在`services.yaml`配置文件中设置。

`config/services.yaml`

```php
parameters:
    locale: 'en'
...    

```

默认情况下，我们具有英语默认语言环境。

`translations/messages.en.xlf`

```php
<?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>

```

这是英语的翻原文件。

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

```

我们只有一个翻译部门。 翻译单位由 ID 标识。

`translations/messages.sk.xlf`

```php
<?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
$ php bin/console clear:cache

```

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

```php
$ php bin/console make:controller HomeController

```

我们创建一个`HomeController`。

`src/Controller/HomeController.php`

```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`返回翻译后的消息。

```php
public function index(TranslatorInterface $translator)
{

```

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

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

```

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

```php
$ php bin/console server:start

```

我们启动服务器。

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

```

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

## 使用 Twig 模板

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

```php
$ composer require twig

```

我们安装 Twig。

`HomeController.php`

```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`

```php
{% extends 'base.html.twig' %}

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

{% block body %}

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

{% endblock %}

```

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

`templates/base.html.twig`

```php
<!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 简介](/symfony/intro/)， [Symfony 表单教程](/symfony/form/)， [Symfony 验证教程](/symfony/validation/)， [Symfony 上传文件教程](/symfony/uploadfile/)， [Symfony 服务教程](/symfony/service/)， [Symfony 请求教程](/symfony/request/)， [PHP 教程](/lang/php/)。