Android
Localización con recursos en Android.
Buscar..
Moneda
Currency currency = Currency.getInstance("USD");
NumberFormat format = NumberFormat.getCurrencyInstance();
format.setCurrency(currency);
format.format(10.00);
Añadiendo traducción a tu aplicación de Android
Tienes que crear un archivo strings.xml
diferente para cada nuevo idioma.
- Haga clic derecho en la carpeta res
- Elegir Nuevo → Archivo de recursos de valores
- Seleccione una configuración regional de los calificadores disponibles
- Haga clic en el botón Siguiente (>>)
- Selecciona un idioma
- Nombra el archivo strings.xml
strings.xml
<resources>
<string name="app_name">Testing Application</string>
<string name="hello">Hello World</string>
</resources>
strings.xml (hi)
<resources>
<string name="app_name">परीक्षण आवेदन</string>
<string name="hello">नमस्ते दुनिया</string>
</resources>
Configurando el idioma programáticamente:
public void setLocale(String locale) // Pass "en","hi", etc.
{
myLocale = new Locale(locale);
// Saving selected locale to session - SharedPreferences.
saveLocale(locale);
// Changing locale.
Locale.setDefault(myLocale);
android.content.res.Configuration config = new android.content.res.Configuration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
config.setLocale(myLocale);
} else {
config.locale = myLocale;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
getBaseContext().createConfigurationContext(config);
} else {
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
}
}
La función anterior cambiará los campos de texto a los que se hace referencia desde strings.xml . Por ejemplo, suponga que tiene las siguientes dos vistas de texto:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello"/>
Luego, después de cambiar la configuración regional, las cadenas de idioma que tienen los app_name
y hello
se cambiarán en consecuencia.
Tipo de directorios de recursos en la carpeta "res"
Al localizar diferentes tipos de recursos se requieren, cada uno de los cuales tiene su propio hogar en la estructura del proyecto de Android. A continuación se muestran los diferentes directorios que podemos colocar en el directorio \res
. Los tipos de recursos colocados en cada uno de estos directorios se explican en la siguiente tabla:
Directorio | Tipo de recurso |
---|---|
animador/ | Archivos XML que definen animaciones de propiedades. |
anim / | Archivos XML que definen animaciones de interpolación. (Las animaciones de propiedades también se pueden guardar en este directorio, pero se prefiere el animador / directorio para que las animaciones de propiedades distingan entre los dos tipos). |
color/ | Archivos XML que definen una lista de colores de estado. Ver recurso de lista de estados de color |
dibujable / | "Archivos de mapa de bits (.png, .9.png, .jpg, .gif) o archivos XML que se compilan en los siguientes subtipos de recursos dibujables:: Bitmap files - Nine-Patches (re-sizable bitmaps) - State lists - Shapes - Animation drawables - Other drawables - " |
mipmap / | Archivos dibujables para diferentes densidades de iconos de lanzadores. Para obtener más información sobre la administración de los iconos del iniciador con mipmap / carpetas, consulte Administración de proyectos. |
diseño/ | Archivos XML que definen un diseño de interfaz de usuario. Ver recurso de diseño. |
menú/ | Archivos XML que definen menús de aplicaciones, como un menú de opciones, un menú contextual o un submenú. Ver recurso de menú. |
crudo/ | Archivos arbitrarios para guardar en su forma cruda. Para abrir estos recursos con un InputStream sin formato, llame a Resources.openRawResource () con el ID de recurso, que es R.raw.filename. |
Sin embargo, si necesita acceder a los nombres de archivos originales y a la jerarquía de archivos, puede considerar guardar algunos recursos en el directorio de activos (en lugar deres / raw /). Los archivos en los activos / no tienen un ID de recurso, por lo que puede leerlos solo con AssetManager. | |
valores/ | Archivos XML que contienen valores simples, como cadenas, enteros y colores, así como estilos y temas |
xml / | Archivos XML arbitrarios que se pueden leer en tiempo de ejecución llamando a Resources.getXML (). Aquí se deben guardar varios archivos de configuración XML, como una configuración de búsqueda. |
Tipos de configuración y nombres de calificadores para cada carpeta en el directorio "res"
Cada directorio de recursos en la carpeta res
(que se enumera en el ejemplo anterior) puede tener diferentes variaciones de los recursos contenidos en un directorio de nombre similar con un sufijo con diferentes qualifier-values
de qualifier-values
para cada configuration-type
.
Ejemplo de variaciones del directorio `` con diferentes valores de calificador con sufijo que se ven a menudo en nuestros proyectos de Android:
- dibujable /
- drawable-en /
- dibujable-fr-rCA /
- drawable-en-port /
- drawable-en-notouch-12key /
- drawable-port-ldpi /
- drawable-port-notouch-12key /
Lista exhaustiva de todos los diferentes tipos de configuración y sus valores calificadores para los recursos de Android:
Configuración | Valores calificadores |
---|---|
MCC y MNC | Ejemplos: |
mcc310 | |
mcc310-mnc004 | |
mcc208-mnc00 | |
etc. | |
Idioma y región | Ejemplos: |
en | |
fr | |
en-rUS | |
fr-rFR | |
fr-rCA | |
Dirección de diseño | ldrtl |
ldltr | |
Ancho más pequeño | swdp |
Ejemplos: | |
sw320dp | |
sw600dp | |
sw720dp | |
Ancho disponible | wdp |
w720dp | |
w1024dp | |
Altura disponible | hdp |
h720dp | |
h1024dp | |
Tamaño de pantalla | pequeña |
normal | |
grande | |
xlarge | |
Aspecto de la pantalla | largo |
No largo | |
Pantalla redonda | redondo |
cerca | |
Orientación de la pantalla | Puerto |
tierra | |
Modo de interfaz de usuario | coche |
escritorio | |
televisión | |
aparato | |
Modo nocturno | noche |
no de noche | |
Densidad de píxeles de la pantalla (dpi) | ldpi |
mdpi | |
hdpi | |
xhdpi | |
xxhdpi | |
xxxhdpi | |
nodpi | |
tvdpi | |
anydpi | |
Tipo de pantalla táctil | no tocar |
dedo | |
Disponibilidad de teclado | llave sujeta |
llave oculta | |
keyssoft | |
Método de entrada de texto primario | nokeys |
QWERTY | |
12 teclas | |
Disponibilidad de la tecla de navegación | navexposed |
navhidden | |
Método de navegación no táctil principal | nonav |
dpad | |
bola de seguimiento | |
rueda | |
Versión de plataforma (nivel API) | Ejemplos: |
v3 | |
v4 | |
v7 |
Cambiar la configuración regional de la aplicación de Android programáticamente
En los ejemplos anteriores se entiende cómo localizar los recursos de la aplicación. El siguiente ejemplo explica cómo cambiar la configuración regional de la aplicación dentro de la aplicación, no desde el dispositivo. Para cambiar solo la configuración regional de la aplicación, puede utilizar la siguiente configuración de configuración regional.
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.preference.PreferenceManager;
import android.view.ContextThemeWrapper;
import java.util.Locale;
/**
* Created by Umesh on 10/10/16.
*/
public class LocaleUtils {
private static Locale mLocale;
public static void setLocale(Locale locale){
mLocale = locale;
if(mLocale != null){
Locale.setDefault(mLocale);
}
}
public static void updateConfiguration(ContextThemeWrapper wrapper){
if(mLocale != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
Configuration configuration = new Configuration();
configuration.setLocale(mLocale);
wrapper.applyOverrideConfiguration(configuration);
}
}
public static void updateConfiguration(Application application, Configuration configuration){
if(mLocale != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1){
Configuration config = new Configuration(configuration);
config.locale = mLocale;
Resources res = application.getBaseContext().getResources();
res.updateConfiguration(configuration, res.getDisplayMetrics());
}
}
public static void updateConfiguration(Context context, String language, String country){
Locale locale = new Locale(language,country);
setLocale(locale);
if(mLocale != null){
Resources res = context.getResources();
Configuration configuration = res.getConfiguration();
configuration.locale = mLocale;
res.updateConfiguration(configuration,res.getDisplayMetrics());
}
}
public static String getPrefLangCode(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getString("lang_code","en");
}
public static void setPrefLangCode(Context context, String mPrefLangCode) {
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putString("lang_code",mPrefLangCode);
editor.commit();
}
public static String getPrefCountryCode(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getString("country_code","US");
}
public static void setPrefCountryCode(Context context,String mPrefCountryCode) {
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putString("country_code",mPrefCountryCode);
editor.commit();
}
}
Inicialice la configuración regional que el usuario prefiera, desde la clase de aplicación.
public class LocaleApp extends Application{
@Override
public void onCreate() {
super.onCreate();
LocaleUtils.setLocale(new Locale(LocaleUtils.getPrefLangCode(this), LocaleUtils.getPrefCountryCode(this)));
LocaleUtils.updateConfiguration(this, getResources().getConfiguration());
}
}
También necesita crear una actividad base y extender esta actividad a todas las demás actividades para que pueda cambiar la configuración regional de la aplicación solo en un lugar de la siguiente manera:
public abstract class LocalizationActivity extends AppCompatActivity {
public LocalizationActivity() {
LocaleUtils.updateConfiguration(this);
}
// We only override onCreate
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
Nota: Siempre inicialice la configuración regional en el constructor.
Ahora puedes usar LocalizationActivity como sigue.
public class MainActivity extends LocalizationActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Nota: cuando cambia la configuración regional de la aplicación mediante programación, debe reiniciar su actividad para que tenga efecto el cambio de configuración regional Para que funcione correctamente para esta solución, use la configuración regional de las preferencias compartidas en el inicio de la aplicación
android:name=".LocaleApp"
en Usted Manifest.xml.
A veces, el mensaje de Lint checker para crear la versión de lanzamiento. Para resolver tal problema, siga las siguientes opciones.
Primero:
Si desea deshabilitar la traducción solo para algunas cadenas, agregue el siguiente atributo a la cadena predeterminada.xml
<string name="developer" translatable="false">Developer Name</string>
Segundo:
Ignore todas las traducciones faltantes del archivo de recursos. Añada el siguiente atributo. Es el atributo de ignorar del espacio de nombres de las herramientas en su archivo de cadenas, de la siguiente manera:
<?xml version="1.0" encoding="utf-8"?>
<resources
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="MissingTranslation" >
http://stackoverflow.com/documentation/android/3345/localization-with-resources-in-android#
<!-- your strings here; no need now for the translatable attribute -->
</resources>
Tercero:
Otra forma de deshabilitar la cadena no traducible
http://tools.android.com/recent/non-translatablestrings
Si tiene muchos recursos que no se deben traducir, puede colocarlos en un archivo llamado donottranslate.xml y lint los considerará todos recursos no traducibles.
Cuarto:
También puede agregar la configuración regional en el archivo de recursos
<resources
xmlns:tools="http://schemas.android.com/tools"
tools:locale="en" tools:ignore="MissingTranslation">
También puede deshabilitar la comprobación de traducción faltante para la pelusa de app / build.gradle
lintOptions {
disable 'MissingTranslation'
}