Index: third_party/libaddressinput/chromium/cpp/src/address_ui.cc |
diff --git a/third_party/libaddressinput/chromium/cpp/src/address_ui.cc b/third_party/libaddressinput/chromium/cpp/src/address_ui.cc |
index c4eeb99c94e879914bd32ebd345747ca8b1c52b1..b3a4fb5892049394fa5b328f3f991e4f9f5056dc 100644 |
--- a/third_party/libaddressinput/chromium/cpp/src/address_ui.cc |
+++ b/third_party/libaddressinput/chromium/cpp/src/address_ui.cc |
@@ -17,12 +17,15 @@ |
#include <libaddressinput/address_field.h> |
#include <libaddressinput/address_ui_component.h> |
+#include <algorithm> |
+#include <cstddef> |
#include <set> |
#include <string> |
#include <vector> |
#include "grit.h" |
#include "grit/libaddressinput_strings.h" |
+#include "normalize_language_code.h" |
#include "region_data_constants.h" |
#include "rule.h" |
@@ -58,6 +61,54 @@ int GetMessageIdForField(AddressField field, |
} |
} |
+// Returns the BCP 47 language code that should be used to format the address |
+// that the user entered. |
+// |
+// If the rule does not contain information about languages, then returns the |
+// UI language. |
+// |
+// If the UI language is either the default language for the country, one of the |
+// languages for rules, or one of the languages for address input, then returns |
+// this UI language. If there're no matches, then picks one of the languages in |
+// the rule and returns it. |
+// |
+// If |using_latin_format| is true and the UI language does not match any |
+// languages in the rule, then appends "-latn" to the normalized version of the |
+// language for the rule. |
+std::string GetComponentsLanguageCode( |
+ const std::vector<std::string>& rule_languages, |
+ const std::vector<std::string>& input_languages, |
+ const std::string& norm_default_lang, |
Evan Stade
2014/03/21 23:44:54
ditto
please use gerrit instead
2014/03/22 01:34:30
How would I distinguish normalized UI language fro
Evan Stade
2014/03/24 19:04:15
maybe it's confusing because there's too many para
please use gerrit instead
2014/03/24 22:56:29
Made the function less confusing by passing in onl
|
+ const std::string& norm_ui_lang, |
+ const std::string& ui_lang, |
+ bool using_latin_format) { |
+ if (std::find(rule_languages.begin(), rule_languages.end(), norm_ui_lang) != |
+ rule_languages.end() || |
+ std::find(rule_languages.begin(), rule_languages.end(), ui_lang) != |
+ rule_languages.end() || |
+ std::find(input_languages.begin(), input_languages.end(), norm_ui_lang) != |
+ input_languages.end() || |
+ std::find(input_languages.begin(), input_languages.end(), ui_lang) != |
+ input_languages.end() || |
+ norm_default_lang == norm_ui_lang) { |
+ return ui_lang; |
+ } |
+ |
+ std::string rule_lang; |
+ if (!norm_default_lang.empty()) { |
+ rule_lang = norm_default_lang; |
+ } else if (!rule_languages.empty()) { |
+ rule_lang = rule_languages[0]; |
+ } else if (!input_languages.empty()) { |
+ rule_lang = input_languages[0]; |
+ } else { |
+ return ui_lang; |
+ } |
+ |
+ return using_latin_format ? NormalizeLanguageCode(rule_lang) + "-latn" |
+ : rule_lang; |
+} |
+ |
} // namespace |
const std::vector<std::string>& GetRegionCodes() { |
@@ -65,7 +116,9 @@ const std::vector<std::string>& GetRegionCodes() { |
} |
std::vector<AddressUiComponent> BuildComponents( |
- const std::string& region_code) { |
+ const std::string& region_code, |
+ const std::string& ui_language_code, |
+ std::string* components_language_code) { |
std::vector<AddressUiComponent> result; |
Rule rule; |
@@ -75,13 +128,28 @@ std::vector<AddressUiComponent> BuildComponents( |
return result; |
} |
+ std::string norm_ui_lang = NormalizeLanguageCode(ui_language_code); |
+ std::string norm_region_lang = NormalizeLanguageCode(rule.GetLanguage()); |
+ |
+ const std::vector<std::vector<FormatElement> >& latin_format = |
+ rule.GetLatinFormat(); |
+ bool use_latin_format = |
+ norm_ui_lang != norm_region_lang && !latin_format.empty(); |
+ const std::vector<std::vector<FormatElement> >& format = use_latin_format |
+ ? latin_format : rule.GetFormat(); |
+ if (components_language_code != NULL) { |
+ *components_language_code = GetComponentsLanguageCode( |
+ rule.GetLanguages(), rule.GetInputLanguages(), norm_region_lang, |
+ norm_ui_lang, ui_language_code, use_latin_format); |
+ } |
+ |
// For avoiding showing an input field twice, when the field is displayed |
// twice on an envelope. |
std::set<AddressField> fields; |
for (std::vector<std::vector<FormatElement> >::const_iterator |
- line_it = rule.GetFormat().begin(); |
- line_it != rule.GetFormat().end(); |
+ line_it = format.begin(); |
+ line_it != format.end(); |
++line_it) { |
int num_fields_this_row = 0; |
for (std::vector<FormatElement>::const_iterator element_it = |