15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef COMPONENTS_LANGUAGE_USAGE_METRICS_LANGUAGE_USAGE_METRICS_H_ 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define COMPONENTS_LANGUAGE_USAGE_METRICS_LANGUAGE_USAGE_METRICS_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/basictypes.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace language_usage_metrics { 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Methods to record language usage as UMA histograms. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LanguageUsageMetrics { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Records accept languages as a UMA histogram. |accept_languages| is a 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // case-insensitive comma-separated list of languages/locales of either xx, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // xx-YY, or xx_YY format where xx is iso-639 language code and YY is iso-3166 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // country code. Country code is ignored. That is, xx and XX-YY are considered 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // identical and recorded once. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void RecordAcceptLanguages(const std::string& accept_languages); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Records the application language as a UMA histogram. |application_locale| 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is a case-insensitive locale string of either xx, xx-YY, or xx_YY format. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only the language part (xx in the example) is considered. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void RecordApplicationLanguage(const std::string& application_locale); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Parses |locale| and returns the language code. Returns 0 in case of errors. 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The language code is calculated from two alphabets. For example, if 3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |locale| is 'en' which represents 'English', the codes of 'e' and 'n' are 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // 101 and 110 respectively, and the language code will be 101 * 256 + 100 = 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // 25966. 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |locale| should consist of only lower-case letters. This function doesn't 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // check whether |locale| is valid locale or not strictly. 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static int ToLanguageCode(const std::string &locale); 3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_IMPLICIT_CONSTRUCTORS(LanguageUsageMetrics); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parses |accept_languages| and returns a set of language codes in 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |languages|. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ParseAcceptLanguages(const std::string& accept_languages, 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::set<int>* languages); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(LanguageUsageMetricsTest, ParseAcceptLanguages); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace language_usage_metrics 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // COMPONENTS_LANGUAGE_USAGE_METRICS_LANGUAGE_USAGE_METRICS_H_ 54