symfony 4 中调用本地化翻译服务需使用 translator 服务,通过构造函数注入 translatorinterface,在控制器中调用 trans() 方法(支持消息 id、占位符、域和 locale 参数),twig 中用 |trans 过滤器或 {% trans %} 标签,locale 可通过请求或会话动态切换。

在 Symfony 4 中调用本地化翻译服务,核心是使用 Translator 服务(translator),它默认集成在框架中,支持基于 .xlf 或 .php 格式的翻译文件,并可按语言环境(locale)自动切换。
配置语言环境和默认翻译域
Symfony 默认从请求头、会话或 URL 参数推断 locale,你也可以手动设置。确保在 config/packages/translation.yaml 中启用并指定默认域(如 messages):
framework:
default_locale: 'en'
translator:
default_path: '%kernel.project_dir%/translations'
fallbacks: ['en']
翻译文件应放在 translations/ 目录下,命名格式为:messages.en.xlf、messages.fr.xlf、validators.zh_CN.xlf 等。
在控制器中使用 Translator 服务
推荐通过构造函数注入 TranslatorInterface,避免使用服务定位器:
use Symfony\Contracts\Translation\TranslatorInterface;
<p>class DemoController extends AbstractController
{
private $translator;</p><pre class="brush:php;toolbar:false;">public function __construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
public function index()
{
$translated = $this->translator->trans('welcome.message', [
'%name%' => 'Alice'
], 'messages', 'fr'); // 指定域和 locale
return new Response($translated);
}}
-
trans()第一个参数是消息 ID(如welcome.message) - 第二个参数是占位符数组(如
['%name%' => 'Bob']) - 第三个参数是翻译域(默认
messages,也可用validators等) - 第四个参数是 locale(可选;不传则用当前请求的 locale)
在 Twig 模板中使用翻译
Twig 提供 trans 过滤器和 trans 标签,自动使用当前 locale:
{# 使用过滤器 #}
<h1>{{ 'app.title'|trans }}</h1><p>{{ 'greeting'|trans({'%name%': 'Bob'}) }}</p><p>{# 使用标签(适合多行或含 HTML 的翻译) #}
{% trans with {'%count%': 5} %}
There are {% if count > 1 %}{{ count }} items{% else %}one item{% endif %}.
{% endtrans %}</p>注意:若模板中需强制指定 locale(如后台预览多语言),可用 |trans([], 'messages', 'de')。
动态切换 locale 并刷新翻译
要临时更改当前请求的 locale(比如用户点击语言切换按钮),可设置请求属性并重置 Translator:
use Symfony\Component\HttpFoundation\Request;
<p>public function switchLocale(Request $request, string $locale)
{
$request->setLocale($locale); // 影响后续 trans() 调用
// 或写入 session:$request->getSession()->set('_locale', $locale);</p><pre class="brush:php;toolbar:false;">return $this->redirectToRoute('homepage');}
确保已启用 session 和 translator 的 locale 跟随机制(默认开启)。不需要手动刷新翻译器实例,Symfony 会在每次 trans() 调用时根据当前 locale 加载对应资源。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











