Asp.net核心本地化始终返回英语文化

Asp.net核心本地化始终返回英语文化,asp.net,asp.net-core,localization,Asp.net,Asp.net Core,Localization,我正在尝试开发一个多语言项目。对于静态值,我使用了资源(.resx文件) 我创建了两个资源文件 Home.resx(默认或英语)和Home.resx(阿拉伯语) 它适用于默认值或英语 然后我试着改变语言 System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ar"); var home = Resources.Home.Home1; 但它仍然返回英语值而不是

我正在尝试开发一个多语言项目。对于静态值,我使用了资源(.resx文件)

我创建了两个资源文件 Home.resx(默认或英语)和Home.resx(阿拉伯语) 它适用于默认值或英语

然后我试着改变语言

System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ar");
 var home = Resources.Home.Home1;
但它仍然返回英语值而不是阿拉伯语值

这是我的startup.cs配置功能

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {

   var supportedCultures = new List<System.Globalization.CultureInfo>
            {
                new System.Globalization.CultureInfo("en-US"),

                new System.Globalization.CultureInfo("ar-AR"),

            };
            var options = new RequestLocalizationOptions
            {
                DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en-US"),
                SupportedCultures = supportedCultures,
                SupportedUICultures = supportedCultures
            };
            app.UseRequestLocalization(options);
......
public void配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
var supportedCultures=新列表
{
新系统。全球化。文化信息(“en-US”),
新系统。全球化。文化信息(“ar”),
};
var options=newrequestLocalizationOptions
{
DefaultRequestCulture=new Microsoft.AspNetCore.Localization.RequestCulture(“en-US”),
SupportedCultures=SupportedCultures,
支持的教育=支持的文化
};
app.UseRequestLocalization(选项);
......

我的代码有什么问题?

好的,我会告诉你我在项目中做什么。在Startup.cs的ConfigureServices方法中的services.AddMvc()之后键入以下代码

IList<CultureInfo> supportedCultures = new List<CultureInfo>
{
    new CultureInfo("en-US"),
    new CultureInfo("fr-FR"),
    new CultureInfo("el-GR"),
};

var MyOptions = new RequestLocalizationOptions()
{
    DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures
};
MyOptions.RequestCultureProviders = new[]
{
     new RouteDataRequestCultureProvider() { RouteDataStringKey = "lang", Options = MyOptions }
};

services.AddSingleton(MyOptions);
更改默认路由:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{lang=en-US}/{controller=Home}/{action=Index}/{id?}");
});
正在为每个控制器使用MiddlewareFilter

[MiddlewareFilter(typeof(LocalizationPipeline))]
public class HomeController : Controller
{
    public string GetCulture()
    {
        return $"CurrentCulture:{CultureInfo.CurrentCulture.Name}, CurrentUICulture:{CultureInfo.CurrentUICulture.Name}";
    }
}
您可以按如下方式更改当前语言:

<ul>
    <li>@Html.ActionLink("EN", ViewContext.RouteData.Values["action"] as string, ViewContext.RouteData.Values["controller"] as string, new { lang = "en-US" })</li>
    <li>@Html.ActionLink("FR", ViewContext.RouteData.Values["action"] as string, ViewContext.RouteData.Values["controller"] as string, new { lang = "fr-FR" })</li>
    <li>@Html.ActionLink("GR", ViewContext.RouteData.Values["action"] as string, ViewContext.RouteData.Values["controller"] as string, new { lang = "el-GR" })</li>
</ul>
在页面模型上使用以下MiddlewareFilter属性

[MiddlewareFilter(typeof(LocalizationPipeline))]
public class ContactModel : PageModel
{
    public string Message { get; set; }

    public void OnGet()
    {
        Message = "Your contact page.";
    }
}

我唯一没有做到的就是通过在Startup.cs中以编程方式添加MiddlewareFilter来自动为所有控制器和页面模型定义本地化管道。

好的,我将告诉您我在项目中做了什么。在services.AddMvc()之后键入以下代码在Startup.cs的ConfigureServices方法中

IList<CultureInfo> supportedCultures = new List<CultureInfo>
{
    new CultureInfo("en-US"),
    new CultureInfo("fr-FR"),
    new CultureInfo("el-GR"),
};

var MyOptions = new RequestLocalizationOptions()
{
    DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures
};
MyOptions.RequestCultureProviders = new[]
{
     new RouteDataRequestCultureProvider() { RouteDataStringKey = "lang", Options = MyOptions }
};

services.AddSingleton(MyOptions);
更改默认路由:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{lang=en-US}/{controller=Home}/{action=Index}/{id?}");
});
正在为每个控制器使用MiddlewareFilter

[MiddlewareFilter(typeof(LocalizationPipeline))]
public class HomeController : Controller
{
    public string GetCulture()
    {
        return $"CurrentCulture:{CultureInfo.CurrentCulture.Name}, CurrentUICulture:{CultureInfo.CurrentUICulture.Name}";
    }
}
您可以按如下方式更改当前语言:

<ul>
    <li>@Html.ActionLink("EN", ViewContext.RouteData.Values["action"] as string, ViewContext.RouteData.Values["controller"] as string, new { lang = "en-US" })</li>
    <li>@Html.ActionLink("FR", ViewContext.RouteData.Values["action"] as string, ViewContext.RouteData.Values["controller"] as string, new { lang = "fr-FR" })</li>
    <li>@Html.ActionLink("GR", ViewContext.RouteData.Values["action"] as string, ViewContext.RouteData.Values["controller"] as string, new { lang = "el-GR" })</li>
</ul>
在页面模型上使用以下MiddlewareFilter属性

[MiddlewareFilter(typeof(LocalizationPipeline))]
public class ContactModel : PageModel
{
    public string Message { get; set; }

    public void OnGet()
    {
        Message = "Your contact page.";
    }
}

我唯一没有做到的是,通过在Startup.cs中以编程方式添加MiddlewareFilter,为所有控制器和页面模型自动定义本地化管道。

我认为您需要更仔细地遵循这一点。因此,您的文件可能应该命名为
Home.ar.resx
@poke I change Home.ar。resx,但它仍然获得默认(英语)值。如何设置阿拉伯语culture?这是否错误?这行足够吗?System.Threading.Thread.CurrentThread.CurrentUICulture=new System.Globalization.CultureInfo(“ar”);//或(“ar”)我认为您需要更仔细地了解。因此,您的文件可能应该命名为
Home.ar.resx
@poke我将其更改为Home.ar.resx,但它仍然获得默认(英语)值。我如何设置阿拉伯语文化?这是错误的吗?这行足够了吗?System.Threading.Thread.CurrentUICulture=new System.Globalization.CultureInfo(“ar-ar”);//或(“ar”)这很难:)如果用户单击“将语言更改为阿拉伯语或其他语言”,我只想设置当前文化这是我实现它的唯一方法,但如果设置正确,它会工作。是的,它工作正常,没有性能问题。非常感谢…我想更改路线。使用您的代码,它会生成url:我如何更改为了包含您的currencyCode,您必须使用以下路径
{lang=en US}/{currencyCode}/{controller=Home}/{action=Index}/{id?}
这很难:)如果用户单击“将语言更改为阿拉伯语或其他语言”,我只想设置当前文化。这是我实现它的唯一方法,但如果设置正确,它就可以工作。是的,它可以工作,而且没有性能问题。非常感谢……我想更改路线。使用您的代码,它可以生成url:如何才能我改为,为了包含您的currencyCode,您必须使用以下路径
{lang=en-US}/{currencyCode}/{controller=Home}/{action=Index}/{id?}
IList<CultureInfo> supportedCultures = new List<CultureInfo>
{
    new CultureInfo("en-US"),
    new CultureInfo("fr-FR"),
    new CultureInfo("el-GR"),
};

var MyOptions = new RequestLocalizationOptions()
{
    DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures
};
MyOptions.RequestCultureProviders = new[]
{
     new RouteDataRequestCultureProvider() { RouteDataStringKey = "lang", Options = MyOptions }
};

services.AddSingleton(MyOptions);