i18n

有时我们需要根据不同语言的用户而显示不同的内容,这就需要需要将内容翻译成多种语言。在 Symfony2 的框架中提供了一个 Translation 的组件可以实现该功能。

参考文档: http://symfony.com/doc/2.5/components/translation/index.html

以下通过一个简单的例子来介绍一下它的用法。

使用方法

首先编辑文件 app/config/parameters.yml ,设置 locale 参数。这个是用于设置默认的 locale ,其值的格式为: 语言代码 + 下划线 + 国家代码。

然后编辑文件 app/config/config.yml ,设置 framework -> translator 参数: { fallback: "%locale%" } 。

其中语言代码遵循 ISO 639-1 标准: http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes国家代码遵循 ISO 3166-1 alpha-2 标准: http://en.wikipedia.org/wiki/ISO_3166-1#Current_codes

Symfony2 已经在依赖容器中注册了一个 translator 服务。在控制器中可以按照如下方法来使用:

  1. $translated = $this->get('translator')->trans('A message.');

在 Twig 模板中可以使用 trans 这模板标签或者过滤器。

  1. {% trans %}A memssage.{% endtrans %}
  2. {{ message|trans }}

更新翻译资源文件:

  1. $ php app/console translation:update --force zh BloggerBlogBundle

该命令会检查模板中的翻译词条,然后更新翻译词条的资源文件。

翻译词条资源文件存放的目录:

  1. * app/Resources/translations;
  2. * app/Resources/<bundle name>/translations;
  3. * 各个 Bundle 目录中的 Resources/translations/.

文件名格式为: domain.locale.loader ,如 messages.fr.yml

这里我们保存到 src/Blogger/BlogBundle/Resources/translations/messages.zh.yml 文件中。

然后打开该翻译文件,编辑需要翻译的词条。

最后还需要再更新一下缓存:

  1. $ php app/console cache:clear
  1. 实际情况中通常是根据用户浏览器的语言来显示翻译的内容。因此建议的做法是在用户的请求到来时先检查用户的语言,然后再设置到 $request 对象中。
  2. 例如:
  3. $locale = $request->getPreferredLanguage();
  4. $request->setLocale($locale);