113 lines
2.8 KiB
C#
113 lines
2.8 KiB
C#
using System.Diagnostics;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using LowLevelGuyCom.Models;
|
|
|
|
namespace LowLevelGuyCom.Controllers;
|
|
|
|
public class HomeController : Controller
|
|
{
|
|
private readonly ILogger<HomeController> _logger;
|
|
private const string LanguageCookieName = "site-lang";
|
|
|
|
public HomeController(ILogger<HomeController> logger)
|
|
{
|
|
_logger = logger;
|
|
}
|
|
|
|
public IActionResult Index()
|
|
{
|
|
return View(UseJapanese() ? "IndexJa" : "Index");
|
|
}
|
|
|
|
[Route("ja")]
|
|
public IActionResult IndexJa()
|
|
{
|
|
return Redirect("/?lang=ja");
|
|
}
|
|
|
|
[Route("cv")]
|
|
public IActionResult Cv()
|
|
{
|
|
return View(UseJapanese() ? "CvJa" : "Cv");
|
|
}
|
|
|
|
[Route("cv/ja")]
|
|
public IActionResult CvJa()
|
|
{
|
|
return Redirect("/cv?lang=ja");
|
|
}
|
|
|
|
public IActionResult Privacy()
|
|
{
|
|
return View();
|
|
}
|
|
|
|
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
|
public IActionResult Error()
|
|
{
|
|
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
|
|
}
|
|
|
|
private bool UseJapanese()
|
|
{
|
|
string? queryLanguage = Request.Query["lang"].FirstOrDefault();
|
|
if (TryNormalizeLanguage(queryLanguage, out bool queryIsJapanese))
|
|
{
|
|
Response.Cookies.Append(
|
|
LanguageCookieName,
|
|
queryIsJapanese ? "ja" : "en",
|
|
new CookieOptions
|
|
{
|
|
MaxAge = TimeSpan.FromDays(365),
|
|
SameSite = SameSiteMode.Lax
|
|
});
|
|
|
|
return queryIsJapanese;
|
|
}
|
|
|
|
if (TryNormalizeLanguage(Request.Cookies[LanguageCookieName], out bool cookieIsJapanese))
|
|
return cookieIsJapanese;
|
|
|
|
return BrowserPrefersJapanese();
|
|
}
|
|
|
|
private static bool TryNormalizeLanguage(string? language, out bool isJapanese)
|
|
{
|
|
isJapanese = false;
|
|
|
|
if (string.IsNullOrWhiteSpace(language))
|
|
return false;
|
|
|
|
string normalized = language.Trim().ToLowerInvariant();
|
|
if (normalized.StartsWith("ja"))
|
|
{
|
|
isJapanese = true;
|
|
return true;
|
|
}
|
|
|
|
if (normalized.StartsWith("en"))
|
|
{
|
|
isJapanese = false;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private bool BrowserPrefersJapanese()
|
|
{
|
|
string acceptLanguage = Request.Headers.AcceptLanguage.ToString();
|
|
if (string.IsNullOrWhiteSpace(acceptLanguage))
|
|
return false;
|
|
|
|
foreach (string segment in acceptLanguage.Split(',', StringSplitOptions.RemoveEmptyEntries))
|
|
{
|
|
string language = segment.Split(';', 2)[0].Trim();
|
|
if (TryNormalizeLanguage(language, out bool isJapanese))
|
|
return isJapanese;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|