簡體   English   中英

使用ResourceManager和Reflection獲得正確的翻譯

[英]Getting correct translation using ResourceManager and Reflection

我有一個使用不同資源文件的Web應用程序:

英語資源

  • CommonResources.resx
  • NightResources.resx(當DayTime == DayTime.Night時使用的資源)
  • DayResources.resx(當DayTime == DayTime.Day時使用的資源)
  • DayTimeResources.resx(NightResources.resx或DayResources.resx的資源)

荷蘭資源

  • CommonResources.nl.resx
  • NightResources.nl.resx(當DayTime == DayTime.Night時使用的資源)
  • DayResources.nl.resx(當DayTime == DayTime.Day時使用的資源)
  • DayTimeResources.nl.resx(NightResources.nl.resx或DayResources.nl.resx的資源)

根據當前語言,可以從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM