CarneiroTech/Services/LanguageService.cs

89 lines
3.0 KiB
C#

using Microsoft.AspNetCore.Http;
using System.Globalization;
namespace CarneiroTech.Services
{
public interface ILanguageService
{
string GetCurrentLanguage(HttpContext context);
void SetLanguage(HttpContext context, string language);
string DetectBrowserLanguage(HttpContext context);
}
public class LanguageService : ILanguageService
{
private const string LanguageCookieName = "CarneiroTech_Language";
private readonly string[] _supportedLanguages = { "pt", "en", "es" };
private const string DefaultLanguage = "pt";
public string GetCurrentLanguage(HttpContext context)
{
// 1. Check cookie first (user preference)
if (context.Request.Cookies.TryGetValue(LanguageCookieName, out var cookieLanguage))
{
if (_supportedLanguages.Contains(cookieLanguage))
{
return cookieLanguage;
}
}
// 2. Detect from browser Accept-Language header
var browserLanguage = DetectBrowserLanguage(context);
if (!string.IsNullOrEmpty(browserLanguage) && _supportedLanguages.Contains(browserLanguage))
{
return browserLanguage;
}
// 3. Fallback to default (Portuguese)
return DefaultLanguage;
}
public void SetLanguage(HttpContext context, string language)
{
if (_supportedLanguages.Contains(language))
{
var cookieOptions = new CookieOptions
{
Expires = DateTimeOffset.UtcNow.AddYears(1),
HttpOnly = false, // Allow JavaScript to read for client-side logic
Secure = context.Request.IsHttps,
SameSite = SameSiteMode.Lax,
Path = "/"
};
context.Response.Cookies.Append(LanguageCookieName, language, cookieOptions);
}
}
public string DetectBrowserLanguage(HttpContext context)
{
var acceptLanguageHeader = context.Request.Headers["Accept-Language"].ToString();
if (string.IsNullOrEmpty(acceptLanguageHeader))
{
return string.Empty;
}
// Parse Accept-Language header
// Format: "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7,es;q=0.6"
var browserLanguages = acceptLanguageHeader
.Split(',')
.Select(lang => lang.Split(';')[0].Trim())
.Select(lang => lang.Split('-')[0].ToLower()) // Get only language code (pt from pt-BR)
.Distinct()
.ToList();
// Find first supported language
foreach (var browserLang in browserLanguages)
{
if (_supportedLanguages.Contains(browserLang))
{
return browserLang;
}
}
return string.Empty;
}
}
}