【问题标题】:C# localization not workingC# 本地化不起作用
【发布时间】:2012-10-12 21:17:52
【问题描述】:

-EDIT 2- 想通了,检查我的答案。我应该停止在 StackOverflow 上提问,我总是会在几分钟后弄清楚:)

我有以下代码(嗯,大致上,带有检测和顶部的所有内容):

Manager = new ResourceManager("EM250.Localization.Application", 
                              Assembly.GetExecutingAssembly());

// CurrentCulture being fr-CA in this case
return Manager.GetString(Key, CurrentCulture); 

因此,我使用自己制作的自定义类来管理本地化资源。

我有两个文件,一个名为“Application.resx”,另一个名为“Application.fr-CA.resx”。两者都设置为“嵌入式资源”。当我编译我的代码时,我得到一个名为“fr-CA”的文件夹,其中包含文件“Library.resources.dll”。这完全没问题。

有人知道我的代码为什么不起作用吗?我到处都有英文字符串。

请注意,这不是一个 ASP.NET 项目,而是一个实际的 WinForms 项目。

-EDIT- 可能应该发布其余代码,这是我的应用程序的初始化:

        String LocaleLoad;

        if(Configuration.GetString("Language") == null)
        {

            // Detect which if the computer is set in french.
            switch(System.Threading.Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName)
            {
            case "fr":
                LocaleLoad = "fr-CA";
                break;

            default:
                LocaleLoad = "en-CA";
                break;
            }

        }
        else
        {

            LocaleLoad = Configuration.GetString("Language");

        }

        // Initialize the localization class.
        Localization.Initialize(LocaleLoad);

这是我的本地化课程:

    /// <summary>
    /// Initialize the culture info with the specific culture.
    /// </summary>
    /// <param name="Culture">The culture to load.</param>
    public static void Initialize(string Culture)
    {

        CultureInfo NewCulture = new CultureInfo(Culture);

        if(!(Localization.CurrentCulture == null || CurrentCulture.TwoLetterISOLanguageName == NewCulture.TwoLetterISOLanguageName))
        {

            CurrentCulture = NewCulture;

            Thread.CurrentThread.CurrentCulture = NewCulture;
            Thread.CurrentThread.CurrentUICulture = NewCulture;

            OnCultureChanged();

        }

        Thread.CurrentThread.CurrentCulture = NewCulture;
        Thread.CurrentThread.CurrentUICulture = NewCulture;

        CurrentCulture = NewCulture;

        foreach(Language Lang in ListLanguages)
        {
            if(Lang.DisplayName == CurrentCulture.NativeName)
            {
                CurrentLanguageValue = Lang;    
            }
        }

        Manager = new ResourceManager("EM250.Localization.Application", Assembly.GetExecutingAssembly());

    }

    /// <summary>
    /// Get a single entry from the ressource file.
    /// </summary>
    /// <param name="Key">The value to get from the ressource file.</param>
    public static string GetString(string Key)
    {

        return Manager.GetString(Key, CurrentCulture);  
    }

【问题讨论】:

  • 你在执行什么文化?
  • en-CA,也尝试获取 fr-CA。我有一段代码可以检测区域设置并相应地将其设置为 en-CA 或 fr-CA。这部分效果很好,因为我的 CurrentCulture 会根据我的区域设置而变化。我在我的应用程序选项中获得了覆盖,这也有效。
  • 好吧,如果文化是en-CA,那么你应该会英语。
  • 好吧,我使用 en-CA 执行我的应用程序,但正如我所说,我的选项中有一个覆盖,无论如何都会将 CurrentCulture 设置为 fr-CA。我确实尝试过调试,并且我的 CurrentCulture 设置得很好。就像没有正确找到fr-CA文件一样。

标签: c# winforms localization


【解决方案1】:

如果手动设置你的文化,不要忘记设置 CurrentUICulture:

Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-CA");

之后,检索到正确的资源。

【讨论】:

    【解决方案2】:

    我的资源 ID 没有为我的 fr-CA 文件正确设置。我的 en-CA 文件设置为“EM250.Localization.Application.resources”,fr-CA 为“Library.Localization.Application.fr-CA.resources”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-20
      • 2012-12-11
      • 2012-12-30
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      相关资源
      最近更新 更多