C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

ファイル間リンクの取得5

こちらの続きです。
ファイル間リンクの取得4 - C#ATIA
業務と業務の改善の合間にやっているので、中々進展してません。

CATIA.StartCommandを利用する事になる為、まずこちらで言語判定を行います。
C#でお手軽に言語判定を行いたい2 - C#ATIA
(言語判定はCatLanguageクラスを作成し,各関数はPublicにしました)
言語を取得後、必要な文字を取得しておく必要があるため、以下の
クラスを作成しました。

//cs
    //言語別文字コンテナ
    //現状 日本語、英語しか対応していない
    //対応言語を増やしたい場合は、StringDicの各配列部分に追記
    class CatStringContainer {
        public CatStringContainer(CatLanguage.LanguageType Lang) {
            Language = Lang;
        }
        public CatLanguage.LanguageType Language { get; private set; }
        //言語別メッセージ辞書
        private Dictionary<string, string[]> StringDic = new Dictionary<string, string[]>() {
            {"CommonTxt",new string[]  { "リンク...", "Links..." }},
            {"DialogTitle",new string[]  { "ドキュメントのリンク", "Links of document" }},
            {"ErrNotLinkFile",new string[]  { "このファイルはリンクを持っていません!", "Activefile does not have a link!" }},
            {"ErrNotSaveFile",new string[]  { "一度保存してください!", "Please save once!" }},
        };

        public string CommonTxt { get { return GetLanguageMessage(); } }
        public string DialogTitle { get { return GetLanguageMessage(); } }
        public string ErrNotLinkFile { get { return GetLanguageMessage(); } }
        public string ErrNotSaveFile { get { return GetLanguageMessage(); } }

        //呼び出されたプロパティ名からメッセージを取得
        private string GetLanguageMessage() {
            var CallingProperty = new System.Diagnostics.StackTrace(1, false).GetFrame(0).GetMethod();
            var CallingPropertyName = CallingProperty.Name.Substring(CallingProperty.Name.IndexOf("_") + 1);
            return StringDic[CallingPropertyName].GetValue((int)Language).ToString();
        }
    }

判定した言語を引数とするコンストラクタを用意。
必要な文字列は、プロパティとして呼び出すと判定された言語別に取得できる
ようにしました。(エラーメッセージなんかもついでに・・・)

このクラスは何度も書き直し、自分としてはそこそこ納得できるものになりました。
"StringDic" は、プロパティ名をキーとし該当する文字列を配列として保持させた辞書です。
現在は日本語と英語しか考えていませんが、フランス語等対応する言語を増やしたい際は、
各項目を追記するだけで、拡張できるようになっています。(そうしたかったんです)

このクラスのキモは、"GetLanguageMessage"関数です。 例えばStartCommandで
利用するコマンド名を取得するCommonTxtプロパティは、最初このようにしていました。

//cs
public string CommonTxt { get { return StringDic["CommonTxt"].GetValue((int)Language).ToString(); } }

CommonTxtプロパティ内に、辞書から引っ張り出す為に "CommonTxt" を記入しなく
てはなりませんでした。C#的にはかなりイケテ無い感じです。
"GetLanguageMessage"関数では、スタックトレースを利用し、自身を呼び出したプロパティ名を
取得し、辞書から該当する文字列を引っ張り出しています。

"スタックトレース"を検索すると、例外処理やデバッグでの利用としての記述が多数見つかる
のですが、このような使い方は一度しか見たことありませんでしたね。