안드로이드 문자열에 개수(단/복수)를 제대로 보여주자.

안드로이드(Android)에서 텍스트뷰(TextView)와 같은 위젯에 문자열(String)을 보여주는데 지역화(Localization)가 잘 되어 있다면 문자열 파일(/res/strings.xml)에서 문자열을 가져와서 보여줄 것이다. 이 문자열 파일을 사용해서 대부분의 지역화를 무리 없이 해결할 수 있다. 하지만 숫자가 문자열에 있는 경우 특정 언어(영어와 같은 단/복수가 구분된 경우)에서는 지역화가 문자열 파일만 사용해서는 로직이 복잡해지게 된다(한글의 경우에는 단/복수를 구분이 명확하지 않기에 비교적 간결한 편임). 그래서 안드로이드에서 어떻게 단/복수를 구분해서 사용하는지 살펴보자.

1. 스트링을 개수로 분리해서 사용하는 방법
– 이 형태를 사용하면 소스 코드에서 개수에 따른 분기가 필요해지는 단점이 있다.

<string name="item_1">I have one item.</string>
<string name="item_2">I have two items.</string>

– 아래와 같이 분기하는 로직이 필요하다.

if(count == 1)
  	tv01.setText(getString(R.string.item_1));

if(count == 2)
	  tv02.setText(getString(R.string.item_2));

2. 한 개의 스트링으로 여러 개수의 메시지를 처리하는 방법
– 이 형태를 사용하면 소스 코드는 간결해지나, 메시지가 모호해서 좋지 않은 UX를 제공하게 된다. 필자의 경우 이런 형태로 처리한 경험이 있다.

<string name="item_count">I have %1$s item(s).</string>

– 분기하는 로직이 필요없어 간결하다.

tv01.setText(String.format(getString(R.string.item_count), count));

3. 스트링 배열의 형태로 plurals 요소를 사용하는 방법
– 이 형태를 사용하면 문자열 파일이 약간 복잡해지나, 이미 로직이 문자열 파일의 plurals 요소에 입력된 형태가 된다. 따라서 로직이 2.번과 같은 모습을 띠고 있고 문자열은 명확하게 1.번의 모습으로 보여줄 수 있다.

<string name="item_count_one">I have %d item.</string>
<string name="item_count_other">I have %d items.</string>

<plurals name="item_counts">
	<item quantity="zero">@string/item_count_other</item>
	<item quantity="one">@string/item_count_one</item>
	<item quantity="two">@string/item_count_other</item>
	<item quantity="other">@string/item_count_other</item>
</plurals>

– 분기하는 로직이 필요 없어 간결하다. 아래의 소스 코드를 보면, getQuantityString 메서드를 사용해서 plurals 요소의 데이터,  plurals의 개수(quantity) 그리고 메시지에 보여주는 개수를 사용해서 완전한 메시지를 보여준다. getQuantityString() 메서드는 여기에서 확인하길 바란다.

tv01.setText(getResources().getQuantityString(R.plurals.item_counts, count, count));

이상 안드로이드에서 문자열에 개수를 표현하는 3가지 방법을 살펴봤다. 개인적으로는 plurals 요소를 사용하는 방법을 강력히 추천한다. 이 요소에 대한 자세한 내용은 https://developer.android.com/guide/topics/resources/string-resource.html#Plurals 에서 살펴볼 수 있다. 아래는 위 링크에서 plurals 요소가 사용할 수 있는 quantity 속성에서 사용할 수 있는 값들이다. 아래 값들에 대한 속성값이 어떤 의미를 가지는지 한 번만 읽어보고 사용하면 아주 쉽게 개수를 문자열에 보여줄 수 있겠다.

Value Description
zero When the language requires special treatment of the number 0 (as in Arabic).
one When the language requires special treatment of numbers like one (as with the number 1 in English and most other languages; in Russian, any number ending in 1 but not ending in 11 is in this class).
two When the language requires special treatment of numbers like two (as with 2 in Welsh, or 102 in Slovenian).
few When the language requires special treatment of “small” numbers (as with 2, 3, and 4 in Czech; or numbers ending 2, 3, or 4 but not 12, 13, or 14 in Polish).
many When the language requires special treatment of “large” numbers (as with numbers ending 11-99 in Maltese).
other When the language does not require special treatment of the given quantity (as with all numbers in Chinese, or 42 in English).

* 레퍼런스
– https://developer.android.com/guide/topics/resources/localization.html
https://developer.android.com/guide/topics/resources/string-resource.html

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.