1

私はここでかなり迷っており、ガイダンスが必要です。

言語パックをサポートする Web アプリを構築する必要があります... アイデアは、英語などの既定の言語から開始することです。その後、クライアントは言語パックをダウンロードしてインストールし、既定の言語から選択できます。およびその他のインストール済み言語。問題にパターンはありますか?たぶん、私が研究できる(そして例として取り上げる)オープンソースソフトウェアはありますか?それとも、それに関するいくつかの文献ですか?

Edit1:ここでの考え方は、ユーザーが Web アプリをオンプレミス (またはクラウド IaaS) にデプロイし、利用可能な言語パックをできるだけ多くインストールし、アプリがブラウザーの言語をチェックし、翻訳先の互換性のある言語パックがあるかどうかをチェックするというものです。 ... .Net は、再コンパイルが必要なローカライズされたリソース ファイルを使用して既にそれを行っています...

4

1 に答える 1

2

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();
}  
于 2013-06-21T18:24:36.670 に答える