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:: |