1

最近、ローカリゼーションとリソース ファイル (.resx) の使用について多くのことを学んでいます。特定のコードについて、WinForm ごとに .resx (および関連するローカライズされたバージョン .de-DE.resx など) があり、コード用に 2 つ (オブジェクト文字列 [列名など] 用に 1 つ、ユーザー メッセージ用に 1 つ [メッセージボックスなどに表示されるもの])。オブジェクト文字列については何の問題もありませんが、メッセージについては次の問題があります...

メッセージ「"SomeString" を検索 (3 ファイルで 23 件ヒット)」を例にとります。このようなメッセージを作成するには、次のようなコードを使用します

String.Format("\tSearch \"{0}\" ({1} hits in {2} files)\n",
              strSearchString,
              nTotalHits,
              nNumberOfFiles);

問題は"\tSearch \"{0}\" ({1} hits in {2} files)\n"、リソース ファイルに文字列を含めると、実行時に次の出力が得られることです。

\tSearch \"SomeString\" (23 hits in 3 files)\n

明らかに、C# 自体のように文字列リテラルを扱っていません。リソース ファイルに新しい行を作成するにはShift+を使用するReturn必要があることはわかっていますが、タブなどはどうしますか? WordまたはNotepad ++にコピーしてタブを追加し、後でコピーして元に戻すと言わないでください。そうしないと、目を突かれます。

リソース ファイルに含まれる文字列リテラルを、C# によって正しく解釈される実際の文字列リテラルに変換する最良の方法は何ですか?

この種の変換はメッセージでのみ発生することに注意してください。そのため、実行時の変換も検討したいと考えています。

御時間ありがとうございます。

4

1 に答える 1

5

私はあなたが自分の目をつつくのではないかと心配しています。それはまさにあなたがしなければならないことだからです。そして、私もこれにがっかりしています。

次のように、タブを別の項目として含めることができます。

String.Format("{0}Search \"{1}\" ({2} hits in {3} files)\n",
          "\t",
          strSearchString,
          nTotalHits,
          nNumberOfFiles);

テンキーパッドで Alt-012 と入力して、タブを入力することもできます。

string.Replace("\\t", "\t")最後に、文字列を渡す前にstring.Format()「\t」を文字列リソースに挿入することで、自分でタブを「エスケープ」できます。

それはすべて少し物足りないです!(そして、あなたはすでにこれらすべてのアイデアを自分で考えていると確信しています...)

于 2013-03-21T10:38:36.330 に答える