Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(427)

Unified Diff: third_party/libaddressinput/chromium/cpp/src/address_ui.cc

Issue 208243005: Determine language code and type of format for address. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 =

Powered by Google App Engine
This is Rietveld 408576698