Crear una cultura personalizada en ASP.NET

Deseo crear un archivo de recursos para Singaporean English (en-sg) llamado “shopping.en-sg.resx” en la carpeta App_GlobalResources.

Me sale un error durante la comstackción.

Error 1 El espacio de nombres ‘Recursos’ ya contiene una definición para ‘comprar’ c: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Archivos temporales ASP.NET \ web \ 2cd6afe9 \ 737b0a13 \ App_GlobalResources.vomuzavz.1.cs 26

Después de buscar en Google, descubrí que “en-sg” no es una cultura predeterminada y tengo que crear una cultura personalizada para ella. No sé los pasos detallados de esto.

¿Qué debo hacer para crear la cultura y eliminar el error de comstackción?

Sigo el ejemplo en MSDN, creo un archivo llamado “shopping.x-en-US-sample.resx” y coloco el siguiente código en la función de BasePage (anulación protegida void InitializeCulture ()):

CultureAndRegionInfoBuilder cib = null; cib = new CultureAndRegionInfoBuilder( "x-en-US-sample", CultureAndRegionModifiers.None); CultureInfo ci = new CultureInfo("en-US"); cib.LoadDataFromCultureInfo(ci); RegionInfo ri = new RegionInfo("US"); cib.LoadDataFromRegionInfo(ri); cib.Register(); ci = new CultureInfo("x-en-US-sample"); 

Sin embargo, el error de comstackción todavía existe.

ACTUALIZADO:

Puede reproducir fácilmente el problema creando un sitio web vacío y dos archivos “shopping.en-sg.resx” y “shopping.resx” en la carpeta app_globalresources.

Puede crear una nueva cultura basada en una cultura existente:

 string culture = "en-sg"; string name = "Singaporean English"; CultureInfo cultureInfo = new CultureInfo("en-GB"); RegionInfo regionInfo = new RegionInfo(cultureInfo.Name); CultureAndRegionInfoBuilder cultureAndRegionInfoBuilder = new CultureAndRegionInfoBuilder(culture, CultureAndRegionModifiers.None); cultureAndRegionInfoBuilder.LoadDataFromCultureInfo(cultureInfo); cultureAndRegionInfoBuilder.LoadDataFromRegionInfo(regionInfo); // Custom Changes cultureAndRegionInfoBuilder.CultureEnglishName = name; cultureAndRegionInfoBuilder.CultureNativeName = name; cultureAndRegionInfoBuilder.Register(); 

Agregado: Acabo de verificar las referencias: Tengo:

 using System; using System.Collections.Generic; using System.Text; using System.Globalization; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; 

Agregado (actualizado, basado en comentarios):

Con respecto al mensaje de error:

El error que estás viendo es el resultado de un conflicto de nombres de recursos. Verifique los nombres de los recursos, estos se comstackn en dlls, necesita verificar que los nombres del espacio de nombres no entren en conflicto. Puede verificar esto utilizando la herramienta de reflector: http://www.red-gate.com/products/reflector/

Estos son los pasos y el código necesarios para crear la cultura en-sg.

  1. Crea una aplicación de consola.
  2. Agregue una referencia a sysglobl (C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ sysglobl.dll)
  3. Agregue el código a continuación.
  4. Ejecútelo en el (los) servidor (es) web y dev máquina (s) como administrador.

Creará una cultura basada en lo que encontré como su combinación más cercana (en-au). Luego he anulado nombres, etc. para hacerlo único.

Solo deberías ejecutar esto una vez. Elimina los existentes antes de crear esto en caso de que desee realizar modificaciones después de ejecutarlo.

 public static void Main() { CultureAndRegionInfoBuilder cib = null; try { Console.Clear(); Console.WriteLine("Unregister the \"en-SG\" " + "custom culture if it already exists..."); CultureAndRegionInfoBuilder.Unregister("en-SG"); Console.WriteLine("The custom culture was unregistered successfully."); } catch (Exception e) { Console.WriteLine("Error while unregistering..."); Console.WriteLine(e); } try { cib = new CultureAndRegionInfoBuilder("en-SG", CultureAndRegionModifiers.None); // Populate the new CultureAndRegionInfoBuilder object with culture information. CultureInfo ci = new CultureInfo("en-AU"); cib.LoadDataFromCultureInfo(ci); // Populate the new CultureAndRegionInfoBuilder object with region information. RegionInfo ri = new RegionInfo("SG"); cib.LoadDataFromRegionInfo(ri); cib.CultureEnglishName = "English (Singapore)"; cib.CultureNativeName = "English (Singapore)"; cib.IsMetric = true; // Display some of the properties of the CultureAndRegionInfoBuilder object. Console.WriteLine("CultureName:. . . . . . . . . . {0}", cib.CultureName); Console.WriteLine("CultureEnglishName: . . . . . . {0}", cib.CultureEnglishName); Console.WriteLine("CultureNativeName:. . . . . . . {0}", cib.CultureNativeName); Console.WriteLine("GeoId:. . . . . . . . . . . . . {0}", cib.GeoId); Console.WriteLine("IsMetric: . . . . . . . . . . . {0}", cib.IsMetric); Console.WriteLine("ISOCurrencySymbol:. . . . . . . {0}", cib.ISOCurrencySymbol); Console.WriteLine("RegionEnglishName:. . . . . . . {0}", cib.RegionEnglishName); Console.WriteLine("RegionName: . . . . . . . . . . {0}", cib.RegionName); Console.WriteLine("RegionNativeName: . . . . . . . {0}", cib.RegionNativeName); Console.WriteLine("ThreeLetterISOLanguageName: . . {0}", cib.ThreeLetterISOLanguageName); Console.WriteLine("ThreeLetterISORegionName: . . . {0}", cib.ThreeLetterISORegionName); Console.WriteLine("ThreeLetterWindowsLanguageName: {0}", cib.ThreeLetterWindowsLanguageName); Console.WriteLine("ThreeLetterWindowsRegionName: . {0}", cib.ThreeLetterWindowsRegionName); Console.WriteLine("TwoLetterISOLanguageName: . . . {0}", cib.TwoLetterISOLanguageName); Console.WriteLine("TwoLetterISORegionName: . . . . {0}", cib.TwoLetterISORegionName); Console.WriteLine(); // Register the custom culture. Console.WriteLine("Register the custom culture..."); cib.Register(); // Display some of the properties of the custom culture. ci = new CultureInfo("en-SG"); Console.WriteLine("Name: . . . . . . . . . . . . . {0}", ci.Name); Console.WriteLine("EnglishName:. . . . . . . . . . {0}", ci.EnglishName); Console.WriteLine("NativeName: . . . . . . . . . . {0}", ci.NativeName); Console.WriteLine("TwoLetterISOLanguageName: . . . {0}", ci.TwoLetterISOLanguageName); Console.WriteLine("ThreeLetterISOLanguageName: . . {0}", ci.ThreeLetterISOLanguageName); Console.WriteLine("ThreeLetterWindowsLanguageName: {0}", ci.ThreeLetterWindowsLanguageName); } catch (Exception e) { Console.WriteLine(e); } Console.ReadKey(); } 

Cómo: Crear culturas personalizadas (desde MSDN)