2011-08-09 3 views
12

각 문화권의 리소스 파일에 따라 런타임에 문화권을 변경해야합니다.런타임시 CurrentCulture를 변경하는 방법은 무엇입니까?

나는 파일

resorces1.aspx.resx // default 
resorces1.aspx.he-IL.resx // hebrew culture 

나도 대체 자원으로 페이지를로드, 또는 pageload주고에 수의 .resx 지정된 한 두 문화 에 따라, 내 양식의 컨트롤의 속성을 변경해야 UICulture = "he-IL" 값이고 원하는 리소스로 잘로드됩니다.

문제는 런타임에 이러한 변경을해야한다는 것입니다. 내가 버튼을 클릭 이벤트에 값을 변경 한 후

1 .. 그것은 여전히 ​​"EN-US"의 초기 값으로 반환

btn_change_Click(....) 
    { 
     UICulture = "he-IL" ; 
    } 

는 어떻게 UICulture의 변경을 커밋 할 수 런타임에?

2 .. 예를 들어 "en-US"를 모르는 경우 대체 리소스 파일을 어떻게 참조 할 수 있습니까?

System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("he-IL"); 

이상은 그가-IL 문화의 캐시 된 읽기 전용 인스턴스를 검색 : 현재의 UI 문화 변경

답변

36

실행시

System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("he-IL"); 

을, ASP.NET CurrentUICulture 속성 설정에 가장 적합한 리소스 파일을 사용합니다. 스레드의 UI culture는 페이지의 UI culture에 따라 설정됩니다. 예를 들어 현재 UI culture가 스페인어 인 경우 ASP.NET은 WebResources.es.resx 파일의 컴파일 된 버전을 사용합니다. 현재 UI 문화권과 일치하는 것이 없으면 ASP.NET은 리소스 대체를 사용합니다. 먼저 특정 문화권의 리소스를 검색합니다. 그것들을 사용할 수 없다면 중립적 문화를위한 자원을 찾는다. 이러한 파일이 없으면 ASP.NET에서 기본 리소스 파일을로드합니다. 이 예제에서 기본 리소스 파일은 WebResource.resx입니다.

+0

확인 공공 문자열 getLabelResource (문자열 sLabelID, 문자열 sLangCd는) 그래서 내가 어떻게이 기본 문화를 다시 그것을 바꿀 것 내가 CurrentUICulture 을 변경 말할 수 나는 그것이 무엇인지 모른다고 가정한다. –

+0

기본 문화권은 대체 문화입니다. 그것은 컴파일 시간에 맞습니까? 그것은 resorces1.aspx.resx의 문화, 아마 엉 - 미국 .. 만약 내가 두 번째 질문을 오해하지 않는 한 당신은 지금 어떻게 런타임에 문화를 변경하는 방법을 알고 고려하고 쉽게 보인다 : – maxbeaudoin

+0

예, 아픈 그냥 저장 페이지를로드 할 때 이름. 나는 전에 생각하지 않았다 감사합니다. –

0

최대는 아무것도 내가 전에 건너하지 않은 옳은 길에 저를 설정하지만, 내가이 문제에 MSDN 설명서에 약간의 조정을 도와 않았다

http://msdn.microsoft.com/en-us/library/bz9tc508.aspx

string defaultLanguage = Thread.CurrentThread.CurrentUICulture.ToString();       
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected override void InitializeCulture() 
    { 
     if (Request.Form["ListBox1"] != null) 
     { 
      String selectedLanguage = Request.Form["ListBox1"]; 
      UICulture = selectedLanguage; 
      Culture = selectedLanguage; 

      Thread.CurrentThread.CurrentCulture = new CultureInfo(selectedLanguage); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage); 
     } 
     else 
     { 
      Thread.CurrentThread.CurrentCulture = new CultureInfo(defaultLanguage); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(defaultLanguage); 
     }    
     base.InitializeCulture(); 
    } 

목록 상자에는 다른 문화권이 포함되어 있습니다. 첫 번째와 선택된 하나는 기본 문화권이며, 다른 문화권에서는 페이지로드시 저장됩니다.

0

작동하려면 여기에 설명 된대로 "대체"를 가져올 수 없습니다. 언어에 대한 글로벌 리소스 파일을 사용하고 있는데 사용자가 선택한 culture 파일에서 레이블이 누락 된 경우 기본 문화권의 레이블로 다시 설정되지 않습니다. 대체 방법을 만들었습니다. 나는 문화를 임시 변통시키는 더 좋은 방법을 찾고 있었는데 (라벨을 찾을 수 없을 때),이 게시물에 비틀 거리며 나는 어떤 내용을 가지고 있다고 생각했다.내 유틸리티 클래스에서

: {

 cLogger oLogger = new cLogger(); 

     try 
     { 
      Object sLabel; 
      sLabel = HttpContext.GetGlobalResourceObject("{filename}", sLabelID); 
      if (sLabel.ToString() == "") //label was not found in selected lang 
      { 
       //default to US language resource label 
       Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 
       sLabel = HttpContext.GetGlobalResourceObject("{filename}", sLabelID); 
       //switch global lang back to selected 
       Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(sLangCd); 
      } 
      return sLabel.ToString(); 

     } 
     catch (Exception ex) 
     { 
      oLogger.LogWrite("cUtils.cs", "getLabelResource", ex.Message, false); 
      return String.Empty; 
     } 
    } 
+0

g ... 덕분에 2 년 전에 답변되었습니다 :) –