KoreaTech

[모바일 프로그래밍] string.xml을 통한 다국어 설정 + 국제화, Non-Translatable Setting

졸려질려 2020. 3. 31. 23:07
반응형

Android 다국어 설정 방법(string.xml)

TextView, Button, EditText 등 text 속성을 주로 사용하고, 해당 속성에서 바로 문자열을 입력하면 다음과 같은 경고 메시지를 볼 수 있다.

Hardcoded string "안녕!", should use @string resource

현재 text 속성에 입력한 "안녕!" 이라는 문자열은 HardCode 되었기 때문에, string resource를 통해서 사용하라! 는 경고 메시지이다.

위 경고 메시지를 없애기 위해서는 메시지 그대로 string resource를 사용해서 문자열을 불러와야한다. 이 말은 res - values - string.xml 파일에 문자열을 등록해야 한다는 뜻이다.

처음에는 "app-name"에 "MobileProgramming" 로 앱 이름 문자열이 이미 저장되어있다. 이 곳에 "안녕" 이라는 문자열을 등록한다.

그리고 layout으로 돌아와서 string.xml에 있는 문자열을 지정하도록 수정한다.

이와 같이 string.xml에 있는 문자열을 지정할 수 있다. 그리고 노란 표시와 경고 메시지가 사라진 것을 볼 수 있다. string.xml을 사용하는 장점은 한 가지가 더 있다.

바로 지역(국가)에 따라 문자열을 지역의 언어에 맞게 맞춰놓을 수 있다.

1. string.xml 파일에서 Open editor 를 클릭한다.

만약에 app_name 외에 다른 것이 안 나온다면 위 사진에 표시한 새로고침 아이콘을 클릭하면 목록이 갱신된다.

2. 다른 지역의 언어로 매핑할 문자열을 선택하고 Add Locale 아이콘을 클릭한다.

3. 추가하고자 하는 지역을 선택한다.

4. 기본 값을 "Hello!"로 변경하고 한국 값을 "안녕!"으로 추가한다.

프로젝트 뷰에서 선택한 지역만의 string.xml 파일이 추가된 것을 확인할 수 있다.

5. 가상 머신을 실행하여 확인한다.

가상머신의 기본 언어는 English 이기 때문에 Hello!가 나온다.

6. 가상 머신의 언어를 변경하여 확인한다.

1. 가상 머신의 Settings 에서 lang 을 검색한다.

2. Languages & input 메뉴를 클릭하고, Languages 를 클릭한다.

3. Add a language를 클릭하고, "Korea" 를 검색한 후 "한국어"를 선택한다. (이후 "대한민국"을 선택한다.)


4. 우선순위를 한국어가 제일 위에 있도록 변경한다.

5. 다시 앱을 실행한다.


국제화

Android에서는 위와 같은 방법으로 다국어를 지원할 수 있다. 이와 같이 출판물이나 하드웨어 또는 소프트웨어 등의 제품을 언어 및 문화권 등이 다른 여러 환경에 대해 사용할 수 있도록 지원하는 것국제화라고 한다.

i18n

그리고 국제화를 다른말로 i18n이라고 표기한다. i18n은 internationalization의 i와 n 사이에 18개의 알파벳이라는 뜻이다. 더 자세한 내용은 링크를 클릭하면 된다.

국제화에 필요한 작업

  1. 언어, 지역별 번역
  2. OS/플랫폼 인코딩
  3. 문자열 치환 방법
  4. 국제화 UI(문자열 크기 변화, 폰트, 아이콘 등)
  5. 쓰기 방향의 차이(LTR, RTL) -> Android는 Start와 End로 쓰기 방향을 자동으로 설정한다.
  6. 숫자, 공백, 화폐, 날짜, 주소, 측정 단위 등 표기
  7. 타임존, 썸머타임 등 시각
  8. 문자열 정렬 방법

지역을 추가 할 때마다 다 번역 해야할까?

string.xml에 지역을 추가하면 모든 문자열들을 지역에 맞게 번역을 해야한다. 만약 하나의 문자열이라도 번역을 하지 않는다면 또 다시 WARNING에 노출된다. 그런데 ID, Password, Car, Home 등 한글로 번역하지 않아도 되는 문자열들이 있다. 이 문자열들은 우리가 영어 단어 자체로 잘 알고 있는 단어들이기 때문에 굳이 번역을 하지 않아도 된다. 그러나 번역을 하지 않으면 방금 언급했듯이 WARNING에 노출된다. 그러면 이와 같은 상황에서는 어떻게 해야할까?

Android에서는 위와 같이 사용자의 언어가 다르더라도 의미가 통할 수 있는 고유명사(브랜드명)들을 번역하지 않아도 WARNING에 노출되지 않게 해주는 설정이 있다.

번역할 수 없는 문자열 처리(Non-Translatable Strings)

출처 : http://tools.android.com/recent/non-translatablestrings

태그 안에 translatable="false"를 설정함으로써 번역할 수 없는 문자열들을 WARNING에 노출되지 않게 할 수 있다.

<string name="account_setup_imap" translatable="false">Password</string>

Android Developers : https://developer.android.com/studio/write/translations-editor.html#untranslatable

모바일 프로그래밍 수업을 수강하면서 따라 만든 앱에 적용해봤다.

<resources>
    <string name="app_name" translatable="false">BmiCalculator</string>
    <string name="height_edittext" translatable="false">Height</string>
    <string name="weight_edittext" translatable="false">Weight</string>
    <string name="calculate_button">Result</string>
    <string name="result_textview">Result</string>
</resources>

번역하지 않을 문자열이 많을 경우

만약 번역하지 않을 문자열이 많을 경우, donottranslate.xml로 XML 파일을 생성하면 Lint는 해당 Resource 파일을 번역하지 않을(Non-Translatable) 문자열의 모음으로 인식한다.

반응형