1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.h"
6 
7 #include "ash/public/cpp/ash_features.h"
8 #include "ash/public/mojom/assistant_state_controller.mojom.h"
9 #include "base/command_line.h"
10 #include "base/feature_list.h"
11 #include "base/i18n/number_formatting.h"
12 #include "base/no_destructor.h"
13 #include "base/strings/strcat.h"
14 #include "base/strings/string_number_conversions.h"
15 #include "base/strings/stringprintf.h"
16 #include "base/strings/utf_string_conversions.h"
17 #include "base/system/sys_info.h"
18 #include "build/branding_buildflags.h"
19 #include "build/build_config.h"
20 #include "build/buildflag.h"
21 #include "chrome/browser/browser_process.h"
22 #include "chrome/browser/browser_process_platform_part.h"
23 #include "chrome/browser/chromeos/account_manager/account_manager_util.h"
24 #include "chrome/browser/chromeos/arc/arc_util.h"
25 #include "chrome/browser/chromeos/assistant/assistant_util.h"
26 #include "chrome/browser/chromeos/crostini/crostini_features.h"
27 #include "chrome/browser/chromeos/crostini/crostini_util.h"
28 #include "chrome/browser/chromeos/kerberos/kerberos_credentials_manager.h"
29 #include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h"
30 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
31 #include "chrome/browser/chromeos/profiles/profile_helper.h"
32 #include "chrome/browser/policy/profile_policy_connector.h"
33 #include "chrome/browser/profiles/profile.h"
34 #include "chrome/browser/supervised_user/supervised_user_service.h"
35 #include "chrome/browser/supervised_user/supervised_user_service_factory.h"
36 #include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h"
37 #include "chrome/browser/ui/webui/chromeos/bluetooth_dialog_localized_strings_provider.h"
38 #include "chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.h"
39 #include "chrome/browser/ui/webui/chromeos/smb_shares/smb_shares_localized_strings_provider.h"
40 #include "chrome/browser/ui/webui/management_ui.h"
41 #include "chrome/browser/ui/webui/policy_indicator_localized_strings_provider.h"
42 #include "chrome/browser/ui/webui/settings/chromeos/internet_strings_provider.h"
43 #include "chrome/browser/ui/webui/settings/chromeos/search/search_concept.h"
44 #include "chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h"
45 #include "chrome/browser/ui/webui/webui_util.h"
46 #include "chrome/common/chrome_features.h"
47 #include "chrome/common/pref_names.h"
48 #include "chrome/common/url_constants.h"
49 #include "chrome/common/webui_url_constants.h"
50 #include "chrome/grit/chromium_strings.h"
51 #include "chrome/grit/generated_resources.h"
52 #include "chrome/grit/locale_settings.h"
53 #include "chrome/services/local_search_service/public/mojom/types.mojom.h"
54 #include "chromeos/constants/chromeos_features.h"
55 #include "chromeos/constants/chromeos_switches.h"
56 #include "chromeos/services/assistant/public/features.h"
57 #include "chromeos/services/multidevice_setup/public/cpp/url_provider.h"
58 #include "chromeos/strings/grit/chromeos_strings.h"
59 #include "components/google/core/common/google_util.h"
60 #include "components/prefs/pref_service.h"
61 #include "components/strings/grit/components_strings.h"
62 #include "components/version_ui/version_ui_constants.h"
63 #include "content/public/browser/web_ui_data_source.h"
64 #include "content/public/common/content_features.h"
65 #include "content/public/common/content_switches.h"
66 #include "device/bluetooth/strings/grit/bluetooth_strings.h"
67 #include "media/base/media_switches.h"
68 #include "ui/accessibility/accessibility_switches.h"
69 #include "ui/base/l10n/l10n_util.h"
70 #include "ui/base/webui/web_ui_util.h"
71 #include "ui/chromeos/devicetype_utils.h"
72 #include "ui/chromeos/events/keyboard_layout_util.h"
73 #include "ui/display/display_features.h"
74 #include "ui/display/display_switches.h"
75 #include "ui/display/manager/touch_device_manager.h"
76 
77 namespace chromeos {
78 namespace settings {
79 namespace {
80 
ConceptVectorToDataPtrVector(const std::vector<SearchConcept> & tags_group)81 std::vector<local_search_service::mojom::DataPtr> ConceptVectorToDataPtrVector(
82     const std::vector<SearchConcept>& tags_group) {
83   std::vector<local_search_service::mojom::DataPtr> data_list;
84 
85   for (const auto& concept : tags_group) {
86     std::vector<base::string16> search_tags;
87 
88     // Add the canonical tag.
89     search_tags.push_back(
90         l10n_util::GetStringUTF16(concept.canonical_message_id));
91 
92     // Add all alternate tags.
93     for (size_t i = 0; i < SearchConcept::kMaxAltTagsPerConcept; ++i) {
94       int curr_alt_tag = concept.alt_tag_ids[i];
95       if (curr_alt_tag == SearchConcept::kAltTagEnd)
96         break;
97       search_tags.push_back(l10n_util::GetStringUTF16(curr_alt_tag));
98     }
99 
100     // Note: A stringified version of the canonical tag message ID is used as
101     // the identifier for this search data.
102     data_list.push_back(local_search_service::mojom::Data::New(
103         base::NumberToString(concept.canonical_message_id), search_tags));
104   }
105 
106   return data_list;
107 }
108 
109 // Generates a Google Help URL which includes a "board type" parameter. Some
110 // help pages need to be adjusted depending on the type of CrOS device that is
111 // accessing the page.
GetHelpUrlWithBoard(const std::string & original_url)112 base::string16 GetHelpUrlWithBoard(const std::string& original_url) {
113   return base::ASCIIToUTF16(original_url +
114                             "&b=" + base::SysInfo::GetLsbReleaseBoard());
115 }
116 
IsDeviceManaged()117 bool IsDeviceManaged() {
118   policy::BrowserPolicyConnectorChromeOS* connector =
119       g_browser_process->platform_part()->browser_policy_connector_chromeos();
120   return connector->IsEnterpriseManaged();
121 }
122 
IsProfileManaged(Profile * profile)123 bool IsProfileManaged(Profile* profile) {
124   return profile->GetProfilePolicyConnector()->IsManaged();
125 }
126 
AddCommonStrings(content::WebUIDataSource * html_source,Profile * profile)127 void AddCommonStrings(content::WebUIDataSource* html_source, Profile* profile) {
128   static constexpr webui::LocalizedString kLocalizedStrings[] = {
129       {"add", IDS_ADD},
130       {"advancedPageTitle", IDS_SETTINGS_ADVANCED},
131       {"back", IDS_ACCNAME_BACK},
132       {"basicPageTitle", IDS_SETTINGS_BASIC},
133       {"cancel", IDS_CANCEL},
134       {"clear", IDS_SETTINGS_CLEAR},
135       {"close", IDS_CLOSE},
136       {"confirm", IDS_CONFIRM},
137       {"continue", IDS_SETTINGS_CONTINUE},
138       {"controlledByExtension", IDS_SETTINGS_CONTROLLED_BY_EXTENSION},
139       {"custom", IDS_SETTINGS_CUSTOM},
140       {"delete", IDS_SETTINGS_DELETE},
141       {"deviceOff", IDS_SETTINGS_DEVICE_OFF},
142       {"deviceOn", IDS_SETTINGS_DEVICE_ON},
143       {"disable", IDS_DISABLE},
144       {"done", IDS_DONE},
145       {"edit", IDS_SETTINGS_EDIT},
146       {"extensionsLinkTooltip", IDS_SETTINGS_MENU_EXTENSIONS_LINK_TOOLTIP},
147       {"learnMore", IDS_LEARN_MORE},
148       {"menu", IDS_MENU},
149       {"menuButtonLabel", IDS_SETTINGS_MENU_BUTTON_LABEL},
150       {"moreActions", IDS_SETTINGS_MORE_ACTIONS},
151       {"ok", IDS_OK},
152       {"restart", IDS_SETTINGS_RESTART},
153       {"save", IDS_SAVE},
154       {"searchResultBubbleText", IDS_SEARCH_RESULT_BUBBLE_TEXT},
155       {"searchResultsBubbleText", IDS_SEARCH_RESULTS_BUBBLE_TEXT},
156       {"settings", IDS_SETTINGS_SETTINGS},
157       {"settingsAltPageTitle", IDS_SETTINGS_ALT_PAGE_TITLE},
158       {"subpageArrowRoleDescription", IDS_SETTINGS_SUBPAGE_BUTTON},
159       {"notValidWebAddress", IDS_SETTINGS_NOT_VALID_WEB_ADDRESS},
160       {"notValidWebAddressForContentType",
161        IDS_SETTINGS_NOT_VALID_WEB_ADDRESS_FOR_CONTENT_TYPE},
162 
163       // Common font related strings shown in a11y and appearance sections.
164       {"quickBrownFox", IDS_SETTINGS_QUICK_BROWN_FOX},
165       {"verySmall", IDS_SETTINGS_VERY_SMALL_FONT},
166       {"small", IDS_SETTINGS_SMALL_FONT},
167       {"medium", IDS_SETTINGS_MEDIUM_FONT},
168       {"large", IDS_SETTINGS_LARGE_FONT},
169       {"veryLarge", IDS_SETTINGS_VERY_LARGE_FONT},
170   };
171   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
172 
173   html_source->AddBoolean(
174       "isGuest",
175       user_manager::UserManager::Get()->IsLoggedInAsGuest() ||
176           user_manager::UserManager::Get()->IsLoggedInAsPublicAccount());
177 
178   html_source->AddBoolean("isSupervised", profile->IsSupervised());
179 }
180 
AddA11yStrings(content::WebUIDataSource * html_source)181 void AddA11yStrings(content::WebUIDataSource* html_source) {
182   static constexpr webui::LocalizedString kLocalizedStrings[] = {
183       {"a11yPageTitle", IDS_SETTINGS_ACCESSIBILITY},
184       {"a11yWebStore", IDS_SETTINGS_ACCESSIBILITY_WEB_STORE},
185       {"moreFeaturesLinkDescription",
186        IDS_SETTINGS_MORE_FEATURES_LINK_DESCRIPTION},
187       {"accessibleImageLabelsTitle",
188        IDS_SETTINGS_ACCESSIBLE_IMAGE_LABELS_TITLE},
189       {"accessibleImageLabelsSubtitle",
190        IDS_SETTINGS_ACCESSIBLE_IMAGE_LABELS_SUBTITLE},
191       {"settingsSliderRoleDescription",
192        IDS_SETTINGS_SLIDER_MIN_MAX_ARIA_ROLE_DESCRIPTION},
193       {"manageAccessibilityFeatures",
194        IDS_SETTINGS_ACCESSIBILITY_MANAGE_ACCESSIBILITY_FEATURES},
195       {"optionsInMenuLabel", IDS_SETTINGS_OPTIONS_IN_MENU_LABEL},
196       {"largeMouseCursorLabel", IDS_SETTINGS_LARGE_MOUSE_CURSOR_LABEL},
197       {"largeMouseCursorSizeLabel", IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_LABEL},
198       {"largeMouseCursorSizeDefaultLabel",
199        IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_DEFAULT_LABEL},
200       {"largeMouseCursorSizeLargeLabel",
201        IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_LARGE_LABEL},
202       {"highContrastLabel", IDS_SETTINGS_HIGH_CONTRAST_LABEL},
203       {"stickyKeysLabel", IDS_SETTINGS_STICKY_KEYS_LABEL},
204       {"chromeVoxLabel", IDS_SETTINGS_CHROMEVOX_LABEL},
205       {"chromeVoxOptionsLabel", IDS_SETTINGS_CHROMEVOX_OPTIONS_LABEL},
206       {"screenMagnifierLabel", IDS_SETTINGS_SCREEN_MAGNIFIER_LABEL},
207       {"screenMagnifierZoomLabel", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_LABEL},
208       {"dockedMagnifierLabel", IDS_SETTINGS_DOCKED_MAGNIFIER_LABEL},
209       {"dockedMagnifierZoomLabel", IDS_SETTINGS_DOCKED_MAGNIFIER_ZOOM_LABEL},
210       {"screenMagnifierZoom2x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_2_X},
211       {"screenMagnifierZoom4x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_4_X},
212       {"screenMagnifierZoom6x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_6_X},
213       {"screenMagnifierZoom8x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_8_X},
214       {"screenMagnifierZoom10x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_10_X},
215       {"screenMagnifierZoom12x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_12_X},
216       {"screenMagnifierZoom14x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_14_X},
217       {"screenMagnifierZoom16x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_16_X},
218       {"screenMagnifierZoom18x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_18_X},
219       {"screenMagnifierZoom20x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_20_X},
220       {"tapDraggingLabel", IDS_SETTINGS_TAP_DRAGGING_LABEL},
221       {"clickOnStopLabel", IDS_SETTINGS_CLICK_ON_STOP_LABEL},
222       {"delayBeforeClickLabel", IDS_SETTINGS_DELAY_BEFORE_CLICK_LABEL},
223       {"delayBeforeClickExtremelyShort",
224        IDS_SETTINGS_DELAY_BEFORE_CLICK_EXTREMELY_SHORT},
225       {"delayBeforeClickVeryShort", IDS_SETTINGS_DELAY_BEFORE_CLICK_VERY_SHORT},
226       {"delayBeforeClickShort", IDS_SETTINGS_DELAY_BEFORE_CLICK_SHORT},
227       {"delayBeforeClickLong", IDS_SETTINGS_DELAY_BEFORE_CLICK_LONG},
228       {"delayBeforeClickVeryLong", IDS_SETTINGS_DELAY_BEFORE_CLICK_VERY_LONG},
229       {"autoclickRevertToLeftClick",
230        IDS_SETTINGS_AUTOCLICK_REVERT_TO_LEFT_CLICK},
231       {"autoclickStabilizeCursorPosition",
232        IDS_SETTINGS_AUTOCLICK_STABILIZE_CURSOR_POSITION},
233       {"autoclickMovementThresholdLabel",
234        IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_LABEL},
235       {"autoclickMovementThresholdExtraSmall",
236        IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_EXTRA_SMALL},
237       {"autoclickMovementThresholdSmall",
238        IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_SMALL},
239       {"autoclickMovementThresholdDefault",
240        IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_DEFAULT},
241       {"autoclickMovementThresholdLarge",
242        IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_LARGE},
243       {"autoclickMovementThresholdExtraLarge",
244        IDS_SETTINGS_AUTOCLICK_MOVEMENT_THRESHOLD_EXTRA_LARGE},
245       {"dictationDescription",
246        IDS_SETTINGS_ACCESSIBILITY_DICTATION_DESCRIPTION},
247       {"dictationLabel", IDS_SETTINGS_ACCESSIBILITY_DICTATION_LABEL},
248       {"onScreenKeyboardLabel", IDS_SETTINGS_ON_SCREEN_KEYBOARD_LABEL},
249       {"monoAudioLabel", IDS_SETTINGS_MONO_AUDIO_LABEL},
250       {"startupSoundLabel", IDS_SETTINGS_STARTUP_SOUND_LABEL},
251       {"a11yExplanation", IDS_SETTINGS_ACCESSIBILITY_EXPLANATION},
252       {"caretHighlightLabel",
253        IDS_SETTINGS_ACCESSIBILITY_CARET_HIGHLIGHT_DESCRIPTION},
254       {"cursorHighlightLabel",
255        IDS_SETTINGS_ACCESSIBILITY_CURSOR_HIGHLIGHT_DESCRIPTION},
256       {"focusHighlightLabel",
257        IDS_SETTINGS_ACCESSIBILITY_FOCUS_HIGHLIGHT_DESCRIPTION},
258       {"selectToSpeakTitle", IDS_SETTINGS_ACCESSIBILITY_SELECT_TO_SPEAK_TITLE},
259       {"selectToSpeakDisabledDescription",
260        IDS_SETTINGS_ACCESSIBILITY_SELECT_TO_SPEAK_DISABLED_DESCRIPTION},
261       {"selectToSpeakDescription",
262        IDS_SETTINGS_ACCESSIBILITY_SELECT_TO_SPEAK_DESCRIPTION},
263       {"selectToSpeakDescriptionWithoutKeyboard",
264        IDS_SETTINGS_ACCESSIBILITY_SELECT_TO_SPEAK_DESCRIPTION_WITHOUT_KEYBOARD},
265       {"selectToSpeakOptionsLabel",
266        IDS_SETTINGS_ACCESSIBILITY_SELECT_TO_SPEAK_OPTIONS_LABEL},
267       {"switchAccessLabel",
268        IDS_SETTINGS_ACCESSIBILITY_SWITCH_ACCESS_DESCRIPTION},
269       {"switchAccessOptionsLabel",
270        IDS_SETTINGS_ACCESSIBILITY_SWITCH_ACCESS_OPTIONS_LABEL},
271       {"manageSwitchAccessSettings",
272        IDS_SETTINGS_MANAGE_SWITCH_ACCESS_SETTINGS},
273       {"switchAssignmentHeading", IDS_SETTINGS_SWITCH_ASSIGNMENT_HEADING},
274       {"switchAssignOptionNone", IDS_SETTINGS_SWITCH_ASSIGN_OPTION_NONE},
275       {"switchAssignOptionSpace", IDS_SETTINGS_SWITCH_ASSIGN_OPTION_SPACE},
276       {"switchAssignOptionEnter", IDS_SETTINGS_SWITCH_ASSIGN_OPTION_ENTER},
277       {"assignSelectSwitchLabel", IDS_SETTINGS_ASSIGN_SELECT_SWITCH_LABEL},
278       {"assignNextSwitchLabel", IDS_SETTINGS_ASSIGN_NEXT_SWITCH_LABEL},
279       {"assignPreviousSwitchLabel", IDS_SETTINGS_ASSIGN_PREVIOUS_SWITCH_LABEL},
280       {"switchAccessAutoScanHeading",
281        IDS_SETTINGS_SWITCH_ACCESS_AUTO_SCAN_HEADING},
282       {"switchAccessAutoScanLabel", IDS_SETTINGS_SWITCH_ACCESS_AUTO_SCAN_LABEL},
283       {"switchAccessAutoScanSpeedLabel",
284        IDS_SETTINGS_SWITCH_ACCESS_AUTO_SCAN_SPEED_LABEL},
285       {"switchAccessAutoScanKeyboardSpeedLabel",
286        IDS_SETTINGS_SWITCH_ACCESS_AUTO_SCAN_KEYBOARD_SPEED_LABEL},
287       {"durationInSeconds", IDS_SETTINGS_DURATION_IN_SECONDS},
288       {"manageAccessibilityFeatures",
289        IDS_SETTINGS_ACCESSIBILITY_MANAGE_ACCESSIBILITY_FEATURES},
290       {"textToSpeechHeading",
291        IDS_SETTINGS_ACCESSIBILITY_TEXT_TO_SPEECH_HEADING},
292       {"displayHeading", IDS_SETTINGS_ACCESSIBILITY_DISPLAY_HEADING},
293       {"displaySettingsTitle",
294        IDS_SETTINGS_ACCESSIBILITY_DISPLAY_SETTINGS_TITLE},
295       {"displaySettingsDescription",
296        IDS_SETTINGS_ACCESSIBILITY_DISPLAY_SETTINGS_DESCRIPTION},
297       {"appearanceSettingsTitle",
298        IDS_SETTINGS_ACCESSIBILITY_APPEARANCE_SETTINGS_TITLE},
299       {"appearanceSettingsDescription",
300        IDS_SETTINGS_ACCESSIBILITY_APPEARANCE_SETTINGS_DESCRIPTION},
301       {"keyboardAndTextInputHeading",
302        IDS_SETTINGS_ACCESSIBILITY_KEYBOARD_AND_TEXT_INPUT_HEADING},
303       {"keyboardSettingsTitle",
304        IDS_SETTINGS_ACCESSIBILITY_KEYBOARD_SETTINGS_TITLE},
305       {"keyboardSettingsDescription",
306        IDS_SETTINGS_ACCESSIBILITY_KEYBOARD_SETTINGS_DESCRIPTION},
307       {"mouseAndTouchpadHeading",
308        IDS_SETTINGS_ACCESSIBILITY_MOUSE_AND_TOUCHPAD_HEADING},
309       {"mouseSettingsTitle", IDS_SETTINGS_ACCESSIBILITY_MOUSE_SETTINGS_TITLE},
310       {"mouseSettingsDescription",
311        IDS_SETTINGS_ACCESSIBILITY_MOUSE_SETTINGS_DESCRIPTION},
312       {"audioAndCaptionsHeading",
313        IDS_SETTINGS_ACCESSIBILITY_AUDIO_AND_CAPTIONS_HEADING},
314       {"additionalFeaturesTitle",
315        IDS_SETTINGS_ACCESSIBILITY_ADDITIONAL_FEATURES_TITLE},
316       {"manageTtsSettings", IDS_SETTINGS_MANAGE_TTS_SETTINGS},
317       {"ttsSettingsLinkDescription", IDS_SETTINGS_TTS_LINK_DESCRIPTION},
318       {"textToSpeechVoices", IDS_SETTINGS_TEXT_TO_SPEECH_VOICES},
319       {"textToSpeechNoVoicesMessage",
320        IDS_SETTINGS_TEXT_TO_SPEECH_NO_VOICES_MESSAGE},
321       {"textToSpeechMoreLanguages", IDS_SETTINGS_TEXT_TO_SPEECH_MORE_LANGUAGES},
322       {"textToSpeechProperties", IDS_SETTINGS_TEXT_TO_SPEECH_PROPERTIES},
323       {"textToSpeechRate", IDS_SETTINGS_TEXT_TO_SPEECH_RATE},
324       {"textToSpeechRateMinimumLabel",
325        IDS_SETTINGS_TEXT_TO_SPEECH_RATE_MINIMUM_LABEL},
326       {"textToSpeechRateMaximumLabel",
327        IDS_SETTINGS_TEXT_TO_SPEECH_RATE_MAXIMUM_LABEL},
328       {"textToSpeechPitch", IDS_SETTINGS_TEXT_TO_SPEECH_PITCH},
329       {"textToSpeechPitchMinimumLabel",
330        IDS_SETTINGS_TEXT_TO_SPEECH_PITCH_MINIMUM_LABEL},
331       {"textToSpeechPitchMaximumLabel",
332        IDS_SETTINGS_TEXT_TO_SPEECH_PITCH_MAXIMUM_LABEL},
333       {"textToSpeechVolume", IDS_SETTINGS_TEXT_TO_SPEECH_VOLUME},
334       {"textToSpeechVolumeMinimumLabel",
335        IDS_SETTINGS_TEXT_TO_SPEECH_VOLUME_MINIMUM_LABEL},
336       {"textToSpeechVolumeMaximumLabel",
337        IDS_SETTINGS_TEXT_TO_SPEECH_VOLUME_MAXIMUM_LABEL},
338       {"percentage", IDS_SETTINGS_PERCENTAGE},
339       {"defaultPercentage", IDS_SETTINGS_DEFAULT_PERCENTAGE},
340       {"textToSpeechPreviewHeading",
341        IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_HEADING},
342       {"textToSpeechPreviewInputLabel",
343        IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_INPUT_LABEL},
344       {"textToSpeechPreviewInput", IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_INPUT},
345       {"textToSpeechPreviewVoice", IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_VOICE},
346       {"textToSpeechPreviewPlay", IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_PLAY},
347       {"textToSpeechEngines", IDS_SETTINGS_TEXT_TO_SPEECH_ENGINES},
348       {"tabletModeShelfNavigationButtonsSettingLabel",
349        IDS_SETTINGS_A11Y_TABLET_MODE_SHELF_BUTTONS_LABEL},
350       {"tabletModeShelfNavigationButtonsSettingDescription",
351        IDS_SETTINGS_A11Y_TABLET_MODE_SHELF_BUTTONS_DESCRIPTION},
352   };
353   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
354 
355   html_source->AddString("accountManagerLearnMoreUrl",
356                          chrome::kAccountManagerLearnMoreURL);
357   html_source->AddString("a11yLearnMoreUrl",
358                          chrome::kChromeAccessibilityHelpURL);
359 
360   base::CommandLine& cmd = *base::CommandLine::ForCurrentProcess();
361   html_source->AddBoolean(
362       "showExperimentalAccessibilitySwitchAccess",
363       cmd.HasSwitch(::switches::kEnableExperimentalAccessibilitySwitchAccess));
364 
365   html_source->AddBoolean(
366       "showExperimentalAccessibilitySwitchAccessImprovedTextInput",
367       cmd.HasSwitch(
368           ::switches::kEnableExperimentalAccessibilitySwitchAccessText));
369 
370   html_source->AddBoolean("showExperimentalA11yLabels",
371                           base::FeatureList::IsEnabled(
372                               ::features::kExperimentalAccessibilityLabels));
373 
374   html_source->AddBoolean(
375       "showTabletModeShelfNavigationButtonsSettings",
376       ash::features::IsHideShelfControlsInTabletModeEnabled());
377 
378   html_source->AddString("tabletModeShelfNavigationButtonsLearnMoreUrl",
379                          chrome::kTabletModeGesturesLearnMoreURL);
380 
381   html_source->AddBoolean("enableLiveCaption",
382                           base::FeatureList::IsEnabled(media::kLiveCaption));
383 
384   ::settings::AddCaptionSubpageStrings(html_source);
385 }
386 
AddLanguagesStrings(content::WebUIDataSource * html_source)387 void AddLanguagesStrings(content::WebUIDataSource* html_source) {
388   static constexpr webui::LocalizedString kLocalizedStrings[] = {
389       {"orderLanguagesInstructions",
390        IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_ORDERING_INSTRUCTIONS},
391       {"osLanguagesPageTitle", IDS_OS_SETTINGS_LANGUAGES_AND_INPUT_PAGE_TITLE},
392       {"osLanguagesListTitle", IDS_OS_SETTINGS_LANGUAGES_LIST_TITLE},
393       {"inputMethodsListTitle",
394        IDS_SETTINGS_LANGUAGES_INPUT_METHODS_LIST_TITLE},
395       {"inputMethodEnabled", IDS_SETTINGS_LANGUAGES_INPUT_METHOD_ENABLED},
396       {"inputMethodsExpandA11yLabel",
397        IDS_SETTINGS_LANGUAGES_INPUT_METHODS_EXPAND_ACCESSIBILITY_LABEL},
398       {"inputMethodsManagedbyPolicy",
399        IDS_SETTINGS_LANGUAGES_INPUT_METHODS_MANAGED_BY_POLICY},
400       {"manageInputMethods", IDS_SETTINGS_LANGUAGES_INPUT_METHODS_MANAGE},
401       {"manageInputMethodsPageTitle",
402        IDS_SETTINGS_LANGUAGES_MANAGE_INPUT_METHODS_TITLE},
403       {"showImeMenu", IDS_SETTINGS_LANGUAGES_SHOW_IME_MENU},
404       {"displayLanguageRestart",
405        IDS_SETTINGS_LANGUAGES_RESTART_TO_DISPLAY_LANGUAGE},
406       {"moveDown", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_DOWN},
407       {"displayInThisLanguage",
408        IDS_SETTINGS_LANGUAGES_DISPLAY_IN_THIS_LANGUAGE},
409       {"searchLanguages", IDS_SETTINGS_LANGUAGE_SEARCH},
410       {"addLanguagesDialogTitle",
411        IDS_SETTINGS_LANGUAGES_MANAGE_LANGUAGES_TITLE},
412       {"moveToTop", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_TO_TOP},
413       {"isDisplayedInThisLanguage",
414        IDS_SETTINGS_LANGUAGES_IS_DISPLAYED_IN_THIS_LANGUAGE},
415       {"removeLanguage", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_REMOVE},
416       {"addLanguages", IDS_SETTINGS_LANGUAGES_LANGUAGES_ADD},
417       {"moveUp", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_UP},
418   };
419   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
420 
421   html_source->AddString(
422       "languagesLearnMoreURL",
423       base::ASCIIToUTF16(chrome::kLanguageSettingsLearnMoreUrl));
424 }
425 
AddPersonalizationStrings(content::WebUIDataSource * html_source)426 void AddPersonalizationStrings(content::WebUIDataSource* html_source) {
427   static constexpr webui::LocalizedString kLocalizedStrings[] = {
428       {"ambientModeTitle", IDS_OS_SETTINGS_AMBIENT_MODE_TITLE},
429       {"ambientModeEnabled", IDS_OS_SETTINGS_AMBIENT_MODE_ENABLED},
430       {"ambientModeDisabled", IDS_OS_SETTINGS_AMBIENT_MODE_DISABLED},
431       {"ambientModeOn", IDS_OS_SETTINGS_AMBIENT_MODE_ON},
432       {"ambientModeOff", IDS_OS_SETTINGS_AMBIENT_MODE_OFF},
433       {"ambientModeTopicSourceTitle",
434        IDS_OS_SETTINGS_AMBIENT_MODE_TOPIC_SOURCE_TITLE},
435       {"ambientModeTopicSourceGooglePhotos",
436        IDS_OS_SETTINGS_AMBIENT_MODE_TOPIC_SOURCE_GOOGLE_PHOTOS},
437       {"ambientModeTopicSourceArtGallery",
438        IDS_OS_SETTINGS_AMBIENT_MODE_TOPIC_SOURCE_ART_GALLERY},
439       {"changePictureTitle", IDS_OS_SETTINGS_CHANGE_PICTURE_TITLE},
440       {"openWallpaperApp", IDS_OS_SETTINGS_OPEN_WALLPAPER_APP},
441       {"personalizationPageTitle", IDS_OS_SETTINGS_PERSONALIZATION},
442       {"setWallpaper", IDS_OS_SETTINGS_SET_WALLPAPER},
443       {"takePhoto", IDS_SETTINGS_CHANGE_PICTURE_TAKE_PHOTO},
444       {"captureVideo", IDS_SETTINGS_CHANGE_PICTURE_CAPTURE_VIDEO},
445       {"discardPhoto", IDS_SETTINGS_CHANGE_PICTURE_DISCARD_PHOTO},
446       {"previewAltText", IDS_SETTINGS_CHANGE_PICTURE_PREVIEW_ALT},
447       {"switchModeToVideo", IDS_SETTINGS_CHANGE_PICTURE_SWITCH_MODE_TO_VIDEO},
448       {"profilePhoto", IDS_SETTINGS_CHANGE_PICTURE_PROFILE_PHOTO},
449       {"changePicturePageDescription", IDS_SETTINGS_CHANGE_PICTURE_DIALOG_TEXT},
450       {"switchModeToCamera", IDS_SETTINGS_CHANGE_PICTURE_SWITCH_MODE_TO_CAMERA},
451       {"chooseFile", IDS_SETTINGS_CHANGE_PICTURE_CHOOSE_FILE},
452       {"oldPhoto", IDS_SETTINGS_CHANGE_PICTURE_OLD_PHOTO},
453       {"oldVideo", IDS_SETTINGS_CHANGE_PICTURE_OLD_VIDEO},
454       {"authorCreditText", IDS_SETTINGS_CHANGE_PICTURE_AUTHOR_CREDIT_TEXT},
455       {"photoCaptureAccessibleText",
456        IDS_SETTINGS_PHOTO_CAPTURE_ACCESSIBLE_TEXT},
457       {"photoDiscardAccessibleText",
458        IDS_SETTINGS_PHOTO_DISCARD_ACCESSIBLE_TEXT},
459       {"photoModeAccessibleText", IDS_SETTINGS_PHOTO_MODE_ACCESSIBLE_TEXT},
460       {"videoModeAccessibleText", IDS_SETTINGS_VIDEO_MODE_ACCESSIBLE_TEXT},
461   };
462   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
463 
464   html_source->AddBoolean(
465       "changePictureVideoModeEnabled",
466       base::FeatureList::IsEnabled(::features::kChangePictureVideoMode));
467   html_source->AddBoolean("isAmbientModeEnabled",
468                           chromeos::features::IsAmbientModeEnabled());
469 }
470 
AddFingerprintListStrings(content::WebUIDataSource * html_source)471 void AddFingerprintListStrings(content::WebUIDataSource* html_source) {
472   static constexpr webui::LocalizedString kLocalizedStrings[] = {
473       {"lockScreenAddFingerprint",
474        IDS_SETTINGS_PEOPLE_LOCK_SCREEN_ADD_FINGERPRINT_BUTTON},
475       {"lockScreenRegisteredFingerprints",
476        IDS_SETTINGS_PEOPLE_LOCK_SCREEN_REGISTERED_FINGERPRINTS_LABEL},
477       {"lockScreenFingerprintWarning",
478        IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_LESS_SECURE},
479   };
480   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
481 }
482 
AddSetupPinDialogStrings(content::WebUIDataSource * html_source)483 void AddSetupPinDialogStrings(content::WebUIDataSource* html_source) {
484   static constexpr webui::LocalizedString kLocalizedStrings[] = {
485       {"configurePinChoosePinTitle",
486        IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_CHOOSE_PIN_TITLE},
487       {"configurePinConfirmPinTitle",
488        IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_CONFIRM_PIN_TITLE},
489       {"configurePinMismatched", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_MISMATCHED},
490       {"configurePinTooShort", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_TOO_SHORT},
491       {"configurePinTooLong", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_TOO_LONG},
492       {"configurePinWeakPin", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_WEAK_PIN},
493       {"pinKeyboardPlaceholderPin", IDS_PIN_KEYBOARD_HINT_TEXT_PIN},
494       {"pinKeyboardPlaceholderPinPassword",
495        IDS_PIN_KEYBOARD_HINT_TEXT_PIN_PASSWORD},
496       {"pinKeyboardDeleteAccessibleName",
497        IDS_PIN_KEYBOARD_DELETE_ACCESSIBLE_NAME},
498   };
499   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
500 
501   // Format numbers to be used on the pin keyboard.
502   for (int j = 0; j <= 9; j++) {
503     html_source->AddString("pinKeyboard" + base::NumberToString(j),
504                            base::FormatNumber(int64_t{j}));
505   }
506 }
507 
AddSetupFingerprintDialogStrings(content::WebUIDataSource * html_source)508 void AddSetupFingerprintDialogStrings(content::WebUIDataSource* html_source) {
509   static constexpr webui::LocalizedString kLocalizedStrings[] = {
510       {"configureFingerprintTitle", IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_TITLE},
511       {"configureFingerprintAddAnotherButton",
512        IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_ADD_ANOTHER_BUTTON},
513       {"configureFingerprintInstructionReadyStep",
514        IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_READY},
515       {"configureFingerprintLiftFinger",
516        IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_LIFT_FINGER},
517       {"configureFingerprintTryAgain",
518        IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_TRY_AGAIN},
519       {"configureFingerprintImmobile",
520        IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_FINGER_IMMOBILE},
521   };
522   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
523 }
524 
AddFingerprintStrings(content::WebUIDataSource * html_source)525 void AddFingerprintStrings(content::WebUIDataSource* html_source) {
526   int instruction_id, aria_label_id;
527   using FingerprintLocation = chromeos::quick_unlock::FingerprintLocation;
528   switch (chromeos::quick_unlock::GetFingerprintLocation()) {
529     case FingerprintLocation::TABLET_POWER_BUTTON:
530       instruction_id =
531           IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_POWER_BUTTON;
532       aria_label_id =
533           IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_POWER_BUTTON_ARIA_LABEL;
534       break;
535     case FingerprintLocation::KEYBOARD_BOTTOM_LEFT:
536       instruction_id =
537           IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
538       aria_label_id =
539           IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD_BOTTOM_LEFT_ARIA_LABEL;
540       break;
541     case FingerprintLocation::KEYBOARD_BOTTOM_RIGHT:
542       instruction_id =
543           IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
544       aria_label_id =
545           IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD_BOTTOM_RIGHT_ARIA_LABEL;
546       break;
547     case FingerprintLocation::KEYBOARD_TOP_RIGHT:
548       instruction_id =
549           IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD;
550       aria_label_id =
551           IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_KEYBOARD_TOP_RIGHT_ARIA_LABEL;
552       break;
553   }
554   html_source->AddLocalizedString(
555       "configureFingerprintInstructionLocateScannerStep", instruction_id);
556   html_source->AddLocalizedString("configureFingerprintScannerStepAriaLabel",
557                                   aria_label_id);
558 }
559 
AddAccountManagerPageStrings(content::WebUIDataSource * html_source)560 void AddAccountManagerPageStrings(content::WebUIDataSource* html_source) {
561   static constexpr webui::LocalizedString kLocalizedStrings[] = {
562       {"accountManagerDescription", IDS_SETTINGS_ACCOUNT_MANAGER_DESCRIPTION},
563       {"accountManagerChildDescription",
564        IDS_SETTINGS_ACCOUNT_MANAGER_CHILD_DESCRIPTION},
565       {"accountListHeader", IDS_SETTINGS_ACCOUNT_MANAGER_LIST_HEADER},
566       {"accountManagerPrimaryAccountTooltip",
567        IDS_SETTINGS_ACCOUNT_MANAGER_PRIMARY_ACCOUNT_TOOLTIP},
568       {"accountManagerEducationAccountLabel",
569        IDS_SETTINGS_ACCOUNT_MANAGER_EDUCATION_ACCOUNT},
570       {"removeAccountLabel", IDS_SETTINGS_ACCOUNT_MANAGER_REMOVE_ACCOUNT_LABEL},
571       {"addAccountLabel", IDS_SETTINGS_ACCOUNT_MANAGER_ADD_ACCOUNT_LABEL},
572       {"addSchoolAccountLabel",
573        IDS_SETTINGS_ACCOUNT_MANAGER_ADD_SCHOOL_ACCOUNT_LABEL},
574       {"accountManagerSecondaryAccountsDisabledText",
575        IDS_SETTINGS_ACCOUNT_MANAGER_SECONDARY_ACCOUNTS_DISABLED_TEXT},
576       {"accountManagerSecondaryAccountsDisabledChildText",
577        IDS_SETTINGS_ACCOUNT_MANAGER_SECONDARY_ACCOUNTS_DISABLED_CHILD_TEXT},
578       {"accountManagerSignedOutAccountName",
579        IDS_SETTINGS_ACCOUNT_MANAGER_SIGNED_OUT_ACCOUNT_PLACEHOLDER},
580       {"accountManagerUnmigratedAccountName",
581        IDS_SETTINGS_ACCOUNT_MANAGER_UNMIGRATED_ACCOUNT_PLACEHOLDER},
582       {"accountManagerMigrationLabel",
583        IDS_SETTINGS_ACCOUNT_MANAGER_MIGRATION_LABEL},
584       {"accountManagerReauthenticationLabel",
585        IDS_SETTINGS_ACCOUNT_MANAGER_REAUTHENTICATION_LABEL},
586       {"accountManagerMigrationTooltip",
587        IDS_SETTINGS_ACCOUNT_MANAGER_MIGRATION_TOOLTIP},
588       {"accountManagerReauthenticationTooltip",
589        IDS_SETTINGS_ACCOUNT_MANAGER_REAUTHENTICATION_TOOLTIP},
590       {"accountManagerMoreActionsTooltip",
591        IDS_SETTINGS_ACCOUNT_MANAGER_MORE_ACTIONS_TOOLTIP},
592       {"accountManagerManagedLabel",
593        IDS_SETTINGS_ACCOUNT_MANAGER_MANAGEMENT_STATUS_MANAGED_ACCOUNT},
594       {"accountManagerUnmanagedLabel",
595        IDS_SETTINGS_ACCOUNT_MANAGER_MANAGEMENT_STATUS_UNMANAGED_ACCOUNT},
596   };
597   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
598 }
599 
AddSyncControlsStrings(content::WebUIDataSource * html_source)600 void AddSyncControlsStrings(content::WebUIDataSource* html_source) {
601   static constexpr webui::LocalizedString kLocalizedStrings[] = {
602       {"syncEverythingCheckboxLabel",
603        IDS_SETTINGS_SYNC_EVERYTHING_CHECKBOX_LABEL},
604       {"wallpaperCheckboxLabel", IDS_OS_SETTINGS_WALLPAPER_CHECKBOX_LABEL},
605       {"osSyncTurnOff", IDS_OS_SETTINGS_SYNC_TURN_OFF},
606       {"osSyncSettingsCheckboxLabel",
607        IDS_OS_SETTINGS_SYNC_SETTINGS_CHECKBOX_LABEL},
608       {"wifiConfigurationsCheckboxLabel",
609        IDS_SETTINGS_WIFI_CONFIGURATIONS_CHECKBOX_LABEL},
610       {"osSyncAppsCheckboxLabel", IDS_OS_SETTINGS_SYNC_APPS_CHECKBOX_LABEL},
611       {"osSyncTurnOn", IDS_OS_SETTINGS_SYNC_TURN_ON},
612       {"osSyncFeatureLabel", IDS_OS_SETTINGS_SYNC_FEATURE_LABEL},
613   };
614   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
615 
616   html_source->AddString(
617       "browserSettingsSyncSetupUrl",
618       base::StrCat({chrome::kChromeUISettingsURL, chrome::kSyncSetupSubPage}));
619 }
620 
AddCrostiniStrings(content::WebUIDataSource * html_source,Profile * profile)621 void AddCrostiniStrings(content::WebUIDataSource* html_source,
622                         Profile* profile) {
623   static constexpr webui::LocalizedString kLocalizedStrings[] = {
624       {"crostiniPageTitle", IDS_SETTINGS_CROSTINI_TITLE},
625       {"crostiniPageLabel", IDS_SETTINGS_CROSTINI_LABEL},
626       {"crostiniEnable", IDS_SETTINGS_TURN_ON},
627       {"crostiniSharedPaths", IDS_SETTINGS_CROSTINI_SHARED_PATHS},
628       {"crostiniSharedPathsListHeading",
629        IDS_SETTINGS_CROSTINI_SHARED_PATHS_LIST_HEADING},
630       {"crostiniSharedPathsInstructionsAdd",
631        IDS_SETTINGS_CROSTINI_SHARED_PATHS_INSTRUCTIONS_ADD},
632       {"crostiniSharedPathsInstructionsRemove",
633        IDS_SETTINGS_CROSTINI_SHARED_PATHS_INSTRUCTIONS_REMOVE},
634       {"crostiniSharedPathsRemoveSharing",
635        IDS_SETTINGS_CROSTINI_SHARED_PATHS_REMOVE_SHARING},
636       {"crostiniSharedPathsRemoveFailureDialogMessage",
637        IDS_SETTINGS_CROSTINI_SHARED_PATHS_REMOVE_FAILURE_DIALOG_MESSAGE},
638       {"crostiniSharedPathsRemoveFailureDialogTitle",
639        IDS_SETTINGS_CROSTINI_SHARED_PATHS_REMOVE_FAILURE_DIALOG_TITLE},
640       {"crostiniSharedPathsRemoveFailureTryAgain",
641        IDS_SETTINGS_CROSTINI_SHARED_PATHS_REMOVE_FAILURE_TRY_AGAIN},
642       {"crostiniSharedPathsListEmptyMessage",
643        IDS_SETTINGS_CROSTINI_SHARED_PATHS_LIST_EMPTY_MESSAGE},
644       {"crostiniExportImportTitle", IDS_SETTINGS_CROSTINI_EXPORT_IMPORT_TITLE},
645       {"crostiniExport", IDS_SETTINGS_CROSTINI_EXPORT},
646       {"crostiniExportLabel", IDS_SETTINGS_CROSTINI_EXPORT_LABEL},
647       {"crostiniImport", IDS_SETTINGS_CROSTINI_IMPORT},
648       {"crostiniImportLabel", IDS_SETTINGS_CROSTINI_IMPORT_LABEL},
649       {"crostiniImportConfirmationDialogTitle",
650        IDS_SETTINGS_CROSTINI_CONFIRM_IMPORT_DIALOG_WINDOW_TITLE},
651       {"crostiniImportConfirmationDialogMessage",
652        IDS_SETTINGS_CROSTINI_CONFIRM_IMPORT_DIALOG_WINDOW_MESSAGE},
653       {"crostiniImportConfirmationDialogConfirmationButton",
654        IDS_SETTINGS_CROSTINI_IMPORT},
655       {"crostiniRemoveButton", IDS_SETTINGS_CROSTINI_REMOVE_BUTTON},
656       {"crostiniSharedUsbDevicesLabel",
657        IDS_SETTINGS_CROSTINI_SHARED_USB_DEVICES_LABEL},
658       {"crostiniSharedUsbDevicesDescription",
659        IDS_SETTINGS_CROSTINI_SHARED_USB_DEVICES_DESCRIPTION},
660       {"crostiniSharedUsbDevicesExtraDescription",
661        IDS_SETTINGS_CROSTINI_SHARED_USB_DEVICES_EXTRA_DESCRIPTION},
662       {"crostiniSharedUsbDevicesListEmptyMessage",
663        IDS_SETTINGS_CROSTINI_SHARED_USB_DEVICES_LIST_EMPTY_MESSAGE},
664       {"crostiniArcAdbTitle", IDS_SETTINGS_CROSTINI_ARC_ADB_TITLE},
665       {"crostiniArcAdbDescription", IDS_SETTINGS_CROSTINI_ARC_ADB_DESCRIPTION},
666       {"crostiniArcAdbLabel", IDS_SETTINGS_CROSTINI_ARC_ADB_LABEL},
667       {"crostiniArcAdbRestartButton",
668        IDS_SETTINGS_CROSTINI_ARC_ADB_RESTART_BUTTON},
669       {"crostiniArcAdbConfirmationTitleEnable",
670        IDS_SETTINGS_CROSTINI_ARC_ADB_CONFIRMATION_TITLE_ENABLE},
671       {"crostiniArcAdbConfirmationTitleDisable",
672        IDS_SETTINGS_CROSTINI_ARC_ADB_CONFIRMATION_TITLE_DISABLE},
673       {"crostiniContainerUpgrade",
674        IDS_SETTINGS_CROSTINI_CONTAINER_UPGRADE_MESSAGE},
675       {"crostiniContainerUpgradeSubtext",
676        IDS_SETTINGS_CROSTINI_CONTAINER_UPGRADE_SUBTEXT},
677       {"crostiniContainerUpgradeButton",
678        IDS_SETTINGS_CROSTINI_CONTAINER_UPGRADE_BUTTON},
679       {"crostiniPortForwarding", IDS_SETTINGS_CROSTINI_PORT_FORWARDING},
680       {"crostiniPortForwardingDescription",
681        IDS_SETTINGS_CROSTINI_PORT_FORWARDING_DESCRIPTION},
682       {"crostiniPortForwardingNoPorts",
683        IDS_SETTINGS_CROSTINI_PORT_FORWARDING_NO_PORTS},
684       {"crostiniPortForwardingTableTitle",
685        IDS_SETTINGS_CROSTINI_PORT_FORWARDING_TABLE_TITLE},
686       {"crostiniPortForwardingListPortNumber",
687        IDS_SETTINGS_CROSTINI_PORT_FORWARDING_LIST_PORT_NUMBER},
688       {"crostiniPortForwardingListLabel",
689        IDS_SETTINGS_CROSTINI_PORT_FORWARDING_LIST_LABEL},
690       {"crostiniPortForwardingAddPortButton",
691        IDS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_PORT_BUTTON},
692       {"crostiniPortForwardingAddPortButtonDescription",
693        IDS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_PORT_BUTTON_DESCRIPTION},
694       {"crostiniPortForwardingAddPortDialogTitle",
695        IDS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_PORT_DIALOG_TITLE},
696       {"crostiniPortForwardingAddPortDialogLabel",
697        IDS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_PORT_DIALOG_LABEL},
698       {"crostiniPortForwardingTCP", IDS_SETTINGS_CROSTINI_PORT_FORWARDING_TCP},
699       {"crostiniPortForwardingUDP", IDS_SETTINGS_CROSTINI_PORT_FORWARDING_UDP},
700       {"crostiniPortForwardingAddError",
701        IDS_SETTINGS_CROSTINI_PORT_FORWARDING_ADD_ERROR},
702       {"crostiniDiskResizeTitle", IDS_SETTINGS_CROSTINI_DISK_RESIZE_TITLE},
703       {"crostiniDiskResizeShowButton",
704        IDS_SETTINGS_CROSTINI_DISK_RESIZE_SHOW_BUTTON},
705       {"crostiniDiskResizeLabel", IDS_SETTINGS_CROSTINI_DISK_RESIZE_LABEL},
706       {"crostiniDiskResizeUnsupported",
707        IDS_SETTINGS_CROSTINI_DISK_RESIZE_UNSUPPORTED},
708       {"crostiniDiskResizeLoading", IDS_SETTINGS_CROSTINI_DISK_RESIZE_LOADING},
709       {"crostiniDiskResizeError", IDS_SETTINGS_CROSTINI_DISK_RESIZE_ERROR},
710       {"crostiniDiskResizeErrorRetry",
711        IDS_SETTINGS_CROSTINI_DISK_RESIZE_ERROR_RETRY},
712       {"crostiniDiskResizeCancel", IDS_SETTINGS_CROSTINI_DISK_RESIZE_CANCEL},
713       {"crostiniDiskResizeGoButton",
714        IDS_SETTINGS_CROSTINI_DISK_RESIZE_GO_BUTTON},
715       {"crostiniDiskResizeInProgress",
716        IDS_SETTINGS_CROSTINI_DISK_RESIZE_IN_PROGRESS},
717       {"crostiniDiskResizeResizingError",
718        IDS_SETTINGS_CROSTINI_DISK_RESIZE_RESIZING_ERROR},
719       {"crostiniDiskResizeDone", IDS_SETTINGS_CROSTINI_DISK_RESIZE_DONE},
720       {"crostiniMicTitle", IDS_SETTINGS_CROSTINI_MIC_TITLE},
721       {"crostiniMicDialogTitle", IDS_SETTINGS_CROSTINI_MIC_DIALOG_TITLE},
722       {"crostiniMicDialogLabel", IDS_SETTINGS_CROSTINI_MIC_DIALOG_LABEL},
723   };
724   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
725   html_source->AddString(
726       "crostiniSubtext",
727       l10n_util::GetStringFUTF16(
728           IDS_SETTINGS_CROSTINI_SUBTEXT, ui::GetChromeOSDeviceName(),
729           GetHelpUrlWithBoard(chrome::kLinuxAppsLearnMoreURL)));
730   html_source->AddString(
731       "crostiniArcAdbPowerwashRequiredSublabel",
732       l10n_util::GetStringFUTF16(
733           IDS_SETTINGS_CROSTINI_ARC_ADB_POWERWASH_REQUIRED_SUBLABEL,
734           base::ASCIIToUTF16(chrome::kArcAdbSideloadingLearnMoreURL)));
735   html_source->AddString("crostiniRemove", l10n_util::GetStringFUTF16(
736                                                IDS_SETTINGS_CROSTINI_REMOVE,
737                                                ui::GetChromeOSDeviceName()));
738   html_source->AddString(
739       "crostiniArcAdbConfirmationMessageEnable",
740       l10n_util::GetStringFUTF16(
741           IDS_SETTINGS_CROSTINI_ARC_ADB_CONFIRMATION_MESSAGE_ENABLE,
742           ui::GetChromeOSDeviceName()));
743   html_source->AddString(
744       "crostiniArcAdbConfirmationMessageDisable",
745       l10n_util::GetStringFUTF16(
746           IDS_SETTINGS_CROSTINI_ARC_ADB_CONFIRMATION_MESSAGE_DISABLE,
747           ui::GetChromeOSDeviceName()));
748   html_source->AddString(
749       "crostiniSharedPathsInstructionsLocate",
750       l10n_util::GetStringFUTF16(
751           IDS_SETTINGS_CROSTINI_SHARED_PATHS_INSTRUCTIONS_LOCATE,
752           base::ASCIIToUTF16(
753               crostini::ContainerChromeOSBaseDirectory().value())));
754   html_source->AddBoolean(
755       "showCrostiniExportImport",
756       crostini::CrostiniFeatures::Get()->IsExportImportUIAllowed(profile));
757   html_source->AddBoolean("arcAdbSideloadingSupported",
758                           base::FeatureList::IsEnabled(
759                               chromeos::features::kArcAdbSideloadingFeature));
760   html_source->AddBoolean("showCrostiniPortForwarding",
761                           base::FeatureList::IsEnabled(
762                               chromeos::features::kCrostiniPortForwarding));
763   html_source->AddBoolean("isOwnerProfile",
764                           chromeos::ProfileHelper::IsOwnerProfile(profile));
765   html_source->AddBoolean("isEnterpriseManaged",
766                           IsDeviceManaged() || IsProfileManaged(profile));
767   html_source->AddBoolean(
768       "canChangeAdbSideloading",
769       crostini::CrostiniFeatures::Get()->CanChangeAdbSideloading(profile));
770   html_source->AddBoolean("showCrostiniContainerUpgrade",
771                           crostini::ShouldAllowContainerUpgrade(profile));
772   html_source->AddBoolean(
773       "showCrostiniDiskResize",
774       base::FeatureList::IsEnabled(chromeos::features::kCrostiniDiskResizing));
775   html_source->AddBoolean("showCrostiniMic",
776                           base::FeatureList::IsEnabled(
777                               chromeos::features::kCrostiniShowMicSetting));
778 }
779 
AddPluginVmStrings(content::WebUIDataSource * html_source,Profile * profile)780 void AddPluginVmStrings(content::WebUIDataSource* html_source,
781                         Profile* profile) {
782   static constexpr webui::LocalizedString kLocalizedStrings[] = {
783       {"pluginVmPageTitle", IDS_SETTINGS_PLUGIN_VM_PAGE_TITLE},
784       {"pluginVmPageLabel", IDS_SETTINGS_PLUGIN_VM_PAGE_LABEL},
785       {"pluginVmPageSubtext", IDS_SETTINGS_PLUGIN_VM_PAGE_SUBTEXT},
786       {"pluginVmPageEnable", IDS_SETTINGS_TURN_ON},
787       {"pluginVmPrinterAccess", IDS_SETTINGS_PLUGIN_VM_PRINTER_ACCESS},
788       {"pluginVmSharedPaths", IDS_SETTINGS_PLUGIN_VM_SHARED_PATHS},
789       {"pluginVmSharedPathsListHeading",
790        IDS_SETTINGS_PLUGIN_VM_SHARED_PATHS_LIST_HEADING},
791       {"pluginVmSharedPathsInstructionsAdd",
792        IDS_SETTINGS_PLUGIN_VM_SHARED_PATHS_INSTRUCTIONS_ADD},
793       {"pluginVmSharedPathsInstructionsRemove",
794        IDS_SETTINGS_PLUGIN_VM_SHARED_PATHS_INSTRUCTIONS_REMOVE},
795       {"pluginVmSharedPathsRemoveSharing",
796        IDS_SETTINGS_PLUGIN_VM_SHARED_PATHS_REMOVE_SHARING},
797       {"pluginVmRemove", IDS_SETTINGS_PLUGIN_VM_REMOVE_LABEL},
798       {"pluginVmRemoveButton", IDS_SETTINGS_PLUGIN_VM_REMOVE_BUTTON},
799       {"pluginVmRemoveConfirmationDialogMessage",
800        IDS_SETTINGS_PLUGIN_VM_CONFIRM_REMOVE_DIALOG_BODY},
801   };
802   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
803 }
804 
AddAndroidAppStrings(content::WebUIDataSource * html_source)805 void AddAndroidAppStrings(content::WebUIDataSource* html_source) {
806   static constexpr webui::LocalizedString kLocalizedStrings[] = {
807       {"androidAppsPageLabel", IDS_SETTINGS_ANDROID_APPS_LABEL},
808       {"androidAppsEnable", IDS_SETTINGS_TURN_ON},
809       {"androidAppsManageApps", IDS_SETTINGS_ANDROID_APPS_MANAGE_APPS},
810       {"androidAppsRemove", IDS_SETTINGS_ANDROID_APPS_REMOVE},
811       {"androidAppsRemoveButton", IDS_SETTINGS_ANDROID_APPS_REMOVE_BUTTON},
812       {"androidAppsDisableDialogTitle",
813        IDS_SETTINGS_ANDROID_APPS_DISABLE_DIALOG_TITLE},
814       {"androidAppsDisableDialogMessage",
815        IDS_SETTINGS_ANDROID_APPS_DISABLE_DIALOG_MESSAGE},
816       {"androidAppsDisableDialogRemove",
817        IDS_SETTINGS_ANDROID_APPS_DISABLE_DIALOG_REMOVE},
818       {"androidAppsManageAppLinks", IDS_SETTINGS_ANDROID_APPS_MANAGE_APP_LINKS},
819   };
820   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
821   html_source->AddLocalizedString("androidAppsPageTitle",
822                                   arc::IsPlayStoreAvailable()
823                                       ? IDS_SETTINGS_ANDROID_APPS_TITLE
824                                       : IDS_SETTINGS_ANDROID_SETTINGS_TITLE);
825   html_source->AddString(
826       "androidAppsSubtext",
827       l10n_util::GetStringFUTF16(
828           IDS_SETTINGS_ANDROID_APPS_SUBTEXT, ui::GetChromeOSDeviceName(),
829           GetHelpUrlWithBoard(chrome::kAndroidAppsLearnMoreURL)));
830 }
831 
AddAppsStrings(content::WebUIDataSource * html_source)832 void AddAppsStrings(content::WebUIDataSource* html_source) {
833   static constexpr webui::LocalizedString kLocalizedStrings[] = {
834       {"appsPageTitle", IDS_SETTINGS_APPS_TITLE},
835       {"appManagementTitle", IDS_SETTINGS_APPS_LINK_TEXT},
836   };
837   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
838 }
839 
AddAppManagementStrings(content::WebUIDataSource * html_source)840 void AddAppManagementStrings(content::WebUIDataSource* html_source) {
841   static constexpr webui::LocalizedString kLocalizedStrings[] = {
842       {"appManagementAppInstalledByPolicyLabel",
843        IDS_APP_MANAGEMENT_POLICY_APP_POLICY_STRING},
844       {"appManagementCameraPermissionLabel", IDS_APP_MANAGEMENT_CAMERA},
845       {"appManagementContactsPermissionLabel", IDS_APP_MANAGEMENT_CONTACTS},
846       {"appManagementLocationPermissionLabel", IDS_APP_MANAGEMENT_LOCATION},
847       {"appManagementMicrophonePermissionLabel", IDS_APP_MANAGEMENT_MICROPHONE},
848       {"appManagementMoreSettingsLabel", IDS_APP_MANAGEMENT_MORE_SETTINGS},
849       {"appManagementNoAppsFound", IDS_APP_MANAGEMENT_NO_APPS_FOUND},
850       {"appManagementNoPermissions",
851        IDS_APPLICATION_INFO_APP_NO_PERMISSIONS_TEXT},
852       {"appManagementNotificationsLabel", IDS_APP_MANAGEMENT_NOTIFICATIONS},
853       {"appManagementPermissionsLabel", IDS_APP_MANAGEMENT_PERMISSIONS},
854       {"appManagementPinToShelfLabel", IDS_APP_MANAGEMENT_PIN_TO_SHELF},
855       {"appManagementSearchPrompt", IDS_APP_MANAGEMENT_SEARCH_PROMPT},
856       {"appManagementStoragePermissionLabel", IDS_APP_MANAGEMENT_STORAGE},
857       {"appManagementUninstallLabel", IDS_APP_MANAGEMENT_UNINSTALL_APP},
858   };
859   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
860 }
861 
AddParentalControlStrings(content::WebUIDataSource * html_source,Profile * profile)862 void AddParentalControlStrings(content::WebUIDataSource* html_source,
863                                Profile* profile) {
864   static constexpr webui::LocalizedString kLocalizedStrings[] = {
865       {"parentalControlsPageTitle", IDS_SETTINGS_PARENTAL_CONTROLS_PAGE_TITLE},
866       {"parentalControlsPageSetUpLabel",
867        IDS_SETTINGS_PARENTAL_CONTROLS_PAGE_SET_UP_LABEL},
868       {"parentalControlsPageViewSettingsLabel",
869        IDS_SETTINGS_PARENTAL_CONTROLS_PAGE_VIEW_SETTINGS_LABEL},
870       {"parentalControlsPageConnectToInternetLabel",
871        IDS_SETTINGS_PARENTAL_CONTROLS_PAGE_CONNECT_TO_INTERNET_LABEL},
872       {"parentalControlsSetUpButtonLabel",
873        IDS_SETTINGS_PARENTAL_CONTROLS_SET_UP_BUTTON_LABEL},
874       {"parentalControlsSetUpButtonRole",
875        IDS_SETTINGS_PARENTAL_CONTROLS_SET_UP_BUTTON_ROLE},
876   };
877   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
878 
879   html_source->AddBoolean(
880       "isChild", user_manager::UserManager::Get()->IsLoggedInAsChildUser());
881 
882   if (user_manager::UserManager::Get()->IsLoggedInAsChildUser()) {
883     SupervisedUserService* supervised_user_service =
884         SupervisedUserServiceFactory::GetForProfile(profile);
885     std::string custodian = supervised_user_service->GetCustodianName();
886     std::string second_custodian =
887         supervised_user_service->GetSecondCustodianName();
888 
889     base::string16 child_managed_tooltip;
890     if (second_custodian.empty()) {
891       child_managed_tooltip = l10n_util::GetStringFUTF16(
892           IDS_SETTINGS_ACCOUNT_MANAGER_CHILD_MANAGED_BY_ONE_PARENT_TOOLTIP,
893           base::UTF8ToUTF16(custodian));
894     } else {
895       child_managed_tooltip = l10n_util::GetStringFUTF16(
896           IDS_SETTINGS_ACCOUNT_MANAGER_CHILD_MANAGED_BY_TWO_PARENTS_TOOLTIP,
897           base::UTF8ToUTF16(custodian), base::UTF8ToUTF16(second_custodian));
898     }
899     html_source->AddString("accountManagerPrimaryAccountChildManagedTooltip",
900                            child_managed_tooltip);
901   }
902 }
903 
AddBluetoothStrings(content::WebUIDataSource * html_source)904 void AddBluetoothStrings(content::WebUIDataSource* html_source) {
905   static constexpr webui::LocalizedString kLocalizedStrings[] = {
906       {"bluetoothConnected", IDS_SETTINGS_BLUETOOTH_CONNECTED},
907       {"bluetoothConnectedWithBattery",
908        IDS_SETTINGS_BLUETOOTH_CONNECTED_WITH_BATTERY},
909       {"bluetoothConnecting", IDS_SETTINGS_BLUETOOTH_CONNECTING},
910       {"bluetoothDeviceListPaired", IDS_SETTINGS_BLUETOOTH_DEVICE_LIST_PAIRED},
911       {"bluetoothDeviceListUnpaired",
912        IDS_SETTINGS_BLUETOOTH_DEVICE_LIST_UNPAIRED},
913       {"bluetoothConnect", IDS_SETTINGS_BLUETOOTH_CONNECT},
914       {"bluetoothDisconnect", IDS_SETTINGS_BLUETOOTH_DISCONNECT},
915       {"bluetoothToggleA11yLabel",
916        IDS_SETTINGS_BLUETOOTH_TOGGLE_ACCESSIBILITY_LABEL},
917       {"bluetoothExpandA11yLabel",
918        IDS_SETTINGS_BLUETOOTH_EXPAND_ACCESSIBILITY_LABEL},
919       {"bluetoothNoDevices", IDS_SETTINGS_BLUETOOTH_NO_DEVICES},
920       {"bluetoothNoDevicesFound", IDS_SETTINGS_BLUETOOTH_NO_DEVICES_FOUND},
921       {"bluetoothNotConnected", IDS_SETTINGS_BLUETOOTH_NOT_CONNECTED},
922       {"bluetoothPageTitle", IDS_SETTINGS_BLUETOOTH},
923       {"bluetoothPairDevicePageTitle",
924        IDS_SETTINGS_BLUETOOTH_PAIR_DEVICE_TITLE},
925       {"bluetoothRemove", IDS_SETTINGS_BLUETOOTH_REMOVE},
926       {"bluetoothPrimaryUserControlled",
927        IDS_SETTINGS_BLUETOOTH_PRIMARY_USER_CONTROLLED},
928       {"bluetoothDeviceType_computer",
929        IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_COMPUTER},
930       {"bluetoothDeviceType_phone",
931        IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_PHONE},
932       {"bluetoothDeviceType_modem",
933        IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_MODEM},
934       {"bluetoothDeviceType_audio",
935        IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_AUDIO},
936       {"bluetoothDeviceType_carAudio",
937        IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_CAR_AUDIO},
938       {"bluetoothDeviceType_video",
939        IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_VIDEO},
940       {"bluetoothDeviceType_peripheral",
941        IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_PERIPHERAL},
942       {"bluetoothDeviceType_joystick",
943        IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_JOYSTICK},
944       {"bluetoothDeviceType_gamepad",
945        IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_GAMEPAD},
946       {"bluetoothDeviceType_keyboard",
947        IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_KEYBOARD},
948       {"bluetoothDeviceType_mouse",
949        IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_MOUSE},
950       {"bluetoothDeviceType_tablet",
951        IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_TABLET},
952       {"bluetoothDeviceType_keyboardMouseCombo",
953        IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_KEYBOARD_MOUSE_COMBO},
954       {"bluetoothDeviceType_unknown",
955        IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_UNKNOWN},
956   };
957   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
958   chromeos::bluetooth_dialog::AddLocalizedStrings(html_source);
959 }
960 
AddChromeOSUserStrings(content::WebUIDataSource * html_source,Profile * profile)961 void AddChromeOSUserStrings(content::WebUIDataSource* html_source,
962                             Profile* profile) {
963   user_manager::UserManager* user_manager = user_manager::UserManager::Get();
964 
965   const user_manager::User* user =
966       chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
967   const user_manager::User* primary_user = user_manager->GetPrimaryUser();
968   std::string primary_user_email = primary_user->GetAccountId().GetUserEmail();
969   html_source->AddString("primaryUserEmail", primary_user_email);
970   html_source->AddString("browserSettingsBannerText",
971                          l10n_util::GetStringFUTF16(
972                              IDS_SETTINGS_BROWSER_SETTINGS_BANNER,
973                              base::ASCIIToUTF16(chrome::kChromeUISettingsURL)));
974   html_source->AddBoolean("isActiveDirectoryUser",
975                           user && user->IsActiveDirectoryUser());
976   html_source->AddBoolean(
977       "isSecondaryUser",
978       user && user->GetAccountId() != primary_user->GetAccountId());
979   html_source->AddString(
980       "secondaryUserBannerText",
981       l10n_util::GetStringFUTF16(IDS_SETTINGS_SECONDARY_USER_BANNER,
982                                  base::ASCIIToUTF16(primary_user_email)));
983 
984   if (!IsDeviceManaged() && !user_manager->IsCurrentUserOwner()) {
985     html_source->AddString("ownerEmail",
986                            user_manager->GetOwnerAccountId().GetUserEmail());
987   }
988 }
989 
AddDevicePointersStrings(content::WebUIDataSource * html_source)990 void AddDevicePointersStrings(content::WebUIDataSource* html_source) {
991   static constexpr webui::LocalizedString kPointersStrings[] = {
992       {"mouseTitle", IDS_SETTINGS_MOUSE_TITLE},
993       {"touchpadTitle", IDS_SETTINGS_TOUCHPAD_TITLE},
994       {"mouseAndTouchpadTitle", IDS_SETTINGS_MOUSE_AND_TOUCHPAD_TITLE},
995       {"touchpadTapToClickEnabledLabel",
996        IDS_SETTINGS_TOUCHPAD_TAP_TO_CLICK_ENABLED_LABEL},
997       {"touchpadSpeed", IDS_SETTINGS_TOUCHPAD_SPEED_LABEL},
998       {"pointerSlow", IDS_SETTINGS_POINTER_SPEED_SLOW_LABEL},
999       {"pointerFast", IDS_SETTINGS_POINTER_SPEED_FAST_LABEL},
1000       {"mouseScrollSpeed", IDS_SETTINGS_MOUSE_SCROLL_SPEED_LABEL},
1001       {"mouseSpeed", IDS_SETTINGS_MOUSE_SPEED_LABEL},
1002       {"mouseSwapButtons", IDS_SETTINGS_MOUSE_SWAP_BUTTONS_LABEL},
1003       {"mouseReverseScroll", IDS_SETTINGS_MOUSE_REVERSE_SCROLL_LABEL},
1004       {"mouseAccelerationLabel", IDS_SETTINGS_MOUSE_ACCELERATION_LABEL},
1005       {"mouseScrollAccelerationLabel",
1006        IDS_SETTINGS_MOUSE_SCROLL_ACCELERATION_LABEL},
1007       {"touchpadAccelerationLabel", IDS_SETTINGS_TOUCHPAD_ACCELERATION_LABEL},
1008       {"touchpadScrollAccelerationLabel",
1009        IDS_SETTINGS_TOUCHPAD_SCROLL_ACCELERATION_LABEL},
1010       {"touchpadScrollSpeed", IDS_SETTINGS_TOUCHPAD_SCROLL_SPEED_LABEL},
1011   };
1012   AddLocalizedStringsBulk(html_source, kPointersStrings);
1013 
1014   html_source->AddString("naturalScrollLearnMoreLink",
1015                          GetHelpUrlWithBoard(chrome::kNaturalScrollHelpURL));
1016 
1017   html_source->AddBoolean(
1018       "allowDisableMouseAcceleration",
1019       base::FeatureList::IsEnabled(::features::kAllowDisableMouseAcceleration));
1020   html_source->AddBoolean(
1021       "allowScrollSettings",
1022       base::FeatureList::IsEnabled(features::kAllowScrollSettings));
1023 }
1024 
AddDeviceKeyboardStrings(content::WebUIDataSource * html_source)1025 void AddDeviceKeyboardStrings(content::WebUIDataSource* html_source) {
1026   static constexpr webui::LocalizedString keyboard_strings[] = {
1027       {"keyboardTitle", IDS_SETTINGS_KEYBOARD_TITLE},
1028       {"keyboardKeyCtrl", IDS_SETTINGS_KEYBOARD_KEY_LEFT_CTRL},
1029       {"keyboardKeyAlt", IDS_SETTINGS_KEYBOARD_KEY_LEFT_ALT},
1030       {"keyboardKeyCapsLock", IDS_SETTINGS_KEYBOARD_KEY_CAPS_LOCK},
1031       {"keyboardKeyCommand", IDS_SETTINGS_KEYBOARD_KEY_COMMAND},
1032       {"keyboardKeyDiamond", IDS_SETTINGS_KEYBOARD_KEY_DIAMOND},
1033       {"keyboardKeyEscape", IDS_SETTINGS_KEYBOARD_KEY_ESCAPE},
1034       {"keyboardKeyBackspace", IDS_SETTINGS_KEYBOARD_KEY_BACKSPACE},
1035       {"keyboardKeyAssistant", IDS_SETTINGS_KEYBOARD_KEY_ASSISTANT},
1036       {"keyboardKeyDisabled", IDS_SETTINGS_KEYBOARD_KEY_DISABLED},
1037       {"keyboardKeyExternalCommand",
1038        IDS_SETTINGS_KEYBOARD_KEY_EXTERNAL_COMMAND},
1039       {"keyboardKeyExternalMeta", IDS_SETTINGS_KEYBOARD_KEY_EXTERNAL_META},
1040       {"keyboardKeyMeta", IDS_SETTINGS_KEYBOARD_KEY_META},
1041       {"keyboardSendFunctionKeys", IDS_SETTINGS_KEYBOARD_SEND_FUNCTION_KEYS},
1042       {"keyboardEnableAutoRepeat", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_ENABLE},
1043       {"keyRepeatDelay", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_DELAY},
1044       {"keyRepeatDelayLong", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_DELAY_LONG},
1045       {"keyRepeatDelayShort", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_DELAY_SHORT},
1046       {"keyRepeatRate", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_RATE},
1047       {"keyRepeatRateSlow", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_RATE_SLOW},
1048       {"keyRepeatRateFast", IDS_SETTINGS_KEYBOARD_AUTO_REPEAT_FAST},
1049       {"showKeyboardShortcutViewer",
1050        IDS_SETTINGS_KEYBOARD_SHOW_SHORTCUT_VIEWER},
1051       {"keyboardShowLanguageAndInput",
1052        IDS_SETTINGS_KEYBOARD_SHOW_LANGUAGE_AND_INPUT},
1053   };
1054   AddLocalizedStringsBulk(html_source, keyboard_strings);
1055 
1056   html_source->AddLocalizedString("keyboardKeySearch",
1057                                   ui::DeviceUsesKeyboardLayout2()
1058                                       ? IDS_SETTINGS_KEYBOARD_KEY_LAUNCHER
1059                                       : IDS_SETTINGS_KEYBOARD_KEY_SEARCH);
1060   html_source->AddLocalizedString(
1061       "keyboardSendFunctionKeysDescription",
1062       ui::DeviceUsesKeyboardLayout2()
1063           ? IDS_SETTINGS_KEYBOARD_SEND_FUNCTION_KEYS_LAYOUT2_DESCRIPTION
1064           : IDS_SETTINGS_KEYBOARD_SEND_FUNCTION_KEYS_DESCRIPTION);
1065 }
1066 
AddDeviceStylusStrings(content::WebUIDataSource * html_source)1067 void AddDeviceStylusStrings(content::WebUIDataSource* html_source) {
1068   static constexpr webui::LocalizedString kStylusStrings[] = {
1069       {"stylusTitle", IDS_SETTINGS_STYLUS_TITLE},
1070       {"stylusEnableStylusTools", IDS_SETTINGS_STYLUS_ENABLE_STYLUS_TOOLS},
1071       {"stylusAutoOpenStylusTools", IDS_SETTINGS_STYLUS_AUTO_OPEN_STYLUS_TOOLS},
1072       {"stylusFindMoreAppsPrimary", IDS_SETTINGS_STYLUS_FIND_MORE_APPS_PRIMARY},
1073       {"stylusFindMoreAppsSecondary",
1074        IDS_SETTINGS_STYLUS_FIND_MORE_APPS_SECONDARY},
1075       {"stylusNoteTakingApp", IDS_SETTINGS_STYLUS_NOTE_TAKING_APP_LABEL},
1076       {"stylusNoteTakingAppEnabledOnLockScreen",
1077        IDS_SETTINGS_STYLUS_NOTE_TAKING_APP_LOCK_SCREEN_CHECKBOX},
1078       {"stylusNoteTakingAppKeepsLastNoteOnLockScreen",
1079        IDS_SETTINGS_STYLUS_NOTE_TAKING_APP_KEEP_LATEST_NOTE},
1080       {"stylusNoteTakingAppLockScreenSettingsHeader",
1081        IDS_SETTINGS_STYLUS_LOCK_SCREEN_NOTES_TITLE},
1082       {"stylusNoteTakingAppNoneAvailable",
1083        IDS_SETTINGS_STYLUS_NOTE_TAKING_APP_NONE_AVAILABLE},
1084       {"stylusNoteTakingAppWaitingForAndroid",
1085        IDS_SETTINGS_STYLUS_NOTE_TAKING_APP_WAITING_FOR_ANDROID}};
1086   AddLocalizedStringsBulk(html_source, kStylusStrings);
1087 }
1088 
AddDeviceDisplayStrings(content::WebUIDataSource * html_source)1089 void AddDeviceDisplayStrings(content::WebUIDataSource* html_source) {
1090   static constexpr webui::LocalizedString kDisplayStrings[] = {
1091       {"displayTitle", IDS_SETTINGS_DISPLAY_TITLE},
1092       {"displayArrangementText", IDS_SETTINGS_DISPLAY_ARRANGEMENT_TEXT},
1093       {"displayArrangementTitle", IDS_SETTINGS_DISPLAY_ARRANGEMENT_TITLE},
1094       {"displayMirror", IDS_SETTINGS_DISPLAY_MIRROR},
1095       {"displayMirrorDisplayName", IDS_SETTINGS_DISPLAY_MIRROR_DISPLAY_NAME},
1096       {"displayAmbientColorTitle", IDS_SETTINGS_DISPLAY_AMBIENT_COLOR_TITLE},
1097       {"displayAmbientColorSubtitle",
1098        IDS_SETTINGS_DISPLAY_AMBIENT_COLOR_SUBTITLE},
1099       {"displayNightLightLabel", IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_LABEL},
1100       {"displayNightLightOnAtSunset",
1101        IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_ON_AT_SUNSET},
1102       {"displayNightLightOffAtSunrise",
1103        IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_OFF_AT_SUNRISE},
1104       {"displayNightLightScheduleCustom",
1105        IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_SCHEDULE_CUSTOM},
1106       {"displayNightLightScheduleLabel",
1107        IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_SCHEDULE_LABEL},
1108       {"displayNightLightScheduleNever",
1109        IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_SCHEDULE_NEVER},
1110       {"displayNightLightScheduleSunsetToSunRise",
1111        IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_SCHEDULE_SUNSET_TO_SUNRISE},
1112       {"displayNightLightStartTime",
1113        IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_START_TIME},
1114       {"displayNightLightStopTime", IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_STOP_TIME},
1115       {"displayNightLightText", IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_TEXT},
1116       {"displayNightLightTemperatureLabel",
1117        IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_TEMPERATURE_LABEL},
1118       {"displayNightLightTempSliderMaxLabel",
1119        IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_TEMP_SLIDER_MAX_LABEL},
1120       {"displayNightLightTempSliderMinLabel",
1121        IDS_SETTINGS_DISPLAY_NIGHT_LIGHT_TEMP_SLIDER_MIN_LABEL},
1122       {"displayUnifiedDesktop", IDS_SETTINGS_DISPLAY_UNIFIED_DESKTOP},
1123       {"displayUnifiedDesktopOn", IDS_SETTINGS_DISPLAY_UNIFIED_DESKTOP_ON},
1124       {"displayUnifiedDesktopOff", IDS_SETTINGS_DISPLAY_UNIFIED_DESKTOP_OFF},
1125       {"displayResolutionTitle", IDS_SETTINGS_DISPLAY_RESOLUTION_TITLE},
1126       {"displayResolutionText", IDS_SETTINGS_DISPLAY_RESOLUTION_TEXT},
1127       {"displayResolutionTextBest", IDS_SETTINGS_DISPLAY_RESOLUTION_TEXT_BEST},
1128       {"displayResolutionTextNative",
1129        IDS_SETTINGS_DISPLAY_RESOLUTION_TEXT_NATIVE},
1130       {"displayResolutionSublabel", IDS_SETTINGS_DISPLAY_RESOLUTION_SUBLABEL},
1131       {"displayResolutionMenuItem", IDS_SETTINGS_DISPLAY_RESOLUTION_MENU_ITEM},
1132       {"displayResolutionInterlacedMenuItem",
1133        IDS_SETTINGS_DISPLAY_RESOLUTION_INTERLACED_MENU_ITEM},
1134       {"displayZoomTitle", IDS_SETTINGS_DISPLAY_ZOOM_TITLE},
1135       {"displayZoomSublabel", IDS_SETTINGS_DISPLAY_ZOOM_SUBLABEL},
1136       {"displayZoomValue", IDS_SETTINGS_DISPLAY_ZOOM_VALUE},
1137       {"displayZoomLogicalResolutionText",
1138        IDS_SETTINGS_DISPLAY_ZOOM_LOGICAL_RESOLUTION_TEXT},
1139       {"displayZoomNativeLogicalResolutionNativeText",
1140        IDS_SETTINGS_DISPLAY_ZOOM_LOGICAL_RESOLUTION_NATIVE_TEXT},
1141       {"displayZoomLogicalResolutionDefaultText",
1142        IDS_SETTINGS_DISPLAY_ZOOM_LOGICAL_RESOLUTION_DEFAULT_TEXT},
1143       {"displaySizeSliderMinLabel", IDS_SETTINGS_DISPLAY_ZOOM_SLIDER_MINIMUM},
1144       {"displaySizeSliderMaxLabel", IDS_SETTINGS_DISPLAY_ZOOM_SLIDER_MAXIMUM},
1145       {"displayScreenTitle", IDS_SETTINGS_DISPLAY_SCREEN},
1146       {"displayScreenExtended", IDS_SETTINGS_DISPLAY_SCREEN_EXTENDED},
1147       {"displayScreenPrimary", IDS_SETTINGS_DISPLAY_SCREEN_PRIMARY},
1148       {"displayOrientation", IDS_SETTINGS_DISPLAY_ORIENTATION},
1149       {"displayOrientationStandard", IDS_SETTINGS_DISPLAY_ORIENTATION_STANDARD},
1150       {"displayOrientationAutoRotate",
1151        IDS_SETTINGS_DISPLAY_ORIENTATION_AUTO_ROTATE},
1152       {"displayOverscanPageText", IDS_SETTINGS_DISPLAY_OVERSCAN_TEXT},
1153       {"displayOverscanPageTitle", IDS_SETTINGS_DISPLAY_OVERSCAN_TITLE},
1154       {"displayOverscanSubtitle", IDS_SETTINGS_DISPLAY_OVERSCAN_SUBTITLE},
1155       {"displayOverscanInstructions",
1156        IDS_SETTINGS_DISPLAY_OVERSCAN_INSTRUCTIONS},
1157       {"displayOverscanResize", IDS_SETTINGS_DISPLAY_OVERSCAN_RESIZE},
1158       {"displayOverscanPosition", IDS_SETTINGS_DISPLAY_OVERSCAN_POSITION},
1159       {"displayOverscanReset", IDS_SETTINGS_DISPLAY_OVERSCAN_RESET},
1160       {"displayTouchCalibrationTitle",
1161        IDS_SETTINGS_DISPLAY_TOUCH_CALIBRATION_TITLE},
1162       {"displayTouchCalibrationText",
1163        IDS_SETTINGS_DISPLAY_TOUCH_CALIBRATION_TEXT}};
1164   AddLocalizedStringsBulk(html_source, kDisplayStrings);
1165 
1166   base::CommandLine& cmd = *base::CommandLine::ForCurrentProcess();
1167   html_source->AddBoolean("unifiedDesktopAvailable",
1168                           cmd.HasSwitch(::switches::kEnableUnifiedDesktop));
1169 
1170   html_source->AddBoolean("listAllDisplayModes",
1171                           display::features::IsListAllDisplayModesEnabled());
1172 
1173   html_source->AddBoolean("deviceSupportsAmbientColor",
1174                           ash::features::IsAllowAmbientEQEnabled());
1175 
1176   html_source->AddBoolean(
1177       "enableTouchCalibrationSetting",
1178       cmd.HasSwitch(chromeos::switches::kEnableTouchCalibrationSetting));
1179 
1180   html_source->AddBoolean("hasExternalTouchDevice",
1181                           display::HasExternalTouchscreenDevice());
1182 }
1183 
AddDeviceStorageStrings(content::WebUIDataSource * html_source)1184 void AddDeviceStorageStrings(content::WebUIDataSource* html_source) {
1185   static constexpr webui::LocalizedString kStorageStrings[] = {
1186       {"storageTitle", IDS_SETTINGS_STORAGE_TITLE},
1187       {"storageItemInUse", IDS_SETTINGS_STORAGE_ITEM_IN_USE},
1188       {"storageItemAvailable", IDS_SETTINGS_STORAGE_ITEM_AVAILABLE},
1189       {"storageItemSystem", IDS_SETTINGS_STORAGE_ITEM_SYSTEM},
1190       {"storageItemMyFiles", IDS_SETTINGS_STORAGE_ITEM_MY_FILES},
1191       {"storageItemBrowsingData", IDS_SETTINGS_STORAGE_ITEM_BROWSING_DATA},
1192       {"storageItemApps", IDS_SETTINGS_STORAGE_ITEM_APPS},
1193       {"storageItemCrostini", IDS_SETTINGS_STORAGE_ITEM_CROSTINI},
1194       {"storageItemOtherUsers", IDS_SETTINGS_STORAGE_ITEM_OTHER_USERS},
1195       {"storageSizeComputing", IDS_SETTINGS_STORAGE_SIZE_CALCULATING},
1196       {"storageSizeUnknown", IDS_SETTINGS_STORAGE_SIZE_UNKNOWN},
1197       {"storageSpaceLowMessageTitle",
1198        IDS_SETTINGS_STORAGE_SPACE_LOW_MESSAGE_TITLE},
1199       {"storageSpaceLowMessageLine1",
1200        IDS_SETTINGS_STORAGE_SPACE_LOW_MESSAGE_LINE_1},
1201       {"storageSpaceLowMessageLine2",
1202        IDS_SETTINGS_STORAGE_SPACE_LOW_MESSAGE_LINE_2},
1203       {"storageSpaceCriticallyLowMessageTitle",
1204        IDS_SETTINGS_STORAGE_SPACE_CRITICALLY_LOW_MESSAGE_TITLE},
1205       {"storageSpaceCriticallyLowMessageLine1",
1206        IDS_SETTINGS_STORAGE_SPACE_CRITICALLY_LOW_MESSAGE_LINE_1},
1207       {"storageSpaceCriticallyLowMessageLine2",
1208        IDS_SETTINGS_STORAGE_SPACE_CRITICALLY_LOW_MESSAGE_LINE_2},
1209       {"storageExternal", IDS_SETTINGS_STORAGE_EXTERNAL},
1210       {"storageExternalStorageEmptyListHeader",
1211        IDS_SETTINGS_STORAGE_EXTERNAL_STORAGE_EMPTY_LIST_HEADER},
1212       {"storageExternalStorageListHeader",
1213        IDS_SETTINGS_STORAGE_EXTERNAL_STORAGE_LIST_HEADER},
1214       {"storageOverviewAriaLabel", IDS_SETTINGS_STORAGE_OVERVIEW_ARIA_LABEL}};
1215   AddLocalizedStringsBulk(html_source, kStorageStrings);
1216 
1217   html_source->AddString(
1218       "storageAndroidAppsExternalDrivesNote",
1219       l10n_util::GetStringFUTF16(
1220           IDS_SETTINGS_STORAGE_ANDROID_APPS_ACCESS_EXTERNAL_DRIVES_NOTE,
1221           base::ASCIIToUTF16(chrome::kArcExternalStorageLearnMoreURL)));
1222 }
1223 
AddDevicePowerStrings(content::WebUIDataSource * html_source)1224 void AddDevicePowerStrings(content::WebUIDataSource* html_source) {
1225   static constexpr webui::LocalizedString kPowerStrings[] = {
1226       {"powerTitle", IDS_SETTINGS_POWER_TITLE},
1227       {"powerSourceLabel", IDS_SETTINGS_POWER_SOURCE_LABEL},
1228       {"powerSourceBattery", IDS_SETTINGS_POWER_SOURCE_BATTERY},
1229       {"powerSourceAcAdapter", IDS_SETTINGS_POWER_SOURCE_AC_ADAPTER},
1230       {"powerSourceLowPowerCharger",
1231        IDS_SETTINGS_POWER_SOURCE_LOW_POWER_CHARGER},
1232       {"calculatingPower", IDS_SETTINGS_POWER_SOURCE_CALCULATING},
1233       {"powerIdleLabel", IDS_SETTINGS_POWER_IDLE_LABEL},
1234       {"powerIdleWhileChargingLabel",
1235        IDS_SETTINGS_POWER_IDLE_WHILE_CHARGING_LABEL},
1236       {"powerIdleWhileChargingAriaLabel",
1237        IDS_SETTINGS_POWER_IDLE_WHILE_CHARGING_ARIA_LABEL},
1238       {"powerIdleWhileOnBatteryLabel",
1239        IDS_SETTINGS_POWER_IDLE_WHILE_ON_BATTERY_LABEL},
1240       {"powerIdleWhileOnBatteryAriaLabel",
1241        IDS_SETTINGS_POWER_IDLE_WHILE_ON_BATTERY_ARIA_LABEL},
1242       {"powerIdleDisplayOffSleep", IDS_SETTINGS_POWER_IDLE_DISPLAY_OFF_SLEEP},
1243       {"powerIdleDisplayOff", IDS_SETTINGS_POWER_IDLE_DISPLAY_OFF},
1244       {"powerIdleDisplayOn", IDS_SETTINGS_POWER_IDLE_DISPLAY_ON},
1245       {"powerIdleOther", IDS_SETTINGS_POWER_IDLE_OTHER},
1246       {"powerLidSleepLabel", IDS_SETTINGS_POWER_LID_CLOSED_SLEEP_LABEL},
1247       {"powerLidSignOutLabel", IDS_SETTINGS_POWER_LID_CLOSED_SIGN_OUT_LABEL},
1248       {"powerLidShutDownLabel", IDS_SETTINGS_POWER_LID_CLOSED_SHUT_DOWN_LABEL},
1249   };
1250   AddLocalizedStringsBulk(html_source, kPowerStrings);
1251 }
1252 
AddDeviceStrings(content::WebUIDataSource * html_source)1253 void AddDeviceStrings(content::WebUIDataSource* html_source) {
1254   static constexpr webui::LocalizedString kDeviceStrings[] = {
1255       {"devicePageTitle", IDS_SETTINGS_DEVICE_TITLE},
1256       {"scrollLabel", IDS_SETTINGS_SCROLL_LABEL},
1257       {"touchPadScrollLabel", IDS_OS_SETTINGS_TOUCHPAD_REVERSE_SCROLL_LABEL},
1258   };
1259   AddLocalizedStringsBulk(html_source, kDeviceStrings);
1260 
1261   AddDevicePointersStrings(html_source);
1262   AddDeviceKeyboardStrings(html_source);
1263   AddDeviceStylusStrings(html_source);
1264   AddDeviceDisplayStrings(html_source);
1265   AddDeviceStorageStrings(html_source);
1266   AddDevicePowerStrings(html_source);
1267 }
1268 
AddFilesStrings(content::WebUIDataSource * html_source)1269 void AddFilesStrings(content::WebUIDataSource* html_source) {
1270   static constexpr webui::LocalizedString kLocalizedStrings[] = {
1271       {"disconnectGoogleDriveAccount", IDS_SETTINGS_DISCONNECT_GOOGLE_DRIVE},
1272       {"filesPageTitle", IDS_OS_SETTINGS_FILES},
1273       {"smbSharesTitle", IDS_SETTINGS_DOWNLOADS_SMB_SHARES},
1274       {"smbSharesLearnMoreLabel",
1275        IDS_SETTINGS_DOWNLOADS_SMB_SHARES_LEARN_MORE_LABEL},
1276       {"addSmbShare", IDS_SETTINGS_DOWNLOADS_SMB_SHARES_ADD_SHARE},
1277       {"smbShareAddedSuccessfulMessage",
1278        IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_SUCCESS_MESSAGE},
1279       {"smbShareAddedErrorMessage",
1280        IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_ERROR_MESSAGE},
1281       {"smbShareAddedAuthFailedMessage",
1282        IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_AUTH_FAILED_MESSAGE},
1283       {"smbShareAddedNotFoundMessage",
1284        IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_NOT_FOUND_MESSAGE},
1285       {"smbShareAddedUnsupportedDeviceMessage",
1286        IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_UNSUPPORTED_DEVICE_MESSAGE},
1287       {"smbShareAddedMountExistsMessage",
1288        IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_MOUNT_EXISTS_MESSAGE},
1289       {"smbShareAddedTooManyMountsMessage",
1290        IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_TOO_MANY_MOUNTS_MESSAGE},
1291       {"smbShareAddedInvalidURLMessage",
1292        IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_MOUNT_INVALID_URL_MESSAGE},
1293       {"smbShareAddedInvalidSSOURLMessage",
1294        IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_MOUNT_INVALID_SSO_URL_MESSAGE},
1295   };
1296   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
1297 
1298   chromeos::smb_dialog::AddLocalizedStrings(html_source);
1299 
1300   html_source->AddString("smbSharesLearnMoreURL",
1301                          GetHelpUrlWithBoard(chrome::kSmbSharesLearnMoreURL));
1302 }
1303 
AddEasyUnlockStrings(content::WebUIDataSource * html_source)1304 void AddEasyUnlockStrings(content::WebUIDataSource* html_source) {
1305   static constexpr webui::LocalizedString kLocalizedStrings[] = {
1306       {"easyUnlockSectionTitle", IDS_SETTINGS_EASY_UNLOCK_SECTION_TITLE},
1307       {"easyUnlockUnlockDeviceOnly",
1308        IDS_SETTINGS_EASY_UNLOCK_UNLOCK_DEVICE_ONLY},
1309       {"easyUnlockUnlockDeviceAndAllowSignin",
1310        IDS_SETTINGS_EASY_UNLOCK_UNLOCK_DEVICE_AND_ALLOW_SIGNIN},
1311   };
1312   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
1313 }
1314 
AddMultideviceStrings(content::WebUIDataSource * html_source)1315 void AddMultideviceStrings(content::WebUIDataSource* html_source) {
1316   static constexpr webui::LocalizedString kLocalizedStrings[] = {
1317       {"multidevicePageTitle", IDS_SETTINGS_MULTIDEVICE},
1318       {"multideviceSetupButton", IDS_SETTINGS_MULTIDEVICE_SETUP_BUTTON},
1319       {"multideviceVerifyButton", IDS_SETTINGS_MULTIDEVICE_VERIFY_BUTTON},
1320       {"multideviceSetupItemHeading",
1321        IDS_SETTINGS_MULTIDEVICE_SETUP_ITEM_HEADING},
1322       {"multideviceEnabled", IDS_SETTINGS_MULTIDEVICE_ENABLED},
1323       {"multideviceDisabled", IDS_SETTINGS_MULTIDEVICE_DISABLED},
1324       {"multideviceSmartLockItemTitle", IDS_SETTINGS_EASY_UNLOCK_SECTION_TITLE},
1325       {"multideviceInstantTetheringItemTitle",
1326        IDS_SETTINGS_MULTIDEVICE_INSTANT_TETHERING},
1327       {"multideviceInstantTetheringItemSummary",
1328        IDS_SETTINGS_MULTIDEVICE_INSTANT_TETHERING_SUMMARY},
1329       {"multideviceAndroidMessagesItemTitle",
1330        IDS_SETTINGS_MULTIDEVICE_ANDROID_MESSAGES},
1331       {"multideviceForgetDevice", IDS_SETTINGS_MULTIDEVICE_FORGET_THIS_DEVICE},
1332       {"multideviceSmartLockOptions",
1333        IDS_SETTINGS_PEOPLE_LOCK_SCREEN_OPTIONS_LOCK},
1334       {"multideviceForgetDeviceDisconnect",
1335        IDS_SETTINGS_MULTIDEVICE_FORGET_THIS_DEVICE_DISCONNECT},
1336   };
1337   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
1338 
1339   html_source->AddString(
1340       "multideviceForgetDeviceSummary",
1341       ui::SubstituteChromeOSDeviceType(
1342           IDS_SETTINGS_MULTIDEVICE_FORGET_THIS_DEVICE_EXPLANATION));
1343   html_source->AddString(
1344       "multideviceForgetDeviceDialogMessage",
1345       ui::SubstituteChromeOSDeviceType(
1346           IDS_SETTINGS_MULTIDEVICE_FORGET_DEVICE_DIALOG_MESSAGE));
1347   html_source->AddString(
1348       "multideviceVerificationText",
1349       l10n_util::GetStringFUTF16(
1350           IDS_SETTINGS_MULTIDEVICE_VERIFICATION_TEXT,
1351           base::UTF8ToUTF16(
1352               chromeos::multidevice_setup::
1353                   GetBoardSpecificBetterTogetherSuiteLearnMoreUrl()
1354                       .spec())));
1355   html_source->AddString(
1356       "multideviceSetupSummary",
1357       l10n_util::GetStringFUTF16(
1358           IDS_SETTINGS_MULTIDEVICE_SETUP_SUMMARY, ui::GetChromeOSDeviceName(),
1359           base::UTF8ToUTF16(
1360               chromeos::multidevice_setup::
1361                   GetBoardSpecificBetterTogetherSuiteLearnMoreUrl()
1362                       .spec())));
1363   html_source->AddString(
1364       "multideviceNoHostText",
1365       l10n_util::GetStringFUTF16(
1366           IDS_SETTINGS_MULTIDEVICE_NO_ELIGIBLE_HOSTS,
1367           base::UTF8ToUTF16(
1368               chromeos::multidevice_setup::
1369                   GetBoardSpecificBetterTogetherSuiteLearnMoreUrl()
1370                       .spec())));
1371   html_source->AddString(
1372       "multideviceAndroidMessagesItemSummary",
1373       l10n_util::GetStringFUTF16(
1374           IDS_SETTINGS_MULTIDEVICE_ANDROID_MESSAGES_SUMMARY,
1375           ui::GetChromeOSDeviceName(),
1376           base::UTF8ToUTF16(chromeos::multidevice_setup::
1377                                 GetBoardSpecificMessagesLearnMoreUrl()
1378                                     .spec())));
1379   html_source->AddString(
1380       "multideviceSmartLockItemSummary",
1381       l10n_util::GetStringFUTF16(
1382           IDS_SETTINGS_MULTIDEVICE_SMART_LOCK_SUMMARY,
1383           ui::GetChromeOSDeviceName(),
1384           GetHelpUrlWithBoard(chrome::kEasyUnlockLearnMoreUrl)));
1385 
1386   AddEasyUnlockStrings(html_source);
1387 }
1388 
AddKerberosAccountsPageStrings(content::WebUIDataSource * html_source)1389 void AddKerberosAccountsPageStrings(content::WebUIDataSource* html_source) {
1390   static constexpr webui::LocalizedString kLocalizedStrings[] = {
1391       {"kerberosAccountsAddAccountLabel",
1392        IDS_SETTINGS_KERBEROS_ACCOUNTS_ADD_ACCOUNT_LABEL},
1393       {"kerberosAccountsRefreshNowLabel",
1394        IDS_SETTINGS_KERBEROS_ACCOUNTS_REFRESH_NOW_LABEL},
1395       {"kerberosAccountsSetAsActiveAccountLabel",
1396        IDS_SETTINGS_KERBEROS_ACCOUNTS_SET_AS_ACTIVE_ACCOUNT_LABEL},
1397       {"kerberosAccountsSignedOut", IDS_SETTINGS_KERBEROS_ACCOUNTS_SIGNED_OUT},
1398       {"kerberosAccountsListHeader",
1399        IDS_SETTINGS_KERBEROS_ACCOUNTS_LIST_HEADER},
1400       {"kerberosAccountsRemoveAccountLabel",
1401        IDS_SETTINGS_KERBEROS_ACCOUNTS_REMOVE_ACCOUNT_LABEL},
1402       {"kerberosAccountsReauthenticationLabel",
1403        IDS_SETTINGS_KERBEROS_ACCOUNTS_REAUTHENTICATION_LABEL},
1404       {"kerberosAccountsTicketActive",
1405        IDS_SETTINGS_KERBEROS_ACCOUNTS_TICKET_ACTIVE},
1406       {"kerberosAccountsAccountRemovedTip",
1407        IDS_SETTINGS_KERBEROS_ACCOUNTS_ACCOUNT_REMOVED_TIP},
1408       {"kerberosAccountsAccountRefreshedTip",
1409        IDS_SETTINGS_KERBEROS_ACCOUNTS_ACCOUNT_REFRESHED_TIP},
1410       {"kerberosAccountsSignedIn", IDS_SETTINGS_KERBEROS_ACCOUNTS_SIGNED_IN},
1411   };
1412   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
1413 
1414   PrefService* local_state = g_browser_process->local_state();
1415 
1416   // Whether new Kerberos accounts may be added.
1417   html_source->AddBoolean(
1418       "kerberosAddAccountsAllowed",
1419       local_state->GetBoolean(prefs::kKerberosAddAccountsAllowed));
1420 
1421   // Kerberos accounts page with "Learn more" link.
1422   html_source->AddString(
1423       "kerberosAccountsDescription",
1424       l10n_util::GetStringFUTF16(
1425           IDS_SETTINGS_KERBEROS_ACCOUNTS_DESCRIPTION,
1426           GetHelpUrlWithBoard(chrome::kKerberosAccountsLearnMoreURL)));
1427 }
1428 
AddKerberosAddAccountDialogStrings(content::WebUIDataSource * html_source)1429 void AddKerberosAddAccountDialogStrings(content::WebUIDataSource* html_source) {
1430   static constexpr webui::LocalizedString kLocalizedStrings[] = {
1431       {"kerberosAccountsAdvancedConfigLabel",
1432        IDS_SETTINGS_KERBEROS_ACCOUNTS_ADVANCED_CONFIG_LABEL},
1433       {"kerberosAdvancedConfigTitle",
1434        IDS_SETTINGS_KERBEROS_ADVANCED_CONFIG_TITLE},
1435       {"kerberosAdvancedConfigDesc",
1436        IDS_SETTINGS_KERBEROS_ADVANCED_CONFIG_DESC},
1437       {"addKerberosAccountRememberPassword",
1438        IDS_SETTINGS_ADD_KERBEROS_ACCOUNT_REMEMBER_PASSWORD},
1439       {"kerberosPassword", IDS_SETTINGS_KERBEROS_PASSWORD},
1440       {"kerberosUsername", IDS_SETTINGS_KERBEROS_USERNAME},
1441       {"addKerberosAccountDescription",
1442        IDS_SETTINGS_ADD_KERBEROS_ACCOUNT_DESCRIPTION},
1443       {"kerberosErrorNetworkProblem",
1444        IDS_SETTINGS_KERBEROS_ERROR_NETWORK_PROBLEM},
1445       {"kerberosErrorUsernameInvalid",
1446        IDS_SETTINGS_KERBEROS_ERROR_USERNAME_INVALID},
1447       {"kerberosErrorUsernameUnknown",
1448        IDS_SETTINGS_KERBEROS_ERROR_USERNAME_UNKNOWN},
1449       {"kerberosErrorDuplicatePrincipalName",
1450        IDS_SETTINGS_KERBEROS_ERROR_DUPLICATE_PRINCIPAL_NAME},
1451       {"kerberosErrorContactingServer",
1452        IDS_SETTINGS_KERBEROS_ERROR_CONTACTING_SERVER},
1453       {"kerberosErrorPasswordInvalid",
1454        IDS_SETTINGS_KERBEROS_ERROR_PASSWORD_INVALID},
1455       {"kerberosErrorPasswordExpired",
1456        IDS_SETTINGS_KERBEROS_ERROR_PASSWORD_EXPIRED},
1457       {"kerberosErrorKdcEncType", IDS_SETTINGS_KERBEROS_ERROR_KDC_ENC_TYPE},
1458       {"kerberosErrorGeneral", IDS_SETTINGS_KERBEROS_ERROR_GENERAL},
1459       {"kerberosConfigErrorSectionNestedInGroup",
1460        IDS_SETTINGS_KERBEROS_CONFIG_ERROR_SECTION_NESTED_IN_GROUP},
1461       {"kerberosConfigErrorSectionSyntax",
1462        IDS_SETTINGS_KERBEROS_CONFIG_ERROR_SECTION_SYNTAX},
1463       {"kerberosConfigErrorExpectedOpeningCurlyBrace",
1464        IDS_SETTINGS_KERBEROS_CONFIG_ERROR_EXPECTED_OPENING_CURLY_BRACE},
1465       {"kerberosConfigErrorExtraCurlyBrace",
1466        IDS_SETTINGS_KERBEROS_CONFIG_ERROR_EXTRA_CURLY_BRACE},
1467       {"kerberosConfigErrorRelationSyntax",
1468        IDS_SETTINGS_KERBEROS_CONFIG_ERROR_RELATION_SYNTAX_ERROR},
1469       {"kerberosConfigErrorKeyNotSupported",
1470        IDS_SETTINGS_KERBEROS_CONFIG_ERROR_KEY_NOT_SUPPORTED},
1471       {"kerberosConfigErrorSectionNotSupported",
1472        IDS_SETTINGS_KERBEROS_CONFIG_ERROR_SECTION_NOT_SUPPORTED},
1473       {"kerberosConfigErrorKrb5FailedToParse",
1474        IDS_SETTINGS_KERBEROS_CONFIG_ERROR_KRB5_FAILED_TO_PARSE},
1475       {"addKerberosAccountRefreshButtonLabel",
1476        IDS_SETTINGS_ADD_KERBEROS_ACCOUNT_REFRESH_BUTTON_LABEL},
1477       {"addKerberosAccount", IDS_SETTINGS_ADD_KERBEROS_ACCOUNT},
1478       {"refreshKerberosAccount", IDS_SETTINGS_REFRESH_KERBEROS_ACCOUNT},
1479   };
1480   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
1481 
1482   PrefService* local_state = g_browser_process->local_state();
1483 
1484   // Whether the 'Remember password' checkbox is enabled.
1485   html_source->AddBoolean(
1486       "kerberosRememberPasswordEnabled",
1487       local_state->GetBoolean(prefs::kKerberosRememberPasswordEnabled));
1488 
1489   // Kerberos default configuration.
1490   html_source->AddString(
1491       "defaultKerberosConfig",
1492       chromeos::KerberosCredentialsManager::GetDefaultKerberosConfig());
1493 }
1494 
AddLockScreenPageStrings(content::WebUIDataSource * html_source)1495 void AddLockScreenPageStrings(content::WebUIDataSource* html_source) {
1496   static constexpr webui::LocalizedString kLocalizedStrings[] = {
1497       {"lockScreenNotificationTitle",
1498        IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_TITLE},
1499       {"lockScreenNotificationHideSensitive",
1500        IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_HIDE_SENSITIVE},
1501       {"enableScreenlock", IDS_SETTINGS_PEOPLE_ENABLE_SCREENLOCK},
1502       {"lockScreenNotificationShow",
1503        IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_SHOW},
1504       {"lockScreenPinOrPassword",
1505        IDS_SETTINGS_PEOPLE_LOCK_SCREEN_PIN_OR_PASSWORD},
1506       {"lockScreenSetupFingerprintButton",
1507        IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_SETUP_BUTTON},
1508       {"lockScreenNotificationHide",
1509        IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_HIDE},
1510       {"lockScreenEditFingerprints",
1511        IDS_SETTINGS_PEOPLE_LOCK_SCREEN_EDIT_FINGERPRINTS},
1512       {"lockScreenPasswordOnly", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_PASSWORD_ONLY},
1513       {"lockScreenChangePinButton",
1514        IDS_SETTINGS_PEOPLE_LOCK_SCREEN_CHANGE_PIN_BUTTON},
1515       {"lockScreenEditFingerprintsDescription",
1516        IDS_SETTINGS_PEOPLE_LOCK_SCREEN_EDIT_FINGERPRINTS_DESCRIPTION},
1517       {"lockScreenNumberFingerprints",
1518        IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NUM_FINGERPRINTS},
1519       {"lockScreenNone", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NONE},
1520       {"lockScreenFingerprintNewName",
1521        IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NEW_FINGERPRINT_DEFAULT_NAME},
1522       {"lockScreenDeleteFingerprintLabel",
1523        IDS_SETTINGS_PEOPLE_LOCK_SCREEN_DELETE_FINGERPRINT_ARIA_LABEL},
1524       {"lockScreenOptionsLock", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_OPTIONS_LOCK},
1525       {"lockScreenOptionsLoginLock",
1526        IDS_SETTINGS_PEOPLE_LOCK_SCREEN_OPTIONS_LOGIN_LOCK},
1527       {"lockScreenSetupPinButton",
1528        IDS_SETTINGS_PEOPLE_LOCK_SCREEN_SETUP_PIN_BUTTON},
1529       {"lockScreenTitleLock", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_TITLE_LOCK},
1530       {"lockScreenTitleLoginLock",
1531        IDS_SETTINGS_PEOPLE_LOCK_SCREEN_TITLE_LOGIN_LOCK},
1532       {"passwordPromptEnterPasswordLock",
1533        IDS_SETTINGS_PEOPLE_PASSWORD_PROMPT_ENTER_PASSWORD_LOCK},
1534       {"passwordPromptEnterPasswordLoginLock",
1535        IDS_SETTINGS_PEOPLE_PASSWORD_PROMPT_ENTER_PASSWORD_LOGIN_LOCK},
1536   };
1537   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
1538 }
1539 
AddUsersStrings(content::WebUIDataSource * html_source)1540 void AddUsersStrings(content::WebUIDataSource* html_source) {
1541   static constexpr webui::LocalizedString kLocalizedStrings[] = {
1542       {"usersModifiedByOwnerLabel", IDS_SETTINGS_USERS_MODIFIED_BY_OWNER_LABEL},
1543       {"guestBrowsingLabel", IDS_SETTINGS_USERS_GUEST_BROWSING_LABEL},
1544       {"settingsManagedLabel", IDS_SETTINGS_USERS_MANAGED_LABEL},
1545       {"showOnSigninLabel", IDS_SETTINGS_USERS_SHOW_ON_SIGNIN_LABEL},
1546       {"restrictSigninLabel", IDS_SETTINGS_USERS_RESTRICT_SIGNIN_LABEL},
1547       {"deviceOwnerLabel", IDS_SETTINGS_USERS_DEVICE_OWNER_LABEL},
1548       {"removeUserTooltip", IDS_SETTINGS_USERS_REMOVE_USER_TOOLTIP},
1549       {"addUsers", IDS_SETTINGS_USERS_ADD_USERS},
1550       {"addUsersEmail", IDS_SETTINGS_USERS_ADD_USERS_EMAIL},
1551       {"userExistsError", IDS_SETTINGS_USER_EXISTS_ERROR},
1552   };
1553   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
1554 }
1555 
AddGoogleAssistantStrings(content::WebUIDataSource * html_source,Profile * profile)1556 void AddGoogleAssistantStrings(content::WebUIDataSource* html_source,
1557                                Profile* profile) {
1558   static constexpr webui::LocalizedString kLocalizedStrings[] = {
1559       {"googleAssistantPageTitle", IDS_SETTINGS_GOOGLE_ASSISTANT},
1560       {"googleAssistantEnableContext", IDS_ASSISTANT_SCREEN_CONTEXT_TITLE},
1561       {"googleAssistantEnableContextDescription",
1562        IDS_ASSISTANT_SCREEN_CONTEXT_DESC},
1563       {"googleAssistantEnableHotword",
1564        IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD},
1565       {"googleAssistantEnableHotwordDescription",
1566        IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_DESCRIPTION},
1567       {"googleAssistantVoiceSettings",
1568        IDS_SETTINGS_GOOGLE_ASSISTANT_VOICE_SETTINGS},
1569       {"googleAssistantVoiceSettingsDescription",
1570        IDS_ASSISTANT_VOICE_MATCH_RECORDING},
1571       {"googleAssistantVoiceSettingsRetrainButton",
1572        IDS_SETTINGS_GOOGLE_ASSISTANT_VOICE_SETTINGS_RETRAIN},
1573       {"googleAssistantEnableHotwordWithoutDspDescription",
1574        IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_WITHOUT_DSP_DESCRIPTION},
1575       {"googleAssistantEnableHotwordWithoutDspRecommended",
1576        IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_WITHOUT_DSP_RECOMMENDED},
1577       {"googleAssistantEnableHotwordWithoutDspAlwaysOn",
1578        IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_WITHOUT_DSP_ALWAYS_ON},
1579       {"googleAssistantEnableHotwordWithoutDspOff",
1580        IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_WITHOUT_DSP_OFF},
1581       {"googleAssistantEnableNotification",
1582        IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_NOTIFICATION},
1583       {"googleAssistantEnableNotificationDescription",
1584        IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_NOTIFICATION_DESCRIPTION},
1585       {"googleAssistantLaunchWithMicOpen",
1586        IDS_SETTINGS_GOOGLE_ASSISTANT_LAUNCH_WITH_MIC_OPEN},
1587       {"googleAssistantLaunchWithMicOpenDescription",
1588        IDS_SETTINGS_GOOGLE_ASSISTANT_LAUNCH_WITH_MIC_OPEN_DESCRIPTION},
1589       {"googleAssistantSettings", IDS_SETTINGS_GOOGLE_ASSISTANT_SETTINGS},
1590   };
1591   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
1592 
1593   html_source->AddBoolean("hotwordDspAvailable",
1594                           chromeos::IsHotwordDspAvailable());
1595   html_source->AddBoolean(
1596       "voiceMatchDisabled",
1597       chromeos::assistant::features::IsVoiceMatchDisabled());
1598 }
1599 
AddPrintingStrings(content::WebUIDataSource * html_source)1600 void AddPrintingStrings(content::WebUIDataSource* html_source) {
1601   static constexpr webui::LocalizedString kLocalizedStrings[] = {
1602       {"printingPageTitle", IDS_SETTINGS_PRINTING},
1603       {"cupsPrintersTitle", IDS_SETTINGS_PRINTING_CUPS_PRINTERS},
1604       {"cupsPrintersLearnMoreLabel",
1605        IDS_SETTINGS_PRINTING_CUPS_PRINTERS_LEARN_MORE_LABEL},
1606       {"addCupsPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_ADD_PRINTER},
1607       {"editPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_EDIT},
1608       {"removePrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_REMOVE},
1609       {"setupPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTER_SETUP_BUTTON},
1610       {"setupPrinterAria",
1611        IDS_SETTINGS_PRINTING_CUPS_PRINTER_SETUP_BUTTON_ARIA},
1612       {"savePrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTER_SAVE_BUTTON},
1613       {"savePrinterAria", IDS_SETTINGS_PRINTING_CUPS_PRINTER_SAVE_BUTTON_ARIA},
1614       {"searchLabel", IDS_SETTINGS_PRINTING_CUPS_SEARCH_LABEL},
1615       {"noSearchResults", IDS_SEARCH_NO_RESULTS},
1616       {"printerDetailsTitle", IDS_SETTINGS_PRINTING_CUPS_PRINTER_DETAILS_TITLE},
1617       {"printerName", IDS_SETTINGS_PRINTING_CUPS_PRINTER_DETAILS_NAME},
1618       {"printerModel", IDS_SETTINGS_PRINTING_CUPS_PRINTER_DETAILS_MODEL},
1619       {"printerQueue", IDS_SETTINGS_PRINTING_CUPS_PRINTER_DETAILS_QUEUE},
1620       {"savedPrintersTitle", IDS_SETTINGS_PRINTING_CUPS_SAVED_PRINTERS_TITLE},
1621       {"savedPrintersCountMany",
1622        IDS_SETTINGS_PRINTING_CUPS_PRINTERS_SAVED_PRINTERS_COUNT_MANY},
1623       {"savedPrintersCountOne",
1624        IDS_SETTINGS_PRINTING_CUPS_PRINTERS_SAVED_PRINTERS_COUNT_ONE},
1625       {"savedPrintersCountNone",
1626        IDS_SETTINGS_PRINTING_CUPS_PRINTERS_SAVED_PRINTERS_COUNT_NONE},
1627       {"showMorePrinters", IDS_SETTINGS_PRINTING_CUPS_SHOW_MORE},
1628       {"addPrintersNearbyTitle",
1629        IDS_SETTINGS_PRINTING_CUPS_ADD_PRINTERS_NEARBY_TITLE},
1630       {"addPrintersManuallyTitle",
1631        IDS_SETTINGS_PRINTING_CUPS_ADD_PRINTERS_MANUALLY_TITLE},
1632       {"manufacturerAndModelDialogTitle",
1633        IDS_SETTINGS_PRINTING_CUPS_SELECT_MANUFACTURER_AND_MODEL_TITLE},
1634       {"nearbyPrintersListTitle",
1635        IDS_SETTINGS_PRINTING_CUPS_PRINTERS_AVAILABLE_PRINTERS},
1636       {"nearbyPrintersCountMany",
1637        IDS_SETTINGS_PRINTING_CUPS_PRINTERS_AVAILABLE_PRINTERS_COUNT_MANY},
1638       {"nearbyPrintersCountOne",
1639        IDS_SETTINGS_PRINTING_CUPS_PRINTERS_AVAILABLE_PRINTER_COUNT_ONE},
1640       {"nearbyPrintersCountNone",
1641        IDS_SETTINGS_PRINTING_CUPS_PRINTERS_AVAILABLE_PRINTER_COUNT_NONE},
1642       {"nearbyPrintersListDescription",
1643        IDS_SETTINGS_PRINTING_CUPS_PRINTERS_ADD_DETECTED_OR_NEW_PRINTER},
1644       {"manufacturerAndModelAdditionalInformation",
1645        IDS_SETTINGS_PRINTING_CUPS_MANUFACTURER_MODEL_ADDITIONAL_INFORMATION},
1646       {"addPrinterButtonText",
1647        IDS_SETTINGS_PRINTING_CUPS_ADD_PRINTER_BUTTON_ADD},
1648       {"printerDetailsAdvanced", IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADVANCED},
1649       {"printerDetailsA11yLabel",
1650        IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADVANCED_ACCESSIBILITY_LABEL},
1651       {"printerAddress", IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADVANCED_ADDRESS},
1652       {"printerProtocol", IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADVANCED_PROTOCOL},
1653       {"printerURI", IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADVANCED_URI},
1654       {"manuallyAddPrinterButtonText",
1655        IDS_SETTINGS_PRINTING_CUPS_ADD_PRINTER_BUTTON_MANUAL_ADD},
1656       {"discoverPrintersButtonText",
1657        IDS_SETTINGS_PRINTING_CUPS_ADD_PRINTER_BUTTON_DISCOVER_PRINTERS},
1658       {"printerProtocolIpp", IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_IPP},
1659       {"printerProtocolIpps", IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_IPPS},
1660       {"printerProtocolHttp", IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_HTTP},
1661       {"printerProtocolHttps",
1662        IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_HTTPS},
1663       {"printerProtocolAppSocket",
1664        IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_APP_SOCKET},
1665       {"printerProtocolLpd", IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_LPD},
1666       {"printerProtocolUsb", IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_USB},
1667       {"printerProtocolIppUsb",
1668        IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_IPPUSB},
1669       {"printerConfiguringMessage",
1670        IDS_SETTINGS_PRINTING_CUPS_PRINTER_CONFIGURING_MESSAGE},
1671       {"printerManufacturer", IDS_SETTINGS_PRINTING_CUPS_PRINTER_MANUFACTURER},
1672       {"selectDriver", IDS_SETTINGS_PRINTING_CUPS_PRINTER_SELECT_DRIVER},
1673       {"selectDriverButtonText",
1674        IDS_SETTINGS_PRINTING_CUPS_PRINTER_BUTTON_SELECT_DRIVER},
1675       {"selectDriverButtonAriaLabel",
1676        IDS_SETTINGS_PRINTING_CUPS_PRINTER_BUTTON_SELECT_DRIVER_ARIA_LABEL},
1677       {"selectDriverErrorMessage",
1678        IDS_SETTINGS_PRINTING_CUPS_PRINTER_INVALID_DRIVER},
1679       {"printerAddedSuccessfulMessage",
1680        IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_DONE_MESSAGE},
1681       {"printerEditedSuccessfulMessage",
1682        IDS_SETTINGS_PRINTING_CUPS_PRINTER_EDITED_PRINTER_DONE_MESSAGE},
1683       {"printerUnavailableMessage",
1684        IDS_SETTINGS_PRINTING_CUPS_PRINTER_UNAVAILABLE_MESSAGE},
1685       {"noPrinterNearbyMessage",
1686        IDS_SETTINGS_PRINTING_CUPS_PRINTER_NO_PRINTER_NEARBY},
1687       {"searchingNearbyPrinters",
1688        IDS_SETTINGS_PRINTING_CUPS_PRINTER_SEARCHING_NEARBY_PRINTER},
1689       {"printerAddedFailedMessage",
1690        IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_ERROR_MESSAGE},
1691       {"printerAddedFatalErrorMessage",
1692        IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_FATAL_ERROR_MESSAGE},
1693       {"printerAddedUnreachableMessage",
1694        IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_PRINTER_UNREACHABLE_MESSAGE},
1695       {"printerAddedPpdTooLargeMessage",
1696        IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_PPD_TOO_LARGE_MESSAGE},
1697       {"printerAddedInvalidPpdMessage",
1698        IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_INVALID_PPD_MESSAGE},
1699       {"printerAddedPpdNotFoundMessage",
1700        IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_PPD_NOT_FOUND},
1701       {"printerAddedPpdUnretrievableMessage",
1702        IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_PPD_UNRETRIEVABLE},
1703       {"printerAddedNativePrintersNotAllowedMessage",
1704        IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_NATIVE_PRINTERS_NOT_ALLOWED_MESSAGE},
1705       {"editPrinterInvalidPrinterUpdate",
1706        IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_INVALID_PRINTER_UPDATE},
1707       {"requireNetworkMessage",
1708        IDS_SETTINGS_PRINTING_CUPS_PRINTER_REQUIRE_INTERNET_MESSAGE},
1709       {"checkNetworkMessage",
1710        IDS_SETTINGS_PRINTING_CUPS_PRINTER_CHECK_CONNECTION_MESSAGE},
1711       {"noInternetConnection",
1712        IDS_SETTINGS_PRINTING_CUPS_PRINTER_NO_INTERNET_CONNECTION},
1713       {"checkNetworkAndTryAgain",
1714        IDS_SETTINGS_PRINTING_CUPS_PRINTER_CONNECT_TO_NETWORK_SUBTEXT},
1715       {"editPrinterDialogTitle",
1716        IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_DIALOG_TITLE},
1717       {"editPrinterButtonText", IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_BUTTON},
1718       {"currentPpdMessage",
1719        IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_CURRENT_PPD_MESSAGE},
1720       {"printerEulaNotice", IDS_SETTINGS_PRINTING_CUPS_EULA_NOTICE},
1721       {"ippPrinterUnreachable", IDS_SETTINGS_PRINTING_CUPS_IPP_URI_UNREACHABLE},
1722       {"generalPrinterDialogError",
1723        IDS_SETTINGS_PRINTING_CUPS_DIALOG_GENERAL_ERROR},
1724       {"printServerButtonText", IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER},
1725       {"addPrintServerTitle",
1726        IDS_SETTINGS_PRINTING_CUPS_ADD_PRINT_SERVER_TITLE},
1727       {"printServerAddress", IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_ADDRESS},
1728       {"printServerFoundZeroPrinters",
1729        IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_FOUND_ZERO_PRINTERS},
1730       {"printServerFoundOnePrinter",
1731        IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_FOUND_ONE_PRINTER},
1732       {"printServerFoundManyPrinters",
1733        IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_FOUND_MANY_PRINTERS},
1734       {"printServerInvalidUrlAddress",
1735        IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_INVALID_URL_ADDRESS},
1736       {"printServerConnectionError",
1737        IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_CONNECTION_ERROR},
1738       {"printServerConfigurationErrorMessage",
1739        IDS_SETTINGS_PRINTING_CUPS_PRINT_SERVER_REACHABLE_BUT_CANNOT_ADD},
1740   };
1741   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
1742 
1743   html_source->AddString("printingCUPSPrintLearnMoreUrl",
1744                          GetHelpUrlWithBoard(chrome::kCupsPrintLearnMoreURL));
1745   html_source->AddString(
1746       "printingCUPSPrintPpdLearnMoreUrl",
1747       GetHelpUrlWithBoard(chrome::kCupsPrintPPDLearnMoreURL));
1748   html_source->AddBoolean(
1749       "consumerPrintServerUiEnabled",
1750       base::FeatureList::IsEnabled(::features::kPrintServerUi));
1751 }
1752 
AddSearchInSettingsStrings(content::WebUIDataSource * html_source)1753 void AddSearchInSettingsStrings(content::WebUIDataSource* html_source) {
1754   static constexpr webui::LocalizedString kLocalizedStrings[] = {
1755       {"searchPrompt", IDS_SETTINGS_SEARCH_PROMPT},
1756       {"searchNoResults", IDS_SEARCH_NO_RESULTS},
1757       {"searchResults", IDS_SEARCH_RESULTS},
1758       // TODO(dpapad): IDS_DOWNLOAD_CLEAR_SEARCH and IDS_HISTORY_CLEAR_SEARCH
1759       // are identical, merge them to one and re-use here.
1760       {"clearSearch", IDS_DOWNLOAD_CLEAR_SEARCH},
1761   };
1762   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
1763 
1764   html_source->AddString(
1765       "searchNoOsResultsHelp",
1766       l10n_util::GetStringFUTF16(
1767           IDS_SETTINGS_SEARCH_NO_RESULTS_HELP,
1768           base::ASCIIToUTF16(chrome::kOsSettingsSearchHelpURL)));
1769 
1770   html_source->AddBoolean(
1771       "newOsSettingsSearch",
1772       base::FeatureList::IsEnabled(chromeos::features::kNewOsSettingsSearch));
1773 }
1774 
AddDateTimeStrings(content::WebUIDataSource * html_source)1775 void AddDateTimeStrings(content::WebUIDataSource* html_source) {
1776   static constexpr webui::LocalizedString kLocalizedStrings[] = {
1777       {"dateTimePageTitle", IDS_SETTINGS_DATE_TIME},
1778       {"timeZone", IDS_SETTINGS_TIME_ZONE},
1779       {"selectTimeZoneResolveMethod",
1780        IDS_SETTINGS_SELECT_TIME_ZONE_RESOLVE_METHOD},
1781       {"timeZoneGeolocation", IDS_SETTINGS_TIME_ZONE_GEOLOCATION},
1782       {"timeZoneButton", IDS_SETTINGS_TIME_ZONE_BUTTON},
1783       {"timeZoneSubpageTitle", IDS_SETTINGS_TIME_ZONE_SUBPAGE_TITLE},
1784       {"setTimeZoneAutomaticallyDisabled",
1785        IDS_SETTINGS_TIME_ZONE_DETECTION_MODE_DISABLED},
1786       {"setTimeZoneAutomaticallyOn",
1787        IDS_SETTINGS_TIME_ZONE_DETECTION_SET_AUTOMATICALLY},
1788       {"setTimeZoneAutomaticallyOff",
1789        IDS_SETTINGS_TIME_ZONE_DETECTION_CHOOSE_FROM_LIST},
1790       {"setTimeZoneAutomaticallyIpOnlyDefault",
1791        IDS_SETTINGS_TIME_ZONE_DETECTION_MODE_IP_ONLY_DEFAULT},
1792       {"setTimeZoneAutomaticallyWithWiFiAccessPointsData",
1793        IDS_SETTINGS_TIME_ZONE_DETECTION_MODE_SEND_WIFI_AP},
1794       {"setTimeZoneAutomaticallyWithAllLocationInfo",
1795        IDS_SETTINGS_TIME_ZONE_DETECTION_MODE_SEND_ALL_INFO},
1796       {"use24HourClock", IDS_SETTINGS_USE_24_HOUR_CLOCK},
1797       {"setDateTime", IDS_SETTINGS_SET_DATE_TIME},
1798   };
1799   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
1800 
1801   html_source->AddString(
1802       "timeZoneSettingsLearnMoreURL",
1803       base::ASCIIToUTF16(base::StringPrintf(
1804           chrome::kTimeZoneSettingsLearnMoreURL,
1805           g_browser_process->GetApplicationLocale().c_str())));
1806 }
1807 
AddAboutStrings(content::WebUIDataSource * html_source,Profile * profile)1808 void AddAboutStrings(content::WebUIDataSource* html_source, Profile* profile) {
1809   // Top level About page strings.
1810   static constexpr webui::LocalizedString kLocalizedStrings[] = {
1811     {"aboutProductLogoAlt", IDS_SHORT_PRODUCT_LOGO_ALT_TEXT},
1812 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
1813     {"aboutReportAnIssue", IDS_SETTINGS_ABOUT_PAGE_REPORT_AN_ISSUE},
1814 #endif
1815     {"aboutRelaunch", IDS_SETTINGS_ABOUT_PAGE_RELAUNCH},
1816     {"aboutUpgradeCheckStarted", IDS_SETTINGS_ABOUT_UPGRADE_CHECK_STARTED},
1817     {"aboutUpgradeRelaunch", IDS_SETTINGS_UPGRADE_SUCCESSFUL_RELAUNCH},
1818     {"aboutUpgradeUpdating", IDS_SETTINGS_UPGRADE_UPDATING},
1819     {"aboutUpgradeUpdatingPercent", IDS_SETTINGS_UPGRADE_UPDATING_PERCENT},
1820     {"aboutGetHelpUsingChrome", IDS_SETTINGS_GET_HELP_USING_CHROME},
1821     {"aboutPageTitle", IDS_SETTINGS_ABOUT_PROGRAM},
1822     {"aboutProductTitle", IDS_PRODUCT_NAME},
1823 
1824     {"aboutEndOfLifeTitle", IDS_SETTINGS_ABOUT_PAGE_END_OF_LIFE_TITLE},
1825     {"aboutRelaunchAndPowerwash",
1826      IDS_SETTINGS_ABOUT_PAGE_RELAUNCH_AND_POWERWASH},
1827     {"aboutRollbackInProgress", IDS_SETTINGS_UPGRADE_ROLLBACK_IN_PROGRESS},
1828     {"aboutRollbackSuccess", IDS_SETTINGS_UPGRADE_ROLLBACK_SUCCESS},
1829     {"aboutUpgradeUpdatingChannelSwitch",
1830      IDS_SETTINGS_UPGRADE_UPDATING_CHANNEL_SWITCH},
1831     {"aboutUpgradeSuccessChannelSwitch",
1832      IDS_SETTINGS_UPGRADE_SUCCESSFUL_CHANNEL_SWITCH},
1833     {"aboutTPMFirmwareUpdateTitle",
1834      IDS_SETTINGS_ABOUT_TPM_FIRMWARE_UPDATE_TITLE},
1835     {"aboutTPMFirmwareUpdateDescription",
1836      IDS_SETTINGS_ABOUT_TPM_FIRMWARE_UPDATE_DESCRIPTION},
1837 
1838     // About page, channel switcher dialog.
1839     {"aboutChangeChannel", IDS_SETTINGS_ABOUT_PAGE_CHANGE_CHANNEL},
1840     {"aboutChangeChannelAndPowerwash",
1841      IDS_SETTINGS_ABOUT_PAGE_CHANGE_CHANNEL_AND_POWERWASH},
1842     {"aboutDelayedWarningMessage",
1843      IDS_SETTINGS_ABOUT_PAGE_DELAYED_WARNING_MESSAGE},
1844     {"aboutDelayedWarningTitle", IDS_SETTINGS_ABOUT_PAGE_DELAYED_WARNING_TITLE},
1845     {"aboutPowerwashWarningMessage",
1846      IDS_SETTINGS_ABOUT_PAGE_POWERWASH_WARNING_MESSAGE},
1847     {"aboutPowerwashWarningTitle",
1848      IDS_SETTINGS_ABOUT_PAGE_POWERWASH_WARNING_TITLE},
1849     {"aboutUnstableWarningMessage",
1850      IDS_SETTINGS_ABOUT_PAGE_UNSTABLE_WARNING_MESSAGE},
1851     {"aboutUnstableWarningTitle",
1852      IDS_SETTINGS_ABOUT_PAGE_UNSTABLE_WARNING_TITLE},
1853     {"aboutChannelDialogBeta", IDS_SETTINGS_ABOUT_PAGE_DIALOG_CHANNEL_BETA},
1854     {"aboutChannelDialogDev", IDS_SETTINGS_ABOUT_PAGE_DIALOG_CHANNEL_DEV},
1855     {"aboutChannelDialogStable", IDS_SETTINGS_ABOUT_PAGE_DIALOG_CHANNEL_STABLE},
1856 
1857     // About page, update warning dialog.
1858     {"aboutUpdateWarningMessage",
1859      IDS_SETTINGS_ABOUT_PAGE_UPDATE_WARNING_MESSAGE},
1860     {"aboutUpdateWarningTitle", IDS_SETTINGS_ABOUT_PAGE_UPDATE_WARNING_TITLE},
1861 
1862     // Detailed build information
1863     {"aboutBuildDetailsTitle", IDS_OS_SETTINGS_ABOUT_PAGE_BUILD_DETAILS},
1864     {"aboutChannelBeta", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_BETA},
1865     {"aboutChannelCanary", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_CANARY},
1866     {"aboutChannelDev", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_DEV},
1867     {"aboutChannelLabel", IDS_SETTINGS_ABOUT_PAGE_CHANNEL},
1868     {"aboutChannelStable", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_STABLE},
1869     {"aboutCheckForUpdates", IDS_SETTINGS_ABOUT_PAGE_CHECK_FOR_UPDATES},
1870     {"aboutCurrentlyOnChannel", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL},
1871     {"aboutDetailedBuildInfo", IDS_SETTINGS_ABOUT_PAGE_DETAILED_BUILD_INFO},
1872     {version_ui::kApplicationLabel, IDS_PRODUCT_NAME},
1873     {version_ui::kPlatform, IDS_PLATFORM_LABEL},
1874     {version_ui::kFirmwareVersion, IDS_VERSION_UI_FIRMWARE_VERSION},
1875     {version_ui::kARC, IDS_ARC_LABEL},
1876     {"aboutBuildDetailsCopyTooltipLabel",
1877      IDS_OS_SETTINGS_ABOUT_PAGE_BUILD_DETAILS_COPY_TOOLTIP_LABEL},
1878     {"aboutIsArcStatusTitle", IDS_OS_SETTINGS_ABOUT_ARC_STATUS_TITLE},
1879     {"aboutIsDeveloperModeTitle", IDS_OS_SETTINGS_ABOUT_DEVELOPER_MODE},
1880     {"isEnterpriseManagedTitle",
1881      IDS_OS_SETTINGS_ABOUT_PAGE_ENTERPRISE_ENNROLLED_TITLE},
1882     {"aboutOsPageTitle", IDS_SETTINGS_ABOUT_OS},
1883     {"aboutGetHelpUsingChromeOs", IDS_SETTINGS_GET_HELP_USING_CHROME_OS},
1884     {"aboutOsProductTitle", IDS_PRODUCT_OS_NAME},
1885     {"aboutReleaseNotesOffline", IDS_SETTINGS_ABOUT_PAGE_RELEASE_NOTES},
1886     {"aboutShowReleaseNotes", IDS_SETTINGS_ABOUT_PAGE_SHOW_RELEASE_NOTES},
1887   };
1888   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
1889 
1890   html_source->AddString("aboutTPMFirmwareUpdateLearnMoreURL",
1891                          chrome::kTPMFirmwareUpdateLearnMoreURL);
1892   html_source->AddString(
1893       "aboutUpgradeUpToDate",
1894       ui::SubstituteChromeOSDeviceType(IDS_SETTINGS_UPGRADE_UP_TO_DATE));
1895   html_source->AddString("managementPage",
1896                          ManagementUI::GetManagementPageSubtitle(profile));
1897 }
1898 
AddResetStrings(content::WebUIDataSource * html_source)1899 void AddResetStrings(content::WebUIDataSource* html_source) {
1900   static constexpr webui::LocalizedString kLocalizedStrings[] = {
1901       {"resetPageTitle", IDS_SETTINGS_RESET},
1902       {"powerwashTitle", IDS_SETTINGS_FACTORY_RESET},
1903       {"powerwashDialogTitle", IDS_SETTINGS_FACTORY_RESET_HEADING},
1904       {"powerwashDialogButton", IDS_SETTINGS_RESTART},
1905       {"powerwashButton", IDS_SETTINGS_FACTORY_RESET_BUTTON_LABEL},
1906       {"powerwashDialogExplanation", IDS_SETTINGS_FACTORY_RESET_WARNING},
1907       {"powerwashLearnMoreUrl", IDS_FACTORY_RESET_HELP_URL},
1908       {"powerwashButtonRoleDescription",
1909        IDS_SETTINGS_FACTORY_RESET_BUTTON_ROLE},
1910   };
1911   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
1912 
1913   html_source->AddString(
1914       "powerwashDescription",
1915       l10n_util::GetStringFUTF16(IDS_SETTINGS_FACTORY_RESET_DESCRIPTION,
1916                                  l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)));
1917 }
1918 
AddSearchStrings(content::WebUIDataSource * html_source,Profile * profile)1919 void AddSearchStrings(content::WebUIDataSource* html_source, Profile* profile) {
1920   static constexpr webui::LocalizedString kLocalizedStrings[] = {
1921       {"osSearchEngineLabel", IDS_OS_SETTINGS_SEARCH_ENGINE_LABEL},
1922       {"searchGoogleAssistant", IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT},
1923       {"searchGoogleAssistantEnabled",
1924        IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT_ENABLED},
1925       {"searchGoogleAssistantDisabled",
1926        IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT_DISABLED},
1927       {"searchGoogleAssistantOn", IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT_ON},
1928       {"searchGoogleAssistantOff", IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT_OFF},
1929   };
1930   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
1931 
1932   // NOTE: This will be false when the flag is disabled.
1933   const bool is_assistant_allowed =
1934       ::assistant::IsAssistantAllowedForProfile(profile) ==
1935       ash::mojom::AssistantAllowedState::ALLOWED;
1936   html_source->AddBoolean("isAssistantAllowed", is_assistant_allowed);
1937   html_source->AddLocalizedString("osSearchPageTitle",
1938                                   is_assistant_allowed
1939                                       ? IDS_SETTINGS_SEARCH_AND_ASSISTANT
1940                                       : IDS_SETTINGS_SEARCH);
1941   html_source->AddString("searchExplanation",
1942                          l10n_util::GetStringFUTF16(
1943                              IDS_SETTINGS_SEARCH_EXPLANATION,
1944                              base::ASCIIToUTF16(chrome::kOmniboxLearnMoreURL)));
1945   html_source->AddString(
1946       "osSearchEngineTooltip",
1947       ui::SubstituteChromeOSDeviceType(IDS_OS_SETTINGS_SEARCH_ENGINE_TOOLTIP));
1948 }
1949 
AddPrivacyStrings(content::WebUIDataSource * html_source)1950 void AddPrivacyStrings(content::WebUIDataSource* html_source) {
1951   static constexpr webui::LocalizedString kLocalizedStrings[] = {
1952       {"privacyPageTitle", IDS_SETTINGS_PRIVACY},
1953       {"enableLogging", IDS_SETTINGS_ENABLE_LOGGING_PREF},
1954       {"enableLoggingDesc", IDS_SETTINGS_ENABLE_LOGGING_PREF_DESC},
1955       {"wakeOnWifi", IDS_SETTINGS_WAKE_ON_WIFI_DESCRIPTION},
1956       {"enableContentProtectionAttestation",
1957        IDS_SETTINGS_ENABLE_CONTENT_PROTECTION_ATTESTATION},
1958   };
1959   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
1960 
1961   html_source->AddString("syncAndGoogleServicesLearnMoreURL",
1962                          chrome::kSyncAndGoogleServicesLearnMoreURL);
1963   ::settings::AddPersonalizationOptionsStrings(html_source);
1964 }
1965 
AddPeoplePageStrings(content::WebUIDataSource * html_source,Profile * profile)1966 void AddPeoplePageStrings(content::WebUIDataSource* html_source,
1967                           Profile* profile) {
1968   static constexpr webui::LocalizedString kLocalizedStrings[] = {
1969       {"osPeoplePageTitle", IDS_OS_SETTINGS_PEOPLE},
1970       {"accountManagerSubMenuLabel",
1971        IDS_SETTINGS_ACCOUNT_MANAGER_SUBMENU_LABEL},
1972       {"accountManagerPageTitle", IDS_SETTINGS_ACCOUNT_MANAGER_PAGE_TITLE},
1973       {"kerberosAccountsSubMenuLabel",
1974        IDS_SETTINGS_KERBEROS_ACCOUNTS_SUBMENU_LABEL},
1975       {"accountManagerPageTitle", IDS_SETTINGS_ACCOUNT_MANAGER_PAGE_TITLE},
1976       {"kerberosAccountsPageTitle", IDS_SETTINGS_KERBEROS_ACCOUNTS_PAGE_TITLE},
1977       {"lockScreenFingerprintTitle",
1978        IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_SUBPAGE_TITLE},
1979       {"manageOtherPeople", IDS_SETTINGS_PEOPLE_MANAGE_OTHER_PEOPLE},
1980       {"osSyncPageTitle", IDS_OS_SETTINGS_SYNC_PAGE_TITLE},
1981       {"syncAndNonPersonalizedServices",
1982        IDS_SETTINGS_SYNC_SYNC_AND_NON_PERSONALIZED_SERVICES},
1983       {"syncDisconnectConfirm", IDS_SETTINGS_SYNC_DISCONNECT_CONFIRM},
1984   };
1985   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
1986 
1987   // Toggles the Chrome OS Account Manager submenu in the People section.
1988   html_source->AddBoolean("isAccountManagerEnabled",
1989                           chromeos::IsAccountManagerAvailable(profile));
1990 
1991   if (chromeos::features::IsSplitSyncConsentEnabled()) {
1992     static constexpr webui::LocalizedString kTurnOffStrings[] = {
1993         {"syncDisconnect", IDS_SETTINGS_PEOPLE_SYNC_TURN_OFF},
1994         {"syncDisconnectTitle",
1995          IDS_SETTINGS_TURN_OFF_SYNC_AND_SIGN_OUT_DIALOG_TITLE},
1996     };
1997     AddLocalizedStringsBulk(html_source, kTurnOffStrings);
1998   } else {
1999     static constexpr webui::LocalizedString kSignOutStrings[] = {
2000         {"syncDisconnect", IDS_SETTINGS_PEOPLE_SIGN_OUT},
2001         {"syncDisconnectTitle", IDS_SETTINGS_SYNC_DISCONNECT_TITLE},
2002     };
2003     AddLocalizedStringsBulk(html_source, kSignOutStrings);
2004   }
2005 
2006   std::string sync_dashboard_url =
2007       google_util::AppendGoogleLocaleParam(
2008           GURL(chrome::kSyncGoogleDashboardURL),
2009           g_browser_process->GetApplicationLocale())
2010           .spec();
2011 
2012   html_source->AddString(
2013       "syncDisconnectExplanation",
2014       l10n_util::GetStringFUTF8(IDS_SETTINGS_SYNC_DISCONNECT_EXPLANATION,
2015                                 base::ASCIIToUTF16(sync_dashboard_url)));
2016 
2017   AddAccountManagerPageStrings(html_source);
2018   AddKerberosAccountsPageStrings(html_source);
2019   AddKerberosAddAccountDialogStrings(html_source);
2020   AddLockScreenPageStrings(html_source);
2021   AddFingerprintListStrings(html_source);
2022   AddFingerprintStrings(html_source);
2023   AddSetupFingerprintDialogStrings(html_source);
2024   AddSetupPinDialogStrings(html_source);
2025   AddSyncControlsStrings(html_source);
2026 
2027   ::settings::AddSyncControlsStrings(html_source);
2028   ::settings::AddSyncAccountControlStrings(html_source);
2029   ::settings::AddPasswordPromptDialogStrings(html_source);
2030   ::settings::AddSyncPageStrings(html_source);
2031 }
2032 
AddPageVisibilityStrings(content::WebUIDataSource * html_source)2033 void AddPageVisibilityStrings(content::WebUIDataSource* html_source) {
2034   PrefService* local_state = g_browser_process->local_state();
2035   // Toggles the Chrome OS Kerberos Accounts submenu in the People section.
2036   // Note that the handler is also dependent on this pref.
2037   html_source->AddBoolean("isKerberosEnabled",
2038                           local_state->GetBoolean(prefs::kKerberosEnabled));
2039 }
2040 
2041 }  // namespace
2042 
OsSettingsLocalizedStringsProvider(Profile * profile,local_search_service::mojom::LocalSearchService * local_search_service)2043 OsSettingsLocalizedStringsProvider::OsSettingsLocalizedStringsProvider(
2044     Profile* profile,
2045     local_search_service::mojom::LocalSearchService* local_search_service) {
2046   local_search_service->GetIndex(
2047       local_search_service::mojom::LocalSearchService::IndexId::CROS_SETTINGS,
2048       index_remote_.BindNewPipeAndPassReceiver());
2049 
2050   // Add per-page string providers.
2051   // TODO(khorimoto): Add providers for the remaining pages.
2052   per_page_providers_.push_back(
2053       std::make_unique<InternetStringsProvider>(profile, /*delegate=*/this));
2054 }
2055 
2056 OsSettingsLocalizedStringsProvider::~OsSettingsLocalizedStringsProvider() =
2057     default;
2058 
AddOsLocalizedStrings(content::WebUIDataSource * html_source,Profile * profile)2059 void OsSettingsLocalizedStringsProvider::AddOsLocalizedStrings(
2060     content::WebUIDataSource* html_source,
2061     Profile* profile) {
2062   for (const auto& per_page_provider : per_page_providers_)
2063     per_page_provider->AddUiStrings(html_source);
2064 
2065   // TODO(khorimoto): Migrate these to OsSettingsPerPageStringsProvider
2066   // instances.
2067   AddAboutStrings(html_source, profile);
2068   AddA11yStrings(html_source);
2069   AddAndroidAppStrings(html_source);
2070   AddAppManagementStrings(html_source);
2071   AddAppsStrings(html_source);
2072   AddBluetoothStrings(html_source);
2073   AddChromeOSUserStrings(html_source, profile);
2074   AddCommonStrings(html_source, profile);
2075   AddCrostiniStrings(html_source, profile);
2076   AddDateTimeStrings(html_source);
2077   AddDeviceStrings(html_source);
2078   AddFilesStrings(html_source);
2079   AddGoogleAssistantStrings(html_source, profile);
2080   AddLanguagesStrings(html_source);
2081   AddMultideviceStrings(html_source);
2082   AddParentalControlStrings(html_source, profile);
2083   AddPageVisibilityStrings(html_source);
2084   AddPeoplePageStrings(html_source, profile);
2085   AddPersonalizationStrings(html_source);
2086   AddPluginVmStrings(html_source, profile);
2087   AddPrintingStrings(html_source);
2088   AddPrivacyStrings(html_source);
2089   AddResetStrings(html_source);
2090   AddSearchInSettingsStrings(html_source);
2091   AddSearchStrings(html_source, profile);
2092   AddUsersStrings(html_source);
2093 
2094   policy_indicator::AddLocalizedStrings(html_source);
2095 
2096   html_source->UseStringsJs();
2097 }
2098 
2099 const SearchConcept*
GetCanonicalTagMetadata(int canonical_message_id) const2100 OsSettingsLocalizedStringsProvider::GetCanonicalTagMetadata(
2101     int canonical_message_id) const {
2102   const auto it = canonical_id_to_metadata_map_.find(canonical_message_id);
2103   if (it == canonical_id_to_metadata_map_.end())
2104     return nullptr;
2105   return it->second;
2106 }
2107 
Shutdown()2108 void OsSettingsLocalizedStringsProvider::Shutdown() {
2109   index_remote_.reset();
2110 }
2111 
AddSearchTags(const std::vector<SearchConcept> & tags_group)2112 void OsSettingsLocalizedStringsProvider::AddSearchTags(
2113     const std::vector<SearchConcept>& tags_group) {
2114   index_remote_->AddOrUpdate(ConceptVectorToDataPtrVector(tags_group),
2115                              /*callback=*/base::DoNothing());
2116 
2117   // Add each concept to the map. Note that it is safe to take the address of
2118   // each concept because all concepts are allocated via static
2119   // base::NoDestructor objects in the Get*SearchConcepts() helper functions.
2120   for (const auto& concept : tags_group)
2121     canonical_id_to_metadata_map_[concept.canonical_message_id] = &concept;
2122 }
2123 
RemoveSearchTags(const std::vector<SearchConcept> & tags_group)2124 void OsSettingsLocalizedStringsProvider::RemoveSearchTags(
2125     const std::vector<SearchConcept>& tags_group) {
2126   std::vector<std::string> ids;
2127   for (const auto& concept : tags_group) {
2128     canonical_id_to_metadata_map_.erase(concept.canonical_message_id);
2129     ids.push_back(base::NumberToString(concept.canonical_message_id));
2130   }
2131 
2132   index_remote_->Delete(ids, /*callback=*/base::DoNothing());
2133 }
2134 
2135 }  // namespace settings
2136 }  // namespace chromeos
2137