Symfony文件上传表单Twig主题问题:trans变量未执行
解决Symfony表单Twig中翻译变量未生效的问题
你遇到的问题核心是Twig变量赋值时没有正确执行trans过滤器,导致tr只是存储了包含过滤器语法的字符串,而不是翻译后的文本。下面给你具体的修复方案:
问题根源
你原来的写法:
{% set tr = 'user.edit.select_image|trans' %}
这里把'user.edit.select_image|trans'当成了普通字符串赋值给tr,Twig不会解析字符串内部的过滤器语法,所以最终placeholder显示的就是原始字符串,而不是翻译后的提示。
修复方案
有两种简单的方式解决这个问题:
方案1:直接在form_row中使用trans过滤器(推荐)
不需要额外定义变量,直接在attr的placeholder里执行翻译:
<div class="card-body"> {{ form_start(CoverForm) }} {# 直接在这里对翻译键执行trans过滤器 #} {{ form_row(CoverForm.imageFile, { attr: { 'placeholder': 'user.edit.select_image'|trans } }) }} {{ form_errors(CoverForm) }} {# 移除form_widget,避免重复渲染字段(form_row已经渲染了imageFile) #} <button type="submit" class="btn btn-dark">{{ 'user.edit.form_submit'|trans }}</button> {{ form_end(CoverForm) }} </div> <script> $('.custom-file-input').on('change', function(event) { var inputFile = event.currentTarget; // 增加判断:如果没有选择文件,恢复翻译后的提示文本 $(inputFile).parent() .find('.custom-file-label') .html(inputFile.files[0] ? inputFile.files[0].name : '{{ 'user.edit.select_image'|trans }}'); }); </script>
方案2:正确定义翻译变量
如果一定要用变量存储翻译结果,需要把trans过滤器写在引号外面:
{% set tr = 'user.edit.select_image'|trans %} <div class="card-body"> {{ form_start(CoverForm) }} {{ form_row(CoverForm.imageFile, { attr: { 'placeholder': tr } }) }} {{ form_errors(CoverForm) }} <button type="submit" class="btn btn-dark">{{ 'user.edit.form_submit'|trans }}</button> {{ form_end(CoverForm) }} </div> <script> $('.custom-file-input').on('change', function(event) { var inputFile = event.currentTarget; // 这里直接使用已翻译好的变量tr $(inputFile).parent() .find('.custom-file-label') .html(inputFile.files[0] ? inputFile.files[0].name : tr); }); </script>
额外优化提醒
你原来的代码里使用了{{ form_widget(CoverForm) }},这会重复渲染表单中所有未被form_row渲染的字段。如果你的表单只有imageFile这一个字段,这会导致该字段被渲染两次;如果有其他字段,会意外显示出来。所以建议移除这一行,保持表单结构清晰。
内容的提问来源于stack exchange,提问作者cybernet2u
相关产品推荐
相关产品推荐

