Symfony 翻译
最后修改于 2020 年 7 月 5 日
Symfony 翻译教程展示了如何在 Symfony 中处理不同语言。
国际化和本地化是将计算机软件适应不同语言和文化。
Symfony 翻译
为了国际化和本地化,Symfony 包含 symfony/translation
包来完成这些任务。
翻译文件的格式必须遵循: domain.locale.loader
。domain
是一个可选的组织消息分组的方式。默认域名是 messages
。locale
定义了翻译文件的区域设置;例如 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
我们安装 annotations
和 translation
包。
$ composer req maker --dev
我们安装 maker 组件。
framework: default_locale: '%locale%' translator: paths: - '%kernel.project_dir%/translations' fallbacks: - '%locale%'
在 translation.yaml
文件中,我们定义了默认区域设置。它使用 %locale%
参数,该参数在 services.yaml
配置文件中设置。
parameters: locale: 'en' ...
默认情况下,我们的默认区域设置为英语。
<?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 标识。
<?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
。
<?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。
<?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 模板。它将翻译后的消息发送到模板。
{% extends 'base.html.twig' %} {% block title %}Home page{% endblock %} {% block body %} {% trans %}%message%{% endtrans %} {% endblock %}
在模板中,我们使用 Twig 的 {% trans %}
和 {% endtrans %}
指令显示消息。
<!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 中处理翻译。