Change language in android application using string file

后端 未结 5 2052
一生所求
一生所求 2020-12-10 15:29

I\'m new in java and actually developing a game app and I wanted add a feature which could change languages in the game.

I already made 2 strings.xml. O

相关标签:
5条回答
  • 2020-12-10 15:49

    Always follow official tutorial

    Add your string files here.

    if you don't have one, Create values-fil folder in the MyProject/res folder.

    Check this if you want to handle Phone system language changes.

    0 讨论(0)
  • 2020-12-10 15:49

    When you are supporting multiple languages , You need to create separate values folder like values-fr for instance and put your stings.xml file inside this folder . Should work. Hope this helps!

    0 讨论(0)
  • 2020-12-10 15:52

    Try this example please. Maybe it will help you. Here i used a spinner for selecting language.

    In your actvity

    import java.util.Locale;
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.content.res.Configuration;
    import android.content.res.Resources;
    import android.util.DisplayMetrics;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.Spinner;
    import android.widget.Toast;
    import android.widget.AdapterView.OnItemSelectedListener;
    
    public class AndroidLocalize extends Activity {
        Spinner spinnerctrl;
        Button btn;
        Locale myLocale;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            spinnerctrl = (Spinner) findViewById(R.id.spinner1);
            spinnerctrl.setOnItemSelectedListener(new OnItemSelectedListener() {
    
                public void onItemSelected(AdapterView<?> parent, View view,
                        int pos, long id) {
    
                    if (pos == 1) {
    
                        Toast.makeText(parent.getContext(),
                                "You have selected Tamil", Toast.LENGTH_SHORT)
                                .show();
                        setLocale("ta");
                    } else if (pos == 2) {
    
                        Toast.makeText(parent.getContext(),
                                "You have selected Hindi", Toast.LENGTH_SHORT)
                                .show();
                        setLocale("hi");
                    } else if (pos == 3) {
    
                        Toast.makeText(parent.getContext(),
                                "You have selected English", Toast.LENGTH_SHORT)
                                .show();
                        setLocale("en");
                    }
    
                }
    
                public void onNothingSelected(AdapterView<?> arg0) {
                    // TODO Auto-generated method stub
                }
    
            });
        }
    
        public void setLocale(String lang) {
    
            myLocale = new Locale(lang);
            Resources res = getResources();
            DisplayMetrics dm = res.getDisplayMetrics();
            Configuration conf = res.getConfiguration();
            conf.locale = myLocale;
            res.updateConfiguration(conf, dm);
            Intent refresh = new Intent(this, AndroidLocalize.class);
            startActivity(refresh);
        }
    }
    

    in your XML

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/greet"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/greet"
            android:textSize="25sp" android:gravity="center" android:paddingTop="25sp" />
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/langselection"
            android:textAppearance="?android:attr/textAppearanceMedium" android:gravity="center" android:paddingTop="25sp"/>
    
    
     <Spinner
            android:id="@+id/spinner1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:entries="@array/languages"
           android:gravity="center" android:paddingTop="25sp" />
    
    </LinearLayout>
    

    and create folders in your res like

    then add strings.xml for your language like

    <resources>
    
        <string name="app_name">Androidlocalization</string>
        <string name="hello_world">Hello world!</string>
        <string name="title_activity_android_localize">AndroidLocalize</string>
        <string name="greet">बधाई सचिन !!</string>
        <string name="langselection">जिस भाषा में आप सचिन को नमस्कार करना चाहते हैं का चयन करें!!!!</string>
        <string name="chooselang">Choose the language</string>
          <string-array name="languages">
            <item>Select language</item>
            <item>தமிழ்</item>
            <item>हिंदी</item>
            <item>English</item>
        </string-array>
    
    </resources>
    

    please update your manifest also , i hope that will resolve your problem..

    update like this.

     <application
                android:icon="@drawable/ic_launcher"
                android:label="@string/app_name"
                android:theme="@style/AppTheme" >
                <activity
                    android:name=".AndroidLocalize"
                    android:label="@string/title_activity_android_localize" 
    android:configChanges="locale|orientation|keyboardHidden" 
    android:noHistory="true">
                    <intent-filter>
                        <action android:name="android.intent.action.MAIN" />
    
                        <category android:name="android.intent.category.LAUNCHER" />
                    </intent-filter>
                </activity>
            </application>
    
    0 讨论(0)
  • 2020-12-10 15:55

    This is a method i wrote and is working perfectly well for me for changing the language from app (and JUST FOR A SINGLE APP - not the entire device):

    private void setLanguageForApp(String languageToLoad){
        Locale locale;
        if(languageToLoad.equals("not-set")){ //use any value for default
            locale = Locale.getDefault();
        }
        else {
            locale = new Locale(languageToLoad);
        }
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        getBaseContext().getResources().updateConfiguration(config,
                getBaseContext().getResources().getDisplayMetrics());
    }
    

    NOTE: Call this method before setContentView() in the first activity's onCreate() everytime when the app is opened.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setLanguageForApp("en"); //hard-coded here - get from whereever you stored
        setContentView(R.layout.activity_category_list);
        ...
        ...
        ...
    

    Store the selected locale code in shared preferences and retrieve to pass as parameter.

    Method for language selection dialog: (Note: it reloads app after language change to bring the language change in effect)

    private void showLanguageChangePopup() {
        CharSequence languages[] = new CharSequence[] {
                "English",
                "हिंदी (Hindi)",
                "Français (French)",
                "Italiano (Italian)",
                "Deutsch (German)",
                "Español (Spanish)",
                "日本語 (Japanese)",
                "한국어 (Korean)",
                "Nederlands (Dutch)",
                "Português (Portuguese)",
                "руÑÑкий (Russian)",
                "中文 (Chinese)",
                "العربية (Arabic)"
        };
        final String codes[] = new String[] {
                "en",
                "hi",
                "fr",
                "it",
                "de",
                "es",
                "ja",
                "ko",
                "nl",
                "pt",
                "ru",
                "zh",
                "ar"
        };
    
        int currentLangIndex = Prefs.getUserPreferenceIntValue(Prefs.Key.SELECTED_LANGUAGE_INDEX, getBaseContext());
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(R.string.text_select_language);
        builder.setSingleChoiceItems(languages, currentLangIndex, null);
        builder.setNegativeButton(R.string.text_translate_cancel, null);
        builder.setPositiveButton(R.string.action_change_language, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                int selectedIndex = ((AlertDialog) dialog).getListView().getCheckedItemPosition();
                Prefs.setUserPreferenceStringValue(Prefs.Key.LANGUAGE, codes[selectedIndex], getBaseContext());
                Prefs.setUserPreferenceIntValue(Prefs.Key.SELECTED_LANGUAGE_INDEX, selectedIndex, getBaseContext());
                Intent i = new Intent(CategoryListActivity.this, CategoryListActivity.class);
                startActivity(i);
                finish();
    
            }
        });
    
        builder.show();
    }
    
    0 讨论(0)
  • 2020-12-10 15:58
    <resources>
    
        <string name="app_name">Androidlocalization</string>
        <string name="hello_world">Hello world!</string>
        <string name="title_activity_android_localize">AndroidLocalize</string>
        <string name="greet">बधाई सचिन !!</string>
        <string name="langselection">जिस भाषा में आप सचिन को नमस्कार करना चाहते हैं का चयन करें!!!!</string>
        <string name="chooselang">Choose the language</string>
          <string-array name="languages">
            <item>Select language</item>
            <item>தமிழ்</item>
            <item>हिंदी</item>
            <item>English</item>
        </string-array>
    
    </resources>
    

    Each code is in same folder for different language add different value folder

    For example value folder for hindi goes inside value-hi

    0 讨论(0)
提交回复
热议问题