Android
Localisation avec des ressources sous Android
Recherche…
Devise
Currency currency = Currency.getInstance("USD");
NumberFormat format = NumberFormat.getCurrencyInstance();
format.setCurrency(currency);
format.format(10.00);
Ajout de la traduction sur votre application Android
Vous devez créer un strings.xml
différent pour chaque nouvelle langue.
- Cliquez avec le bouton droit sur le dossier res
- Choisissez Nouveau → Fichier de ressources Valeurs
- Sélectionnez un paramètre régional parmi les qualificateurs disponibles
- Cliquez sur le bouton Suivant (>>)
- Sélectionnez une langue
- Nommez le fichier strings.xml
strings.xml
<resources>
<string name="app_name">Testing Application</string>
<string name="hello">Hello World</string>
</resources>
strings.xml (salut)
<resources>
<string name="app_name">परीक्षण आवेदन</string>
<string name="hello">नमस्ते दुनिया</string>
</resources>
Définir la langue par programmation:
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 fonction ci-dessus modifiera les champs de texte référencés depuis strings.xml . Par exemple, supposons que vous ayez les deux vues de texte suivantes:
<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"/>
Ensuite, après avoir modifié les paramètres régionaux, les chaînes de langue ayant les identifiants app_name
et hello
seront modifiées en conséquence.
Type de répertoires de ressources sous le dossier "res"
Lors de la localisation de différents types de ressources sont nécessaires, chacun ayant sa propre maison dans la structure du projet Android. Voici les différents répertoires que nous pouvons placer sous le répertoire \res
. Les types de ressources placés dans chacun de ces répertoires sont expliqués dans le tableau ci-dessous:
Annuaire | Type de ressource |
---|---|
animateur/ | Fichiers XML définissant des animations de propriétés. |
anim / | Fichiers XML définissant les animations Tween. (Les animations de propriétés peuvent également être enregistrées dans ce répertoire, mais l'animateur / répertoire est préférable pour les animations de propriétés afin de distinguer les deux types.) |
Couleur/ | Fichiers XML définissant une liste d'états de couleurs. Voir la liste des états des couleurs |
dessinable / | "Fichiers bitmap (.png, .9.png, .jpg, .gif) ou fichiers XML compilés dans les sous-types de ressources pouvant être dessinés suivants: Bitmap files - Nine-Patches (re-sizable bitmaps) - State lists - Shapes - Animation drawables - Other drawables - " |
mipmap / | Fichiers pouvant être dessinés pour différentes densités d'icône de lanceur. Pour plus d'informations sur la gestion des icônes de lanceur avec mipmap / dossiers, voir Gestion de la vue d'ensemble des projets. |
disposition/ | Fichiers XML définissant une interface utilisateur. Voir Ressource de mise en page. |
menu/ | Fichiers XML qui définissent des menus d'application, tels qu'un menu d'options, un menu contextuel ou un sous-menu. Voir la ressource de menu. |
brut/ | Fichiers arbitraires à enregistrer sous leur forme brute. Pour ouvrir ces ressources avec un InputStream brut, appelez Resources.openRawResource () avec l'ID de ressource, à savoir R.raw.filename. |
Cependant, si vous avez besoin d'accéder aux noms de fichiers d'origine et à la hiérarchie de fichiers, vous pouvez envisager de sauvegarder certaines ressources dans le répertoire assets / (au lieu deres / raw /). Les fichiers contenus dans assets / ne reçoivent pas d'ID de ressource, vous pouvez donc les lire uniquement à l'aide de AssetManager. | |
valeurs/ | Fichiers XML contenant des valeurs simples, telles que des chaînes, des entiers et des couleurs, ainsi que des styles et des thèmes |
xml / | Fichiers XML arbitraires pouvant être lus lors de l'exécution en appelant Resources.getXML (). Différents fichiers de configuration XML doivent être enregistrés ici, par exemple une configuration interrogeable. |
Types de configuration et noms de qualificateur pour chaque dossier sous le répertoire "res"
Chaque répertoire de ressources sous le dossier res
(répertorié dans l'exemple ci-dessus) peut avoir différentes variantes des ressources contenues dans un répertoire portant le même nom, avec des qualifier-values
de qualifier-values
différentes pour chaque configuration-type
.
Exemple de variantes de répertoire avec différentes valeurs de qualificatif suffixées que l'on voit souvent dans nos projets Android:
- dessinable /
- drawable-fr /
- drawable-fr-rCA /
- drawable-en-port /
- drawable-en-notouch-12key /
- drawable-port-ldpi /
- drawable-port-notouch-12key /
Liste exhaustive de tous les différents types de configuration et de leurs valeurs de qualificatif pour les ressources Android:
Configuration | Valeurs de qualification |
---|---|
MCC et MNC | Exemples: |
mcc310 | |
mcc310-mnc004 | |
mcc208-mcc00 | |
etc. | |
Langue et région | Exemples: |
en | |
fr | |
en-rUS | |
fr-rFR | |
fr-rCA | |
Direction de la mise en page | ldrtl |
ldltr | |
plus petite largeur | swdp |
Exemples: | |
sw320dp | |
sw600dp | |
sw720dp | |
Largeur disponible | wdp |
w720dp | |
w1024dp | |
Hauteur disponible | HDP |
h720dp | |
h1024dp | |
Taille de l'écran | petit |
Ordinaire | |
grand | |
xlarge | |
Aspect de l'écran | longue |
pas longtemps | |
Écran rond | rond |
pas du tout | |
Orientation de l'écran | Port |
terre | |
Mode interface utilisateur | voiture |
bureau | |
télévision | |
appliancewatch | |
Mode nuit | nuit |
nuit | |
Densité des pixels de l'écran (dpi) | ldpi |
mdpi | |
hdpi | |
xhdpi | |
xxhdpi | |
xxxhdpi | |
nodpi | |
tvdpi | |
anydpi | |
Type d'écran tactile | pas touche |
doigt | |
Disponibilité du clavier | keysexposed |
keyhidden | |
clés | |
Méthode de saisie de texte primaire | nokeys |
qwerty | |
12key | |
Disponibilité des clés de navigation | navexposed |
navhidden | |
Méthode de navigation principale non tactile | nonav |
dpad | |
boule de commande | |
roue | |
Version de plate-forme (niveau API) | Exemples: |
v3 | |
v4 | |
v7 |
Changer la locale de l'application Android par programmation
Dans les exemples ci-dessus, vous comprenez comment localiser les ressources de l'application. L'exemple suivant explique comment modifier les paramètres régionaux de l'application dans l'application, et non à partir du périphérique. Pour modifier uniquement les paramètres régionaux de l'application, vous pouvez utiliser ci-dessous des paramètres régionaux.
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();
}
}
Initialiser les paramètres régionaux de préférence par l'utilisateur, à partir de la classe Application.
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());
}
}
Vous devez également créer une activité de base et étendre cette activité à toute autre activité afin de pouvoir modifier les paramètres régionaux de l'application d'un seul endroit, comme suit:
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);
}
}
Remarque: Toujours initialiser les paramètres régionaux dans le constructeur.
Maintenant, vous pouvez utiliser LocalizationActivity comme suit.
public class MainActivity extends LocalizationActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Remarque: Lorsque vous modifiez les paramètres régionaux de l'application par programmation, vous devez redémarrer votre activité pour modifier les paramètres régionaux. Pour fonctionner correctement avec cette solution, vous pouvez utiliser les paramètres régionaux des préférences partagées au démarrage de l'application
android:name=".LocaleApp"
in vous Manifest.xml.
Parfois, invite du vérificateur de peluches à créer la version de publication. Pour résoudre ce problème, suivez les options ci-dessous.
Premier:
Si vous souhaitez désactiver la traduction pour certaines chaînes uniquement, ajoutez l'attribut suivant à la chaîne par défaut string.xml
<string name="developer" translatable="false">Developer Name</string>
Seconde:
Ignorez toutes les traductions manquantes à partir de l'attribut d'ajout de fichier de ressources L'attribut ignore de l'espace de noms des outils dans votre fichier de chaînes, comme suit:
<?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>
Troisième:
Une autre façon de désactiver la chaîne non traduisible
http://tools.android.com/recent/non-translatablestrings
Si vous avez beaucoup de ressources qui ne doivent pas être traduites, vous pouvez les placer dans un fichier nommé donottranslate.xml et lint prendra en compte toutes les ressources non traduisibles.
Quatrième:
Vous pouvez également ajouter des paramètres régionaux dans le fichier de ressources
<resources
xmlns:tools="http://schemas.android.com/tools"
tools:locale="en" tools:ignore="MissingTranslation">
Vous pouvez également désactiver le contrôle de traduction manquant pour les peluches depuis app / build.gradle
lintOptions {
disable 'MissingTranslation'
}