Android 는 국제 화 다 중 언어 를 지원 합 니 다(8.0+지원)
우 리 는 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);
}
완공~주소
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.