woong's

Android 앱내 언어 변경 하기 본문

Develop/Android

Android 앱내 언어 변경 하기

dlsdnd345 2016. 2. 14. 13:05
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Android 앱내 언어 변경 하기


안드로이드 앱내 언어변경에 대해서 정리해 보려 합니다.


기본 코드는 LanguageUtil Class 를 통해서 작성 합니다.

위 코드에서 상수와 , SharedPreference 를 다른 클래스로 관리하기 때문에 변경해주셔야 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

public class LanguageUtil {
    
    private Activity activity;
    private Context context;
    
    public LanguageUtil(Activity activity){
        
        this.activity = activity;
        this.context = activity.getApplicationContext();
    }
    
    /**
     * 언어 저장 (ko, en)
     * @return
     */
    public void setLanguage(String lauguageValue){
        ShkUtil.setSharedPreference(context, ShkConfig.Language.LANGUAGE, lauguageValue);
    }
    
    /**
     * 현재 언어 반환
     * @return
     */
    public String getCurrentLanguage(){
        return ShkUtil.getSharedPreference(context, ShkConfig.Language.LANGUAGE);
    }
    
    /**
     * 시스템 언어 반환
     * @return
     */
    public String getSystemLanguage(){
        
        Locale locale = context.getResources().getConfiguration().locale;
        String language = locale.getLanguage();
        
        if(!language.equals(ShkConfig.Language.KO)){
            return ShkConfig.Language.EN;
        }
        return language;
    }
    
    /**
     * 시스템 언어 설정
     * @param language
     */
    public void setSystemLanguage(String language){
        
        Locale locale = null;
        
        if(language.equals(ShkConfig.Language.KO)){
            locale = new Locale(ShkConfig.Language.KO);
            setLanguage(ShkConfig.Language.KO);
        }else{
            locale = new Locale(ShkConfig.Language.EN);
            setLanguage(ShkConfig.Language.EN);
        }
        
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        
        activity.getBaseContext().getResources().updateConfiguration(config,
                activity.getBaseContext().getResources().getDisplayMetrics());
    }
}
 
 
 
cs




1. 인트로 시스템 언어 추출 및 저장


위 코드를 이용하여 인트로에서 시스템 언어를 추출 하여  sharedPreference 에 저장 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
 
/**
     * 언어 초기화
     */
    private void languageInit() {
        languageUtil = new LanguageUtil(SplashActivity.this);
        String language = languageUtil.getSystemLanguage();        
        languageUtil.setLanguage(language);
    }
 
 
 
 
cs



2. 언어 변경 화면 시스템 언어에 맞게 화면 출력


위에서 저장한 값을 통하여 언어 변경 화면을 알맞게 출력 합니다.


1
2
3
4
5
6
7
8
9
10
 
String language = languageUtil.getCurrentLanguage();
        
        if(language.equals(ShkConfig.Language.KO)){
            selectBtnKorean();
        }else{
            selectBtnEnglish();
        }
 
 
cs



3. 시스템 언어 변경


1
2
3
4
5
 
languageUtil.setSystemLanguage(ShkConfig.Language.KO);
                startActivity(intent);
                overridePendingTransition(0,0);
 
cs


앱내의 언어변경은 앱을 재시작 하지 않으면 변경 되지 않습니다. 

그래서 화면을 새로 띄워줘서 재시작한것처럼 만들어 주셔야 합니다.

화면을 새로띄우면 애니메이션으로 인해서 새로뜨는 효과로 인해서 같은화면에 같은화면이

새로 만들어 지는 것을 볼수 있습니다. 그래서 위와 같이 애니메이션을 제거 하였습니다.

하지만 화면을 닫아보면 뒤에 똑같은 화면이 겹쳐 있는것을 확인 할 수 있습니다.


위 문제는 android flag 를 통해서 해결 할수 있습니다.


 

1
2
3
4
 
intent = new Intent(LanguageActivity.this , LanguageActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 
cs



4. 화면 갱신


이렇게 변경후 메인화면으로 가보면 여전히 언어 변경이 되지 않습니다.

앱을 재실행 하지 않았기 때문입니다.

새로 화면이 만들어지거나 , 앱이 재시작되어야 언어가 변경 됩니다.


그래서 폰 화면의 뒤에 쌓여있는 화면 만큼 재갱신을 해주어야 언어가 변경된 효과를 나타낼수 있습니다.

이렇게하면 단점이 많지만 , 이런 요구들이 있는경우가 많습니다.


안드로이드에서는 설정 화면으로 유도해서 시스템 언어를 변경 하는것은 권장하고 있습니다.

Comments