feat: 增加中译西辅助、在线翻译、B1词库与三语语音对照

This commit is contained in:
guoqingshan
2026-08-01 17:13:05 +08:00
parent 0d5b0919da
commit a2e705aa30
9 changed files with 1530 additions and 1 deletions
+295 -1
View File
@@ -127,7 +127,7 @@ const MOCK_TRANSLATIONS = {
'estar bien': { en: 'be fine', zh: '没问题' }
};
const SORTED_KEYS = Object.keys(MOCK_TRANSLATIONS).sort(function(a, b) {
var SORTED_KEYS = Object.keys(MOCK_TRANSLATIONS).sort(function(a, b) {
return b.length - a.length;
});
@@ -197,3 +197,297 @@ function getVocabForWord(word) {
var entry = MOCK_TRANSLATIONS[w];
return entry || null;
}
// Chinese -> Spanish helper dictionary
const ZH_TO_ES = {
'你好': 'Hola',
'早上好': 'Buenos días',
'下午好': 'Buenas tardes',
'晚上好': 'Buenas noches',
'晚安': 'Buenas noches',
'再见': 'Adiós',
'谢谢': 'Gracias',
'请': 'Por favor',
'对不起': 'Lo siento',
'很高兴认识你': 'Mucho gusto',
'祝你好运': 'Buena suerte',
'是的': 'Sí',
'不是': 'No',
'今天': 'Hoy',
'昨天': 'Ayer',
'明天': 'Mañana',
'现在': 'ahora',
'已经': 'ya',
'总是': 'siempre',
'从不': 'nunca',
'我': 'yo',
'你': 'tú',
'他': 'él',
'她': 'ella',
'我们': 'nosotros',
'你们': 'vosotros',
'他们': 'ellos',
'我的': 'mi',
'你的': 'tu',
'和': 'y',
'或者': 'o',
'但是': 'pero',
'因为': 'porque',
'也': 'también',
'非常': 'muy',
'很': 'muy',
'一点': 'un poco',
'很多': 'mucho',
'好的': 'bien',
'朋友': 'amigo',
'家': 'casa',
'学校': 'escuela',
'工作': 'trabajo',
'公园': 'parque',
'餐厅': 'restaurante',
'图书馆': 'biblioteca',
'超市': 'supermercado',
'医院': 'hospital',
'书': 'libro',
'篮球': 'baloncesto',
'足球': 'fútbol',
'羽毛球': 'bádminton',
'游泳': 'nadar',
'跑步': 'correr',
'咖啡': 'café',
'茶': 'té',
'水': 'agua',
'电影': 'película',
'音乐': 'música',
'天气': 'tiempo',
'时间': 'tiempo',
'星期一': 'lunes',
'星期二': 'martes',
'星期三': 'miércoles',
'星期四': 'jueves',
'星期五': 'viernes',
'星期六': 'sábado',
'星期日': 'domingo',
'一月': 'enero',
'二月': 'febrero',
'三月': 'marzo',
'四月': 'abril',
'五月': 'mayo',
'六月': 'junio',
'七月': 'julio',
'八月': 'agosto',
'九月': 'septiembre',
'十月': 'octubre',
'十一月': 'noviembre',
'十二月': 'diciembre',
'去': 'ir',
'我去了': 'fui',
'我去': 'voy',
'我要': 'voy a',
'我想': 'quiero',
'我想要': 'quiero',
'我有': 'tengo',
'我学习': 'estudio',
'我学习了': 'estudié',
'我读书': 'leo',
'我读了一本书': 'leí un libro',
'我吃饭': 'como',
'我吃了': 'comí',
'我喝水': 'bebo agua',
'我喝了': 'bebí',
'我喜欢': 'me gusta',
'我爱': 'me encanta',
'我累了': 'Estoy cansado',
'我很累': 'Estoy muy cansado',
'我很开心': 'Estoy muy feliz',
'我生病了': 'Estoy enfermo',
'我正在学习': 'Estoy estudiando',
'我必须工作': 'Tengo que trabajar',
'我喜欢读书': 'Me gusta leer',
'我喜欢听音乐': 'Me gusta escuchar música',
'我想去旅行': 'Quiero viajar',
'我有一个朋友': 'Tengo un amigo',
'我没有钱': 'No tengo dinero',
'今天我去公园': 'Hoy fui al parque',
'今天我去学校': 'Hoy fui a la escuela',
'今天我去工作': 'Hoy fui al trabajo',
'昨天我去了公园': 'Ayer fui al parque',
'明天我要去公园': 'Mañana voy al parque',
'我和朋友去了公园': 'Fui al parque con mi amigo',
'今天我和朋友去了公园': 'Hoy fui al parque con mi amigo',
'今天天气很好': 'Hoy hace buen tiempo',
'今天天气热': 'Hoy hace calor',
'今天天气冷': 'Hoy hace frío',
'我学习西班牙语': 'Estudio español',
'我喜欢篮球': 'Me gusta el baloncesto',
'我喜欢足球': 'Me gusta el fútbol',
'我喜欢游泳': 'Me gusta nadar',
'我喜欢跑步': 'Me gusta correr',
'我喜欢打篮球': 'Me gusta jugar al baloncesto',
'我喜欢打足球': 'Me gusta jugar al fútbol',
'打篮球': 'jugar al baloncesto',
'打足球': 'jugar al fútbol',
'我喜欢篮球今天天气真好': 'Me gusta el baloncesto. Hoy hace muy buen tiempo.',
'我喜欢篮球今天天气很好': 'Me gusta el baloncesto. Hoy hace buen tiempo.',
'我要去打篮球': 'Voy a jugar al baloncesto',
'我要去打篮球了': 'Voy a jugar al baloncesto',
'我去打篮球': 'Voy a jugar al baloncesto',
'我去打篮球了': 'Fui a jugar al baloncesto',
'我要去踢足球': 'Voy a jugar al fútbol',
'我要去踢足球了': 'Voy a jugar al fútbol',
'我要去游泳': 'Voy a nadar',
'我要去游泳了': 'Voy a nadar',
'我去游泳了': 'Fui a nadar',
'我要去跑步': 'Voy a correr',
'我要去跑步了': 'Voy a correr',
'我去跑步了': 'Fui a correr',
'我要去图书馆': 'Voy a la biblioteca',
'我去图书馆了': 'Fui a la biblioteca',
'我要去学校': 'Voy a la escuela',
'我去学校了': 'Fui a la escuela',
'我要去工作': 'Voy al trabajo',
'我去工作了': 'Fui al trabajo',
'我想去公园': 'Quiero ir al parque',
'我想去学校': 'Quiero ir a la escuela',
'我想去图书馆': 'Quiero ir a la biblioteca',
'我想去工作': 'Quiero ir al trabajo',
'去公园': 'ir al parque',
'去学校': 'ir a la escuela',
'去图书馆': 'ir a la biblioteca',
'去工作': 'ir al trabajo',
'今天天气很好': 'Hoy hace buen tiempo',
'今天天气真好': 'Hoy hace muy buen tiempo',
'今天天气非常好': 'Hoy hace muy buen tiempo',
'天气很好': 'hace buen tiempo',
'天气真好': 'hace muy buen tiempo',
'真好': 'muy bien',
'很好': 'muy bien',
'今天我去公园和我的朋友': 'Hoy fui al parque con mi amigo',
'我去了公园和我的朋友': 'Fui al parque con mi amigo',
'公园和我的朋友': 'el parque con mi amigo',
'公园': 'el parque',
'我的朋友': 'mi amigo',
'妈妈': 'mamá',
'爸爸': 'papá',
'爷爷': 'abuelo',
'奶奶': 'abuela',
'外公': 'abuelo',
'外婆': 'abuela',
'哥哥': 'hermano mayor',
'姐姐': 'hermana mayor',
'弟弟': 'hermano menor',
'妹妹': 'hermana menor',
'儿子': 'hijo',
'女儿': 'hija',
'丈夫': 'marido',
'妻子': 'esposa',
'男朋友': 'novio',
'女朋友': 'novia',
'同事': 'colega',
'邻居': 'vecino',
'为什么': 'por qué',
'什么': 'qué',
'哪里': 'dónde',
'什么时候': 'cuándo',
'多少': 'cuánto',
'谁': 'quién',
'怎么': 'cómo',
'星期': 'semana',
};
var ZH_SORTED_KEYS = Object.keys(ZH_TO_ES).sort(function(a, b) {
return b.length - a.length;
});
function translateZhSegment(segment) {
if (!segment || !segment.trim()) return '';
var input = segment.replace(/[\s,。!?、,.!?;;::""''()()]/g, '');
var result = '';
var matched = false;
var i = 0;
while (i < input.length) {
var found = false;
for (var k = 0; k < ZH_SORTED_KEYS.length; k++) {
var key = ZH_SORTED_KEYS[k];
if (input.indexOf(key, i) === i) {
result += ZH_TO_ES[key] + ' ';
i += key.length;
matched = true;
found = true;
break;
}
}
if (!found) i++;
}
return matched ? result.trim() : '';
}
function translateZhToEs(text) {
if (!text || !text.trim()) return '';
var clauses = [];
var seps = [];
var cur = '';
for (var i = 0; i < text.length; i++) {
var ch = text[i];
if (ch === '。' || ch === '!' || ch === '?' || ch === '!' || ch === '?' || ch === ';' || ch === ';') {
clauses.push(cur.trim());
seps.push('.');
cur = '';
} else if (ch === ',' || ch === ',') {
clauses.push(cur.trim());
seps.push(',');
cur = '';
} else {
cur += ch;
}
}
clauses.push(cur.trim());
seps.push('');
var parts = [];
for (var j = 0; j < clauses.length; j++) {
if (!clauses[j]) continue;
var translated = translateZhSegment(clauses[j]);
if (translated) {
parts.push(translated.replace(/[.。]+$/g, ''));
}
}
if (parts.length === 0) return '';
function capitalizeFirst(s) {
return s.charAt(0).toUpperCase() + s.slice(1);
}
function lowercaseFirst(s) {
return s.charAt(0).toLowerCase() + s.slice(1);
}
var out = capitalizeFirst(parts[0]);
var k = 1;
for (var m = 0; m < seps.length && k < parts.length; m++) {
if (seps[m] && k < parts.length) {
out += (seps[m] === ',' ? ', ' + lowercaseFirst(parts[k]) : '. ' + capitalizeFirst(parts[k]));
k++;
}
}
while (k < parts.length) {
out += '. ' + capitalizeFirst(parts[k]);
k++;
}
if (!/[.!?]$/.test(out)) out += '.';
return out;
}
// Merge B1 vocabulary into translation dictionaries
if (typeof B1_VOCAB !== 'undefined') {
B1_VOCAB.forEach(function(item) {
var es = item[0].toLowerCase();
MOCK_TRANSLATIONS[es] = { en: item[1], zh: item[2] };
if (item[2]) ZH_TO_ES[item[2]] = item[0];
});
SORTED_KEYS = Object.keys(MOCK_TRANSLATIONS).sort(function(a, b) {
return b.length - a.length;
});
ZH_SORTED_KEYS = Object.keys(ZH_TO_ES).sort(function(a, b) {
return b.length - a.length;
});
}