2016-07-02 21 views
1

Ich erstelle eine .NET Web App mit lokalisierten Zeichenfolgen, die vom Multilingual App Toolkit bereitgestellt werden. Es generiert eine statische Klasse mit Eigenschaften, die wie in der Ressourcendatei definiert sind. Es sieht wie folgt aus:Zugriff auf benutzerspezifische lokalisierte Ressourcen

/// <summary> 
/// A strongly-typed resource class, for looking up localized strings, etc. 
/// </summary> 
// This class was auto-generated by the StronglyTypedResourceBuilder 
// class via a tool like ResGen or Visual Studio. 
// To add or remove a member, edit your .ResX file then rerun ResGen 
// with the /str option, or rebuild your VS project. 
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 
internal class Strings { 

    private static global::System.Resources.ResourceManager resourceMan; 

    private static global::System.Globalization.CultureInfo resourceCulture; 

    [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 
    internal Strings() { 
    } 

    /// <summary> 
    /// Returns the cached ResourceManager instance used by this class. 
    /// </summary> 
    [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 
    internal static global::System.Resources.ResourceManager ResourceManager { 
     get { 
      if (object.ReferenceEquals(resourceMan, null)) { 
       global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FaqBot.Resources.Strings", typeof(Strings).Assembly); 
       resourceMan = temp; 
      } 
      return resourceMan; 
     } 
    } 

    /// <summary> 
    /// Overrides the current thread's CurrentUICulture property for all 
    /// resource lookups using this strongly typed resource class. 
    /// </summary> 
    [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 
    internal static global::System.Globalization.CultureInfo Culture { 
     get { 
      return resourceCulture; 
     } 
     set { 
      resourceCulture = value; 
     } 
    } 

    /// <summary> 
    /// Looks up a localized string similar to Good Morning. 
    /// </summary> 
    internal static string Greeting { 
     get { 
      return ResourceManager.GetString("Greeting", resourceCulture); 
     } 
    } 

    /// <summary> 
    /// Looks up a localized string similar to Welcome. 
    /// </summary> 
    internal static string Welcome { 
     get { 
      return ResourceManager.GetString("Welcome", resourceCulture); 
     } 
    } 
} 

In dem Code, wo ich die Saiten greifen, ich die Kultur setzen kann, und nachfolgende Zugriffe auf die String-Eigenschaften, die korrekt lokalisierten Strings zurück.

Jetzt hat meine Web App die Option, den Benutzer ihre Sprache wählen zu lassen, und ich habe einen Mechanismus zum Speichern dieser Einstellung. Da die Strings-Datei jedoch statisch ist, werden die nachfolgenden Strings für die anderen Benutzer ebenfalls geändert, wenn ein Benutzer die Sprache ändert. Eine Möglichkeit, dies zu umgehen, wäre, die Kultur explizit vor jedem String-Zugriff zu setzen, aber dies würde zu Race Conditions und hässlichem Code führen.

Wie kann ich jedem Benutzer Antworten in seiner bevorzugten Sprache geben lassen, ohne die Kultur explizit vor jedem String-Zugriff zu setzen?

Antwort

1

Eine Möglichkeit wäre zu tun, damit sein, ein neues HttpModule erstellen:

public class LocalizationModule : IHttpModule 
{ 
    public void Dispose() 
    { 
    } 

    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += new EventHandler(context_BeginRequest); 
    } 

    void context_BeginRequest(object sender, EventArgs e) 
    { 
     // check if user is authenticated 
     if (HttpContext.User.Identity.IsAuthenticated) 
     { 
      var username = HttpContext.User.Identity.Name; 
      /* 
       Your code to read user's culture name from the profile and 
       put it in "lang" variable 
      */ 
      var culture = new System.Globalization.CultureInfo(lang); 
      Thread.CurrentThread.CurrentCulture = culture; 
      Thread.CurrentThread.CurrentUICulture = culture; 
     } 
    } 
} 

und es durch Registrierung in der Datei web.config erhalten laufen:

<configuration> 
    <system.web> 
    <httpModules> 
     <add name="LocalizationModule " type="LocalizationModule"/> <!-- put the full namespace and class name in type attribute eg. MyApp.MyNamespace.LocalizationModule --> 
    </httpModules> 
    </system.web> 
</configuration> 
Verwandte Themen