forked from akai/readest
52 lines
1.7 KiB
TypeScript
52 lines
1.7 KiB
TypeScript
import { stubTranslation as _ } from '@/utils/misc';
|
|
import { fetch as tauriFetch } from '@tauri-apps/plugin-http';
|
|
import { isTauriAppPlatform } from '@/services/environment';
|
|
import { TranslationProvider } from '../types';
|
|
|
|
export const googleProvider: TranslationProvider = {
|
|
name: 'google',
|
|
label: _('Google Translate'),
|
|
translate: async (text: string[], sourceLang: string, targetLang: string): Promise<string[]> => {
|
|
if (!text.length) return [];
|
|
|
|
const results: string[] = [];
|
|
|
|
const translationPromises = text.map(async (line, index) => {
|
|
if (!line?.trim().length) {
|
|
results[index] = line;
|
|
return;
|
|
}
|
|
|
|
const url = new URL('https://translate.googleapis.com/translate_a/single');
|
|
url.searchParams.append('client', 'gtx');
|
|
url.searchParams.append('dt', 't');
|
|
url.searchParams.append('sl', sourceLang.toLowerCase() || 'auto');
|
|
url.searchParams.append('tl', targetLang.toLowerCase());
|
|
url.searchParams.append('q', line);
|
|
|
|
const fetch = isTauriAppPlatform() ? tauriFetch : window.fetch;
|
|
const response = await fetch(url.toString());
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`Translation failed with status ${response.status}`);
|
|
}
|
|
|
|
const data = await response.json();
|
|
if (Array.isArray(data) && Array.isArray(data[0])) {
|
|
const translatedText = data[0]
|
|
.filter((segment) => Array.isArray(segment) && segment[0])
|
|
.map((segment) => segment[0])
|
|
.join('');
|
|
|
|
results[index] = translatedText || line;
|
|
} else {
|
|
results[index] = line;
|
|
}
|
|
});
|
|
|
|
await Promise.all(translationPromises);
|
|
|
|
return results;
|
|
},
|
|
};
|