【问题标题】:my web app gets translation from the french resource, idk why我的网络应用程序从法语资源中获取翻译,我知道为什么
【发布时间】:2020-07-24 13:31:43
【问题描述】:

我几周前开始使用 asp.net core 3.0 开发一个 web 应用程序,现在我必须开发本地化服务,为了简化我的代码,我只会写新的“部分”所以在这里他们是: 启动.cs: ConfigureServices 方法:

 services.AddLocalization(options => options.ResourcesPath = "Resources");
                services.AddMvc(option => option.EnableEndpointRouting = false)
                   .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
                   .AddDataAnnotationsLocalization()
                   .SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
                services.Configure<RequestLocalizationOptions>(options =>
                {
                    var supportedCultures = new List<CultureInfo>
                        {
                            new CultureInfo("fr-FR"),
                    new CultureInfo("en-US"),
                    new CultureInfo("de-DE"),
                        };
    
                    options.DefaultRequestCulture = new RequestCulture(culture: "en", uiCulture: "en-US");
                    options.SupportedCultures = supportedCultures;
                    options.SupportedUICultures = supportedCultures;
                });
                services.AddTransient<SharedResources>();

SharedResources.cs 位于应用根目录中 Configure 方法

var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
            app.UseRequestLocalization(locOptions.Value);

_ViewImports.cshtml:

@using Microsoft.Extensions.Localization
@inject IStringLocalizer<Backoffice.SharedResources> LangDefault
@addTagHelper *, Localisation

一个视图:

@using Microsoft.AspNetCore.Mvc.Localization
@model some-model
@inject IViewLocalizer Localizer
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
    <ul class="navbar-nav flex-grow-1">
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="" asp-page="/Index">@Localizer["Sede"]</a>
        </li>
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">@Localizer["FirstName"]</a>
        </li>
    </ul>
</div>

我的应用程序仅从 Views.[SomeController].[SomeAction].fr.resx 获取法语翻译,我找不到如何制作选择列表来更改语言,我找到的是 API 应用程序或旧的 .net 核心,我找到了 @987654321 @,但它遗漏了一些要点,你能提供一个改编的指南或一些帮助吗?谢谢

【问题讨论】:

    标签: c# asp.net asp.net-core localization asp.net-core-3.0


    【解决方案1】:

    这是一个演示:

    /共享/部分:

    @inject IViewLocalizer Localizer
    @inject IOptions<RequestLocalizationOptions> LocOptions
    @*@{
            ViewData["Title"] = "Partial";
        }
    
        <h1>Partial</h1>*@
    
    @{
        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-controller="Home"
              asp-action="SetLanguage" 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.cshtml:

    @using Microsoft.AspNetCore.Mvc.Localization
    
    @inject IViewLocalizer Localizer
     <div class="container">
            <main role="main" class="pb-3">
                @RenderBody()
            </main>
            <div>
                @Localizer["Hello"]
            </div>
            <div class="col-sm-6 text-right">
                @await Html.PartialAsync("Partial")
            </div>
        </div>
    

    Startup.cs:

    配置服务:

    services.AddLocalization(options => options.ResourcesPath = "Resources");
                services.AddMvc()
                .AddViewLocalization(
                    LanguageViewLocationExpanderFormat.Suffix,
                    opts => { opts.ResourcesPath = "Resources"; })
                .AddDataAnnotationsLocalization();
    
                services.Configure<RequestLocalizationOptions>(options =>
                {
                    var supportedCultures = new List<CultureInfo>
                        {
                            new CultureInfo("en-US"),
                            new CultureInfo("fr-FR"),
                            new CultureInfo("de-DE")
                        };
    
                    options.DefaultRequestCulture = new RequestCulture("en-US");
                    options.SupportedCultures = supportedCultures;
                    options.SupportedUICultures = supportedCultures;
    
                });
    

    配置:

    app.UseHttpsRedirection();
                var supportedCultures = new[] { "en-US", "fr-FR", "de-DE" };
                var localizationOptions = new RequestLocalizationOptions().SetDefaultCulture(supportedCultures[0])
                    .AddSupportedCultures(supportedCultures)
                    .AddSupportedUICultures(supportedCultures);
    
                app.UseRequestLocalization(localizationOptions);
    
                app.UseStaticFiles();
    

    家庭控制器:

    [HttpPost]
            public IActionResult SetLanguage(string culture, string returnUrl)
            {
                Response.Cookies.Append(
                    CookieRequestCultureProvider.DefaultCookieName,
                    CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
                    new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
                );
    
                return LocalRedirect(returnUrl);
            }
    

    资源:

    结果:

    【讨论】:

    • 想你的回复,你不知道我访问了多少页面,它们要么是.net core 2.2(我和.net core 3.0在一起,它可以工作,但有一些问题,例如:不允许在 .net core 3.0 的 Resources 文件夹中创建课程,而您必须在 .net core 2.2 中创建课程,而且没有完整的演练,比方说,我开始全职开发几周之前)或者它们用于Web API,这不是我的项目(就像在微软官方文档中一样),我的Shared文件夹中没有部分剃刀页面,我必须创建它吗?
    • 这是我在 Shared 文件夹中的内容 link
    • 如果你不想创建局部视图,你也可以不创建它,并将它的代码放到你需要的任何其他页面。我在示例中使用它是因为你可以使用@await Html.PartialAsync("Partial")在其他页面重用代码。
    • 只是一个信息,法语 hello=="Bonjour" 不是“Hola”,但您可能会将法语与西班牙语混淆,或者您可能是在线游戏玩家(法国人在在线游戏中经常说 Hola喜欢魔兽)
    • 对我来说,顺便说一句,我已经停止使用 Chrome 很长时间了,但是由于这个应用程序旨在为许多客户端运行,你有解决方案为什么 cookie 不能在 chrome 上持续存在吗? (我的意思是本地化),我首先用 Opera 进行了测试,它可以工作,但在 chrome 中它没有,直到我将 SetLanguage 方法的返回从 return LocalRedirect(returnUrl); 更改为 return LocalRedirect(returnUrl+"?culture="+culture+"&amp;handler=SetCulture");,但 cookie 仍然没有t坚持,至少翻译有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多