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/translation
,annotations
和maker
。
$ 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>
这是自动生成的基本模板文件。