Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.Net核心:从控制器设置默认区域性_C#_Asp.net Core_Asp.net Core Webapi_Asp.net Core Localization - Fatal编程技术网

C# ASP.Net核心:从控制器设置默认区域性

C# ASP.Net核心:从控制器设置默认区域性,c#,asp.net-core,asp.net-core-webapi,asp.net-core-localization,C#,Asp.net Core,Asp.net Core Webapi,Asp.net Core Localization,我正在尝试在我的ASP.Net核心Web API项目中设置本地化 我做了一些研究,了解到有一个带有预定义的请求区域性提供程序的本地化中间件(在我的情况下,这是不可接受的),所以我需要编写一个定制的请求区域性提供程序,比如 public class CustomCultureProvider : RequestCultureProvider { public override async Task<ProviderCultureResult> ChangeCulture(Htt

我正在尝试在我的ASP.Net核心Web API项目中设置本地化

我做了一些研究,了解到有一个带有预定义的请求区域性提供程序的本地化中间件(在我的情况下,这是不可接受的),所以我需要编写一个定制的请求区域性提供程序,比如

public class CustomCultureProvider : RequestCultureProvider
{
    public override async Task<ProviderCultureResult> ChangeCulture(HttpContext httpContext)
    {
        // Return a culture...
        return new ProviderCultureResult("en-US");
    }
}
公共类CustomCultureProvider:RequestCultureProvider { 公共重写异步任务更改区域性(HttpContext HttpContext) { //返回一个文化。。。 返回新ProviderCultureResult(“en US”); } }
我不明白的是如何从控制器更改区域性,也就是说,当调用端点时。

下面是一个asp.net core 3.x的工作演示,它可以切换三种语言来显示响应:

1.自定义
路由数据请求文化提供者

public class CustomRouteDataRequestCultureProvider : RequestCultureProvider
{
    public int IndexOfCulture;
    public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
    {
        if (httpContext == null)
            throw new ArgumentNullException(nameof(httpContext));
        string culture = null;


        var twoLetterCultureName = httpContext.Request.Path.Value.Split('/')[IndexOfCulture]?.ToString();

        if (twoLetterCultureName == "de" )
            culture = twoLetterCultureName;
        else if (twoLetterCultureName == "fr")
            culture = twoLetterCultureName;
        else if(twoLetterCultureName =="en")
            culture = twoLetterCultureName;

        if (culture == null)
            return NullProviderCultureResult;          

        var providerResultCulture = new ProviderCultureResult(culture);

        return Task.FromResult(providerResultCulture);
    }
}
结果:
以下是asp.net core 3.x的一个工作演示,它可以切换三种语言以显示响应:

1.自定义
路由数据请求文化提供者

public class CustomRouteDataRequestCultureProvider : RequestCultureProvider
{
    public int IndexOfCulture;
    public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
    {
        if (httpContext == null)
            throw new ArgumentNullException(nameof(httpContext));
        string culture = null;


        var twoLetterCultureName = httpContext.Request.Path.Value.Split('/')[IndexOfCulture]?.ToString();

        if (twoLetterCultureName == "de" )
            culture = twoLetterCultureName;
        else if (twoLetterCultureName == "fr")
            culture = twoLetterCultureName;
        else if(twoLetterCultureName =="en")
            culture = twoLetterCultureName;

        if (culture == null)
            return NullProviderCultureResult;          

        var providerResultCulture = new ProviderCultureResult(culture);

        return Task.FromResult(providerResultCulture);
    }
}
结果:

为什么标准本地化中间件不适用于您?@Neil Cookies和浏览器标题不是一个选项,我也不希望客户端应用必须在每个请求中附加区域性代码。我想启用一次性更改区域性。浏览器必须发送一些有关用户的信息,否则您如何知道为每个请求选择哪个区域性?@Neil当然会发送一些信息,但我不想从浏览器在请求中自动发送的数据中检索区域性信息,而是明确地从对我定义的端点的调用中检索区域性信息。@Eutherpy,但您正在使用本地化中间件。自定义区域性提供程序仅用于使用您自己的规则指定区域性,以便中间件的其余部分可以工作。您不应该关心何时调用本地化中间件。那么你的规则是什么?
改变控制器的区域性是什么意思?这不是一个规则,这就是你如何看待更改的方式。为什么标准本地化中间件不适合你?@Neil Cookies和浏览器头不是一个选项,我也不希望客户端应用必须在每个请求中附加文化代码。我想启用一次性更改区域性。浏览器必须发送一些有关用户的信息,否则您如何知道为每个请求选择哪个区域性?@Neil当然会发送一些信息,但我不想从浏览器在请求中自动发送的数据中检索区域性信息,而是明确地从对我定义的端点的调用中检索区域性信息。@Eutherpy,但您正在使用本地化中间件。自定义区域性提供程序仅用于使用您自己的规则指定区域性,以便中间件的其余部分可以工作。您不应该关心何时调用本地化中间件。那么你的规则是什么?
改变控制器的区域性是什么意思?这不是一条规则,这是你认为改变会怎样做的。
[Route("{culture?}/api/[controller]")]
public class ValuesController : Controller
{
    private readonly IStringLocalizer<ValuesController> _localizer;

    public ValuesController(IStringLocalizer<ValuesController> localizer)
    {
        _localizer = localizer;
    }
    // GET: api/<controller>
    [HttpGet]
    public IActionResult Get()
    {
        return new ObjectResult(_localizer["Hi"]);
    }
}