본문 바로가기

TIL

[TIL] 0818 strings.xml, 언어변경

[오늘 배운 내용]

-1- Android Studio String resource 활용

  • xml파일에서 text를 입력하는 란에 "텍스트1" 식으로 텍스트를 입력하게 되면 하드코딩이 되었다고 알람이 나온다

주의 표시

  • String resource를 통해 작성해야 하는 이유
    • 하드코딩을 하게 되면 사후관리가 어려울 수 있다 예를 들면, 특정 상품을 구매하는 어플에서 "구입"을 "구매"로 바꿔 달라는 요청을 받게될 때, "구입" 을 찾아서 바꾸는 방법도 있겠지만 코드가 많은 상황에서는 부담이 될 수 있다. 또 핸드폰 언어설정을 영어로 설정해두고 사용하는 사람의 경우와 타 국가에서 어플을 사용하게 될 경우에도 어려움이 생길 수 있는데  String resource에서 관리함으로써 이 문제를 해결할 수 있다.
  • 다국어 지원 기능
    • String 값을 설정된 언어에 따라 변경을 일일이 해야 하기에 번거롭지만 사용자의 편의를 위해 다양한 언어를 제공해줌으로써 유용한 기능인 것 같다.
  • String.xml 파일안에 <string name=" inputKey ">inputText</string> 형식으로 입력으로 String resource값을 추가할 수 있다.
<string name="toolbar_title" >앱 제목</string>

 

  • 또는 values/strings 우클릭으로 open Translation Editor 에서도 추가할 수 있다.
  • 언어를 영문으로 선택해놓았을 시 영문이 출력되도록 String resource에 string.xml(en)을 추가하고 적용해보자

1

 

2

 

  • Translations Editor 내에 English(en)이 추가된 것을 확인할 수 있고 기존에 string.xml 에서 설정해둔 값들도 확인할 수 있다. 추가된 English(en) 하단의 칸이 영어로 언어 설정이 된 기기에서 보여지는 값이니 영문으로 입력해줄 수 있다
  • 나는 주로 이용하는 사용자가 한국인이라는 가정으로 디폴트 값을 한국어로 두었다.
  • 특정 값의 경우 번역이 필요하지 않는 상황이 생기는데 이때는 Unttranslatable을 체크해주면 되고, 해당 값은 타언어의 값을 입력해주지 않아도 된다. 
  • Untranslatable에 체크를 하지 않았는데, 언어값에 해당하는 란에 값이 없으면 오류가 나니 별도의 값으로 입력이 필요하지 않다면 반드시 체크해주자.

 

  • Untranslatable을 체크하면 자동으로 xml파일 내부 source 코드에 translatable="false" 가 들어간다.
<resources>
    <string name="app_name">PracticeSNS</string>
    <string name="say_hello">안녕하세요</string>
    <string name="corp_address" translatable="false">제주도</string>
</resources>

 

 

 

 

  • 설정된 언어에 맞게 strings resource를 설정해주는 코드
class TestActivity : AppCompatActivity() {
    private lateinit var configuration: Configuration
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_test)


        configuration.locale = Locale.US
        configuration.locale = Locale.KOREA

        resources.updateConfiguration(configuration,resources.displayMetrics)

        val intent = baseContext.packageManager.getLaunchIntentForPackage(baseContext.packageName)
        intent!!.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
        intent!!.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        finish()
        startActivity(intent)
    }
}

 

 

 

 

 


 

[오늘 복습한 내용]

1. Array

// 배열은 인덱스를 통해 접근할 수 있고, 인덱스는 0부터 시작
// 마지막 원소의 인덱스는 (배열의크기-1) 이다.
// 최초 정해준 저장공간의 크기를 변경할 수 없다.

private fun main() {
    val flavor: Array<String> = arrayOf("Watermelon", "Blueberry", "Earlgrey", "Aloe")

    println(flavor)
    for (index in flavor) {
        print("$index ")
    }
    println()

    // 2차원 배열
    val data = arrayOf(
        arrayOf("밀크티", "타로밀크티"),
        arrayOf("아메리카노", "헤이즐넛","콜드브루"),
        arrayOf("딸기스무디","망고스무디")
    )
    // 2차원 배열 원소 접근
    for (index in data) {
        for (myFavorite in index) {
            print("|${myFavorite}|")
        }
        println()
    }
}

// ★★★★★
// 배열의 원소를 출력할 때는 각 원소에 접근하여 출력하여야 한다

 

 


[오류,에러 등등]

오늘은 특이사항이 없었다.

 


[느낀 점]

1. 어렵다

 

2. 시간관리가 너무 안된다. 다른 짓 하는건 아닌데 배우는 양은 적고, 시간이 너무 금방간다

 

 


[Reference]

 

 

https://codinghero.tistory.com/106

https://layers7.tistory.com/48

https://stickode.tistory.com/117

https://yunaaaas.tistory.com/19