我在.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意大利语文件
答案 0 :(得分:0)
关于您的resource.resx
和resource.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项目中对其进行引用