Index: chrome/browser/language_usage_metrics.cc |
diff --git a/chrome/browser/language_usage_metrics.cc b/chrome/browser/language_usage_metrics.cc |
new file mode 100755 |
index 0000000000000000000000000000000000000000..b53c25f88a5e7bc2477f45c9f4c43c729360e0e8 |
--- /dev/null |
+++ b/chrome/browser/language_usage_metrics.cc |
@@ -0,0 +1,67 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/language_usage_metrics.h" |
+ |
+#include <algorithm> |
+ |
+#include "base/metrics/histogram.h" |
+#include "base/string_tokenizer.h" |
+#include "base/string_util.h" |
+ |
+namespace { |
+void RecordAcceptLanguage(Language language) { |
+ UMA_HISTOGRAM_ENUMERATION("LanguageUsageMetrics.AcceptLanguage", |
+ language, NUM_LANGUAGES); |
+} |
+} // namespace |
+ |
+// static |
+void LanguageUsageMetrics::RecordAcceptLanguages( |
+ const std::string& accept_languages) { |
+ // Rethink about the histogram memory costs when the number of languages |
+ // becomes too large. |
+ DCHECK_LE(NUM_LANGUAGES, 300); |
+ |
+ std::set<Language> languages; |
+ ParseAcceptLanguages(accept_languages, &languages); |
+ std::for_each(languages.begin(), languages.end(), RecordAcceptLanguage); |
+} |
+ |
+// static |
+void LanguageUsageMetrics::RecordApplicationLanguage( |
+ const std::string& application_locale) { |
+ const Language language = ToLanguage(application_locale); |
+ if (language != UNKNOWN_LANGUAGE) { |
+ UMA_HISTOGRAM_ENUMERATION("LanguageUsageMetrics.ApplicationLanguage", |
+ language, NUM_LANGUAGES); |
+ } |
+} |
+ |
+// static |
+void LanguageUsageMetrics::ParseAcceptLanguages( |
+ const std::string& accept_languages, std::set<Language>* languages) { |
+ languages->clear(); |
+ StringTokenizer locales(accept_languages, ","); |
+ while (locales.GetNext()) { |
+ const Language language = ToLanguage(locales.token()); |
+ if (language != UNKNOWN_LANGUAGE) { |
+ languages->insert(language); |
+ } |
+ } |
+} |
+ |
+// static |
+Language LanguageUsageMetrics::ToLanguage(const std::string& locale) { |
+ StringTokenizer parts(locale, "-_"); |
+ if (!parts.GetNext()) { |
+ return UNKNOWN_LANGUAGE; |
+ } |
+ const std::string language_part = parts.token(); |
+ Language language; |
+ if (!LanguageFromCode(language_part.c_str(), &language)) { |
+ return UNKNOWN_LANGUAGE; |
+ } |
+ return language; |
+} |