2009-06-08 23 views
20

私が現在行っているプロジェクトでは、特別なフォーマットの文字列をサードパーティのサービスに送って処理する必要があります。そして私はそうのような文字列を構築しています:フォーマット文字列をリソースに格納する必要がありますか?

string someString = string.Format("{0}{1}{2}: Some message. Some percentage: {3}%", token1, token2, token3, number); 

むしろその後、私はプロジェクトのリソースにそれを移動することを考えていた文字列をハードコード:

string someString = string.Format(Properties.Resources.SomeString, token1, token2, token3, number); 

目のオプションは、私の意見であります最初のものと同じように読みやすいものではありません。すなわち、コードを読んでいる人は、最終結果がどのように見えるかを調べるために文字列リソースをプルアップする必要があります。

どうすればこの問題を回避できますか?この場合、ハードコードされた書式文字列は必要不可欠ですか?

答えて

14

私はこれが必要な悪であると思います。私は頻繁に使用しました。私が行うことを臭い何かが、次のとおりです。少なくとも..at

// "{0}{1}{2}: Some message. Some percentage: {3}%" 
string someString = string.Format(Properties.Resources.SomeString 
            ,token1, token2, token3, number); 

コードは、私はそれが他の人が見た恥ずかしいかもしれないことを十分に安定するまで。

+5

をuseingてる途中で私を毎回

を動的にメッセージを与えたか

String.Format(Resource_en.PhoneNumberForEmployeeAlreadyExist,letterForm.EmployeeName[i]) 

見ることができますリソースファイルにパラメータが何であるかを説明するコメントを追加します。ファイルが翻訳に移行した場合、これはローカライザーにとって非常に便利です。 –

+0

@ CodeMonkey:合意しました。できるだけローカライゼーションエンジニアの人生を楽にしてください。翻訳の推測を望まない。 –

+1

@MichaelPetrotta>これらの{0}文字列が不要になるように、コードをどのように安定させますか?私は個人的に 'string.Format'を使わないことを考えていますが、' 'begin {middle} end" .Replace( "{middle}"、middle) 'を使います。このアプローチには独自の問題があります... – Laoujin

2

私は、なぜプログラム内の書式文字列を含むのが悪いのか分かりません。伝統的な文書化されていないマジックナンバーとは異なり、一見すると明らかに分かります。もちろん、フォーマット文字列を複数の場所で使用している場合は、冗長性を避けるために適切な読み取り専用変数に格納する必要があります。

私はそれをリソースに保持することはここで間接的に間接的であることに同意します。例外として、プログラムをローカライズする必要があり、リソースファイルを使用してローカライズしている場合があります。

+0

痛みはありますが、ローカリゼーションにはほとんどの場合リダイレクションが不可欠です。私はソフトウェアローカリゼーションのフェンスの反対側で働いてきました。信頼してください。コードを私たちに送ってはいけません。または、変更をコードにマージしてみてください。 –

+0

はい、しかしgettext形式のローカリゼーションでは、元の文字列をコードに保存しながら、ポット(テンプレート)ファイルのみをトランスレータに送ることができます。したがって、リソースファイルだけではありません。 –

15

これを行う理由はいくつかありますが、唯一の理由は、アプリケーションを別の言語にローカライズする場合です。

リソース文字列を使用している場合は、注意すべきことがいくつかあります。

  1. 可能な限り、ローカライズしたいリソース文字列のセットに可能な限りフォーマット文字列を含めます。これにより、翻訳者は、書式設定された項目の位置を並べ替えることで、翻訳されたテキストの文脈の中でよりよく適合させることができます。

  2. あなたの言語で書かれた書式のトークンを使用しないようにしてください。数字の場合は を使用する方が良いです。例えば、メッセージ:

    が大きい{0}及び{1}は、5と10のような数字をフォーマットされている場合ならば、「あなたは、指定された値は{0}と{1}の間でなければなりません」 "5"や "10"のような文字列では、これはローカリゼーションを困難にするでしょう。

  3. リソースの名前を簡単に指定することで、読みやすさの問題を解決することができます。

    string someString = string.Format(Properties.Resources.IntegerRangeError、minValue、maxValue);

  4. コードの右の抽象度レベルでユーザーが表示する文字列を生成しているかどうかを評価します。一般的に私はユーザーインターフェイスにできるだけ近いコードですべてのユーザーの表示文字列をグループ化する傾向があります。いくつかの低レベルのファイルI/Oコードがエラーを提供する必要がある場合は、アプリケーションで処理する例外とそれに対する一貫したエラーメッセージでこれを行う必要があります。これにより、ローカライゼーションを必要とする文字列がコード全体に盛り込まれるのではなく、すべての文字列が統合されます。あなたは、リソースファイルに文字列を追加するスピードアップしても、ハードコードされた文字列を追加したり、助けるために行うことができます

3

ことの一つは、あなたが無料ここでダウンロードすることができますのCodeRush Xpressの使用することです:http://www.devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/

をあなたが書いたら、あなたの文字列を使用すると、CodeRushメニューにアクセスして、単一ステップでリソースファイルに抽出できます。非常に素晴らしい。

Resharperはsimilar functionalityです。

+0

それはほとんど長期的な解決策ではありません。あなたのコードを訪問するときにあなたのコードは 'Properties.Resources.SomeString'nnnで満たされます** **変換の後、メンテナンス中のように – MickyD

+0

このコメントはかなり古いものでした。しかし、 'Properties.Resources.SomeString'は、その時点でC#プロジェクトの文字列にアクセスし、外部プロセスのresources.dllをローカライズする方法が正しいことです。バイナリファイルを直接ローカライズする必要はないので、リソースファイル内のテキストをキーにする必要があります。 –

1

そうすることができます enter image description here

新しいが、この意志は私もあなたがすべきResXManager

関連する問題