blob: f55de7b219bba32717694a250e386e0906201a00 [file] [log] [blame] [edit]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/on_device_translation/translation_metrics.h"
#include <sstream>
#include "base/logging.h"
#include "base/metrics/histogram_functions.h"
#include "base/strings/strcat.h"
#include "chrome/browser/on_device_translation/language_pack_util.h"
namespace on_device_translation {
namespace {
constexpr int kLanguagePairOffset = 1000;
static_assert(static_cast<int>(SupportedLanguage::kMaxValue) <
kLanguagePairOffset);
std::string GetSourceUMANameForAPI(std::string_view api_name) {
return base::StrCat(
{"Translate.OnDeviceTranslation.", api_name, ".SourceLanguage"});
}
std::string GetTargetUMANameForAPI(std::string_view api_name) {
return base::StrCat(
{"Translate.OnDeviceTranslation.", api_name, ".TargetLanguage"});
}
std::string GetPairUMANameForAPI(std::string_view api_name) {
return base::StrCat(
{"Translate.OnDeviceTranslation.", api_name, ".LanguagePair"});
}
std::string GetCharacterCountUMAForSourceLanguage(
std::string_view source_lang) {
return base::StrCat({"Translate.OnDeviceTranslation.SourceLanguage.",
source_lang, ".CharacterCount"});
}
std::string GetCharacterCountUMAForTargetLanguage(
std::string_view target_lang) {
return base::StrCat({"Translate.OnDeviceTranslation.TargetLanguage.",
target_lang, ".CharacterCount"});
}
} // namespace
void RecordLanguageUma(std::string_view uma_name,
std::string_view language_code) {
std::optional<SupportedLanguage> code = ToSupportedLanguage(language_code);
if (code.has_value()) {
base::UmaHistogramEnumeration(uma_name, code.value());
}
}
void RecordLanguagePairUma(std::string_view uma_name,
std::string_view source_lang,
std::string_view target_lang) {
std::optional<SupportedLanguage> source_code =
ToSupportedLanguage(source_lang);
std::optional<SupportedLanguage> target_code =
ToSupportedLanguage(target_lang);
if (source_code.has_value() && target_code.has_value()) {
base::UmaHistogramSparse(
uma_name, static_cast<int>(source_code.value()) * kLanguagePairOffset +
static_cast<int>(target_code.value()));
}
}
void RecordTranslationAPICallForLanguagePair(std::string_view api_name,
std::string_view source_lang,
std::string_view target_lang) {
if (!ToSupportedLanguage(source_lang).has_value() ||
!ToSupportedLanguage(target_lang).has_value()) {
return;
}
RecordLanguageUma(GetSourceUMANameForAPI(api_name), source_lang);
RecordLanguageUma(GetTargetUMANameForAPI(api_name), target_lang);
RecordLanguagePairUma(GetPairUMANameForAPI(api_name), source_lang,
target_lang);
}
void RecordTranslationCharacterCount(std::string_view source_lang,
std::string_view target_lang,
int character_count) {
// The translate() API call requires the source and target language to be
// supported.
CHECK(ToSupportedLanguage(source_lang).has_value());
CHECK(ToSupportedLanguage(target_lang).has_value());
base::UmaHistogramCounts1M("Translate.OnDeviceTranslation.CharacterCount",
character_count);
base::UmaHistogramCounts1M(GetCharacterCountUMAForSourceLanguage(source_lang),
character_count);
base::UmaHistogramCounts1M(GetCharacterCountUMAForTargetLanguage(target_lang),
character_count);
}
} // namespace on_device_translation