リソース | 対象データ | 格納時の型 |
---|---|---|
文字列 | 文字列 | String |
イメージ | .bmp、.jpgなどのイメージファイル | Bitmap |
アイコン | .icoファイル | Icon |
オーディオ | .wav、.mp3などのサウンドファイル | byte[] |
ファイル | 上記以外のファイル | ファイルのFileTypeによって異なる
|
その他 | 文字列シリアル化をサポートするその他のデータ |
ローカライズのためにリソースで管理すべき文字列は、コード分析のCA1303「ローカライズされたパラメーターとしてリテラルを渡さないでください (Do not pass literals as localized parameters)」で検出できます。
C#では、Visual Studioでプロジェクトのプロパティを開き、それの[リソース]タブから各種のリソースを追加できます。方法 : リソースを追加または削除する | MSDN
そのとき[リソースの追加]右の矢印からドロップダウンを開くか、このリソースのウィンドウへファイルをドロップすることで、既存のファイルを追加できます。
プロジェクトに追加したリソースは、プロジェクトのResourcesディレクトリに置かれます。そのとき既存のファイルを追加したならば、それがコピーされて置かれます。
既存のリソースを追加した場合、プロジェクトに格納されるのはそれのコピーです。よってリソースを編集するときは、プロジェクト内のResourcesディレクトリにあるファイルを編集します。
Resources.resxを開くと、そのリソース ファイルがリソース エクスプローラーで表示されます。
リソース エクスプローラーでファイルを追加すると、「error MSB3103: ResX ファイルが無効です。パス '***\Project\Properties\Resources\sample.txt' の一部が見つかりませんでした。」としてエラーとなることがあります。これはパスが誤っているためで、実際にはProject\Resources\sample.txtの位置に配置されます。
格納方法 | リソースファイルに格納される情報 |
---|---|
リンクリソース (Linked Resources) |
ファイルへのリンク [既定]
(コンパイル時にリンク先からデータが取得され、アプリケーションのマニフェストに格納される) |
埋め込みリソース (Embedded Resources) |
ファイルの内容をバイナリデータとして表したテキスト |
リソースファイル (.resx) への格納方法は、リソースの[Persistence]プロパティから変更できます。それにはプロジェクトのプロパティの[リソース]タブで対象のリソースを選択し、メニューの【表示 → プロパティ ウィンドウ】からプロパティを表示します。
テキストと認識されないテキストファイルは、byte配列で格納されます。これはリソースのプロパティ ウィンドウで、[FileType]をTextとすることで解消できます。
またテキストのエンコーディングが設定と一致していないと文字化けするため、プロパティの[Encoding]を確認します。このエンコーディングの指定はProperties\Resources.Designer.csでのリソースの定義の<summary>に反映され、Properties\Resources.resxでのリソースへのリンクの末尾に;shift_jis</value>
のように設定されます。
filename.ja-JP.resxのように、BCP 47 (RFC 4646) の文字列を拡張子の前に付加してファイルを作成します。そうするとプロジェクトをビルドしたときにja-JP\project_name.resources.dllの名前で、リソースの情報が格納されたファイルが作成されます。
実行時にそのカルチャがja-JPならば、このファイルがja-JPのフォルダ内に配置されていることで読み込まれます。どのカルチャが用いられるかは、CurrentThread.CurrentUICultureによって決定されます。
Visual Studioでリソースを追加すると、プロジェクトの名前空間にResourcesクラスが自動で生成されます。
/// <summary> /// ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。 /// </summary> [global::System.CodeDom.Compiler.GenedratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { /// <summary> /// ABC に類似しているローカライズされた文字列を検索します。 /// </summary> internal static string String1 { get { return ResourceManager.GetString("String1", resourceCulture); } }
そしてそのリソースは、そのクラスのプロパティを介して取得できます。
string string1 = Namespace.Properties.Resources.String1; // 文字列 Bitmap bitmap1 = Namespace.Properties.Resources.Image1; // イメージ string textFile1 = Namespace.Properties.Resources.TextFile1; // ファイル
VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.Header.SortArrow.SortedUp); renderer.DrawBackground(e.Graphics, new Rectangle(0, 0, 100, 10));VisualStyleElement.Header.SortArrow クラス (System.Windows.Forms.VisualStyles) | Microsoft Learn
フォーム (Form1) にボタン (button1) を配置してLocalizableをtrueとすると、次のようなリソースファイルが作成されます。
名前 | 値 |
---|---|
$this.Text | Form1 |
>>$this.Name | Form1 |
>>$this.Type | System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 |
>>button1.Name | button1 |
>>button1.Parent | $this |
>>button1.Type | System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 |
>>button1.ZOrder | 0 |
button1.Text | button1 |
この実体はXMLで、次のように記述されます。
<?xml version="1.0" encoding="utf-8"?> <root> ... <data name="$this.Text" xml:space="preserve"> <value>Form1</value> </data> <data name=">>$this.Name" xml:space="preserve"> <value>Form1</value> </data> ... <data name=">>button1.Name" xml:space="preserve"> <value>button1</value> </data> <data name=">>button1.Parent" xml:space="preserve"> <value>$this</value> </data> ... <data name="button1.Text" xml:space="preserve"> <value>button1</value> </data> </root>
フォームのLanguageを日本語 (ja) としてボタンのTextを"ボタン1"とすると、次のようなリソースファイルが作成されます。
名前 | 値 |
---|---|
button1.Text | ボタン1 |
この実体はXMLで、次のように記述されます。
<?xml version="1.0" encoding="utf-8"?> <root> ... <data name="button1.Text" xml:space="preserve"> <value>ボタン1</value> </data> </root>