能否在Drupal的t()函数内快速设置文本样式,无需额外大量代码?
关于在Drupal的t()函数内设置文本样式的问题
嘿,这个问题我太熟悉了!咱们直接说结论:不能直接在t()函数的字符串里写HTML样式,因为t()的核心作用是处理可翻译文本,默认会转义所有HTML标签(为了防XSS安全,也为了让翻译人员能看懂纯文本内容)。不过你完全不用写大量额外代码,有几种简洁的解决方式,看你具体需求:
情况1:给整个链接文本统一设置样式
其实你当前的代码已经走对路子了!你在l()函数的attributes里设置了button-red等CSS类,这就是最佳实践——把样式和内容分离,通过CSS来控制文本的外观。比如你可以在主题CSS里写:
.button-red { color: #ff0000; font-weight: bold; }
这样既不影响翻译,又能灵活控制样式,完全不需要动t()里的字符串。
情况2:给文本的某一部分单独设置样式(比如“Click here”单独变色)
如果需要给文本里的特定片段加样式,你可以用t()的占位符功能,配合l()函数的html: TRUE参数来实现,代码示例如下:
// 先创建安全的HTML片段(防止XSS) $highlighted_text = \Drupal\Core\Render\Markup::create('<span class="text-highlight">Click here</span>'); // 用占位符把HTML片段插入翻译字符串 $translated_text = t('Need it sooner? @highlighted', ['@highlighted' => $highlighted_text]); // 生成链接时,设置html为TRUE,告诉l()不要转义内容 $need_it_sooner = l($translated_text, 'need-it-sooner', [ 'attributes' => [ 'class' => ['float-right', 'button', 'button-red'], 'style' => 'float:right;', ], 'html' => TRUE, ]);
然后在CSS里定义.text-highlight的样式就行,这样翻译人员也只会看到纯文本的占位符描述,不会被HTML干扰。
为什么不能直接在t()里写样式?
t()函数的设计初衷是处理纯文本翻译,如果直接在里面写<span style="color:red">这类代码,一来会被自动转义成普通文本显示(用户会看到<span>标签而不是红色文字),二来翻译人员拿到带HTML的字符串会很困惑,不利于多语言适配,还可能带来XSS安全风险。
所以总结下来,你完全不用写大量额外代码,根据需求选上面两种方法就行,既符合Drupal的最佳实践,又能轻松实现样式需求~
内容的提问来源于stack exchange,提问作者user1692517
相关产品推荐
相关产品推荐

