Files
2026-06-07 18:48:42 +09:00

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;
}
}