aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpp/res/messages.grdp6
-rw-r--r--cpp/src/region_data_constants.cc8
-rw-r--r--cpp/src/rule.cc2
-rw-r--r--java/res/values/address_strings.xml7
-rw-r--r--java/src/com/android/i18n/addressinput/AddressWidget.java2
-rw-r--r--java/src/com/android/i18n/addressinput/FormatInterpreter.java24
-rw-r--r--java/src/com/android/i18n/addressinput/RegionDataConstants.java11
-rw-r--r--java/test/com/android/i18n/addressinput/ClientDataTest.java2
-rw-r--r--java/test/com/android/i18n/addressinput/FormatInterpreterTest.java42
9 files changed, 82 insertions, 22 deletions
diff --git a/cpp/res/messages.grdp b/cpp/res/messages.grdp
index 1e1bcf2..c04449a 100644
--- a/cpp/res/messages.grdp
+++ b/cpp/res/messages.grdp
@@ -85,6 +85,12 @@ limitations under the License.
Island
</message>
<message
+ name="IDS_LIBADDRESSINPUT_OBLAST"
+ desc="Administrative Area for certain countries (e.g., Russia's
+ Leningrad).">
+ Oblast
+ </message>
+ <message
name="IDS_LIBADDRESSINPUT_PARISH"
desc="Administrative Area for certain countries (e.g., Andorra's
Canillo).">
diff --git a/cpp/src/region_data_constants.cc b/cpp/src/region_data_constants.cc
index d12bafc..8c552d3 100644
--- a/cpp/src/region_data_constants.cc
+++ b/cpp/src/region_data_constants.cc
@@ -43,9 +43,8 @@ std::map<std::string, std::string> InitRegionData() {
"\"languages\":\"en\""
"}"));
region_data.insert(std::make_pair("AD", "{"
- "\"fmt\":\"%N%n%O%n%A%n%Z %S\","
- "\"require\":\"AS\","
- "\"state_name_type\":\"parish\","
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"require\":\"A\","
"\"zipex\":\"AD100,AD501,AD700\","
"\"posturl\":\"http://www.correos.es/comun/CodigosPostales/1010_s-CodPostal.asp\?Provincia=\","
"\"languages\":\"ca\""
@@ -1062,8 +1061,9 @@ std::map<std::string, std::string> InitRegionData() {
"\"languages\":\"sr-Cyrl~sr-Latn\""
"}"));
region_data.insert(std::make_pair("RU", "{"
- "\"fmt\":\"%Z %C %n%A%n%O%n%N\","
+ "\"fmt\":\"%N%n%O%n%A%n%C%n%S%n%Z\","
"\"require\":\"ACZ\","
+ "\"state_name_type\":\"oblast\","
"\"zipex\":\"125075,247112,103375\","
"\"posturl\":\"http://info.russianpost.ru/servlet/department\","
"\"languages\":\"ru\""
diff --git a/cpp/src/rule.cc b/cpp/src/rule.cc
index e25142f..b4d03ca 100644
--- a/cpp/src/rule.cc
+++ b/cpp/src/rule.cc
@@ -73,6 +73,8 @@ NameMessageIdMap InitAdminAreaMessageIds() {
message_ids.insert(std::make_pair(
"island", IDS_LIBADDRESSINPUT_ISLAND));
message_ids.insert(std::make_pair(
+ "oblast", IDS_LIBADDRESSINPUT_OBLAST));
+ message_ids.insert(std::make_pair(
"parish", IDS_LIBADDRESSINPUT_PARISH));
message_ids.insert(std::make_pair(
"prefecture", IDS_LIBADDRESSINPUT_PREFECTURE));
diff --git a/java/res/values/address_strings.xml b/java/res/values/address_strings.xml
index 57b34c4..f12247a 100644
--- a/java/res/values/address_strings.xml
+++ b/java/res/values/address_strings.xml
@@ -80,6 +80,9 @@
<!-- Administrative Area for certain countries (e.g., Bahama's Cat Island) [CHAR LIMIT=30] -->
<string name="i18n_island">Island</string>
+ <!-- Administrative Area for certain countries (e.g., Russia's Leningrad) [CHAR LIMIT=30] -->
+ <string name="i18n_oblast">Oblast</string>
+
<!-- Administrative Area for certain countries (e.g., Andorra's Canillo) [CHAR LIMIT=30] -->
<string name="i18n_parish">Parish</string>
@@ -140,6 +143,10 @@
(e.g., Bahama) is entered incorrectly by the user [CHAR LIMIT=30] -->
<string name="invalid_island">Invalid island</string>
+ <!-- Message to be shown when the administrative area (oblast) for certain countries
+ (e.g., Russia) is entered incorrectly by the user [CHAR LIMIT=30] -->
+ <string name="invalid_oblast">Invalid oblast</string>
+
<!-- Message to be shown when the administrative area (parish) for certain countries
(e.g., Andorra) is entered incorrectly by the user [CHAR LIMIT=30] -->
<string name="invalid_parish">Invalid parish</string>
diff --git a/java/src/com/android/i18n/addressinput/AddressWidget.java b/java/src/com/android/i18n/addressinput/AddressWidget.java
index 76cd12a..c377e2c 100644
--- a/java/src/com/android/i18n/addressinput/AddressWidget.java
+++ b/java/src/com/android/i18n/addressinput/AddressWidget.java
@@ -112,6 +112,7 @@ public class AddressWidget implements AdapterView.OnItemSelectedListener {
adminLabelMap.put("do_si", R.string.i18n_do_si);
adminLabelMap.put("emirate", R.string.i18n_emirate);
adminLabelMap.put("island", R.string.i18n_island);
+ adminLabelMap.put("oblast", R.string.i18n_oblast);
adminLabelMap.put("parish", R.string.i18n_parish);
adminLabelMap.put("prefecture", R.string.i18n_prefecture);
adminLabelMap.put("province", R.string.i18n_province);
@@ -131,6 +132,7 @@ public class AddressWidget implements AdapterView.OnItemSelectedListener {
adminErrorMap.put("do_si", R.string.invalid_do_si);
adminErrorMap.put("emirate", R.string.invalid_emirate);
adminErrorMap.put("island", R.string.invalid_island);
+ adminErrorMap.put("oblast", R.string.invalid_oblast);
adminErrorMap.put("parish", R.string.invalid_parish);
adminErrorMap.put("prefecture", R.string.invalid_prefecture);
adminErrorMap.put("province", R.string.invalid_province);
diff --git a/java/src/com/android/i18n/addressinput/FormatInterpreter.java b/java/src/com/android/i18n/addressinput/FormatInterpreter.java
index ffd19b1..ed7b2ac 100644
--- a/java/src/com/android/i18n/addressinput/FormatInterpreter.java
+++ b/java/src/com/android/i18n/addressinput/FormatInterpreter.java
@@ -155,15 +155,16 @@ class FormatInterpreter {
List<String> lines = new ArrayList<String>();
StringBuilder currentLine = new StringBuilder();
- for (String substr : getFormatSubStrings(scriptType, regionCode)) {
- if (substr.equals(NEW_LINE)) {
- String normalizedStr = removeAllRedundantSpaces(currentLine.toString());
+ for (String formatSymbol : getFormatSubStrings(scriptType, regionCode)) {
+ if (formatSymbol.equals(NEW_LINE)) {
+ String normalizedStr =
+ removeRedundantSpacesAndLeadingPunctuation(currentLine.toString());
if (normalizedStr.length() > 0) {
lines.add(normalizedStr);
currentLine.setLength(0);
}
- } else if (substr.startsWith("%")) {
- char c = substr.charAt(1);
+ } else if (formatSymbol.startsWith("%")) {
+ char c = formatSymbol.charAt(1);
AddressField field = AddressField.of(c);
Util.checkNotNull(field, "null address field for character " + c);
@@ -203,10 +204,10 @@ class FormatInterpreter {
currentLine.append(value);
}
} else {
- currentLine.append(substr);
+ currentLine.append(formatSymbol);
}
}
- String normalizedStr = removeAllRedundantSpaces(currentLine.toString());
+ String normalizedStr = removeRedundantSpacesAndLeadingPunctuation(currentLine.toString());
if (normalizedStr.length() > 0) {
lines.add(normalizedStr);
}
@@ -242,13 +243,16 @@ class FormatInterpreter {
return parts;
}
- private String removeAllRedundantSpaces(String str) {
+ private static String removeRedundantSpacesAndLeadingPunctuation(String str) {
+ // Remove leading commas and other punctuation that might have been added by the formatter
+ // in the case of missing data.
+ str = str.replaceFirst("^[-,\\s]+", "");
str = str.trim();
str = str.replaceAll(" +", " ");
return str;
}
- private String getFormatString(ScriptType scriptType, String regionCode) {
+ private static String getFormatString(ScriptType scriptType, String regionCode) {
String format = (scriptType == ScriptType.LOCAL)
? getJsonValue(regionCode, AddressDataKey.FMT)
: getJsonValue(regionCode, AddressDataKey.LFMT);
@@ -258,7 +262,7 @@ class FormatInterpreter {
return format;
}
- private String getJsonValue(String regionCode, AddressDataKey key) {
+ private static String getJsonValue(String regionCode, AddressDataKey key) {
Util.checkNotNull(regionCode);
String jsonString = RegionDataConstants.getCountryFormatMap().get(regionCode);
Util.checkNotNull(jsonString, "no json data for region code " + regionCode);
diff --git a/java/src/com/android/i18n/addressinput/RegionDataConstants.java b/java/src/com/android/i18n/addressinput/RegionDataConstants.java
index 946fc24..18b1fd8 100644
--- a/java/src/com/android/i18n/addressinput/RegionDataConstants.java
+++ b/java/src/com/android/i18n/addressinput/RegionDataConstants.java
@@ -41,10 +41,8 @@ class RegionDataConstants {
"name", "ANDORRA",
"lang", "ca",
"languages", "ca",
- "fmt", "%N%n%O%n%A%n%Z %S",
- "require", "AS",
- "upper", "S",
- "state_name_type", "parish",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ "require", "A",
}),
AE(new String[]{
"name", "UNITED ARAB EMIRATES",
@@ -977,8 +975,9 @@ class RegionDataConstants {
}),
RU(new String[]{
"name", "RUSSIAN FEDERATION",
- "fmt", "%Z %C %n%A%n%O%n%N",
+ "fmt", "%N%n%O%n%A%n%C%n%S%n%Z",
"require", "ACZ",
+ "state_name_type", "oblast",
"upper", "AC",
}),
RW(new String[]{
@@ -1168,7 +1167,7 @@ class RegionDataConstants {
"name", "UNITED STATES",
"lang", "en",
"languages", "en",
- "fmt", "%N%n%O%n%A%n%C %S %Z",
+ "fmt", "%N%n%O%n%A%n%C, %S %Z",
"require", "ACSZ",
"upper", "CS",
"zip_name_type", "zip",
diff --git a/java/test/com/android/i18n/addressinput/ClientDataTest.java b/java/test/com/android/i18n/addressinput/ClientDataTest.java
index 570434e..b18d726 100644
--- a/java/test/com/android/i18n/addressinput/ClientDataTest.java
+++ b/java/test/com/android/i18n/addressinput/ClientDataTest.java
@@ -78,6 +78,6 @@ public class ClientDataTest extends AsyncTestCase {
// data from there.
assertNotNull(data);
String unitedStatesFormatInfo = data.get(AddressDataKey.FMT);
- assertEquals("%N%n%O%n%A%n%C %S %Z", unitedStatesFormatInfo);
+ assertEquals("%N%n%O%n%A%n%C, %S %Z", unitedStatesFormatInfo);
}
}
diff --git a/java/test/com/android/i18n/addressinput/FormatInterpreterTest.java b/java/test/com/android/i18n/addressinput/FormatInterpreterTest.java
index 50372ed..f5bac79 100644
--- a/java/test/com/android/i18n/addressinput/FormatInterpreterTest.java
+++ b/java/test/com/android/i18n/addressinput/FormatInterpreterTest.java
@@ -147,7 +147,7 @@ public class FormatInterpreterTest extends TestCase {
public void testUsEnvelopeAddress() {
List<String> expected = new ArrayList<String>();
expected.add("1098 Alta Ave");
- expected.add("Mt View CA 94043");
+ expected.add("Mt View, CA 94043");
List<String> real = formatInterpreter.getEnvelopeAddress(US_CA_ADDRESS);
@@ -189,4 +189,44 @@ public class FormatInterpreterTest extends TestCase {
List<String> real = formatInterpreter.getEnvelopeAddress(address);
assertEquals(expected, real);
}
+
+ public void testEnvelopeAddressLeadingPostPrefix() {
+ List<String> expected = new ArrayList<String>();
+ expected.add("CH-8047 Herrliberg");
+ AddressData address = new AddressData.Builder().setCountry("CH")
+ .setPostalCode("8047")
+ .setLocality("Herrliberg")
+ .build();
+
+ List<String> real = formatInterpreter.getEnvelopeAddress(address);
+ assertEquals(expected, real);
+ }
+
+ public void testSvAddress() {
+ final AddressData svAddress = new AddressData.Builder().setCountry("SV")
+ .setAdminArea("Ahuachapán")
+ .setLocality("Ahuachapán")
+ .setAddressLine1("Some Street 12")
+ .build();
+
+ List<String> expected = new ArrayList<String>();
+ expected.add("Some Street 12");
+ expected.add("Ahuachapán");
+ expected.add("Ahuachapán");
+
+ List<String> real = formatInterpreter.getEnvelopeAddress(svAddress);
+ assertEquals(expected, real);
+
+ final AddressData svAddressWithPostCode = new AddressData.Builder(svAddress)
+ .setPostalCode("CP 2101")
+ .build();
+
+ expected = new ArrayList<String>();
+ expected.add("Some Street 12");
+ expected.add("CP 2101-Ahuachapán");
+ expected.add("Ahuachapán");
+
+ real = formatInterpreter.getEnvelopeAddress(svAddressWithPostCode);
+ assertEquals(expected, real);
+ }
}