Ver la Versión Completa : [ SOLUCIONADO ] Bases datos varios idiomas
sonydei
26/10/15, 08:53:57
Tengo una aplicación tipo preguntas y respuestas básica que se nutre de una base de datos tipo txt.
Para pasarla a varios idiomss creado un string , pero no me funciona. La base de datos la tengo en la carpeta assets.
Que hago mal?
Enviado desde mi GT-N7100 mediante Tapatalk
mocelet
26/10/15, 09:16:25
Para pasarla a varios idiomss creado un string , pero no me funciona
Cuánto daño ha hecho el rumor de que en este foro cobran por palabras xD
No he entendido nada:
¿Tienes varios ficheros txt de preguntas/respuestas cada uno en un idioma?
¿O tienes un fichero txt con todos los idiomas dentro?
¿Los guardas con el mismo nombre en assets?
¿El problema es que no puedes leer el fichero? ¿Usas el AssetManager?
¿Qué significa que has creado un String?
¿Qué significa "no me funciona" (da error, excepción, no sale lo que esperabas...)?
P.D: También puedes poner el fichero en /res/raw , que así aprovechas la selección de idiomas de Android (si te interesa, usando /res/raw-es para español p.ej. y así siempre carga el fichero que corresponda al idioma de la app)
sonydei
26/10/15, 09:26:17
Vale perdón
Tengo una aplicación solo con una base de datos llamadas quiz.txt, que está en ingles y su correspondiente llamada en play.java.
Bien lo que hecho a sido traducir esa base de datos a varios idiomas, creando quiz-es.txt, quiz-fr.txt y he creado un string, para poder cambiarlo en el play java y no me funciona, porque solo carga el ingles.
¿Cual sería la solución?
mocelet
26/10/15, 09:30:40
¿Esto te funciona getAssets().open("quiz.txt") pero ésto no getAssets().open("quiz-es.txt")?
EDIT: Si el problema es el parámetro que estás pasando, mira a ver de dónde estás sacando el valor
kriogeN
26/10/15, 09:31:18
Es decir, que lo que no te funciona es asignar al String el apropiado "-es", "-fr", etc... ¿no? Si intentas cargar el fichero quiz.txt si te funciona bien. ¿Correcto?
En ese caso los values son tus amigos, crea un fichero de recursos de Strings en cada una de las carpetas values, de tal forma que tendrás esto:
/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="fichero_quiz">quiz.txt</string>
</resources>
/values-es/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="fichero_quiz">quiz-es.txt</string>
</resources>
/values-fr/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="fichero_quiz">quiz-fr.txt</string>
</resources>
Y así sucesivamente, de esa forma el sistema elegirá el idioma apropiado. siendo por defecto el inglés para idiomas que no están registrados.
Dexafree
26/10/15, 09:50:22
La solución de kriogeN me parece la mas elegante y escalable (si el dia de mañana creas quiz-de.txt solo tendrás que crear un nuevo .xml en values-de para que lo detecte, el código se quedará igual).
Dicho esto, y para terminar de complementar las grandes respuestas de mis compañeros, para recuperar el nombre el código sería
String nombreFichero = getString(R.string.fichero_quiz);
El cual automáticamente cogería el values-XX adecuado.
Asegúrate de tener uno marcado por defecto en values/strings.xml (en caso de que el usuario tenga algun idioma que tu no tienes soportado).
sonydei
26/10/15, 09:53:35
¿Esto te funciona getAssets().open("quiz.txt") pero ésto no getAssets().open("quiz-es.txt")?
EDIT: Si el problema es el parámetro que estás pasando, mira a ver de dónde estás sacando el valor
ctx.getAssets().open("InitializeDB.txt"), "UTF-8"));
esto me funciona
ctx.getAssets().open("R.string.InitializeDB"), "UTF-8"));
esto no me funciona
Es decir, que lo que no te funciona es asignar al String el apropiado "-es", "-fr", etc... ¿no? Si intentas cargar el fichero quiz.txt si te funciona bien. ¿Correcto?
En ese caso los values son tus amigos, crea un fichero de recursos de Strings en cada una de las carpetas values, de tal forma que tendrás esto:
/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="fichero_quiz">quiz.txt</string>
</resources>
/values-es/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="fichero_quiz">quiz-es.txt</string>
</resources>
/values-fr/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="fichero_quiz">quiz-fr.txt</string>
</resources>
Y así sucesivamente, de esa forma el sistema elegirá el idioma apropiado. siendo por defecto el inglés para idiomas que no están registrados.
y como dice Kriogen esos son los strings que he creado.
mocelet
26/10/15, 10:02:23
ctx.getAssets().open("InitializeDB.txt"), "UTF-8"));
esto me funciona
ctx.getAssets().open("R.string.InitializeDB"), "UTF-8"));
esto no me funciona
y como dice Kriogen esos son los strings que he creado.
Claro, no existe ningún fichero que se llame R.string.InitializeDB. Tienes que leer la String primero a partir del identificador de recurso con getString(R.string.InitializeDB), es decir:
ctx.getAssets().open(getString(R.string.Initialize DB)), "UTF-8"));
---
Menciono otra alternativa, que es guardar los quiz en /res/raw localizados y que Android elija el recurso automáticamente, es decir:
/res/raw/quiz.txt
/res/raw-es/quiz.txt
/res/raw-de/quiz.txt
Y así basta con obtener el recurso de nombre R.id.quiz que Android siempre te dará el que corresponda al idioma de la app y por defecto el de /res/raw automáticamente. Amén de que el IDE avisa si falta el recurso en alguno de los idiomas soportados.
Sin embargo, no usaría esta alternativa... tiene una desventaja gorda: no poder elegir el idioma de las preguntas dentro de la app (siempre lo haría Android en función del idioma del sistema).
sonydei
26/10/15, 10:08:58
Muchisimas gracias a todos, voy a probar y comento.
sonydei
26/10/15, 13:14:02
Os pongo los dos archivos el que me funciona con una sola base de datos:
public static void initialize(SQLiteDatabase db, Context ctx) {
// Initialize DB
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
ctx.getAssets().open("InitializeDB.txt"), "UTF-8"));
// do reading, usually loop until end of file reading
String mLine = reader.readLine();
while (mLine != null) {
// process line
db.execSQL(mLine);
mLine = reader.readLine();
}
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Y el modificado que no funciona con las modificiaciones que me habéis indicado.
public static void initialize(SQLiteDatabase db, Context ctx) {
// Initialize DB
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
ctx.getAssets().open(getString("R.string.InitializeDB")), "UTF-8"));
// do reading, usually loop until end of file reading
String mLine = reader.readLine();
while (mLine != null) {
// process line
db.execSQL(mLine);
mLine = reader.readLine();
}
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static String getString(String string) {
// TODO Auto-generated method stub
return null;
}
y este el string por ejemplo el español
<string name="InitializeDB">InitializeDB-es.txt</string>
¿Donde veis el fallo? Muchas gracias por vuestra ayuda.
mocelet
26/10/15, 13:23:28
Os pongo los dos archivos el que me funciona con una sola base de datos:
public static void initialize(SQLiteDatabase db, Context ctx) {
// Initialize DB
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
ctx.getAssets().open("InitializeDB.txt"), "UTF-8"));
// do reading, usually loop until end of file reading
String mLine = reader.readLine();
while (mLine != null) {
// process line
db.execSQL(mLine);
mLine = reader.readLine();
}
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Y el modificado que no funciona con las modificiaciones que me habéis indicado.
public static void initialize(SQLiteDatabase db, Context ctx) {
// Initialize DB
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
ctx.getAssets().open(getString("R.string.InitializeDB")), "UTF-8"));
// do reading, usually loop until end of file reading
String mLine = reader.readLine();
while (mLine != null) {
// process line
db.execSQL(mLine);
mLine = reader.readLine();
}
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static String getString(String string) {
// TODO Auto-generated method stub
return null;
}
y este el string por ejemplo el español
<string name="InitializeDB">InitializeDB-es.txt</string>
¿Donde veis el fallo? Muchas gracias por vuestra ayuda.
O_O Eso no son las modificaciones que te comenté
Primero que has creado un método getString porque te ha parecido bien y devuelve null, cuando evidentemente me refería al método getString de Android para obtener recursos.
Segundo, sigues sin quitar las comillas a R.string.blablabla...
Escríbelo así para menos dudas:
ctx.getAssets().open(ctx.getString(R.string.Initia lizeDB)), "UTF-8"));
sonydei
26/10/15, 13:39:17
Gracias por tu ayuda Omelet estoy aprendiendo y creo que ya se donde esta el fallo
InitializeDB cannot be resolved or is not a field
creo que el string está mal puesto, porque si está dentro de la carpeta assets, no le estoy danto el path correcto ¿Es esto?
sonydei
07/11/15, 12:39:54
Bueno funcionó, podéis marcarlo como solucionado, era el eclipse que daba un error, empecé de nuevo y como apuntarón mocelet Dexafree y kriogeN, era la solución. Gracias a los tres.
Dexafree
07/11/15, 13:17:08
Marcado como Solucionado queda :ok:
vBulletin® v3.8.1, Copyright ©2000-2025, Jelsoft Enterprises Ltd.