2015-09-05 67 views
0

我的應用程序中的所有文本都在res \ values \ strings.xml中。
我應該添加第二種語言。
該應用程序應檢測Android的語言,然後選擇適當的語言。
是否有可能增加一種語言避免改變引用strings.xml中,如下面:什麼是嚮應用程序添加第二語言的最佳方式

sensor.client.R.string.operationResult_communicationError

<TextView 
    android:text="@string/common_please_wait" 

有什麼建議嗎?

回答

2

看看this鏈接。總之,您應該爲您的應用支持的每種語言提供多個strings.xml

2

res中包含string.xml的默認「values」文件夾,右邊。現在,如果您希望自己的應用支持其他語言,請創建一些其他「值」文件夾。

例子:

如果你希望你的應用程序,以支持「Rusian語言」,然後用名稱「值る」這也將包含string.xml創建文件夾。並確保無論您在值文件夾的string.xml中使用的字符串名稱是否與您在values-ru文件夾的string.xml文件中使用的名稱相同。

例如

在值文件夾的:<string name="submit">Submit</string> 在值儒文件夾的:<string name="submit">Представить</string>

而且看到這個類現在

public class LanguageActivity extends Activity implements OnClickListener 
{ 
    private static String TAG = LanguageActivity.class.getSimpleName(); 

    ListView lvLanguage; 
    ImageButton btnDone; 

    String langCode = ""; 
    ArrayList<Language> listLanguages = new ArrayList<Language>(); 

    // ListAdapter lsAdapter; 
    SharedPreferences preferences; 
    Editor editor; 

    Intent intent = null; 
    LanguageAdapter languageAdapter; 

    String fromWhere; 
    private String selectedLanguage = ""; 
    private String selectedLanguageCode = ""; 

    boolean isFirstTime = true; 

    /** 
    * Locale object to know language set on device. 
    */ 
    private Locale localeDevice; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_language); 
     initView(); 
     initParameters(); 
    } 

    private void initParameters() 
    { 
     preferences = PreferenceManager.getDefaultSharedPreferences(this); 
     editor = preferences.edit(); 

     Log.i(TAG, "isFirstTime: " + isFirstTime); 
     fromWhere = getIntent().getStringExtra(Constants.FROM_WHERE); 
     selectedLanguage = preferences.getString(Constants.LANGUAGE_NAME, "English"); 
     selectedLanguageCode = preferences.getString(Constants.LANGUAGE_CODE, "en"); 
     isFirstTime = preferences.getBoolean(Constants.IS_FIRST_TIME, true); 
     prepareLanguageList(); 
    } 

    private void initView() 
    { 
     lvLanguage = (ListView) findViewById(R.id.activity_language_lv); 
     btnDone = (ImageButton) findViewById(R.id.activity_language_btn_done); 
     btnDone.setVisibility(View.VISIBLE); 
     btnDone.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) 
    { 
     switch (v.getId()) 
     { 
     case R.id.activity_language_btn_done: 
      Util.setAppLanguage(selectedLanguage, this); 

      editor.putString(Constants.LANGUAGE_NAME, selectedLanguage); 
      editor.putString(Constants.LANGUAGE_CODE, selectedLanguageCode); 
      editor.putBoolean(Constants.IS_FIRST_TIME, false); 
      editor.commit(); 

      LanguageActivity.this.finish(); 
      Intent intent = new Intent(LanguageActivity.this, LoginActivity.class); 
      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      if (fromWhere != null && fromWhere.equals("SettingsActivity")) 
      { 
       LanguageActivity.this.finish(); 
       intent = new Intent(LanguageActivity.this, SettingsActivity.class); 
       intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      } 
      startActivity(intent); 
      break; 

     default: 
      break; 
     } 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     finish(); 
    } 

    class Language 
    { 
     String name = ""; 
     String languageCode = ""; 
     boolean isSelected = false; 

     /** 
     * @return the name 
     */ 
     public String getName() 
     { 
      return name; 
     } 

     /** 
     * @param name 
     *   the name to set 
     */ 
     public void setName(String name) 
     { 
      this.name = name; 
     } 

     /** 
     * @return the languageCode 
     */ 
     public String getLanguageCode() 
     { 
      return languageCode; 
     } 

     /** 
     * @param languageCode 
     *   the languageCode to set 
     */ 
     public void setLanguageCode(String languageCode) 
     { 
      this.languageCode = languageCode; 
     } 

     /** 
     * @return the isSelected 
     */ 
     public boolean isSelected() 
     { 
      return isSelected; 
     } 

     /** 
     * @param isSelected 
     *   the isSelected to set 
     */ 
     public void setSelected(boolean isSelected) 
     { 
      this.isSelected = isSelected; 
     } 
    } 

    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
     finish(); 
    } 

    /** 
    * LanguageAdapter : ArrayAdapter class which prepares view for list of 
    * languages. 
    * 
    * @author MindBowser 
    */ 
    class LanguageAdapter extends ArrayAdapter<Language> 
    { 
     LanguageAdapter(Context context, ArrayList<Language> list) 
     { 
      super(context, R.layout.row_language, R.id.row_language_tv, list); 
     } 

     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      View row = super.getView(position, convertView, parent); 
      LanguageViewHolder holder = (LanguageViewHolder) row.getTag(); 
      if (holder == null) 
      { 
       holder = new LanguageViewHolder(row); 
       row.setTag(holder); 
      } 

      final Language language = getLanguage(position); 

      holder.tvLanguage.setText(language.getName()); 
      holder.btnSelect.setBackgroundResource(language.isSelected() ? R.drawable.ic_checked_radio : R.drawable.ic_unchecked_radio); 
      holder.btnSelect.setOnClickListener(new OnClickListener() 
      { 
       @Override 
       public void onClick(View v) 
       { 
        for (Language languageS : listLanguages) 
        { 
         if (language.getName().equals(languageS.getName())) 
         { 
          languageS.setSelected(true); 
          Log.i(TAG, "Selected language : " + language.getName()); 
          selectedLanguage = language.getName(); 
          selectedLanguageCode = language.getLanguageCode(); 
         } else 
          languageS.setSelected(false); 
        } 
        notifyDataSetChanged(); 
       } 
      }); 

      return row; 
     } 
    } 

    class LanguageViewHolder 
    { 
     public TextView tvLanguage; 

     public Button btnSelect; 

     public LanguageViewHolder(View base) 
     { 
      this.tvLanguage = (TextView) base.findViewById(R.id.row_language_tv); 
      this.btnSelect = (Button) base.findViewById(R.id.row_language_btn); 
     } 

    } 

    /** 
    * @param position 
    * @return Language object from specified position 
    */ 
    private Language getLanguage(int position) 
    { 
     return (Language) languageAdapter.getItem(position); 
    } 

    /** 
    * Prepare list of <b>Language</b> from string array. 
    */ 
    void prepareLanguageList() 
    { 
     listLanguages = new ArrayList<Language>(); 
     localeDevice = getResources().getConfiguration().locale; 
     Log.i(TAG, "displayLanguage : " + Locale.getDefault().getDisplayLanguage()); 
     Log.i(TAG, "Language : " + Locale.getDefault().getLanguage()); 
     Log.i(TAG, "localeDevice : " + localeDevice); 
     String[] arrayLanguages = getResources().getStringArray(R.array.languages); 
     int noOfLanguages = arrayLanguages.length; 

     for (int i = 0; i < noOfLanguages; i++) 
     { 
      String strLang = arrayLanguages[i]; 
      String[] splitLang = strLang.split(":"); 
      Language language = new Language(); 
      language.setName(splitLang[0]); 
      language.setLanguageCode(splitLang[1]); 

      Log.i(TAG, "selectedLanguageCode : " + selectedLanguageCode); 
      Log.i(TAG, "selectedLanguage : " + selectedLanguage); 
      Log.i(TAG, "strLang : " + strLang); 

      // On first time arrival of user we will set the device's default 
      // language. 
      // Otherwise set the language selected by user. 
      if ((isFirstTime && localeDevice.toString().contains(splitLang[1])) || selectedLanguageCode.equals(splitLang[1])) 
      { 
       language.setSelected(true); 
       selectedLanguage = language.getName(); 
       selectedLanguageCode = language.getLanguageCode(); 
      } 
      // else if (selectedLanguageCode.equals(splitLang[1])) 
      // { 
      // language.setSelected(true); 
      // selectedLanguage = language.getName(); 
      // selectedLanguageCode = language.getLanguageCode(); 
      // } 

      listLanguages.add(language); 
     } 

     for (Language language : listLanguages) 
     { 
      Log.i(TAG, "" + language.getName() + " : " + language.isSelected()); 
     } 

     Log.i(TAG, "selectedLanguageCode : " + selectedLanguageCode); 
     Log.i(TAG, "selectedLanguage : " + selectedLanguage); 

     Util.setAppLanguage(selectedLanguage, this); 

     languageAdapter = new LanguageAdapter(this, listLanguages); 
     lvLanguage.setAdapter(languageAdapter); 
     languageAdapter.notifyDataSetChanged(); 
    } 
} 

public static void setAppLanguage(String language, Context context) { 
     Resources resources = context.getResources(); 
     DisplayMetrics displayMetrics = resources.getDisplayMetrics(); 
     Configuration configuration = resources.getConfiguration(); 
     Log.i(TAG, "language: " + language); 

     if (language.equals("Chinese")) { 
      configuration.locale = Locale.CHINESE; 
     } else if (language.equals("Japanese")) { 
      configuration.locale = Locale.JAPANESE; 
     } else if (language.equals("Malay")) { 
      configuration.locale = new Locale("ms"); 
     } else if (language.equals("Vietnam")) { 
      configuration.locale = new Locale("vi"); 
     } else if (language.equals("Danish")) { 
      configuration.locale = new Locale("da"); 
     } else if (language.equals("French")) { 
      configuration.locale = new Locale("fr"); 
     } else if (language.equals("Hungarian")) { 
      configuration.locale = new Locale("hu"); 
     } else if (language.equals("Swedish")) { 
      configuration.locale = new Locale("sv"); 
     } else if (language.equals("Korean")) { 
      configuration.locale = new Locale("ko"); 
     } else if (language.equals("Russian")) { 
      configuration.locale = new Locale("ru"); 
     } else if (language.equals("Spanish")) { 
      configuration.locale = new Locale("es"); 
     } else { 
      configuration.locale = Locale.ENGLISH; 
     } 
     resources.updateConfiguration(configuration, displayMetrics); 
    } 
1

需要值-XX爲每種語言文件夾,然後這些文件夾中的strings.xml文件。在eclipse中,所有這些值-xx文件夾分別顯示在/ res文件夾中。在android studio中,你點擊值,它會顯示所有的值 - xx文件夾。 分步教程: https://www.youtube.com/watch?v=og3BqpZMw7Q

相關問題