@voerkai18n/utils
Version:
utils for voerkai18n
59 lines (49 loc) • 2.08 kB
text/typescript
/**
* 将idMap应用到翻译结果中
*
*/
import { escapeRegex } from "./escapeRegex"
// 捕获翻译文本正则表达式二: 能够支持复杂的表达式,但是当提供不完整的t函数定义时,也会进行匹配提取
// const MessageRegex = /([ \t\^;\{\(\,=\'\"\.\[\|\+\>])(t)\(\s*(["']{1})(.*?)(\3)/gm
// const MessageComponentRegex = /<Translate\s+[^>]*(?<![:@#%&*])message\s*=\s*(?:"([^"]+)"|{["'`](.+?)["'`]}|{`([^`]+)`})/gm
const getMessageRegex = (names:string[]=['t'])=>{
return new RegExp(`([ \\t\\^;\\{\\(\\,=\\'\\"\\.\\[\\|\\+\\>])(${names.map(name=>escapeRegex(name)).join("|")})\\(\\s*(["']{1})(.*?)(\\3)`,"gm")
}
const getComponentRegex = (tags:string[]=['Translate'])=>{
return new RegExp(`<(${tags.map(tag=>escapeRegex(tag)).join("|")})(\\s+[^>]*)(?<![:@#%&*])message\\s*=\\s*(?:"([^"]+)"|{["'\`](.+?)["'\`]}|{\`([^\`]+)\`})`,"gm")
}
export type ApplyIdMapOptions = {
tFuncNames?: string[]
tComponentNames?:string[]
}
export function applyIdMap(code:string,idMap:Record<string,string>,options?:ApplyIdMapOptions):string{
const { tFuncNames, tComponentNames } = Object.assign({
tFuncNames:['t','$t'],
tComponentNames:['Translate','v-translate']
},options)
return code.replace(getMessageRegex(tFuncNames),(matched,pre,tName,_,message,n)=>{
return `${pre}${tName}('${idMap[message] || message}'`
}).replace(getComponentRegex(tComponentNames),(_,tagName,attrs,message)=>{
return `<${tagName}${attrs}message="${idMap[message] || message}"`
})
}
// console.log(applyIdMap(String.raw`
// t("aaa")
// t('bbb')
// t("ccc", {xxx:xxx})
// t('ddd', [1,2,3,""])
// t("eee", {xxx:xxx},{})
// t('fff', [1,2,3,""],{})
// t("ggg", {xxx:xxx},()=>{})
// t('hhh', [1,2,3,""],()=>{})
// $t('iii', [1,2,3,""],()=>{})
// `,{
// "aaa":"1",
// "bbb":"2",
// "ccc":"3",
// "ddd":"4",
// "eee":"5",
// "fff":"6",
// "ggg":"7",
// "hhh":"8"
// }))