提示语拼接问题及样例
1 问题描述
在日常开发中,经常会遇到使用提示语进行客户提示的场景。但是由于使用场景或开发习惯,经常会导致一些提示语出现拼接的情况。一旦提示语出现拼接就会给提示语的多语言翻译带来一定的影响。因此希望通过下面的样例及建议,让开发者在开发中避免发生拼接问题,导致代码修改,重复测试等。
2 拼接样例及建议
append拼接问题
1、中文与字符串参数拼接
StringBuilder msg = new StringBuilder(); for (TelephoneVerifyResult item : resultList){ if (!item.isParseSuccess()){ throw new KDBizException(item.getParseErrorMsg()); } if (!item.isVerifySuccess()){ Map<String,String> result = item.getVerifyResult(); String message = CollectionUtils.isEmpty(result)?"":result.get("message"); if (StringUtils.isNotBlank(message)){ msg.append(ResManager.loadResFormat("账号:","AdmRegisterPlugin_29","scm-adm-formplugin")); msg.append(message); throw new KDBizException(msg.toString()); } }
这种拼接会被可翻译性检查服务检查出来,可能导致最终展示的内容缺失,语义不完整导致无法准确翻译。
修改建议:
1、去掉“账号:”中文内容,直接展示校验的错误信息。
2、msg.append(ResManager.loadKDString("账号:%s","AdmRegisterPlugin_29","scm-adm-formplugin", message)); 这样还是不能根本解决问题,但是翻译员会知道需要翻译的内容会有占位符替换内容。
2、 中文与中文符号拼接
StringBuilder msg = new StringBuilder(); msg.append(ResManager.loadKDString("系统管理员姓名:", "AdmSupplierChgEdit_9", "scm-adm-formplugin")); msg.append("【"); msg.append(userName); msg.append("】");
这种是明显的词条拼接,翻译员无法准确的拿到翻译的完整内容。导致无法准确的进行翻译。
修改建议:使用占位符的方式来描述句子的完整内容。
StringBuilder msg = new StringBuilder(); msg.append(ResManager.loadKDString("系统管理员姓名:【%s】", "AdmSupplierChgEdit_9", "scm-adm-formplugin"));
3、中文句子不完整拼接
StringBuilder sb;
for (Row row : ds) {
sb = new StringBuilder();
String time = sdf.format(row.getDate("fexetime"));
sb.append(time);
sb.append(' ');
String name = getNameByBilltype(row.getString("billtype"));
sb.append(name);
sb.append(ResManager.loadKDString("成功归档。", "CardArchiveLogPlugin_0", "fi-aef-formplugin"));
Integer count = row.getInteger("count");
sb.append(count);
sb.append(ResManager.loadKDString("份", "CardArchiveLogPlugin_1", "fi-aef-formplugin"));
Label lab = getControl("loglab" + index);
lab.setText(sb.toString());
index++;
}
这种是明显的词条拼接,针对“份”量词在其他语言例如英文中,单独出现时存在不可译问题。修改建议:将提示内容整理成包含占位符的完整句子。方便翻译员准确翻译。
for (Row row : ds) { String time = sdf.format(row.getDate("fexetime")); String name = getNameByBilltype(row.getString("billtype")); Integer count = row.getInteger("count"); Label lab = getControl("loglab" + index); lab.setText(ResManager.loadKDString(“时间:%1$s,类型:%2$s,成功归档%3$s份。” "CardArchiveLogPlugin_0", "fi-aef-formplugin"),time,name,count); index++; }
4、中文符号拼接
public String toString() {
String sb = "【" +areaCode +':' +
String.format(ResManager.loadKDString("关键字=", "CMBArea_0", "ebg-aqap-banks-cmb-dc"),keywords) +',' +
String.format(ResManager.loadKDString("省市代码=", "CMBArea_1", "ebg-aqap-banks-cmb-dc"),areaCode) +',' +
String.format(ResManager.loadKDString("省份=", "CMBArea_2", "ebg-aqap-banks-cmb-dc"),province) +',' +
String.format(ResManager.loadKDString("城市=", "CMBArea_3", "ebg-aqap-banks-cmb-dc"),city) +',' +
String.format(ResManager.loadKDString("联行号(地区码)=", "CMBArea_4", "ebg-aqap-banks-cmb-dc"),branchBankCode) +
"】";
return sb;
}
这种拼接没有将需要转换的中文符号包含在提示语中,会导致在其他语言环境下,翻译员不能通过对翻译的修改来进行符号的转换。同时中文客户看到的语句中出现了非中文的符号内容。
修改建议:将句子整理成包含中文符号和占位符的完整句子。
public String toString() { String sb = ResManager.loadKDString("【%1$s:关键字=%2$s,省市代码=%3$s,省份=%4$s,城市=%5$s,联行号(地区码)=%6$s】" ,areaCode,keywords,areaCode,province,city,branchBankCode); return sb; }
中文断句问题
1、无效中文拼接
private static String getFullName(long modelId, String dimension,String num) {
StringBuilder sb = new StringBuilder();
IDNumberTreeNode member;
int index = num.indexOf("@");
if ( index < 0) {
member = MemberReader.findMemberByNumber(MemberReader.findModelNumberById(modelId), dimension, num);
} else {
member = MemberReader.findMemberByNumber(MemberReader.findModelNumberById(modelId), dimension, num.substring(0, index));
}
String memNumber = member.getNumber();
String memName = member.getName();
if (member == IDNumberTreeNode.NotFoundTreeNode && num.contains(":")) {
String[] splits = num.split(":");
Long dimensionId = MemberReader.getDimensionIdByNum(modelId, dimension);
memNumber =splits[0] + ":" + DimPropList.getDimPropList(dimensionId).getFieldName(splits[0]);
Map<Long, IDNumberTreeNode> allNodeFromCache = MemberReader.getAllNodeFromCache(FormConstant.FORM_MEMBPROPERTY, modelId);
for (IDNumberTreeNode node : allNodeFromCache.values()) {
if (java.util.Objects.equals(node.getDimId(), dimensionId) && node.getNumber().equals(splits[1])) {
memName = splits[1] + ":" + node.getName();
}
}
}
sb.append(memNumber);
sb.append("-");
sb.append(memName);
if (index >= 0) {
String sc = num.substring(index + 1);
sb.append(ResManager.loadKDString("的", "BizRuleScope_1", "fi-bcm-business"));
sb.append( (RangeEnum.getRangeByVal(Integer.parseInt(sc))).getName());
}
return sb.toString();
}
这种“的”一个字对翻译员来说是没有办法翻译的。
修改建议:如果遇到这种情况建议使用空格来代替。
String sc = num.substring(index + 1); sb.append(" "); sb.append( (RangeEnum.getRangeByVal(Integer.parseInt(sc))).getName());
2、不完整句子拼接
protected boolean commonValidate(ExtendedDataEntity dataEntity, List<QFilter> filters, String type) {
DynamicObject item = dataEntity.getDataEntity();
DynamicObject costType = item.getDynamicObject("costtype");
if(type.equals(costType.getString("type"))){
StringBuilder info = new StringBuilder();
info.append(ResManager.loadKDString("不支持", "ImportSaveOpValidate_0", "macc-cad-opplugin"));
info.append("0".equals(type) ? ResManager.loadKDString("核算成本", "ImportSaveOpValidate_1", "macc-cad-opplugin") : ResManager.loadKDString("模拟成本", "ImportSaveOpValidate_2", "macc-cad-opplugin"));
info.append(ResManager.loadKDString("属性的成本类型新增。", "ImportSaveOpValidate_3", "macc-cad-opplugin"));
this.addErrorMessage(dataEntity, info.toString());
return false;
}
return true;
}
这种在运行期才会明确显示内容的拼接也会对翻译员准确翻译带来困扰。由于句子不完整,无法看到全句的样子,因而无法准确翻译。建议修改成明确的中文,然后在运行期根据状态确定显示内容。
修改建议:
protected boolean commonValidate(ExtendedDataEntity dataEntity, List<QFilter> filters, String type) { DynamicObject item = dataEntity.getDataEntity(); DynamicObject costType = item.getDynamicObject("costtype"); if(type.equals(costType.getString("type"))){ StringBuilder info = new StringBuilder(); info.append("0".equals(type) ? ResManager.loadKDString("不支持核算成本属性的成本类型新增。", "ImportSaveOpValidate_1", "macc-cad-opplugin") : ResManager.loadKDString("不支持模拟成本属性的成本类型新增。", "ImportSaveOpValidate_2", "macc-cad-opplugin")); this.addErrorMessage(dataEntity, info.toString()); return false; } return true; }
3、中文占位符拼接
if (var21 instanceof WFBizException) {
failedBillnos.append(String.format("%s[%s]", task.getBillNo(), var21.getMessage())).append(";");
} else if (var21 instanceof WFObjectNotFoundException) {
failedBillnos.append(String.format("%s[%s]", task.getBillNo(), ResManager.loadKDString("任务已处理,无法再次提交。", "BatchCompleteTask_2", "bos-wf-engine", new Object[0]))).append(";");
}
这种虽然使用了占位符,但是占位符使用不明确,同时与中文内容进行了拼接。需要对内容进行优化并使用中文符号
修改建议:
if (var21 instanceof WFBizException) { failedBillnos.append(String.format("%s[%s]", task.getBillNo(), var21.getMessage())).append(";"); } else if (var21 instanceof WFObjectNotFoundException) { failedBillnos.append(ResManager.loadKDString("%s【任务已处理,无法再次提交。】;", "BatchCompleteTask_2", "bos-wf-engine", task.getBillNo()))); }
提示语拼接问题及样例
本文2024-09-23 01:11:10发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-144323.html