【问题标题】:ASP.NET Core localization from unique JSON resource来自唯一 JSON 资源的 ASP.NET Core 本地化
【发布时间】:2017-08-01 14:05:17
【问题描述】:

我正在开发一个 ASP.NET Core (.NETCoreApp 1.1) Web 应用程序,该应用程序具有多个视图(包括部分共享的视图)和需要本地化的控制器。

限制是本地化字符串位于具有以下结构的单个 JSON 文件中(只要保留在一个文件中即可更改):

{
  "HELLO": {
    "en": "Hello!",
    "fr": "Bonjour !"
  }
}

所以我想我需要的是本地化来访问这个独特的文件并提供我可以在我的控制器和视图中使用的IStringLocalizerIViewLocalizer 对象,例如_localizer["HELLO"],显然这不是默认模式。

为了增加难度,我还需要能够在默认情况下自动检测浏览器中的首选语言,或者明确地将语言作为路由值,例如 /en/Home/Index 或 /fr/Home/索引也是 /Home/Index。

我对 ASP.NET Core 非常陌生,即使有文档和各种示例实现位或我需要的东西,我也无法实现可以在生产中使用的任何可靠的东西。我遇到的所有东西要么缺少某些东西,要么已经过时了。

如果有了解这些事情的人能告诉我如何做到这一点,我将不胜感激!

编辑:我想我已经想出了如何从路线或浏览器中获取语言(如果路线中没有任何内容)。这是我所做的:

我的路由模板是template: "{lang?}/{controller=Home}/{action=Index}/{id?}"),这是我用来从控制器获取语言的代码:

string lang = this.RouteData.Values["lang"] as string;
if (lang == null)
{
    string userLangs = HttpContext.Request.Headers["Accept-Language"].ToString();
    lang = userLangs.Split(',').FirstOrDefault();
}

【问题讨论】:

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


    【解决方案1】:

    关于使用 Json 文件,我采用了此代码 here,然后将其修改为使用单个文件。在 LocalizerUtil 类中,ExpandPathIterator 我只返回“Resources\Localisation”;它非常粗糙,但这意味着我可以为每种语言创建一个 json 文件。它不会在一个文件中执行嵌套语言,但我相信您也可以进一步修改它来做到这一点。

    我们采用了将语言选择存储在 cookie 中并允许用户通过下拉菜单交换语言的方法。

    Startup.cs

    // Add localization
    services.AddJsonLocalization(opts => { opts.ResourcesPath = "Resources"; });
    
    // Add framework services.
    services.AddMvc().AddViewLocalization().AddDataAnnotationsLocalization();
    
    services.Configure<RequestLocalizationOptions>(options =>
            {
                var supportedCultures = new List<CultureInfo>
                {
                    new CultureInfo("en"),
                    new CultureInfo("fr"),
                };
    
                options.DefaultRequestCulture = new RequestCulture("en");
                // Formatting numbers, dates, etc.
                options.SupportedCultures = supportedCultures;
                // UI strings that we have localized.
                options.SupportedUICultures = supportedCultures;
            });
    

    然后结合使用thisthis 博客文章来使语言切换器正常工作。如果您想使用 url 方案,博客文章也会涉及到这一点。

    【讨论】:

    • 谢谢。这就是我害怕的答案......过去两天我一直在努力解决问题,但无法实现我所需要的。我明天再试一次,也许我会有某种顿悟。
    • @albator1932 stackoverflow.com/a/44782669/909809 可能有助于使平面文件正常工作。我打算采用平面文件路线,因为让所有单词彼此相邻更有意义,因此一切都保持同步,但由于缺乏示例,我现在只解决了多个文件。
    • 哦,我不敢相信我错过了这个,我马上试试。当我有一些工作时,我会做一个完整的工作示例来分享,我无法相信做这个有多难。
    • 我很想就如何在stackoverflow.com/questions/43615912/… 上插入这些东西寻求更多帮助,但在我拥有 50 个声望之前我无法发表评论...
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 2011-09-22
    • 2017-01-06
    相关资源
    最近更新 更多