Files
stream.graff.tech-server/src/utils/i18n.ts
T

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 };