Commit 7a6ede53 authored by Moe Ahmadi's avatar Moe Ahmadi Committed by Commit Bot

[IOS][Language] Language Settings - main page

Language Settings page features a list of user preferred languages sent in
the Accept-Language HTTP header. Users can add, delete, and reorder these
languages.

Language Settings page also features a switch to enable/disable translation.
If enabled, a trailing label appears for every language row indicating
whether or not translate is offered for that language. A disclosure
indicator is also added to every language row indicating this option can be
changed.

1. In edit mode, the "Translate" and "Add Language..." buttons are disabled.
2. Languages can be deleted by swiping gesture or the red delete button in
   edit mode.
3. The last Translate-blocked language cannot be deleted similar to other
   platforms.
4. Translate cannot be offered for the last Translate-blocked language;
   therefore the option to "Offer Translate" is disabled for it.
5. Translate cannot be offered for the target language (which may not
   appear in the list, e.g., the device language); therefore the option to
   "Offer Translate" is disabled for it.

Demo: https://drive.google.com/file/d/0B2sUCLY7X-D2enZRZE9hUmUwa0pjNkpYWHVFbzV6cEhDbUVr/view?usp=sharing

Bug: 957688
Change-Id: Icdf005e04d1716c42ea249229dbc7f39a043e46f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1595040Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Reviewed-by: default avatarPeter Lee <pkl@chromium.org>
Commit-Queue: Moe Ahmadi <mahmadi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#658758}
parent 44c5706d
...@@ -54,6 +54,8 @@ source_set("settings") { ...@@ -54,6 +54,8 @@ source_set("settings") {
"handoff_table_view_controller.mm", "handoff_table_view_controller.mm",
"import_data_table_view_controller.h", "import_data_table_view_controller.h",
"import_data_table_view_controller.mm", "import_data_table_view_controller.mm",
"language_settings_table_view_controller.h",
"language_settings_table_view_controller.mm",
"material_cell_catalog_view_controller.h", "material_cell_catalog_view_controller.h",
"material_cell_catalog_view_controller.mm", "material_cell_catalog_view_controller.mm",
"privacy_table_view_controller.h", "privacy_table_view_controller.h",
...@@ -82,6 +84,7 @@ source_set("settings") { ...@@ -82,6 +84,7 @@ source_set("settings") {
"resources:settings_content_settings", "resources:settings_content_settings",
"resources:settings_debug", "resources:settings_debug",
"resources:settings_error", "resources:settings_error",
"resources:settings_language_settings",
"resources:settings_passwords", "resources:settings_passwords",
"resources:settings_payment_methods", "resources:settings_payment_methods",
"resources:settings_privacy", "resources:settings_privacy",
...@@ -105,6 +108,8 @@ source_set("settings") { ...@@ -105,6 +108,8 @@ source_set("settings") {
"//components/history/core/browser", "//components/history/core/browser",
"//components/image_fetcher/ios", "//components/image_fetcher/ios",
"//components/keyed_service/core", "//components/keyed_service/core",
"//components/language/core/browser",
"//components/language/core/common",
"//components/metrics", "//components/metrics",
"//components/password_manager/core/browser", "//components/password_manager/core/browser",
"//components/password_manager/core/common", "//components/password_manager/core/common",
...@@ -130,6 +135,7 @@ source_set("settings") { ...@@ -130,6 +135,7 @@ source_set("settings") {
"//ios/chrome/browser/favicon", "//ios/chrome/browser/favicon",
"//ios/chrome/browser/feature_engagement", "//ios/chrome/browser/feature_engagement",
"//ios/chrome/browser/history", "//ios/chrome/browser/history",
"//ios/chrome/browser/language",
"//ios/chrome/browser/mailto:feature_flags", "//ios/chrome/browser/mailto:feature_flags",
"//ios/chrome/browser/passwords", "//ios/chrome/browser/passwords",
"//ios/chrome/browser/search_engines", "//ios/chrome/browser/search_engines",
......
...@@ -14,6 +14,8 @@ source_set("cells") { ...@@ -14,6 +14,8 @@ source_set("cells") {
"clear_browsing_data_item.mm", "clear_browsing_data_item.mm",
"copied_to_chrome_item.h", "copied_to_chrome_item.h",
"copied_to_chrome_item.mm", "copied_to_chrome_item.mm",
"language_item.h",
"language_item.mm",
"passphrase_error_item.h", "passphrase_error_item.h",
"passphrase_error_item.mm", "passphrase_error_item.mm",
"search_engine_item.h", "search_engine_item.h",
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_LANGUAGE_ITEM_H_
#define IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_LANGUAGE_ITEM_H_
#import "ios/chrome/browser/ui/table_view/cells/table_view_multi_detail_text_item.h"
// Contains the model data for a language in the Language Settings page.
@interface LanguageItem : TableViewMultiDetailTextItem
// The language code for this language.
@property(nonatomic, assign) std::string languageCode;
// Whether the language is Translate-blocked.
@property(nonatomic, getter=isBlocked) BOOL blocked;
@end
#endif // IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_LANGUAGE_ITEM_H_
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/ui/settings/cells/language_item.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@implementation LanguageItem
@end
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_LANGUAGE_SETTINGS_TABLE_VIEW_CONTROLLER_H_
#define IOS_CHROME_BROWSER_UI_SETTINGS_LANGUAGE_SETTINGS_TABLE_VIEW_CONTROLLER_H_
#import "ios/chrome/browser/ui/settings/settings_root_table_view_controller.h"
namespace ios {
class ChromeBrowserState;
} // namespace ios
// Controller for the UI that allows the user to change language settings such
// as user preferred languages.
@interface LanguageSettingsTableViewController : SettingsRootTableViewController
// The designated initializer. |browserState| must not be nil and is not
// retained.
- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState
NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithTableViewStyle:(UITableViewStyle)style
appBarStyle:
(ChromeTableViewControllerStyle)appBarStyle
NS_UNAVAILABLE;
@end
#endif // IOS_CHROME_BROWSER_UI_SETTINGS_LANGUAGE_SETTINGS_TABLE_VIEW_CONTROLLER_H_
...@@ -94,6 +94,14 @@ imageset("settings_debug") { ...@@ -94,6 +94,14 @@ imageset("settings_debug") {
] ]
} }
imageset("settings_language_settings") {
sources = [
"settings_language_settings.imageset/Contents.json",
"settings_language_settings.imageset/settings_language_settings@2x.png",
"settings_language_settings.imageset/settings_language_settings@3x.png",
]
}
imageset("settings_passwords") { imageset("settings_passwords") {
sources = [ sources = [
"settings_passwords.imageset/Contents.json", "settings_passwords.imageset/Contents.json",
......
{
"images": [
{
"idiom": "universal",
"scale": "2x",
"filename": "settings_language_settings@2x.png"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "settings_language_settings@3x.png"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
#import "ios/chrome/browser/ui/settings/content_settings_table_view_controller.h" #import "ios/chrome/browser/ui/settings/content_settings_table_view_controller.h"
#import "ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.h" #import "ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.h"
#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.h" #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.h"
#import "ios/chrome/browser/ui/settings/language_settings_table_view_controller.h"
#import "ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.h" #import "ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.h"
#import "ios/chrome/browser/ui/settings/password/passwords_table_view_controller.h" #import "ios/chrome/browser/ui/settings/password/passwords_table_view_controller.h"
#import "ios/chrome/browser/ui/settings/privacy_table_view_controller.h" #import "ios/chrome/browser/ui/settings/privacy_table_view_controller.h"
...@@ -109,6 +110,8 @@ NSString* const kSettingsAutofillCreditCardImageName = ...@@ -109,6 +110,8 @@ NSString* const kSettingsAutofillCreditCardImageName =
NSString* const kSettingsAutofillProfileImageName = @"settings_addresses"; NSString* const kSettingsAutofillProfileImageName = @"settings_addresses";
NSString* const kSettingsVoiceSearchImageName = @"settings_voice_search"; NSString* const kSettingsVoiceSearchImageName = @"settings_voice_search";
NSString* const kSettingsPrivacyImageName = @"settings_privacy"; NSString* const kSettingsPrivacyImageName = @"settings_privacy";
NSString* const kSettingsLanguageSettingsImageName =
@"settings_language_settings";
NSString* const kSettingsContentSettingsImageName = NSString* const kSettingsContentSettingsImageName =
@"settings_content_settings"; @"settings_content_settings";
NSString* const kSettingsBandwidthImageName = @"settings_bandwidth"; NSString* const kSettingsBandwidthImageName = @"settings_bandwidth";
...@@ -138,6 +141,7 @@ typedef NS_ENUM(NSInteger, ItemType) { ...@@ -138,6 +141,7 @@ typedef NS_ENUM(NSInteger, ItemType) {
ItemTypeAutofillProfile, ItemTypeAutofillProfile,
ItemTypeVoiceSearch, ItemTypeVoiceSearch,
ItemTypePrivacy, ItemTypePrivacy,
ItemTypeLanguageSettings,
ItemTypeContentSettings, ItemTypeContentSettings,
ItemTypeBandwidth, ItemTypeBandwidth,
ItemTypeAboutChrome, ItemTypeAboutChrome,
...@@ -442,6 +446,10 @@ void IdentityObserverBridge::OnPrimaryAccountCleared( ...@@ -442,6 +446,10 @@ void IdentityObserverBridge::OnPrimaryAccountCleared(
_articlesForYouItem = [self articlesForYouSwitchItem]; _articlesForYouItem = [self articlesForYouSwitchItem];
[model addItem:_articlesForYouItem [model addItem:_articlesForYouItem
toSectionWithIdentifier:SectionIdentifierAdvanced]; toSectionWithIdentifier:SectionIdentifierAdvanced];
if (base::FeatureList::IsEnabled(kLanguageSettings)) {
[model addItem:[self languageSettingsDetailItem]
toSectionWithIdentifier:SectionIdentifierAdvanced];
}
[model addItem:[self contentSettingsDetailItem] [model addItem:[self contentSettingsDetailItem]
toSectionWithIdentifier:SectionIdentifierAdvanced]; toSectionWithIdentifier:SectionIdentifierAdvanced];
[model addItem:[self bandwidthManagementDetailItem] [model addItem:[self bandwidthManagementDetailItem]
...@@ -620,6 +628,14 @@ void IdentityObserverBridge::OnPrimaryAccountCleared( ...@@ -620,6 +628,14 @@ void IdentityObserverBridge::OnPrimaryAccountCleared(
iconImageName:kSettingsPrivacyImageName]; iconImageName:kSettingsPrivacyImageName];
} }
- (TableViewItem*)languageSettingsDetailItem {
return [self
detailItemWithType:ItemTypeLanguageSettings
text:l10n_util::GetNSString(IDS_IOS_LANGUAGE_SETTINGS_TITLE)
detailText:nil
iconImageName:kSettingsLanguageSettingsImageName];
}
- (TableViewItem*)contentSettingsDetailItem { - (TableViewItem*)contentSettingsDetailItem {
return [self return [self
detailItemWithType:ItemTypeContentSettings detailItemWithType:ItemTypeContentSettings
...@@ -847,6 +863,10 @@ void IdentityObserverBridge::OnPrimaryAccountCleared( ...@@ -847,6 +863,10 @@ void IdentityObserverBridge::OnPrimaryAccountCleared(
controller = [[PrivacyTableViewController alloc] controller = [[PrivacyTableViewController alloc]
initWithBrowserState:_browserState]; initWithBrowserState:_browserState];
break; break;
case ItemTypeLanguageSettings:
controller = [[LanguageSettingsTableViewController alloc]
initWithBrowserState:_browserState];
break;
case ItemTypeContentSettings: case ItemTypeContentSettings:
controller = [[ContentSettingsTableViewController alloc] controller = [[ContentSettingsTableViewController alloc]
initWithBrowserState:_browserState]; initWithBrowserState:_browserState];
......
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