);
// ---- Language Switcher (botão flutuante com bandeira UK como ícone default) ----
const LANG_OPTIONS = [
{ code: 'en', country: 'gb', labelKey: 'label_en' },
{ code: 'it', country: 'it', labelKey: 'label_it' },
{ code: 'de', country: 'de', labelKey: 'label_de' },
{ code: 'pt', country: 'br', labelKey: 'label_pt' },
];
const LanguageSwitcher = () => {
const [open, setOpen] = React.useState(false);
const wrapRef = React.useRef(null);
React.useEffect(() => {
const close = (e) => { if (wrapRef.current && !wrapRef.current.contains(e.target)) setOpen(false); };
document.addEventListener('mousedown', close);
return () => document.removeEventListener('mousedown', close);
}, []);
const navigate = (code) => {
setOpen(false);
window.location.href = window.langHref(code);
};
const Flag = ({ country, size = 28 }) => (
{ e.currentTarget.style.display = 'none'; }}
/>
);
// Ícone do botão = bandeira UK (mostra que há opção em inglês mesmo no site PT)
// Exceção: se o usuário já está em outro idioma, mostra a bandeira do idioma atual
const currentFlag = LANG_OPTIONS.find(l => l.code === window.LANG)?.country || 'gb';
const defaultFlag = window.LANG === 'pt' ? 'gb' : currentFlag;
return (
{open && (
{LANG_OPTIONS.map(opt => (
))}
)}
);
};
const Nav = () => {
const [projectsOpen, setProjectsOpen] = React.useState(false);
React.useEffect(() => { window.openProjectsModal = () => setProjectsOpen(true); }, []);
const scrollTo = (id) => (e) => {
const el = document.getElementById(id);
if (el) { e.preventDefault(); el.scrollIntoView({ behavior: 'smooth' }); }
};
return (
<>
{projectsOpen && setProjectsOpen(false)} />}
>
);
};
// ---- Translation banner (auto-detect + redirect para pasta de idioma) ----
const BANNER_LANGS = {
en: { msg: "We noticed your browser is set to English. Would you like to see this site in English?", btn: "Yes, translate", target: 'en' },
de: { msg: "Wir haben bemerkt, dass Ihr Browser auf Deutsch eingestellt ist. Möchten Sie die Seite auf Deutsch sehen?", btn: "Ja, übersetzen", target: 'de' },
fr: { msg: "Votre navigateur est en français. Souhaitez-vous voir ce site en anglais ?", btn: "Oui, traduire", target: 'en' },
it: { msg: "Il tuo browser è impostato in italiano. Vuoi vedere questo sito in italiano?", btn: "Sì, traduci", target: 'it' },
es: { msg: "Tu navegador está en español. ¿Deseas ver este sitio en inglés?", btn: "Sí, traducir", target: 'en' },
ja: { msg: "ブラウザが日本語に設定されています。このサイトを英語で表示しますか?", btn: "翻訳する", target: 'en' },
zh: { msg: "您的浏览器设置为中文。您是否希望以英文查看此网站?", btn: "翻译网站", target: 'en' },
ar: { msg: "لاحظنا أن متصفحك مضبوط على اللغة العربية. هل تريد رؤية هذا الموقع باللغة الإنجليزية؟", btn: "نعم، ترجم", target: 'en' },
};
const TranslationBanner = () => {
const [show, setShow] = React.useState(false);
const [info, setInfo] = React.useState(null);
React.useEffect(() => {
if (sessionStorage.getItem('transl-banner-dismissed')) return;
const base = (navigator.language || '').toLowerCase().split('-')[0];
if (base === 'pt') return; // browser em PT → não oferece tradução
const cfg = BANNER_LANGS[base];
if (!cfg) return;
// Se o usuário já está no idioma alvo, não mostra
if (window.LANG === cfg.target) return;
setInfo(cfg);
setShow(true);
}, []);
if (!show || !info) return null;
const dismiss = () => {
setShow(false);
sessionStorage.setItem('transl-banner-dismissed', '1');
};
const translate = () => {
sessionStorage.setItem('transl-banner-dismissed', '1');
window.location.href = window.langHref(info.target);
};
return (