diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/address_ui.cc | 12 | ||||
-rw-r--r-- | cpp/src/region_data_constants.cc | 59 | ||||
-rw-r--r-- | cpp/src/rule.cc | 50 | ||||
-rw-r--r-- | cpp/src/rule.h | 16 | ||||
-rw-r--r-- | cpp/src/util/json.cc | 2 |
5 files changed, 109 insertions, 30 deletions
diff --git a/cpp/src/address_ui.cc b/cpp/src/address_ui.cc index 33f0797..5df8b3d 100644 --- a/cpp/src/address_ui.cc +++ b/cpp/src/address_ui.cc @@ -39,7 +39,9 @@ namespace { std::string GetLabelForField(const Localization& localization, AddressField field, int admin_area_name_message_id, - int postal_code_name_message_id) { + int postal_code_name_message_id, + int locality_name_message_id, + int sublocality_name_message_id) { int messageId; switch (field) { case SORTING_CODE: @@ -52,10 +54,10 @@ std::string GetLabelForField(const Localization& localization, messageId = admin_area_name_message_id; break; case LOCALITY: - messageId = IDS_LIBADDRESSINPUT_LOCALITY_LABEL; + messageId = locality_name_message_id; break; case DEPENDENT_LOCALITY: - messageId = IDS_LIBADDRESSINPUT_DISTRICT; + messageId = sublocality_name_message_id; break; case POSTAL_CODE: messageId = postal_code_name_message_id; @@ -132,7 +134,9 @@ std::vector<AddressUiComponent> BuildComponents( component.name = GetLabelForField(localization, format_it->GetField(), rule.GetAdminAreaNameMessageId(), - rule.GetPostalCodeNameMessageId()); + rule.GetPostalCodeNameMessageId(), + rule.GetLocalityNameMessageId(), + rule.GetSublocalityNameMessageId()); result.push_back(component); } diff --git a/cpp/src/region_data_constants.cc b/cpp/src/region_data_constants.cc index e21d4b8..c91e6f8 100644 --- a/cpp/src/region_data_constants.cc +++ b/cpp/src/region_data_constants.cc @@ -51,8 +51,6 @@ std::map<std::string, std::string> InitRegionData() { "\"languages\":\"ca\"" "}")); region_data.insert(std::make_pair("AE", "{" - "\"fmt\":\"%N%n%O%n%A%n%C\"," - "\"require\":\"AC\"," "\"languages\":\"ar\"" "}")); region_data.insert(std::make_pair("AF", "{" @@ -199,9 +197,10 @@ std::map<std::string, std::string> InitRegionData() { "\"languages\":\"es~qu~ay\"" "}")); region_data.insert(std::make_pair("BR", "{" - "\"fmt\":\"%O%n%N%n%A%n%C-%S%n%Z\"," + "\"fmt\":\"%O%n%N%n%A%n%D%n%C-%S%n%Z\"," "\"require\":\"ASCZ\"," "\"state_name_type\":\"state\"," + "\"sublocality_name_type\":\"neighborhood\"," "\"zipex\":\"40301-110,70002-900\"," "\"posturl\":\"http://www.correios.com.br/servicos/cep/cep_default.cfm\"," "\"languages\":\"pt\"" @@ -224,7 +223,7 @@ std::map<std::string, std::string> InitRegionData() { "}")); region_data.insert(std::make_pair("BY", "{" "\"fmt\":\"%S%n%Z %C %X%n%A%n%O%n%N\"," - "\"zipex\":\"20050,223016,225860,220050\"," + "\"zipex\":\"223016,225860,220050\"," "\"posturl\":\"http://zip.belpost.by\"," "\"languages\":\"be~ru\"" "}")); @@ -240,6 +239,7 @@ std::map<std::string, std::string> InitRegionData() { "}")); region_data.insert(std::make_pair("CC", "{" "\"fmt\":\"%O%n%N%n%A%n%C %S %Z\"," + "\"zipex\":\"6799\"," "\"languages\":\"en\"" "}")); region_data.insert(std::make_pair("CD", "{" @@ -264,7 +264,6 @@ std::map<std::string, std::string> InitRegionData() { "\"languages\":\"fr\"" "}")); region_data.insert(std::make_pair("CK", "{" - "\"fmt\":\"%N%n%O%n%A%n%C %Z\"," "\"languages\":\"en\"" "}")); region_data.insert(std::make_pair("CL", "{" @@ -281,6 +280,7 @@ std::map<std::string, std::string> InitRegionData() { "\"fmt\":\"%Z%n%S%C%D%n%A%n%O%n%N\"," "\"lfmt\":\"%N%n%O%n%A%n%D%n%C%n%S, %Z\"," "\"require\":\"ACSZ\"," + "\"sublocality_name_type\":\"district\"," "\"zipex\":\"266033,317204,100096,100808\"," "\"posturl\":\"http://www.cpdc.com.cn/postcdQueryAction.do\?reqCode=gotoQueryPostAddr\"," "\"languages\":\"zh-Hans\"" @@ -305,6 +305,7 @@ std::map<std::string, std::string> InitRegionData() { "}")); region_data.insert(std::make_pair("CX", "{" "\"fmt\":\"%O%n%N%n%A%n%C %S %Z\"," + "\"zipex\":\"6798\"," "\"languages\":\"en\"" "}")); region_data.insert(std::make_pair("CY", "{" @@ -351,12 +352,12 @@ std::map<std::string, std::string> InitRegionData() { "}")); region_data.insert(std::make_pair("EC", "{" "\"fmt\":\"%N%n%O%n%A%n%Z%n%C\"," - "\"zipex\":\"EC090112,090105,H0103C,P0133B,P0133A,P0133V\"," + "\"zipex\":\"090105,EC090112,H0103C,P0133B,P0133A,P0133V\"," "\"languages\":\"es\"" "}")); region_data.insert(std::make_pair("EE", "{" "\"fmt\":\"%N%n%O%n%A%n%Z %C\"," - "\"zipex\":\"69501,11212,1001\"," + "\"zipex\":\"69501,11212\"," "\"posturl\":\"http://www.post.ee/\?op=sihtnumbriotsing\"," "\"languages\":\"et\"" "}")); @@ -431,7 +432,8 @@ std::map<std::string, std::string> InitRegionData() { "\"fmt\":\"%N%n%O%n%A%n%C%n%S%n%Z\"," "\"require\":\"ACZ\"," "\"state_name_type\":\"county\"," - "\"zipex\":\"EC1Y 8SY,GIR 0AA,M2 5BQ,M34 4AB,CR0 2YR,DN16 9AA,W1A 4ZZ,EC1A 1HQ,OX14 4PG,BS18 8HF,NR25 7HG,RH6 OHP,BH23 6AA,B6 5BA,RH6 0HP,SO23 9AP,PO1 3AX,BFPO 61\"," + "\"locality_name_type\":\"post_town\"," + "\"zipex\":\"EC1Y 8SY,GIR 0AA,M2 5BQ,M34 4AB,CR0 2YR,DN16 9AA,W1A 4ZZ,EC1A 1HQ,OX14 4PG,BS18 8HF,NR25 7HG,RH6 0NP,BH23 6AA,B6 5BA,SO23 9AP,PO1 3AX,BFPO 61\"," "\"posturl\":\"http://www.royalmail.com/postcode-finder\"," "\"languages\":\"en\"" "}")); @@ -462,7 +464,7 @@ std::map<std::string, std::string> InitRegionData() { "\"languages\":\"en\"" "}")); region_data.insert(std::make_pair("GI", "{" - "\"fmt\":\"%N%n%O%n%A\"," + "\"fmt\":\"%N%n%O%n%A%nGIBRALTAR%n%Z\"," "\"require\":\"A\"," "\"zipex\":\"GX11 1AA\"," "\"languages\":\"en\"" @@ -527,19 +529,22 @@ std::map<std::string, std::string> InitRegionData() { "\"languages\":\"en\"" "}")); region_data.insert(std::make_pair("HK", "{" - "\"fmt\":\"%S%n%A%n%O%n%N\"," - "\"lfmt\":\"%N%n%O%n%A%n%S\"," + "\"fmt\":\"%S%n%C%n%A%n%O%n%N\"," + "\"lfmt\":\"%N%n%O%n%A%n%C%n%S\"," "\"require\":\"AS\"," "\"state_name_type\":\"area\"," + "\"locality_name_type\":\"district\"," "\"languages\":\"zh-Hant~en\"" "}")); region_data.insert(std::make_pair("HM", "{" "\"fmt\":\"%O%n%N%n%A%n%C %S %Z\"," + "\"zipex\":\"7050\"," "\"languages\":\"\"" "}")); region_data.insert(std::make_pair("HN", "{" "\"fmt\":\"%N%n%O%n%A%n%C, %S%n%Z\"," "\"require\":\"ACS\"," + "\"zipex\":\"31301\"," "\"languages\":\"es\"" "}")); region_data.insert(std::make_pair("HR", "{" @@ -600,6 +605,7 @@ std::map<std::string, std::string> InitRegionData() { region_data.insert(std::make_pair("IQ", "{" "\"fmt\":\"%O%n%N%n%A%n%C, %S%n%Z\"," "\"require\":\"ACS\"," + "\"zipex\":\"31001\"," "\"languages\":\"ar\"" "}")); region_data.insert(std::make_pair("IS", "{" @@ -676,6 +682,7 @@ std::map<std::string, std::string> InitRegionData() { "\"lfmt\":\"%N%n%O%n%A%n%D%n%C%n%S%n%Z\"," "\"require\":\"ACSZ\"," "\"state_name_type\":\"do_si\"," + "\"sublocality_name_type\":\"district\"," "\"zipex\":\"110-110,699-800\"," "\"posturl\":\"http://www.epost.go.kr/search/zipcode/search5.jsp\"," "\"languages\":\"ko\"" @@ -686,7 +693,7 @@ std::map<std::string, std::string> InitRegionData() { "\"languages\":\"ar\"" "}")); region_data.insert(std::make_pair("KY", "{" - "\"fmt\":\"%N%n%O%n%A%n%S\"," + "\"fmt\":\"%N%n%O%n%A%n%S %Z\"," "\"require\":\"AS\"," "\"state_name_type\":\"island\"," "\"zipex\":\"KY1-1100,KY1-1702,KY2-2101\"," @@ -864,20 +871,21 @@ std::map<std::string, std::string> InitRegionData() { "\"fmt\":\"%N%n%O%n%A%n%D%n%Z %C, %S\"," "\"require\":\"ACZ\"," "\"state_name_type\":\"state\"," + "\"sublocality_name_type\":\"neighborhood\"," "\"zipex\":\"02860,77520,06082\"," "\"posturl\":\"http://www.correosdemexico.gob.mx/ServiciosLinea/Paginas/ccpostales.aspx\"," "\"languages\":\"es\"" "}")); region_data.insert(std::make_pair("MY", "{" - "\"fmt\":\"%N%n%O%n%A%n%Z %C, %S\"," + "\"fmt\":\"%N%n%O%n%A%n%D%n%Z %C%n%S\"," "\"require\":\"ACZ\"," "\"state_name_type\":\"state\"," + "\"sublocality_name_type\":\"village_township\"," "\"zipex\":\"43000,50754,88990,50670\"," "\"posturl\":\"http://www.pos.com.my/pos/homepage.aspx\"," "\"languages\":\"ms\"" "}")); region_data.insert(std::make_pair("MZ", "{" - "\"fmt\":\"%N%n%O%n%A%n%C\"," "\"zipex\":\"1102,1119,3212\"," "\"languages\":\"pt\"" "}")); @@ -898,6 +906,7 @@ std::map<std::string, std::string> InitRegionData() { "}")); region_data.insert(std::make_pair("NF", "{" "\"fmt\":\"%O%n%N%n%A%n%C %S %Z\"," + "\"zipex\":\"2899\"," "\"languages\":\"en\"" "}")); region_data.insert(std::make_pair("NG", "{" @@ -944,7 +953,7 @@ std::map<std::string, std::string> InitRegionData() { "\"languages\":\"en~niu\"" "}")); region_data.insert(std::make_pair("NZ", "{" - "\"fmt\":\"%N%n%O%n%A%n%C %Z\"," + "\"fmt\":\"%N%n%O%n%A%n%D%n%C %Z\"," "\"require\":\"ACZ\"," "\"zipex\":\"6001,6015,6332,8252,1030\"," "\"posturl\":\"http://www.nzpost.co.nz/Cultures/en-NZ/OnlineTools/PostCodeFinder/\"," @@ -968,6 +977,7 @@ std::map<std::string, std::string> InitRegionData() { "\"fmt\":\"%N%n%O%n%A%n%Z %C %S\"," "\"require\":\"ACSZ\"," "\"state_name_type\":\"island\"," + "\"zipex\":\"98709\"," "\"languages\":\"fr~ty\"" "}")); region_data.insert(std::make_pair("PG", "{" @@ -977,7 +987,7 @@ std::map<std::string, std::string> InitRegionData() { "\"languages\":\"tpi~en~ho\"" "}")); region_data.insert(std::make_pair("PH", "{" - "\"fmt\":\"%N%n%O%n%A%n%Z %C%n%S\"," + "\"fmt\":\"%N%n%O%n%A%n%D, %C%n%Z %S\"," "\"zipex\":\"1008,1050,1135,1207,2000,1000\"," "\"posturl\":\"http://www.philpost.gov.ph/\"," "\"languages\":\"en\"" @@ -1217,6 +1227,7 @@ std::map<std::string, std::string> InitRegionData() { region_data.insert(std::make_pair("TR", "{" "\"fmt\":\"%N%n%O%n%A%n%Z %C/%S\"," "\"require\":\"ACZ\"," + "\"locality_name_type\":\"district\"," "\"zipex\":\"01960,06101\"," "\"posturl\":\"http://postakodu.ptt.gov.tr/\"," "\"languages\":\"tr\"" @@ -1248,7 +1259,7 @@ std::map<std::string, std::string> InitRegionData() { "\"state_name_type\":\"oblast\"," "\"zipex\":\"15432,01055,01001\"," "\"posturl\":\"http://services.ukrposhta.com/postindex_new/\"," - "\"languages\":\"uk~ru\"" + "\"languages\":\"uk\"" "}")); region_data.insert(std::make_pair("UG", "{" "\"languages\":\"sw~en\"" @@ -1301,6 +1312,7 @@ std::map<std::string, std::string> InitRegionData() { "\"languages\":\"es\"" "}")); region_data.insert(std::make_pair("VG", "{" + "\"fmt\":\"%N%n%O%n%A%n%C%n%Z\"," "\"require\":\"A\"," "\"zipex\":\"VG1110,VG1150,VG1160\"," "\"languages\":\"en\"" @@ -1315,9 +1327,8 @@ std::map<std::string, std::string> InitRegionData() { "\"languages\":\"en\"" "}")); region_data.insert(std::make_pair("VN", "{" - "\"fmt\":\"%N%n%O%n%A%n%C%n%S\"," - "\"lfmt\":\"%N%n%O%n%A%n%C%n%S\"," - "\"require\":\"AC\"," + "\"fmt\":\"%N%n%O%n%A%n%C%n%S %Z\"," + "\"lfmt\":\"%N%n%O%n%A%n%C%n%S %Z\"," "\"zipex\":\"119415,136065,720344\"," "\"posturl\":\"http://postcode.vnpost.vn/services/search.aspx\"," "\"languages\":\"vi\"" @@ -1340,7 +1351,6 @@ std::map<std::string, std::string> InitRegionData() { "\"languages\":\"sq~sr-Cyrl~sr-Latn\"" "}")); region_data.insert(std::make_pair("YE", "{" - "\"require\":\"AC\"," "\"languages\":\"ar\"" "}")); region_data.insert(std::make_pair("YT", "{" @@ -1350,7 +1360,7 @@ std::map<std::string, std::string> InitRegionData() { "\"languages\":\"fr\"" "}")); region_data.insert(std::make_pair("ZA", "{" - "\"fmt\":\"%N%n%O%n%A%n%C%n%Z\"," + "\"fmt\":\"%N%n%O%n%A%n%D%n%C%n%Z\"," "\"require\":\"ACZ\"," "\"zipex\":\"0083,1451,0001\"," "\"posturl\":\"http://www.postoffice.co.za/tools/postalcode.html\"," @@ -1358,7 +1368,6 @@ std::map<std::string, std::string> InitRegionData() { "}")); region_data.insert(std::make_pair("ZM", "{" "\"fmt\":\"%N%n%O%n%A%n%Z %C\"," - "\"require\":\"AC\"," "\"zipex\":\"50100,50101\"," "\"languages\":\"en\"" "}")); @@ -1377,7 +1386,9 @@ const std::string& RegionDataConstants::GetDefaultRegionData() { "\"fmt\":\"%N%n%O%n%A%n%C\"," "\"require\":\"AC\"," "\"zip_name_type\":\"postal\"," - "\"state_name_type\":\"province\"" + "\"state_name_type\":\"province\"," + "\"locality_name_type\":\"city\"," + "\"sublocality_name_type\":\"suburb\"" "}"); return kDefaultRegionData; } diff --git a/cpp/src/rule.cc b/cpp/src/rule.cc index 7ab84e5..12d1c78 100644 --- a/cpp/src/rule.cc +++ b/cpp/src/rule.cc @@ -91,6 +91,42 @@ const NameMessageIdMap& GetPostalCodeMessageIds() { return kPostalCodeMessageIds; } +NameMessageIdMap InitLocalityMessageIds() { + NameMessageIdMap message_ids; + message_ids.insert(std::make_pair( + "city", IDS_LIBADDRESSINPUT_LOCALITY_LABEL)); + message_ids.insert(std::make_pair( + "post_town", IDS_LIBADDRESSINPUT_POST_TOWN)); + message_ids.insert(std::make_pair( + "district", IDS_LIBADDRESSINPUT_DISTRICT)); + return message_ids; +} + +const NameMessageIdMap& GetLocalityMessageIds() { + static const NameMessageIdMap kLocalityMessageIds( + InitLocalityMessageIds()); + return kLocalityMessageIds; +} + +NameMessageIdMap InitSublocalityMessageIds() { + NameMessageIdMap message_ids; + message_ids.insert(std::make_pair( + "suburb", IDS_LIBADDRESSINPUT_SUBURB)); + message_ids.insert(std::make_pair( + "district", IDS_LIBADDRESSINPUT_DISTRICT)); + message_ids.insert(std::make_pair( + "neighborhood", IDS_LIBADDRESSINPUT_NEIGHBORHOOD)); + message_ids.insert(std::make_pair( + "village_township", IDS_LIBADDRESSINPUT_VILLAGE_TOWNSHIP)); + return message_ids; +} + +const NameMessageIdMap& GetSublocalityMessageIds() { + static const NameMessageIdMap kSublocalityMessageIds( + InitSublocalityMessageIds()); + return kSublocalityMessageIds; +} + int GetMessageIdFromName(const std::string& name, const NameMessageIdMap& message_ids) { NameMessageIdMap::const_iterator it = message_ids.find(name); @@ -118,6 +154,8 @@ Rule::Rule() sole_postal_code_(), admin_area_name_message_id_(INVALID_MESSAGE_ID), postal_code_name_message_id_(INVALID_MESSAGE_ID), + locality_name_message_id_(INVALID_MESSAGE_ID), + sublocality_name_message_id_(INVALID_MESSAGE_ID), name_(), latin_name_(), postal_code_example_(), @@ -153,6 +191,8 @@ void Rule::CopyFrom(const Rule& rule) { sole_postal_code_ = rule.sole_postal_code_; admin_area_name_message_id_ = rule.admin_area_name_message_id_; postal_code_name_message_id_ = rule.postal_code_name_message_id_; + locality_name_message_id_ = rule.locality_name_message_id_; + sublocality_name_message_id_ = rule.sublocality_name_message_id_; name_ = rule.name_; latin_name_ = rule.latin_name_; postal_code_example_ = rule.postal_code_example_; @@ -233,6 +273,16 @@ void Rule::ParseJsonRule(const Json& json) { GetMessageIdFromName(value, GetPostalCodeMessageIds()); } + if (json.GetStringValueForKey("locality_name_type", &value)) { + locality_name_message_id_ = + GetMessageIdFromName(value, GetLocalityMessageIds()); + } + + if (json.GetStringValueForKey("sublocality_name_type", &value)) { + sublocality_name_message_id_ = + GetMessageIdFromName(value, GetSublocalityMessageIds()); + } + if (json.GetStringValueForKey("name", &value)) { name_.swap(value); } diff --git a/cpp/src/rule.h b/cpp/src/rule.h index 1286bcb..87948df 100644 --- a/cpp/src/rule.h +++ b/cpp/src/rule.h @@ -15,7 +15,7 @@ // An object to store address metadata, describing the addressing rules for // regions and sub-regions. The address metadata format is documented here: // -// https://code.google.com/p/libaddressinput/wiki/AddressValidationMetadata +// https://github.com/googlei18n/libaddressinput/wiki/AddressValidationMetadata #ifndef I18N_ADDRESSINPUT_RULE_H_ #define I18N_ADDRESSINPUT_RULE_H_ @@ -110,6 +110,18 @@ class Rule { return postal_code_name_message_id_; } + // The message string identifier for locality name. If not set, then + // INVALID_MESSAGE_ID. + int GetLocalityNameMessageId() const { + return locality_name_message_id_; + } + + // The message string identifier for sublocality name. If not set, then + // INVALID_MESSAGE_ID. + int GetSublocalityNameMessageId() const { + return sublocality_name_message_id_; + } + // Returns the name for the most specific place described by this rule, if // there is one. This is typically set when it differs from the key. const std::string& GetName() const { return name_; } @@ -137,6 +149,8 @@ class Rule { std::string sole_postal_code_; int admin_area_name_message_id_; int postal_code_name_message_id_; + int locality_name_message_id_; + int sublocality_name_message_id_; std::string name_; std::string latin_name_; std::string postal_code_example_; diff --git a/cpp/src/util/json.cc b/cpp/src/util/json.cc index 730479c..9d30b66 100644 --- a/cpp/src/util/json.cc +++ b/cpp/src/util/json.cc @@ -68,7 +68,7 @@ class Json::JsonImpl { assert(value != NULL); Value::ConstMemberIterator member = value_->FindMember(key.c_str()); - if (member == NULL || !member->value.IsString()) { + if (member == value_->MemberEnd() || !member->value.IsString()) { return false; } |