import { TranslationServiceClient } from '@google-cloud/translate'; import path from 'path'; interface TranslationResult { originalText: string; translatedText: string; detectedLanguage?: string; confidence?: number; } class TranslationService { private client: TranslationServiceClient | null; private projectId: string; private location = 'global'; private isDev: boolean; constructor() { this.isDev = process.env.NODE_ENV === 'development'; this.projectId = process.env.GOOGLE_PROJECT_ID || ''; if (!this.isDev) { const credentials = require(path.join(__dirname, '../../google-credentials.json')); this.client = new TranslationServiceClient({ credentials, projectId: this.projectId, }); } else { this.client = null; } } async translateToEnglish(text: string): Promise { try { if (this.isDev) { // In development, just return the original text return { originalText: text, translatedText: text, detectedLanguage: 'en', confidence: 1.0, }; } const request = { parent: `projects/${this.projectId}/locations/${this.location}`, contents: [text], mimeType: 'text/plain', sourceLanguageCode: 'auto', targetLanguageCode: 'en', }; const [response] = await this.client!.translateText(request); const translation = response.translations?.[0]; if (!translation) { throw new Error('No translation returned'); } return { originalText: text, translatedText: translation.translatedText || text, detectedLanguage: translation.detectedLanguageCode || undefined, confidence: translation.model ? parseFloat(translation.model) : undefined, }; } catch (error) { console.error('Translation error:', error); // In case of error in development, return original text if (this.isDev) { return { originalText: text, translatedText: text, detectedLanguage: 'en', confidence: 1.0, }; } throw new Error('Failed to translate text'); } } async translateFromEnglish(text: string, targetLanguage: string): Promise { try { if (this.isDev) { // In development, just return the original text return { originalText: text, translatedText: text, }; } const request = { parent: `projects/${this.projectId}/locations/${this.location}`, contents: [text], mimeType: 'text/plain', sourceLanguageCode: 'en', targetLanguageCode: targetLanguage, }; const [response] = await this.client!.translateText(request); const translation = response.translations?.[0]; if (!translation) { throw new Error('No translation returned'); } return { originalText: text, translatedText: translation.translatedText || text, }; } catch (error) { console.error('Translation error:', error); // In case of error in development, return original text if (this.isDev) { return { originalText: text, translatedText: text, }; } throw new Error('Failed to translate text'); } } async detectLanguage(text: string): Promise<{ language: string; confidence: number; }> { try { if (this.isDev) { // In development, assume English return { language: 'en', confidence: 1.0, }; } const request = { parent: `projects/${this.projectId}/locations/${this.location}`, content: text, mimeType: 'text/plain', }; const [response] = await this.client!.detectLanguage(request); const detection = response.languages?.[0]; if (!detection || !detection.languageCode) { throw new Error('Language detection failed'); } return { language: detection.languageCode, confidence: detection.confidence || 0, }; } catch (error) { console.error('Language detection error:', error); // In case of error in development, assume English if (this.isDev) { return { language: 'en', confidence: 1.0, }; } throw new Error('Failed to detect language'); } } } export const translationService = new TranslationService();