如何在Mailgun的Handlebars实现中无需额外助手进行if字符串比较
基于Mailgun Handlebars实现多语言模板(字符串参数版)
由于Mailgun不支持自定义Handlebars助手,我们可以完全依靠其内置的lookup、hash和or助手实现需求,无需拆分布尔参数,同时保证缺失/不支持语言时默认显示英文。
方案1:单文本快速实现
这是最简洁的写法,直接通过内置助手完成语言匹配与兜底:
{{or (lookup (hash sv="Hej" de="Hallo" fr="Bonjour" es="Hola" ) language) "Hello"}}
- 逻辑说明:
hash创建一个键为语言代码、值为对应文本的映射对象lookup根据传入的language字符串参数,从映射对象中取出对应文本or助手优先返回前面的有效值;若language缺失、或不在映射列表中(返回undefined),则自动使用后面的英文默认文本
方案2:多文本/复杂内容复用实现
如果模板中有多处多语言内容,可将语言映射封装为可复用的inline模板,避免重复代码:
{{#*inline "i18nBundle"}} {{or (lookup (hash sv=(hash greeting="Hej" welcomeMsg="Välkommen till vår tjänst" ctaButton="Klicka här för att fortsätta" ) de=(hash greeting="Hallo" welcomeMsg="Willkommen bei unserem Service" ctaButton="Klicken Sie hier, um fortzufahren" ) ) language) (hash greeting="Hello" welcomeMsg="Welcome to our service" ctaButton="Click here to continue" )}} {{/inline}} <!-- 模板中调用示例 --> <h1>{{lookup (> i18nBundle) "greeting"}}</h1> <p>{{lookup (> i18nBundle) "welcomeMsg"}}</p> <a href="/signup">{{lookup (> i18nBundle) "ctaButton"}}</a>
- 逻辑说明:
- 定义
i18nBundleinline模板,包含各语言的完整文本集合,同时预设英文默认集合 - 调用
i18nBundle后,会根据language参数返回对应语言的文本对象;若语言不支持,直接返回英文对象 - 用
lookup从返回的对象中取出具体字段即可
- 定义
内容的提问来源于stack exchange,提问作者cis
相关产品推荐
相关产品推荐

