2011-12-01 70 views
0

-EDIT 2-找出它,检查我的答案。我应该停止问StackOverflow上的问题,我总是搞清楚一两分钟后:)C#本地化不起作用

我有以下代码(当然,大致与检测,一切都在顶部):

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项目。

CNC中或许应该张贴的代码的其余部分,这是我的应用程序的初始化:

 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); 
    } 
+0

你在执行哪种文化? – Oded

+0

en-CA,也试图获得fr-CA。我有一段代码检测区域设置并相应地将其设置为en-CA或fr-CA。这部分效果很好,因为我的CurrentCulture根据我的区域设置而变化。我的应用程序选项中有一个覆盖,这也适用。 – jValdron

+0

那么,如果文化是'en-CA',那么你应该得到英语。 – Oded

回答

0

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

2

如果手动设置你的文化不要别忘了设置CurrentUICulture:

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

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

+0

查看我编辑的问题 – jValdron