2010-09-28 4 views
3

J'ai deux fichiers de ressources pour ceux qui ne savent pas sous App_GlobalResourcesNightmare avec localisation sous Global Resources

MyApp.resx 
MyApp.sv.resx 

: Toutes les langues vont passer en mode MyApp.resxsauf la UICulture suédoise utilisera le MyApp.sv.resx

et j'ai une page simple qui montre 3 <asp:Label> dans lequel la propriété Text est appelée différemment comme:

<i>using Resource.Write:</i><br /> 
    <asp:Label ID="Label1" runat="server" /> 
    <hr /> 

    <i>using HttpContext.GetGlobalResourceObject:</i><br /> 
    <asp:Label ID="Label2" runat="server" /> 
    <hr /> 

    <i>using Text Resources:</i><br /> 
    <asp:Label ID="Label3" runat="server" 
       Text="<%$ Resources:MyApp, btnRemoveMonitoring %>" /> 

    <p style="margin-top:50px;"> 
    <i>Current UI Culture:</i><br /> 
     <asp:Literal ID="litCulture" runat="server" /> 
    </p> 

Label3 est le seul appelé à la page, les 2 premiers sont définis comme:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     Label1.Text = Resources.AdwizaPAR.btnRemoveMonitoring; 
     Label2.Text = HttpContext.GetGlobalResourceObject("MyApp", "btnRemoveMonitoring").ToString(); 

     litCulture.Text = System.Threading.Thread.CurrentThread.CurrentUICulture.Name; 
    } 
} 

si j'utilise la langue du navigateur tout fonctionne très bien, mais je veux passer outre ce paramètre et la charge la traduction correcte basée sur une autre entrée, donc je dois remplacer le UICulture et que j'utiliser:

protected void Page_Init(object sender, EventArgs e) 
{ 
    Page.Culture = "en-US"; 
    Page.UICulture = "en-US"; 
} 

sorcière est le même que:

protected void Page_Init(object sender, EventArgs e) 
{ 
    System.Globalization.CultureInfo cinfo = System.Globalization.CultureInfo.CreateSpecificCulture("en-US"); 
    System.Threading.Thread.CurrentThread.CurrentCulture = cinfo; 
    System.Threading.Thread.CurrentThread.CurrentUICulture = cinfo; 
} 

avec tout cela, ce que je veux est la suivante:

alt text

En d'autres termes Je reçois la localisation correcte que si j'utilise code-behind pour définir le texte correct , toute la localisation inline utilise simplement la langue du navigateur.

Qu'est-ce qui me manque?

Répondre

3

Nightmare est plus ...

Page_Init ne change pas l'accès aux ressources mondiales, nous devons override l'initialisation à la culure

protected override void InitializeCulture() 
{ 
    //*** make sure to call base class implementation 
    base.InitializeCulture(); 

    //*** pull language preference from profile 
    string LanguagePreference = "en-US"; // get from whatever property you want 

    //*** set the cultures 
    if (LanguagePreference != null) 
    { 
     this.UICulture = LanguagePreference; 
     this.Culture = LanguagePreference; 
    } 
} 

Maintenant fonctionne correctement

alt text

0

Si vous ne souhaitez pas modifier chaque page, vous pouvez définir la culture dans Global.asax

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs) 
    Dim lang As String = "en-us" 
    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang) 
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang) 
End Sub 
+0

Je hérite de mes pages d'une seule classe ... ajouté là, mais merci pour les heads up. – balexandre