2010-11-23 4 views
2

Ich möchte eine mehrsprachige ASP.NET MVC 2-Website erstellen.ASP.NET MVC2-Lokalisierung: Wie formatiert Sprache/Land abhängiger Text?

Lassen Sie uns sagen, dass ich die folgenden Sätze haben:

MyStrings.resx: 
TestString : "This is my test" 

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

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

Jetzt auf meiner Seite ich die Worte, um meine/mein/mon in einer anderen Farbe machen wollen. Zum Beispiel möchte ich eine andere Spannklasse zuordnen. Was ist die beste/gängige Praxis, um das zu tun?

Wie kann ich das tun?

Antwort

4
  1. Sie könnten HTML-Code in Ihre Ressource mischen: "This is <span class="x">my</span> test"
  2. Sie string.Format verwenden: Ressource: "This is {0}my{1} test", Verwendung: string.Format(Resources.TestString, "<span class=\"x\">", "</span">).
  3. Sie könnten ein benutzerdefiniertes Formatierungsschema verwenden: Zum Beispiel resource: "This is --my-- test", und schreiben Sie eine Erweiterungsmethode, die eine Zeichenfolge akzeptiert, und ersetzen Sie alle -- durch die richtigen Tags.

UPDATE
4. Sie können benutzerdefinierte Format-Methode verwenden. Siehe Code unten.

Ihre Ressource könnte wie Hello {firstname}, you still have {amount} {currency} in your bankaccount. aussehen Sie würden „verbrauchen“, diese Ressource in der folgenden Art und Weise:

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

Wie Sie sehen können, ist es Groß- und Kleinschreibung ist, und Sie können in Konstanten und Variablen mischen. Ich habe eine benutzerdefinierte Übersetzungsweb-App erstellt, in der ich überprüfe, ob der Übersetzer alle "Variablen" verwendet, die in der ursprünglichen englischen Zeichenfolge vorhanden sind. Das ist meiner Meinung nach ein ziemlich wichtiger Test.
Lassen Sie mich hinzufügen, dass dieser Weg ein wenig umstritten ist, da es Reflexion verwendet, aber ich finde, dass die Profis schwerer als die Nachteile wiegen.

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

Weg 1 scheint sehr gut. Aber dann muss ich mich darum kümmern, dass ich auf eigene Faust entkommen kann :-(Ist einer dieser drei Wege "Standard", wie fast jeder dieses Problem löst? – Chris

+0

Ich mache es auf einem 4. Weg, ich füge es hier hinzu – Gidon

+1

Grundsätzlich sieht mein Weg wie Nr. 2 aus, aber mit benannten Elementen wie "Dies ist {kursiv} mein {enditalienischer} Test." Ich benutze eine benutzerdefinierte Formatfunktion, die ein Objekt abruft und die Eigenschaften des Objekts auf das Objekt anwendet Für mich war es der beste Weg, denn ich habe eine riesige Menge an Ressourcen und viele verschiedene Leute arbeiten an ihnen. Nachdem ich Gegenstände benannt habe, hilft es ihnen zu verstehen und verhindert, dass sie Dinge vermischen. Wenn du willst, kann ich posten die benutzerdefinierte Formaterweiterungsmethode, die ich von jemandem übernommen habe, und kleinere Verbesserungen vorgenommen habe – Gidon

Verwandte Themen