resxファイルに代わるものは何ですか


9

私はWindowsアプリケーションを開発していて、ラベル、ラジオボタン、ボタン、チェックボックス、グリッドの列ヘッダーのすべてのテキストを1か所に保存したいと考えています。クラスファイル、xmlファイル、データベーステーブル、リソースファイルを使用してみました。

クラスファイルがこれらすべてのテキストを保存するための最良の方法であることがわかりましたが、別の方法があることを知りたいですか?クラスファイルを使用している場合、テキストが変更された場合はプロジェクトを再コンパイルする必要があります。

リソースファイルは、大量のデータに対して適切に機能しますか?辞書や変数へのデータの保存はどうですか?



1
@ sandeep.gosavi-クラスファイルが情報を格納するための最良の方法であり、別の方法を要求したとのことですが、別の方法は、リソースファイルを使用することです。あなたの質問は非常にあいまいであり、あなたの側ではほとんど研究努力を示さない。
ラムハウンド2013

2
@ sandeep.gosavi-だから彼に選択肢を与えなさい。 あなたは「最善の方法」を求めていますが、あなたはすでにそれを持っています。
ラムハウンド2013

1
関連するが重複しない:国際化されたオブジェクトのクラス設計国際化:何を考える必要がありますか?、および.NETでのローカリゼーションのための効果的な戦略。私は投稿が明示的にI18Nを参照していないことを知っていますが、それがアヒルのように
ガタガタなら

1
postoverflow.com/q/18531904/839601のポストをクロスしないでください。スタックオーバーフローの質問は移行された可能性があります。フラグを立てる必要があるだけです。
ChrisF

回答:


5

つまり、リソースのローカライズ(静的ラベル、テキストなどのさまざまなタイプ)のように思えます。一般的に、リソースファイルの内容を変更しても、アプリケーションを再構築する必要はありません

DIS-利点で店舗リソースへのクラスは、それぞれの変更/修正が勝利フォームアプリケーションの再ビルドが必要になるということです。

リソースファイルは、大量のデータに対して適切に機能しますか?

私が正しく覚えていれば、制限はオペレーティングシステムのファイルサイズ制限であり、32ビットシステムでは4 GBだと思います。64ビットの場合はさらに大きくなるはずです。とにかく、静的テキストを保存するためには、それで十分です。

したがって、私の意見では、テキストが静的になる場合は、これ他の場所で行うべきではありません

別のアプローチは、あなたのリソースファイルへのアクセスを制御するためのクラスを作成することでしょう。このクラスは、リソースファイルにアクセスするためのキーを格納するために使用される場合があり、プロジェクトの使用可能なリソースを取得するための厳密に型指定された方法を持っています。

ローカリゼーションとリソースに関するSEの回答の一部:

MSDNからの参照:


1
これらのリソースが何をするのか、そして質問に答える際にこれらをなぜ推奨するのかについて説明していただけませんか?「リンクのみの回答」はStack Exchangeでは歓迎されません
2013

@Yusubov:私はあなたのリンクを通過しました、リソースは良いオプションですが、私は他のオプションを探しています。
sandeep.gosavi 2013

1
答えにはリンクだけではなく、機能する解決策についての提案された意見が含まれています。
Yusubov 2013

@ sandeep.gosavi:IMHO、ソリューションとしてリソースファイルを選択すると、win-formsアプリケーションで機能します。あるいは、外部リソースへのアクセスを制御するクラスを作成することもできます。
Yusubov 2013

@Yusubov:私見とは?
sandeep.gosavi 2013

3

あなたはそれをすべてほとんど言及したと思います。
再コンパイルする必要のない柔軟なものが必要な場合は、DBが最適なオプションになる可能性があります。
しかし、それ以外の場合、これは標準なので、.resxを使用します。
クラスファイル内にテキストを保存することは、かなり悪い考えです。


2

.resx形式のほかに、.txtまたは.restextファイルを使用することもできます。これらのファイルは、より単純な(そして読みやすく編集しやすい)形式です。

デスクトップアプリ用のリソースファイルの作成(「テキストファイル内のリソース」セクションを参照)

形式は基本的name = valueにで、コメントと条件付きコンパイルを使用できます。

別のオプションは、必要なソースまたはテキストファイルを使用して、バイナリ.resourcesファイルを手動で、またはビルドステップの一部としてビルドすることです。(上のリンクの「.resroucesファイル内のリソース」を参照してください)。

どちらの方法でも、これらをプロジェクトに組み込んでコンパイルする作業が少し増えますが、どちらも.resxファイルのように複数の言語をサポートできるという利点があります。


2

C#では、リソースファイル(XMLファイル)を使用する方がほぼ確実です。これには次の利点があります。

  • テキストの変更に対してソリューション全体を再コンパイルする必要がなくなります。
  • 文字列の管理を、コーダー以外の誰かが実行できるようにします(コーダーは、必ずしもユーザーのエラー/情報メッセージを書くのに最適な人ではありません)。
  • かなり簡単なローカリゼーションを可能にします。

では、.resxファイルの代わりとなるものは何でしょうか。
Tohid、2016年

「テキストの変更に対してソリューション全体を再コンパイルする必要がなくなります。」-いいえ、リソースが埋め込まれている場合
Konrad

1

以前に同様の要件があり、リソースを.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
}

上記はメモ帳で頭の上から書いたので、何か問題がありましたらお知らせください。後で実装を追加します。


リソースをクラスに保存することの
欠点

私は少し混乱していますが、私が間違っている場合は修正してください。私が理解したのは、リソースファイルにデータを格納していて、それを取得するためにクラスを使用していることです。
sandeep.gosavi 2013

1
クラスの変更はリソースキーの変更を意味するため、クラスは変更しません。リソースキーを変更する場合は、最初から考えていなかったことを意味します。変更する可能性があるのは、リソースファイル、xmlファイル、またはデータベースの実際のエントリです。これにより、アプリが再コンパイルされます。要件で再コンパイルが許可されていない場合は、私の例のほとんどをそのままにして、アプリを再コンパイルさせないデータベースまたはその他のソース用のリソースプロバイダーを実装します。
CodeART 2013

1
@ sandeep.gosaviリソースキーを格納するためのクラスと、リソースを取得するためのクラスがあります。利点は、リソースを取り出すたびに「マジックストリング」を使用する必要がなくなり、代わりにインテリセンスを介して使用可能なリソースのリストを取得できることです。リソースプロバイダーを簡単に置き換えることもできます(resxからデータベースへ)。最後に、簡単にテストできます。
CodeART 2013

1
はい、分かりました。私は
dotnetの初心者

1

このCodeProjectウォークスルーに続いて、同様のことを行いました:リンク

これは、さまざまな言語を使用するためにプロジェクトに追加できるリソースファイルに複数の簡単に更新可能なテキストファイルを作成するためのものです(私の場合、コンボボックスで、リソースファイルを作成するのと同じ数の言語間で変更できます)

.resxファイルよりも優れている点は、フォームごとに言語ごとに1つを設定する代わりに、プロジェクトごとに言語ごとに1つしか設定できないことです。

他に考えるべきこと


1

ポータブルオブジェクト(.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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.