import { Request, Response, NextFunction } from 'express';
import { languageService } from '../services/languageService';
declare global {
namespace Express {
interface Request {
sessionId?: string;
language?: {
code: string;
code3: string;
name: string;
confidence: number;
};
}
}
}
export const languageMiddleware = async (
req: Request,
res: Response,
next: NextFunction
) => {
try {
// Generate or get session ID from headers or cookies
const sessionId = req.headers['x-session-id'] as string ||
req.cookies?.sessionId ||
`session_${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
// Add session ID to request
req.sessionId = sessionId;
// Try to get language preference
const languagePreference = languageService.getLanguagePreference(sessionId);
if (languagePreference) {
req.language = languagePreference;
// Set response header for client reference
res.setHeader('X-Detected-Language', languagePreference.code);
return next();
}
// If no stored preference, try to detect from request
if (req.body?.text) {
// Detect from text in request body
const detected = await languageService.detectFromText(req.body.text, sessionId);
req.language = detected;
res.setHeader('X-Detected-Language', detected.code);
} else {
// Default to English if no text to detect from
req.language = {
code: 'en',
code3: 'eng',
name: 'English',
confidence: 1.0,
};
res.setHeader('X-Detected-Language', 'en');
}
// Set session ID header for client to store
res.setHeader('X-Session-ID', sessionId);
next();
} catch (error) {
console.error('Error in language middleware:', error);
// Don't fail the request on language detection error
next();
}
};