[英]Getting correct translation using ResourceManager and Reflection
我有一個使用不同資源文件的Web應用程序:
根據當前語言,可以從CommonResources.resx或CommonResources.nl.resx中讀取大多數資源。 沒問題
一些資源是有條件的。 在運行時,從數據庫中讀取值“ DayTime”。 此值確定必須使用哪些資源,即DayResources或NightResources。 我認為我使用:
@DayTimeResources.Orb
當DayTime == DayTime.Day時,必須顯示“ sun ”。 當DayTime == DayTime.Night時,必須顯示“ moon ”
當當前語言是荷蘭語,並且DayTime == DayTime.Day時,必須顯示“ zon ”。 當DayTime == DayTime.Night時,必須顯示“ maan ”
我找到了解決方案。 通過反射,我在運行時更改了類DayTimeResources的資源文件(我在視圖中使用了它)。
這是我的測試應用程序的代碼:
public class MvcApplication : System.Web.HttpApplication
{
private const string LanguageCode = "nl-NL";
private const DayTime CurrentDayTime = DayTime.Day;
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
SetCurrentUserLanguage();
ReplaceResourceFile(typeof(DayTimeResources), CurrentDayTime == DayTime.Day ? typeof(DayResources) : typeof(NightResources));
}
private void SetCurrentUserLanguage()
{
CultureInfo cultureInfo = new CultureInfo(LanguageCode);
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
}
private void ReplaceResourceFile(Type originalType, Type replaceType)
{
FieldInfo fieldInfo = originalType.GetField("resourceMan", BindingFlags.NonPublic | BindingFlags.Static);
if (fieldInfo != null)
{
ResourceManager resourceManager = new ResourceManager(replaceType.FullName, replaceType.Assembly);
//ResourceSet resourceSet = resourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
fieldInfo.SetValue(null, resourceManager);
}
}
在很大程度上,這是可行的。 當DayTime == DayTime.Day時顯示“ 太陽 ”,而當DayTime == DayTime.Night時顯示“ 月亮 ”。
不幸的是,當我將當前(UI)語言更改為荷蘭語時,它仍然顯示“ sun ”或“ moon ”,而不顯示翻譯(“ zon ”或“ maan ”)。
任何想法如何解決這個問題?
引人注目的:當我用以下命令查看新創建的ResourceManager的資源集時
ResourceSet resourceSet = resourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
它包含翻譯。
對於“條件資源問題”,也許有更好的解決方案。 我真的很想聽聽。
(是的,我知道您可以訪問如下資源:
ResourceNamespace.ResxFileName.ResourceManager.GetString("ResourceKey");
但這不是我想要的)
謝謝
我發現了問題。 我確實使用反射更改了資源管理器,但是我也不得不更改了CultureInfo。 使用以下工作:
public class MvcApplication : System.Web.HttpApplication
{
private const string LanguageCode = "nl-NL";
private const DayTime CurrentDayTime = DayTime.Night;
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
SetCurrentUserLanguage();
ReplaceResourceFile(typeof(DayTimeResources), CurrentDayTime == DayTime.Day ? typeof(DayResources) : typeof(NightResources));
}
private void SetCurrentUserLanguage()
{
CultureInfo cultureInfo = new CultureInfo(LanguageCode);
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
}
private void ReplaceResourceFile(Type originalType, Type replaceType)
{
FieldInfo fieldInfo = originalType.GetField("resourceMan", BindingFlags.NonPublic | BindingFlags.Static);
ResourceManager resourceManager = new ResourceManager(replaceType.FullName, replaceType.Assembly);
fieldInfo.SetValue(null, resourceManager);
fieldInfo = originalType.GetField("resourceCulture", BindingFlags.NonPublic | BindingFlags.Static);
fieldInfo.SetValue(null, CultureInfo.CurrentUICulture);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.