2016-08-25 1 views
0

Je suis nouveau sur android. Et je suis en train de mettre en place une application qui sera en anglais et en urdu. Fondamentalement, il y aura du texte en arabe et sa signification sera en anglais ou en ourdou selon la langue choisie par l'utilisateur. Je veux changer la police du texte arabe, Si j'applique la police dans l'application entière cela changera le regard de l'urdu et de l'anglais aussi. Alors, est-ce que ce sera bien d'appliquer la police à chaque texte qui contient des polices arabes en utilisant TypeFace ou y a-t-il un meilleur moyen d'y parvenir?Police Android dans plus d'un langauge sur un seul écran

Et aussi je veux savoir comment supprimer les polices personnalisées afin d'obtenir la police par défaut à nouveau par le code. Désolé si cette question est enfantine je veux juste savoir quelles sont les possibilités de le faire.

Répondre

1

par exemple si vous souhaitez que votre application pour prendre en charge l'anglais et les chaînes arabes (en plus des chaînes par défaut), vous pouvez simplement créer deux répertoires supplémentaires de ressources appelées /res/values-en (pour le strings.xml anglais) et /res/values-ar (pour les chaînes arabes.xml). Dans les fichiers strings.xml, les noms des ressources sont identiques.

Par exemple, le fichier /res/values-en/strings.xml pourrait ressembler à ceci:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string name="hello">Hello in English!</string> 
</resources> 

considérant que, le fichier /res/values-ar/strings.xml ressemblerait à ceci:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string name="hello">مرحبا في اللغة الإنجليزية</string> 
</resources> 

aussi , le fichier /res/values-ur_IN/strings.xml ressemblerait à ceci pour urdu:

ur_IN pour l'inde ur_PK pour pakisthan

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string name="hello">انگریزی میں خوش!!</string> 
</resources> 

Un fichier de mise en page par défaut dans le répertoire/res/layout qui affiche la chaîne fait référence à la chaîne par la chaîne nom de variable @/bonjour, sans tenir compte de la langue ou le répertoire la ressource de chaîne est.

le système d'exploitation Android détermine quelle version de la chaîne (français, anglais, ou par défaut) pour charger à la mise en page runtime.A avec un contrôle TextView pour afficher la chaîne pourrait ressembler à ceci:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
<TextView 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:text="@string/hello" > 
</LinearLayout> 

La chaîne est accessible par programmation de la manière habituelle:

String str = getString(R.string.hello); 

Pour changer la langue que vous devez aimer ce changement lang ..

btn_english.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Locale locale = new Locale("en"); 
        Locale.setDefault(locale); 
        Configuration config = new Configuration(); 
        config.locale = locale; 
        getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
        Toast.makeText(this, getResources().getString(R.string.lbl_langSelectEnglis), Toast.LENGTH_SHORT).show(); 

      } 
     }); 



btn_arbice.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Locale locale = new Locale("ar"); 
        Locale.setDefault(locale); 
        Configuration config = new Configuration(); 
        config.locale = locale; 
        getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
        Toast.makeText(this, getResources().getString(R.string.lbl_langSelecURdu), Toast.LENGTH_SHORT).show(); 

      } 
     }); 


btn_urdu.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Locale locale = new Locale("ur_IN"); 
        Locale.setDefault(locale); 
        Configuration config = new Configuration(); 
        config.locale = locale; 
        getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
        Toast.makeText(HomeActivity.this, getResources().getString(R.string.lbl_langSelectEnglis), Toast.LENGTH_SHORT).show(); 

      } 
     }); 

Voir aussi cet exemple pour un seul écran

Custom fonts for TextView based on languages inside String

Chaîne paragraph = "hey quoi de neuf ضعيف"; int NO_FLAG = 0; Bidi bidi = nouveau Bidi (paragraphe, NO_FLAG); int runCount = bidi.getRunCount(); pour (int i = 0; i < runCount; i ++) { Chaîne ltrtl = bidi.getRunLevel (i)% 2 == 0? "ltr": "rtl"; Chaîne subString = paragraphe.substring (bidi.getRunStart (i), bidi.getRunLimit (i)); Log.d (">> bidi:" + i, subString + "est" + ltrtl); }

impressions:

hey ce qui est up est ltr

ضعيف est-rtl

Alors maintenant, on peut facilement construire TypefaceSpan ou MetricAffectingSpan en fonction de la direction du langage comme celui-ci:

SpannableString spanString = new SpannableString(paragraph); 
for (int i = 0; i < runCount; i++) { 
    Object span = bidi.getRunLevel(i) % 2 == 0 ? ltrFontSpan : rtlFontSpan; 
    spanString.setSpan(span, bidi.getRunStart(i), bidi.getRunLimit(i), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
} 
textView.setText(spanString);