Merge "Defer to ICU's knowledge of language-specific grammatical quantity rules."
This commit is contained in:
committed by
Android (Google) Code Review
commit
def4e4d39d
@@ -1,111 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2007 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package android.content.res;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
/*
|
||||
* Yuck-o. This is not the right way to implement this. When the ICU PluralRules
|
||||
* object has been integrated to android, we should switch to that. For now, yuck-o.
|
||||
*/
|
||||
|
||||
abstract class PluralRules {
|
||||
|
||||
static final int QUANTITY_OTHER = 0x0000;
|
||||
static final int QUANTITY_ZERO = 0x0001;
|
||||
static final int QUANTITY_ONE = 0x0002;
|
||||
static final int QUANTITY_TWO = 0x0004;
|
||||
static final int QUANTITY_FEW = 0x0008;
|
||||
static final int QUANTITY_MANY = 0x0010;
|
||||
|
||||
static final int ID_OTHER = 0x01000004;
|
||||
|
||||
abstract int quantityForNumber(int n);
|
||||
|
||||
final int attrForNumber(int n) {
|
||||
return PluralRules.attrForQuantity(quantityForNumber(n));
|
||||
}
|
||||
|
||||
static final int attrForQuantity(int quantity) {
|
||||
// see include/utils/ResourceTypes.h
|
||||
switch (quantity) {
|
||||
case QUANTITY_ZERO: return 0x01000005;
|
||||
case QUANTITY_ONE: return 0x01000006;
|
||||
case QUANTITY_TWO: return 0x01000007;
|
||||
case QUANTITY_FEW: return 0x01000008;
|
||||
case QUANTITY_MANY: return 0x01000009;
|
||||
default: return ID_OTHER;
|
||||
}
|
||||
}
|
||||
|
||||
static final String stringForQuantity(int quantity) {
|
||||
switch (quantity) {
|
||||
case QUANTITY_ZERO:
|
||||
return "zero";
|
||||
case QUANTITY_ONE:
|
||||
return "one";
|
||||
case QUANTITY_TWO:
|
||||
return "two";
|
||||
case QUANTITY_FEW:
|
||||
return "few";
|
||||
case QUANTITY_MANY:
|
||||
return "many";
|
||||
default:
|
||||
return "other";
|
||||
}
|
||||
}
|
||||
|
||||
static final PluralRules ruleForLocale(Locale locale) {
|
||||
String lang = locale.getLanguage();
|
||||
if ("cs".equals(lang)) {
|
||||
if (cs == null) cs = new cs();
|
||||
return cs;
|
||||
}
|
||||
else {
|
||||
if (en == null) en = new en();
|
||||
return en;
|
||||
}
|
||||
}
|
||||
|
||||
private static PluralRules cs;
|
||||
private static class cs extends PluralRules {
|
||||
int quantityForNumber(int n) {
|
||||
if (n == 1) {
|
||||
return QUANTITY_ONE;
|
||||
}
|
||||
else if (n >= 2 && n <= 4) {
|
||||
return QUANTITY_FEW;
|
||||
}
|
||||
else {
|
||||
return QUANTITY_OTHER;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static PluralRules en;
|
||||
private static class en extends PluralRules {
|
||||
int quantityForNumber(int n) {
|
||||
if (n == 1) {
|
||||
return QUANTITY_ONE;
|
||||
}
|
||||
else {
|
||||
return QUANTITY_OTHER;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
|
||||
package android.content.res;
|
||||
|
||||
|
||||
import com.android.internal.util.XmlUtils;
|
||||
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
@@ -41,6 +40,8 @@ import java.io.InputStream;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.Locale;
|
||||
|
||||
import libcore.icu.NativePluralRules;
|
||||
|
||||
/**
|
||||
* Class for accessing an application's resources. This sits on top of the
|
||||
* asset manager of the application (accessible through getAssets()) and
|
||||
@@ -52,6 +53,8 @@ public class Resources {
|
||||
private static final boolean DEBUG_CONFIG = false;
|
||||
private static final boolean TRACE_FOR_PRELOAD = false;
|
||||
|
||||
private static final int ID_OTHER = 0x01000004;
|
||||
|
||||
// Use the current SDK version code. If we are a development build,
|
||||
// also allow the previous SDK version + 1.
|
||||
private static final int sSdkVersion = Build.VERSION.SDK_INT
|
||||
@@ -86,7 +89,7 @@ public class Resources {
|
||||
/*package*/ final AssetManager mAssets;
|
||||
private final Configuration mConfiguration = new Configuration();
|
||||
/*package*/ final DisplayMetrics mMetrics = new DisplayMetrics();
|
||||
PluralRules mPluralRule;
|
||||
private NativePluralRules mPluralRule;
|
||||
|
||||
private CompatibilityInfo mCompatibilityInfo;
|
||||
private Display mDefaultDisplay;
|
||||
@@ -203,9 +206,17 @@ public class Resources {
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the character sequence associated with a particular resource ID for a particular
|
||||
* numerical quantity.
|
||||
*
|
||||
* <p>See <a href="{@docRoot}guide/topics/resources/string-resource.html#Plurals">String
|
||||
* Resources</a> for more on quantity strings.
|
||||
*
|
||||
* @param id The desired resource identifier, as generated by the aapt
|
||||
* tool. This integer encodes the package, type, and resource
|
||||
* entry. The value 0 is an invalid identifier.
|
||||
* @param quantity The number used to get the correct string for the current language's
|
||||
* plural rules.
|
||||
*
|
||||
* @throws NotFoundException Throws NotFoundException if the given ID does not exist.
|
||||
*
|
||||
@@ -213,29 +224,52 @@ public class Resources {
|
||||
* possibly styled text information.
|
||||
*/
|
||||
public CharSequence getQuantityText(int id, int quantity) throws NotFoundException {
|
||||
PluralRules rule = getPluralRule();
|
||||
CharSequence res = mAssets.getResourceBagText(id, rule.attrForNumber(quantity));
|
||||
NativePluralRules rule = getPluralRule();
|
||||
CharSequence res = mAssets.getResourceBagText(id,
|
||||
attrForQuantityCode(rule.quantityForInt(quantity)));
|
||||
if (res != null) {
|
||||
return res;
|
||||
}
|
||||
res = mAssets.getResourceBagText(id, PluralRules.ID_OTHER);
|
||||
res = mAssets.getResourceBagText(id, ID_OTHER);
|
||||
if (res != null) {
|
||||
return res;
|
||||
}
|
||||
throw new NotFoundException("Plural resource ID #0x" + Integer.toHexString(id)
|
||||
+ " quantity=" + quantity
|
||||
+ " item=" + PluralRules.stringForQuantity(rule.quantityForNumber(quantity)));
|
||||
+ " item=" + stringForQuantityCode(rule.quantityForInt(quantity)));
|
||||
}
|
||||
|
||||
private PluralRules getPluralRule() {
|
||||
private NativePluralRules getPluralRule() {
|
||||
synchronized (mSync) {
|
||||
if (mPluralRule == null) {
|
||||
mPluralRule = PluralRules.ruleForLocale(mConfiguration.locale);
|
||||
mPluralRule = NativePluralRules.forLocale(mConfiguration.locale);
|
||||
}
|
||||
return mPluralRule;
|
||||
}
|
||||
}
|
||||
|
||||
private static int attrForQuantityCode(int quantityCode) {
|
||||
switch (quantityCode) {
|
||||
case NativePluralRules.ZERO: return 0x01000005;
|
||||
case NativePluralRules.ONE: return 0x01000006;
|
||||
case NativePluralRules.TWO: return 0x01000007;
|
||||
case NativePluralRules.FEW: return 0x01000008;
|
||||
case NativePluralRules.MANY: return 0x01000009;
|
||||
default: return ID_OTHER;
|
||||
}
|
||||
}
|
||||
|
||||
private static String stringForQuantityCode(int quantityCode) {
|
||||
switch (quantityCode) {
|
||||
case NativePluralRules.ZERO: return "zero";
|
||||
case NativePluralRules.ONE: return "one";
|
||||
case NativePluralRules.TWO: return "two";
|
||||
case NativePluralRules.FEW: return "few";
|
||||
case NativePluralRules.MANY: return "many";
|
||||
default: return "other";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the string value associated with a particular resource ID. It
|
||||
* will be stripped of any styled text information.
|
||||
@@ -290,6 +324,9 @@ public class Resources {
|
||||
* stripped of any styled text information.
|
||||
* {@more}
|
||||
*
|
||||
* <p>See <a href="{@docRoot}guide/topics/resources/string-resource.html#Plurals">String
|
||||
* Resources</a> for more on quantity strings.
|
||||
*
|
||||
* @param id The desired resource identifier, as generated by the aapt
|
||||
* tool. This integer encodes the package, type, and resource
|
||||
* entry. The value 0 is an invalid identifier.
|
||||
@@ -312,6 +349,9 @@ public class Resources {
|
||||
* Return the string value associated with a particular resource ID for a particular
|
||||
* numerical quantity.
|
||||
*
|
||||
* <p>See <a href="{@docRoot}guide/topics/resources/string-resource.html#Plurals">String
|
||||
* Resources</a> for more on quantity strings.
|
||||
*
|
||||
* @param id The desired resource identifier, as generated by the aapt
|
||||
* tool. This integer encodes the package, type, and resource
|
||||
* entry. The value 0 is an invalid identifier.
|
||||
@@ -1334,7 +1374,7 @@ public class Resources {
|
||||
}
|
||||
synchronized (mSync) {
|
||||
if (mPluralRule != null) {
|
||||
mPluralRule = PluralRules.ruleForLocale(config.locale);
|
||||
mPluralRule = NativePluralRules.forLocale(config.locale);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user