java localization internationalization locale

Personalización de formateadores java.text para diferentes configuraciones regionales



localization internationalization (5)

Creación de una aplicación Java que admita diferentes configuraciones regionales, pero desee personalizar la visualización de DateFormat más allá de lo que está disponible entre las opciones FULL, LONG, MEDIUM y SHORT DateFormat. Me gustaría hacer cosas como colocar un carácter entre los componentes de fecha y hora de un DateFormat.getDateTimeFormat (), minúsculas de AM / PM, etc., al menos para inglés.

puede pensar en 3 formas de hacerlo:

1) si la configuración regional es inglesa, use mi cadena de formato personalizada en un nuevo objeto SimpleDateFormat.

2) modificar las cadenas de formato predeterminadas para las configuraciones regionales existentes

3) crear una nueva variante de configuración regional que especifique las cadenas de formato que quiero

No se puede saber cómo hacer 2 o 3 (o si es posible), y preferiría no hacer 1 ... ¿alguien ha tratado algo como esto antes?

también, parece que 2 o 3 serían necesarios para minicar la AM / PM? (Especificando el recurso AmPmMarkers para la configuración del formato de fecha de la configuración regional)


¿Por qué no usar un MessageFormat en su lugar?

Usa el patrón "{0, date, short} tu texto aquí {0, time, short}" para hacer lo que quieras.


Lo único similar que he tratado es el hecho de que "strftime" y "locale" dicen que el italiano debería usar dos puntos entre los campos de tiempo, pero Java pone paradas completas entre ellos. Así que agregué el siguiente código:

// This is an incredibly ugly hack, but it''s based on the fact that // Java for some reason decided that Italy uses "." between // hours.minutes.seconds, even though "locale" and strftime say // something different. hmsTimeFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM); if (hmsTimeFormat instanceof SimpleDateFormat) { String str = ((SimpleDateFormat)hmsTimeFormat).toPattern(); str = str.replace(''.'', '':''); hmsTimeFormat = new SimpleDateFormat(str); }


La manera más satisfactoria de resolver esto que hemos descubierto es cargar Strings am, pm, formatString desde un paquete de recursos específico de la configuración regional, y luego:

SimpleDateFormat sdf = (SimpleDateFormat)sdf.getDateTimeInstance(DateTime.SHORT,DateTime.SHORT, locale); if (formatString != null) { sdf = new SimpleDateFormat(formatString); } if (am!= null && pm != null) { DateFormatSymbols symbols = sdf.getDateFormatSymbols(); symbols.setAmPmStrings(new String[]{am, pm}); sdf.setDateFormatSymbols(symbols); }

Paul: no estoy seguro de que haya un separador en los DateFormatSymbols, aunque ... así que probablemente necesites mantener el str.replace


Java tiene una clase solo para esto, es la clase ResourceBundle . Vuelve con un archivo de propiedades y tendrás todo lo que necesitas y más.

Incluso sin la clase ResourceBundle, podría usar archivos de propiedades para contener todos los formatos SimpleDateFormat.

Settings formats = new Settings(); Properties SDFFormats = formats.load(propertiesFile); String SDFAmerica = SDFFormats.getProperty("FormatAmerica");

Mientras que la entrada en el archivo de propiedades puede leer

FormatAmerica = MMM-dd-yyyy


Recomiendo usar Joda Time para el formato de su fecha. Tiene una flexibilidad poderosa pero elegante en su formateo. Probablemente descubrirá que sus formateadores hacen que lo que quiere hacer sea extremadamente simple.

Por cierto: una vez que vaya Joda, ¡nunca más volverá!