ProgramingTip

'제로'의 Android 복수형 처리

bestdevel 2020. 10. 21. 21:15
반응형

'제로'의 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&lt;{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

반응형