values studio strings quantity language change android localization internationalization units-of-measurement

android - studio - Uso de la configuración regional para detectar si es necesario usar unidades imperiales



string value android (4)

Estoy trabajando en una aplicación que quiere mostrar las longitudes en centímetros (cm) o en pulgadas ("). ¿Hay alguna forma de seleccionar la unidad correcta de la ubicación? En cualquier caso, también voy a instalar una Opción para que el usuario pueda anular la configuración regional.

EE. UU., Liberia y Birmania deberían usar unidades imperiales y el resto del mundo unidades normales. Una forma es poner esta lógica en mis propias clases, pero preferiría usar cualquier lógica incorporada si estuviera disponible. Cualquier punteros?


  1. Programáticamente

Haciendo una pequeña mejora en la solución de @vidstige

Usaría getCountry (). ToUpperCase () para estar seguro y cambiar los cheques a un interruptor para un código más limpio. Algo como esto:

public static UnitLocale getFrom(Locale locale) { String countryCode = locale.getCountry().toUpperCase(); switch (countryCode) { case "US": case "LR": case "MM": return Imperial; default: return Metric; } }

  1. De los recursos

Otra solución podría ser crear carpetas de recursos para cada país como: [values_US] [values_LR] [values_MM] con un recurso booleano cambiado a verdadero. Luego lee ese recurso booleano del código.


Al final fui por la siguiente solución.

public class UnitLocale { public static UnitLocale Imperial = new UnitLocale(); public static UnitLocale Metric = new UnitLocale(); public static UnitLocale getDefault() { return getFrom(Locale.getDefault()); } public static UnitLocale getFrom(Locale locale) { String countryCode = locale.getCountry(); if ("US".equals(countryCode)) return Imperial; // USA if ("LR".equals(countryCode)) return Imperial; // Liberia if ("MM".equals(countryCode)) return Imperial; // Myanmar return Metric; } }

Úsalo así, por ejemplo.

if (UnitLocale.getDefault() == UnitLocale.Imperial) convertToimperial();

Si los métodos de conversión también son necesarios, se pueden agregar preferiblemente a las subclases de UnitLocale. Solo necesitaba detectar si era necesario usar unidades imperiales y enviarlas al servidor.

Usar int s sobre objetos java tiene ganancias de rendimiento extremadamente escasas y hace que el código sea más difícil de leer. La comparación de dos referencias en java es comparable en velocidad a la comparación de dos ints . El uso de objetos también nos permite agregar métodos a la clase o subclases de UnitLocale como, por ejemplo, convertToMetric, etc.

También puedes usar una enumeración si lo prefieres.


Simplemente ofrezca al usuario la opción de elegir una unidad preferida en un menú de configuración. Si es un usuario que viaja, no quiere que la aplicación tenga conocimiento geográfico, OMI.


Una forma más o menos completa de hacer esto es esta manera.

Kotlin:

private fun Locale.toUnitSystem() = when (country.toUpperCase()) { // https://en.wikipedia.org/wiki/United_States_customary_units // https://en.wikipedia.org/wiki/Imperial_units "US" -> UnitSystem.IMPERIAL_US // UK, Myanmar, Liberia, "GB", "MM", "LR" -> UnitSystem.IMPERIAL else -> UnitSystem.METRIC }

Tenga en cuenta que existe una diferencia entre los sistemas imperiales del Reino Unido y los EE. UU., Consulte los artículos de la wiki para obtener más detalles.