Android
Lokalisierung mit Ressourcen in Android
Suche…
Währung
Currency currency = Currency.getInstance("USD");
NumberFormat format = NumberFormat.getCurrencyInstance();
format.setCurrency(currency);
format.format(10.00);
Hinzufügen von Übersetzungen zu Ihrer Android-App
Sie müssen für jede neue Sprache eine andere Datei " strings.xml
erstellen.
- Klicken Sie mit der rechten Maustaste auf den Ordner res
- Wählen Sie Neu → Ressourcendatei Werte
- Wählen Sie aus den verfügbaren Qualifikationsmerkmalen ein Gebietsschema aus
- Klicken Sie auf die Schaltfläche Weiter (>>)
- Wähle eine Sprache
- Benennen Sie die Datei 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>
Sprache programmgesteuert einstellen:
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());
}
}
Die obige Funktion ändert die Textfelder, auf die in strings.xml verwiesen wird. Angenommen, Sie haben die folgenden zwei Textansichten:
<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"/>
Nach dem Ändern des Gebietsschemas werden die Sprachzeichenfolgen mit den IDs app_name
und hello
entsprechend geändert.
Typ der Ressourcenverzeichnisse unter dem Ordner "res"
Bei der Lokalisierung sind verschiedene Arten von Ressourcen erforderlich, von denen jede in der Android-Projektstruktur eine eigene Heimat hat. Nachfolgend sind die verschiedenen Verzeichnisse aufgeführt, die wir im Verzeichnis \res
ablegen können. Die in jedem dieser Verzeichnisse platzierten Ressourcentypen werden in der folgenden Tabelle erläutert:
Verzeichnis | Ressourcentyp |
---|---|
Animator/ | XML-Dateien, die Eigenschaftsanimationen definieren. |
anim / | XML-Dateien, die Tween-Animationen definieren. (Eigenschaftsanimationen können auch in diesem Verzeichnis gespeichert werden. Das Animator / -Verzeichnis wird jedoch für Eigenschaftsanimationen bevorzugt, um zwischen den beiden Typen zu unterscheiden.) |
Farbe/ | XML-Dateien, die eine Zustandsliste von Farben definieren. Siehe Farbzustandslistenressource |
zeichnend / | „Bitmap - Dateien (.png, .9.png, JPG, GIF) oder XML - Dateien , die in die folgenden ziehbar Ressource Subtypen kompiliert werden: Bitmap files - Nine-Patches (re-sizable bitmaps) - State lists - Shapes - Animation drawables - Other drawables - " - Bitmap files - Nine-Patches (re-sizable bitmaps) - State lists - Shapes - Animation drawables - Other drawables - " |
Mipmap / | Zeichnungsfähige Dateien für unterschiedliche Symbol-Startsymbole. Weitere Informationen zum Verwalten von Startersymbolen mit Mipmap / Ordnern finden Sie unter Verwalten von Projekten - Übersicht. |
Layout/ | XML-Dateien, die ein Benutzeroberflächenlayout definieren. Siehe Layoutressource. |
Speisekarte/ | XML-Dateien, die Anwendungsmenüs definieren, z. B. ein Optionsmenü, ein Kontextmenü oder ein Untermenü. Siehe Menüressource. |
roh/ | Beliebige Dateien, die in ihrer Rohform gespeichert werden sollen. Um diese Ressourcen mit einem rohen InputStream zu öffnen, rufen Sie Resources.openRawResource () mit der Ressourcen-ID auf. Dies ist R.raw.filename. |
Wenn Sie jedoch auf die ursprünglichen Dateinamen und die Dateiehierarchie zugreifen müssen, sollten Sie möglicherweise einige Ressourcen im Verzeichnis assets / speichern (statt ofres / raw /). Dateien in Assets / erhalten keine Ressourcen-ID. Sie können sie daher nur mit AssetManager lesen. | |
Werte/ | XML-Dateien, die einfache Werte enthalten, z. B. Zeichenfolgen, Ganzzahlen und Farben sowie Stile und Designs |
xml / | Beliebige XML-Dateien, die zur Laufzeit durch Aufrufen von Resources.getXML () gelesen werden können. Hier müssen verschiedene XML-Konfigurationsdateien gespeichert werden, beispielsweise eine durchsuchbare Konfiguration. |
Konfigurationstypen und Qualifikationsnamen für jeden Ordner im Verzeichnis "res"
Für jedes Ressourcenverzeichnis unter dem Ordner res
(in dem obigen Beispiel aufgeführt) können verschiedene Variationen der enthaltenen Ressourcen in einem gleichnamigen Verzeichnis mit Suffix und unterschiedlichen qualifier-values
für jeden configuration-type
.
Beispiel für Variationen von `` Verzeichnis mit unterschiedlichen Qualifier-Werten, die häufig in unseren Android-Projekten angezeigt werden:
- zeichnend /
- drawable-de /
- Zeichenbar-fr-rCA /
- drawable-de-port /
- drawable-en-notouch-12key /
- drawable-port-ldpi /
- drawable-port-notouch-12key /
Vollständige Liste aller verschiedenen Konfigurationstypen und ihrer Qualifiziererwerte für Android-Ressourcen:
Aufbau | Qualifikationswerte |
---|---|
MCC und MNC | Beispiele: |
mcc310 | |
mcc310-mnc004 | |
mcc208-mnc00 | |
usw. | |
Sprache und Region | Beispiele: |
en | |
fr | |
en-rUS | |
fr-rFR | |
fr-rCA | |
Layoutrichtung | ldrtl |
ldltr | |
kleinsteWeite | swdp |
Beispiele: | |
sw320dp | |
sw600dp | |
sw720dp | |
Verfügbare Breite | wdp |
w720dp | |
w1024dp | |
Verfügbare Höhe | HDP |
h720dp | |
h1024dp | |
Bildschirmgröße | klein |
normal | |
groß | |
xgroß | |
Bildschirmaspekt | lange |
nicht lange | |
Runder Bildschirm | runden |
nicht rund | |
Bildschirmausrichtung | Hafen |
Land | |
UI-Modus | Auto |
Schreibtisch | |
Fernsehen | |
Geräteuhr | |
Nacht-Modus | Nacht- |
nicht Nacht | |
Bildschirmpixeldichte (dpi) | ldpi |
mdpi | |
hdpi | |
xhdpi | |
xxhdpi | |
xxxhdpi | |
nodpi | |
tvdpi | |
anydpi | |
Touchscreen-Typ | Keine Berührung |
Finger | |
Verfügbarkeit der Tastatur | keysexposed |
keyshidden | |
keyssoft | |
Primäre Texteingabemethode | nokeys |
QWERTY | |
12key | |
Verfügbarkeit der Navigationstasten | Kirchenschiff ausgesetzt |
navhidden | |
Primäre berührungslose Navigationsmethode | nonav |
dpad | |
Trackball | |
Rad | |
Plattformversion (API-Ebene) | Beispiele: |
v3 | |
v4 | |
v7 |
Ändern Sie das Gebietsschema der Android-Anwendung programmgesteuert
In den obigen Beispielen erfahren Sie, wie Sie Anwendungsressourcen lokalisieren. Im folgenden Beispiel wird erläutert, wie das Anwendungsgebietsschema in der Anwendung und nicht vom Gerät aus geändert wird. Um nur das Anwendungsgebietsschema zu ändern, können Sie das Gebietsschema util verwenden.
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();
}
}
Initialisieren Sie das von Ihnen bevorzugte Gebietsschema aus der Anwendungsklasse.
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());
}
}
Sie müssen auch eine Basisaktivität erstellen und diese Aktivität auf alle anderen Aktivitäten ausdehnen, sodass Sie das Gebietsschema der Anwendung nur an einer Stelle wie folgt ändern können:
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);
}
}
Anmerkung: Initialisieren Sie das Gebietsschema immer im Konstruktor.
Jetzt können Sie LocalizationActivity wie folgt verwenden.
public class MainActivity extends LocalizationActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Hinweis: Wenn Sie locale Anwendungs programmatisch zu ändern, müssen Sie Ihre Aktivitäten neu zu starten , um den Effekt von locale Änderung zu ergreifen , um richtig für diese Lösung , Sie und die Verwendung locale von gemeinsamen Präferenzen auf app Startup zu arbeiten
android:name=".LocaleApp"
In Sie Manifest.xml.
Manchmal werden Sie aufgefordert, den Release-Build zu erstellen. Um dieses Problem zu lösen, folgen Sie den nachstehenden Optionen.
Zuerst:
Wenn Sie die Übersetzung nur für einige Zeichenfolgen deaktivieren möchten, fügen Sie das folgende Attribut zu der Standardzeichenfolge string.xml hinzu
<string name="developer" translatable="false">Developer Name</string>
Zweite:
Ignoriere alle fehlenden Übersetzungen aus der Ressourcendatei. Füge folgendes Attribut hinzu. Es ist das Ignore-Attribut des Namespaces der Tools in deiner Strings-Datei:
<?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>
Dritte:
Eine andere Möglichkeit, nicht übersetzbare Zeichenfolgen zu deaktivieren
http://tools.android.com/recent/non-translatablestrings
Wenn Sie über viele Ressourcen verfügen, die nicht übersetzt werden sollten, können Sie sie in einer Datei namens donottranslate.xml platzieren, und lint berücksichtigt alle nicht übersetzbaren Ressourcen.
Vierte:
Sie können auch ein Gebietsschema in der Ressourcendatei hinzufügen
<resources
xmlns:tools="http://schemas.android.com/tools"
tools:locale="en" tools:ignore="MissingTranslation">
Sie können auch die fehlende Übersetzungsprüfung für fusseln in app / build.gradle deaktivieren
lintOptions {
disable 'MissingTranslation'
}