86 lines
2.5 KiB
TypeScript
86 lines
2.5 KiB
TypeScript
'use client';
|
|
|
|
import React, { createContext, useContext, useEffect, useState } from 'react';
|
|
import { useRouter, usePathname } from 'next/navigation';
|
|
import { type Locale, locales, defaultLocale, getNestedValue } from '@/lib/i18n';
|
|
|
|
// Importar traduções estaticamente
|
|
import ptTranslations from '@/locales/pt.json';
|
|
import enTranslations from '@/locales/en.json';
|
|
import esTranslations from '@/locales/es.json';
|
|
|
|
const translations: Record<Locale, typeof ptTranslations> = {
|
|
pt: ptTranslations,
|
|
en: enTranslations,
|
|
es: esTranslations,
|
|
};
|
|
|
|
interface LocaleContextType {
|
|
locale: Locale;
|
|
setLocale: (locale: Locale) => void;
|
|
t: (key: string) => string;
|
|
translations: typeof ptTranslations;
|
|
}
|
|
|
|
const LocaleContext = createContext<LocaleContextType | undefined>(undefined);
|
|
|
|
interface LocaleProviderProps {
|
|
children: React.ReactNode;
|
|
locale: Locale;
|
|
}
|
|
|
|
export function LocaleProvider({ children, locale: initialLocale }: LocaleProviderProps) {
|
|
const [locale, setLocaleState] = useState<Locale>(initialLocale);
|
|
const router = useRouter();
|
|
const pathname = usePathname();
|
|
|
|
// Função para trocar idioma (navega para nova URL)
|
|
const setLocale = (newLocale: Locale) => {
|
|
// Salvar preferência no cookie
|
|
document.cookie = `locale=${newLocale};path=/;max-age=31536000`; // 1 ano
|
|
|
|
// Remover locale atual do pathname
|
|
let newPathname = pathname;
|
|
|
|
// Verificar se pathname começa com locale
|
|
for (const loc of locales) {
|
|
if (pathname.startsWith(`/${loc}/`) || pathname === `/${loc}`) {
|
|
newPathname = pathname.replace(`/${loc}`, '') || '/';
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Construir nova URL
|
|
if (newLocale === defaultLocale) {
|
|
// Português não tem prefixo
|
|
router.push(newPathname);
|
|
} else {
|
|
router.push(`/${newLocale}${newPathname === '/' ? '' : newPathname}`);
|
|
}
|
|
|
|
setLocaleState(newLocale);
|
|
};
|
|
|
|
// Função t() para obter tradução
|
|
const t = (key: string): string => {
|
|
return getNestedValue(translations[locale] as Record<string, unknown>, key);
|
|
};
|
|
|
|
return (
|
|
<LocaleContext.Provider value={{ locale, setLocale, t, translations: translations[locale] }}>
|
|
{children}
|
|
</LocaleContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function useLocale() {
|
|
const context = useContext(LocaleContext);
|
|
if (context === undefined) {
|
|
throw new Error('useLocale must be used within a LocaleProvider');
|
|
}
|
|
return context;
|
|
}
|
|
|
|
// Alias para compatibilidade
|
|
export const useLanguage = useLocale;
|