GetString始终返回默认语言资源

时间:2019-06-17 09:22:08

标签: c# web-services .net-core localization resx

我在.Net-Core中有一个微服务,该微服务必须处理resx文件中的某些资源,并根据我提供给API的调用提供的区域性返回它们,因此我将不使用当前线程的区域性,但是当我调用方法GetString(key,culture)时,它总是返回默认语言。 目前,我有2个resx文件:resource.resx和resource.it-IT.resx如果我使用it-IT文化字符串调用api,我总是在resource.resx文件而不是resource.it中获得翻译。 -IT.resx文件

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

我有一个通用方法,该方法传递要本地化的Enum和存储本地化的文件的类型,然后组合资源的键并调用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个resourceSet

resource
resource.it
resource.it-IT

如果我检查这3个资源集中的所有资源,我的所有资源始终都是英文的,看来资源管理器未加载resx意大利语文件

2 个答案:

答案 0 :(得分:0)

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

此链接将帮助完成Localization and Globalization

的实施

答案 1 :(得分:0)

在阅读以下内容之后: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项目中对其进行引用