是否有内置的类型安全方法来本地化 .NET(核心)应用程序?

Moe*_*eri 5 c# localization asp.net-core

我已经在 .NET(框架和核心)领域工作多年了,我希望将 .NET Framework 应用程序移植到 .NET Core。

在此 .NET Framework 应用程序中,我们有 .resx 文件,其中包含数千个标签,并翻译为 5 种语言。这些 .resx 文件已生成 C# 源代码,使我们能够以类型安全的方式静态访问它们。这样做时会尊重当前的 UI 文化。

当我查找 .NET Core 中的本地化文档(可在此处找到)时,游戏规则发生了巨大变化:

  • 您需要注入 ILocalizer、IHtmlLocalizer 或 IViewLocalizer
  • 根据注入这些本地化程序的位置和方式来搜索资源文件
  • 使用魔术字符串检索标签

我是唯一一个认为这比 .NET Framework 中的内容复杂得多且不必要的人吗?我能理解ILocalizer和朋友们从哪里来的,因为现在一切都需要经过依赖注入。但是魔法弦呢?Resx 文件到处都是?

老实说,.NET Core 的底层机制一直给我留下了深刻的印象,但本地化方面却让我完全不知所措。有没有人可以针对这个问题提供可靠、有效的解决方案?拥有类型安全标签可能是我的第一要求。

提前致谢!

编辑:这是具有更好格式的赏金消息:

我正在寻找 C# 本地化解决方案

  • 提供每个应用程序有一个 resx 文件的选项(或者至少,每个控制器/视图/...不是一个 resx 文件)
  • 提供编译时安全性,因此我的应用程序不会因资源键之一的拼写错误而在运行时崩溃/行为不当
  • 添加新标签时有一个最小的反馈循环(例如,将标签添加到 .resx 文件,这会立即更新生成的 C# 代码,现在该标签可以立即在我的其他 C# 代码中使用,而无需先构建整个应用程序)
  • 不是一个 hacky 解决方法

如果这些要求的唯一解决方案是现有的 .resx 工作流程,那么我也会接受来自官方文档的权威答案或来自 Microsoft 内部权威人士的声明,其中明确提到带有生成的 C# 代码的资源文件是可接受的,支持 ILocalizer 故事的替代方案。

小智 1

尽管管理多语言资源的首选方法是使用您提到的那些接口,但您可以继续使用通过.NET Core 创建多语言应用程序的旧风格,方法是拥有多个“resx”文件。但我找不到提到“resx”文件将来将过时的文档。

我创建了一个示例 .Net Core Web api,它使用两个单独的资源文件来提供其字符串。它使用一个参数通过以下代码确定其 Thread.CurrentThread.CurrentUICulture:

    [HttpGet]
    public ActionResult<string> Get(string lang)
    {
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
        return Resource.Test;
    }
Run Code Online (Sandbox Code Playgroud)

正如您在这些图片中看到的,根据我的首选语言,我得到了两种不同的输出。

对于“en”: 在此输入图像描述

对于“fa”: 在此输入图像描述