Localización de archivos de activos

Tengo varios archivos html en la carpeta de activos. ¿Cómo puedo localizarlos? ¿Es mi única opción para poner algunos hardcode para escoger el archivo correcto basado en la configuración regional?

Esto no es compatible directamente, pero aquí es lo que he hecho …

Separa tus archivos en grupos por código de país (como lo harías para los archivos de recursos normales) y luego crea una cadena localizada en cada uno de tus archivos string.xml localizados, algo así como "prefix" (donde prefijo sería "en" para English por ejemplo).

A continuación, cuando cree sus nombres de archivo de activos, use algo como getString("prefix") + "-" + "<name-of-asset-> .

Al menos alguna variación de lo anterior debería funcionar para usted.

Si desea localizar un archivo HTML, simplemente puede ponerlo en res / raw- <language> /filename.html (donde <language> = en, es, fr, it, etc.) y luego acceder a él desde su código con el Resource ID R.raw.filename . El marco seleccionará el archivo correcto de acuerdo con la configuración regional.

Coloque sus archivos en la carpeta de activos con sufijo local. Defina un recurso de cadena 'myLocalizedFileName' para cada archivo y obtenga el nombre de archivo a través de R.string.myLocalizedFileName.

Ejemplo:

Estructura de la carpeta:

 assets/ assets/help.html assets/help_de.htlm 

Recursos de cadenas para cada idioma en res / values ​​/ strings.xml:

 <resource> <string name=helpFile>help.html</string> </resource> 

WebView llamada:

 public class HelpActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { ... findViewById(R.id.helpWebView) .loadUrl("file:///android_asset/" + getString(R.string.helpFile)); } } 

Tratar de localizar con assets-ja no funcionará, porque lamentablemente no son archivos de recursos. La mejor opción es localizar mediante programación, con la configuración regional adecuada. Alternativamente, el contenido de un archivo HTML es simplemente texto. Si se ajusta a su proyecto, puede intentar almacenar esta cadena como una entrada en el strings.xml (o su propio archivo myHtmlText.xml ?) De una nueva carpeta values-ja , por ejemplo.

Colocar archivos en la carpeta raw-LOCALE elegirá automáticamente la ubicación correcta, pero si carga esos archivos en las rutas de acceso web se romperán después de la ofuscación usando Proguard.

Proguard rompe Android WebView, ¿Por qué?

Entonces la única solución es usar la carpeta de los activos y utilizar el archivo LOCALE y recoger los archivos correctos.

Una alternativa al uso de un archivo por código de país (como se describe en las respuestas de Andrew White y PJ_Finnegan ) es definir el HTML sólo una vez (por ejemplo, en la carpeta de assets ) y utilizar @string IDs en él,

 <html> <body> <p>@string/message_text</p> </body> </html> 

Después de cargar el elemento en una cadena, puede pasar su contenido a replaceResourceStrings() :

 /** * Regex that matches a resource string such as <code>@string/a-b_c1</code>. */ private static final String REGEX_RESOURCE_STRING = "@string/([A-Za-z0-9-_]*)"; /** Name of the resource type "string" as in <code>@string/...</code> */ private static final String DEF_TYPE_STRING = "string"; /** * Recursively replaces resources such as <code>@string/abc</code> with * their localized values from the app's resource strings (eg * <code>strings.xml</code>) within a <code>source</code> string. * * Also works recursively, that is, when a resource contains another * resource that contains another resource, etc. * * @param source * @return <code>source</code> with replaced resources (if they exist) */ public static String replaceResourceStrings(Context context, String source) { // Recursively resolve strings Pattern p = Pattern.compile(REGEX_RESOURCE_STRING); Matcher m = p.matcher(source); StringBuffer sb = new StringBuffer(); while (m.find()) { String stringFromResources = getStringByName(context, m.group(1)); if (stringFromResources == null) { Log.w(Constants.LOG, "No String resource found for ID \"" + m.group(1) + "\" while inserting resources"); /* * No need to try to load from defaults, android is trying that * for us. If we're here, the resource does not exist. Just * return its ID. */ stringFromResources = m.group(1); } m.appendReplacement(sb, // Recurse replaceResourceStrings(context, stringFromResources)); } m.appendTail(sb); return sb.toString(); } /** * Returns the string value of a string resource (eg defined in * <code>values.xml</code>). * * @param name * @return the value of the string resource or <code>null</code> if no * resource found for id */ public static String getStringByName(Context context, String name) { int resourceId = getResourceId(context, DEF_TYPE_STRING, name); if (resourceId != 0) { return context.getString(resourceId); } else { return null; } } /** * Finds the numeric id of a string resource (eg defined in * <code>values.xml</code>). * * @param defType * Optional default resource type to find, if "type/" is not * included in the name. Can be null to require an explicit type. * * @param name * the name of the desired resource * @return the associated resource identifier. Returns 0 if no such resource * was found. (0 is not a valid resource ID.) */ private static int getResourceId(Context context, String defType, String name) { return context.getResources().getIdentifier(name, defType, context.getPackageName()); } 

Lo bueno de este enfoque es que sólo tiene que especificar la estructura del HTML una vez y utilizar el mecanismo de localización de android . Además, permite la referencia recursiva de cadenas en strings.xml, que no es compatible con Context.getResources() . Por ejemplo:

 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="message_text">Some string @string/another_one.</string> </resources> 

La desventaja es que el análisis se realiza en tiempo de ejecución, por lo que la especificación de un HTML dedicado para cada idioma tiene un mejor rendimiento cuando se utiliza en la aplicación.

Para un ejemplo que utiliza este código para convertir HTML de un archivo de recursos a un CharSequence " CharSequence " (usando el TagHandler de Kuitsi ) que se puede mostrar en TextView vea TextUtil .

  • Código para soporte multilingüe en android
  • OnLocationChanged la devolución de llamada se hace en qué hilo? El hilo principal de la interfaz de usuario?
  • Obtener el idioma actual en el dispositivo
  • ¿Cómo se establece el lenguaje de etiquetas de mapa en Google Maps Android API v2
  • Obtener el idioma del usuario en android
  • Adición de archivos de localización de cadenas de un servidor
  • Valores locales de chino-zh_CN dan un error en Eclipse
  • Aplicaciones en varios idiomas en Android Market: ¿capturas de pantalla para más de un idioma?
  • Cómo eliminar fácilmente los recursos de localización innecesarios de bibliotecas añadidas en la versión APK
  • Android change language escuchar
  • Soporte para iconos localizados en aplicaciones de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.