<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>多语言翻译 → SQL 生成器(并行加速版)</title>
<style> body { font-family: system-ui, -apple-system, BlinkMacSystemFont; background: #f4f6f8; padding: 30px; } .container { max-width: 900px; margin: auto; background: #fff; padding: 25px; border-radius: 10px; box-shadow: 0 6px 18px rgba(0,0,0,.08); } h2 { margin-top: 0; } label { font-weight: 600; margin-top: 12px; display: block; } input, textarea { width: 100%; padding: 8px; margin-top: 5px; border-radius: 6px; border: 1px solid #ccc; } textarea { height: 70px; } button { margin-top: 15px; padding: 10px 18px; border: none; background: #1677ff; color: #fff; font-size: 15px; border-radius: 6px; cursor: pointer; } button:disabled { background: #999; } .progress { margin-top: 15px; background: #eee; border-radius: 6px; overflow: hidden; height: 16px; display: none; } .progress-bar { height: 100%; width: 0%; background: linear-gradient(90deg, #1677ff, #69b1ff); transition: width .3s; } pre { margin-top: 20px; background: #0f172a; color: #e5e7eb; padding: 18px; border-radius: 8px; overflow-x: auto; } .small { color: #666; font-size: 13px; } </style> </head>
<body> <div class="container">
<h2>多语言文案 → INSERT SQL(并行翻译加速)</h2>
<label>lang_tag</label> <input id="lang_tag" value="lang_change_tag">
<label>type</label> <input id="type" value="1">
<label>zh_CN(源文案)</label> <textarea id="zh_CN"> 待替换的多语言 </textarea>
<button id="btn" onclick="generateSQL()">开始翻译并生成 SQL</button>
<div class="progress" id="progress"> <div class="progress-bar" id="progressBar"></div> </div>
<div class="small" id="status"></div>
<pre id="output"></pre>
</div>
<script> const langs = [ 'zh_CN','zh_HK','en','ja','ko','ar','fr','es','ru', 'de','pt','hi','vi','tl','th','tr','it','id' ];
const langMap = { zh_CN:'zh-CN', zh_HK:'zh-TW', en:'en', ja:'ja', ko:'ko', ar:'ar', fr:'fr', es:'es', ru:'ru', de:'de', pt:'pt', hi:'hi', vi:'vi', tl:'tl', th:'th', tr:'tr', it:'it', id:'id' };
const esc = s => s.replace(/\\/g,'\\\\').replace(/'/g,"''").replace(/\n/g,'\\n');
const protect = t => t.replace(/%s/g,'__VAR__'); const restore = t => t.replace(/__VAR__/g,'%s');
async function translate(text, lang, onDone) { if (lang === 'zh_CN') { onDone(); return text; }
const url = 'https://translate.googleapis.com/translate_a/single' + '?client=gtx&sl=zh-CN&tl=' + langMap[lang] + '&dt=t&q=' + encodeURIComponent(protect(text));
const res = await fetch(url); const json = await res.json(); onDone(); return restore(json[0].map(i => i[0]).join('')); }
async function generateSQL() { const btn = document.getElementById('btn'); const progress = document.getElementById('progress'); const bar = document.getElementById('progressBar'); const status = document.getElementById('status');
btn.disabled = true; progress.style.display = 'block'; bar.style.width = '0%'; status.textContent = '翻译中...';
let done = 0; const total = langs.length;
const tick = () => { done++; bar.style.width = Math.round(done / total * 100) + '%'; status.textContent = `翻译进度:${done}/${total}`; };
const zh_CN = document.getElementById('zh_CN').value;
// ⭐ 并行请求 const results = await Promise.all( langs.map(l => translate(zh_CN, l, tick)) );
const sql = `INSERT INTO static_lang ( lang_tag, \`type\`, ${langs.join(', ')} ) VALUES ( '${document.getElementById('lang_tag').value}', ${document.getElementById('type').value}, ${results.map(t => `'${esc(t)}'`).join(',\n')} );`;
document.getElementById('output').textContent = sql; status.textContent = '完成 ✅'; btn.disabled = false; } </script>
</body> </html>
|