Aurelia Validation中DisplayName未正常显示问题咨询
问题分析
你的问题核心是验证消息里的${$displayName}占位符没被正确替换成翻译后的字段名称,主要是两个环节出了问题:翻译时没传递必要的参数,加上占位符格式有误,和命名空间本身没关系,完全不用把验证消息挪到默认命名空间里。
解决方案
1. 修正验证消息的占位符格式
先看你的Validation.json,里面的占位符写了${$displayName}——多了一个多余的$。i18n(基于i18next)的插值占位符只需要字段名,所以改成这样:
{ "errorMessages": { "required": "${displayName} fehlt!", "minLength": "Der ${displayName} sollte mindestens ${length} Zeichen lang sein", "matches": "${displayName} ist nicht gültig", "email": "${displayName} is not a valid email." } }
2. 在HTML中给翻译管道传递必要参数
你当前的HTML代码只指定了验证命名空间,但没把验证规则里设置好的displayName(还有minLength需要的长度参数)传给t管道,导致占位符没法被替换。修改成这样:
<span class="help-block" repeat.for="errorInfo of ValueErrors"> ${errorInfo.error.message & t:{ns:'validation', displayName: errorInfo.error.displayName, length: errorInfo.error.config.length}} </span>
errorInfo.error.displayName:就是你在ValidationRules里用displayName()设置的翻译后名称(比如"Vorname")length:对应minLength规则里的$config.length占位符,必须一起传才能正确渲染
3. 确认命名空间大小写一致
检查下你的i18n配置:你说默认命名空间是Translation.json,但代码里用的是ns:'translation'(小写)。i18next默认区分大小写,建议统一成小写——把文件名改成translation.json和validation.json,注册命名空间时也用小写名称,避免匹配失败。
4. 验证ValidationRules的翻译结果
你的TypeScript代码逻辑没问题,但可以临时加个日志确认翻译是否生效:
// 临时日志,确认翻译后的字段名是否正确 const translatedName = this.i18n.tr(model.displayName, {ns:'translation'}); console.log(translatedName); // 应该输出"Vorname" ValidationRules.ensure('value') .displayName(translatedName) .required() .minLength(model.minLength) .on(this.model);
补充说明
完全不需要把验证消息放到默认命名空间,分开维护translation和validation是更清晰的最佳实践,只要参数传递正确、占位符格式没问题,就能正常渲染预期的错误消息。
内容的提问来源于stack exchange,提问作者lkr_developer
相关产品推荐
相关产品推荐

