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 .

  1. Klik met de rechtermuisknop op de map Res
  2. Kies NieuwWaardenbronbestand
  3. Selecteer een landinstelling uit de beschikbare kwalificaties
  4. Klik op de knop Volgende (>>)
  5. Selecteer een taal
  6. 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'
    }


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow