本ブログはアフィリエイト広告を利用しています。

コンソールアプリケーション、クラスライブラリで多言語化対応(ローカライズ)する

resource editor ja プログラミング

以前やったWPFのローカライズはCLI、クラスライブラリでは使用できないので別の方法で実装していきます。

環境

  • .NET 7.0

リソースファイル(resx)を言語ごとに作成する

今回リソースファイルとしてresxで作成していきます。場所はResourcesフォルダを作成しそこに作成します。
ファイル名はLanguage.en.resxとLanguage.ja.resxとします。
Resoucesを右クリック -> 追加 -> 新しい項目 でリソースファイルを選択し作成します。
設定内容は以下の画像の通りです。

resource editor ja
resource editor en

リソースファイルの読み込み

読み込みにはResourceManagerを使用します。
コンストラクタにはリソースのルート名とアセンブリ型を指定します。
以下の例ではルート名はnamespace.リソース格納フォルダ名.リソースファイル名となります。
Resourcesフォルダ配下ではなく、プロジェクト直下にリソースファイルがある場合はnamespace.リソースファイル名を指定してください。
このルート名が間違えているとエラーとなります。(リソースが見つからない場合のエラー 参照)

resouce manager

アセンブリはリソースファイルが含まれるアセンブリを指定します。
基本的には自クラスを指定すればOKですが、リソースファイルが別のアセンブリにあるならばそちらのクラスを指定してください。

※このようにすれば1行で済みますがデバッグ用に複数行に分けて記述しています。
resourceManager.GetString(resourceName, CultureInfo.CurrentUICulture);

using System;
using System.Globalization;
using System.Resources;

namespace ConsoleAppLocalize.localize
{
    internal class LocalizeReader
    {
        private static readonly ResourceManager resourceManager = 
            new ResourceManager("ConsoleAppLocalize.Resources.Language", typeof(LocalizeReader).Assembly);

        public static string GetResourceValue(string resourceName)
        {
            var cultureCode = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;
            // cultureCode = "en";
            var culture = new CultureInfo(cultureCode);
            var val = resourceManager.GetString(resourceName, culture);

            return val;
        }
    }
}

リソースが見つからない場合のエラー

System.Resources.MissingManifestResourceException: 'Could not find the resource "ConsoleAppLocalize.Resource.Language.resources" among the resources "" embedded in the assembly "ConsoleAppLocalize", nor among the resources in any satellite assemblies for the specified culture. Perhaps the resources were embedded with an incorrect name.'

実行

簡単な呼び出し元の処理です。
PCの設定が日本語の場合は”あいうえお”が出力され、英語の場合は”abcde”が出力されます。

namespace ConsoleAppLocalize
{
    internal class ConsoleAppLocalize
    {
        public static void Main(string[] args)
        {
            var val = LocalizeReader.GetResourceValue("resource_key");
            Console.WriteLine(val);
        }
    }
}

関連記事

コメント

タイトルとURLをコピーしました