200 lines
7.3 KiB
JavaScript
200 lines
7.3 KiB
JavaScript
const MOCK_TRANSLATIONS = {
|
|
'hola': { en: 'Hello', zh: '你好' },
|
|
'buenos días': { en: 'Good morning', zh: '早上好' },
|
|
'buenas tardes': { en: 'Good afternoon', zh: '下午好' },
|
|
'buenas noches': { en: 'Good night', zh: '晚安' },
|
|
'hoy': { en: 'today', zh: '今天' },
|
|
'ayer': { en: 'yesterday', zh: '昨天' },
|
|
'mañana': { en: 'tomorrow', zh: '明天' },
|
|
'fui': { en: 'I went', zh: '我去了' },
|
|
'fui a': { en: 'I went to', zh: '我去了' },
|
|
'voy': { en: 'I go', zh: '我去' },
|
|
'voy a': { en: 'I am going to', zh: '我要去' },
|
|
'estoy': { en: 'I am', zh: '我是' },
|
|
'estoy muy': { en: 'I am very', zh: '我非常' },
|
|
'tengo': { en: 'I have', zh: '我有' },
|
|
'quiero': { en: 'I want', zh: '我想要' },
|
|
'me gusta': { en: 'I like', zh: '我喜欢' },
|
|
'me gustó': { en: 'I liked', zh: '我喜欢了' },
|
|
'aprendí': { en: 'I learned', zh: '我学了' },
|
|
'estudié': { en: 'I studied', zh: '我学习了' },
|
|
'comí': { en: 'I ate', zh: '我吃了' },
|
|
'bebí': { en: 'I drank', zh: '我喝了' },
|
|
'leí': { en: 'I read', zh: '我读了' },
|
|
'escribí': { en: 'I wrote', zh: '我写了' },
|
|
'trabajé': { en: 'I worked', zh: '我工作了' },
|
|
'descansé': { en: 'I rested', zh: '我休息了' },
|
|
'caminé': { en: 'I walked', zh: '我散步了' },
|
|
'corrí': { en: 'I ran', zh: '我跑步了' },
|
|
'compré': { en: 'I bought', zh: '我买了' },
|
|
'vi': { en: 'I saw', zh: '我看了' },
|
|
'el': { en: 'the', zh: '' },
|
|
'la': { en: 'the', zh: '' },
|
|
'los': { en: 'the', zh: '' },
|
|
'las': { en: 'the', zh: '' },
|
|
'un': { en: 'a', zh: '' },
|
|
'una': { en: 'a', zh: '' },
|
|
'unos': { en: 'some', zh: '一些' },
|
|
'unas': { en: 'some', zh: '一些' },
|
|
'al': { en: 'to the', zh: '' },
|
|
'del': { en: 'of the', zh: '' },
|
|
'a': { en: 'to', zh: '' },
|
|
'de': { en: 'of', zh: '' },
|
|
'en': { en: 'in', zh: '在' },
|
|
'para': { en: 'for', zh: '为了' },
|
|
'por': { en: 'for / by', zh: '' },
|
|
'con': { en: 'with', zh: '和' },
|
|
'sin': { en: 'without', zh: '没有' },
|
|
'sobre': { en: 'about', zh: '关于' },
|
|
'mi': { en: 'my', zh: '我的' },
|
|
'tu': { en: 'your', zh: '你的' },
|
|
'su': { en: 'his / her / their', zh: '' },
|
|
'nuestro': { en: 'our', zh: '我们的' },
|
|
'amigo': { en: 'friend', zh: '朋友' },
|
|
'amiga': { en: 'friend', zh: '朋友' },
|
|
'familia': { en: 'family', zh: '家人' },
|
|
'casa': { en: 'home', zh: '家' },
|
|
'trabajo': { en: 'work', zh: '工作' },
|
|
'escuela': { en: 'school', zh: '学校' },
|
|
'parque': { en: 'park', zh: '公园' },
|
|
'restaurante': { en: 'restaurant', zh: '餐厅' },
|
|
'café': { en: 'cafe', zh: '咖啡馆' },
|
|
'libro': { en: 'book', zh: '书' },
|
|
'película': { en: 'movie', zh: '电影' },
|
|
'música': { en: 'music', zh: '音乐' },
|
|
'día': { en: 'day', zh: '天' },
|
|
'noche': { en: 'night', zh: '夜晚' },
|
|
'comida': { en: 'food', zh: '食物' },
|
|
'agua': { en: 'water', zh: '水' },
|
|
'tiempo': { en: 'time / weather', zh: '时间' },
|
|
'feliz': { en: 'happy', zh: '开心的' },
|
|
'cansado': { en: 'tired', zh: '累的' },
|
|
'enfermo': { en: 'sick', zh: '生病的' },
|
|
'bien': { en: 'well', zh: '好' },
|
|
'mal': { en: 'bad', zh: '不好' },
|
|
'muy': { en: 'very', zh: '非常' },
|
|
'un poco': { en: 'a little', zh: '一点' },
|
|
'mucho': { en: 'a lot', zh: '很多' },
|
|
'y': { en: 'and', zh: '和' },
|
|
'pero': { en: 'but', zh: '但是' },
|
|
'porque': { en: 'because', zh: '因为' },
|
|
'también': { en: 'also', zh: '也' },
|
|
'no': { en: 'not', zh: '不' },
|
|
'sí': { en: 'yes', zh: '是的' },
|
|
'gracias': { en: 'thank you', zh: '谢谢' },
|
|
'por favor': { en: 'please', zh: '请' },
|
|
'lo siento': { en: 'sorry', zh: '对不起' },
|
|
'nuevo': { en: 'new', zh: '新的' },
|
|
'viejo': { en: 'old', zh: '旧的' },
|
|
'grande': { en: 'big', zh: '大' },
|
|
'pequeño': { en: 'small', zh: '小' },
|
|
'bueno': { en: 'good', zh: '好的' },
|
|
'malo': { en: 'bad', zh: '坏的' },
|
|
'bonito': { en: 'pretty', zh: '漂亮的' },
|
|
'rápido': { en: 'fast', zh: '快的' },
|
|
'lento': { en: 'slow', zh: '慢的' },
|
|
'aquí': { en: 'here', zh: '这里' },
|
|
'allí': { en: 'there', zh: '那里' },
|
|
'ahora': { en: 'now', zh: '现在' },
|
|
'siempre': { en: 'always', zh: '总是' },
|
|
'nunca': { en: 'never', zh: '从不' },
|
|
'ya': { en: 'already', zh: '已经' },
|
|
'todavía': { en: 'still', zh: '仍然' },
|
|
'después': { en: 'after', zh: '之后' },
|
|
'antes': { en: 'before', zh: '之前' },
|
|
'más': { en: 'more', zh: '更多' },
|
|
'menos': { en: 'less', zh: '更少' },
|
|
'tan': { en: 'so', zh: '如此' },
|
|
'como': { en: 'as / like', zh: '像' },
|
|
'que': { en: 'that / than', zh: '比' },
|
|
'este': { en: 'this', zh: '这个' },
|
|
'ese': { en: 'that', zh: '那个' },
|
|
'qué': { en: 'what', zh: '什么' },
|
|
'quién': { en: 'who', zh: '谁' },
|
|
'cuándo': { en: 'when', zh: '什么时候' },
|
|
'dónde': { en: 'where', zh: '哪里' },
|
|
'por qué': { en: 'why', zh: '为什么' },
|
|
'cómo': { en: 'how', zh: '如何' },
|
|
'mucho gusto': { en: 'nice to meet you', zh: '很高兴认识你' },
|
|
'buena suerte': { en: 'good luck', zh: '好运' },
|
|
'tener que': { en: 'have to', zh: '必须' },
|
|
'tener hambre': { en: 'be hungry', zh: '饿了' },
|
|
'tener sed': { en: 'be thirsty', zh: '渴了' },
|
|
'tener sueño': { en: 'be sleepy', zh: '困了' },
|
|
'tener razón': { en: 'be right', zh: '是对的' },
|
|
'hacer calor': { en: 'be hot (weather)', zh: '热' },
|
|
'hacer frío': { en: 'be cold (weather)', zh: '冷' },
|
|
'estar bien': { en: 'be fine', zh: '没问题' }
|
|
};
|
|
|
|
const SORTED_KEYS = Object.keys(MOCK_TRANSLATIONS).sort(function(a, b) {
|
|
return b.length - a.length;
|
|
});
|
|
|
|
function translateText(text) {
|
|
if (!text || !text.trim()) return { english: '', chinese: '' };
|
|
var lower = text.toLowerCase().trim();
|
|
var enParts = [];
|
|
var zhParts = [];
|
|
var i = 0;
|
|
while (i < lower.length) {
|
|
var matched = false;
|
|
for (var k = 0; k < SORTED_KEYS.length; k++) {
|
|
var key = SORTED_KEYS[k];
|
|
if (lower.indexOf(key, i) === i) {
|
|
var entry = MOCK_TRANSLATIONS[key];
|
|
if (entry.en) enParts.push(entry.en);
|
|
if (entry.zh) zhParts.push(entry.zh);
|
|
i += key.length;
|
|
matched = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!matched) {
|
|
var ch = lower[i];
|
|
if (/[a-zà-ÿñ]/.test(ch)) { enParts.push(ch); }
|
|
i++;
|
|
}
|
|
}
|
|
var enStr = enParts.join(' ').replace(/\s+/g, ' ').trim();
|
|
var zhStr = zhParts.join('').trim();
|
|
enStr = enStr.charAt(0).toUpperCase() + enStr.slice(1);
|
|
return { english: enStr || text, chinese: zhStr || text };
|
|
}
|
|
|
|
function getVocabulary(text) {
|
|
if (!text || !text.trim()) return [];
|
|
var lower = text.toLowerCase().trim();
|
|
var seen = {};
|
|
var result = [];
|
|
var i = 0;
|
|
while (i < lower.length) {
|
|
for (var k = 0; k < SORTED_KEYS.length; k++) {
|
|
var key = SORTED_KEYS[k];
|
|
if (lower.indexOf(key, i) === i) {
|
|
var entry = MOCK_TRANSLATIONS[key];
|
|
if (!seen[key] && entry.zh && key.indexOf(' ') === -1) {
|
|
seen[key] = true;
|
|
result.push({ word: key, english: entry.en, chinese: entry.zh });
|
|
}
|
|
i += key.length;
|
|
break;
|
|
}
|
|
}
|
|
i++;
|
|
}
|
|
result.sort(function(a, b) { return b.word.length - a.word.length; });
|
|
return result;
|
|
}
|
|
|
|
function translateSelection(text) {
|
|
if (!text || !text.trim()) return { english: '', chinese: '' };
|
|
return translateText(text);
|
|
}
|
|
|
|
function getVocabForWord(word) {
|
|
var w = word.toLowerCase().trim();
|
|
var entry = MOCK_TRANSLATIONS[w];
|
|
return entry || null;
|
|
}
|