我在打字稿中得到了一个简单的情况。
我有一个带有一些字符串的模型。
例如
let message = 'Updated user {userName}. Set new name {newName} instead of old {oldName}.'
目前,这些字段的实际值是this.fields
属性中的商店。
我们正在进行内联替换以返回"填充"消息文本。使用类似的东西:
replaceFields(message): string {
return Object.keys(this.fields).reduce((currentMessage, field) => {
let values: String[] = this.fields[field];
if (values) {
return currentMessage.replace(`{${field}}`, values.join(', '));
} else {
return currentMessage;
}
}, message);
}
对于翻译需求,我们需要以另一种方式做事。
我们不想替换内联,而是返回一些想法:
message = {
text: 'Updated user {userName}. Set new name {newName} instead of old {oldName}.',
values: {
userName: 'actual_username',
newName: 'bob',
oldName: 'jack'
}
}
所以我们可以使用角度ngx-translate第三方,然后在管道中使用:
My message: {{message.text |translate:values}}
我在Typescript中很新,我不知道如何从字符串中提取fieldNames,然后只需将它们添加到values
对象中。
答案 0 :(得分:1)
我会使用正则表达式从消息字符串中获取所有值,然后使用它们来创建对象。以下示例将使用正则表达式查找大括号内的所有字符串,然后在字段对象中搜索它们:
class Message {
constructor(public text: string, public values: any) { };
}
function GetMessage(text: string, fields: any): Message {
let values: any = {};
let regex: RegExp = new RegExp(/{(.*?)}/g);
let match: RegExpExecArray;
while (match = regex.exec(text)) {
let field = match[1];
values[field] = fields[field] ? fields[field].join(', ') : '';
}
return new Message(text, values)
}
let fields: any = { userName: ['theUser'], newName: ['theNew'], oldName: ['theOld'] };
let str = 'Updated user {userName}. Set new name {newName} instead of old {oldName}.';
let msg = GetMessage(str, fields);
console.log(msg);
控制台记录此输出:
msg : Object {
text : "Updated user {userName}. Set new name {newName} instead of old {oldName}."
values : Object {
userName: "theUser",
newName: "theNew",
oldName: "theOld"
}
}