symfony翻译文件需严格遵循命名规范(domain.locale.loader)、存放位置(如translations/)和格式结构(xliff/yaml/php),三者统一才能被自动识别;id/key须与trans()参数完全一致,否则返回原文或空字符串。

Symfony翻译文件的写法核心在于命名规范、目录位置、格式结构三者统一。写对了,框架才能自动识别并加载;写错了,trans() 就会返回原文或空字符串,调试起来很费劲。
翻译文件放在哪儿?
Symfony按优先级从高到低查找翻译文件,推荐只用一种方式避免混乱:
-
项目根目录下的
translations/(最高优先级,最常用) -
src/Resources/{BundleName}/translations/(Bundle内专用) -
Resources/translations/(旧版结构,不建议新项目使用)
文件名怎么起?必须遵守 domain.locale.loader 规则
这是硬性约定,缺一不可:
-
domain:分组标识,默认是
messages;也可自定义如admin、validators -
locale:语言环境码,如
en、zh_CN、fr_FR、es -
loader:后缀代表格式,如
xlf、yml、php、json
常见合法文件名示例:
-
messages.en.xlf(默认域 + 英文 + XLIFF) -
admin.zh_CN.yml(admin域 + 简体中文 + YAML) -
validators.fr.php(validators域 + 法文 + PHP数组)
三种主流格式怎么写?
选一种坚持用,XLIFF 是官方推荐,YAML 最易读,PHP 最轻量。
XLIFF(.xlf)——适合协作与工具链
<?xml version="1.0"?><xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"><file source-language="en" target-language="zh" datatype="plaintext" original="file.ext"><trans-unit id="welcome.message"><source>Welcome back, %name%</source><target>欢迎回来,%name%</target></trans-unit><trans-unit id="button.save"><source>Save</source><target>保存</target></trans-unit></file></xliff>
YAML(.yml)——适合快速开发和小团队
welcome.message: '欢迎回来,%name%' button.save: '保存' form.errors: '请检查表单中的错误'
PHP(.php)——适合极简部署或动态生成
<?php return [
'welcome.message' => '欢迎回来,%name%',
'button.save' => '保存',
];
关键细节别踩坑
- ID 或 key 必须和代码中
trans('welcome.message')完全一致(区分大小写) - YAML 中冒号后要加空格,否则解析失败:
key: value✅,key:value❌ - XLIFF 的
<source></source>内容应保持英文原文,不要本地化;<target></target>才填对应译文 - 多语言切换依赖
setLocale()或请求头/路由参数,文件本身不控制生效逻辑











