58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
|
|
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);
|
||
|
|
};
|