asp.net 如何读取多个Language类文件的字符串值,Razor pages .net-core 7.0 frontend?

1aaf6o9v  于 5个月前  发布在  .NET
关注(0)|答案(1)|浏览(56)

1.说明

我有登录页面,这是在英语。我已经创建了一个意大利语类,我已经插入了公共字符串翻译。
如果我只想调用类中的意大利语值,它可以正常工作。
我想要的是:
点击一个按钮,其中有一个asp-route-id=“1”为英语,或一个asp-route-id=“2”为意大利语。
点击后,页面读取英语或意大利语类的值,并显示在前端。
在后端,'gg'被声明为[TempData] public int gg {get; set;}。
如果我在前端只声明:WangageEnglishExtensions lang = new();,我可以正确地检索类值。
意大利语也是如此,没有if{}else{}声明。
附言:我知道有一个解决方案与资源,但对我来说,这似乎更直接和简单,以达到我想要的。

2.问题

如何才能做到这一点,使其工作?

3.前端C#代码(无法运行)

@{

@if (gg <= 1 || gg.ToString() == null)
{
  LanguageEnglishExtensions lang = new();
}
else
{
     LanguageItalianExtensions lang = new();
}

字符串

4.前端Html代码

<form id="account" method="post">
 <a asp-page="/Connect" asp-route-id="1" class=" btn btn-outline-primary">
   EN
</a>

<a asp-page="/Connect" asp-route-id="2" class=" btn btn-outline-primary">
   IT
</a>
 <div asp-validation-summary="All" class="text-danger"></div>
 <div class="form-floating">
         <input asp-for="Input.Email" class="form-control" autocomplete="username" aria-required="true" />
         <label asp-for="Input.Email" class="form-label">@lang.email</label>
         <span asp-validation-for="Input.Email" class="text-danger"></span>
     </div>
     <div class="form-floating">
         <input asp-for="Input.Password" class="form-control" autocomplete="current-password" aria-required="true" style="text-align:center;" />
         <label asp-for="Input.Password" class="form-label">@lang.password</label>
         <span asp-validation-for="Input.Password" class="text-danger"></span>
     </div>
     <div class="form-group text-center">
     <br>
     <button type="submit" class="btn btn-outline-primary  border-light" >
             &ensp; @lang.login
     </button>
      </div>
 </div>

5.意大利语课程

public  class LanguageItalianExtensions


{

public  string email = "Indirizzo email";
public  string password = "Password";
 public  string login = "Entra";


}

6ovsh4lw

6ovsh4lw1#

您可以在asp.net core中查看与本地化相关的document
在program.cs中注册所需的服务并调用中间件:

builder.Services.AddRazorPages().AddViewLocalization();
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");
var enUSCulture = "en-us";
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    var supportedCultures = new[]
    {
        new CultureInfo(enUSCulture),
        new CultureInfo("it-it")
    };
    options.DefaultRequestCulture = new RequestCulture(culture: enUSCulture, uiCulture: enUSCulture);
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;

});

字符串
....

app.UseRequestLocalization();


在文档以下部分添加共享资源:


的数据



创建部分视图以选择语言:

@using Microsoft.AspNetCore.Builder
@using Microsoft.AspNetCore.Http.Features
@using Microsoft.AspNetCore.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.Extensions.Options

@inject IViewLocalizer Localizer
@inject IOptions<RequestLocalizationOptions> LocOptions

@{
    var requestCulture = Context.Features.Get<IRequestCultureFeature>();
    var cultureItems = LocOptions.Value.SupportedUICultures
        .Select(c => new SelectListItem { Value = c.Name, Text = c.DisplayName })
        .ToList();
    var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}";
}

<div title="@Localizer["Request culture provider:"] @requestCulture?.Provider?.GetType().Name">
    <form id="selectLanguage" 
          asp-page="Index" asp-page-handler="SelectLanguage" asp-route-returnUrl="@returnUrl"
          method="post" class="form-horizontal" role="form">
        <label asp-for="@requestCulture.RequestCulture.UICulture.Name">@Localizer["Language:"]</label> <select name="culture"
                                                                                                               onchange="this.form.submit();"
                                                                                                               asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="cultureItems">
        </select>
    </form>
</div>


调用layout中的partial view,这样我们就可以在每个页面中选择语言:

<div class="col-md-6 text-right">
    @await Html.PartialAsync("_SelectLanguagePartial")
</div>


Index页面中添加处理程序:

public IActionResult OnPostSelectLanguage(string culture, string returnUrl)
 {
     Response.Cookies.Append(
         CookieRequestCultureProvider.DefaultCookieName,
         CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
         new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
     );

     return LocalRedirect(returnUrl);
 }


帐户页面:

@inject IHtmlLocalizer<SharedResource> SharedLocalizer

 <form id="account" method="post">
    
 <div asp-validation-summary="All" class="text-danger"></div>
 <div class="form-floating">
         <input asp-for="Input.Email" class="form-control" autocomplete="username" aria-required="true" />
        <label asp-for="Input.Email" class="form-label">@SharedLocalizer["email"]</label>
         <span asp-validation-for="Input.Email" class="text-danger"></span>
     </div>
     <div class="form-floating">
         <input asp-for="Input.Password" class="form-control" autocomplete="current-password" aria-required="true" style="text-align:center;" />
        <label asp-for="Input.Password" class="form-label">@SharedLocalizer["password"]</label>
         <span asp-validation-for="Input.Password" class="text-danger"></span>
     </div>
     <div class="form-group text-center">
     <br>
     <button type="submit" class="btn btn-outline-primary  border-light" >
            @SharedLocalizer["login"]
     </button>
      </div>
 </div>
 <</form>


测试结果:



根据您的意见:

public class LanguageExtensions
{

    public string email ;
    public string password ;
    public string login ;
}
public class LanguageItalianExtensions : LanguageExtensions
{
    public LanguageItalianExtensions()
    {
       login= "Entra";
       email = "Indirizzo email";
       password = "Password";
    }
}
public class LanguageEnglishExtensions : LanguageExtensions
{
    public LanguageEnglishExtensions()
    {
        login = "Login";
        email = "Email";
        password = "Password";
    }
}


页面模型:

public class AccountModel : PageModel
{
    [BindProperty]
    public InputModel? Input { get; set; }
    [BindProperty]
    public LanguageExtensions lang { get; set; } = new LanguageEnglishExtensions();

    public void OnGet()
    {
    }

    public void OnGetSelectLanguage(int Id)
    {
        if(Id==2)
        {
            lang = new LanguageItalianExtensions();
        }
        else
        {
            lang = new LanguageEnglishExtensions();  
        }
    }

}


cshtml:

<form id="account" method="post">
    <a asp-page="/Account" asp-page-handler="SelectLanguage" asp-route-id="1" class=" btn btn-outline-primary">
        EN
    </a>

    <a asp-page="/Account" asp-page-handler="SelectLanguage" asp-route-id="2" class=" btn btn-outline-primary">
        IT
    </a>
    
 <div asp-validation-summary="All" class="text-danger"></div>
 <div class="form-floating">
         <input asp-for="Input.Email" class="form-control" autocomplete="username" aria-required="true" />
        <label asp-for="Input.Email" class="form-label">@Model.lang.email</label>
         <span asp-validation-for="Input.Email" class="text-danger"></span>
     </div>
     <div class="form-floating">
         <input asp-for="Input.Password" class="form-control" autocomplete="current-password" aria-required="true" style="text-align:center;" />
        <label asp-for="Input.Password" class="form-label">@Model.lang.password</label>
         <span asp-validation-for="Input.Password" class="text-danger"></span>
     </div>
     <div class="form-group text-center">
     <br>
     <button type="submit" class="btn btn-outline-primary  border-light" >
            @Model.lang.login
     </button>
      </div>
 </div>
 <</form>


测试结果:


相关问题