Android
Lokalisering med resurser i Android
Sök…
Valuta
Currency currency = Currency.getInstance("USD");
NumberFormat format = NumberFormat.getCurrencyInstance();
format.setCurrency(currency);
format.format(10.00);
Lägga till översättning till din Android-app
Du måste skapa en annan strings.xml
fil för varje nytt språk.
- Högerklicka på res- mappen
- Välj Ny → Värderingsresursfil
- Välj en plats från tillgängliga kval
- Klicka på knappen Nästa (>>)
- Välj ett språk
- Namnge filen 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>
Ställa in språket programmatiskt:
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());
}
}
Funktionen ovan kommer att ändra textfält som hänvisas till från strängar.xml . Antag till exempel att du har följande två textvyer:
<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"/>
Sedan, efter att ha ändrat landets språk, kommer språksträngarna med ID: s app_name
och hello
att ändras i enlighet därmed.
Typ av resurskataloger under mappen "res"
När lokalisering av olika typer av resurser krävs, som var och en har sitt eget hem i androidprojektstrukturen. Följande är de olika katalogerna som vi kan placera under \res
katalogen. Resurstyperna som placeras i vart och ett av dessa kataloger förklaras i tabellen nedan:
Directory | Resurstyp |
---|---|
animatör / | XML-filer som definierar egendomanimationer. |
anim / | XML-filer som definierar mellan animationer. (Egenskapsanimationer kan också sparas i den här katalogen, men animatorn / katalogen föredras för egendomanimationer för att skilja mellan de två typerna.) |
Färg/ | XML-filer som definierar en tillståndslista med färger. Se Resurs för färgtillståndslista |
drawable / | "Bitmapfiler (.png, .9.png, .jpg, .gif) eller XML-filer som är sammanställda i följande ritbara undertyper:: Bitmapfiler Bitmap files - Nine-Patches (re-sizable bitmaps) - State lists - Shapes - Animation drawables - Other drawables - " |
mipmap / | Rita filer för olika täthetsknappar för ikoner. Mer information om hur du hanterar start-ikoner med mipmap / mappar finns i Hantera projektöversikt. |
layout/ | XML-filer som definierar en användargränssnittslayout. Se layoutresurs. |
meny/ | XML-filer som definierar applikationsmenyer, till exempel en alternativmeny, snabbmeny eller undermeny. Se menyresurs. |
rå/ | Godtyckliga filer att spara i sin råa form. För att öppna dessa resurser med en rå InputStream, ring Resources.openRawResource () med resurs-ID, som är R.raw.filename. |
Men om du behöver tillgång till ursprungliga filnamn och filhierarki, kan du överväga att spara en del resurser i tillgångarna / katalogen (istället förres / raw /). Filer i tillgångar / får inte ett resurs-ID, så du kan bara läsa dem med hjälp av AssetManager. | |
värden / | XML-filer som innehåller enkla värden, till exempel strängar, heltal och färger, samt stilar och teman |
xml / | Godtyckliga XML-filer som kan läsas vid körning genom att ringa Resources.getXML (). Olika XML-konfigurationsfiler måste sparas här, till exempel en sökbar konfiguration. |
Konfigurationstyper och kvalificeringsnamn för varje mapp under "res" -katalogen
Varje resurskatalog under res
mappen (listad i exemplet ovan) kan ha olika varianter av de innehållade resurserna i liknande namngivna katalog tillägg med olika qualifier-values
för varje configuration-type
.
Exempel på varianter av `` katalog med olika kvalificeringsvärden tillagda som ofta ses i våra Android-projekt:
- drawable /
- drawable-en /
- dragbar-fr-RCA /
- dragbar-en-port /
- dragbar-en-NoTouch-12key /
- dragbar-port-ldpi /
- dragbar-port-NoTouch-12key /
Uttömmande lista över alla olika konfigurationstyper och deras kvalificeringsvärden för Android-resurser:
Konfiguration | Kvalificeringsvärden |
---|---|
MCC och MNC | Exempel: |
mcc310 | |
mcc310-mnc004 | |
mcc208-mnc00 | |
etc. | |
Språk och region | Exempel: |
sv | |
fr | |
en-rus | |
FR-rfr | |
FR-rCA | |
Layoutriktning | ldrtl |
ldltr | |
smallestWidth | swdp |
Exempel: | |
sw320dp | |
sw600dp | |
sw720dp | |
Tillgänglig bredd | wdp |
w720dp | |
w1024dp | |
Tillgänglig höjd | hdp |
h720dp | |
h1024dp | |
Skärmstorlek | små |
vanligt | |
stor | |
extra stor | |
Skärm aspekt | lång |
inte länge | |
Rund skärm | runda |
notround | |
Skärmorientering | hamn |
landa | |
UI-läge | bil |
skrivbord | |
tv | |
appliancewatch | |
Nattläge | natt |
notnight | |
Skärmens pixeldensitet (dpi) | ldpi |
MDPI | |
hdpi | |
xhdpi | |
xxhdpi | |
xxxhdpi | |
nodpi | |
tvdpi | |
anydpi | |
Typ av pekskärm | inte röra |
finger | |
Tangentbordets tillgänglighet | keysexposed |
keyshidden | |
keyssoft | |
Primär textinmatningsmetod | nokeys |
qwerty | |
12key | |
Navigationsnyckel tillgänglighet | navexposed |
navhidden | |
Primär navigationsmetod utan beröring | nonav |
dpad | |
styrkula | |
hjul | |
Platformversion (API-nivå) | Exempel: |
v3 | |
v4 | |
v7 |
Ändra programmets Android-applikation
I exemplen ovan förstår du hur du lokaliserar applikationsresurser. Följande exempel förklarar hur du ändrar applikationsinställningen inom applikationen, inte från enheten. För att endast ändra applikationsinställning kan du använda användningsområden nedan.
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();
}
}
Initiera den språk som användaren föredrog från programklass.
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());
}
}
Du måste också skapa en basaktivitet och utöka denna aktivitet till all annan aktivitet så att du bara kan ändra tillämpningsområdet endast en plats enligt följande:
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);
}
}
Obs: Initiera alltid språk i konstruktören.
Nu kan du använda LocalizationActivity enligt följande.
public class MainActivity extends LocalizationActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Obs: När du ändrar programmens språk måste du starta om din aktivitet för att få effekten av landskapsändring För att fungera ordentligt för den här lösningen kan du och använda språk från delade inställningar vid appstart:
android:name=".LocaleApp"
i du Manifest.xml.
Ibland uppmanar lintkontrollen att skapa utgåvan. För att lösa sådana problem följer alternativen nedan.
Först:
Om du bara vill inaktivera översättning för vissa strängar lägger du till följande attribut till standard string.xml
<string name="developer" translatable="false">Developer Name</string>
Andra:
Ignorera all saknad översättning från resursfil lägg till följande attribut Det är ignorera attributet för verktygets namnutrymme i din strängfil, enligt följande:
<?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>
Tredje:
Ett annat sätt att inaktivera sträng som inte kan översättas
http://tools.android.com/recent/non-translatablestrings
Om du har många resurser som inte bör översättas kan du placera dem i en fil med namnet donottranslate.xml och lint kommer att betrakta alla resurser som inte kan översättas.
Fjärde:
Du kan också lägga till språk i resursfilen
<resources
xmlns:tools="http://schemas.android.com/tools"
tools:locale="en" tools:ignore="MissingTranslation">
Du kan också inaktivera saknad översättningskontroll för ludd från app / build.gradle
lintOptions {
disable 'MissingTranslation'
}