this repo has no description
at main 108 lines 3.1 kB view raw
1const supportsLanguageDetector = 'LanguageDetector' in self; 2export const supportsBrowserTranslator = 3 supportsLanguageDetector && 'Translator' in self; 4 5// https://developer.chrome.com/docs/ai/language-detection 6export let langDetector; 7if (supportsLanguageDetector) { 8 (async () => { 9 try { 10 const availability = await LanguageDetector.availability(); 11 if (availability === 'unavailable') { 12 // The language detector isn't usable. 13 return; 14 } 15 if (availability === 'available') { 16 // The language detector can immediately be used. 17 langDetector = await LanguageDetector.create(); 18 } else { 19 // The language detector can be used after model download. 20 langDetector = await LanguageDetector.create({ 21 monitor(m) { 22 m.addEventListener('downloadprogress', (e) => { 23 console.log(`Detector: Downloaded ${e.loaded * 100}%`); 24 }); 25 }, 26 }); 27 await langDetector.ready; 28 } 29 } catch (e) { 30 console.error(e); 31 } 32 })(); 33} 34 35// https://developer.chrome.com/docs/ai/translator-api 36export const translate = async (text, source, target) => { 37 let detectedSourceLanguage; 38 const originalSource = source; 39 if (source === 'auto') { 40 if (!langDetector?.detect) { 41 return { 42 error: 'No language detector', 43 }; 44 } 45 try { 46 const results = await langDetector.detect(text); 47 source = results[0].detectedLanguage; 48 detectedSourceLanguage = source; 49 } catch (e) { 50 console.warn(e); 51 return { 52 error: e, 53 }; 54 } 55 } 56 const groupLabel = `💬 BROWSER TRANSLATE ${text}`; 57 console.groupCollapsed(groupLabel); 58 console.log(originalSource, detectedSourceLanguage, target); 59 try { 60 const translatorCapabilities = await Translator.availability({ 61 sourceLanguage: source, 62 targetLanguage: target, 63 }); 64 // Note: Translator.availability() returns 'unavailable', 'downloadable', 'downloading', or 'available'. 65 if (translatorCapabilities === 'unavailable') { 66 console.groupEnd(groupLabel); 67 return { 68 error: `Unsupported language pair: ${source} -> ${target}`, 69 }; 70 } 71 let translator; 72 if (translatorCapabilities === 'available') { 73 translator = await Translator.create({ 74 sourceLanguage: source, 75 targetLanguage: target, 76 }); 77 } else { 78 translator = await Translator.create({ 79 sourceLanguage: source, 80 targetLanguage: target, 81 monitor(m) { 82 m.addEventListener('downloadprogress', (e) => { 83 console.log( 84 `Translate ${source} -> ${target}: Downloaded ${e.loaded * 100}%`, 85 ); 86 }); 87 }, 88 }); 89 await translator.ready; 90 } 91 92 const content = await translator.translate(text); 93 console.log(content); 94 console.groupEnd(groupLabel); 95 96 return { 97 content, 98 detectedSourceLanguage, 99 provider: 'browser', 100 }; 101 } catch (e) { 102 console.groupEnd(groupLabel); 103 console.error(e); 104 return { 105 error: e, 106 }; 107 } 108};