voorth said:
Have you considered using a ListResourceBundle? This gives you the same
language/locale resolution as a PropertyResourceBundle, but you get to
define the appropriate behaviour yourself.
Unless I give ListResourceBundle less credit than it deserves, it won't
do things as complex as I want to - for example, I'll quote one of the
methods I have - the spanish version of "get a number and return it as
a
phrase" (I want each Idiom_XX class, where XX={es, en, fr, etc.}, to
have its own version of "String convierteEntero(String, int)"):
public String convierteEntero(String numero, int genero) {
if (!(esEnteroValido(numero))) return "número inválido";
String frase="";
boolean negativo=false;
if (numero.charAt(0)=='+') {
numero=numero.substring(1);
}
if (numero.charAt(0)=='-') {
negativo=true;
numero=numero.substring(1);
}
if (numero.equals(ceros(numero.length()))) {
numero="0";
negativo=false; // No queremos entregar "menos cero".
}
if (!(numero.equals("0"))) {
numero=quitaCerosALaIzquierda(numero);
}
if (numero.length()>6) {
// Números mayores que 1.000.000.
for (int i=0;i<RAICES.length;i++) {
int largo=6*(RAICES.length-i);
if (numero.length()>=(largo+1)) {
if
((numero.length()==largo+1)&&(numero.charAt(0)=='1')) {
frase+="un "+RAICES
+"ón"
+((numero.equals("1"+ceros(largo)))?""
"
"+convierteEntero(numero.substring(1), genero)));
} else {
frase+=convierteEntero(numero.substring(0,numero.length()-largo),
GENERO_MASCULINO) // Sí, masculino. Ver la nota en la
javadocumentación.
+" "+RAICES+"ones";
String
resto=numero.substring(numero.length()-largo);
if (!(resto.equals(ceros(resto.length())))) {
frase+=" "+convierteEntero(resto, genero);
}
}
break;
}
}
} else {
// Números menores que 1.000.000 - es más fácil
manejarlos como enteros...
int esteNumero=(new Integer(numero).intValue());
if (esteNumero== 0) { frase+="cero";
} else if (esteNumero== 1) {
frase+="un"+(genero==GENERO_FEMENINO?"_":"");
} else if (esteNumero== 2) { frase+="dos";
} else if (esteNumero== 3) { frase+="tres";
} else if (esteNumero== 4) { frase+="cuatro";
} else if (esteNumero== 5) { frase+="cinco";
} else if (esteNumero== 6) { frase+="seis";
} else if (esteNumero== 7) { frase+="siete";
} else if (esteNumero== 8) { frase+="ocho";
} else if (esteNumero== 9) { frase+="nueve";
} else if (esteNumero== 10) { frase+="diez";
} else if (esteNumero== 11) { frase+="once";
} else if (esteNumero== 12) { frase+="doce";
} else if (esteNumero== 13) { frase+="trece";
} else if (esteNumero== 14) { frase+="catorce";
} else if (esteNumero== 15) { frase+="quince";
} else if (esteNumero== 16) { frase+="dieciséis";
} else if ( (esteNumero>=17)
&&(esteNumero<=19)
) {
frase+="dieci"+convierteEntero(numero.substring(1), genero);
} else if (esteNumero== 20) { frase+="veinte";
} else if (esteNumero== 21) {
frase+="veinti"+(genero==GENERO_FEMENINO?"una":"ún");
} else if (esteNumero== 22) { frase+="veintidós";
} else if (esteNumero== 23) { frase+="veintitrés";
} else if ( (esteNumero==24)
||(esteNumero==25)
) {
frase+="veinti"+convierteEntero(numero.substring(1), genero);
} else if (esteNumero== 26) { frase+="veintiséis";
} else if ( (esteNumero>=27)
&&(esteNumero<=29)
) {
frase+="veinti"+convierteEntero(numero.substring(1), genero);
} else if (esteNumero== 30) { frase+="treinta";
} else if (esteNumero== 40) { frase+="cuarenta";
} else if (esteNumero== 50) { frase+="cincuenta";
} else if (esteNumero== 60) { frase+="sesenta";
} else if (esteNumero== 70) { frase+="setenta";
} else if (esteNumero== 80) { frase+="ochenta";
} else if (esteNumero== 90) { frase+="noventa";
} else if (esteNumero<= 99) {
frase+=convierteEntero(numero.substring(0,1)+"0", genero)+" y
"+convierteEntero(numero.substring(1), genero);
} else if (esteNumero==100) { frase+="cien";
} else if (esteNumero<=199) { frase+="ciento
"+convierteEntero(numero.substring(1), genero);
} else if (esteNumero==500) { frase+="quinient_s";
} else if (esteNumero==700) { frase+="setecient_s";
} else if (esteNumero==900) { frase+="novecient_s";
} else if ( (esteNumero==200)
||(esteNumero==300)
||(esteNumero==400)
||(esteNumero==600)
||(esteNumero==800)
) {
frase+=convierteEntero(numero.substring(0,1), genero)+"cient_s";
} else if (esteNumero<=999) {
frase+=convierteEntero(numero.substring(0,1)+"00", genero)+"
"+convierteEntero(numero.substring(1), genero);
} else if (esteNumero==1000) { frase+="mil";
} else if (esteNumero<=1999) { frase+="mil
"+convierteEntero(numero.substring(1), genero);
} else if (esteNumero<=999999) {
frase+=convierteEntero(numero.substring(0,numero.length()-3), genero)+"
mil"
+(numero.substring(numero.length()-3).equals("000")?"":"
"+convierteEntero(numero.substring(numero.length()-3), genero));
} else {
// Esto es imposible por construcción.
frase="número desconocido";
}
}
frase=reemplazaTodo(frase, "_",
(genero==GENERO_FEMENINO?"a":"o"));
return (negativo?"menos ":"")+frase;
}
I don't think ListResourceBundle is up to the task. Of course, I could
be wrong.