Commit 1f2b3e26 authored by Akihiro Ota's avatar Akihiro Ota Committed by Commit Bot

ChromeVox Tutorial: Localize all strings.

This change:
1. Adds logic to localize the practice area
2. Adds tutorial strings to chromevox_strings.grdp
3. Removes unused strings, such as those spoken after a key sequence
is pressed.
4. Removes the text fields lesson, which was initially added as a
proof-of-concept.
5. Removes practice area state announcements, which was also
initially added as proof-of-concept.

Bug: 1075752, 1143480
Change-Id: Ia564736023530b87a604d1e12164eda1ad96528a
AX-Relnotes: N/A
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2520168
Commit-Queue: Akihiro Ota <akihiroota@chromium.org>
Reviewed-by: default avatarDavid Tseng <dtseng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#825506}
parent 26ae35fd
...@@ -193,10 +193,8 @@ run_jsbundler("chromevox_copied_files") { ...@@ -193,10 +193,8 @@ run_jsbundler("chromevox_copied_files") {
"background/logging/log.css", "background/logging/log.css",
"background/logging/log.html", "background/logging/log.html",
"i_tutorial/components/tutorial_common.js", "i_tutorial/components/tutorial_common.js",
"i_tutorial/lessons/basic_navigation.html", "i_tutorial/practice_areas/jump_commands.html",
"i_tutorial/lessons/jump_commands.html", "i_tutorial/practice_areas/selects.html",
"i_tutorial/lessons/selects.html",
"i_tutorial/lessons/text_fields.html",
"images/chromevox-128.png", "images/chromevox-128.png",
"images/chromevox-16.png", "images/chromevox-16.png",
"images/chromevox-19.png", "images/chromevox-19.png",
......
...@@ -101,27 +101,32 @@ cr-button { ...@@ -101,27 +101,32 @@ cr-button {
<div id="mainMenu" <div id="mainMenu"
hidden$="[[ shouldHideMainMenu(activeScreen) ]]"> hidden$="[[ shouldHideMainMenu(activeScreen) ]]">
<h1 id="mainMenuHeader" tabindex="-1" aria-describedby="mainMenuHeaderHint"> <h1 id="mainMenuHeader" tabindex="-1" aria-describedby="mainMenuHeaderHint">
[[ mainMenuHeader ]] [[ getMsg('tutorial_main_menu_header') ]]
</h1> </h1>
<div id="mainMenuHeaderHint" hidden>[[ mainMenuHeaderHint ]]</div> <div id="mainMenuHeaderHint" hidden>
[[ getMsg('tutorial_main_menu_header_description') ]]
</div>
<div id="mainMenuButtons"> <div id="mainMenuButtons">
<cr-link-row id="quickOrientationButton" class="hr" <cr-link-row id="quickOrientationButton" class="hr"
on-click="chooseCurriculum" label="[[ quickOrientation ]]"> on-click="chooseCurriculum"
label="[[ getMsg('tutorial_quick_orientation_title') ]]">
</cr-link-row> </cr-link-row>
<cr-link-row id="essentialKeysButton" class="hr" on-click="chooseCurriculum" <cr-link-row id="essentialKeysButton" class="hr" on-click="chooseCurriculum"
label="[[ essentialKeys ]]"> label="[[ getMsg('tutorial_essential_keys_title') ]]">
</cr-link-row> </cr-link-row>
<cr-link-row id="navigationButton" class="hr" on-click="chooseCurriculum" <cr-link-row id="navigationButton" class="hr" on-click="chooseCurriculum"
label="[[ navigation ]]"> label="[[ getMsg('tutorial_navigation_title') ]]">
</cr-link-row> </cr-link-row>
<cr-link-row id="commandReferencesButton" class="hr" <cr-link-row id="commandReferencesButton" class="hr"
on-click="chooseCurriculum" label="[[ commandReferences ]]"> on-click="chooseCurriculum"
label="[[ getMsg('tutorial_command_references_title') ]]">
</cr-link-row> </cr-link-row>
<cr-link-row id="soundsAndSettingsButton" class="hr" <cr-link-row id="soundsAndSettingsButton" class="hr"
on-click="chooseCurriculum" label="[[ soundsAndSettings ]]"> on-click="chooseCurriculum"
label="[[ getMsg('tutorial_sounds_and_settings_title') ]]">
</cr-link-row> </cr-link-row>
<cr-link-row id="resourcesButton" class="hr" on-click="chooseCurriculum" <cr-link-row id="resourcesButton" class="hr" on-click="chooseCurriculum"
label="[[ resources ]]"> label="[[ getMsg('tutorial_resources_title') ]]">
</cr-link-row> </cr-link-row>
</div> </div>
</div> </div>
...@@ -132,7 +137,9 @@ cr-button { ...@@ -132,7 +137,9 @@ cr-button {
tabindex="-1" aria-describedby="lessonMenuHeaderHint"> tabindex="-1" aria-describedby="lessonMenuHeaderHint">
[[ computeLessonMenuHeader(curriculum) ]] [[ computeLessonMenuHeader(curriculum) ]]
</h1> </h1>
<div id="lessonMenuHeaderHint" hidden>[[ lessonMenuHeaderHint ]]</div> <div id="lessonMenuHeaderHint" hidden>
[[ getMsg('tutorial_lesson_menu_header_description') ]]
</div>
<div id="lessonShortcuts"></div> <div id="lessonShortcuts"></div>
</div> </div>
...@@ -168,12 +175,12 @@ cr-button { ...@@ -168,12 +175,12 @@ cr-button {
<cr-button id="nextLesson" class="action-button" on-click="showNextLesson" <cr-button id="nextLesson" class="action-button" on-click="showNextLesson"
hidden$="[[ hidden$="[[
shouldHideNextLessonButton(activeLessonIndex, activeScreen) ]]"> shouldHideNextLessonButton(activeLessonIndex, activeScreen) ]]">
[[ nextLesson ]] [[ getMsg('tutorial_next_lesson_button') ]]
</cr-button> </cr-button>
<cr-button on-click="showPreviousLesson" <cr-button on-click="showPreviousLesson"
hidden$="[[ hidden$="[[
shouldHidePreviousLessonButton(activeLessonIndex, activeScreen) ]]"> shouldHidePreviousLessonButton(activeLessonIndex, activeScreen) ]]">
[[ previousLesson ]] [[ getMsg('tutorial_previous_lesson_button') ]]
</cr-button> </cr-button>
</div> </div>
<div id="menuNav"> <div id="menuNav">
...@@ -181,18 +188,18 @@ cr-button { ...@@ -181,18 +188,18 @@ cr-button {
hidden$="[[ hidden$="[[
shouldHideRestartQuickOrientationButton(activeLessonIndex, activeScreen) shouldHideRestartQuickOrientationButton(activeLessonIndex, activeScreen)
]]"> ]]">
[[ restartQuickOrientation ]] [[ getMsg('tutorial_restart_quick_orientation_button') ]]
</cr-button> </cr-button>
<cr-button on-click="showLessonMenu" <cr-button on-click="showLessonMenu"
hidden$="[[ shouldHideLessonMenuButton(activeScreen) ]]"> hidden$="[[ shouldHideLessonMenuButton(activeScreen) ]]">
[[ lessonMenu ]] [[ getMsg('tutorial_lesson_menu_button') ]]
</cr-button> </cr-button>
<cr-button on-click="showMainMenu" <cr-button on-click="showMainMenu"
hidden$="[[ shouldHideMainMenuButton(activeScreen) ]]"> hidden$="[[ shouldHideMainMenuButton(activeScreen) ]]">
[[ mainMenu ]] [[ getMsg('tutorial_main_menu_button') ]]
</cr-button> </cr-button>
<cr-button id="exitTutorial" on-click="exit"> <cr-button id="exitTutorial" on-click="exit">
[[ exitTutorial ]] [[ getMsg('tutorial_exit_button') ]]
</cr-button> </cr-button>
</div> </div>
</div> </div>
......
...@@ -115,59 +115,12 @@ Polymer({ ...@@ -115,59 +115,12 @@ Polymer({
isPracticeAreaActive: {type: Boolean, value: false}, isPracticeAreaActive: {type: Boolean, value: false},
// Labels and text content.
mainMenuHeader: {
type: String,
value: 'ChromeVox tutorial',
},
quickOrientation: {type: String, value: 'Quick orientation'},
essentialKeys: {type: String, value: 'Essential keys'},
navigation: {type: String, value: 'Navigation'},
commandReferences: {type: String, value: 'Command references'},
soundsAndSettings: {type: String, value: 'Sounds and settings'},
resources: {type: String, value: 'Resources'},
continue: {type: String, value: 'Continue where I left off'},
restartQuickOrientation: {type: String, value: 'Restart quick orientation'},
previousLesson: {type: String, value: 'Previous lesson'},
nextLesson: {type: String, value: 'Next lesson'},
mainMenu: {type: String, value: 'Main menu'},
lessonMenu: {type: String, value: 'All lessons'},
exitTutorial: {type: String, value: 'Exit tutorial'},
mainMenuHeaderHint: {
type: String,
value: 'Press Search + left/right arrow to browse topics'
},
lessonMenuHeaderHint: {
type: String,
value: `Press Search + left/right arrow to browse lessons for this topic`
},
lessonData: { lessonData: {
type: Array, type: Array,
value: [ value: [
{ {
title: 'Welcome to ChromeVox!', title: 'tutorial_welcome_heading',
content: [`Welcome to the ChromeVox tutorial. To exit this tutorial content: ['tutorial_quick_orientation_intro_text'],
at any time, press the Escape key on the top left corner
of the keyboard. To turn off ChromeVox, hold Control and Alt, and
press Z. When you're ready, use the spacebar to move to the next
lesson.`],
medium: InteractionMedium.KEYBOARD, medium: InteractionMedium.KEYBOARD,
curriculums: [Curriculum.QUICK_ORIENTATION], curriculums: [Curriculum.QUICK_ORIENTATION],
actions: [ actions: [
...@@ -177,11 +130,8 @@ Polymer({ ...@@ -177,11 +130,8 @@ Polymer({
}, },
{ {
title: 'Essential Keys: Control', title: 'tutorial_quick_orientation_control_title',
content: [`Let's start with a few keys you'll use regularly: Control, content: ['tutorial_quick_orientation_control_text'],
Shift, Search, and the Arrow keys. Find the Control key on the
bottom left corner of your keyboard. To continue, press the Control
key.`],
medium: InteractionMedium.KEYBOARD, medium: InteractionMedium.KEYBOARD,
curriculums: [Curriculum.QUICK_ORIENTATION], curriculums: [Curriculum.QUICK_ORIENTATION],
actions: [{ actions: [{
...@@ -193,11 +143,8 @@ Polymer({ ...@@ -193,11 +143,8 @@ Polymer({
}, },
{ {
title: 'Essential Keys: Shift', title: 'tutorial_quick_orientation_shift_title',
content: [`The Control key can be used at any time to temporarily stop content: ['tutorial_quick_orientation_shift_text'],
ChromeVox from speaking. Now, find the left Shift key, which is
directly above the Control key. To continue, press the left Shift
key.`],
medium: InteractionMedium.KEYBOARD, medium: InteractionMedium.KEYBOARD,
curriculums: [Curriculum.QUICK_ORIENTATION], curriculums: [Curriculum.QUICK_ORIENTATION],
actions: [ actions: [
...@@ -207,31 +154,22 @@ Polymer({ ...@@ -207,31 +154,22 @@ Polymer({
}, },
{ {
title: 'Essential Keys: Search', title: 'tutorial_quick_orientation_search_title',
content: content: ['tutorial_quick_orientation_search_text'],
[`We'll talk more about the Shift key in later lessons, as it is
used in many ChromeVox commands. Next, you’ll learn about the
Search key. The Search key is used in combination with other keys
for ChromeVox commands. The Search key is immediately above the
left Shift key. To continue, press the Search key.`],
medium: InteractionMedium.KEYBOARD, medium: InteractionMedium.KEYBOARD,
curriculums: [Curriculum.QUICK_ORIENTATION], curriculums: [Curriculum.QUICK_ORIENTATION],
actions: [{ actions: [{
type: 'key_sequence', type: 'key_sequence',
value: {skipStripping: false, keys: {keyCode: [91 /* Search */]}}, value: {skipStripping: false, keys: {keyCode: [91 /* Search */]}},
afterActionMsg: 'You found the search key!',
}], }],
autoInteractive: true, autoInteractive: true,
}, },
{ {
title: 'Basic navigation', title: 'tutorial_quick_orientation_basic_navigation_title',
content: [ content: [
`Now you’ll learn some basic navigation. You can hold Search and 'tutorial_quick_orientation_basic_navigation_move_text',
press the arrow keys to move around the screen. To continue, 'tutorial_quick_orientation_basic_navigation_click_text'
press Search + Right arrow.`,
`If you reach an item you want to click, press Search + Space.
Try it now to continue.`,
], ],
medium: InteractionMedium.KEYBOARD, medium: InteractionMedium.KEYBOARD,
curriculums: [Curriculum.QUICK_ORIENTATION], curriculums: [Curriculum.QUICK_ORIENTATION],
...@@ -239,40 +177,30 @@ Polymer({ ...@@ -239,40 +177,30 @@ Polymer({
{ {
type: 'key_sequence', type: 'key_sequence',
value: {cvoxModifier: true, keys: {keyCode: [39]}}, value: {cvoxModifier: true, keys: {keyCode: [39]}},
afterActionMsg: 'Great! You pressed Search + right arrow.'
}, },
{ {
type: 'key_sequence', type: 'key_sequence',
value: {cvoxModifier: true, keys: {keyCode: [32]}}, value: {cvoxModifier: true, keys: {keyCode: [32]}},
afterActionMsg: 'Great! You pressed Search + space',
} }
], ],
autoInteractive: true, autoInteractive: true,
}, },
{ {
title: 'Tab Navigation', title: 'tutorial_quick_orientation_tab_title',
content: [ content: ['tutorial_quick_orientation_tab_text'],
`You can also use the Tab key to move to the next interactive item
on the screen. Find the Tab key, which is directly above the Search
key. To continue, press the Tab key.`
],
medium: InteractionMedium.KEYBOARD, medium: InteractionMedium.KEYBOARD,
curriculums: [Curriculum.QUICK_ORIENTATION], curriculums: [Curriculum.QUICK_ORIENTATION],
actions: [{ actions: [{
type: 'key_sequence', type: 'key_sequence',
value: {keys: {keyCode: [9 /* Tab */]}}, value: {keys: {keyCode: [9 /* Tab */]}},
afterActionMsg: 'Great, you found the tab key!'
}], }],
autoInteractive: true, autoInteractive: true,
}, },
{ {
title: 'Tab Navigation Continued', title: 'tutorial_quick_orientation_shift_tab_title',
content: [ content: ['tutorial_quick_orientation_shift_tab_text'],
`You can use Shift + Tab to move to the previous interactive item.
To continue, press Shift + Tab. `
],
medium: InteractionMedium.KEYBOARD, medium: InteractionMedium.KEYBOARD,
curriculums: [Curriculum.QUICK_ORIENTATION], curriculums: [Curriculum.QUICK_ORIENTATION],
actions: [{ actions: [{
...@@ -283,10 +211,8 @@ Polymer({ ...@@ -283,10 +211,8 @@ Polymer({
}, },
{ {
title: 'Enter', title: 'tutorial_quick_orientation_enter_title',
content: [`You can also press Enter to activate items. For example, content: ['tutorial_quick_orientation_enter_text'],
Enter can be used to submit text in a form. To continue, press
Enter.`],
medium: InteractionMedium.KEYBOARD, medium: InteractionMedium.KEYBOARD,
curriculums: [Curriculum.QUICK_ORIENTATION], curriculums: [Curriculum.QUICK_ORIENTATION],
actions: [ actions: [
...@@ -296,21 +222,16 @@ Polymer({ ...@@ -296,21 +222,16 @@ Polymer({
}, },
{ {
title: 'Drop-Down Lists', title: 'tutorial_quick_orientation_lists_title',
content: [ content: [
`There will be times when you need to select an item from a 'tutorial_quick_orientation_lists_text',
drop-down list. To do so, first expand the list by pressing Enter 'tutorial_quick_orientation_lists_continue_text'
or Search + Space. Then use the Up and Down arrow keys to select
an item. Finally, collapse the list by pressing Enter or Search +
Space.`,
`Press Search + Right arrow to find the practice area or the Next
lesson button. Then press Search + Space to activate.`
], ],
medium: InteractionMedium.KEYBOARD, medium: InteractionMedium.KEYBOARD,
curriculums: [Curriculum.QUICK_ORIENTATION], curriculums: [Curriculum.QUICK_ORIENTATION],
practiceTitle: 'Practice area: Drop-down lists', practiceTitle: 'tutorial_quick_orientation_lists_practice_title',
practiceInstructions: practiceInstructions:
`Try selecting your favorite season from the list.`, 'tutorial_quick_orientation_lists_practice_instructions',
practiceFile: 'selects', practiceFile: 'selects',
practiceState: {}, practiceState: {},
events: [], events: [],
...@@ -318,13 +239,10 @@ Polymer({ ...@@ -318,13 +239,10 @@ Polymer({
}, },
{ {
title: 'Quick orientation complete!', title: 'tutorial_quick_orientation_complete_title',
content: [ content: [
`Well done! You’ve learned the ChromeVox basics. You can go through 'tutorial_quick_orientation_complete_text',
the tutorial again or exit this tutorial by finding and clicking 'tutorial_quick_orientation_complete_additional_text'
on a button below.`,
`After you set up your device, you can come back to this tutorial
and view more lessons by pressing Search + O, then T.`,
], ],
medium: InteractionMedium.KEYBOARD, medium: InteractionMedium.KEYBOARD,
curriculums: [Curriculum.QUICK_ORIENTATION], curriculums: [Curriculum.QUICK_ORIENTATION],
...@@ -355,18 +273,13 @@ Polymer({ ...@@ -355,18 +273,13 @@ Polymer({
title: 'tutorial_jump_heading', title: 'tutorial_jump_heading',
content: [ content: [
'tutorial_jump', 'tutorial_jump',
`Jump commands can be used to efficiently navigate through a web 'tutorial_jump_efficiency',
page.`, 'tutorial_jump_more',
`Additional jump commands include jumping by link, button, and
checkbox, to name a few. A full list of jump commands can be
found in the ChromeVox menus, which can be opened by pressing
Search + Period.`,
], ],
medium: InteractionMedium.KEYBOARD, medium: InteractionMedium.KEYBOARD,
curriculums: [Curriculum.NAVIGATION], curriculums: [Curriculum.NAVIGATION],
practiceTitle: 'Jump Commands Practice', practiceTitle: 'tutorial_jump_practice_title',
practiceInstructions: practiceInstructions: 'tutorial_jump_practice_instructions',
'Try jumping by heading to navigate the text below',
practiceFile: 'jump_commands', practiceFile: 'jump_commands',
practiceState: {}, practiceState: {},
events: [], events: [],
...@@ -399,27 +312,6 @@ Polymer({ ...@@ -399,27 +312,6 @@ Polymer({
curriculums: [Curriculum.SOUNDS_AND_SETTINGS] curriculums: [Curriculum.SOUNDS_AND_SETTINGS]
}, },
{
title: 'Text fields',
content: ['Text content for text fields lesson'],
medium: InteractionMedium.KEYBOARD,
curriculums: [Curriculum.NONE],
practiceTitle: 'Edit fields practice',
practiceInstructions:
'Try using what you have learned about text fields and edit ' +
'the text fields below.',
practiceFile: 'text_fields',
practiceState: {
input: {focus: false, input: false},
editable: {focus: false, input: false}
},
events: ['focus', 'input'],
hints: [
'Once you find an editable element, you can type normally.',
'Try editing the content you entered'
]
},
{ {
title: 'tutorial_learn_more_heading', title: 'tutorial_learn_more_heading',
content: ['tutorial_learn_more'], content: ['tutorial_learn_more'],
...@@ -702,7 +594,6 @@ Polymer({ ...@@ -702,7 +594,6 @@ Polymer({
* @private * @private
*/ */
computeLessonMenuHeader(curriculum) { computeLessonMenuHeader(curriculum) {
// TODO (akihiroota): localize. (http://crbug.com/1124068).
let numLessons = 0; let numLessons = 0;
for (let i = 0; i < this.lessonData.length; ++i) { for (let i = 0; i < this.lessonData.length; ++i) {
if (this.lessonData[i].curriculums.includes(curriculum)) { if (this.lessonData[i].curriculums.includes(curriculum)) {
...@@ -715,8 +606,8 @@ Polymer({ ...@@ -715,8 +606,8 @@ Polymer({
words[i] = words[i][0].toUpperCase() + words[i].substring(1); words[i] = words[i][0].toUpperCase() + words[i].substring(1);
} }
const curriculumCopy = words.join(' '); const curriculumCopy = words.join(' ');
return `${curriculumCopy} Tutorial, ${numLessons} ${ return this.getMsg(
numLessons > 1 ? 'Lessons' : 'Lesson'}`; 'tutorial_lesson_menu_header', [curriculumCopy, numLessons]);
}, },
/** @private */ /** @private */
...@@ -823,13 +714,10 @@ Polymer({ ...@@ -823,13 +714,10 @@ Polymer({
this.requestFullyDescribe.bind(this), this.requestFullyDescribe.bind(this),
this.requestFullyDescribe.bind(this), this.requestFullyDescribe.bind(this),
this.requestFullyDescribe.bind(this), this.requestFullyDescribe.bind(this),
maybeGiveNudge.bind( maybeGiveNudge.bind(this, this.getMsg('tutorial_hint_navigate')),
this, 'Hint: Hold Search and press the arrow keys to navigate.'), maybeGiveNudge.bind(this, this.getMsg('tutorial_hint_click')),
maybeGiveNudge.bind(
this, 'Hint: Press Search + Space to activate the current item.'),
this.requestSpeech.bind( this.requestSpeech.bind(
this, 'Hint: Press Escape if you would like to exit this tutorial.', this, this.getMsg('tutorial_hint_exit'), QueueMode.INTERJECT)
QueueMode.INTERJECT)
]; ];
} else { } else {
throw new Error('Invalid NudgeType: ' + type); throw new Error('Invalid NudgeType: ' + type);
......
...@@ -20,13 +20,6 @@ export const TutorialCommon = { ...@@ -20,13 +20,6 @@ export const TutorialCommon = {
* @return {string} The localized message. * @return {string} The localized message.
*/ */
getMsg(idOrValue, opt_subs) { getMsg(idOrValue, opt_subs) {
// TODO(akihiroota): Remove this check after adding all strings to
// chromevox_strings.grdp.
// If we get a string that doesn't include a '_', then it's a hard-coded
// string value. Return it, since a message id doesn't exist for it yet.
if (!idOrValue.includes('_')) {
return idOrValue;
}
return Msgs.getMsg(idOrValue, opt_subs); return Msgs.getMsg(idOrValue, opt_subs);
} }
}; };
...@@ -33,10 +33,10 @@ a { ...@@ -33,10 +33,10 @@ a {
text-align: start text-align: start
} }
#content a,
#content p, #content p,
#practiceInstructions, #practiceInstructions,
#practiceBody { #practiceBody {
color: black;
font-size: 22px; font-size: 22px;
font-weight: normal; font-weight: normal;
line-height: 28px; line-height: 28px;
...@@ -45,6 +45,12 @@ a { ...@@ -45,6 +45,12 @@ a {
text-align: start text-align: start
} }
#content p,
#practiceInstructions,
#practiceBody {
color: black;
}
/* Practice area */ /* Practice area */
#practiceTitle { #practiceTitle {
...@@ -94,7 +100,9 @@ a { ...@@ -94,7 +100,9 @@ a {
<h1 id="title" tabindex="-1" aria-describedby="titleHint"> <h1 id="title" tabindex="-1" aria-describedby="titleHint">
[[ getMsg(title) ]] [[ getMsg(title) ]]
</h1> </h1>
<div id="titleHint" hidden>[[ titleHint ]]</div> <div id="titleHint" hidden>
[[ getMsg('tutorial_lesson_title_description') ]]
</div>
</template> </template>
<div id="content"> <div id="content">
<template id="contentTemplate" is="dom-repeat" items="[[ content ]]" <template id="contentTemplate" is="dom-repeat" items="[[ content ]]"
...@@ -104,18 +112,22 @@ a { ...@@ -104,18 +112,22 @@ a {
</div> </div>
<cr-dialog id="practice"> <cr-dialog id="practice">
<div id="practiceTitle" class="title" slot="title" tabindex="-1"> <div id="practiceTitle" class="title" slot="title" tabindex="-1">
[[ practiceTitle ]] [[ getMsg(practiceTitle) ]]
</div> </div>
<div id="practiceBody" class="body" slot="body" tabindex="-1"> <div id="practiceBody" class="body" slot="body" tabindex="-1">
<p id="practiceInstructions" tabindex="-1">[[ practiceInstructions ]]</p> <p id="practiceInstructions" tabindex="-1">
[[ getMsg(practiceInstructions) ]]
</p>
<div id="practiceContent"></div> <div id="practiceContent"></div>
</div> </div>
<div class="button-container" slot="button-container"> <div class="button-container" slot="button-container">
<cr-button id="closePractice" on-click="endPractice"> <cr-button id="closePractice" on-click="endPractice">
Close [[ getMsg('tutorial_practice_area_close_button') ]]
</cr-button> </cr-button>
</div> </div>
</cr-dialog> </cr-dialog>
<cr-button id="startPractice" on-click="startPractice" <cr-button id="startPractice" on-click="startPractice"
hidden$="[[ shouldHidePracticeButton() ]]">Practice Area</cr-button> hidden$="[[ shouldHidePracticeButton() ]]">
[[ getMsg('tutorial_practice_area_open_button') ]]
</cr-button>
</div> </div>
...@@ -53,16 +53,6 @@ export const TutorialLesson = Polymer({ ...@@ -53,16 +53,6 @@ export const TutorialLesson = Polymer({
// Observed properties. // Observed properties.
activeLessonNum: {type: Number, observer: 'setVisibility'}, activeLessonNum: {type: Number, observer: 'setVisibility'},
titleHint: {
type: String,
value: 'Press Search + left/right arrow to navigate the lesson'
},
practiceTitleHint: {
type: String,
value: 'Press Search + left/right arrow to navigate the practice area'
}
}, },
/** @override */ /** @override */
...@@ -144,12 +134,13 @@ export const TutorialLesson = Polymer({ ...@@ -144,12 +134,13 @@ export const TutorialLesson = Polymer({
* @private * @private
*/ */
populatePracticeContent() { populatePracticeContent() {
const path = '../i_tutorial/lessons/' + this.practiceFile + '.html'; const path = '../i_tutorial/practice_areas/' + this.practiceFile + '.html';
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
xhr.open('GET', path, true); xhr.open('GET', path, true);
xhr.onload = (evt) => { xhr.onload = (evt) => {
if (xhr.readyState === 4 && xhr.status === 200) { if (xhr.readyState === 4 && xhr.status === 200) {
this.$.practiceContent.innerHTML = xhr.responseText; this.$.practiceContent.innerHTML = xhr.responseText;
this.localizePracticeAreaContent();
} else { } else {
console.error(xhr.statusText); console.error(xhr.statusText);
} }
...@@ -235,12 +226,6 @@ export const TutorialLesson = Polymer({ ...@@ -235,12 +226,6 @@ export const TutorialLesson = Polymer({
onGoalStateReached() { onGoalStateReached() {
const previousState = this.goalStateReached; const previousState = this.goalStateReached;
this.goalStateReached = true; this.goalStateReached = true;
if (previousState === false) {
// Only perform when crossing the threshold from not reached to reached.
this.requestSpeech(
'You have passed this tutorial lesson. Find and press the exit ' +
'practice area button to continue');
}
}, },
// Miscellaneous methods. // Miscellaneous methods.
...@@ -289,5 +274,15 @@ export const TutorialLesson = Polymer({ ...@@ -289,5 +274,15 @@ export const TutorialLesson = Polymer({
/** @return {string} */ /** @return {string} */
getTitleText() { getTitleText() {
return this.$.title.textContent; return this.$.title.textContent;
},
/** @private */
localizePracticeAreaContent() {
const root = this.$.practiceContent;
const elements = root.querySelectorAll('[msgid]');
for (const element of elements) {
const msgId = element.getAttribute('msgid');
element.textContent = this.getMsg(msgId);
}
} }
}); });
\ No newline at end of file
<!-- Copyright 2020 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. -->
<script type="module"
src="chrome://resources/cr_elements/cr_button/cr_button.m.js">
</script>
<h3>This is a heading</h3>
<cr-button>This is a button</cr-button>
<p>You're almost there</p>
<p>You're very close to the button</p>
<cr-button id="goal">Click me</cr-button>
<p>You're very close to the button</p>
<p>You're almost there</p>
<cr-button>This is another button</cr-button>
<h3>This is another heading</h3>
<!-- Copyright 2020 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. -->
<h5>This is the first heading. Press Search + H to go to the next heading</h5>
<h5>
This is the second heading. Keep going; either press Search+H or Search+Shift+H
</h5>
<h5>This is the last heading. Press Search+H to wrap to the first heading, or
Search+Shift+H to go to the second heading on this page.
</h5>
\ No newline at end of file
<!-- Copyright 2020 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. -->
<p>There is an input below</p>
<input id="input" aria-lable="Edit me">
<p>There is a rich multiline text fields below, which appears in Gmail.</p>
<div id="editable" role="textbox" contenteditable="true" aria-label="Edit me">
</div>
\ No newline at end of file
<!-- Copyright 2020 The Chromium Authors. All rights reserved. <!-- Copyright 2020 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. --> found in the LICENSE file. -->
<label id="selectLabel">Choose your favorite season</label> <h5 msgid="tutorial_jump_first_heading"></h5>
<select class="md-select" aria-labelledby="selectLabel"> <h5 msgid="tutorial_jump_second_heading"></h5>
<option>Spring</option> <h5 msgid="tutorial_jump_wrap_heading"></h5>
<option>Summer</option> \ No newline at end of file
<option>Fall</option>
<option>Winter</option>
</select>
<!-- Copyright 2020 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. -->
<label id="selectLabel" msgid="tutorial_quick_orientation_lists_practice_label">
</label>
<select class="md-select" aria-labelledby="selectLabel">
<option msgid="tutorial_quick_orientation_lists_practice_spring"></option>
<option msgid="tutorial_quick_orientation_lists_practice_summer"></option>
<option msgid="tutorial_quick_orientation_lists_practice_fall"></option>
<option msgid="tutorial_quick_orientation_lists_practice_winter"></option>
</select>
...@@ -120,7 +120,8 @@ TEST_F('ChromeVoxTutorialTest', 'BasicTest', function() { ...@@ -120,7 +120,8 @@ TEST_F('ChromeVoxTutorialTest', 'BasicTest', function() {
mockFeedback mockFeedback
.expectSpeech( .expectSpeech(
'ChromeVox tutorial', 'Heading 1', 'ChromeVox tutorial', 'Heading 1',
'Press Search + left/right arrow to browse topics') ' Press Search + Right Arrow, or Search + Left Arrow to browse' +
' topics ')
.call(doCmd('nextObject')) .call(doCmd('nextObject'))
.expectSpeech('Quick orientation', 'Link') .expectSpeech('Quick orientation', 'Link')
.call(doCmd('nextObject')) .call(doCmd('nextObject'))
...@@ -152,8 +153,8 @@ TEST_F('ChromeVoxTutorialTest', 'LessonSetTest', function() { ...@@ -152,8 +153,8 @@ TEST_F('ChromeVoxTutorialTest', 'LessonSetTest', function() {
.call(doCmd('forceClickOnCurrentItem')) .call(doCmd('forceClickOnCurrentItem'))
.expectSpeech(/Quick Orientation Tutorial, [0-9]+ Lessons/) .expectSpeech(/Quick Orientation Tutorial, [0-9]+ Lessons/)
.expectSpeech( .expectSpeech(
'Press Search + left/right arrow to browse lessons for ' + ' Press Search + Right Arrow, or Search + Left Arrow to browse ' +
'this topic') 'lessons for this topic ')
.call(doCmd('nextObject')) .call(doCmd('nextObject'))
.expectSpeech('Welcome to ChromeVox!') .expectSpeech('Welcome to ChromeVox!')
.call(() => { .call(() => {
...@@ -192,7 +193,8 @@ TEST_F('ChromeVoxTutorialTest', 'NoPracticeAreaTest', function() { ...@@ -192,7 +193,8 @@ TEST_F('ChromeVoxTutorialTest', 'NoPracticeAreaTest', function() {
}) })
.expectSpeech( .expectSpeech(
'On, Off, and Stop', 'Heading 1', 'On, Off, and Stop', 'Heading 1',
'Press Search + left/right arrow to navigate the lesson') ' Press Search + Right Arrow, or Search + Left Arrow to navigate ' +
'this lesson ')
.call(doCmd('nextButton')) .call(doCmd('nextButton'))
.expectSpeech('Next lesson') .expectSpeech('Next lesson')
.replay(); .replay();
...@@ -219,7 +221,7 @@ TEST_F('ChromeVoxTutorialTest', 'HasPracticeAreaTest', function() { ...@@ -219,7 +221,7 @@ TEST_F('ChromeVoxTutorialTest', 'HasPracticeAreaTest', function() {
}) })
.expectSpeech('Jump Commands', 'Heading 1') .expectSpeech('Jump Commands', 'Heading 1')
.call(doCmd('nextButton')) .call(doCmd('nextButton'))
.expectSpeech('Practice Area') .expectSpeech('Practice area')
.replay(); .replay();
}); });
}); });
...@@ -278,7 +280,7 @@ TEST_F('ChromeVoxTutorialTest', 'DISABLED_PracticeAreaNudgesTest', function() { ...@@ -278,7 +280,7 @@ TEST_F('ChromeVoxTutorialTest', 'DISABLED_PracticeAreaNudgesTest', function() {
}) })
.expectSpeech('Basic Navigation', 'Heading 1') .expectSpeech('Basic Navigation', 'Heading 1')
.call(doCmd('nextButton')) .call(doCmd('nextButton'))
.expectSpeech('Practice Area') .expectSpeech('Practice area')
.call(doCmd('forceClickOnCurrentItem')) .call(doCmd('forceClickOnCurrentItem'))
.expectSpeech(/Try using basic navigation to navigate/) .expectSpeech(/Try using basic navigation to navigate/)
.call(giveNudge) .call(giveNudge)
...@@ -454,7 +456,9 @@ TEST_F('ChromeVoxTutorialTest', 'LessonHint', function() { ...@@ -454,7 +456,9 @@ TEST_F('ChromeVoxTutorialTest', 'LessonHint', function() {
tutorial.showLesson(0); tutorial.showLesson(0);
}) })
.expectSpeech('On, Off, and Stop', 'Heading 1') .expectSpeech('On, Off, and Stop', 'Heading 1')
.expectSpeech('Press Search + left/right arrow to navigate the lesson') .expectSpeech(
' Press Search + Right Arrow, or Search + Left Arrow to navigate' +
' this lesson ')
.replay(); .replay();
}); });
}); });
...@@ -539,7 +543,7 @@ TEST_F('ChromeVoxTutorialTest', 'QuickOrientationLessonTest', function() { ...@@ -539,7 +543,7 @@ TEST_F('ChromeVoxTutorialTest', 'QuickOrientationLessonTest', function() {
// the next lesson. // the next lesson.
.call(simulateKeyPress.bind(this, KeyCode.SPACE, {})) .call(simulateKeyPress.bind(this, KeyCode.SPACE, {}))
.expectSpeech('Essential Keys: Control') .expectSpeech('Essential Keys: Control')
.expectSpeech(/Let's start with a few keys you'll use regularly:/) .expectSpeech(/Let's start with a few keys you'll use regularly./)
.call(() => { .call(() => {
assertEquals(1, tutorial.activeLessonNum); assertEquals(1, tutorial.activeLessonNum);
assertNotEquals(firstLessonNode, getRangeStartNode()); assertNotEquals(firstLessonNode, getRangeStartNode());
......
...@@ -2020,7 +2020,7 @@ ...@@ -2020,7 +2020,7 @@
On, Off, and Stop On, Off, and Stop
</message> </message>
<message desc="Part of ChromeVox tutorial, explains that pressing Control on the keyboard stops it from speaking" name="IDS_CHROMEVOX_TUTORIAL_CONTROL"> <message desc="Part of ChromeVox tutorial, explains that pressing Control on the keyboard stops it from speaking" name="IDS_CHROMEVOX_TUTORIAL_CONTROL">
To temporarily stop ChromeVox from speaking, press the Control key. To stop any current ChromeVox speech, press the Control key.
</message> </message>
<message desc="Part of ChromeVox tutorial, explains that you can turn ChromeVox on or turn it off, by pressing Control+Alt+Z on the keyboard" name="IDS_CHROMEVOX_TUTORIAL_ON_OFF"> <message desc="Part of ChromeVox tutorial, explains that you can turn ChromeVox on or turn it off, by pressing Control+Alt+Z on the keyboard" name="IDS_CHROMEVOX_TUTORIAL_ON_OFF">
To turn ChromeVox on or off, use Control+Alt+Z. To turn ChromeVox on or off, use Control+Alt+Z.
...@@ -2052,6 +2052,16 @@ ...@@ -2052,6 +2052,16 @@
<message desc="Part of the ChromeVox tutorial, explains two keystrokes to jump to the next or previous heading." name="IDS_CHROMEVOX_TUTORIAL_JUMP"> <message desc="Part of the ChromeVox tutorial, explains two keystrokes to jump to the next or previous heading." name="IDS_CHROMEVOX_TUTORIAL_JUMP">
Use jump commands to skip to specific types of elements. To jump forward between headings, press Search + H, or to jump backward, press Search + Shift + H. Use jump commands to skip to specific types of elements. To jump forward between headings, press Search + H, or to jump backward, press Search + Shift + H.
</message> </message>
<message desc="Part of the ChromeVox tutorial, explains that jump commands can be used to efficiently navigate." name="IDS_CHROMEVOX_TUTORIAL_JUMP_EFFICIENCY">
Jump commands can be used to efficiently navigate through a web page.
</message>
<message desc="Part of the ChromeVox tutorial, explains where to find more jump commands." name="IDS_CHROMEVOX_TUTORIAL_JUMP_MORE">
Additional jump commands include jumping by link, button, and checkbox, to name a few. A full list of jump commands can be found in the ChromeVox menus, which can be opened by pressing Search + Period.
</message>
<message desc="Part of the ChromeVox tutorial, heading used to illustrate jumping." name="IDS_CHROMEVOX_TUTORIAL_JUMP_FIRST_HEADING">
This is the first heading. Press Search + H to go to the next heading.
</message>
<message desc="Part of the ChromeVox tutorial, heading used to illustrate jumping." name="IDS_CHROMEVOX_TUTORIAL_JUMP_SECOND_HEADING"> <message desc="Part of the ChromeVox tutorial, heading used to illustrate jumping." name="IDS_CHROMEVOX_TUTORIAL_JUMP_SECOND_HEADING">
This is the second heading. Keep going; either press Search+H or Search+Shift+H This is the second heading. Keep going; either press Search+H or Search+Shift+H
</message> </message>
...@@ -2343,7 +2353,7 @@ ...@@ -2343,7 +2353,7 @@
Tap with 4 fingers to enter the ChromeVox menus Tap with 4 fingers to enter the ChromeVox menus
</message> </message>
<message desc="Part of the ChromeVox touch tutorial page. Describes a two finger tap to stop speech." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_TWO_FINGER_TAP"> <message desc="Part of the ChromeVox touch tutorial page. Describes a two finger tap to stop speech." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_TWO_FINGER_TAP">
Tap with 2 fingers to temporarily stop speech Tap with 2 fingers to stop any current speech
</message> </message>
<message desc="Part of the ChromeVox touch tutorial page. Concludes this page." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_LEARN_MORE"> <message desc="Part of the ChromeVox touch tutorial page. Concludes this page." name="IDS_CHROMEVOX_TUTORIAL_TOUCH_LEARN_MORE">
Explore more gestures in Learn Mode and the Chromebook Help Center Explore more gestures in Learn Mode and the Chromebook Help Center
...@@ -3041,5 +3051,163 @@ ...@@ -3041,5 +3051,163 @@
<message desc="Describes an element with the ARIA role mark. We use 'marked content' since it's more descriptive than 'mark'." name="IDS_CHROMEVOX_ROLE_MARK" is_accessibility_with_no_ui="true"> <message desc="Describes an element with the ARIA role mark. We use 'marked content' since it's more descriptive than 'mark'." name="IDS_CHROMEVOX_ROLE_MARK" is_accessibility_with_no_ui="true">
Marked content Marked content
</message> </message>
<message desc="The title displayed on the main menu of the ChromeVox tutorial." name="IDS_CHROMEVOX_TUTORIAL_MAIN_MENU_HEADER">
ChromeVox tutorial
</message>
<message desc="The title displayed for the quick orientation lesson set." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_TITLE">
Quick orientation
</message>
<message desc="The title displayed for the essential keys lesson set." name="IDS_CHROMEVOX_TUTORIAL_ESSENTIAL_KEYS_TITLE">
Essential keys
</message>
<message desc="The title displayed for the navigation lesson set." name="IDS_CHROMEVOX_TUTORIAL_NAVIGATION_TITLE">
Navigation
</message>
<message desc="The title displayed for the command references lesson set." name="IDS_CHROMEVOX_TUTORIAL_COMMAND_REFERENCES_TITLE">
Command references
</message>
<message desc="The title displayed for the sounds and settings lesson set." name="IDS_CHROMEVOX_TUTORIAL_SOUNDS_AND_SETTINGS_TITLE">
Sounds and settings
</message>
<message desc="The title displayed for the resources lesson set." name="IDS_CHROMEVOX_TUTORIAL_RESOURCES_TITLE">
Resources
</message>
<message desc="The label for the button that restarts the quick orientation in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_RESTART_QUICK_ORIENTATION_BUTTON">
Restart quick orientation
</message>
<message desc="The label for the button that moves to the previous lesson in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_PREVIOUS_LESSON_BUTTON">
Previous lesson
</message>
<message desc="The label for the button that moves to the next lesson in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_NEXT_LESSON_BUTTON">
Next lesson
</message>
<message desc="The label for the button that moves to the main menu in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_MAIN_MENU_BUTTON">
Main menu
</message>
<message desc="The label for the button that moves to the lesson menu in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_LESSON_MENU_BUTTON">
All lessons
</message>
<message desc="The label for the button that exits the tutorial." name="IDS_CHROMEVOX_TUTORIAL_EXIT_BUTTON">
Exit tutorial
</message>
<message desc="The label for the button that opens the practice area in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_PRACTICE_AREA_OPEN_BUTTON">
Practice area
</message>
<message desc="The label for the button that closes the practice area in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_PRACTICE_AREA_CLOSE_BUTTON">
Close practice area
</message>
<message desc="Spoken to give supplemental information when focusing the main menu header in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_MAIN_MENU_HEADER_DESCRIPTION" is_accessibility_with_no_ui="true">
Press Search + Right Arrow, or Search + Left Arrow to browse topics
</message>
<message desc="Spoken to give supplemental information when focusing the lesson menu header in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_LESSON_MENU_HEADER_DESCRIPTION" is_accessibility_with_no_ui="true">
Press Search + Right Arrow, or Search + Left Arrow to browse lessons for this topic
</message>
<message desc="Spoken to give supplemental information when focusing lesson titles in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_LESSON_TITLE_DESCRIPTION" is_accessibility_with_no_ui="true">
Press Search + Right Arrow, or Search + Left Arrow to navigate this lesson
</message>
<message desc="Text content for the 'Welcome to ChromeVox!' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_INTRO_TEXT">
Welcome to the ChromeVox tutorial. To exit this tutorial at any time, press the Escape key on the top left corner of the keyboard. To turn off ChromeVox, hold Control and Alt, and press Z. When you're ready, use the spacebar to move to the next lesson.
</message>
<message desc="Title for the 'Essential Keys: Control' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_CONTROL_TITLE">
Essential Keys: Control
</message>
<message desc="Text content for the 'Essential Keys: Control' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_CONTROL_TEXT">
Let's start with a few keys you'll use regularly. The Control key can be used to stop any current speech. Find the Control key on the bottom left corner of your keyboard. To continue, press the Control key.
</message>
<message desc="Title for the 'Essential Keys: Shift' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_SHIFT_TITLE">
Essential Keys: Shift
</message>
<message desc="Text content for the 'Essential Keys: Shift' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_SHIFT_TEXT">
Now, find the left Shift key, which is directly above the Control key. To continue, press the left Shift key.
</message>
<message desc="Title for the 'Essential keys: search' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_SEARCH_TITLE">
Essential Keys: Search
</message>
<message desc="Text content for the 'Essential keys: search' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_SEARCH_TEXT">
Next, you’ll learn about the Search key. The Search key is used in combination with other keys for ChromeVox commands. The Search key is immediately above the left Shift key. To continue, press the Search key.
</message>
<message desc="Title for the 'Basic Navigation' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_BASIC_NAVIGATION_TITLE">
Basic navigation
</message>
<message desc="Text content for the 'Basic Navigation' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_BASIC_NAVIGATION_MOVE_TEXT">
Now you’ll learn some basic navigation. You can hold Search and press the arrow keys to move around the screen. To continue, press Search + Right arrow.
</message>
<message desc="Text content for the 'Basic Navigation' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_BASIC_NAVIGATION_CLICK_TEXT">
If you reach an item you want to click, press Search + Space. Try it now to continue.
</message>
<message desc="Title for the 'Tab Navigation' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_TAB_TITLE">
Tab Navigation
</message>
<message desc="Text content for the 'Tab Navigation' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_TAB_TEXT">
You can also use the Tab key to move to the next interactive item on the screen. Find the Tab key, which is directly above the Search key. To continue, press the Tab key.
</message>
<message desc="Title for the 'Tab Navigation Continued' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_SHIFT_TAB_TITLE">
Tab Navigation Continued
</message>
<message desc="Text content for the 'Tab Navigation Continued' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_SHIFT_TAB_TEXT">
You can use Shift + Tab to move to the previous interactive item. To continue, press Shift + Tab.
</message>
<message desc="Title for the 'Enter' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_ENTER_TITLE">
Enter
</message>
<message desc="Text content for the 'Enter' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_ENTER_TEXT">
You can also press Enter to activate items. For example, Enter can be used to submit text in a form. To continue, press Enter.
</message>
<message desc="Title for the 'Drop-down lists' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_LISTS_TITLE">
Drop-Down Lists
</message>
<message desc="Text content for the 'Drop-down lists' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_LISTS_TEXT">
There will be times when you need to select an item from a drop-down list. To do so, first expand the list by pressing Search + Space. Then use the Up and Down arrow keys to select an item. Finally, collapse the list by pressing Search + Space.
</message>
<message desc="Text content for the 'Drop-down lists' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_LISTS_CONTINUE_TEXT">
Press Search + Right arrow to find the practice area or the Next lesson button. Then press Search + Space to activate.
</message>
<message desc="Title for the practice area of the drop-down lists lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_LISTS_PRACTICE_TITLE">
Practice area: Drop-down lists
</message>
<message desc="Instructions for the practice area of the drop-down lists lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_LISTS_PRACTICE_INSTRUCTIONS">
Try selecting your favorite season from the list.
</message>
<message desc="A label for a select element in the drop-down lists lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_LISTS_PRACTICE_LABEL">
My favorite season
</message>
<message desc="An option of the select element in the drop-down lists lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_LISTS_PRACTICE_SPRING">
Spring
</message>
<message desc="An option of the select element in the drop-down lists lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_LISTS_PRACTICE_SUMMER">
Summer
</message>
<message desc="An option of the select element in the drop-down lists lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_LISTS_PRACTICE_FALL">
Fall
</message>
<message desc="An option of the select element in the drop-down lists lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_LISTS_PRACTICE_WINTER">
Winter
</message>
<message desc="Title for the 'Quick orientation complete' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_COMPLETE_TITLE">
Quick orientation complete!
</message>
<message desc="Text content for the 'Quick orientation complete' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_COMPLETE_TEXT">
Well done! You’ve learned the ChromeVox basics. You can go through the tutorial again or exit this tutorial by finding and clicking on a button below.
</message>
<message desc="Text content for the 'Quick orientation complete' lesson in the quick orientation." name="IDS_CHROMEVOX_TUTORIAL_QUICK_ORIENTATION_COMPLETE_ADDITIONAL_TEXT">
After you set up your device, you can come back and view more tutorials by pressing Search + O, then T.
</message>
<message desc="Title for the practice area of the jump commands lists lesson in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_JUMP_PRACTICE_TITLE">
Practice area: Jump commands
</message>
<message desc="Instructions for the practice area of the jump commands lesson in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_JUMP_PRACTICE_INSTRUCTIONS">
Try jumping by heading to navigate the text below.
</message>
<message desc="The lesson menu header in the tutorial." name="IDS_CHROMEVOX_TUTORIAL_LESSON_MENU_HEADER">
<ph name="topic">$1<ex>Quick Orientation</ex></ph> Tutorial, <ph name="lessons">$2<ex>3</ex></ph> Lessons
</message>
<message desc="A spoken announcement given in the tutorial if the user becomes inactive." name="IDS_CHROMEVOX_TUTORIAL_HINT_NAVIGATE" is_accessibility_with_no_ui="true">
Hint: Hold Search and press the arrow keys to navigate.
</message>
<message desc="A spoken announcement given in the tutorial if the user becomes inactive." name="IDS_CHROMEVOX_TUTORIAL_HINT_CLICK" is_accessibility_with_no_ui="true">
Hint: Press Search + Space to activate the current item.
</message>
<message desc="A spoken announcement given in the tutorial if the user becomes inactive." name="IDS_CHROMEVOX_TUTORIAL_HINT_EXIT" is_accessibility_with_no_ui="true">
Hint: Press Escape if you would like to exit this tutorial.
</message>
</grit-part> </grit-part>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment