Commit e8967abd authored by zork@chromium.org's avatar zork@chromium.org

Add UX for languages that don't have any associated input method

BUG=172195


Review URL: https://chromiumcodereview.appspot.com/13509006

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@193333 0039d316-1c4b-4281-b951-d872f2087c98
parent 8afb423a
......@@ -1992,6 +1992,10 @@ Press any key to continue exploring.
desc="The label for the section header for input methods">
Input Method
</message>
<message name="IDS_OPTIONS_SETTINGS_LANGUAGES_NO_INPUT_METHODS"
desc="The label for languages with no Input Methods">
This language doesn't have any input methods
</message>
<message name="IDS_OPTIONS_SETTINGS_LANGUAGES_SIGN_OUT_BUTTON"
desc="The label for the sign out button for changing UI language">
Sign out
......
......@@ -84,6 +84,9 @@
</div>
<div id="language-options-input-method-list"
class="language-options-contents">
<span id="language-options-input-method-none"
i18n-content="noInputMethods" hidden>
</span>
</div>
</if>
</div>
......
......@@ -385,6 +385,9 @@ cr.define('options', function() {
var languageCode = languageCodes[i];
var inputMethodIds = this.languageCodeToInputMethodIdsMap_[
languageCode];
if (!inputMethodIds)
continue;
// Check if we have active input methods associated with the language.
for (var j = 0; j < inputMethodIds.length; j++) {
var inputMethodId = inputMethodIds[j];
......@@ -579,6 +582,9 @@ cr.define('options', function() {
}
}
$('language-options-input-method-none').hidden =
(languageCode in this.languageCodeToInputMethodIdsMap_);
if (focusInputMethodId == 'add') {
$('language-options-add-button').focus();
}
......@@ -798,6 +804,11 @@ cr.define('options', function() {
// associated with the language code.
var enginesToBeRemovedSet = {};
var inputMethodIds = this.languageCodeToInputMethodIdsMap_[languageCode];
// If this language doesn't have any input methods, it can be deleted.
if (!inputMethodIds)
return true;
for (var i = 0; i < inputMethodIds.length; i++) {
enginesToBeRemovedSet[inputMethodIds[i]] = true;
}
......@@ -815,6 +826,9 @@ cr.define('options', function() {
// we don't remove this time.
var inputMethodIdsForAnotherLanguage =
this.languageCodeToInputMethodIdsMap_[languageCodes[i]];
if (!inputMethodIdsForAnotherLanguage)
continue;
for (var j = 0; j < inputMethodIdsForAnotherLanguage.length; j++) {
var inputMethodId = inputMethodIdsForAnotherLanguage[j];
if (inputMethodId in enginesToBeRemovedSet) {
......
......@@ -74,6 +74,9 @@ void CrosLanguageOptionsHandler::GetLocalizedValues(
localized_strings->SetString("extension_ime_description",
l10n_util::GetStringUTF16(
IDS_OPTIONS_SETTINGS_LANGUAGES_INPUT_METHOD_EXTENSION_DESCRIPTION));
localized_strings->SetString("noInputMethods",
l10n_util::GetStringUTF16(
IDS_OPTIONS_SETTINGS_LANGUAGES_NO_INPUT_METHODS));
input_method::InputMethodManager* manager =
input_method::GetInputMethodManager();
......@@ -141,6 +144,8 @@ ListValue* CrosLanguageOptionsHandler::GetInputMethodList(
ListValue* CrosLanguageOptionsHandler::GetLanguageList(
const input_method::InputMethodDescriptors& descriptors) {
const std::string app_locale = g_browser_process->GetApplicationLocale();
std::set<std::string> language_codes;
// Collect the language codes from the supported input methods.
for (size_t i = 0; i < descriptors.size(); ++i) {
......@@ -181,9 +186,28 @@ ListValue* CrosLanguageOptionsHandler::GetLanguageList(
}
DCHECK_EQ(display_names.size(), language_map.size());
// Collect the language codes from the supported accept-languages.
std::vector<std::string> accept_language_codes;
l10n_util::GetAcceptLanguagesForLocale(app_locale, &accept_language_codes);
// Build the list of display names, and build the language map.
for (size_t i = 0; i < accept_language_codes.size(); ++i) {
// Skip this language if it was already added.
if (language_codes.find(accept_language_codes[i]) != language_codes.end())
continue;
string16 display_name =
l10n_util::GetDisplayNameForLocale(
accept_language_codes[i], app_locale, false);
string16 native_display_name =
l10n_util::GetDisplayNameForLocale(
accept_language_codes[i], accept_language_codes[i], false);
display_names.push_back(display_name);
language_map[display_name] =
std::make_pair(accept_language_codes[i], native_display_name);
}
// Sort display names using locale specific sorter.
l10n_util::SortStrings16(g_browser_process->GetApplicationLocale(),
&display_names);
l10n_util::SortStrings16(app_locale, &display_names);
// Build the language list from the language map.
ListValue* language_list = new ListValue();
......
......@@ -112,100 +112,6 @@ TEST_F(LanguageOptionsHandlerTest, GetInputMethodList) {
// EXPECT_EQ("Japanese input method (for US keyboard)", display_name);
ASSERT_TRUE(language_code_set->HasKey("ja"));
}
TEST_F(LanguageOptionsHandlerTest, GetLanguageList) {
InputMethodDescriptors descriptors = CreateInputMethodDescriptors();
scoped_ptr<ListValue> list(
chromeos::options::CrosLanguageOptionsHandler::GetLanguageList(
descriptors));
ASSERT_EQ(9U, list->GetSize());
DictionaryValue* entry = NULL;
std::string language_code;
std::string display_name;
std::string native_display_name;
// As shown below, the list should be sorted by the display names,
// and these names should not have duplicates.
// This comes from kExtraLanguages.
ASSERT_TRUE(list->GetDictionary(0, &entry));
ASSERT_TRUE(entry->GetString("code", &language_code));
ASSERT_TRUE(entry->GetString("displayName", &display_name));
ASSERT_TRUE(entry->GetString("nativeDisplayName", &native_display_name));
EXPECT_EQ("nl", language_code);
EXPECT_EQ("Dutch", display_name);
EXPECT_EQ("Nederlands", native_display_name);
// This comes from kExtraLanguages.
ASSERT_TRUE(list->GetDictionary(1, &entry));
ASSERT_TRUE(entry->GetString("code", &language_code));
ASSERT_TRUE(entry->GetString("displayName", &display_name));
ASSERT_TRUE(entry->GetString("nativeDisplayName", &native_display_name));
EXPECT_EQ("en-AU", language_code);
EXPECT_EQ("English (Australia)", display_name);
EXPECT_EQ("English (Australia)", native_display_name);
ASSERT_TRUE(list->GetDictionary(2, &entry));
ASSERT_TRUE(entry->GetString("code", &language_code));
ASSERT_TRUE(entry->GetString("displayName", &display_name));
ASSERT_TRUE(entry->GetString("nativeDisplayName", &native_display_name));
EXPECT_EQ("en-US", language_code);
EXPECT_EQ("English (United States)", display_name);
EXPECT_EQ("English (United States)", native_display_name);
// This comes from kExtraLanguages.
ASSERT_TRUE(list->GetDictionary(3, &entry));
ASSERT_TRUE(entry->GetString("code", &language_code));
ASSERT_TRUE(entry->GetString("displayName", &display_name));
ASSERT_TRUE(entry->GetString("nativeDisplayName", &native_display_name));
EXPECT_EQ("fil", language_code);
EXPECT_EQ("Filipino", display_name);
EXPECT_EQ("Filipino", native_display_name);
ASSERT_TRUE(list->GetDictionary(4, &entry));
ASSERT_TRUE(entry->GetString("code", &language_code));
ASSERT_TRUE(entry->GetString("displayName", &display_name));
ASSERT_TRUE(entry->GetString("nativeDisplayName", &native_display_name));
EXPECT_EQ("fr", language_code);
EXPECT_EQ("French", display_name);
EXPECT_EQ("fran\u00E7ais", native_display_name);
// This comes from kExtraLanguages.
ASSERT_TRUE(list->GetDictionary(5, &entry));
ASSERT_TRUE(entry->GetString("code", &language_code));
ASSERT_TRUE(entry->GetString("displayName", &display_name));
ASSERT_TRUE(entry->GetString("nativeDisplayName", &native_display_name));
EXPECT_EQ("id", language_code);
EXPECT_EQ("Indonesian", display_name);
EXPECT_EQ("Bahasa Indonesia", native_display_name);
ASSERT_TRUE(list->GetDictionary(6, &entry));
ASSERT_TRUE(entry->GetString("code", &language_code));
ASSERT_TRUE(entry->GetString("displayName", &display_name));
ASSERT_TRUE(entry->GetString("nativeDisplayName", &native_display_name));
EXPECT_EQ("ja", language_code);
EXPECT_EQ("Japanese", display_name);
EXPECT_EQ("\u65E5\u672C\u8A9E", native_display_name);
// This comes from kExtraLanguages.
ASSERT_TRUE(list->GetDictionary(7, &entry));
ASSERT_TRUE(entry->GetString("code", &language_code));
ASSERT_TRUE(entry->GetString("displayName", &display_name));
ASSERT_TRUE(entry->GetString("nativeDisplayName", &native_display_name));
EXPECT_EQ("ms", language_code);
EXPECT_EQ("Malay", display_name);
EXPECT_EQ("Bahasa Melayu", native_display_name);
// This comes from kExtraLanguages.
ASSERT_TRUE(list->GetDictionary(8, &entry));
ASSERT_TRUE(entry->GetString("code", &language_code));
ASSERT_TRUE(entry->GetString("displayName", &display_name));
ASSERT_TRUE(entry->GetString("nativeDisplayName", &native_display_name));
EXPECT_EQ("es-419", language_code);
EXPECT_EQ("Spanish (Latin America)", display_name);
EXPECT_EQ("espa\u00F1ol (Latinoam\u00E9rica)", native_display_name);
}
#endif // defined(OS_CHROMEOS)
#if !defined(OS_MACOSX)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment