2010-11-24 14 views
9

tengo una aplicación de Android multilingüe, donde he puesto las diferentes traducciones en strings.xml en el directorio respectivo.android: refiriéndose a recursos en xml personalizado

ahora también tengo un archivo XML personalizado, donde me gustaría hacer referencia a textos como éste:

<?xml version="1.0" encoding="UTF-8"?> 
<rooms> 
    <room title="@+string/localizedtext" /> 
</rooms> 

ahora cuando leí el atributo de título en mi código, obviamente, obtener la cadena sin resolver "@ + string/localizedtext "como es. ¿es posible de alguna manera resolver este enlace al texto localizado automáticamente?

gracias!

+0

¿Quizás podría compartir más acerca de lo que está tratando de lograr? Como mencioné a continuación, la construcción @ + es para crear una nueva referencia y en el caso de @string esto no tiene sentido. No creo que tenga la intención de crear una nueva cadena aquí, sino crear una nueva referencia a un recurso de cadena diferente. Sería útil conocer el caso de uso para su ejemplo de código. –

+0

me enfrento EXACTAMENTE a este problema ... ¿tengo alguna respuesta? –

Respuesta

4

La forma en que lo intentó no es posible.

Usted puede obtener una funcionalidad similar con <string-array> de recursos:

<resources> 
    <string-array name="room"> 
     <item>@string/localizedText</item> 
     <item>@string/otherLocalizedText</item> 
    </string-array> 
</resources> 

allí tendría que utilizar de esta manera:

String[] room = getResources().getStringArray(R.array.room); 
String localizedText = room[0]; 
String otherLocalizedText = room[1]; 
+0

Esto deja al desarrollador manejar la localización en código cuando Android ya tiene formas de localizar cadenas. –

+0

'@ string/localizedText' se localiza por el sistema operativo. –

+0

Padre ya le dijo que esto no es lo que está buscando. Y gracias por -1. Eliminaré mi -1 cuando elimines el tuyo. –

1

Localización en Android se hace con identificadores de recursos. Mira este tutorial de Android.

http://developer.android.com/resources/tutorials/localization/index.html

ver más adelante.

+0

sí sé que esto ya es lo que hago, pero no se relaciona con mi pregunta. – clamp

+0

No tiene sentido crear una nueva referencia a un recurso de cadena vacío. Supongo que no tengo claro qué quieres decir con esto para lograrlo. Me parece que necesitas simplemente acceder al valor de un recurso de cadena. ¿Es esto incorrecto? –

+0

bueno, tengo todos mis textos en strings.xml para todos los idiomas. y la localización funciona si los usa directamente. mi pregunta es ¿cómo puedo referirme a ellos en otros archivos xml (mi propio archivo xml personalizado) – clamp

6

Casi un año después:

public static String getStringResource(Context context, String thingie) { 
     try { 
      String[] split = thingie.split("/"); 
      String pack = split[0].replace("@", ""); 
      String name = split[1]; 
      int id = context.getResources().getIdentifier(name, pack, context.getPackageName()); 
      return context.getResources().getString(id); 
     } catch (Exception e) { 
      return thingie; 
     } 
    } 

Eso haré.

+0

Esta debería ser la respuesta a esta pregunta en particular. Corte y pegue esta encantadora función, y bob es su tío. Gracias – Hevski

5

Esto podría parecer una respuesta amplia, pero creo que aclarará un montón de cosas para las personas que pasaron horas buscándolo (soy uno de ellos).

La respuesta corta es sí, puede usar referencias en XML personalizado, no solo para cadenas, pero ese es el ejemplo que uso, para facilitar la comprensión.

Teniendo en cuenta el contexto:

  • res/valores/strings.xml
    (cadenas predeterminadas, por lo general es-es por conveniencia, pero eso es responsabilidad del desarrollador)
<resources> 
     <string name="sample_string">This is a sample string.</string> 
    </resources> 
  • res/values-fr/strings.xml
    (cadenas fritas localizada)
<resources> 
     <string name="sample_string">Ceci est un exemple de chaîne</string> 
    </resources> 
  • res/xml/prueba.xml
    (archivo XML personalizado)
<!-- @string/sample_string identifies both 
     the default and french localized strings, 
     the system settings determine which is used at runtime. 
    --> 
    <test> 
     <sample name="sampleName" text="@string/sample_string"/> 
    </test> 
  • src/com/example/app/TestXmlParser.java
//Omitted imports for clarity. 

    public class testXmlParser { 
     public static final String ns = null; 

     public int parse(XmlResourceParser parser) throws XmlPullParserException, 
                  IOException{ 
      while(parser.next() != XmlPullParser.END_DOCUMENT){ 
       if(parser.getEventType() == XmlPullParser.START_TAG){ 
        if(parser.getName().equalsIgnoreCase("sample")){ 

         // This is what matters, we're getting a 
         // resource identifier and returning it. 
         return parser.getAttributeResourceValue(ns, "text", -1);  
        } 
       } 
      } 
      return -1; 
     } 

Uso String getText(int id) para obtener la cadena correspondiente a id (localizado, si está disponible).

Utilizando el ejemplo anterior equivaldría a sustituir:

//Return the resource id 
return parser.getAttributeResourceValue(ns, "text", -1); 

con:

//Return the localized string corresponding to the id. 
int id = parser.getAttributeResourceValue(ns, "text", -1); 
return getString(id); 
+0

Qué sobre el caso donde el desarrollador no está usando una cadena localizada) Otros atributos manejan ambos escenarios automáticamente, pero este método fallará allí. – Nick

+0

Si solo está disponible el valor predeterminado, eso es lo que getString devolverá. (Disculpe la respuesta tardía) – kyis

0

Grandes kyis respuesta, la vergüenza que todavía no tengo suficientes puntos brownie para valorarlo. Para responder a la pregunta de Nick, sólo cambia el último bit de código para:

int id = parser.getAttributeResourceValue(ns, "text", 0); 
return (id != 0) ? getString(id) : parser.getAttributeValue(ns, "text"); 

Tenga en cuenta que he usado 0 para el valor por defecto del recurso ya que esto se garantiza que no ser un valor real de recursos. -1 lo habría hecho también.

Cuestiones relacionadas