여러 국가를 대상으로 하는 앱을 만들떄, 해당 국가의 언어에 맞게 여러 언어를 제공해줘야 할 필요가 있습니다.
이번 예제에서는 어떻게 다국어를 지원해줄 수 있는지 알아보도록 하겠습니다.
여러 나라에세 서비스를 출시 할려면, 해당 나라가 쓰는 언어들을 지원해 줘야 합니다. 이번 시간에는 kotlin으로 앱 내에서 언어 설정을 변경하는 방법을 알아보도록 하겠습니다.
저번 자바에서 사용했던 화면을 그대로 사용하겠습니다. (자바로 언어 설정을 바꾸는 방법은 이 포스팅을 참고해주세요.)
activity_translation.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=".TranslationActivity">
<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="@string/sample_text"
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:layout_marginTop="100dp"
android:orientation="horizontal"
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>
화면 구성은 라디오 버튼과 바뀐 언어를 표시할 TextView로 이루어져 있습니다. 한글 버튼을 클릭시 '샘플 문장'이 보일 것이며 영어 버튼을 클릭하면 'Sample Sentence' 문구가 보이게 될 것입니다.
Default Language 문구 작성
설정에 따라 Text의 내용이 바뀌기 위해서는 res -> values 폴더의 string.xml 파일에 앱 내에서 사용될 문구들을 작성해줘야 합니다. 작성 언어는 앱의 기본 언어로 설정할 언어로 작성해주시면 됩니다. 이 예제에서는 한국어가 기본 언어이기 때문에 리소스 sample_text에 '샘플 문장'이라고 적었습니다.
<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'가 보이도록 해줄 수 있습니다.
이제 실제로 앱 언어를 설정하는 방법을 알아보도록 하겠습니다.
코드 작성
TranslationActivity.kt
사용자의 선택에 따라 언어를 바꾸기 위해서는 다음 두가지 객체를 사용해야 합니다. Locale 과 Configure 객체인데요. 이 객체에 대해서는 안드로이드 개발자 문서를 참고하시면 좋을 거 같습니다.
developer.android.com/reference/java/util/Locale
developer.android.com/reference/android/content/res/Configuration
구현은 스틱코드를 등록하시면 언제든 쉽게 하실 수 있습니다.
package com.example.stickcodekotlin
import android.app.Activity
import android.content.Context
import android.content.res.Configuration
import android.os.Bundle
import android.util.Log
import android.widget.RadioButton
import androidx.appcompat.app.AppCompatActivity
import java.util.*
class TranslationActivity : AppCompatActivity() {
private lateinit var korean: RadioButton
private lateinit var english: RadioButton
private lateinit var language_code: String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_translation)
korean = findViewById(R.id.radioButton)
english = findViewById(R.id.radioButton2)
// 저장된 언어 코드를 불러온다.
val sharedPreferences = getSharedPreferences("Settings", Activity.MODE_PRIVATE)
val language = sharedPreferences.getString("My_Lang", "")
if (language != null) {
Log.d("로그", "language :"+language)
language_code = language
}
// 저장된 언어코드에 따라 라디오 버튼을 체크해준다.
if(language_code.equals("en") || language_code.equals("")){
english.setChecked(true);
}else{
korean.setChecked(true);
}
//한국어 라디오 버튼 변경
korean.setOnClickListener {
setLocate("ko")
recreate()
}
// 영어 라디오 버튼 변경
english.setOnClickListener {
setLocate("en")
recreate()
}
}
//Locale 객체를 생성특정 지리적, 정치적 또는 문화적 영역을 나타냅니다.
private fun setLocate(Lang: String) {
Log.d("로그", "setLocate")
val locale = Locale(Lang) // Local 객체 생성. 인자로는 해당 언어의 축약어가 들어가게 됩니다. (ex. ko, en)
Locale.setDefault(locale) // 생성한 Locale로 설정을 해줍니다.
val config = Configuration() //이 클래스는 응용 프로그램이 검색하는 리소스에 영향을 줄 수 있는
// 모든 장치 구성 정보를 설명합니다.
config.setLocale(locale) // 현재 유저가 선호하는 언어를 환경 설정으로 맞춰 줍니다.
baseContext.resources.updateConfiguration(config, baseContext.resources.displayMetrics)
// Shared에 현재 언어 상태를 저장해 줍니다.
val editor = getSharedPreferences("Settings", Context.MODE_PRIVATE).edit()
editor.putString("My_Lang", Lang)
editor.apply()
}
}
stickode.com/detail.html?no=2132
결과 영상
'안드로이드 코틀린' 카테고리의 다른 글
[Kotlin][Android] SST(SpeechToText) 기능 구현하기 (0) | 2021.05.31 |
---|---|
[Kotlin][Android] 앱 잠금 화면 만들기 (1) | 2021.05.30 |
[Kotlin][Android] 안드로이드 - 다중이미지 불러오기 (0) | 2021.05.25 |
[Kotlin][Android] 리사이클러뷰 빠르게 만들기 (0) | 2021.05.24 |
[Kotlin][Android] 네비게이션 드로어(Navigation Drawer) 만들기 (4) | 2021.05.23 |