createspecificculture c# .net-3.5 globalization cultureinfo

createspecificculture - cultureinfo c#



¿Diferencia entre CultureInfo.CreateSpecificCulture() y el constructor de la clase? (3)

La clase CultureInfo proporciona dos formas de creación:

La documentación de MSDN difiere ligeramente de los dos, mencionando algo de "cultura de Windows" para el constructor. Pero, ¿realmente importa?

¿Debería preferir uno de los dos sobre el otro?

Nota: estoy usando .NET versión 3.5 si eso importa, y quiero usarlo así:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture); Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);

como se describe en esta respuesta.


El método de fábrica tiene un repliegue cuando falla al crear la información de cultura.

Por lo tanto, si utiliza una cultura específica como ''en-XX'', no se puede crear la instancia de información de cultura, se lanzará una excepción y se volverá a intentar con la cultura neutral ''en''.

Abajo la source del método de fábrica.

public static CultureInfo CreateSpecificCulture(string name) { CultureInfo info; try { info = new CultureInfo(name); } catch (ArgumentException) { info = null; for (int i = 0; i < name.Length; i++) { if (''-'' == name[i]) { try { info = new CultureInfo(name.Substring(0, i)); break; } catch (ArgumentException) { throw; } } } if (info == null) { throw; } } if (!info.IsNeutralCulture) { return info; } return new CultureInfo(info.m_cultureData.SSPECIFICCULTURE); }

Así que prefiero el método de fábrica.


Este hilo ya ha sido respondido, pero encontré un hallazgo único para la API CreateSpecificCulture que podría no ser tan obvio a veces. Así que consideré este hilo como un lugar apropiado para mis hallazgos. Pasé unos días en esto, así que solo pensé en compartir mi experiencia si también puede ahorrar algunas horas o días para otros.

Cuando se usa la API cuando se le pasa solo el nombre de la cultura como pt (para portugués) o de (para alemán), esta API devuelve una cultura específica correspondiente a la configuración regional que se denomina como la configuración regional predeterminada para esa cultura. Ahora, esta ubicación podría no ser tan obvia como suena donde me quedé atascado. Para el alemán, de-DE parece obvio que se habla alemán en Alemania. Para el italiano, parece obvio que se habla italiano en Italia.

Del mismo modo, pt-PT parece obvio para el portugués hablado en Portugal. Lamentablemente este no es el caso. En función de no estar seguro de la razón exacta (puede ser la población, el país de origen, el idioma nacional, etc.), existe una estandarización global basada en la cual la configuración regional predeterminada para una cultura determinada se decide cuando intenta crear una cultura específica a partir de una identificación cultural. ( pt en este caso). Microsoft ha documentado la lista completa en el siguiente enlace:

http://msdn.microsoft.com/en-us/goglobal/bb896001.aspx

Si desea saber cuál es la configuración regional del país por defecto para una cultura o idioma determinado, haga coincidir el código de la última columna (abreviatura del nombre del idioma) en el enlace anterior.

Para el portugués, el nombre del idioma abreviación de la cultura invariante "portugués" coincide con "portugués (Brasil)", que es PTB. Portugués (Portugal) tiene un código diferente PTG . Entonces, en este caso, Portugués (Brasil) es la configuración regional predeterminada para el idioma portugués.

Si la lógica o los requisitos de su aplicación dependen de este comportamiento de esta API, debe tener cuidado. Este comportamiento se vuelve más importante en las aplicaciones basadas en la web, ya que todos los navegadores en el mercado también siguen estas pautas y envían la información adecuada en el encabezado de la solicitud http cuando mira una versión localizada de un sitio web multilingüe.

Sin embargo, sigo buscando la razón, que es EL factor detrás de la configuración de un país específico como ubicación predeterminada para cualquier cultura que no suene tan obvia en el caso del portugués. Cualquier información o comentario son bienvenidos.


Hay otra diferencia notable entre el método de fábrica y el contructor: el constructor ofrece un booleano opcional adicional, que tiene su valor predeterminado establecido en verdadero.

Necesitará que este Booleano se establezca en falso, si realmente necesita un> "simple" <cultureinfo, porque: Si está solicitando una cultura específica (por ejemplo de-DE ) sin "Boolean set to false" siempre obtendrá una configuración de cultura, que podría tener configuraciones inesperadas, dependiendo de cómo el usuario haya cambiado esta cultura a través del Panel de control.

El método de fábrica no es compatible con este booleano!

Solo dos pensamientos finales sobre cuándo quieres que este booleano sea:

  • verdadero: está generando una salida para su interfaz de usuario: esta salida debe realizarse de acuerdo con la configuración de la cultura específica, que el usuario ha elegido a través del panel de control
  • falso: desea analizar los datos (por ejemplo, de XML) y conoce los ajustes específicos de la cultura XML (por ejemplo, separador decimal como coma). En este caso, necesitará un plain de-DE - Cultura para estar seguro, que la configuración especial del panel de control no interferirá.