ThingsBoard 通知模板化指南:${} 参数、大小写修饰与多语言本地化

发布时间:2026/10/3 7:33:00
ThingsBoard 通知模板化指南:${} 参数、大小写修饰与多语言本地化 物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载本指南讲解 ThingsBoard 物联网平台中通知模板的通用模板化templatization机制如何在通知的标题subject、正文message与操作按钮button中嵌入收件人信息、应用大小写转换等值修饰符并通过translate后缀实现按收件人语言环境的本地化渲染。读完本文你将掌握通用通知模板的全部可用参数、${...}书写语法、值修饰后缀的用法与底层解析原理并能直接照此编写可复用的多语言通知模板。本文依据 ui-ngx/src/assets/help/en_US/notification/general.md 编写并对照 ThingsBoard 服务端源码TemplateUtils.java、NotificationProcessingContext.java进行印证与扩充。通知模板化概述在 ThingsBoard 的通知体系里每个通知模板Notification Template通常包含若干「可模板化」字段——主题subject、消息正文message以及可选的动作按钮文本button。这些字段都支持模板化通过${...}占位符插入动态参数如收件人姓名本地化通过translate后缀按收件人的语言环境渲染多语言文案。可用模板参数的具体集合取决于模板类型template type。例如告警类模板额外提供alarmType、alarmSeverity、alarmOriginatorName等参数见 alarm.md而GENERAL这类通用模板则主要提供收件人相关参数。下文聚焦通用通知General Notification中始终可用的收件人参数。通用模板参数收件人信息通用通知模板内置了 4 个与收件人档案recipient profile直接关联的参数参数名含义recipientTitle收件人的称谓若档案中填写了姓名则返回「名 姓」否则返回其邮箱recipientEmail收件人的邮箱地址recipientFirstName收件人的名first namerecipientLastName收件人的姓last name这些参数在服务端发送通知时被组装进模板上下文。源码 NotificationProcessingContext.java 的createTemplateContextForRecipient方法展示了其真实来源private MapString, String createTemplateContextForRecipient(NotificationRecipient recipient) { return Map.of( recipientTitle, recipient.getTitle(), recipientEmail, Strings.nullToEmpty(recipient.getEmail()), recipientFirstName, Strings.nullToEmpty(recipient.getFirstName()), recipientLastName, Strings.nullToEmpty(recipient.getLastName()) ); }可见recipientTitle直接取自recipient.getTitle()平台在创建接收者时按其规则生成优先「名 姓」否则用邮箱而邮箱、名、姓若为空则被规范化为空字符串避免模板中出现null字面量。${...}语法与值修饰后缀参数名必须用${...}包裹引用例如${recipientFirstName}。在此基础上你还可以为参数追加值修饰后缀suffix对参数值做二次处理。通用模板支持以下三种后缀作用示例upperCase将值转为全大写${recipientFirstName:upperCase}lowerCase将值转为全小写${recipientFirstName:lowerCase}capitalize将值的首字母大写其余不变${recipientFirstName:capitalize}这三个后缀在服务端 TemplateUtils.java 中以UnaryOperatorString函数映射实现private static final MapString, UnaryOperatorString FUNCTIONS Map.of( upperCase, String::toUpperCase, lowerCase, String::toLowerCase, capitalize, StringUtils::capitalize );模板解析的核心正则位于同一文件private static final Pattern TEMPLATE_PARAM_PATTERN Pattern.compile(\\$\\{(.?)(:[a-zA-Z])?});它匹配${参数名[:后缀]}结构其中第二组捕获可选的:xxx后缀。解析时若模板上下文缺失该参数且无法匹配任何函数占位符会原样保留不会被静默吞掉这一行为可在 TemplateUtils.processTemplate 中看到if (!context.containsKey(key)) { if (functionName null || customFunctions null || !customFunctions.containsKey(functionName)) { return \\ matchResult.group(); // 保持占位符原样输出 } } String value nullToEmpty(context.get(key)); if (functionName ! null) { UnaryOperatorString function FUNCTIONS.get(functionName); if (function ! null) { value function.apply(value); } else if (customFunctions ! null) { function customFunctions.get(functionName); ... } }本地化translate后缀要按收件人语言环境本地化通知内容使用translate后缀把翻译键translation key作为参数名传入${some.translation.key:translate}系统会先在自定义翻译中查找该键对应的翻译文本再把翻译文本作为模板继续解析即翻译结果里还可以再嵌套${...}参数。典型用例假设你在自定义翻译中定义了键custom.notifications.greetings其值为Hello, ${recipientFirstName}!那么模板${custom.notifications.greetings:translate}会被转换为Hello, John!当收件人名为 John 时。语言环境的选取规则渲染所用的 locale 取自收件人的档案设置profile settings若收件人未设置则默认使用英语English。这一点对应源码 NotificationProcessingContext.processTemplateMapString, UnaryOperatorString functions null; if (locale ! null translationProvider ! null) { functions Map.of(translate, key - translate(key, locale)); } value TemplateUtils.processTemplate(value, templateContext, functions);也就是说translate并非内置于TemplateUtils.FUNCTIONS而是通知处理流程通过customFunctions注入的自定义函数它按locale从完整翻译表fullTranslations中按键路径取值private String translate(String key, String locale) { JsonNode fullTranslation fullTranslations.computeIfAbsent(locale, translationProvider); return Optional.ofNullable(JacksonUtil.getByKeyPath(fullTranslation, key)) .map(JsonNode::asText).orElse(); }嵌套解析体现在 TemplateUtils.processTemplate自定义函数对**参数名即翻译键**应用后返回的翻译文本会再次经过processTemplate(value, context, null)递归解析因此Hello, ${recipientFirstName}!中的占位符同样会被替换。若翻译键不存在translate返回空字符串。完整示例假设通知收件人为用户John Doe。以下模板Hi, ${recipientFirstName}!将被渲染为Hi, John!结合修饰后缀与本地化可以构造更丰富的组合。例如模板Hi, ${recipientFirstName:capitalize}! Your email is ${recipientEmail:lowerCase}.若收件人姓名为 John Doe、邮箱为 JOHN.DOEEXAMPLE.COM渲染结果为Hi, John! Your email is john.doeexample.com.注原文示例中的{:copy-code}标记是 ThingsBoard 帮助文档编辑器的「一键复制代码」控件编写真实通知模板时无需包含。在通知模板中的实际使用方式在 ThingsBoard UI 的「通知中心 → 通知模板」中创建/编辑模板时直接在上述 subject、body、button 字段中按本文语法书写即可。这些模板同样可通过 REST API 维护。以 NotificationTemplateController.java 中保存模板接口POST /api/notification/template的示例为例GENERAL类型模板的 JSON 结构如下注意 body 中直接使用${recipientTitle}{ name: Greetings, notificationType: GENERAL, configuration: { deliveryMethodsTemplates: { WEB: { enabled: true, subject: Greetings, body: Hi there, ${recipientTitle}, method: WEB }, SMS: { enabled: true, body: Hi there, ${recipientTitle}, method: SMS }, SLACK: { enabled: true, body: Hi there, ${recipientTitle}, method: SLACK } } } }同一个${recipientTitle}占位符可用于 Web、SMS、Slack 等不同投递渠道delivery method渲染时由服务端统一替换为收件人的称谓。不同模板类型的参数差异需要再次强调可用的模板参数取决于模板类型。通用通知仅提供本文的 4 个收件人参数而告警类通知alarm.md还额外提供alarmType、action、alarmSeverity、alarmOriginatorName、details.key等参数其上下文由 AlarmTriggerProcessor.java 等触发处理器组装。因此在实际配置时应先确认当前模板类型对应的参数清单再编写${...}占位符。小结ThingsBoard 的通知模板化语法虽然简洁但能力完整${recipientTitle}/${recipientEmail}/${recipientFirstName}/${recipientLastName}提供收件人维度信息:upperCase/:lowerCase/:capitalize提供值修饰:translate结合收件人语言环境实现真正的多语言通知缺省英文。服务端 TemplateUtils.processTemplate 统一完成占位符匹配、函数应用与递归解析并且对缺失参数采取「原样保留」的宽容策略这为模板的渐进式演进先建模板后补参数提供了便利。掌握了这套规则你就能在 ThingsBoard 中编写出高度个性化、且能随用户语言自动切换的通知体验。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐ThingsBoard 实体数量上限通知模板化${...} 参数、大小写修饰符与多语言本地化实战ThingsBoard 实体数量上限通知模板化${...} 参数、大小写修饰符与多语言本地化实战 导读 本文围绕 ThingsBoard 通知中心Notif物联网后端数据可视化消息队列ThingsBoard 告警通知模板化参数、后缀修饰与多语言本地化完全指南ThingsBoard 告警通知模板化参数、后缀修饰与多语言本地化完全指南 本指南系统讲解 ThingsBoard 通知系统中的告警Alarm通知模板化机物联网后端数据可视化消息队列ThingsBoard Plan Upgrade Request 通知模板化参数、修饰符与本地化完整指南ThingsBoard Plan Upgrade Request 通知模板化参数、修饰符与本地化完整指南 在 ThingsBoard 物联网平台中当租户管理物联网后端数据可视化消息队列创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询