Files
pasargad/src/locales/translates.ts
T

58 lines
1.6 KiB
TypeScript
Raw Normal View History

import en from './en';
import fa from './fa';
// Universal getCookie function
export function getCookie(name: string): string | undefined {
if (typeof window !== 'undefined') {
// Client-side
const match = document.cookie.match(
new RegExp('(^| )' + name + '=([^;]+)'),
);
return match ? decodeURIComponent(match[2]) : undefined;
} else {
// Server-side (Next.js App Router)
try {
// Dynamically import to avoid errors in client bundle
const { cookies } = require('next/headers');
return cookies().get(name)?.value;
} catch {
return undefined;
}
}
}
// Universal setCookie function to change language
export function changeLanguage(lang: TLocales, days = 365) {
if (typeof window !== 'undefined') {
// Client-side
const expires = new Date(Date.now() + days * 864e5).toUTCString();
document.cookie = `lang=${encodeURIComponent(lang)}; expires=${expires}; path=/`;
} else {
// Server-side (Next.js App Router)
try {
const { cookies } = require('next/headers');
cookies().set('lang', lang, { path: '/', maxAge: days * 24 * 60 * 60 });
} catch {
// No-op on server if not available
}
}
}
export const locales = {
en: en as Translates,
fa,
} as Record<TLocales, Translates>;
export const translates = (key: keyof Translates): string | (() => string) => {
const lang = (getCookie('lang') || 'en') as TLocales;
return locales[lang][key] || locales.en[key] || key;
};
export const t = (key: keyof Translates) => translates(key);
export type TLocales = 'en' | 'fa';
export type Translates = {
[K in keyof typeof en]: string | (() => string);
};