QrRapido/wwwroot/js/language-switcher.js
2025-08-10 14:45:53 -03:00

128 lines
4.2 KiB
JavaScript

// Language switching functionality for QR Rapido
document.addEventListener('DOMContentLoaded', function () {
// FORCE: Respect the URL culture above all else
let currentCulture = getCurrentCulture();
console.log('Current culture:', currentCulture);
localStorage.setItem('preferredLanguage', currentCulture);
const languageDropdownItems = document.querySelectorAll('.dropdown-item[data-lang]');
const currentLangSpan = document.getElementById('current-lang');
// Get current culture from URL or default to pt-BR
function getCurrentCulture() {
const pathSegments = window.location.pathname.split('/').filter(segment => segment);
const supportedCultures = ['pt-BR', 'es-PY', 'es'];
if (pathSegments.length > 0 && supportedCultures.includes(pathSegments[0])) {
return pathSegments[0];
}
return 'pt-BR';
}
// Update current language display
function updateCurrentLanguageDisplay(culture) {
const langMap = {
'pt-BR': 'PT',
'es-PY': 'ES',
'es': 'ES'
};
if (currentLangSpan) {
currentLangSpan.textContent = langMap[culture] || 'PT';
}
}
// Build new URL with selected culture
function buildLocalizedUrl(newCulture) {
const currentPath = window.location.pathname;
const queryString = window.location.search;
const hash = window.location.hash;
// Remove existing culture from path if present
const pathSegments = currentPath.split('/').filter(segment => segment);
const supportedCultures = ['pt-BR', 'es-PY', 'es'];
// Remove current culture if it's the first segment
if (pathSegments.length > 0 && supportedCultures.includes(pathSegments[0])) {
pathSegments.shift();
}
// Build new path with selected culture
const newPath = '/' + newCulture + (pathSegments.length > 0 ? '/' + pathSegments.join('/') : '');
return newPath + queryString + hash;
}
// Handle language selection
// Handle language selection
languageDropdownItems.forEach(item => {
item.addEventListener('click', function (e) {
e.preventDefault();
const selectedLang = this.getAttribute('data-lang');
currentCulture = getCurrentCulture();
// Track language change for analytics
if (typeof window.trackLanguageChange === 'function') {
window.trackLanguageChange(currentCulture, selectedLang);
}
// Store language preference in localStorage
localStorage.setItem('preferredLanguage', selectedLang);
// Set culture cookie for server-side processing
document.cookie = `culture=${selectedLang}; path=/; max-age=31536000; SameSite=Lax`;
// Navigate to new URL with selected language
const newUrl = buildLocalizedUrl(selectedLang);
window.location.href = newUrl;
});
});
// Initialize current language display
currentCulture = getCurrentCulture();
updateCurrentLanguageDisplay(currentCulture);
// Store current culture in localStorage if not already set
if (!localStorage.getItem('preferredLanguage')) {
localStorage.setItem('preferredLanguage', currentCulture);
}
});
// Utility function to get user's preferred language
function getUserPreferredLanguage() {
// Check localStorage first
const storedLang = localStorage.getItem('preferredLanguage');
if (storedLang) {
return storedLang;
}
// Check browser language
const browserLang = navigator.language || navigator.userLanguage;
// Map browser languages to supported cultures
const langMap = {
'pt': 'pt-BR',
'pt-BR': 'pt-BR',
'es': 'es-PY',
'es-PY': 'es-PY'
};
// Check exact match first
if (langMap[browserLang]) {
return langMap[browserLang];
}
// Check language part only (e.g., 'es' from 'es-AR')
const langPart = browserLang.split('-')[0];
if (langMap[langPart]) {
return langMap[langPart];
}
}