こちらの続きです。
ファイル間リンクの取得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"関数では、スタックトレースを利用し、自身を呼び出したプロパティ名を
取得し、辞書から該当する文字列を引っ張り出しています。
"スタックトレース"を検索すると、例外処理やデバッグでの利用としての記述が多数見つかる
のですが、このような使い方は一度しか見たことありませんでしたね。