2010-11-23 19 views
2

多言語ASP.NET MVC 2のWebサイトを構築したいと思います。ASP.NET MVC2ローカリゼーション:言語/国依存テキストの書式設定方法

のは、私は、次の文があるとしましょう:

私のサイト上で今
MyStrings.resx: 
TestString : "This is my test" 

MyStrings.de.resx: 
TestString : "Dies ist mein Test" 

MyStrings.fr.resx: 
TestString : "C'est mon test" 

私は他の色の言葉が私の/焼きそば/月を作りたいです。たとえば、私は他のスパンクラスをasssignしたいと思います。それを行うための最高の/標準的な練習は何ですか?

どうすればいいですか?

答えて

4
  1. あなたは、リソースの中にHTMLを混ぜることができます。リソース:"This is {0}my{1} test"、使用:string.Format(Resources.TestString, "<span class=\"x\">", "</span">)"This is <span class="x">my</span> test"
  2. をあなたはstring.Formatを使用することができます。
  3. いくつかのカスタム書式設定スキームを使用することができます。たとえば、リソース:"This is --my-- test"を入力し、文字列を受け入れる拡張メソッドを書いて、すべて--を正しいタグに置き換えます。

UPDATE
4.カスタムformatメソッドを使用することができます。以下のコードを参照してください。あなたが見ることができるように

Resources.Bla.Bla.FormatWith(new { Firstname = SomeVariable, AMOUNT = 4, currency = "USD" }); 

が、それは大文字小文字を区別しないで、あなたは定数と変数に混在させることができます:

あなたのリソースを使用すると、以下の方法でこのリソースを「消費」でしょうHello {firstname}, you still have {amount} {currency} in your bankaccount.ようになります。私は翻訳者がオリジナルの英語の文字列にあるすべての "変数"を使用しているかどうかをチェックするカスタム翻訳Webアプリケーションを作った。それは私にとって非常に重要な点検です。
私は、反射を使用しているので、この方法はちょっと議論の余地があると付け加えておきますが、賛否両論の長所が重視されています。

public static string FormatWith(this string format, object source) 
    { 
     StringBuilder sbResult = new StringBuilder(format.Length); 
     StringBuilder sbCurrentTerm = new StringBuilder(); 
     char[] formatChars = format.ToCharArray(); 
     bool inTerm = false; 
     object currentPropValue = source; 

     var sourceProps = source.GetType().GetProperties(); 

     for (int i = 0; i < format.Length; i++) 
     { 
      if (formatChars[i] == '{') 
       inTerm = true; 
      else if (formatChars[i] == '}') 
      { 
       PropertyInfo pi = sourceProps.First(sp=>sp.Name.Equals(sbCurrentTerm.ToString(), StringComparison.InvariantCultureIgnoreCase)); 
       sbResult.Append((string)(pi.PropertyType.GetMethod("ToString", new Type[] { }).Invoke(pi.GetValue(currentPropValue, null) ?? string.Empty, null))); 
       sbCurrentTerm.Clear(); 
       inTerm = false; 
       currentPropValue = source; 
      } 
      else if (inTerm) 
      { 
       if (formatChars[i] == '.') 
       { 
        PropertyInfo pi = currentPropValue.GetType().GetProperty(sbCurrentTerm.ToString()); 
        currentPropValue = pi.GetValue(source, null); 
        sbCurrentTerm.Clear(); 
       } 
       else 
        sbCurrentTerm.Append(formatChars[i]); 
      } 
      else 
       sbResult.Append(formatChars[i]); 
     } 
     return sbResult.ToString(); 
    } 
+0

ウェイ1は非常に良いようです。しかし、私は自分自身で特別な文字をエスケープする必要があります:-(これらの3つの方法のうちの1つは、ほぼすべての人がこの問題を解決していますか? – Chris

+0

私は4番目の方法でそれを行います – Gidon

+1

基本的に私の方法はnr2のように見えますが、 "This is {italics} my {enditalics} test"という名前の要素があります。私はオブジェクトを取得するカスタムFormat関数を使い、オブジェクトのプロパティを入力文字列。私にとっては、膨大な量のリソースとそれに取り組んでいる多くの人々がいるため、最良の方法でした。名前付きアイテムを持つことで、理解しやすくなり、混乱を避けることができます。カスタムフォーマット拡張メソッド。私は誰かから取ってきて、少し微調整しました。 – Gidon

関連する問題