127 lines
3.5 KiB
TypeScript
127 lines
3.5 KiB
TypeScript
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 };
|