본문 바로가기
안드로이드 자바

[Java][Android] 안드로이드 다국어 지원

by teamnova 2021. 5. 13.
728x90

여러 국가를 대상으로 하는 앱을 만들떄, 해당 국가의 언어에 맞게 여러 언어를 제공해줘야 할 필요가 있습니다. 

이번 예제에서는 어떻게 다국어를 지원해줄 수 있는지 알아보도록 하겠습니다. 

 

프로젝트의 문자열 리소스는 strings.xml 파일에 포함되어 있습니다. 프로젝트에는 앱의 기본 언어로 된 문자열 리소스가 포함된 기본 strings.xml 파일이 있습니다. 기본 언어란 대부분의 앱 사용자가 사용할 것으로 예상되는 언어입니다. 앱에서 수용하기 원하는 다른 언어의 문자열 리소스가 포함되어 있는 번역된 strings.xml 파일을 만들 수도 있습니다.

 

우선 예제에서 사용될 레이아웃을 먼저그려보도록 하겠습니다. 

 

activity_set_language.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SetLanguageActivity">

    <TextView
        android:id="@+id/textView6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="232dp"
        android:text="언어 설정"
        android:textSize="20sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/sample_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="68dp"
        android:text="example"
        android:textSize="25sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView6" />

    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="100dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/sample_text">

        <RadioButton
            android:id="@+id/radioButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginHorizontal="20dp"
            android:text="한글" />

        <RadioButton
            android:id="@+id/radioButton2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginHorizontal="20dp"
            android:text="영어" />
    </RadioGroup>


</androidx.constraintlayout.widget.ConstraintLayout>

이번 예제에서는 한글과 영어 두가지 언어를 지원하는 예제이며, 라디오 버튼을 클릭 시, 위의 Sample Sentence 문구가 선택된 언어로 전환되게 됩니다. 

Default Language 문구 작성

res -> values 폴더의 string.xml 파일에 앱 내에서 사용될 문구들을 작성해줍니다. 

작성 언어는 앱의 기본 언어로 설정할 언어로 작성해주시면 됩니다.

<resources>
    <string name="app_name">StickodeJAVA2</string>
    
    -- 앱 내에서 사용될 문구
    <string name="sample_text">샘플 문장</string>
</resources>

 

Translations Editor 열기

기본 언어 문구를 작성했다면, Translations Editor를 통해 해당 문구

res -> values 폴더의 string.xml 파일을 마우스 우클릭한 후 아래와 같이 Open Translation Editor를 선택해 Translations Editor를 열어줍니다. 

 

그 다음, 왼쪽 상단에 있는 지구 모양 버튼을 클릭 후, 추가하고 싶은 언어를 선택해줍니다. 여기선 English로 하겠습니다.

 

언어를 추가하게 되면 아래 이미지와 같이 오른쪽에 추가한 언어가 생성됩니다. 그 후, 번역되길 원하는 문구를 적어줍니다. 여기선 Sample Sentence라고 적어주었습니다.

 위의 작업을 통해, 앱 언어가 한글일 경우 '샘플 문장'이, 영어일 경우 'Semple Sentence'가 보이도록 해줄 수 있습니다. 

이제 실제로 앱 언어를 설정하는 방법을 알아보도록 하겠습니다.

코드 작성

SetLanguageActivity.java

public class SetLanguageActivity extends AppCompatActivity {
    private static final String TAG = "SetLanguageActivity";
    RadioButton korean, english;
    String language_code;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_set_language);

        korean = findViewById(R.id.radioButton);
        english = findViewById(R.id.radioButton2);

        // 저장된 언어 코드를 불러온다.
        language_code = SharedPreference.loadLanguageCode(SetLanguageActivity.this);

        // 저장된 언어코드에 따라 라디오 버튼을 체크해준다.
        if(language_code.equals("en") || language_code.equals("")){
            english.setChecked(true);
        }else{
            korean.setChecked(true);
        }

        korean.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                korean.setChecked(true);
                english.setChecked(false);
                language_code = "ko";
                set_language_code();  // 언어 코드에 해당하는 언어로 set

                SharedPreference.saveLanguageCode(SetLanguageActivity.this, language_code); // 언어코드 저장

                // 앱 재시작
                Intent intent = getIntent();
                finish();
                startActivity(intent);
            }
        });

        english.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                english.setChecked(true);
                korean.setChecked(false);
                language_code = "en";
                set_language_code();

                SharedPreference.saveLanguageCode(SetLanguageActivity.this, language_code); // 언어코드 저장

                // 앱 재시작
                Intent intent = getIntent();
                finish();
                startActivity(intent);
            }
        });

    }

    /**
     * 앱에 설정된 언어코드에 해당되는 언어로 모든 택스트를 바꿔주는 메서드
     */
    public void set_language_code(){
        Locale locale = new Locale(language_code);
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
    }
}

set_language_code 메서드 작성 시, 스틱코드를 활용하여 바로 불러왔습니다. 

stickode.com/code.html?fileno=10069 - set_language_code

 

STICKODE - 코드 등록하기

스틱코드에서 개발에 필요한 전세계의 모든 코드들을 찾아보세요! Java, Android, Kotlin, PHP 등의 수 많은 언어와 플랫폼을 지원합니다.

stickode.com

위 코드를 통해 사용자가 원하는 언어로 앱 기본 언어를 설정 해줄 수 있습니다. 

 


결과 영상