'제로'의 Android 복수형 처리
내 strings.xml에 다음과 같은 복수 자원이있는 경우 :
<plurals name="item_shop">
<item quantity="zero">No item</item>
<item quantity="one">One item</item>
<item quantity="other">%d items</item>
</plurals>
다음을 사용하여 사용자에게 결과를 보여줍니다.
textView.setText(getQuantityString(R.plurals.item_shop, quantity, quantity));
1 이상에서는 잘 작동하지만 수량이 0이면 "0 개 항목"이 표시됩니다. 문서에 것처럼 것처럼 "0"값은 아랍어로만 지원? 아니면 내가 뭔가를 놓치고 있습니까?
국제화의 Android 리소스 방법은 매우 제한적입니다. 나는 표준을 사용하여 훨씬 더 나은 성공을 거두었습니다 java.text.MessageFormat
.
기본적으로 다음과 같은 표준 규격 리소스를 사용하기 만하면됩니다.
<resources>
<string name="item_shop">{0,choice,0#No items|1#One item|1<{0} items}</string>
</resources>
그런 다음 코드에서해야 할 일은 다음과 달라집니다.
String fmt = getResources().getText(R.string.item_shop).toString();
textView.setText(MessageFormat.format(fmt, amount));
MessageFormat 에 대한 javadocs 에서 형식에 대해 자세히 읽을 수 있습니다.
에서 http://developer.android.com/guide/topics/resources/string-resource.html#Plurals :
선택은 문법적 선택에 따라 이루어집니다. 영어로 된 0 암호화 된 수량이 0 인 경우에도 무시됩니다. 0은 문법적으로 2와 다르지 보통 1을 다른 숫자 ( "zero books", "one book", "two books"등)의 위에). 양 2에만 존재하는 것처럼 보이는 것처럼 두 가지 소리가 들린다는 사실에 오해하지 않는 것처럼 보입니다. 언어는 2, 12, 102 (등)가 모두 서로 닮았지만 서로 다르게 취급 될 것을 요구할 수 있습니다. 수량. 번역가의 언어가 실제로 요구하는 차이점을 알기 위해 번역자에게 의뢰하십시오.
결론적으로 'zero'는 특정 언어에만 사용됩니다 ( 'two' 'few'등에도 동일 함). 다른 언어에는 특별한 활용이 없기 때문에 '제로'필드는 쓸데없는 것 때문입니다.
Android는 CLDR 복수형 시스템을 사용하고 작동 방식이 아닙니다 (변경 될 것으로 예상하지 않습니다).
시스템은 다음과 가변합니다.
http://cldr.unicode.org/index/cldr-spec/plural-rules
요컨대, "1"은 숫자 1을 의미하지 않는다는 것을 이해하는 것이 중요합니다. 대신 고전적인 키워드는 카테고리이고 각 카테고리에 엄격한 숫자 n은 CLDR 데이터베이스의 규칙에 의해 정의됩니다.
http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
0 이외의 것에 대해 "0"을 사용하는 언어는없는 것처럼 보이지만 "1"에 0을 할당하는 언어가 있습니다. "2"에 2가 아닌 다른 숫자가 포함 된 경우가 많이 있습니다.
Android에서 의도 한대로 수행 할 수있는 경우 애플리케이션이 더 복잡한 복수 규칙을 사용하여 여러 언어로 제대로 처리되지 않을 수 있습니다.
MessageFormat으로 전환하지 않고 문제를 처리하는 데 사용하는 해결 방법은 다음과 가능합니다.
"0"문자열을 먼저 가기 리소스로 추출합니다.
<string name="x_items_zero">No items.</string>
<plurals name="x_items">
<!-- NOTE: This "zero" value is never accessed but is kept here to show the intended usage of the "zero" string -->
<item quantity="zero">@string/x_items_zero</item>
<item quantity="one">One item.</item>
<item quantity="other">%d items.</item>
</plurals>
그런 다음 내 ResourcesUtil에 몇 가지 편리한 방법이 있습니다.
public static String getQuantityStringZero(Resources resources, int resId, int zeroResId, int quantity) {
if (quantity == 0) {
return resources.getString(zeroResId);
} else {
return resources.getQuantityString(resId, quantity, quantity);
}
}
public static String getQuantityStringZero(Resources resources, int resId, int zeroResId, int quantity, Object... formatArgs) {
if (quantity == 0) {
return resources.getString(zeroResId);
} else {
return resources.getQuantityString(resId, quantity, formatArgs);
}
}
이제 호출하는 수량 0에 통화를 사용하고 싶습니다.
String pluralString = ResourcesUtil.getQuantityStringZero(
getContext().getResources(),
R.plural.x_items,
R.string.x_items_zero,
quantity
);
더 나은 것이 있었으면 좋겠지 만 최소한 리소스 XML을 읽을 수 있도록 유지하면서 작업을 완료합니다.
데이터 바인딩을 사용하는 경우 다음과 같이이 문제를 해결할 수 있습니다.
<TextView ...
android:text="@{collection.size() > 0 ? @plurals/plural_str(collection.size(), collection.size()) : @string/zero_str}"/>
참고 URL : https://stackoverflow.com/questions/5651902/android-plurals-treatment-of-zero
'ProgramingTip' 카테고리의 다른 글
sqlite는 선택에서 모든 종류의 IF (조건) 문을 지원합니까? (0) | 2020.10.21 |
---|---|
다른 사전에 추가 (0) | 2020.10.21 |
Git을 사용하여 하나의 특정 브랜치에 * 오직 * 존재하는 모든 커밋을 표시하고 다른 브랜치 * 아무 ** 표시 (0) | 2020.10.21 |
매개 변수화 된 문이 모든 SQL 제출을 중지 할 수 있습니까? (0) | 2020.10.21 |
어디에서 소문자 표현으로 어떻게 변환합니까? (0) | 2020.10.21 |