Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2217)

Unified Diff: chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc

Issue 1283603002: Implement langageSettingsPrivate API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@LanguageSettingsAPIIDLChanges
Patch Set: stevenjb feedback Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
index ea03265a38f10b9956ef296fec17f35290b86010..696ef28a85ea41f2a114b8b93a4632b619722daa 100644
--- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
+++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
@@ -4,8 +4,31 @@
#include "chrome/browser/extensions/api/language_settings_private/language_settings_private_api.h"
+#include <map>
+#include <string>
+#include <unordered_set>
+#include <utility>
+#include <vector>
+
+#include "base/i18n/rtl.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/strings/string16.h"
+#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.h"
+#include "chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/spellchecker/spellcheck_factory.h"
+#include "chrome/browser/spellchecker/spellcheck_service.h"
+#include "chrome/browser/translate/chrome_translate_client.h"
+#include "chrome/browser/translate/translate_service.h"
#include "chrome/common/extensions/api/language_settings_private.h"
+#include "chrome/common/spellcheck_common.h"
+#include "components/translate/core/browser/translate_download_manager.h"
+#include "third_party/icu/source/i18n/unicode/coll.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/l10n_util_collator.h"
namespace extensions {
@@ -21,11 +44,88 @@ LanguageSettingsPrivateGetLanguageListFunction::
ExtensionFunction::ResponseAction
LanguageSettingsPrivateGetLanguageListFunction::Run() {
- return RespondNow(OneArgument(new base::ListValue()));
+ // Collect the language codes from the supported accept-languages.
+ const std::string app_locale = g_browser_process->GetApplicationLocale();
+ std::vector<std::string> language_codes;
+ l10n_util::GetAcceptLanguagesForLocale(app_locale, &language_codes);
+
+ // Map of display name -> {language code, native display name}.
+ typedef std::pair<std::string, base::string16> LanguagePair;
+ typedef std::map<base::string16, LanguagePair,
+ l10n_util::StringComparator<base::string16>> LanguageMap;
+
+ // Collator used to sort display names in the current locale.
+ UErrorCode error = U_ZERO_ERROR;
+ scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(
+ icu::Locale(app_locale.c_str()), error));
+ if (U_FAILURE(error))
+ collator.reset();
+ LanguageMap language_map(
+ l10n_util::StringComparator<base::string16>(collator.get()));
+
+ // Build the list of display names and the language map.
+ for (const auto& code : language_codes) {
+ base::string16 display_name = l10n_util::GetDisplayNameForLocale(
+ code, app_locale, false);
+ base::string16 native_display_name = l10n_util::GetDisplayNameForLocale(
+ code, code, false);
+ language_map[display_name] = std::make_pair(code, native_display_name);
+ }
+
+ // Get the list of available locales (display languages) and convert to a set.
+ const std::vector<std::string>& locales = l10n_util::GetAvailableLocales();
+ const std::unordered_set<std::string> locale_set(
+ locales.begin(), locales.end());
+
+ // Get the list of spell check languages and convert to a set.
+ std::vector<std::string> spellcheck_languages;
+ chrome::spellcheck_common::SpellCheckLanguages(&spellcheck_languages);
+ const std::unordered_set<std::string> spellcheck_language_set(
+ spellcheck_languages.begin(), spellcheck_languages.end());
+
+ // Get the list of translatable languages and convert to a set.
+ std::vector<std::string> translate_languages;
+ translate::TranslateDownloadManager::GetSupportedLanguages(
Seigo Nonaka 2015/08/11 18:48:35 Is this function called different from UI thread?
hajimehoshi 2015/08/12 05:34:48 I don't think this function is thread-safe.
michaelpg 2015/08/14 00:10:48 Could you elaborate on why not? language_options_
michaelpg 2015/08/14 00:10:49 This function is called on the UI thread (it's par
Seigo Nonaka 2015/08/14 00:18:47 Okay, I'm sorry I was not aware of UIThreadExtensi
+ &translate_languages);
+ const std::unordered_set<std::string> translate_language_set(
+ translate_languages.begin(), translate_languages.end());
+
+ // Build the language list from the language map.
+ scoped_ptr<base::ListValue> language_list(new base::ListValue);
+ for (const auto& entry : language_map) {
+ const base::string16& display_name = entry.first;
+ const LanguagePair& pair = entry.second;
+
+ language_settings_private::Language language;
+ language.code = pair.first;
+
+ base::string16 adjusted_display_name(display_name);
+ base::i18n::AdjustStringForLocaleDirection(&adjusted_display_name);
+ language.display_name = base::UTF16ToUTF8(adjusted_display_name);
+
+ base::string16 adjusted_native_display_name(pair.second);
+ base::i18n::AdjustStringForLocaleDirection(&adjusted_native_display_name);
+ language.native_display_name =
+ base::UTF16ToUTF8(adjusted_native_display_name);
+
+ // Set optional fields only if they differ from the default.
+ if (base::i18n::StringContainsStrongRTLChars(display_name))
+ language.display_name_rtl.reset(new bool(true));
+ if (locale_set.count(pair.first) > 0)
+ language.supports_ui.reset(new bool(true));
+ if (spellcheck_language_set.count(pair.first) > 0)
+ language.supports_spellcheck.reset(new bool(true));
+ if (translate_language_set.count(pair.first) > 0)
+ language.supports_translate.reset(new bool(true));
+
+ language_list->Append(language.ToValue());
+ }
+ return RespondNow(OneArgument(language_list.release()));
}
LanguageSettingsPrivateSetLanguageListFunction::
- LanguageSettingsPrivateSetLanguageListFunction() {
+ LanguageSettingsPrivateSetLanguageListFunction()
+ : chrome_details_(this) {
}
LanguageSettingsPrivateSetLanguageListFunction::
@@ -38,6 +138,11 @@ LanguageSettingsPrivateSetLanguageListFunction::Run() {
language_settings_private::SetLanguageList::Params::Create(*args_);
EXTENSION_FUNCTION_VALIDATE(parameters.get());
+ scoped_ptr<translate::TranslatePrefs> translate_prefs =
+ ChromeTranslateClient::CreateTranslatePrefs(
+ chrome_details_.GetProfile()->GetPrefs());
+ translate_prefs->UpdateLanguageList(parameters->language_codes);
+
return RespondNow(NoArguments());
}
@@ -51,7 +156,14 @@ LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction::
ExtensionFunction::ResponseAction
LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction::Run() {
- return RespondNow(OneArgument(new base::ListValue()));
+ LanguageSettingsPrivateDelegate* delegate =
+ LanguageSettingsPrivateDelegateFactory::GetForBrowserContext(
+ browser_context());
+
+ scoped_ptr<base::ListValue> return_list(new base::ListValue());
+ for (const auto& status : delegate->GetHunspellDictionaryStatuses())
+ return_list->Append(status->ToValue());
+ return RespondNow(OneArgument(return_list.release()));
}
LanguageSettingsPrivateGetSpellcheckWordsFunction::
@@ -64,11 +176,23 @@ LanguageSettingsPrivateGetSpellcheckWordsFunction::
ExtensionFunction::ResponseAction
LanguageSettingsPrivateGetSpellcheckWordsFunction::Run() {
- return RespondNow(OneArgument(new base::ListValue()));
+ SpellcheckService* service =
+ SpellcheckServiceFactory::GetForContext(browser_context());
+ SpellcheckCustomDictionary* dictionary = service->GetCustomDictionary();
+
+ scoped_ptr<base::ListValue> word_list(new base::ListValue());
+ // TODO(michaelpg): observe the dictionary and respond later if not loaded.
+ if (dictionary->IsLoaded()) {
+ const std::set<std::string>& words = dictionary->GetWords();
+ for (const std::string& word : words)
+ word_list->AppendString(word);
+ }
+ return RespondNow(OneArgument(word_list.release()));
}
LanguageSettingsPrivateGetTranslateTargetLanguageFunction::
- LanguageSettingsPrivateGetTranslateTargetLanguageFunction() {
+ LanguageSettingsPrivateGetTranslateTargetLanguageFunction()
+ : chrome_details_(this) {
}
LanguageSettingsPrivateGetTranslateTargetLanguageFunction::
@@ -77,7 +201,9 @@ LanguageSettingsPrivateGetTranslateTargetLanguageFunction::
ExtensionFunction::ResponseAction
LanguageSettingsPrivateGetTranslateTargetLanguageFunction::Run() {
- return RespondNow(OneArgument(new base::StringValue("")));
+ return RespondNow(OneArgument(new base::StringValue(
+ TranslateService::GetTargetLanguage(
+ chrome_details_.GetProfile()->GetPrefs()))));
}
LanguageSettingsPrivateGetInputMethodListsFunction::

Powered by Google App Engine
This is Rietveld 408576698