Home | History | Annotate | Download | only in language_usage_metrics
      1 // Copyright 2014 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/language_usage_metrics/language_usage_metrics.h"
      6 
      7 #include <algorithm>
      8 
      9 #include "base/metrics/sparse_histogram.h"
     10 #include "base/strings/string_tokenizer.h"
     11 #include "base/strings/string_util.h"
     12 
     13 namespace {
     14 void RecordAcceptLanguage(int language_code) {
     15   UMA_HISTOGRAM_SPARSE_SLOWLY("LanguageUsage.AcceptLanguage",
     16                               language_code);
     17 }
     18 }  // namespace
     19 
     20 namespace language_usage_metrics {
     21 
     22 // static
     23 void LanguageUsageMetrics::RecordAcceptLanguages(
     24     const std::string& accept_languages) {
     25   std::set<int> languages;
     26   ParseAcceptLanguages(accept_languages, &languages);
     27   std::for_each(languages.begin(), languages.end(), RecordAcceptLanguage);
     28 }
     29 
     30 // static
     31 void LanguageUsageMetrics::RecordApplicationLanguage(
     32     const std::string& application_locale) {
     33   const int language_code = ToLanguageCode(application_locale);
     34   if (language_code != 0)
     35     UMA_HISTOGRAM_SPARSE_SLOWLY("LanguageUsage.ApplicationLanguage",
     36                                 language_code);
     37 }
     38 
     39 // static
     40 int LanguageUsageMetrics::ToLanguageCode(const std::string& locale) {
     41   base::StringTokenizer parts(locale, "-_");
     42   if (!parts.GetNext())
     43     return 0;
     44 
     45   std::string language_part = parts.token();
     46   base::StringToLowerASCII(&language_part);
     47 
     48   int language_code = 0;
     49   for (std::string::iterator it = language_part.begin();
     50        it != language_part.end(); ++it) {
     51     char ch = *it;
     52     if (ch < 'a' || 'z' < ch)
     53       return 0;
     54 
     55     language_code <<= 8;
     56     language_code += ch;
     57   }
     58 
     59   return language_code;
     60 }
     61 
     62 // static
     63 void LanguageUsageMetrics::ParseAcceptLanguages(
     64     const std::string& accept_languages,
     65     std::set<int>* languages) {
     66   languages->clear();
     67   base::StringTokenizer locales(accept_languages, ",");
     68   while (locales.GetNext()) {
     69     const int language_code = ToLanguageCode(locales.token());
     70     if (language_code != 0)
     71       languages->insert(language_code);
     72   }
     73 }
     74 
     75 }  // namespace language_usage_metrics
     76