12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others. 22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License 332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer/* 432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer ******************************************************************************* 532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * Copyright (C) 2015, International Business Machines Corporation and 632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * others. All Rights Reserved. 732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer ******************************************************************************* 832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer */ 932d49d8c5367c893835119b37563984dbee3feb1Markus Schererpackage com.ibm.icu.impl; 1032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer 1132d49d8c5367c893835119b37563984dbee3feb1Markus Schererimport java.util.Arrays; 1232d49d8c5367c893835119b37563984dbee3feb1Markus Schererimport java.util.Collections; 1332d49d8c5367c893835119b37563984dbee3feb1Markus Schererimport java.util.List; 1432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer 1532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer/** 1632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * Standard CLDR plural form/category constants. 1732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * See http://www.unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules 1832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer */ 1932d49d8c5367c893835119b37563984dbee3feb1Markus Schererpublic enum StandardPlural { 2032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer ZERO("zero"), 2132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer ONE("one"), 2232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer TWO("two"), 2332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer FEW("few"), 2432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer MANY("many"), 2532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer OTHER("other"); 2632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer 2732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer /** 2832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * Numeric index of OTHER, same as OTHER.ordinal(). 2932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer */ 3032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer public static final int OTHER_INDEX = OTHER.ordinal(); 3132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer 3232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer /** 3332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * Unmodifiable List of all standard plural form constants. 3432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * List version of {@link #values()}. 3532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer */ 3632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer public static final List<StandardPlural> VALUES = 3732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer Collections.unmodifiableList(Arrays.asList(values())); 3832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer 3932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer /** 4032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * Number of standard plural forms/categories. 4132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer */ 4232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer public static final int COUNT = VALUES.size(); 4332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer 4432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer private final String keyword; 4532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer 4632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer private StandardPlural(String kw) { 4732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer keyword = kw; 4832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } 4932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer 5032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer /** 5132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * @return the lowercase CLDR keyword string for the plural form 5232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer */ 5332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer public final String getKeyword() { 5432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer return keyword; 5532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } 5632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer 5732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer /** 5832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * @param keyword for example "few" or "other" 5932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * @return the plural form corresponding to the keyword, or null 6032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer */ 6132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer public static final StandardPlural orNullFromString(CharSequence keyword) { 6232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer switch (keyword.length()) { 6332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer case 3: 6432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer if ("one".contentEquals(keyword)) { 6532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer return ONE; 6632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } else if ("two".contentEquals(keyword)) { 6732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer return TWO; 6832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } else if ("few".contentEquals(keyword)) { 6932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer return FEW; 7032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } 7132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer break; 7232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer case 4: 7332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer if ("many".contentEquals(keyword)) { 7432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer return MANY; 7532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } else if ("zero".contentEquals(keyword)) { 7632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer return ZERO; 7732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } 7832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer break; 7932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer case 5: 8032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer if ("other".contentEquals(keyword)) { 8132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer return OTHER; 8232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } 8332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer break; 8432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer default: 8532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer break; 8632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } 8732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer return null; 8832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } 8932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer 9032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer /** 9132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * @param keyword for example "few" or "other" 9232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * @return the plural form corresponding to the keyword, or OTHER 9332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer */ 9432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer public static final StandardPlural orOtherFromString(CharSequence keyword) { 9532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer StandardPlural p = orNullFromString(keyword); 9632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer return p != null ? p : OTHER; 9732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } 9832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer 9932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer /** 10032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * @param keyword for example "few" or "other" 10132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * @return the plural form corresponding to the keyword 10232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * @throws IllegalArgumentException if the keyword is not a plural form 10332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer */ 10432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer public static final StandardPlural fromString(CharSequence keyword) { 10532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer StandardPlural p = orNullFromString(keyword); 10632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer if (p != null) { 10732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer return p; 10832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } else { 10932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer throw new IllegalArgumentException(keyword.toString()); 11032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } 11132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } 11232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer 11332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer /** 11432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * @param keyword for example "few" or "other" 11532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * @return the index of the plural form corresponding to the keyword, or a negative value 11632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer */ 11732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer public static final int indexOrNegativeFromString(CharSequence keyword) { 11832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer StandardPlural p = orNullFromString(keyword); 11932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer return p != null ? p.ordinal() : -1; 12032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } 12132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer 12232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer /** 12332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * @param keyword for example "few" or "other" 12432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * @return the index of the plural form corresponding to the keyword, or OTHER_INDEX 12532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer */ 12632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer public static final int indexOrOtherIndexFromString(CharSequence keyword) { 12732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer StandardPlural p = orNullFromString(keyword); 12832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer return p != null ? p.ordinal() : OTHER.ordinal(); 12932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } 13032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer 13132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer /** 13232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * @param keyword for example "few" or "other" 13332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * @return the index of the plural form corresponding to the keyword 13432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * @throws IllegalArgumentException if the keyword is not a plural form 13532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer */ 13632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer public static final int indexFromString(CharSequence keyword) { 13732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer StandardPlural p = orNullFromString(keyword); 13832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer if (p != null) { 13932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer return p.ordinal(); 14032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } else { 14132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer throw new IllegalArgumentException(keyword.toString()); 14232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } 14332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer } 14432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer}