2009-07-29 3 views
1

J'utilise les directives d'expression de ressource dans une page ASP.NET qui contient quatre fichiers de ressources globaux, neutre, britannique, américain et italien. Cependant, l'utilisation de la syntaxe d'expression renvoie toujours US.L'expression de ressource ASP.NET ne renvoie pas la valeur de culture correcte

Certains code de la page ASPX:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="GlobalisationResources._Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <h2>Current culture: <%= System.Threading.Thread.CurrentThread.CurrentUICulture.Name + " - " + System.Threading.Thread.CurrentThread.CurrentCulture.Name %></h2> 
     <h2>At page load: <asp:Literal ID="PageLoadLiteral" runat="server" /></h2> 
     <h2>At initialise culture: <asp:Literal ID="InitCultureLiteral" runat="server" /></h2> 
     <asp:DropDownList AutoPostBack="true" runat="server" ID="LangDropDown" /> 
     <br />  
     Using resources processor command: <span><asp:Literal runat="server" Text="<%$ Resources: SomeResources, Banana %>" /></span> 
     <br /> 
     GetGlobalResourceObject: <span><%= GetGlobalResourceObject ("SomeResources", "Banana") %></span> 
     <br /> 
     Typed: <span><%= Resources.SomeResources.Banana %></span>  
     <br />  
     <br />  
     ORANGES! Using resources processor command: <span><asp:Literal runat="server" Text="<%$ Resources: SomeResources, Orange %>" /></span> 
     <br /> 
     ORANGES! GetGlobalResourceObject: <span><%= GetGlobalResourceObject ("SomeResources", "Orange")%></span> 
     <br /> 
     ORANGES! Typed: <span><%= Resources.SomeResources.Orange %></span>  
    </div> 
    </form> 
</body> 
</html> 

Le code derrière:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Threading; 
using System.Globalization; 

namespace GlobalisationResources 
{ 
    public partial class _Default : Page 
    { 
     string mCulture; 

     protected void Page_Load (object sender, EventArgs e) 
     { 
      LangDropDown.SelectedIndexChanged += LangDropDown_SelectedIndexChanged; 

      if (!IsPostBack) 
      { 
       LangDropDown.Items.Add ("en-US"); 
       LangDropDown.Items.Add ("en-GB"); 
       LangDropDown.Items.Add ("it-IT"); 
      } 

      PageLoadLiteral.Text = Thread.CurrentThread.CurrentUICulture.Name + " - " + Thread.CurrentThread.CurrentCulture.Name; 
      InitCultureLiteral.Text = mCulture; 
     } 

     override protected void InitializeCulture() 
     { 
      mCulture = Thread.CurrentThread.CurrentUICulture.Name + " - " + Thread.CurrentThread.CurrentCulture.Name; 

      base.InitializeCulture(); 
     } 

     void LangDropDown_SelectedIndexChanged (object sender, EventArgs e) 
     { 
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture (LangDropDown.Text); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo (LangDropDown.Text); 
     } 
    } 
} 

Comme vous pouvez le voir, l'utilisateur peut changer la langue à tout moment, et au sommet de la la page imprimer la culture à différentes étapes, les résultats sont les suivants:

A la demande d'abord:

culture actuelle: en-US - fr-FR
À chargement de la page: en-US - en-GB
à la culture Initialiser: en-US - en-GB

Lors de la sélection GB:

culture actuelle: en-GB - fr-fR
à chargement de la page: en-US - en-GB
à la culture Initialiser: en-US - en-GB

Et pour IT:

culture actuelle: it-IT - it-IT
À chargement de la page: en-US - en-GB
à la culture Initialiser: en-US - en-GB

Je ne sais pas si ces résultats avoir un impact sur l'utilisation de la syntaxe Resources ou non, mais quelqu'un sait-il pourquoi il prendrait toujours les mauvaises valeurs lorsque tout le reste (GetGlobalResourceObject et tapé) fonctionne toujours?

P.S. Je suis au Royaume-Uni et ma région est également au Royaume-Uni.

Merci.

Répondre

2

Je pense que votre culture pas réglée correctement ensemble en utilisant comme .. et plz laissez-moi savoir

protected override void InitializeCulture() 
{ 
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US"); 
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); 
    base.InitializeCulture(); 
} 
+0

C'est exactement ce que j'ai fait, mais cela ne semble pas fonctionner. Cela ne fera que sortir les valeurs par défaut, pas les valeurs spécifiques à la culture. – Kieron

+0

J'ai compris! Bien qu'en raison de l'ordre dans lequel la méthode InitialiseCulture est appelée, le contrôle n'a pas encore été créé. Pour réparer il suffit d'utiliser Request.Form ["ControlName"] et tout est bon. Merci! – Kieron

0

Il est également possible de résoudre ce problème d'une manière déclarative:

<%@ Page Language="vb" AutoEventWireup="false" Inherits="Timesheet.ProjectPoP" CodeFile="ProjectPoP.aspx.vb" Culture="auto" UICulture="auto" %>

en définissant les deux attributs

- Culture = "auto"
- UICulture = "auto"

de "AUTO" ou "en-US" ou toute autre culture.

Questions connexes