Android
Lokalisatie met bronnen in Android
Zoeken…
Valuta
Currency currency = Currency.getInstance("USD");
NumberFormat format = NumberFormat.getCurrencyInstance();
format.setCurrency(currency);
format.format(10.00);
Vertaling toevoegen aan uw Android-app
U moet voor elke nieuwe taal een ander bestand strings.xml
.
- Klik met de rechtermuisknop op de map Res
- Kies Nieuw → Waardenbronbestand
- Selecteer een landinstelling uit de beschikbare kwalificaties
- Klik op de knop Volgende (>>)
- Selecteer een taal
- Geef het bestand strings.xml een naam
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>
De taal programmatisch instellen:
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());
}
}
De bovenstaande functie zal de tekstvelden wijzigen waarnaar wordt verwezen vanuit strings.xml . Stel bijvoorbeeld dat u de volgende twee tekstweergaven hebt:
<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"/>
Na het wijzigen van de landinstelling worden de app_name
met de ID- app_name
en hello
dienovereenkomstig gewijzigd.
Type bronmappen in de map "res"
Bij het lokaliseren van verschillende soorten bronnen, die elk hun eigen thuis hebben in de Android-projectstructuur. Hieronder volgen de verschillende mappen die we onder de map \res
kunnen plaatsen. De soorten bronnen die in elk van deze mappen zijn geplaatst, worden in de onderstaande tabel uitgelegd:
directory | Brontype |
---|---|
animator / | XML-bestanden die eigenschapanimaties definiëren. |
Anim / | XML-bestanden die tween-animaties definiëren. (Eigenschapanimaties kunnen ook in deze map worden opgeslagen, maar de animator / map heeft de voorkeur voor eigenschapanimaties om onderscheid te maken tussen de twee typen.) |
kleur/ | XML-bestanden die een statuslijst van kleuren definiëren. Zie Resource kleurstatuslijst |
tekenbaar/ | "Bitmap-bestanden (.png, .9.png, .jpg, .gif) of XML-bestanden die zijn gecompileerd in de volgende drawable resource-subtypen:: Bitmap files - Nine-Patches (re-sizable bitmaps) - State lists - Shapes - Animation drawables - Other drawables - " |
mipmap / | Drawable-bestanden voor verschillende opstartpictogramdichtheden. Zie Overzicht van projecten beheren voor meer informatie over het beheren van opstartpictogrammen met mipmap / mappen. |
lay-out / | XML-bestanden die een lay-out van een gebruikersinterface definiëren. Zie Layout Resource. |
menu/ | XML-bestanden die toepassingsmenu's definiëren, zoals een optiemenu, een contextmenu of een submenu. Zie Menu Resource. |
raw / | Willekeurige bestanden om op te slaan in hun onbewerkte vorm. Als u deze bronnen met een onbewerkte InputStream wilt openen, roept u Resources.openRawResource () aan met de resource-ID, namelijk R.raw.filename. |
Als u echter toegang nodig hebt tot de originele bestandsnamen en de bestandshiërarchie, kunt u overwegen enkele bronnen in de middelen / map op te slaan (in plaats vanresres / raw /). Bestanden in middelen / krijgen geen bron-ID, dus u kunt ze alleen lezen met AssetManager. | |
waarden / | XML-bestanden die eenvoudige waarden bevatten, zoals tekenreeksen, gehele getallen en kleuren, evenals stijlen en thema's |
xml / | Willekeurige XML-bestanden die tijdens runtime kunnen worden gelezen door Resources.getXML () aan te roepen. Verschillende XML-configuratiebestanden moeten hier worden opgeslagen, zoals een doorzoekbare configuratie. |
Configuratietypes en kwalificatienamen voor elke map in de map "res"
Elke brondirectory onder de map res
(vermeld in het bovenstaande voorbeeld) kan verschillende variaties hebben van de ingesloten bronnen in de map met dezelfde naam, gevolgd door verschillende qualifier-values
voor elk configuration-type
.
Voorbeeld van variaties van `` map met verschillende kwalificatiewaarden als achtervoegsel die vaak worden gezien in onze Android-projecten:
- tekenbaar/
- betekenbare-en /
- trekbare-fr-RCA /
- betekenbare-en-port /
- betekenbare-en-NoTouch-12key /
- betekenbare-port-LDPI /
- betekenbare-port-NoTouch-12key /
Uitputtende lijst van alle verschillende configuratietypes en hun kwalificatiewaarden voor Android-bronnen:
Configuratie | Kwalificatiewaarden |
---|---|
MCC en MNC | Voorbeelden: |
mcc310 | |
mcc310-mnc004 | |
mcc208-mnc00 | |
enz. | |
Taal en regio | Voorbeelden: |
nl | |
fr | |
en-rus | |
fr-RFR | |
fr-RCA | |
Lay-outrichting | ldrtl |
ldltr | |
smallestWidth | swdp |
Voorbeelden: | |
sw320dp | |
sw600dp | |
sw720dp | |
Beschikbare breedte | WDP |
w720dp | |
w1024dp | |
Beschikbare hoogte | hdp |
h720dp | |
h1024dp | |
Scherm grootte | klein |
normaal | |
groot | |
xlarge | |
Schermaspect | lang |
niet lang | |
Rond scherm | ronde |
notround | |
Oriëntatie van het scherm | haven |
land- | |
UI-modus | auto |
bureau | |
televisie | |
ApplianceWatch | |
Nachtstand | nacht |
notnight | |
Pixeldichtheid scherm (dpi) | LDPI |
mdpi | |
hdpi | |
xhdpi | |
xxhdpi | |
xxxhdpi | |
nodpi | |
tvdpi | |
anydpi | |
Type touchscreen | niet aanraken |
vinger | |
Toetsenbord beschikbaarheid | keysexposed |
keyshidden | |
keyssoft | |
Primaire tekstinvoermethode | nokeys |
qwerty | |
12key | |
Beschikbaarheid van navigatietoets | navexposed |
navhidden | |
Primaire non-touch navigatiemethode | nonav |
DPAD | |
trackball | |
wiel | |
Platformversie (API-niveau) | Voorbeelden: |
v3 | |
v4 | |
v7 |
Wijzig de landinstelling van de Android-applicatie programmatisch
In bovenstaande voorbeelden begrijpt u hoe u toepassingsbronnen kunt lokaliseren. In het volgende voorbeeld wordt uitgelegd hoe u de locale van de toepassing binnen de toepassing kunt wijzigen, niet vanaf het apparaat. Om alleen de locale van de applicatie te wijzigen, kunt u gebruik maken van de loc hieronder.
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();
}
}
Initialiseer de landinstelling die de voorkeur heeft van de toepassingsklasse.
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());
}
}
U moet ook een basisactiviteit maken en deze activiteit uitbreiden tot alle andere activiteiten zodat u de locatie van de toepassing als volgt slechts op één plaats kunt wijzigen:
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);
}
}
Opmerking: initialiseer de landinstelling altijd in de constructor.
Nu kunt u LocalizationActivity als volgt gebruiken.
public class MainActivity extends LocalizationActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Opmerking: wanneer u de programmatische landinstelling van de applicatie wijzigt, moet u uw activiteit opnieuw opstarten om het effect van de locale verandering te bewerkstelligen. Om goed voor deze oplossing te werken en locale te gebruiken vanuit gedeelde voorkeuren bij het opstarten van de app u
android:name=".LocaleApp"
in you Manifest.xml.
Soms vraagt Lint checker om de release-build te maken. Om een dergelijk probleem op te lossen, volg onderstaande opties.
Eerste:
Als u de vertaling alleen voor bepaalde strings wilt uitschakelen, voegt u het volgende kenmerk toe aan standaard string.xml
<string name="developer" translatable="false">Developer Name</string>
Tweede:
Negeer alle ontbrekende vertalingen uit bronbestand add attribuut Het is het negeerattribuut van de tools namespace in uw strings-bestand, als volgt:
<?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>
Derde:
Een andere manier om niet-vertaalbare tekenreeksen uit te schakelen
http://tools.android.com/recent/non-translatablestrings
Als u veel bronnen heeft die niet moeten worden vertaald, kunt u deze in een bestand met de naam donottranslate.xml plaatsen en lint zal ze allemaal als niet-vertaalbare bronnen beschouwen.
Vierde:
U kunt ook een landinstelling toevoegen in het bronbestand
<resources
xmlns:tools="http://schemas.android.com/tools"
tools:locale="en" tools:ignore="MissingTranslation">
U kunt ook ontbrekende vertaalcontrole voor lint van app / build.gradle uitschakelen
lintOptions {
disable 'MissingTranslation'
}