[email protected] | 3f3a65f | 2014-01-09 19:05:05 | [diff] [blame] | 1 | // Copyright 2014 The Chromium Authors. All rights reserved. |
[email protected] | 0426103 | 2011-07-21 08:42:08 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. | ||||
4 | |||||
[email protected] | 3f3a65f | 2014-01-09 19:05:05 | [diff] [blame] | 5 | #include "components/language_usage_metrics/language_usage_metrics.h" |
[email protected] | 0426103 | 2011-07-21 08:42:08 | [diff] [blame] | 6 | |
7 | #include <algorithm> | ||||
8 | |||||
[email protected] | c2922ad | 2013-05-20 09:32:58 | [diff] [blame] | 9 | #include "base/metrics/sparse_histogram.h" |
[email protected] | f4ebe77 | 2013-02-02 00:21:39 | [diff] [blame] | 10 | #include "base/strings/string_tokenizer.h" |
[email protected] | f9b29436 | 2013-06-10 20:22:31 | [diff] [blame] | 11 | #include "base/strings/string_util.h" |
[email protected] | 0426103 | 2011-07-21 08:42:08 | [diff] [blame] | 12 | |
13 | namespace { | ||||
[email protected] | c2922ad | 2013-05-20 09:32:58 | [diff] [blame] | 14 | void RecordAcceptLanguage(int language_code) { |
15 | UMA_HISTOGRAM_SPARSE_SLOWLY("LanguageUsage.AcceptLanguage", | ||||
16 | language_code); | ||||
[email protected] | 0426103 | 2011-07-21 08:42:08 | [diff] [blame] | 17 | } |
18 | } // namespace | ||||
19 | |||||
[email protected] | 3f3a65f | 2014-01-09 19:05:05 | [diff] [blame] | 20 | namespace language_usage_metrics { |
21 | |||||
[email protected] | 0426103 | 2011-07-21 08:42:08 | [diff] [blame] | 22 | // static |
23 | void LanguageUsageMetrics::RecordAcceptLanguages( | ||||
24 | const std::string& accept_languages) { | ||||
[email protected] | c2922ad | 2013-05-20 09:32:58 | [diff] [blame] | 25 | std::set<int> languages; |
[email protected] | 0426103 | 2011-07-21 08:42:08 | [diff] [blame] | 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) { | ||||
[email protected] | c2922ad | 2013-05-20 09:32:58 | [diff] [blame] | 33 | const int language_code = ToLanguageCode(application_locale); |
34 | if (language_code != 0) | ||||
35 | UMA_HISTOGRAM_SPARSE_SLOWLY("LanguageUsage.ApplicationLanguage", | ||||
36 | language_code); | ||||
[email protected] | 0426103 | 2011-07-21 08:42:08 | [diff] [blame] | 37 | } |
38 | |||||
39 | // static | ||||
[email protected] | c2922ad | 2013-05-20 09:32:58 | [diff] [blame] | 40 | int LanguageUsageMetrics::ToLanguageCode(const std::string& locale) { |
[email protected] | f4ebe77 | 2013-02-02 00:21:39 | [diff] [blame] | 41 | base::StringTokenizer parts(locale, "-_"); |
[email protected] | c2922ad | 2013-05-20 09:32:58 | [diff] [blame] | 42 | if (!parts.GetNext()) |
43 | return 0; | ||||
44 | |||||
45 | std::string language_part = parts.token(); | ||||
[email protected] | cb1f4ac | 2014-08-07 16:55:42 | [diff] [blame] | 46 | base::StringToLowerASCII(&language_part); |
[email protected] | c2922ad | 2013-05-20 09:32:58 | [diff] [blame] | 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; | ||||
[email protected] | 0426103 | 2011-07-21 08:42:08 | [diff] [blame] | 57 | } |
[email protected] | c2922ad | 2013-05-20 09:32:58 | [diff] [blame] | 58 | |
59 | return language_code; | ||||
[email protected] | 0426103 | 2011-07-21 08:42:08 | [diff] [blame] | 60 | } |
[email protected] | af3de3c | 2013-05-29 11:26:48 | [diff] [blame] | 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 | } | ||||
[email protected] | 3f3a65f | 2014-01-09 19:05:05 | [diff] [blame] | 74 | |
75 | } // namespace language_usage_metrics |