私はWindowsアプリケーションを開発していて、ラベル、ラジオボタン、ボタン、チェックボックス、グリッドの列ヘッダーのすべてのテキストを1か所に保存したいと考えています。クラスファイル、xmlファイル、データベーステーブル、リソースファイルを使用してみました。
クラスファイルがこれらすべてのテキストを保存するための最良の方法であることがわかりましたが、別の方法があることを知りたいですか?クラスファイルを使用している場合、テキストが変更された場合はプロジェクトを再コンパイルする必要があります。
リソースファイルは、大量のデータに対して適切に機能しますか?辞書や変数へのデータの保存はどうですか?
要するに:リソースのローカライズ(静的ラベル、テキストなどのさまざまなタイプ)のように聞こえます。一般的に言って、リソースファイルの内容の変更は、アプリケーションの再構築を必要としません。
classesにリソースを格納するdis-advantageは、それぞれの変更が/ modificationには、win-formアプリケーションの再構築が必要です。
リソースファイルは大量のデータに対して適切に機能しますか?
制限はオペレーティングシステムのファイルサイズの制限であり、32ビットシステムでは4 GBです(正しく覚えている場合)。 64ビットの場合はさらに大きくなるはずです。とにかく、静的テキストを保存するためには、それで十分です。
したがって、私の意見では、テキストが静的になる場合、これを他の場所で行うべきではありません。
代替アプローチは、リソースファイルへのアクセスを制御するクラスを作成します。このクラスは、リソースファイルにアクセスするためのキーを格納するために使用される場合があり、プロジェクトの使用可能なリソースを取得するための厳密に型指定された方法を持っています。
ローカリゼーションとリソースに関するSE回答に関する参考資料:
[〜#〜] msdn [〜#〜]からの参照:
私はあなたがそれをすべてほとんど言及したと思います。
再コンパイルする必要がない柔軟なものが必要な場合は、DBが最適なオプションとなる場合があります。
しかし、これが標準なので、それ以外の場合は.resxを使用します。
クラスファイル内にテキストを保存することは、かなり悪い考えです。
C#では、リソースファイル(XMLファイル)を使用する方がほぼ確実です。これには次の利点があります。
.resx形式のほかに、.txtまたは.restextファイルを使用することもできます。これらのファイルは、より単純な(読みやすく編集しやすい)形式です。
デスクトップアプリ用のリソースファイルの作成 (「テキストファイル内のリソース」セクションを参照)
形式は基本的にname = value
、コメントと条件付きコンパイルを使用する機能。
別のオプションは、必要なソースまたはテキストファイルを使用して、バイナリ.resourcesファイルを手動で、またはビルドステップの一部としてビルドすることです。 (上のリンクの「.resroucesファイル内のリソース」を参照してください)。
どちらの方法でも、これらをプロジェクトに組み込んでコンパイルする作業が少し増えますが、どちらも.resxファイルのように複数の言語をサポートできるという利点があります。
以前に同様の要件があり、リソースを.resxファイルに格納しましたが、キーを格納するためにクラスを使用することにしました。
たとえば、銀行の引き出し画面のリソースがあるとします。
私は次の行に簡単なクラスを作成しました
public class BankingWithdrawalResource
{
public string WithdrawFunds { get; set; }
}
次に、リソースを取得するためのクラスを実装しました。私の目的は、強く型付けされた方法でリソースを引き出すことでした。また、リソース検索ユニットをテスト可能にしたいと考えました。リソースを取得するためのインターフェースを抽出しました:IResource
。
リソースを使用するたびに、IoCコンテナーを介して実装を取得しました。
var resource = Dependency.Resolve<IResource>();
最後に、リソースを使用することになると、次のようになります。
resource.For<BankingWithdrawalResource>(p => p.WithdrawFunds)
上記の行では、利用可能なすべてのリソースをインテリセンスで表示できるようにするラムダ式を使用しました。
単体テストになると、私はIResource
をモックして期待を立てます。
例えば:
resourceMock.Expect(a => a.For<BankingWithdrawalResource>(p => p.WithdrawFunds)).Repeat.Once();
また、リソース取得用のインターフェースを抽出したことにも注意してください。このため、リソースを好きな場所に保存できるようになりました。例えば:
public class DatabaseResource : IResource
{
// Logic to retrieve resources from database
// Won't cause recompilation
}
public class XmlResource : IResource
{
// Logic to retrieve resources from xml files
}
public class DefaultResource : IResource
{
// Will cause recompilation as resources are stored in .resx
}
上記はメモ帳で頭の上から書いたので、何か問題がありましたらお知らせください。後で実装を追加します。
このCodeProjectウォークスルーに続いて同様のことを実行しました: link
これは、さまざまな言語を使用するためにプロジェクトに追加できるリソースファイルに複数の簡単に更新可能なテキストファイルを作成するためのものです(私の場合、コンボボックスで、リソースファイルを作成するのと同じ数の言語間で変更できます)
.resxファイルよりも優れている点は、フォームごとに言語ごとに1つを設定する代わりに、プロジェクトごとに言語ごとに1つしか設定できないことです。
他に考えるべきこと
Portable Object(.po) は非常に人気があり、.NETの世界以外では標準となっています。いくつかのC#プロジェクトで使用されているのを見ました(例 https://github.com/OrchardCMS/OrchardCore/tree/d729a2048a4390380d99e7be9f7968ff8f8e9271/src/OrchardCore/OrchardCore.Localization.Core )。公式のサポートはありませんが、形式はそれほど複雑ではなく、いくつかのライブラリがあります: https://github.com/neris/NGettext
形式はXMLに基づいていないため、.resxよりも間違いなく単純です。あなたもそれのための多くのツールを持っています。 pootle、poeditなど...
別のオプションは、JSON/YAML/TOMLのような単純な(またはカスタム)形式、またはKey=Value
のようなファイル命名規則を持つプレーンテキストでLocale.{languagecode2-country/regioncode2}
のような単純な形式を使用することです。次に、それをアセンブリのリソースとして埋め込むことができます:)しかし、既存のツールを使用するには、独自の翻訳ツール、またはpo/resxとの間の変換ツールを考え出す必要があります。
それ以外は、.resxが公式の方法であり、最初の選択肢です。ツールもまともです: https://github.com/tom-englert/ResXResourceManager