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?
- Comportamiento inesperado de telephonyManager.getSimCountryIso ()
- Evento OnKeyUp en el navegador de Android para idiomas no latinos
- Android Traduce al árabe
- Cómo crear un tiempo localizado en String en Android
- Eliminar localizaciones no utilizadas de APK
- Pregunta de localización de Android
- Código de lengua para flamenco
- ¿Cuál es el nombre de la carpeta "valores" para el idioma danés?
- Visualización de fechas en formato localizado en Android
- ¿Cómo puedo crear una aplicación androide multilingüe para los idiomas de derecha a izquierda?
- ¿Cómo puedo poner un parámetro en una cadena localizada en Android?
- Localización de las cadenas de apk tanto en inglés como en inglés?
- ¿Cómo evitar fallos debido a entradas de cadena faltantes?
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ómo cambiar la propiedad y el tamaño de CollapsingToolbarLayout?
- Conectar un dispositivo Android a un servicio web en un host local