Unix の世界の例は gettext ですが、もう少し現代的なものを探しているに違いありません。
その下部では、文字列を消費するコードを構成して、メンバーを使用して処理/印刷/その他の文字列を読み取る必要がありますthis.mainForm.Title = StringLib.MainFormTitle
。
StringLib は、大量の get/set プロパティを持つ単なる大きな静的クラスになります。
次に、サポートする言語ごとに個別のアセンブリを作成し、langpack.en-US.dll、langpack.it-IT.dll などの名前を付けます。それぞれに 2 つのクラスが含まれます。1 つのクラスをインスタンス化してメタデータを取得します。言語パック (カルチャ、バージョンなど) と、呼び出されたときに StringLib クラスの静的プロパティを入力する別のクラスについて。
実行時に、すべての langpack ファイルを探し、リフレクションを使用してそれらをロードします。リフレクションを使用して言語パックの名前を特定し、それらをリストに表示してユーザーが選択できるようにします。ユーザーが言語パックを選択すると、その時点で言語パックの初期化クラスが呼び出されます。イニシャライザは、StringLib クラスのプロパティを初期化するために大量の呼び出しを行います。
MainApp.csproj で:
public class StringLib {
public static string MainFormTitle { get; set; }
...
}
langpack.en-US.csproj:
public class LangPackDescriptor : ILangPackDescriptor {
public readonly string LangPackName = "American English";
public readonly string CultureString = "en-US";
...
}
public class EnUsLangPackInit : ILangPackInit {
public void Init() {
StringLib.MainFormTitle = "My Application Name"
...
}
}
langpack.it-IT.csproj 内
public class LangPackDescriptor : ILangPackDescriptor {
public static string LangPackName = "Italian";
public string string CultureString = "it-IT";
...
}
public class ItItLangPackInit : ILangPackInit{
public void Init() {
StringLib.MainFormTitle = "Il Nome Del Mio Applicazione"
...
}
}
ファイル名を指定して、リフレクションを使用して初期化します。
public void LoadLang(string filename) {
Assembly langpackAssembly;
ILangPackDescriptor descriptor;
ILangPackInit initializer;
langpackAssembly = Assembly.LoadFrom(filename);
Type[] langpackTypes = langpackAssembly.GetExportedTypes();
foreach( Type foundType in langpackTypes ) {
if ( foundType.GetInterfaces().Contains<Type>( typeof(ILangPackDescriptor) ) ) {
descriptor = Activator.CreateInstance(foundType);
}
if ( foundType.GetInterfaces().Contains<Type>( typeof(ILangPackInit) ) ) {
initializer = Activator.CreateInstance(foundType);
}
}
// If the passed-in file was the langpack.en-US.dll file, then this
// calls langpack.en-US.dll's EnUsLangPackInit.Init() method.
initializer.Init();
}