autofill_country.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "components/autofill/core/browser/autofill_country.h"
6
7#include <stddef.h>
8#include <stdint.h>
9#include <map>
10#include <utility>
11
12#include "base/logging.h"
13#include "base/memory/scoped_ptr.h"
14#include "base/memory/singleton.h"
15#include "base/stl_util.h"
16#include "base/strings/string_util.h"
17#include "base/strings/utf_string_conversions.h"
18#include "grit/component_strings.h"
19#include "third_party/icu/source/common/unicode/locid.h"
20#include "third_party/icu/source/common/unicode/uloc.h"
21#include "third_party/icu/source/common/unicode/unistr.h"
22#include "third_party/icu/source/common/unicode/urename.h"
23#include "third_party/icu/source/common/unicode/utypes.h"
24#include "third_party/icu/source/i18n/unicode/coll.h"
25#include "third_party/icu/source/i18n/unicode/ucol.h"
26#include "ui/base/l10n/l10n_util.h"
27
28namespace autofill {
29namespace {
30
31// The maximum capacity needed to store a locale up to the country code.
32const size_t kLocaleCapacity =
33    ULOC_LANG_CAPACITY + ULOC_SCRIPT_CAPACITY + ULOC_COUNTRY_CAPACITY + 1;
34
35struct CountryData {
36  int postal_code_label_id;
37  int state_label_id;
38  AddressRequiredFields address_required_fields;
39};
40
41struct StaticCountryData {
42  char country_code[3];
43  CountryData country_data;
44};
45
46// Maps country codes to localized label string identifiers.
47const StaticCountryData kCountryData[] = {
48  { "AD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
49            IDS_AUTOFILL_FIELD_LABEL_PARISH,
50            ADDRESS_REQUIRES_STATE } },
51  { "AE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
52            IDS_AUTOFILL_FIELD_LABEL_EMIRATE,
53            ADDRESS_REQUIRES_STATE } },
54  { "AF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
55            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
56            ADDRESS_REQUIREMENTS_UNKNOWN } },
57  { "AG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
58            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
59            ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } },
60  { "AI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
61            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
62            ADDRESS_REQUIREMENTS_UNKNOWN } },
63  { "AL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
64            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
65            ADDRESS_REQUIREMENTS_UNKNOWN } },
66  { "AM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
67            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
68            ADDRESS_REQUIREMENTS_UNKNOWN } },
69  { "AN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
70            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
71            ADDRESS_REQUIREMENTS_UNKNOWN } },
72  { "AO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
73            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
74            ADDRESS_REQUIREMENTS_UNKNOWN } },
75  { "AQ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
76            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
77            ADDRESS_REQUIREMENTS_UNKNOWN } },
78  { "AR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
79            IDS_AUTOFILL_FIELD_LABEL_STATE,
80            ADDRESS_REQUIREMENTS_UNKNOWN } },
81  { "AS", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
82            IDS_AUTOFILL_FIELD_LABEL_STATE,
83            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
84  { "AT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
85            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
86            ADDRESS_REQUIRES_CITY_ZIP } },
87  { "AU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
88            IDS_AUTOFILL_FIELD_LABEL_STATE,
89            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
90  { "AW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
91            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
92            ADDRESS_REQUIREMENTS_UNKNOWN } },
93  { "AX", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
94            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
95            ADDRESS_REQUIRES_CITY_ZIP } },
96  { "AZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
97            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
98            ADDRESS_REQUIREMENTS_UNKNOWN } },
99  { "BA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
100            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
101            ADDRESS_REQUIREMENTS_UNKNOWN } },
102  { "BB", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
103            IDS_AUTOFILL_FIELD_LABEL_PARISH,
104            ADDRESS_REQUIREMENTS_UNKNOWN } },
105  { "BD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
106            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
107            ADDRESS_REQUIREMENTS_UNKNOWN } },
108  { "BE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
109            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
110            ADDRESS_REQUIRES_CITY_ZIP } },
111  { "BF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
112            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
113            ADDRESS_REQUIREMENTS_UNKNOWN } },
114  { "BG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
115            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
116            ADDRESS_REQUIREMENTS_UNKNOWN } },
117  { "BH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
118            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
119            ADDRESS_REQUIREMENTS_UNKNOWN } },
120  { "BI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
121            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
122            ADDRESS_REQUIREMENTS_UNKNOWN } },
123  { "BJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
124            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
125            ADDRESS_REQUIREMENTS_UNKNOWN } },
126  { "BL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
127            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
128            ADDRESS_REQUIRES_CITY_ZIP } },
129  { "BM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
130            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
131            ADDRESS_REQUIREMENTS_UNKNOWN } },
132  { "BN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
133            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
134            ADDRESS_REQUIREMENTS_UNKNOWN } },
135  { "BO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
136            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
137            ADDRESS_REQUIREMENTS_UNKNOWN } },
138  { "BR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
139            IDS_AUTOFILL_FIELD_LABEL_STATE,
140            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
141  { "BS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
142            IDS_AUTOFILL_FIELD_LABEL_ISLAND,
143            ADDRESS_REQUIREMENTS_UNKNOWN } },
144  { "BT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
145            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
146            ADDRESS_REQUIREMENTS_UNKNOWN } },
147  { "BV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
148            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
149            ADDRESS_REQUIREMENTS_UNKNOWN } },
150  { "BW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
151            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
152            ADDRESS_REQUIREMENTS_UNKNOWN } },
153  { "BY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
154            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
155            ADDRESS_REQUIREMENTS_UNKNOWN } },
156  { "BZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
157            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
158            ADDRESS_REQUIREMENTS_UNKNOWN } },
159  { "CA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
160            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
161            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
162  { "CC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
163            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
164            ADDRESS_REQUIREMENTS_UNKNOWN } },
165  { "CD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
166            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
167            ADDRESS_REQUIREMENTS_UNKNOWN } },
168  { "CF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
169            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
170            ADDRESS_REQUIREMENTS_UNKNOWN } },
171  { "CG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
172            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
173            ADDRESS_REQUIREMENTS_UNKNOWN } },
174  { "CH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
175            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
176            ADDRESS_REQUIRES_CITY_ZIP } },
177  { "CI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
178            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
179            ADDRESS_REQUIREMENTS_UNKNOWN } },
180  { "CK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
181            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
182            ADDRESS_REQUIREMENTS_UNKNOWN } },
183  { "CL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
184            IDS_AUTOFILL_FIELD_LABEL_STATE,
185            ADDRESS_REQUIREMENTS_UNKNOWN } },
186  { "CM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
187            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
188            ADDRESS_REQUIREMENTS_UNKNOWN } },
189  { "CN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
190            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
191            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
192  { "CO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
193            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
194            ADDRESS_REQUIREMENTS_UNKNOWN } },
195  { "CR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
196            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
197            ADDRESS_REQUIREMENTS_UNKNOWN } },
198  { "CS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
199            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
200            ADDRESS_REQUIREMENTS_UNKNOWN } },
201  { "CV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
202            IDS_AUTOFILL_FIELD_LABEL_ISLAND,
203            ADDRESS_REQUIREMENTS_UNKNOWN } },
204  { "CX", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
205            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
206            ADDRESS_REQUIREMENTS_UNKNOWN } },
207  { "CY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
208            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
209            ADDRESS_REQUIREMENTS_UNKNOWN } },
210  { "CZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
211            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
212            ADDRESS_REQUIREMENTS_UNKNOWN } },
213  { "DE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
214            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
215            ADDRESS_REQUIRES_CITY_ZIP } },
216  { "DJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
217            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
218            ADDRESS_REQUIREMENTS_UNKNOWN } },
219  { "DK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
220            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
221            ADDRESS_REQUIRES_CITY_ZIP } },
222  { "DM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
223            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
224            ADDRESS_REQUIREMENTS_UNKNOWN } },
225  { "DO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
226            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
227            ADDRESS_REQUIREMENTS_UNKNOWN } },
228  { "DZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
229            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
230            ADDRESS_REQUIREMENTS_UNKNOWN } },
231  { "EC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
232            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
233            ADDRESS_REQUIREMENTS_UNKNOWN } },
234  { "EE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
235            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
236            ADDRESS_REQUIREMENTS_UNKNOWN } },
237  { "EG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
238            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
239            ADDRESS_REQUIREMENTS_UNKNOWN } },
240  { "EH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
241            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
242            ADDRESS_REQUIREMENTS_UNKNOWN } },
243  { "ER", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
244            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
245            ADDRESS_REQUIREMENTS_UNKNOWN } },
246  { "ES", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
247            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
248            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
249  { "ET", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
250            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
251            ADDRESS_REQUIREMENTS_UNKNOWN } },
252  { "FI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
253            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
254            ADDRESS_REQUIRES_CITY_ZIP } },
255  { "FJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
256            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
257            ADDRESS_REQUIREMENTS_UNKNOWN } },
258  { "FK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
259            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
260            ADDRESS_REQUIRES_CITY_ZIP } },
261  { "FM", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
262            IDS_AUTOFILL_FIELD_LABEL_STATE,
263            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
264  { "FO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
265            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
266            ADDRESS_REQUIREMENTS_UNKNOWN } },
267  { "FR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
268            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
269            ADDRESS_REQUIRES_CITY_ZIP } },
270  { "GA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
271            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
272            ADDRESS_REQUIREMENTS_UNKNOWN } },
273  { "GB", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
274            IDS_AUTOFILL_FIELD_LABEL_COUNTY,
275            ADDRESS_REQUIRES_CITY_ZIP } },
276  { "GD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
277            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
278            ADDRESS_REQUIREMENTS_UNKNOWN } },
279  { "GE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
280            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
281            ADDRESS_REQUIREMENTS_UNKNOWN } },
282  { "GF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
283            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
284            ADDRESS_REQUIRES_CITY_ZIP } },
285  { "GG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
286            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
287            ADDRESS_REQUIRES_CITY_ZIP } },
288  { "GH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
289            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
290            ADDRESS_REQUIREMENTS_UNKNOWN } },
291  { "GI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
292            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
293            ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } },
294  { "GL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
295            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
296            ADDRESS_REQUIRES_CITY_ZIP } },
297  { "GM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
298            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
299            ADDRESS_REQUIREMENTS_UNKNOWN } },
300  { "GN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
301            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
302            ADDRESS_REQUIREMENTS_UNKNOWN } },
303  { "GP", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
304            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
305            ADDRESS_REQUIRES_CITY_ZIP } },
306  { "GQ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
307            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
308            ADDRESS_REQUIREMENTS_UNKNOWN } },
309  { "GR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
310            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
311            ADDRESS_REQUIRES_CITY_ZIP } },
312  { "GS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
313            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
314            ADDRESS_REQUIRES_CITY_ZIP } },
315  { "GT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
316            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
317            ADDRESS_REQUIREMENTS_UNKNOWN } },
318  { "GU", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
319            IDS_AUTOFILL_FIELD_LABEL_STATE,
320            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
321  { "GW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
322            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
323            ADDRESS_REQUIREMENTS_UNKNOWN } },
324  { "GY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
325            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
326            ADDRESS_REQUIREMENTS_UNKNOWN } },
327  { "HK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
328            IDS_AUTOFILL_FIELD_LABEL_AREA,
329            ADDRESS_REQUIRES_STATE } },
330  { "HM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
331            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
332            ADDRESS_REQUIREMENTS_UNKNOWN } },
333  { "HN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
334            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
335            ADDRESS_REQUIRES_CITY_STATE } },
336  { "HR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
337            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
338            ADDRESS_REQUIREMENTS_UNKNOWN } },
339  { "HT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
340            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
341            ADDRESS_REQUIREMENTS_UNKNOWN } },
342  { "HU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
343            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
344            ADDRESS_REQUIREMENTS_UNKNOWN } },
345  { "ID", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
346            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
347            ADDRESS_REQUIREMENTS_UNKNOWN } },
348  { "IE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
349            IDS_AUTOFILL_FIELD_LABEL_COUNTY,
350            ADDRESS_REQUIREMENTS_UNKNOWN } },
351  { "IL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
352            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
353            ADDRESS_REQUIREMENTS_UNKNOWN } },
354  { "IM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
355            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
356            ADDRESS_REQUIRES_CITY_ZIP } },
357  { "IN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
358            IDS_AUTOFILL_FIELD_LABEL_STATE,
359            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
360  { "IO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
361            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
362            ADDRESS_REQUIRES_CITY_ZIP } },
363  { "IQ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
364            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
365            ADDRESS_REQUIRES_CITY_STATE } },
366  { "IS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
367            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
368            ADDRESS_REQUIREMENTS_UNKNOWN } },
369  { "IT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
370            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
371            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
372  { "JE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
373            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
374            ADDRESS_REQUIRES_CITY_ZIP } },
375  { "JM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
376            IDS_AUTOFILL_FIELD_LABEL_PARISH,
377            ADDRESS_REQUIRES_CITY_STATE } },
378  { "JO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
379            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
380            ADDRESS_REQUIREMENTS_UNKNOWN } },
381  { "JP", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
382            IDS_AUTOFILL_FIELD_LABEL_PREFECTURE,
383            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
384  { "KE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
385            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
386            ADDRESS_REQUIREMENTS_UNKNOWN } },
387  { "KG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
388            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
389            ADDRESS_REQUIREMENTS_UNKNOWN } },
390  { "KH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
391            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
392            ADDRESS_REQUIREMENTS_UNKNOWN } },
393  { "KI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
394            IDS_AUTOFILL_FIELD_LABEL_ISLAND,
395            ADDRESS_REQUIREMENTS_UNKNOWN } },
396  { "KM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
397            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
398            ADDRESS_REQUIREMENTS_UNKNOWN } },
399  { "KN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
400            IDS_AUTOFILL_FIELD_LABEL_ISLAND,
401            ADDRESS_REQUIRES_CITY_STATE } },
402  { "KP", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
403            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
404            ADDRESS_REQUIREMENTS_UNKNOWN } },
405  { "KR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
406            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
407            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
408  { "KW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
409            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
410            ADDRESS_REQUIREMENTS_UNKNOWN } },
411  { "KY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
412            IDS_AUTOFILL_FIELD_LABEL_ISLAND,
413            ADDRESS_REQUIRES_STATE } },
414  { "KZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
415            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
416            ADDRESS_REQUIREMENTS_UNKNOWN } },
417  { "LA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
418            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
419            ADDRESS_REQUIREMENTS_UNKNOWN } },
420  { "LB", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
421            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
422            ADDRESS_REQUIREMENTS_UNKNOWN } },
423  { "LC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
424            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
425            ADDRESS_REQUIREMENTS_UNKNOWN } },
426  { "LI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
427            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
428            ADDRESS_REQUIRES_CITY_ZIP } },
429  { "LK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
430            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
431            ADDRESS_REQUIREMENTS_UNKNOWN } },
432  { "LR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
433            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
434            ADDRESS_REQUIREMENTS_UNKNOWN } },
435  { "LS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
436            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
437            ADDRESS_REQUIREMENTS_UNKNOWN } },
438  { "LT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
439            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
440            ADDRESS_REQUIREMENTS_UNKNOWN } },
441  { "LU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
442            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
443            ADDRESS_REQUIRES_CITY_ZIP } },
444  { "LV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
445            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
446            ADDRESS_REQUIREMENTS_UNKNOWN } },
447  { "LY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
448            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
449            ADDRESS_REQUIREMENTS_UNKNOWN } },
450  { "MA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
451            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
452            ADDRESS_REQUIREMENTS_UNKNOWN } },
453  { "MC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
454            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
455            ADDRESS_REQUIREMENTS_UNKNOWN } },
456  { "MD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
457            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
458            ADDRESS_REQUIREMENTS_UNKNOWN } },
459  { "ME", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
460            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
461            ADDRESS_REQUIREMENTS_UNKNOWN } },
462  { "MF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
463            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
464            ADDRESS_REQUIRES_CITY_ZIP } },
465  { "MG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
466            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
467            ADDRESS_REQUIREMENTS_UNKNOWN } },
468  { "MH", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
469            IDS_AUTOFILL_FIELD_LABEL_STATE,
470            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
471  { "MK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
472            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
473            ADDRESS_REQUIREMENTS_UNKNOWN } },
474  { "ML", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
475            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
476            ADDRESS_REQUIREMENTS_UNKNOWN } },
477  { "MN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
478            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
479            ADDRESS_REQUIREMENTS_UNKNOWN } },
480  { "MO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
481            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
482            ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } },
483  { "MP", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
484            IDS_AUTOFILL_FIELD_LABEL_STATE,
485            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
486  { "MQ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
487            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
488            ADDRESS_REQUIRES_CITY_ZIP } },
489  { "MR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
490            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
491            ADDRESS_REQUIREMENTS_UNKNOWN } },
492  { "MS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
493            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
494            ADDRESS_REQUIREMENTS_UNKNOWN } },
495  { "MT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
496            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
497            ADDRESS_REQUIREMENTS_UNKNOWN } },
498  { "MU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
499            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
500            ADDRESS_REQUIREMENTS_UNKNOWN } },
501  { "MV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
502            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
503            ADDRESS_REQUIREMENTS_UNKNOWN } },
504  { "MW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
505            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
506            ADDRESS_REQUIREMENTS_UNKNOWN } },
507  { "MX", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
508            IDS_AUTOFILL_FIELD_LABEL_STATE,
509            ADDRESS_REQUIRES_CITY_ZIP } },
510  { "MY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
511            IDS_AUTOFILL_FIELD_LABEL_STATE,
512            ADDRESS_REQUIRES_CITY_ZIP } },
513  { "MZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
514            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
515            ADDRESS_REQUIREMENTS_UNKNOWN } },
516  { "NA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
517            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
518            ADDRESS_REQUIREMENTS_UNKNOWN } },
519  { "NC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
520            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
521            ADDRESS_REQUIRES_CITY_ZIP } },
522  { "NE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
523            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
524            ADDRESS_REQUIREMENTS_UNKNOWN } },
525  { "NF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
526            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
527            ADDRESS_REQUIREMENTS_UNKNOWN } },
528  { "NG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
529            IDS_AUTOFILL_FIELD_LABEL_STATE,
530            ADDRESS_REQUIREMENTS_UNKNOWN } },
531  { "NI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
532            IDS_AUTOFILL_FIELD_LABEL_DEPARTMENT,
533            ADDRESS_REQUIREMENTS_UNKNOWN } },
534  { "NL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
535            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
536            ADDRESS_REQUIRES_CITY_ZIP } },
537  { "NO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
538            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
539            ADDRESS_REQUIRES_CITY_ZIP } },
540  { "NP", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
541            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
542            ADDRESS_REQUIREMENTS_UNKNOWN } },
543  { "NR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
544            IDS_AUTOFILL_FIELD_LABEL_DISTRICT,
545            ADDRESS_REQUIRES_STATE } },
546  { "NU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
547            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
548            ADDRESS_REQUIREMENTS_UNKNOWN } },
549  { "NZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
550            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
551            ADDRESS_REQUIRES_CITY_ZIP } },
552  { "OM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
553            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
554            ADDRESS_REQUIREMENTS_UNKNOWN } },
555  { "PA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
556            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
557            ADDRESS_REQUIREMENTS_UNKNOWN } },
558  { "PE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
559            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
560            ADDRESS_REQUIREMENTS_UNKNOWN } },
561  { "PF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
562            IDS_AUTOFILL_FIELD_LABEL_ISLAND,
563            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
564  { "PG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
565            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
566            ADDRESS_REQUIRES_CITY_STATE } },
567  { "PH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
568            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
569            ADDRESS_REQUIRES_CITY } },
570  { "PK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
571            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
572            ADDRESS_REQUIREMENTS_UNKNOWN } },
573  { "PL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
574            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
575            ADDRESS_REQUIRES_CITY_ZIP } },
576  { "PM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
577            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
578            ADDRESS_REQUIRES_CITY_ZIP } },
579  { "PN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
580            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
581            ADDRESS_REQUIRES_CITY_ZIP } },
582  { "PR", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
583            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
584            ADDRESS_REQUIRES_CITY_ZIP } },
585  { "PS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
586            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
587            ADDRESS_REQUIREMENTS_UNKNOWN } },
588  { "PT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
589            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
590            ADDRESS_REQUIRES_CITY_ZIP } },
591  { "PW", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
592            IDS_AUTOFILL_FIELD_LABEL_STATE,
593            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
594  { "PY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
595            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
596            ADDRESS_REQUIREMENTS_UNKNOWN } },
597  { "QA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
598            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
599            ADDRESS_REQUIREMENTS_UNKNOWN } },
600  { "RE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
601            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
602            ADDRESS_REQUIRES_CITY_ZIP } },
603  { "RO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
604            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
605            ADDRESS_REQUIREMENTS_UNKNOWN } },
606  { "RS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
607            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
608            ADDRESS_REQUIREMENTS_UNKNOWN } },
609  { "RU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
610            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
611            ADDRESS_REQUIRES_CITY_ZIP } },
612  { "RW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
613            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
614            ADDRESS_REQUIREMENTS_UNKNOWN } },
615  { "SA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
616            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
617            ADDRESS_REQUIREMENTS_UNKNOWN } },
618  { "SB", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
619            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
620            ADDRESS_REQUIREMENTS_UNKNOWN } },
621  { "SC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
622            IDS_AUTOFILL_FIELD_LABEL_ISLAND,
623            ADDRESS_REQUIREMENTS_UNKNOWN } },
624  { "SE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
625            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
626            ADDRESS_REQUIRES_CITY_ZIP } },
627  { "SG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
628            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
629            ADDRESS_REQUIRES_ZIP } },
630  { "SH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
631            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
632            ADDRESS_REQUIRES_CITY_ZIP } },
633  { "SI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
634            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
635            ADDRESS_REQUIREMENTS_UNKNOWN } },
636  { "SJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
637            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
638            ADDRESS_REQUIRES_CITY_ZIP } },
639  { "SK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
640            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
641            ADDRESS_REQUIREMENTS_UNKNOWN } },
642  { "SL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
643            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
644            ADDRESS_REQUIREMENTS_UNKNOWN } },
645  { "SM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
646            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
647            ADDRESS_REQUIRES_ZIP } },
648  { "SN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
649            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
650            ADDRESS_REQUIREMENTS_UNKNOWN } },
651  { "SO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
652            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
653            ADDRESS_REQUIRES_CITY_STATE } },
654  { "SR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
655            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
656            ADDRESS_REQUIREMENTS_UNKNOWN } },
657  { "ST", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
658            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
659            ADDRESS_REQUIREMENTS_UNKNOWN } },
660  { "SV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
661            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
662            ADDRESS_REQUIRES_CITY_STATE } },
663  { "SZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
664            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
665            ADDRESS_REQUIREMENTS_UNKNOWN } },
666  { "TC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
667            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
668            ADDRESS_REQUIRES_CITY_ZIP } },
669  { "TD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
670            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
671            ADDRESS_REQUIREMENTS_UNKNOWN } },
672  { "TF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
673            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
674            ADDRESS_REQUIREMENTS_UNKNOWN } },
675  { "TG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
676            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
677            ADDRESS_REQUIREMENTS_UNKNOWN } },
678  { "TH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
679            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
680            ADDRESS_REQUIREMENTS_UNKNOWN } },
681  { "TJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
682            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
683            ADDRESS_REQUIREMENTS_UNKNOWN } },
684  { "TK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
685            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
686            ADDRESS_REQUIREMENTS_UNKNOWN } },
687  { "TL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
688            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
689            ADDRESS_REQUIREMENTS_UNKNOWN } },
690  { "TM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
691            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
692            ADDRESS_REQUIREMENTS_UNKNOWN } },
693  { "TN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
694            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
695            ADDRESS_REQUIREMENTS_UNKNOWN } },
696  { "TO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
697            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
698            ADDRESS_REQUIREMENTS_UNKNOWN } },
699  { "TR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
700            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
701            ADDRESS_REQUIRES_CITY_ZIP } },
702  { "TT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
703            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
704            ADDRESS_REQUIREMENTS_UNKNOWN } },
705  { "TV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
706            IDS_AUTOFILL_FIELD_LABEL_ISLAND,
707            ADDRESS_REQUIREMENTS_UNKNOWN } },
708  { "TW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
709            IDS_AUTOFILL_FIELD_LABEL_COUNTY,
710            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
711  { "TZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
712            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
713            ADDRESS_REQUIREMENTS_UNKNOWN } },
714  { "UA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
715            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
716            ADDRESS_REQUIREMENTS_UNKNOWN } },
717  { "UG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
718            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
719            ADDRESS_REQUIREMENTS_UNKNOWN } },
720  { "UM", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
721            IDS_AUTOFILL_FIELD_LABEL_STATE,
722            ADDRESS_REQUIRES_CITY_STATE } },
723  { "US", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
724            IDS_AUTOFILL_FIELD_LABEL_STATE,
725            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
726  { "UY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
727            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
728            ADDRESS_REQUIREMENTS_UNKNOWN } },
729  { "UZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
730            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
731            ADDRESS_REQUIREMENTS_UNKNOWN } },
732  { "VA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
733            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
734            ADDRESS_REQUIREMENTS_UNKNOWN } },
735  { "VC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
736            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
737            ADDRESS_REQUIREMENTS_UNKNOWN } },
738  { "VE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
739            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
740            ADDRESS_REQUIRES_CITY_STATE } },
741  { "VG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
742            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
743            ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } },
744  { "VI", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
745            IDS_AUTOFILL_FIELD_LABEL_STATE,
746            ADDRESS_REQUIRES_CITY_STATE_ZIP } },
747  { "VN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
748            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
749            ADDRESS_REQUIRES_CITY } },
750  { "VU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
751            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
752            ADDRESS_REQUIREMENTS_UNKNOWN } },
753  { "WF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
754            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
755            ADDRESS_REQUIRES_CITY_ZIP } },
756  { "WS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
757            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
758            ADDRESS_REQUIREMENTS_UNKNOWN } },
759  { "YE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
760            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
761            ADDRESS_REQUIRES_CITY } },
762  { "YT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
763            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
764            ADDRESS_REQUIRES_CITY_ZIP } },
765  { "ZA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
766            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
767            ADDRESS_REQUIRES_CITY_ZIP } },
768  { "ZM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
769            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
770            ADDRESS_REQUIRES_CITY } },
771  { "ZW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
772            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
773            ADDRESS_REQUIREMENTS_UNKNOWN } },
774};
775
776// A singleton class that encapsulates a map from country codes to country data.
777class CountryDataMap {
778 public:
779  // A const iterator over the wrapped map data.
780  typedef std::map<std::string, CountryData>::const_iterator Iterator;
781
782  static CountryDataMap* GetInstance();
783  static const Iterator Begin();
784  static const Iterator End();
785  static const Iterator Find(const std::string& country_code);
786
787 private:
788  CountryDataMap();
789  friend struct DefaultSingletonTraits<CountryDataMap>;
790
791  std::map<std::string, CountryData> country_data_;
792
793  DISALLOW_COPY_AND_ASSIGN(CountryDataMap);
794};
795
796// static
797CountryDataMap* CountryDataMap::GetInstance() {
798  return Singleton<CountryDataMap>::get();
799}
800
801CountryDataMap::CountryDataMap() {
802  // Add all the countries we have explicit data for.
803  for (size_t i = 0; i < arraysize(kCountryData); ++i) {
804    const StaticCountryData& static_data = kCountryData[i];
805    country_data_.insert(std::make_pair(static_data.country_code,
806                                        static_data.country_data));
807  }
808
809  // Add any other countries that ICU knows about, falling back to default data
810  // values.
811  for (const char* const* country_pointer = icu::Locale::getISOCountries();
812       *country_pointer;
813       ++country_pointer) {
814    std::string country_code = *country_pointer;
815    if (!country_data_.count(country_code)) {
816      CountryData data = {
817        IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
818        IDS_AUTOFILL_FIELD_LABEL_PROVINCE
819      };
820      country_data_.insert(std::make_pair(country_code, data));
821    }
822  }
823}
824
825const CountryDataMap::Iterator CountryDataMap::Begin() {
826  return GetInstance()->country_data_.begin();
827}
828
829const CountryDataMap::Iterator CountryDataMap::End() {
830  return GetInstance()->country_data_.end();
831}
832
833const CountryDataMap::Iterator CountryDataMap::Find(
834    const std::string& country_code) {
835  return GetInstance()->country_data_.find(country_code);
836}
837
838// A singleton class that encapsulates mappings from country names to their
839// corresponding country codes.
840class CountryNames {
841 public:
842  static CountryNames* GetInstance();
843
844  // Returns the country code corresponding to |country|, which should be a
845  // country code or country name localized to |locale|.
846  const std::string GetCountryCode(const base::string16& country,
847                                   const std::string& locale);
848
849 private:
850  CountryNames();
851  ~CountryNames();
852  friend struct DefaultSingletonTraits<CountryNames>;
853
854  // Populates |locales_to_localized_names_| with the mapping of country names
855  // localized to |locale| to their corresponding country codes.
856  void AddLocalizedNamesForLocale(const std::string& locale);
857
858  // Interprets |country_name| as a full country name localized to the given
859  // |locale| and returns the corresponding country code stored in
860  // |locales_to_localized_names_|, or an empty string if there is none.
861  const std::string GetCountryCodeForLocalizedName(
862      const base::string16& country_name,
863      const std::string& locale);
864
865  // Returns an ICU collator -- i.e. string comparator -- appropriate for the
866  // given |locale|.
867  icu::Collator* GetCollatorForLocale(const std::string& locale);
868
869  // Returns the ICU sort key corresponding to |str| for the given |collator|.
870  // Uses |buffer| as temporary storage, and might resize |buffer| as a side-
871  // effect. |buffer_size| should specify the |buffer|'s size, and is updated if
872  // the |buffer| is resized.
873  const std::string GetSortKey(const icu::Collator& collator,
874                               const base::string16& str,
875                               scoped_ptr<uint8_t[]>* buffer,
876                               int32_t* buffer_size) const;
877
878  // Maps from common country names, including 2- and 3-letter country codes,
879  // to the corresponding 2-letter country codes. The keys are uppercase ASCII
880  // strings.
881  std::map<std::string, std::string> common_names_;
882
883  // The outer map keys are ICU locale identifiers.
884  // The inner maps map from localized country names to their corresponding
885  // country codes. The inner map keys are ICU collation sort keys corresponding
886  // to the target localized country name.
887  std::map<std::string, std::map<std::string, std::string> >
888      locales_to_localized_names_;
889
890  // Maps ICU locale names to their corresponding collators.
891  std::map<std::string, icu::Collator*> collators_;
892
893  DISALLOW_COPY_AND_ASSIGN(CountryNames);
894};
895
896// static
897CountryNames* CountryNames::GetInstance() {
898  return Singleton<CountryNames>::get();
899}
900
901CountryNames::CountryNames() {
902  // Add 2- and 3-letter ISO country codes.
903  for (CountryDataMap::Iterator it = CountryDataMap::Begin();
904       it != CountryDataMap::End();
905       ++it) {
906    const std::string& country_code = it->first;
907    std::string iso3_country_code =
908        icu::Locale(NULL, country_code.c_str()).getISO3Country();
909
910    common_names_.insert(std::make_pair(country_code, country_code));
911    common_names_.insert(std::make_pair(iso3_country_code, country_code));
912  }
913
914  // Add a few other common synonyms.
915  common_names_.insert(std::make_pair("UNITED STATES OF AMERICA", "US"));
916  common_names_.insert(std::make_pair("U.S.A.", "US"));
917  common_names_.insert(std::make_pair("GREAT BRITAIN", "GB"));
918  common_names_.insert(std::make_pair("UK", "GB"));
919  common_names_.insert(std::make_pair("BRASIL", "BR"));
920  common_names_.insert(std::make_pair("DEUTSCHLAND", "DE"));
921}
922
923CountryNames::~CountryNames() {
924  STLDeleteContainerPairSecondPointers(collators_.begin(),
925                                       collators_.end());
926}
927
928const std::string CountryNames::GetCountryCode(const base::string16& country,
929                                               const std::string& locale) {
930  // First, check common country names, including 2- and 3-letter country codes.
931  std::string country_utf8 = base::UTF16ToUTF8(StringToUpperASCII(country));
932  std::map<std::string, std::string>::const_iterator result =
933      common_names_.find(country_utf8);
934  if (result != common_names_.end())
935    return result->second;
936
937  // Next, check country names localized to |locale|.
938  std::string country_code = GetCountryCodeForLocalizedName(country, locale);
939  if (!country_code.empty())
940    return country_code;
941
942  // Finally, check country names localized to US English.
943  return GetCountryCodeForLocalizedName(country, "en_US");
944}
945
946void CountryNames::AddLocalizedNamesForLocale(const std::string& locale) {
947  // Nothing to do if we've previously added the localized names for the given
948  // |locale|.
949  if (locales_to_localized_names_.count(locale))
950    return;
951
952  std::map<std::string, std::string> localized_names;
953  const icu::Collator* collator = GetCollatorForLocale(locale);
954  int32_t buffer_size = 1000;
955  scoped_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
956
957  for (CountryDataMap::Iterator it = CountryDataMap::Begin();
958       it != CountryDataMap::End();
959       ++it) {
960    const std::string& country_code = it->first;
961    base::string16 country_name = l10n_util::GetDisplayNameForCountry(
962        country_code, locale);
963    std::string sort_key = GetSortKey(*collator,
964                                      country_name,
965                                      &buffer,
966                                      &buffer_size);
967
968    localized_names.insert(std::make_pair(sort_key, country_code));
969  }
970
971  locales_to_localized_names_.insert(std::make_pair(locale, localized_names));
972}
973
974const std::string CountryNames::GetCountryCodeForLocalizedName(
975    const base::string16& country_name,
976    const std::string& locale) {
977  AddLocalizedNamesForLocale(locale);
978
979  icu::Collator* collator = GetCollatorForLocale(locale);
980
981  // As recommended[1] by ICU, initialize the buffer size to four times the
982  // source string length.
983  // [1] http://userguide.icu-project.org/collation/api#TOC-Examples
984  int32_t buffer_size = country_name.size() * 4;
985  scoped_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
986  std::string sort_key = GetSortKey(*collator,
987                                    country_name,
988                                    &buffer,
989                                    &buffer_size);
990
991  const std::map<std::string, std::string>& localized_names =
992      locales_to_localized_names_[locale];
993  std::map<std::string, std::string>::const_iterator result =
994      localized_names.find(sort_key);
995
996  if (result != localized_names.end())
997    return result->second;
998
999  return std::string();
1000}
1001
1002icu::Collator* CountryNames::GetCollatorForLocale(const std::string& locale) {
1003  if (!collators_.count(locale)) {
1004    icu::Locale icu_locale(locale.c_str());
1005    UErrorCode ignored = U_ZERO_ERROR;
1006    icu::Collator* collator(icu::Collator::createInstance(icu_locale, ignored));
1007
1008    // Compare case-insensitively and ignoring punctuation.
1009    ignored = U_ZERO_ERROR;
1010    collator->setAttribute(UCOL_STRENGTH, UCOL_SECONDARY, ignored);
1011    ignored = U_ZERO_ERROR;
1012    collator->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, ignored);
1013
1014    collators_.insert(std::make_pair(locale, collator));
1015  }
1016
1017  return collators_[locale];
1018}
1019
1020const std::string CountryNames::GetSortKey(const icu::Collator& collator,
1021                                           const base::string16& str,
1022                                           scoped_ptr<uint8_t[]>* buffer,
1023                                           int32_t* buffer_size) const {
1024  DCHECK(buffer);
1025  DCHECK(buffer_size);
1026
1027  icu::UnicodeString icu_str(str.c_str(), str.length());
1028  int32_t expected_size = collator.getSortKey(icu_str, buffer->get(),
1029                                              *buffer_size);
1030  if (expected_size > *buffer_size) {
1031    // If there wasn't enough space, grow the buffer and try again.
1032    *buffer_size = expected_size;
1033    buffer->reset(new uint8_t[*buffer_size]);
1034    DCHECK(buffer->get());
1035
1036    expected_size = collator.getSortKey(icu_str, buffer->get(), *buffer_size);
1037    DCHECK_EQ(*buffer_size, expected_size);
1038  }
1039
1040  return std::string(reinterpret_cast<const char*>(buffer->get()));
1041}
1042
1043}  // namespace
1044
1045AutofillCountry::AutofillCountry(const std::string& country_code,
1046                                 const std::string& locale) {
1047  const CountryDataMap::Iterator result = CountryDataMap::Find(country_code);
1048  DCHECK(result != CountryDataMap::End());
1049  const CountryData& data = result->second;
1050
1051  country_code_ = country_code;
1052  name_ = l10n_util::GetDisplayNameForCountry(country_code, locale);
1053  postal_code_label_ = l10n_util::GetStringUTF16(data.postal_code_label_id);
1054  state_label_ = l10n_util::GetStringUTF16(data.state_label_id);
1055  address_required_fields_ = data.address_required_fields;
1056}
1057
1058AutofillCountry::~AutofillCountry() {
1059}
1060
1061// static
1062void AutofillCountry::GetAvailableCountries(
1063    std::vector<std::string>* country_codes) {
1064  DCHECK(country_codes);
1065
1066  for (CountryDataMap::Iterator it = CountryDataMap::Begin();
1067       it != CountryDataMap::End();
1068       ++it) {
1069    country_codes->push_back(it->first);
1070  }
1071}
1072
1073// static
1074const std::string AutofillCountry::CountryCodeForLocale(
1075    const std::string& locale) {
1076  // Add likely subtags to the locale. In particular, add any likely country
1077  // subtags -- e.g. for locales like "ru" that only include the language.
1078  std::string likely_locale;
1079  UErrorCode error_ignored = U_ZERO_ERROR;
1080  uloc_addLikelySubtags(locale.c_str(),
1081                        WriteInto(&likely_locale, kLocaleCapacity),
1082                        kLocaleCapacity,
1083                        &error_ignored);
1084
1085  // Extract the country code.
1086  std::string country_code = icu::Locale(likely_locale.c_str()).getCountry();
1087
1088  // Default to the United States if we have no better guess.
1089  if (CountryDataMap::Find(country_code) == CountryDataMap::End())
1090    return "US";
1091
1092  return country_code;
1093}
1094
1095// static
1096const std::string AutofillCountry::GetCountryCode(const base::string16& country,
1097                                                  const std::string& locale) {
1098  return CountryNames::GetInstance()->GetCountryCode(country, locale);
1099}
1100
1101AutofillCountry::AutofillCountry(const std::string& country_code,
1102                                 const base::string16& name,
1103                                 const base::string16& postal_code_label,
1104                                 const base::string16& state_label)
1105    : country_code_(country_code),
1106      name_(name),
1107      postal_code_label_(postal_code_label),
1108      state_label_(state_label) {
1109}
1110
1111}  // namespace autofill
1112