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.resx
和 resource.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 项目
中引用
我在 .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.resx
和 resource.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 项目
中引用