2012-12-17 3 views
4

사용자가 여러 언어 중에서 선택할 수있는 소프트웨어를 만들고 싶습니다.SharpDevelop 4.2에서 국제화 된 WPF 프로젝트를 시작하는 방법은 무엇입니까?

처음에는 Internationalization을 처리하는 방법을 배우고 싶습니다.

IDE에서는 SharpDevelop 또는 #develop를 사용하지만 맞춤법을 지정합니다. 저는 XAML/WPF를 지금 배우고 있기 때문에 C#과 WPF를 사용하고 싶습니다.

그래서 ShardDevelop에서 새 WPF 프로젝트를 만듭니다. 주 창에서 ComboBox 및 TextBlock을 만듭니다.

ComboBox는 "독일어"와 "영어"의 두 항목을 가져옵니다. textBlock에 "Hallo Welt!"가 표시되어야합니다. 또는 "Hello World!"를 선택합니다.

이제 막 붙어있는 부분이 있습니다. 각 언어는 XML/XAML 스타일 (의미가 있음)로 별도의 파일을 얻습니다. 이 파일들은 어디에 있으며, 선택한 언어의 텍스트가로드되도록 파일과 내용이 어떻게로드됩니까?

몇 가지 예를 발견했지만 모두 Resource-DLL을 만들고 이상한 프로그램을 사용하여 CSV 파일로 다시 디 컴파일 한 경우 ... 더 쉽게 얻을 수있는 방법이 아닌가요?


나는 다음 단계를 밟았다. TextBlock의 텍스트가 이제 "{StaticResource Strings.MainForm.hwText}"를 통해로드됩니다. 그것은이 지금과 같습니다

<TextBlock Text="{StaticResource Strings.MainForm.hwText}" /> 

또한 내가 독일에 대해 하나 개있는 ResourceDictionary를 만들어 모두가 내가 TextBlock의 사용되는 키를 정의 영어 하나.

Application.Resources 파트에서 기본값 당 ResourceDictionary 중 하나를로드합니다.

문제는 다음과 같습니다. 런타임 중에이 사전을 "언로드"하고 다른 것과 바꾸려면 어떻게합니까?

물론 ComboBox의 SelectionChange-Event를 사용하지만 그곳에서 무엇을합니까?


문제가 해결되었습니다. 난 내 필요에 이벤트 처리기의 약간의 코드를 변경하지만 덕분에

을 kmatyaszek합니다 :

Uri baseUri = new Uri(AppDomain.CurrentDomain.BaseDirectory); 
Uri uri = new Uri(baseUri,"Languages\\lang."+((sender as ComboBox).SelectedItem as ComboBoxItem).Tag.ToString()+".xaml"); 
if(File.Exists(uri.LocalPath) || File.Exists((uri = new Uri(baseUri,"Languages\\lang.de-DE.xaml")).LocalPath)){ 
    ResourceDictionary dict = new ResourceDictionary(); 
    dict.Source = uri; 
    this.Resources.MergedDictionaries.Add(dict); 
} 
+0

나는 SharpDevelop에 대해 모르지만 VS에서는 정말 쉽게 .resx 파일을 만들 수 있습니다. 속성 창에서 현지화를 설정할 수 있습니다. 어쩌면 SharpDevelop에는 유사한 것이있다. –

+0

tipp에 감사드립니다. :) –

+0

당신이 그것을 알게되면 찾는다. –

답변

6

당신이 DynamicResource으로 결합 할 수있는 두 ResourceDictionary에 파일을 생성합니다.

예 :

우선 리소스 파일 (Lang.en-US.xaml)

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:system="clr-namespace:System;assembly=mscorlib"> 

    <system:String x:Key="Username">Username:</system:String> 
    <system:String x:Key="Password">Password:</system:String> 
    <system:String x:Key="close">Close</system:String> 
    <system:String x:Key="login">Login</system:String>   
</ResourceDictionary> 

2 자원 파일 (PL-Lang.pl.XAML) : 응용 프로그램 자원

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:system="clr-namespace:System;assembly=mscorlib"> 

    <system:String x:Key="Username">Login:</system:String> 
    <system:String x:Key="Password">Hasło:</system:String> 
    <system:String x:Key="close">Zamknij</system:String> 
    <system:String x:Key="login">Zaloguj</system:String> 
</ResourceDictionary> 

설정 기본 언어는 :

<Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Lang.en-US.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
</Application.Resources> 

은의 우리는 다음과 같은 콤보를한다고 가정 해 봅시다 :

<ComboBox Name="cbLang" Margin="2" SelectionChanged="cbLang_SelectionChanged" > 
       <ComboBoxItem Content="English" Tag="en-US" /> 
       <ComboBoxItem Content="Polish" Tag="pl-PL" /> 
    </ComboBox> 

인 selectionchanged 숨김 코드 :

private void cbLang_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
     { 
      ResourceDictionary dict = new ResourceDictionary(); 

      switch (((sender as ComboBox).SelectedItem as ComboBoxItem).Tag.ToString()) 
      { 
       case "en-US": 
        dict.Source = new Uri("Lang.en-US.xaml", UriKind.Relative); 
        break; 
       case "pl-PL": 
        dict.Source = new Uri("Lang.pl-PL.xaml", UriKind.Relative); 
        break; 
       default: 
        break; 
      } 
      this.Resources.MergedDictionaries.Add(dict); 
     } 

그리고 bindi ng이 같은 :

<TextBlock Text="{DynamicResource Username}" VerticalAlignment="Center" /> 
+0

대단히 고마워! 그것은 정말로 작동한다! –

+0

내가 잘못 했습니까? '(String) Application.Current.FindResource ("Username")'은 (<사용자 이름>의 경우)''에 설정된 기본값을 항상 가져옵니다. 어떤 충고? – Boern

+0

@Ben은 예제 솔루션을 준비하고 예를 들어 스카이 드라이브? – kmatyaszek

관련 문제