我有一个使用 MVC 的 ASP.NET Core 基本 Web 应用程序。要求是有某种切换、按钮、下拉菜单,可以更改页面的语言(波兰语和英语) - 目前导航栏、主页和关于页面。我使用共享资源、本地化等方法来做到这一点,但后来我被要求更直接地做到这一点,通过使用两种变体的所有视图和部分视图:波兰语(即 Index_pl.cshtml)和英语(即 Index.cshtml)。 cshtml)。 我用两个按钮完成了下拉菜单,复制了所有视图和部分视图。我尝试实现一些 JavaScript 函数并更新控制器以单击更改此语言,但它在此状态下不起作用。 有谁知道我可以在这段代码中添加什么或者如何更改我的实现?
_Layout.cshtml:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - MelanomaWebApp</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
<link rel="stylesheet" href="~/MelanomaWebApp.styles.css" asp-append-version="true" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.min.css">
</head>
<body>
<header>
<partial name="~/Views/Shared/_NavBar.cshtml"></partial>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 2024 - MelanomaWebApp - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
<script>
function changeLanguage(language) {
currentLanguage = language;
location.reload();
}
</script>
</body>
</html>
_NavBar.cshtml(相同的代码位于_NavBar_pl.cshtml - 仅将英语单词翻译为波兰语):
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container-fluid">
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">MelanomaWebApp</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="About" asp-action="Index">About</a>
</li>
</ul>
</div>
<div>
<div class="nav-item dropdown">
<a class="nav-link dropdown-toggle text-dark" href="#" id="navbarDropdown" role="button" data-toggle="button" data-bs-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
<i class="bi bi-globe-americas"></i>
Change language (PL/EN)
</a>
<div class="dropdown-menu dropdown-menu-end bg-light text-center" aria-labelledby="navbarDropdown">
<a class="dropdown-item text-secondary" style="text-decoration: none;" href="#" onclick="changeLanguage('PL')">
<i class="pl-icon"></i>
Polski (PL)
</a>
<a class="dropdown-item text-secondary" style="text-decoration: none;" href="#" onclick="changeLanguage('EN')">
<i class="flag flag-united-kingdom"></i>
English (EN)
</a>
</div>
</div>
</div>
</div>
</nav>
Home View的Index.cshtml(与Index_pl.cshtml中的代码相同):
@{
ViewData["Title"] = "Home Page";
}
<div class="container text-center mt-5 mb-5 fs-3 fw-bold">
<p>The name of the project is confidential</p>
</div>
<div class="container text-center mt-5 mb-5">
<p>Research project No. xxxx<br />
of some Research State<br />
Location
</p>
</div>
<div class="container fixed-bottom mb-2">
<div class="row d-flex mb-5 text-center text-muted">
<div class="col p-2">
<p>Department of something <br />
Some university <br />
address <br />
address</p>
</div>
<div class="col ms-auto p-2">
<p>name of institute <br />
address<br />
address</p>
</div>
</div>
</div>
About View的Index.cshtml(与Index_pl.cshtml中的代码相同):
<body>
<div class="text-center">
<p>This is some about page content</p>
</div>
</body>
家庭控制器:
using MelanomaWebApp.Models;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
namespace MelanomaWebApp.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private string CurrentLanguage { get; set; } = "EN";
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
string viewName = "Index";
if (CurrentLanguage == "PL")
{
viewName += "_pl";
}
return View(viewName);
}
public IActionResult Index_pl()
{
return View();
}
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 });
}
}
}
在这种状态下,当我点击EN或PL按钮时,什么也没有发生,我仍然显示默认的英文页面。
通过在两种变体中使用所有视图和部分视图:抛光(即 Index_pl.cshtml)和英语(即 Index.cshtml)。
您可以使用 JavaScript 更改前端页面 URL 中的语言参数,并将其传递到后端,然后从查询参数中获取语言参数值,以重新加载页面以应用新的语言参数。以下是您可以用作参考的示例:
为了有效区分语言页面,我在index_pl页面中添加了
<h2>PL Content</h2>
元素。
<div class="container text-center mt-5 mb-5 fs-3 fw-bold">
<p>The name of the project is confidential</p>
</div>
<div class="container text-center mt-5 mb-5">
<p>
Research project No. xxxx<br />
of some Research State<br />
Location content
</p>
<h2>PL Content</h2>
</div>
<div class="container fixed-bottom mb-2">
<div class="row d-flex mb-5 text-center text-muted">
<div class="col p-2">
<p>
Department of something <br />
Some university <br />
address <br />
address
</p>
</div>
<div class="col ms-auto p-2">
<p>
name of institute <br />
address<br />
address
</p>
</div>
</div>
</div>
_Layout中的js:
<script>
function changeLanguage(language) {
var url = window.location.href;
var newUrl;
if (url.indexOf('?') > -1) {
if (url.indexOf('language') > -1) {
newUrl = url.replace(/(language=)[^\&]+/, '$1' + language);
} else {
newUrl = url + '&language=' + language;
}
} else {
newUrl = url + '?language=' + language;
}
window.location.href = newUrl;
}
</script>
控制器:
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
string currentLanguage = HttpContext.Request.Query["language"];
if (string.IsNullOrEmpty(currentLanguage) || currentLanguage != "PL")
{
currentLanguage = "EN";
}
string viewName = "Index";
if (currentLanguage == "PL")
{
viewName += "_pl";
}
return View(viewName);
}
选择PL后: