Rails中通过jQuery渲染yml文件带撇号的i18n翻译文本异常怎么解决?
Rails i18n翻译文件单引号渲染异常问题解决
核心原理
你看到的l'heure输出是单引号被转成了HTML实体编码,该转义行为和Rails XSS防护机制、前端JS渲染逻辑直接相关,和i18n的yml文件解析逻辑无关:
- 普通ERB页面直接调用
<%= t('xxx') %>渲染时,Rails默认的HTML安全处理会正常输出未转义的撇号,这就是content页面渲染正常的原因。 - booking页面因为通过jQuery渲染模态框,会触发二次转义:
- 如果你在ERB内联JS代码中直接嵌入翻译内容,Rails的自动XSS转义会先把单引号转成
'再写入JS字符串 - 如果你用jQuery的
.text()方法向模态框插入内容,也会自动把特殊字符转为HTML实体,就算之前拿到的是正常字符串也会被二次转义
- 如果你在ERB内联JS代码中直接嵌入翻译内容,Rails的自动XSS转义会先把单引号转成
你之前尝试的
'、单引号字符串内双写撇号的写法无效,是因为问题根本不在yml解析环节,修改yml内容无法解决后续模板、JS层的转义逻辑。
可落地的解决方法
根据你的使用场景选择对应方案即可:
- 场景1:翻译内容直接写在ERB的内联JS代码中
调用翻译方法后加.html_safe标记为HTML安全,同时配合Rails内置的j(escape_javascript的别名)方法处理JS字符串特殊字符,避免破坏JS语法:const modalContent = "<%= j t('booking.content').html_safe %>"; - 场景2:翻译内容通过后端接口返回给前端渲染
后端返回JSON时直接输出原始翻译字符串,前端用jQuery的.html()方法插入模态框,不要用.text():// 错误写法 $('.modal .content').text(response.content) // 正确写法 $('.modal .content').html(response.content) - 场景3:不想手动加
html_safe避免XSS风险
可以直接在yml中给翻译key加_html后缀,Rails i18n会自动将这类key对应的内容标记为HTML安全,无需手动调用方法:
调用时直接写# booking/fr.yml fr: booking: content_html: "l'heure de l'échange."<%= j t('booking.content_html') %>即可。
内容的提问来源于stack exchange,提问作者elviajero34
相关产品推荐
相关产品推荐

