GetString 总是return 默认语言资源

GetString always return default language resource

我在 .Net-Core 中有一个微服务,它必须处理 resx 文件中的一些资源,并且 return 它们基于我通过调用 API 提供的文化,所以我会不使用当前线程的文化,但是当我调用方法 GetString(key, culture) 它总是 return 默认语言。 我现在有 2 个 resx 文件:resource.resx 和 resource.it-IT.resx 如果我用 it-IT 区域性字符串调用 api 我总是在 resource.resx 文件而不是 resource.it-IT.resx 文件

resx 文件位于另一个名为 Localization 的项目中

我有一个通用方法,我在其中传递我必须本地化的枚举和存储本地化的文件的类型,然后我编写资源的键并调用 GetString 方法。 我也尝试用

改变当前线程的文化
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(cultureName);
public static string GetDisplayName(this Enum e, Type resourceType, string cultureName)
{
   var rm = new ResourceManager(resourceType);

   var resourceDisplayName = rm.GetString(e.GetType().Name + "_" + e, CultureInfo.CreateSpecificCulture(cultureName));

   return string.IsNullOrWhiteSpace(resourceDisplayName) ? string.Format("[[{0}]]", e) : resourceDisplayName;
 }

我进行了更多调查,当我检查资源管理器时,我有 3 个资源集

resource
resource.it
resource.it-IT

如果我检查这 3 个资源集,我的所有资源都是英文的,资源管理器似乎没有加载 resx 意大利语文件

关于您的 resource.resxresource.it-IT.resx 文件,请检查您的密钥在这两个文件中是否相同。如果您尝试访问的密钥不可用,代码会自动重定向到默认文件 (resource.resx)。

此 link 将有助于完成 Localization and Globalization

的实施

阅读此文后:NetCore Bug我设法解决了我的问题,首先我将我的方法重构为:

 public static string GetDisplayName(this Enum e, Type resourceType, string cultureName)
    {
        var rm = new ResourceManager(resourceType.FullName, resourceType.Assembly);

        var key = $"{e.GetType().Name}_{e}";
        var culture = CultureInfo.CreateSpecificCulture(cultureName);
        var resourceDisplayName = rm.GetString(key, culture);

        return string.IsNullOrWhiteSpace(resourceDisplayName) ? string.Format("[[{0}]]", e) : resourceDisplayName;
    }

然后我从 API 项目中删除了对本地化项目的引用,只将该引用留在另一个项目中,然后从 API 项目

中引用