言語切替機能を実装する(デフォルトロケールID連動版)
日本の特定ユーザー向け業務アプリだと日本語オンリーでも十分ですが、海外で販売したり、販売先は国内ですが、国外エンジニアがアプリを使用するというケースがあります。
そういったユーザーの場合、「日本語と英語を切り替えたい」なーんてことをサラッと言われたりします。
そんな時どうすればよいのか?という小技を紹介したいと思います。
基本的には、以下のことを行います。
- 対応する言語の数だけサテライトライブラリを用意する。
- WindowsのOSの言語、またはユーザーに言語を選択させることで、サテライトライブラリの参照先を変更する。
サテライトライブラリとは、DLL形式の言語リソースファイルのことです。
(VisualStudioで生成すると、大体は「~.resources.dll」のような名前で生成されます。)
VisualStudioでC#プロジェクトを生成すると、以下のようなツリーになっていると思います。
[プロジェクト名] Properties AssemblyInfo.cs Resources.resx Settings.settings
上記のツリーの「Resources.resx」がデフォルトのリソースファイルです。
このファイルひとつが言語ひとつ分に相当します。
例えば、英語リソースをデフォルトリソース、日本語をオプションリソースとする場合、「Resources.resx」に英語文字列を記述し、「Resources.ja.resx」に日本語文字列を記述します。
お気付きになられたでしょうか?
つまりは、オプションリソースを追加する場合、Resouces.[ロケールID].resxというファイルを作成し、作成したファイルに言語別の文字列を登録すればよいわけですね。
[プロジェクト名] Properties AssemblyInfo.cs Resources.da.resx ・・・デンマーク語用 Resources.ja.resx ・・・日本語用 Resources.resx ・・・英語用 Settings.settings
ロケールIDとは、Windows内部で定義されている、言語別のID文字列のことです。
詳しくは ロケール ID (LCID) の一覧 を参照してください。
さて、ここまで来たら次は実際にコントロールに表示してみましょう。
ボタンに表示する文字列をサテライトライブラリから取得した場合の例を以下に示します。
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:prop="clr-namespace:[プロジェクト名].Properties" <-! 省略 --> <Button Content="{x:Static prop:Resources.[リソース名]}"/>
はい。簡単です。
[プロジェクト名]と[リソース名]を実際のものに入れ替えるだけで、リソース登録した文字列が使用できます。
これだけで、OSのデフォルトロケールIDと一致するサテライトライブラリを自動で検出して、文字列が入れ替わってくれます!
(あら便利!)
「これで、コンパネの地域と言語で表示を切り替えながらデバッグできる!(≧▽≦)」
なーんて思ってる方。。。残念!!!
ここでWindowsの嫌がらせが発動します。。。
OSのデフォルトロケールIDという単語(私が勝手にネーミング)に注目です。
これは、コンパネの地域と言語では変わりません。
日本語版Windowsとか、中国版Windowsとか、英語版Windowsなんて言葉を聞いたことありませんか?
インストールしたOSの言語によって、システムが出すダイアログの文言が変わるのはご存知でしょうか?
実はこれ、インストールしたOSの言語によって変わります。。。
(私の認識だとこうなんですが、有識者の方、間違ってたらご指摘ください)
「え??ってことは、自分でサテライトライブラリを選べないの?(# ゚Д゚)」
いいえ、そんなことはありません。
TortoiseSVN等、任意の言語に切替できるアプリもちゃんとあります。
次回は、任意に言語切替する方法を紹介したいと思います。