You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shopware 6.5.4.0:空Snippet显示自身名称的优雅解决方法求助

问题描述

我想用翻译片段(Snippet)控制元素内容,当片段为空时不渲染对应元素。但当前片段为空时,会直接显示翻译键的字符串(比如header.area_button)。我目前用replace方法临时解决了这个问题,但想找更优雅的实现方式,现有代码如下:

{% set header_areaButton = 'header.area_button' | trans | raw %}
{% if header_areaButton | replace({'header.area_button': ''}) != '' %}
    <div>{{ header_areaButton | raw }}</div>
{% endif %}
优雅解决方案

方法1:直接对比翻译结果与原键

核心思路是:如果翻译后的内容和原始键字符串一致,说明没有找到有效翻译(片段为空),此时不渲染元素。这种方式无需硬编码替换内容,通用性更强:

{% set trans_key = 'header.area_button' %}
{% set header_areaButton = trans_key | trans | raw %}
{% if header_areaButton != trans_key %}
    <div>{{ header_areaButton }}</div>
{% endif %}

方法2:利用trans过滤器的默认值

Twig的trans过滤器支持设置默认值,当找不到对应翻译时返回空字符串,再通过非空判断控制渲染:

{# 适用于Twig 3.x+的简洁写法 #}
{% set header_areaButton = 'header.area_button' | trans(default='') | raw %}
{% if header_areaButton %}
    <div>{{ header_areaButton }}</div>
{% endif %}

{# 兼容旧版Twig的写法(按参数顺序传参) #}
{% set header_areaButton = 'header.area_button' | trans({}, 'messages', '', '') | raw %}
{% if header_areaButton %}
    <div>{{ header_areaButton }}</div>
{% endif %}

方法3:自定义Twig测试(适合高频场景)

如果项目中频繁需要这类判断,可以自定义一个Twig测试,统一处理“是否存在有效翻译”的逻辑:

// 在Twig扩展文件中注册自定义测试
$twig->addTest(new TwigTest('has_valid_trans', function ($key) use ($translator) {
    return $translator->trans($key) !== $key;
}));

模板中使用时更简洁直观:

{% set trans_key = 'header.area_button' %}
{% if trans_key is has_valid_trans %}
    <div>{{ trans_key | trans | raw }}</div>
{% endif %}

内容的提问来源于stack exchange,提问作者iSteuding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:52:48