.NETアプリ(WPFアプリ)を多言語化(英語版の画面の文言を追加)する手順
Visual Studio 2017 で .NET C# のデスクトップアプリケーションを作っていましたが、英語版を作る必要が出て来ました。アプリを改修する度に、最新のソースを元にして、画面の文言を英語に書き変えるのは大変なので、ローカライゼーションの手法を用いることにしました。
しかし、下の画面のように、x:Static のところで
「メンバー “labelUserLoginName" が認識されないか、アクセスできません。」
というエラーになってしまいますし、画面デザインも表示されなくなってしまいました。

プログラムを色々と変えてみても一向にうまくいかなかったのですが、問題の解決法は、結局、一度ビルドする。これだけでした。
多言語化のための手順を整理しますと…
1. Resources.resx にリソース(名前と値の組み合わせ)を追加
例:名前 = “labelUserLoginName"、値 = “ログイン名"
2. Resources.resx のアクセス修飾子を “Public" に変更
3. ビルド!!(Debug / Release の両方で)
4. xaml の <Window></Window> に次の一行を追加
xmlns:properties="clr-namespace:YourProjectName.Properties"
5. xaml 内で、文字列をリソースに置き換える
<Label Content="{x:Static properties:Resources.labelUserCompanyId}" />
これで、上のエラーは出なくなりますし、画面も、リソース内で定義した文字列で正しく表示されるようになります。
またこの段階で、忘れないうちに、Debug と Release の両方でビルドしておきましょう。片方だけビルドして終わらせてしまうと、後から問題が起こったときに、気付くまでに時間がかかってしまうかもしれません。
英語版のアプリ用に、画面の文言を定義したいときは、
E-1. ソリューションエクスプローラー上で、Propertiesに追加 ⇒ 新しい項目
E-2. リソースファイルを選択し、名前を Resources.en.resx などと変更し、追加
E-3. ソリューションエクスプローラー上で、追加したファイルを Properties 下に移動
E-4. Resources.resx と同じ項目を追加
例:名前 = “labelUserLoginName"、値 = “Login Name"
E-5. 画面のコンストラクタ(xaml.cs内)で、InitializeComponent() の前に次の一行を追加 System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(“en");
この状態で実行すると、画面には “Login Name" と表示されます。
リソースに項目を追加したとき/値(文言)を変更したときは、リビルドすると、画面も更新されます。
参考図書:
.NET デスクトップ アプリケーションのインターナショナリゼーション/ローカライゼーション
WPF アプリの国際化 (多言語対応) と、実行中の動的な言語切り替え(ぐらばくさん)
ディスカッション
コメント一覧
まだ、コメントがありません