Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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# 基于URL.NETCore3.0的本地化_C#_Asp.net Core - Fatal编程技术网

C# 基于URL.NETCore3.0的本地化

C# 基于URL.NETCore3.0的本地化,c#,asp.net-core,C#,Asp.net Core,我想获得基于url的视图本地化,而不是基于浏览器文化 “/account/leadregistrationstep/de”将显示不带翻译的视图。要获得翻译,浏览器区域性必须与视图相匹配(这是可行的) 有没有一种方法可以在不需要浏览器文化与资源文件匹配的情况下获得翻译?我希望德语视图仅显示德语 启动配置服务 services.Configure<RequestLocalizationOptions>( options =>

我想获得基于url的视图本地化,而不是基于浏览器文化

“/account/leadregistrationstep/de”将显示不带翻译的视图。要获得翻译,浏览器区域性必须与视图相匹配(这是可行的)

有没有一种方法可以在不需要浏览器文化与资源文件匹配的情况下获得翻译?我希望德语视图仅显示德语

启动配置服务

            services.Configure<RequestLocalizationOptions>(
            options =>
            {
                var supportedCultures = new List<CultureInfo>
                {
                    new CultureInfo("en"),
                    new CultureInfo("de"),
                    new CultureInfo("nl"),
                    new CultureInfo("fr")
                };

                options.DefaultRequestCulture = new RequestCulture(culture: "nl", uiCulture: "nl");
                options.SupportedCultures = supportedCultures;
                options.SupportedUICultures = supportedCultures;

                options.RequestCultureProviders.Insert(0, new QueryStringRequestCultureProvider());
            });

有三个默认的RequestCultureProvider,其中包括:AcceptLanguageHeaderRequestCultureProvider,它使用浏览器标题作为区域性信息。您需要覆盖列表,而不是将QueryStringRequestCultureProvider插入其中,从而删除AcceptLanguageHeaderRequestCultureProvider

options =>
    {
        var supportedCultures = new List<CultureInfo>
        {
            new CultureInfo("en"),
            new CultureInfo("de"),
            new CultureInfo("nl"),
            new CultureInfo("fr")
        };

        options.DefaultRequestCulture = new RequestCulture(culture: "nl", uiCulture: "nl");
        options.SupportedCultures = supportedCultures;
        options.SupportedUICultures = supportedCultures;

        options.RequestCultureProviders = new List<IRequestCultureProvider>
        {
            new QueryStringRequestCultureProvider(),
            new CookieRequestCultureProvider()
        };
    }
options=>
{
var supportedCultures=新列表
{
新文化信息(“en”),
新文化信息(“de”),
新文化资讯(“nl”),
新文化信息(“fr”)
};
options.DefaultRequestCulture=新的RequestCulture(区域性:“nl”,uiCulture:“nl”);
options.SupportedCultures=SupportedCultures;
options.supportedCultures=supportedCultures;
options.RequestCultureProviders=新列表
{
新建QueryStringRequestCultureProvider(),
新CookiierRequestCultureProvider()
};
}
这将只使用一个集cookie,或querystring?culture=fr。。。选择区域性

但是,如果需要自定义规则,则需要实现自己的RequestCultureProvider。这是一个例子:

public class UrlRequestCultureProvider : RequestCultureProvider
{
    public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
    {
        var validCultures = new []{"en", "de", "fr", "nl"};
        if (httpContext == null)
        {
            throw new ArgumentNullException(nameof(httpContext));
        }

        var culture = httpContext.Request.Path.Value
                        .Split("/")
                        .FirstOrDefault( (p) => validCultures.IndexOf(p.ToLower()) >= 0);

        if (culture == null)
        {
            return Task.FromResult((ProviderCultureResult)null);
        }

        return Task.FromResult(new ProviderCultureResult(culture));
    }
}
公共类UrlRequestCultureProvider:RequestCultureProvider
{
公共覆盖任务确定ProviderCultureResult(HttpContext HttpContext)
{
var validCultures=new[]{“en”、“de”、“fr”、“nl”};
if(httpContext==null)
{
抛出新ArgumentNullException(nameof(httpContext));
}
var culture=httpContext.Request.Path.Value
.拆分(“/”)
.FirstOrDefault((p)=>有效培养基.IndexOf(p.ToLower())>=0);
if(区域性==null)
{
返回Task.FromResult((ProviderCultureResult)null);
}
返回Task.FromResult(新ProviderCultureResult(区域性));
}
}

正确的方法是什么?我需要一个特定的类来处理这个问题吗?如果你需要自定义规则,那么你需要实现你自己的RequestCultureProvider,但是如果你只想使用QueryStringRequestCultureProvider,那么我发布的代码就足够了。?culture=fr。。。是问路哦,我的错。这也适用于我的代码。。我正在寻找一个解决方案,我不需要通过文化。文化应为视图的语言,因此/de应仅显示德语等。。
public class UrlRequestCultureProvider : RequestCultureProvider
{
    public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
    {
        var validCultures = new []{"en", "de", "fr", "nl"};
        if (httpContext == null)
        {
            throw new ArgumentNullException(nameof(httpContext));
        }

        var culture = httpContext.Request.Path.Value
                        .Split("/")
                        .FirstOrDefault( (p) => validCultures.IndexOf(p.ToLower()) >= 0);

        if (culture == null)
        {
            return Task.FromResult((ProviderCultureResult)null);
        }

        return Task.FromResult(new ProviderCultureResult(culture));
    }
}