Localizando un enumio en Java -- java campo con android campo con enum campo con localization camp codereview Relacionados El problema

Localizing an enum in Java


15
vote

problema

Español

Actualmente estoy usando un Enum en My Android Solicitud para mostrar los períodos de tiempo:

  • semanal
  • bi-semanal
  • mensual
  • trimestral
  • anual

He creado el enume como este, porque quería conocer la descripción, y (aproximadamente) número de días:

  i1  

Ahora, me gustaría localizar el Enum, y hasta ahora mi única solución ha sido eliminar la descripción del constructor, y verificar la configuración regional y cambiar según el número de días:

  i2  

Esperaba que hubiera una manera de hacerlo usando una matriz de cadena en un archivo XML, pero parece que no puedo encontrar nada de eso. ¿Está esta bien práctica? ¿Hay una mejor manera?

Original en ingles

I am currently using an enum in my Android application to display time periods:

  • Weekly
  • Bi-Weekly
  • Monthly
  • Quarterly
  • Yearly

I created the enum like this, because I wanted to know the description, and (roughly) number of days:

public enum SpendingPeriods {     WEEKLY("Weekly", 7),     BIWEEKLY("Bi-Weekly", 14),     MONTHLY("Monthly", 30),     QUARTERLY("Quarterly", 120),     YEARLY("Yearly", 365);      private final String description;     private final int numDays;      SpendingPeriods(String description, int numDays){         this.description = description;         this.numDays = numDays;     }      public String getDescription(){         return description;     }      public int getNumDays(){         return numDays;     } } 

Now, I would like to localize the enum, and so far my only solution has been to remove the description from the constructor, and check Locale and switch based on number of days:

SpendingPeriods(int numDays){         this.numDays = numDays;         if(Locale.getDefault().getLanguage().equals("fr")){             switch(numDays){                 case 7:                     this.description = "Hebdomadaire";                     break;                 case 14:                     this.description="Bimensuel";                     break;                 case 30:                     this.description="Mensuel";                     break;                 // Others             }         } else{             // Fall back to English for unsupported languages             switch(numDays){                 case 7:                     this.description = "Weekly";                     break;                 case 14:                     this.description = "Bi-Weekly";                     break;                 case 30:                     this.description = "Monthly";                     break;                 // Others             }         }     } 

I was hoping there would be a way to do this using a string-array in an XML file, but I can't seem to find anything like that. Is this okay practice? Is there a better way?

           
   
   

Lista de respuestas

17
 
vote
vote
La mejor respuesta
 

No localice su código Java. No desea entregar su código fuente a su traductor, y no desea volver a compilar el código para agregar un soporte para un nuevo idioma. Más bien, debe internacionalizar su código y hacer toda la localización a través de recursos, como recomendado en la documentación de los desarrolladores de Android .

Además, la localización de cadenas en aislamiento no funciona en el caso general. Por ejemplo, es posible que "mensualmente" deba ser traducido como «Mensuel», «Mensuelle», «Mensuels», «Mensuelles», o «Mensuestre», dependiendo del contexto. El orden de las palabras también tiende a diferir entre los idiomas. Por lo tanto, el único enfoque sano es traducir frases enteras en el punto de uso.

res / valores / strings.xml

  r.sort_by! { |e| e[:id] } g.sort_by! { |e| e[:id] } 0  

res / valores-fr / strings.xml

  r.sort_by! { |e| e[:id] } g.sort_by! { |e| e[:id] } 1  

Código Java

  r.sort_by! { |e| e[:id] } g.sort_by! { |e| e[:id] } 2  

... para obtener

  99887766555443323  

o

  r.sort_by! { |e| e[:id] } g.sort_by! { |e| e[:id] } 4  
 

Don't localize your Java code. You don't want to hand over your source code to your translator, and you don't want to recompile the code to add a support for a new language. Rather, you should internationalize your code and do all the localization through resources, as recommended in the Android Developers documentation.

Furthermore, localizing strings in isolation doesn't work in the general case. For example, "monthly" may need to be translated as xc2xabxc2xa0mensuelxc2xa0xc2xbb, xc2xabxc2xa0mensuellexc2xa0xc2xbb, xc2xabxc2xa0mensuelsxc2xa0xc2xbb, xc2xabxc2xa0mensuellesxc2xa0xc2xbb, or xc2xabxc2xa0mensuellementxc2xa0xc2xbb, depending on context. Word order also tends to differ between languages. Therefore, the only sane approach is to translate entire phrases at the point of use.

res/values/strings.xml

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">     <string name="expenses">Your {0,choice, 1#weekly| 2#bi-weekly| 3#monthly| 4#quarterly| 5#annual} expenses are {1,number,currency}.</string> </resources> 

res/values-fr/strings.xml

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">     <string name="expenses">Vos dxc3xa9penses {0,choice, 1#hebdomadaires| 2#bimensuelles| 3#mensuelles| 4#trimestrielles| 5#annuelles} sont {1,number,currency}.</string> </resources> 

Java code

import java.text.*; xe2x80xa6  Format expensesFmt = new MessageFormat(getResources().getString(R.string.expenses)); textView.setText(expensesFmt.format(new Object[] { MONTHLY.ordinal(), 1337 })); 

xe2x80xa6 to get

Your monthly expenses are $1337.00. 

or

Vos dxc3xa9penses mensuelles sont 1337,00xe2x82xac. 
 
 
   
   
3
 
vote

No fue el enfoque de su pregunta, pero me gustaría señalar que es potencialmente peligroso definir períodos de tiempo, como meses o años como un número fijo de días. Le dará grandes dolores de cabeza, si realmente estás tratando de calcular fechas confiables de estas.

En su lugar, considere usar una biblioteca de fecha / hora, como joda-tiempo (también disponible como una versión específica de Android ) o la nueva Java 8 Paquete de tiempo (aún disponible en Android). Le permiten calcular correctamente con períodos de tiempo variable .

 

It wasn't the focus of your question, but I'd like the point out that it's potentially dangerous to define time periods such as months or years as a fixed number of days. It will give you big head-aches, if you are actually trying to calculate reliable dates from these.

Instead consider using a date/time libray such as Joda-Time (also available as an Android-specific version) or the new Java 8 Time package (not yet available on Android). They allow you to correctly calculate with variable time periods.

 
 
   
   

Relacionados problema

4  Ideas del sistema de error bilingüe PHP  ( Php bilingual error system ideas ) 
Estoy construyendo un sitio web móvil basado en PHP que debe estar en español e inglés. Este es mi primer sitio bilingüe, por lo que he estado teniendo que vo...

4  Cargador de localidad simple  ( Simple locale loader ) 
Tengo una clase que carga local de una base de datos. No estoy seguro de si el local es la palabra correcta. Básicamente, está cargando textos para un juego, ...

3  Aplicación multilingüe sin localización  ( Multilingual app without localizing ) 
Estoy haciendo una aplicación de iOS que admite múltiples idiomas, pero no en la forma localizada incorporada. En iOS, para que la localización funcione, el u...

8  Traducir documentos de látex en diferentes idiomas con DEEPL API  ( Translating latex documents into different languages using deepl api ) 
Vengo de C y C ++ y que a menudo tiene problemas con el máximo potencial de Python. Este es un script que escribí para traducir documentos de látex en diferen...

3  Incluyendo recursos de recursos en Enum para mostrar el nombre constante enum en diferentes idiomas [cerrado]  ( Including resourcebundle in enum in order to display enum constant name in diffe ) 
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas. ¿Quieres ...

4  Métodos de extensión para el motor de traducción  ( Extension methods for translation engine ) 
Nuestra aplicación utiliza algunos singletos para cadenas localizadas. Estas llamadas solían ser largas y sucias. Por lo tanto, algún compañero de trabajo cre...

5  Algoritmos de cadena y locale  ( String algorithms and locale ) 
Estoy tratando de escribir algunos algoritmos de cadena que quiero trabajar para cualquier tipo de cadenas y / o local. Logré obtener algunos resultados que t...

0  JavaScript - Diferencia entre dos fechas en días o menos [cerrado]  ( Javascript difference between two dates in days or less ) 
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas. ¿Quieres ...

5  Localización WPF - Uso de Resex  ( Wpf localisation using resx ) 
Tengo una pequeña aplicación WPF que no estoy realizando exactamente, pero tampoco codifican recursos. Sé que WPF no usa archivos .resx para ese propósito, pe...

4  ¿Trabajar con locales en swing (con cambio en tiempo de ejecución)?  ( Working with locales in swing with change at runtime ) 
Pensé en la mejor manera de implementar la localización con tiempo de ejecución en el swing. Actualmente resuelvo el problema como ese: JMenu menuData = ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos