2011-12-01 3 views
0

-EDIT 2- 내 대답을 확인하십시오. I에 유래에 대한 질문을 중지해야, 난 항상 나중에 몇 분 :C# 지역화가 작동하지 않습니다.

을 알아낼 I (물론, 약, 상단의 감지 및 모든 포함)에 다음 코드를 가지고 :

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"의 두 파일이 있습니다. 둘 다 "임베디드 리소스"로 설정됩니다. 코드를 컴파일 할 때 "Library.resources.dll"파일과 함께 "fr-CA"라는 폴더가 생깁니다. 어느 것이 완전히 괜찮습니까.

누구든지 내 코드가 작동하지 않는 이유를 알고 있습니까? 나는 어디에서나 영어 문자열을 얻는다.

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

실행중인 문화는 무엇입니까? – Oded

+0

en-CA, fr-CA도 얻으려고합니다. 지역 설정을 감지하고 그에 따라 en-CA 또는 fr-CA로 설정하는 코드 조각이 있습니다. 그 부분은 내 CurrentCulture가 지역 설정에 따라 바뀌기 때문에 잘 작동합니다. 또한 응용 프로그램 옵션에서 재정의 할 수 있습니다. – jValdron

+0

글쎄, 문화가'en-CA'이면, 영어를해야합니다. – Oded

답변

0

내 fr-CA 파일에 내 Ressource ID가 올바르게 설정되지 않았습니다. 내 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

관련 문제