WPFアプリに多言語システムを実装するための良い方法をお勧めしますか?私が現在使用しているメソッドには、XML、クラス、およびxaml拡張機能が含まれます。ほとんどの場合は正常に機能しますが、動的ラベルまたは動的テキストを一般的に処理する必要がある場合は、追加の作業が必要になります。プログラマーにメインの問題だけで作業させ、langの問題を忘れさせたいと思います。
4 に答える
次の手順を実行します:
1)すべてのString
フラグメントを別のリソース ファイルに配置します。
例: StringResources.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">
<!-- String resource that can be localized -->
<system:String x:Key="All_Vehicles">All Vehicles</system:String>
</ResourceDictionary>
2)各言語のコピーを作成し、それらを (翻訳して) 統合辞書に追加します。作業を容易にするために、国の ISO コードを追加することを忘れないでください。
例App.xaml
:
<Application x:Class="WpfStringTables.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml">
<Application.Resources>
<ResourceDictionary >
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="StringResources.de-DE.xaml" />
<ResourceDictionary Source="StringResources.nl-NL.xaml" />
<ResourceDictionary Source="StringResources.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
文字列を含む最後のリソース ファイルは、コード内のテキスト部分を置き換えるために使用されます。
3a)String
表のテキスト部分を使用します。
例Window1.xaml
:
<Window x:Class="WpfStringTables.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<Button Margin="51,82,108,129" Name="AllVehiclesButton"
Content="{StaticResource All_Vehicles}"/>
</Grid>
</Window>
3b)コードからリソースをロードします ( 経由で設定したくない場合にのみ、このコードを使用してくださいXAML
):
void PageLoad()
{
string str = FindResource("All_Vehicles").ToString();
}
4)アプリケーションの開始時に新しい文化に切り替える:
からのコードスニペットApp.xaml.cs
:
public static void SelectCulture(string culture)
{
if (String.IsNullOrEmpty(culture))
return;
//Copy all MergedDictionarys into a auxiliar list.
var dictionaryList = Application.Current.Resources.MergedDictionaries.ToList();
//Search for the specified culture.
string requestedCulture = string.Format("StringResources.{0}.xaml", culture);
var resourceDictionary = dictionaryList.
FirstOrDefault(d => d.Source.OriginalString == requestedCulture);
if (resourceDictionary == null)
{
//If not found, select our default language.
requestedCulture = "StringResources.xaml";
resourceDictionary = dictionaryList.
FirstOrDefault(d => d.Source.OriginalString == requestedCulture);
}
//If we have the requested resource, remove it from the list and place at the end.
//Then this language will be our string table to use.
if (resourceDictionary != null)
{
Application.Current.Resources.MergedDictionaries.Remove(resourceDictionary);
Application.Current.Resources.MergedDictionaries.Add(resourceDictionary);
}
//Inform the threads of the new culture.
Thread.CurrentThread.CurrentCulture = new CultureInfo(culture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
}
私はWPF Localization Extensionを使用しています。DependencyProperty
これは、あらゆるタイプのonをローカライズする非常に簡単な方法DependencyObject
です。
- 本当に安定した状態です
- のようなバインディングのような書体をサポート
Text = {LocText ResAssembly:ResFile:ResKey}
- .resx-fallback メカニズムで動作します (例: en-us -> en -> 独立したカルチャ)
- 文化強制をサポートします (例: 「これは常に英語でなければなりません」)
- 通常の依存関係プロパティで動作します
- コントロール テンプレートで動作します
- 追加の名前空間なしで XAML で使用できます (本当に :P)。
- コードビハインドで使用して、ローカライズされた値を動的に生成されたコントロールにバインドできます
INotifyPropertyChanged
高度な使用のための道具- 文字列フォーマットをサポート
"this is the '{0}' value"
- 接頭辞と接尾辞の値をサポート (現在は
LocText
拡張子付き) - 生産システムで使用されている (私の広報製品など)
- ランタイムへの言語の切り替えはタイムスライスに影響しません
.resx
すべてのアセンブリの任意のリソース ファイル ( ) で使用できます (実行時に動的に読み込まれるものも)- 初期化プロセスは必要ありません (「xyz を呼び出して特別なローカライズ辞書を登録する」など)
- 設計時に利用可能 (MS Expression Blend、MS Visual Studio 2008 (Normal および SP1)
- 選択した言語の変更は設計時に可能です
TypeConverter
コンバーター ( ) が存在する (拡張LocalizeExtension
)限り、任意のタイプのデータ型をローカライズできます。Text
、upperText
、lowerText
、Image
s、Brush
es、Double
およびのサポートが組み込まれていますThickness
- メモリリークには影響しません
UID
プロパティを手付かずのままにしますSpecificCulture
として使用する を提供しますIFormatProvider
(例:(123.20).ToString(LocalizeDictionary.SpecificCulture) = "123.20"
または"123,20"
)- コードビハインドでリソース値をチェックして取得する機能を提供します
Thread.CurrentCulture
orの文化を変更しませんThread.CurrentUICulture
(簡単に変更できます)
Josh Smithは、このための彼の好ましい方法についての詳細なチュートリアルを作成しました:WPFでの国際化されたウィザードの作成。
大幅な再設計(MVVMソリューション)を示すかもしれませんが、MVVMを使用することは、他の理由でも価値があるようです。
この記事を使用して、リソース ファイルを簡単に使用して多言語 WPF ウィンドウを処理することができました。 http://www.codeproject.com/KB/WPF/WPF_Resx_Localization.aspx 非常にシンプルで効果的なので、チェックしてみてください。