this repo has no description
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};