2014-09-18 2 views
1

런타임에 양식의 모든 컨트롤 언어를 변경하는 방법이 있습니까?양식의 모든 컨트롤에서 텍스트 언어를 변경하는 방법

예를 들어 양식에 버튼이 있고 "Hello"라는 텍스트가 있습니다. 런타임시 어떻게 다른 언어로 변경할 수 있습니까? 내가 설정할 수있는 모든 언어를 동적으로. 그것을 할 수있는 방법이 있습니까 ??

답변을 찾았지만 작동하지 않는 것 같아서 cultureinfo와 관련이있는 것으로 보입니다. 그것을하는 방법 어떤 제안? 양식에 볼 수 있습니다 컨트롤과 당신이 말할 버튼의 텍스트 또는 변경 런타임에서 필요한 문자열 :

은 변환해야 것의 두 종류가 있습니다 내 코드

public partial class Form1 : BaseLanguageForm 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 



     private void button1_Click(object sender, EventArgs e) 
     { 
      this.TriggerLanguageChange("fr-FR"); 
     } 
    } 
public class LanguageArgs : EventArgs 
    { 
     string _languageSymbol; 
     /// <summary> 
     /// Gets the language symble. 
     /// </summary> 
     public string LanguageSymbol 
     { 
      get { return _languageSymbol; } 
     } 

     /// <summary> 
     /// Initializes a new instance of the <see cref="LanguageArgs"/> class. 
     /// </summary> 
     /// <param name="symbol">The symbol.</param> 
     public LanguageArgs(string symbol) 
     { 
      this._languageSymbol = symbol; 
     } 
    } 
    public class BaseLanguageForm : Form 
    { 
     /// <summary> 
     /// Triggers the language change event. 
     /// </summary> 
     /// <param name="languageSymbol">The language symbol.</param> 
     protected void TriggerLanguageChange(string languageSymbol) 
     { 
      if (Form1.onLanguageChanged != null) 
      { 
       LanguageArgs args = new LanguageArgs(languageSymbol); 
       Form1.onLanguageChanged(this, args); 
      } 
     } 

     /// <summary> 
     /// This should be triggered whenever the combo box value chages 
     /// It is protected, just incase you want to do any thing else specific to form instacne type 
     /// </summary> 
     protected static event EventHandler<LanguageArgs> onLanguageChanged; 

     /// <summary> 
     /// This will be called from your form's constuctor 
     /// (you don't need to do anything, the base class constuctor is called automatically) 
     /// </summary> 
     public BaseLanguageForm() 
     { 
      //registering to the event 
      BaseLanguageForm.onLanguageChanged += new EventHandler<LanguageArgs>(BaseLanguageForm_onLanguageChanged); 
     } 

     /// <summary> 
     /// The function that was regidtered to the event 
     /// </summary> 
     /// <param name="sender">The sender.</param> 
     /// <param name="e">The e.</param> 
     void BaseLanguageForm_onLanguageChanged(object sender, LanguageArgs e) 
     { 
      string lang = e.LanguageSymbol; 
      foreach (Control c in this.Controls) 
      { 
       ComponentResourceManager crm = new ComponentResourceManager(typeof(Form1)); 
       crm.ApplyResources(c, c.Name, new CultureInfo(lang)); 
      } 
     } 

    } 
+1

고전적인 방법 양식의 언어를 변경하는 것입니다. Form 속성입니다.) 이것은 당신이 설정 한 모든 언어에 대한 폼의 복사본을 생성하고 모든 컨트롤을 번역 할 수 있고, 필요하다면 레이아웃을 변경할 수 있습니다. 런타임에 당신이 언어를 변경할 때 다른 폼이 보여 질 것입니다. – TaW

+0

우리에게 보여준 방법이 나에게 맞는 것 같습니다. 하지만 어리석은 질문은 각 요소에 대해 올바른 번역 문자열이있는 리소스 파일이 있습니까? – frikinside

+0

나는 내 질문을 가지고 있지 않다. 나는 어떻게 런타임에 텍스트를 번역 할 수 있는가? – bRaNdOn

답변

3

입니다 등의 메시지 박스의 캡션 ..

당신은 디자이너의 폼에있는 컨트롤을 번역 :

  • 첫 번째는 Laguage = 표준에있는 모든 레이아웃 물건을한다.
  • 그런 다음 속성 탭의 언어를 다른 언어로 변경하십시오.
  • 이제 모든 컨트롤의 모든 텍스트를 번역하십시오.
  • 긴 텍스트를 허용하기 위해 레이아웃을 약간 변경해야 할 수도 있습니다. 이건 괜찮아! 프로젝트 탐색기에서

봐 : 각 양식 및 각 언어에 대한 새로운 FormN.lang.resx 파일이 이제 존재는, 예를 들면 :

Form1.resx 
Form1.en.resx 
Form1.de.resx 

이제 당신은 어쩌면처럼 changeLanguage 함수를 호출 할 때 이 일이 같은 어쩌면

private void ChangeLanguage(Control ctl, string lang) 
{ 
    resources.ApplyResources(ctl, ctl.Name, new CultureInfo(lang)); 
    foreach (Control c in ctl.Controls) ChangeLanguage(c, lang); 
} 

:

private void cb_language_Click(object sender, EventArgs e) 
{ 
    if (cb_language.Text == "DE") 
    { 
     Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE"); 
     resources = new ComponentResourceManager(typeof(Form1)); 
     ChangeLanguage(this, "de-DE"); 
     cb_language.Text = "EN"; 
    } 
    else 
    { 
     Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US"); 
     resources = new ComponentResourceManager(typeof(Form1)); 
     ChangeLanguage(this, "en-US"); 
     cb_language.Text = "DE"; 
    } 
} 

. 모든 보이는 컨트롤이 텍스트를 바꿉니다. 당신에게 그런

strings.resx 
strings.de.resx 
strings.en.resx 

: Add new element - resource file이 같은 이름을 가진 :

할 두 번째 것은 문자열 리소스 파일, 최고의 표준 다른 하나는 각 언어에 대한 하나를 (! 표준 값을 반복) 만드는 것입니다

msgCap_OW   File Exists 
msgTxt_OW   Overwrite (Yes) 
        Use next free Index? (No) 
        Cancel? 
cb_autoScrapeStart Start Timed Screenshots 

참고 : 당신이 코드에 필요한 각 문자열, 예를 들어 하나의 이름 - 값 쌍을 추가하려면 여러 값을 입력 할 수있는 값 필드에 변화가 입력하여 ..

,

마지막으로 문자열 리소스를 사용하도록 코드를 변경해야합니다 (예 : 같은 :

MessageBox.Show(strings.msgTxt_OW, strings.msgCap_OW, ..); 

나 :

cb_autoScrape.Text = (scrapeTimer.Enabled ? 
         strings.cb_autoScrapeStop : strings.cb_autoScrapeStart); 
+0

지시 사항을 수행하려고 시도했지만 많은 오류가 나타납니다. – bRaNdOn

+0

해당 오류에 대해 알려주십시오 – TaW

+0

코드에이 리소스가 있습니다. = 새 ComponentResourceManager (typeof (Form1)); 자원이란 무엇입니까? – bRaNdOn

관련 문제