2011-08-09 60 views
12

Necesito cambiar culturas en tiempo de ejecución de acuerdo con los archivos de recursos para cada cultura.¿Cómo cambiar CurrentCulture en tiempo de ejecución?

Necesito cambiar los atributos de los controles en mi forma, de acuerdo con dos culturas que han designado Resx archivos

resorces1.aspx.resx // default 
resorces1.aspx.he-IL.resx // hebrew culture 

puedo cargar la página, ya sea con el recurso de reserva, o en dar pageload el valor UICulture = "he-IL" y carga bien con los recursos deseados.

El problema es que necesito hacer estos cambios en tiempo de ejecución.

1 .. después de cambiar el valor de un evento de clic de botón

btn_change_Click(....) 
    { 
     UICulture = "he-IL" ; 
    } 

Todavía vuelve al valor inicializado de "en-US"

Como puedo cometer un cambio en el UICulture en tiempo de ejecución ?

2 .. ¿Cómo puedo hacer referencia al archivo de recurso alternativo si, por ejemplo, no sé si es "en-US"?

Respuesta

36

Cambio de la actual cultura de interfaz de usuario:

System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("he-IL"); 

o mejor, recuperar una instancia de sólo lectura en caché de la cultura que él-IL:

System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("he-IL"); 

En tiempo de ejecución, ASP.NET utiliza el archivo de recursos que es la mejor coincidencia para la configuración de la propiedad CurrentUICulture. La cultura de la interfaz de usuario para el hilo se establece de acuerdo con la cultura de la interfaz de usuario de la página. Por ejemplo, si la cultura de UI actual es el español, ASP.NET usa la versión compilada del archivo WebResources.es.resx. Si no existe una coincidencia para la cultura de IU actual, ASP.NET utiliza la recuperación de recursos. Comienza buscando recursos para una cultura específica. Si no están disponibles, busca los recursos para una cultura neutral. Si no se encuentran, ASP.NET carga el archivo de recursos predeterminado. En este ejemplo, el archivo de recursos predeterminado es WebResource.resx.

+0

bien lo que permite decir que cambié la CurrentUICulture ¿Cómo puedo cambiar de nuevo la cultura por defecto asumiendo que no sé lo que era? –

+0

La cultura predeterminada es la cultura alternativa ¿verdad? Es conocido en tiempo de compilación ¿verdad? Es la cultura de resorces1.aspx.resx, probablemente en-EE. UU. A menos que malinterprete su segunda pregunta, parece bastante fácil de hacer teniendo en cuenta que ahora sabe cómo cambiar la cultura en tiempo de ejecución :) – maxbeaudoin

+0

sí, es solo guardarlo nombre cuando cargo la página no pensé antes de gracias. –

0

máx me puso en el camino correcto, nada que no he encontrado antes, pero me ayudó a hacer una pequeña modificación de la documentación de MSDN sobre el asunto:

http://msdn.microsoft.com/en-us/library/bz9tc508.aspx

string defaultLanguage = Thread.CurrentThread.CurrentUICulture.ToString();       
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected override void InitializeCulture() 
    { 
     if (Request.Form["ListBox1"] != null) 
     { 
      String selectedLanguage = Request.Form["ListBox1"]; 
      UICulture = selectedLanguage; 
      Culture = selectedLanguage; 

      Thread.CurrentThread.CurrentCulture = new CultureInfo(selectedLanguage); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage); 
     } 
     else 
     { 
      Thread.CurrentThread.CurrentCulture = new CultureInfo(defaultLanguage); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(defaultLanguage); 
     }    
     base.InitializeCulture(); 
    } 

el cuadro de lista contiene culturas diferentes, la primera y la seleccionada también es la cultura predeterminada, que guardo en la carga de la página, en otras la carga como sin efecto porque la lista ya es un valor.

0

No he podido obtener el "respaldo" como se describe aquí para que funcione. Estoy usando los archivos de recursos globales para el idioma y cuando la etiqueta falta en el archivo de cultura seleccionado por el usuario, ¿no vuelve a una etiqueta por defecto en la cultura predeterminada? Terminé creando un método para realizar el repliegue. Estaba buscando mejores formas de cambiar la cultura temporalmente (cuando no se encuentra la etiqueta) y me tropecé con esta publicación, así que pensé que sí y algo de contenido.

En una clase de utilidad mío: cadena getLabelResource pública (String sLabelID, Cadena sLangCd) {

 cLogger oLogger = new cLogger(); 

     try 
     { 
      Object sLabel; 
      sLabel = HttpContext.GetGlobalResourceObject("{filename}", sLabelID); 
      if (sLabel.ToString() == "") //label was not found in selected lang 
      { 
       //default to US language resource label 
       Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 
       sLabel = HttpContext.GetGlobalResourceObject("{filename}", sLabelID); 
       //switch global lang back to selected 
       Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(sLangCd); 
      } 
      return sLabel.ToString(); 

     } 
     catch (Exception ex) 
     { 
      oLogger.LogWrite("cUtils.cs", "getLabelResource", ex.Message, false); 
      return String.Empty; 
     } 
    } 
+0

g ... gracias esto fue respondido hace más de 2 años :) –

Cuestiones relacionadas