Multiple language dialogue in Scratch projects

multiple language dialogue in Scratch projects using lists

Scratch for multiple language dialogue

In this lesson, we are expanding on a previous lesson. In that lesson, we used lists to cycle through dialogue. That project is available through the link below. Make a copy of the project for use in this lesson.

https://scratch.mit.edu/projects/470830122

Click the flag to go through the project. The diver cycles through dialogue. The dialogue is stored in a list. A loop is used to call each dialogue item in the list. A separate list is used for the question and answer portion of the dialogue.

The upcoming lesson extends the use of lists to create dialogue in different languages. The lesson underscores the effectiveness and usability of lists in projects. Lists are useful in reducing the number of lines of code used in a project.

I encourage you to go through the lesson on dialogue and lists. Use the link below to access that lesson.

Stories and interactive projects with lists

Project resources

In this project, we use several lists for several languages. The link below is for a Zip file with several text files. The text files contain the dialogue used in the project for multiple languages. The language options include English, French, Italian, Spanish, and German. Use the link to download the text files. The files are in a ZIP folder. Extract the files from the folder.

Download ZIP file

Use the link above to get a copy of the project created up to this point. The link is available below for your convenience.

https://scratch.mit.edu/projects/470830122

My blocks

An essential part of code development is the use of Functions. Functions organize groups of tasks. The code we have up to now has two portions. The first part of the program begins with a dialogue. The second part contains questions and responses. We can divide this portion into one where we prompt for the visitor’s name and one where we prompt for the tour request.

Dividing code into separate functions helps with the organization of our program.

This project is going to have many code blocks. Function blocks will go a long way in helping us organize the sections in our program.

Go to the My Blocks section. Click the —Make a Block— button.

make a block button

Set the block name to “welcome message”; click the OK button.

block name set

Two blocks are created. One block is in the My Blocks section. The other is placed on the canvas. This is called the Hat block. It caps the code like a hat.

code hat block

Click the Make a Block button again. Set the new block name to “visitor’s name”; click the OK button.

created code block

Create another block. Set the block name to “tour request”.

Arrange the canvas block in a row along the top of the coding canvas. Move the other code blocks down and away from the blocks we created.

three hat blocks on canvas

Disconnect the code from the green hat block. Set the hat block to one side for now.

code disconnected from green flag

Connect all the code to the “welcome message” hat block.

connected code to welcome message hat block

Separate the —Ask— code from the repeat loop.

disconnected code blocks

Attach the —Ask— code to the “visitor’s name” hat block.

code connected to visitors name hat block

Separate the code at the —Repeat until— block; connect the rest of the code to the “tour request” hat block.

code connected to hat block

Find the green hat code block. Place it somewhere visible.

green flag hat block

We want the code to begin at the welcome message when the green flag is clicked. Get the “welcome message” block and attach it to the green flag hat.

This block instructs the program to find the “welcome message” hat block and run the code that is attached to that block.

welcome message block connected

We want to ask for the visitor’s name after the welcome message. Place the “visitor’s name” block after the repeat loop of the welcome message.

visitor’s name block connected

We want to ask about the tour after we get the visitor’s name. Attach the “tour request” block to the end of the visitor’s name code.

code block connected

My Blocks is useful for grouping code into easily identifiable sections. Click the green flag and run through the program. Everything should work the same.

Make room

We have lots of code on the canvas. Let’s tidy up before proceeding to the next part of the lesson.

Click the minimize panel button.

stage minimize button

Click the zoom out button a couple of times.

zoom button

Move the code blocks to the right side and out of the way. We won't need them for a while.

blocks move to the far right

Zoom back in to focus on the green flag hat block.

Language lists

Each text file represents a separate list. We need to create each list before importing the text files. Use the text file names for the list names.

Go to the Variables section; click the Make a List button.

make a list button

Set the list name to “languages”; click the OK button.

list name

Lists are created and displayed on the stage. We are going to create several lists. We don’t need to display them all. Remove the checkmark from the list before creating the next.

list code blocks

Click the Make a List button again. Set the list name to “French dialogue”; click the OK button. Remove the checkmark from the list.

list name

Create another list; set the list name to “French Q&A dialogue”. Save the list and hide it.

list name

Repeat this process for each of the text files.

We have the dialogue for the English portion. It needs to be renamed. Right-click on the dialogue list; select the rename list option.

rename list option

Set the list name to “English dialogue”.

list name set

Right-click on the Q&A dialogue list; change the list name to "English Q&A dialogue".

list name

I will talk more about these lists when that portion of the lesson arrives. Create a list for each of the text files. Set the list name to the name of the text file. I know I’ve said that before but it is important to name the list names appropriately. It will help during the coding process.

Import lists

Each list needs information that makes it a list. This is where we import those text files downloaded earlier. Place a checkmark on the English language list.

list selected

The empty list appears on the stage. Click the expand stage button. We collapsed the stage in a previous step.

empty list on stage

Right-click on the list; select the import option.

list import option

Select the English language plain text file.

list plain text files

The text file has only one entry.

one list item

Remove the check from the English language list; place a checkmark on French dialogue.

french list selected

Right-click the French dialogue list; select import.

import option

Select the French dialogue plain text file.

selected plain text file

Expand the list box to get a better view of the list contents.

french dialogue list items

Repeat this process for all the lists. Yes, it is a little tedious; coding isn't all glamor. Make sure to hide all the lists after importing. Lists are the powerful and silent assistants in the background.

Choose a language

We want the diver to watch the visitors and invite them to attend a tour of the aquarium. The aquarium is home to visitors from countries around the world. The divers have presentations in multiple languages. The diver wants to inform visitors of tours that are available in different languages.

The visitor needs to type a language to accept the invitation. Go to the Sensing section and place an Ask block on the canvas.

ask block

The text in the Ask parameter is sent to the sprite. It appears in a speech bubble. We don't need that text because we have some text of our own. Erase the contents of the parameter.

no parameter in ask block

We have the invitation text in a list. Place a —Say…for…seconds— code block from the Looks section next to the —Ask— block.

say code block

Go to the Variable section and the list blocks. Place an —item…of…list— block into the Say parameter.

list block in way block parameter

Select the “welcome languages” list.

welcome languages list selected

Place a checkmark on the “welcome languages” list.

checkmark enabled

The list contains a welcome and instructions in five languages. The code will cycle through the invitations until the visitor enters a valid language. Hide the list again.

list of languages dialogue

Get a —Repeat Until— block and place it around the —Say— block. This block repeats the —Say— block until we get an answer.

repeat until loop code block

To cycle through the invitations, we need to increment the list item. For that, we need a variable. Go to the Variables section; click the —Make a Variable— button.

make variable button

Set the name to “invite counter”; click the OK button.

variable name

Place the —Set variable— on the canvas but don’t attach it to any code yet. Attach the —Change Variable By— block to the —Say— block. Change the variable of both blocks to “invite counter”.

variable block

This code resides in a loop. Attach the Forever loop around the Change and Say blocks. The —Forever— loop temporary so we can test the loop. Attach the —Set Variable— block to the —Forever— loop.

connected blocks

The Set block initializes the variable to Zero. The Change block adds one to the variable. The Say block displays the content of the items in the list. The item is currently set to one. This item needs to change as we cycle through the loop. Get the —Invite Counter— variable; place it in the —Item— parameter.

variable in parameter

The list contains 10 items. We need to cycle back to the first item after we reach the last. Place an —If…then— block after the —Say— block inside the loop.

if condition block attached

Place an —Equality Operator— inside the If condition.

An equality operator is different from a regal equal. An equality operator is used to determine if two values are identical. The Equal operation Assigns a value to a variable.

connected operator block

Place the “Invite Counter” variable into the left side of the equality operator. Go into the List blocks. Place the —Length of…— block into the right side of the operator. Change the list to “welcome languages”.

The operator compares the “Invite Counter” variable to the number of items in the “Welcome Languages” list. If they are the same, then the condition is True. For example, if the value in the Invite Counter is 10, then it is equal to the number of items in the list. That means we have reached the end of the list.

variable and list blocks in parameters

Place the —Set Variable to…— block inside the If condition. If the counter and the list item count are the same, then set the Invite Counter variable to zero.

variable counter increment block

Click on the first block of the code. This executes these lines of code only.

blocks running code

You will see the diver actor cycle through the dialogue in the list. The actor will do this until we stop the code; stop the code using the Stop sign button.

actor dialogue in languages

The list length block makes the code dynamic. This makes it possible to add more languages to the list and not need to update the code.

Go to the Lists and place a checkmark on the “Welcome Languages” list. Click the Add list item button twice.

add list item button

Let’s add Russian to our list of languages. Copy and paste the lines below.

Добро пожаловать, я говорю по-русски.

Введите русский язык в поле.

list with items added

Hide the list; click the first code block to run through the languages. Russian is now one of the languages we speak.

actor dialogue in Russian

The Forever loop is just to test the code. Let’s replace this loop with another. Disconnect the blocks from the Forever loop.

forever code block

Remove the Forever Loop and place a —Repeat Until— loop on the canvas. Connect the code to the loop.

repeat until loop and connected blocks

We want to repeat the invitation until a visitor enters a language. Any one of the six languages will be sufficient.

To check the language entered, we need a variable to hold the answer. The Answer variable, part of the Ask code, doesn’t provide much flexibility. We need to create one of our own.

Go to the Variables section; make a variable. Name the variable “language answer”.

list language selected

Connect the —Set Variable To— block to the —Ask— block. Select the “language answer” variable.

connected code blocks

Place the “Answer” variable from the Sensing section into the Set parameter.

answer variable connected

Let’s work on the loop. The loop needs to check for multiple conditions. It needs to compare the answer with the available languages. The program will take the visitor on the tour that offers the tour in the selected language.

Checking the language options

The program also needs to filter for a language that is not available and inform the visitor that the language is not one of the options.

Place the Equal operator into the Repeat loop parameter.

connected code blocks

Place the “language answer” variable into the left side of the Equality operator parameter.

connected code block

Type English into the right side of the operator. Typing the language into the parameter is fine if we just want to check for English, but there are five other language options.

word in parameter

To check other languages we need to include another operator.

Place the OR operator next to the code blocks.

operator on canvas

Remove the Equality operator from the loop and place it into the left side of the OR operator.

disconnected code block

Place the OR operator into the loop parameter.

Now we can check for English OR another language.

operator in operator parameter

Right-click the Equality operator; select duplicate.

duplicate code option

Place the code on the right side of the OR operator. Change the language to French. There are four more languages to go.

operators in operator parameters

A better way with lists

Before we go on with the rest of the code I do want to tell you that this is not the most efficient way to check for the input language. The code blocks are cumbersome. The code needs to be updated each time we add a language.

Look at the image below. This is the complete code block checking for a language input; long and cumbersome.

complex or operations

There is a more efficient way to check for language input. Programming is always about the easiest and most efficient way of getting a task done.

Remove the operators we placed in the Repeat loop; trash them.

removed operators

Go to the List code blocks. Find the List —contains…block— and place it in the loop parameter.

list block in loop parameter

Place the “language answer” variable into the parameter.

This code is more efficient. It looks to see if the answer is in the list. The list contains all the available languages. The code checks all the items in the list. If the answer is in the list then the loop will stop repeating. We don’t have to update the code if we add or remove a language.

Language not available

The loop continues if the answer is not available in the list.

language answer variable

We should always include a way to break out of a loop. That brings us to the next part of the program.

When a visitor enters a valid language the program will jump to that part of the invitation in the selected language. If the visitor enters a language that is not available in the list we need to prompt the visitor that we do not offer the tour in that language.

Move the code we created to one side. Place an —If…then…else— block on the canvas. Place an Equality operator into the parameter. Place the "language answer" variable on the left side of the operator. Type French into the right side of the operator.

condition code block and operator

We are going to use a series of nested conditions. If the visitor enters French for the language, the program will proceed to the French portion of the presentation.

Here is the thing to consider. We are using the English version of the French language to compare the answer. This poses a problem if the person is a native speaker of French. They are likely to use Francais or français with the diacritical mark. The hook below the letter 'c' is a cedilla or une cédille in French.

We need to check for these alternative versions. This is another opportunity to use Lists.

Place a checkmark on the “French language” list.

list selected

The list contains two options for French. Let’s add one more option to include the word Francais without the diacritical mark.

language list items

Click the Plus button to insert a line. Type “Francais” in the added line. Hide the list.

added list item

Remove the Equality operator. Insert the —List contains— block into the condition parameter. Select the French language list. Insert the “language answer” into the parameter.

If any of the three language spellings is entered, the condition will be true. The condition will then take the visitor to the French portion of the presentation.

parameter in list block

Let's add conditions for the other languages. Right-click the If…then…else condition; select duplicate.

duplicate code block option

Place the copy into the Else section of the loop. Choose the “German language” list.

connected code

Duplicate this condition and place it inside the Else part of the condition. Change the list to “Italian language”.

updated language list

Repeat this process until all languages are in condition statements.

The program needs to jump to the appropriate language. To do that, we need to create some blocks.

Go to the My Blocks section; click the —Make a Block— button.

make block button

Set the block name to “English”; click the OK button.

block name

Click the Make a Block button again; set the name to “French”. Repeat this process for each language.

French block

Arrange the hat blocks in a row along the top of the canvas.

hat code blocks

Place the "French" block from the My Blocks section into the –If– condition for the French language.

French code block

Place the “German” block into the If condition for the German language. Repeat this process for each of the language conditions.

German code block

We need to connect each section to the corresponding dialogue for that language.

Language dialogue branches

At the beginning of the lesson, we created blocks to segment the code into separate functions. The blocks begin with the Welcome message. I used these to introduce you to the concept. We don't need these blocks and we don't need to separate the code into these functions. They would add more complexity to the program.

Find the “welcome message” attached to the green flag hat. Disconnect the block from the hat block.

disconnected block

Move the “welcome message” block to the code panel; this moves it to the trash.

welcome message block

Disconnect the other blocks from the code; include the hat blocks. Drag all the blocks to the code panel.

disconnected blocks

Reconnect the code blocks. Make sure to reconnect them in the correct order. The counter goes first, followed by the Ask and the Repeat until loops.

connected code blocks

This code represents the English version of the tour. We need the same code to represent each of the other languages.

Right-click on the top code block; select the duplicate option.

duplicate option

Place the duplicate code to one side of the original.

duplicate set of code

Use the list selector to choose the French dialogue list.

selected list

Go to next list reference. Select the French Q&A dialogue list.

selected list

Repeat this process for each of the list references. Replace the list with the corresponding list in French.

selected list in code

Right-click on the first block of the updated code and select duplicate. Place the duplicate to one side of this code.

duplicate list of blocks

Change the list references to the next language —German. Update all the list references to the same language.

selected list

Duplicate this updated code and update the language list in those lines of code. Repeat this process for each of the languages.

Place the language hat blocks at the beginning of each code for the corresponding language.

code connected to language hats

Attach the condition blocks to the —Ask— and —language answer— blocks.

attached code

We need a few more steps before we are done; hang in there.

Two operations at once

We need the code to cycle through the message in different languages. We also need the code to ask the question and wait for a response. We can do both.

Connect the green flag hat to the Ask code.

connected code

Get another green flag hat and connect it to the invitation loop.

connected blocks

Click the green flag to run the program.

Everything seems to work correctly until we enter a language. The welcome message continues to cycle with the chosen language dialogue.

Fixing bugs

There are a couple of bugs to fix. I caught them at the same time you ran the program. I could have edited my lesson to avoid them, but that would avoid a teachable moment. Bugs are part of the coding process. Fixing bugs is part of the process.

The problem with the cycling invitation message lies in the list. The answer is checking against the "welcome languages" list. It needs to check against the "languages" list.

selected list

The next bug happens when we choose to run the program again. The variable for the language holds on to the last answer. The variable needs to be initialized at the beginning of the program.

Place a Set variable block before the Ask block. Set the variable to “language answer”. Erase the value parameter.

code connected

Click the green flag and run through the program. Fix any bugs you might find. Check all the languages.

Language not available

The condition statements check for the available languages. A visitor might enter a language not available or might type something that doesn’t make sense. The last Else statement is here to take care of those situations.

If the visitor enters something not available on the language list, we want to send a message to the looping invitation. We want to loop to temporarily stop and respond to the input.

Place a Set variable to block in the Else section. Set the variable to “language answer”. Type “not available” for the variable value. This replaces the visitor’s input with the words “not available”. This allows us to control the message sent to the loop in the next step.

code in place

Place an If…then condition after the –If– condition in the invite loop.

code block connected

Place an Equality operator into the parameter. Place the “language answer” variable into the left side of the Equality operator. Type “not available” into the right side of the operator. Place a Say block into the If condition. Type “I’m sorry. I don’t understand that language”. Change the wait time to 4-seconds.

variable in parameter

We need to erase the “language answer” variable so the loops can continue. Place the —Set variable— block below the Say block in the loop. Erase the value passed into the variable.

code in place

We need to make sure to keep asking the visitors for the language until a correct language is provided. Get a Repeat Until loop and move it under the —Set variable— code.

loop being connected

Place the —List contains— block into the loop parameter. Set the list to “languages”. Place the “language answer” variable into the parameter.

code blocks

Click the green flag to run the program. Enter nonsense into the answer and watch for the message to appear.

Yes and No

The final part of the code is to set the language answer options. Open the Yes and No answer lists.

There are several ways to say yes or no in different languages. Several languages use the same form. Spanish and Italian use Si. English, Spanish, and Italian all use the same No. Yes is yes in any language. The same is true for No. We don't need a list for each language. Hide the lists.

list displayed

Go to the code for the English response. Go to the section where we need yes or no responses.

updated code

Remove both Equality operators from the loop parameter. Keep the OR operator.

variable added

Place a List contains code block into the left side of the Equality operator. Select the "no answers" list. Place the "answer" variable into the parameter.

variable added

Place the same block on the right side of the equality operator. Choose the “yes answers” list; place the “answer” variable into the parameter.

updated code

Remove the equality operator from the If parameter.

duplicate code

Duplicate the "yes answers" contains code block.

duplicate option

Place the block into the If parameter.

code added

Remove the code from the other If parameter. Duplicate the "no answers" contains code block. Place it into the empty parameter.

The yes and no conditions are now updated for the English language function. Repeat this process for the other languages. Duplicate the blocks from this code to save time.

code for loop until condition

Run through the program and use a different language. Answer with yes or no for the chosen language.

One last bug

There is one last bug we have not addressed. We added the Russian language in an earlier part of the lesson. We did not add the language to the list of available languages.

Open the “languages” list. Add two rows and add Russian. Use the Cyrillic text below for Russian.

русский

added language to list

Conclusion

That brings us to the end of this part of the project. This is one of the longest sections. We learned several techniques to develop an interactive project for multiple languages. We will return to these techniques in later lessons.

Use the link below to get a copy of the finished project.

https://scratch.mit.edu/projects/472572372

Previous
Previous

Scratch animation and sound

Next
Next

Stories and Interactive projects with Lists