import { Request } from "express"; import { ErrorCode, ErrorResponse } from "../types/errorCodes"; type Language = "RU" | "EN"; interface Translations { [key: string]: { EN: string; RU: string; }; } const translations: Translations = { // General errors INTERNAL_ERROR: { EN: "Internal server error", RU: "Внутренняя ошибка сервера", }, // Active Session errors INVALID_OBJECT_ID: { EN: "Invalid ObjectId", RU: "Неверный идентификатор объекта", }, SESSION_NOT_FOUND: { EN: "Session not found", RU: "Сессия не найдена", }, SESSION_FETCH_ERROR: { EN: "Error fetching session", RU: "Ошибка получения сессии", }, // Country Code errors IP_ADDRESS_ERROR: { EN: "An error occurred while obtaining an IP address", RU: "Произошла ошибка при получении IP-адреса", }, COUNTRY_CODE_FETCH_ERROR: { EN: "Error fetching country code", RU: "Ошибка получения кода страны", }, // Email/Invite errors EMAIL_REQUIRED: { EN: "Email is required", RU: "Требуется адрес электронной почты", }, LINK_REQUIRED: { EN: "Link is required", RU: "Требуется ссылка", }, EMAIL_SEND_ERROR: { EN: "Error sending email", RU: "Ошибка отправки письма", }, EMAIL_SENT_SUCCESS: { EN: "Invitation sent successfully", RU: "Приглашение успешно отправлено", }, }; /** * Получает язык из заголовка X-User-Region * @param req - Express Request объект * @returns Код языка (EN или RU) */ export function getLanguageFromRequest(req: Request): Language { const region = req.headers["x-user-region"] as string; // Поддерживаемые русскоязычные регионы const russianRegions = ["RU", "BY", "KZ", "UA"]; if (region && russianRegions.includes(region.toUpperCase())) { return "RU"; } return "EN"; } /** * Получает переведенное сообщение * @param key - Ключ сообщения из translations * @param req - Express Request объект * @returns Переведенное сообщение */ export function t(key: string, req: Request): string { const lang = getLanguageFromRequest(req); if (translations[key]) { return translations[key][lang]; } // Возвращаем ключ, если перевод не найден return key; } /** * Получает переведенное сообщение для конкретного языка * @param key - Ключ сообщения из translations * @param lang - Код языка * @returns Переведенное сообщение */ export function tLang(key: string, lang: Language = "EN"): string { if (translations[key]) { return translations[key][lang]; } return key; } /** * Создает объект ошибки с кодом и переведенным сообщением * @param errorCode - Код ошибки из ErrorCode enum * @param req - Express Request объект * @returns Объект с ошибкой и кодом ошибки */ export function createError(errorCode: ErrorCode, req: Request): ErrorResponse { return { error: t(errorCode, req), errorCode: errorCode, }; } export { ErrorCode } from "../types/errorCodes"; export default { t, getLanguageFromRequest, tLang, createError };