import re path = r"D:\0.daima\lucky_shop\components-diy\diy-recommend-code.vue" with open(path, "r", encoding="utf-8") as f: s = f.read() BASE = "components-diy.diy-recommend-code." # ---- 1. value.xxx || '中文' / nc.xxx || '中文' ---- TEXT_FIELDS = { 'title','buttonText','copyButtonText','consentText','consentButtonText', 'loginTipText','loginBtnText','posterQrTip','placeholderRegenerateText', } def repl_value_nc(m): prefix = m.group(1) # e.g. "value.title || " field = m.group(2) if field in TEXT_FIELDS: return prefix + "$lang('" + BASE + field + "')" return m.group(0) s = re.sub(r"((?:value|nc)\.(\w+)\s*\|\|\s*)'([^']*)'", repl_value_nc, s) # ---- 2. standalone template text nodes ---- standalone = { '\u4e13\u5c5e\u63a8\u8350\u7801': 'exclusiveCode', '\u5f85\u83b7\u53d6\u63a8\u8350\u7801': 'pendingCode', '\u5f85\u83b7\u53d6': 'pending', '\u63a8\u8350\u7801\u52a0\u8f7d\u4e2d...': 'loading', '\u5df2\u83b7\u5f97\u63a8\u8350\u7801': 'obtainedCode', '\u5df2\u83b7\u5f97': 'obtained', '\u5206\u4eab\u7ed9\u597d\u53cb\uff0c\u9080\u8bf7\u6ce8\u518c\u5373\u53ef\u83b7\u5f97\u5956\u52b1': 'shareInviteReward', '\u2713 \u5df2\u751f\u6548': 'activated', '\u63a8\u8350\u7801\u5df2\u751f\u6210\uff0c\u53ef\u7528\u4e8e\u9080\u8bf7\u597d\u53cb\u6216\u4f01\u4e1a\u5165\u9a7b\u7ed1\u5b9a\u63a8\u8350\u5173\u7cfb': 'codeGenerated', } for zh, key in standalone.items(): s = s.replace(">%s" % zh, ">{{ $lang('%s%s') }}" % (BASE, key)) # ---- 3. '提交中...' standalone in template ternary ---- s = s.replace("'\u63d0\u4ea4\u4e2d...'", "$lang('%ssubmitting')" % BASE) # ---- 4. default() Chinese literals -> '' ---- default_map = { "title: '\u6211\u7684\u63a8\u8350\u7801'": "title: ''", "buttonText: '\u7acb\u5373\u5206\u4eab'": "buttonText: ''", "copyButtonText: '\u590d\u5236\u63a8\u8350\u7801'": "copyButtonText: ''", "placeholderRegenerateText: '\u6362\u4e00\u4e2a\u65b0\u7801'": "placeholderRegenerateText: ''", "consentText: '\u60a8\u7684\u63a8\u8350\u7801\u5c06\u7528\u4e8e\u4f01\u4e1a\u5165\u9a7b\u6765\u6e90\u8ffd\u8e2a\uff0c\u6211\u4eec\u4f1a\u8bb0\u5f55\u6bcf\u4e00\u6b21\u901a\u8fc7\u60a8\u5206\u4eab\u94fe\u63a5\u5b8c\u6210\u7684\u5165\u9a7b\u7533\u8bf7\uff0c\u7528\u4e8e\u60a8\u7684\u63a8\u5e7f\u6536\u76ca\u7ed3\u7b97\u3002'": "consentText: ''", "consentButtonText: '\u540c\u610f\u5e76\u83b7\u53d6\u63a8\u8350\u7801'": "consentButtonText: ''", "loginTipText: '\u767b\u5f55\u540e\u67e5\u770b\u6211\u7684\u63a8\u8350\u7801'": "loginTipText: ''", "loginBtnText: '\u53bb\u767b\u5f55'": "loginBtnText: ''", "posterQrTip: '\u626b\u7801\u8fdb\u5165\u5e76\u586b\u5199\u5165\u9a7b\u4fe1\u606f'": "posterQrTip: ''", } for a, b in default_map.items(): s = s.replace(a, b) # ---- 5. JS user-facing strings ---- # rcCopyToClipboard util (uses vm.$lang) s = s.replace("cb && cb(false, '\u5185\u5bb9\u4e3a\u7a7a')", "cb && cb(false, vm.$lang('%scopyEmpty'))" % BASE) s = s.replace("fail: () => cb && cb(false, '\u590d\u5236\u5931\u8d25')", "fail: () => cb && cb(false, vm.$lang('%scopyFail'))" % BASE) s = s.replace("cb && cb(ok ? true : false, ok ? null : '\u590d\u5236\u5931\u8d25')", "cb && cb(ok ? true : false, ok ? null : vm.$lang('%scopyFail'))" % BASE) s = s.replace("cb && cb(false, '\u590d\u5236\u5931\u8d25')", "cb && cb(false, vm.$lang('%scopyFail'))" % BASE) # getFail / getFailCode / getSuccess / netError s = s.replace("var lastMsg = '\u63a8\u8350\u7801\u83b7\u53d6\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5';", "var lastMsg = this.$lang('%sgetFail');" % BASE) s = s.replace("('\u63a8\u8350\u7801\u83b7\u53d6\u5931\u8d25(\u4e1a\u52a1\u7801=' + unpacked.businessCode + ')')", "this.$lang('%sgetFailCode', { code: unpacked.businessCode })" % BASE) s = s.replace("uni.showToast({ title: '\u83b7\u53d6\u6210\u529f', icon: 'success' })", "uni.showToast({ title: this.$lang('%sgetSuccess'), icon: 'success' })" % BASE) s = s.replace("'\u7f51\u7edc\u5f02\u5e38\uff1a' + failMsg.slice(0, 30)", "this.$lang('%snetError')" % BASE) s = s.replace("'\u7f51\u7edc\u5f02\u5e38\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5'", "this.$lang('%snetError')" % BASE) # regen modal s = s.replace("title: '\u6362\u65b0\u7801',", "title: this.$lang('%sregenTitle')," % BASE) s = s.replace("content: '\u6362\u65b0\u7801\u540e\u65e7\u7801\u4f1a\u7acb\u5373\u5931\u6548\uff0c\u540e\u7eed\u6240\u6709\u4f7f\u7528\u65e7\u5206\u4eab\u94fe\u63a5\u7684\u5165\u9a7b\u7533\u8bf7\u90fd\u4e0d\u4f1a\u5f52\u5c5e\u5230\u60a8\uff0c\u786e\u8ba4\u7ee7\u7eed\uff1f',", "content: this.$lang('%sregenContent')," % BASE) s = s.replace("confirmText: '\u786e\u8ba4\u6362\u65b0',", "confirmText: this.$lang('%sregenConfirm')," % BASE) s = s.replace("cancelText: '\u53d6\u6d88',", "cancelText: this.$lang('%sregenCancel')," % BASE) s = s.replace("title: unpacked.msg ? String(unpacked.msg) : '\u6362\u65b0\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5',", "title: unpacked.msg ? String(unpacked.msg) : this.$lang('%sregenFail')," % BASE) s = s.replace("title: old ? ('\u5df2\u6362\u65b0\u7801\uff0c\u65e7\u7801 ' + old + ' \u5df2\u505c\u7528') : '\u6362\u65b0\u6210\u529f',", "title: old ? this.$lang('%sregenSuccessOld', { old: old }) : this.$lang('%sregenSuccess')," % (BASE, BASE)) s = s.replace("uni.showToast({ title: '\u7f51\u7edc\u5f02\u5e38\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5', icon: 'none' })", "uni.showToast({ title: this.$lang('%snetError'), icon: 'none' })" % BASE) # share title (L1128 specific) then global for the rest s = s.replace("(vm.nc && (vm.nc.shareTitle || vm.nc.title)) || '\u9080\u60a8\u5165\u9a7b\u4f4e\u7a7a\u7ecf\u6d4e\u4ea7\u4e1a\u5e73\u53f0'", "(vm.nc && (vm.nc.shareTitle || vm.nc.title)) || this.$lang('%sshareTitle')" % BASE) s = s.replace("'\u9080\u60a8\u5165\u9a7b\u4f4e\u7a7a\u7ecf\u6d4e\u4ea7\u4e1a\u5e73\u53f0'", "this.$lang('%sshareTitle')" % BASE) # copy / link toasts s = s.replace("title: ok ? '\u63a8\u8350\u7801\u5df2\u590d\u5236' : (err || '\u590d\u5236\u5931\u8d25')", "title: ok ? this.$lang('%scodeCopied') : (err || this.$lang('%scopyFail'))" % (BASE, BASE)) s = s.replace("uni.showToast({ title: '\u63a8\u8350\u7801\u8fd8\u672a\u751f\u6210\uff0c\u8bf7\u7a0d\u5019', icon: 'none' })", "uni.showToast({ title: this.$lang('%scodeNotReady'), icon: 'none' })" % BASE) s = s.replace("uni.showToast({ title: '\u63a8\u8350\u7801\u52a0\u8f7d\u5b8c\u6210\u540e\u518d\u590d\u5236', icon: 'none' })", "uni.showToast({ title: this.$lang('%sloadThenCopy'), icon: 'none' })" % BASE) s = s.replace("title: ok ? '\u63a8\u5e7f\u94fe\u63a5\u5df2\u590d\u5236' : (err || '\u590d\u5236\u5931\u8d25')", "title: ok ? this.$lang('%slinkCopied') : (err || this.$lang('%scopyFail'))" % (BASE, BASE)) # poster title + canvas s = s.replace("const title = v.title || '\u6211\u7684\u63a8\u8350\u7801';", "const title = v.title || this.$lang('%stitle');" % BASE) s = s.replace("ctx.fillText('\u5206\u4eab\u7ed9\u597d\u53cb,\u9080\u8bf7\u5165\u9a7b\u83b7\u5f97\u5956\u52b1', 24, 70);", "ctx.fillText(this.$lang('%sposterShareInvite'), 24, 70);" % BASE) s = s.replace("ctx.fillText('\u94fe\u63a5:' + (linkText || '(\u672a\u751f\u6210)'), 24, urlY);", "ctx.fillText(this.$lang('%sposterLinkPrefix') + (linkText || this.$lang('%sposterLinkEmpty')), 24, urlY);" % (BASE, BASE)) s = s.replace("ctx.fillText(v.posterQrTip || '\u626b\u7801\u8fdb\u5165\u5e76\u586b\u5199\u5165\u9a7b\u4fe1\u606f', W / 2, qrY + qrSize + 24);", "ctx.fillText(v.posterQrTip || this.$lang('%sposterQrTip'), W / 2, qrY + qrSize + 24);" % BASE) with open(path, "w", encoding="utf-8") as f: f.write(s) print("done")