Android 는 국제 화 다 중 언어 를 지원 합 니 다(8.0+지원)

10861 단어 Android다 국어
원인
우 리 는 app 을 개발 하면 외국 시장 을 넓 힐 수 있 습 니 다.그러면 영 어 를 포함 한 다른 언어 에 대한 지원 이 필요 합 니 다.
효과.

사고의 방향
1:관련 자원 파일 을 추가 하고 참조 합 니 다.
2.configuration 을 설정 하고 configuration 에서 언어 형식 을 지정 합 니 다.
3.필요 할 때 configuration 을 바 꾸 면 됩 니 다.
이루어지다
res 의 values 폴 더 에 관련 언어 형식의 자원 파일 을 새로 만 듭 니 다.
새 자원 파일 을 오른쪽 클릭 하고 로 컬 을 선택 하고>단 추 를 누 르 십시오.

Language 및 지역(any region)을 선택 하면 됩 니 다.

마지막 으로 파일 이름 은 다른 언어 파일 이름 과 같 습 니 다.strings 면 됩 니 다.
MyApplication 에 있 는 onCreate 와 onConfigurationChanged 방법 에 언어 관련 처 리 를 추가 합 니 다(onConfigurationChanged 는 가로 세로 화면 전환 문 제 를 처리 하기 위 한 것 입 니 다).응용 컨 텍스트 대상 에 configuration 을 추가 하고 configuration 에 현재 언어 를 지정 합 니 다.

public class MyApplication extends Application {
@Override
public void onCreate() {
  super.onCreate();
  languageWork();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  languageWork();
}

private void languageWork() {
  //       (  )
  Locale locale = LanguageUtil.getLocale(this);
  LanguageUtil.updateLocale(this, locale);
}
}
LanguageUtil 은 다음 과 같 습 니 다(정리 되 지 않 은 파트너 가 직접 사용 하면 됩 니 다).언어 가 A 에서 B 로 전환 되 는 것 을 확보 하기 위해 서 는 이후 에 도 응용 프로그램 을 시작 할 때 B 언어 를 사용 해 야 합 니 다.우 리 는 B 언어 를 로 컬 에 저장 해 야 합 니 다.다음 에 응용 프로그램 을 시작 하면 설정 하면 됩 니 다.

public class LanguageUtil {
/**
 *   
 */
public static final Locale LOCALE_CHINESE = Locale.CHINESE;
/**
 *   
 */
public static final Locale LOCALE_ENGLISH = Locale.ENGLISH;
/**
 *   
 */
public static final Locale LOCALE_RUSSIAN = new Locale("ru");

private static final String LOCALE_SP = "LOCALE_SP";
private static final String LOCALE_SP_KEY = "LOCALE_SP_KEY";

 public static Locale getLocale(Context context) {
  SharedPreferences spLocale = context.getSharedPreferences(LOCALE_SP, Context.MODE_PRIVATE);
  String localeJson = spLocale.getString(LOCALE_SP_KEY, "");
  Gson gson = new Gson();
  return gson.fromJson(localeJson, Locale.class);
}

pivate static void setLocale(Context pContext, Locale pUserLocale) {
  SharedPreferences spLocal = pContext.getSharedPreferences(LOCALE_SP, Context.MODE_PRIVATE);
  SharedPreferences.Editor edit = spLocal.edit();
  String json = new Gson().toJson(pUserLocale);
  edit.putString(LOCALE_SP_KEY, json);
  edit.apply();
}

public static boolean updateLocale(Context context, Locale locale) {
  if (needUpdateLocale(context, locale)) {
    Configuration configuration = context.getResources().getConfiguration();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
      configuration.setLocale(locale);
    } else {
      configuration.locale = locale;
    }
    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
    context.getResources().updateConfiguration(configuration, displayMetrics);
    setLocale(context, locale);
    return true;
  }
  return false;
}

public static boolean needUpdateLocale(Context pContext, Locale newUserLocale) {
  return newUserLocale != null && !getCurrentLocale(pContext).equals(newUserLocale);
}
public static Locale getCurrentLocale(Context context) {
  Locale locale;
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //7.0             
    locale = context.getResources().getConfiguration().getLocales().get(0);
  } else {
    locale = context.getResources().getConfiguration().locale;
  }
  return locale;
}
}
전환 을 진행 합 니 다.주요 트리거 동작 은 activity 의 recreate()입 니 다.(전환 은 새로운 configuration 을 사용 합 니 다.)모든 activity 는 activity Manager 에서 관리 합 니 다.다른(현재 언어 선택 activity 제외)의 모든 activity 를 recreate()하면 됩 니 다.languageUtil 은 언어 전환 이 필요 한 지 여 부 를 동시에 판정 했다.현재 언어 와 선택 할 언어 가 일치 하면 더 이상 처리 할 필요 가 없습니다)

 public void onClick(View view) {
  boolean need = false;
  switch (view.getId()) {
    case R.id.chinese:
      need = LanguageUtil.updateLocale(this, LanguageUtil.LOCALE_CHINESE);
      if (need) {
        //      activity    
        ActivityManager.getInstance().recreateAllOtherActivity(this);
        Toast.makeText(this, "change to chinese", Toast.LENGTH_SHORT).show();
      } else {
        Toast.makeText(this, "no need", Toast.LENGTH_SHORT).show();
      }
      break;
    case R.id.english:
      need = LanguageUtil.updateLocale(this, LanguageUtil.LOCALE_ENGLISH);
      if (need) {
        ActivityManager.getInstance().recreateAllOtherActivity(this);
        Toast.makeText(this, "change to english", Toast.LENGTH_SHORT).show();
      } else {
        Toast.makeText(this, "no need", Toast.LENGTH_SHORT).show();
      }
      break;
    case R.id.russian:
      need = LanguageUtil.updateLocale(this, LanguageUtil.LOCALE_RUSSIAN);
      if (need) {
        ActivityManager.getInstance().recreateAllOtherActivity(this);
        Toast.makeText(this, "change to russian", Toast.LENGTH_SHORT).show();
      } else {
        Toast.makeText(this, "no need", Toast.LENGTH_SHORT).show();
      }
      break;
  }
}
ActivityManager 는 다음 과 같 습 니 다.

 public class ActivityManager {
private static final Stack<Activity> sActivityStack = new Stack<>();
private static ActivityManager sActivityManager;

private ActivityManager() {
}

public Stack<Activity> getActivityStack() {
  return sActivityStack;
}

/**
 *     
 */
public static ActivityManager getInstance() {
  if (sActivityManager == null) {
    synchronized (ActivityManager.class) {
      sActivityManager = new ActivityManager();
    }
  }
  return sActivityManager;
}

/**
 *   Activity   
 */
public void addActivity(Activity activity) {
  sActivityStack.add(activity);
}

/**
 *       Activity
 */
public void removeActivity(Activity activity) {
  if (sActivityStack.isEmpty()) {
    return;
  }
  sActivityStack.remove(activity);
}

/**
 *     Activity(          )
 */
public Activity currentActivity() {

  Activity activity = sActivityStack.lastElement();
  return activity;
}

/**
 *     Activity(          )
 */
public void finishActivity() {
  Activity activity = sActivityStack.lastElement();
  finishActivity(activity);
}

/**
 *      Activity
 */
public void finishActivity(Activity activity) {
  if (activity != null) {
    sActivityStack.remove(activity);
    activity.finish();
  }
}

/**
 *        Activity
 */
public void finishActivity(Class<?> cls) {
  for (Activity activity : sActivityStack) {
    if (activity.getClass().equals(cls)) {
      finishActivity(activity);
      return;
    }
  }

}

//       Activity
public Activity getActivity(Class<?> cls) {
  for (Activity activity : sActivityStack) {
    if (activity.getClass().equals(cls)) {
      return activity;
    }
  }
  return null;
}

/**
 *     Activity
 */
public void finishAllActivity() {
  for (int i = 0, size = sActivityStack.size(); i < size; i++) {
    if (null != sActivityStack.get(i)) {
      sActivityStack.get(i).finish();
    }
  }
  sActivityStack.clear();
}

public void finishAllOtherActivity(Activity activity) {
  for (int i = 0, size = sActivityStack.size(); i < size; i++) {
    if (null != sActivityStack.get(i) && sActivityStack.get(i) != activity) {
      sActivityStack.get(i).finish();
    }
  }
  sActivityStack.clear();
}

public void recreateAllOtherActivity(Activity activity) {
  for (int i = 0, size = sActivityStack.size(); i < size; i++) {
    if (null != sActivityStack.get(i) && sActivityStack.get(i) != activity) {
      sActivityStack.get(i).recreate();
    }
  }
}

/**
 *       
 */
public void AppExit() {
  try {
    finishAllActivity();
    System.exit(0);
  } catch (Exception e) {
  }
  }
  }
app 의 모든 acitivity 를 추가 하고 제거 하면 BaseActivity 에서 진행 할 수 있 습 니 다.

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  ActivityManager.getInstance().addActivity(this);
}

@Override
protected void onDestroy() {
  super.onDestroy();
  ActivityManager.getInstance().removeActivity(this);
}

이상 의 절 차 는 우리 의 언어 전환 이 완 성 된 셈 이다.하지만 API 26+이상 버 전에 서 는 다음 코드 를 추가 로 추가 하여 호 환 해 야 합 니 다.더 이상 말 할 것 도 없습니다.SDK 가 바 뀌 었 을 뿐 SDK 를 따라 갑 니 다~(activity 나 BaseActivity 에 추가)

 @Override
protected void attachBaseContext(Context newBase) {
  Context context = languageWork(newBase);
  super.attachBaseContext(context);

 }

private Context languageWork(Context context) {
  // 8.0     createConfigurationContext  configuration
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    return updateResources(context);
  } else {
    return context;
  }
  }

@RequiresApi(api = Build.VERSION_CODES.O)
private Context updateResources(Context context) {
  Resources resources = context.getResources();
  Locale locale = LanguageUtil.getLocale(context);
  if (locale==null) {
    return context;
  }
  Configuration configuration = resources.getConfiguration();
  configuration.setLocale(locale);
  configuration.setLocales(new LocaleList(locale));
  return context.createConfigurationContext(configuration);
  }
완공~
주소
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기