Add “set language” block (#1610)

This commit is contained in:
Eric Rosenbaum 2018-09-24 17:16:10 -04:00 committed by GitHub
parent e2c6c7667b
commit 622aa0f2b0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -62,6 +62,12 @@ class Scratch3Text2SpeechBlocks {
*/ */
this.runtime = runtime; this.runtime = runtime;
/**
* The current language code to use for speech synthesis.
* @type {string}
*/
this.currentLanguage = 'en-US';
/** /**
* Map of soundPlayers by sound id. * Map of soundPlayers by sound id.
* @type {Map<string, SoundPlayer>} * @type {Map<string, SoundPlayer>}
@ -132,6 +138,28 @@ class Scratch3Text2SpeechBlocks {
}; };
} }
/**
* An object with language names mapped to their language codes.
*/
get LANGUAGE_INFO () {
return {
'Danish': 'da-DK',
'Dutch': 'nl-NL',
'English': 'en-US',
'French': 'fr-FR',
'German': 'de-DE',
'Icelandic': 'is-IS',
'Italian': 'it-IT',
'Japanese': 'ja-JP',
'Polish': 'pl-PL',
'Portuguese (Brazilian)': 'pt-BR',
'Portuguese (European)': 'pt-PT',
'Russian': 'ru-RU',
'Spanish (European)': 'es-ES',
'Spanish (Latin American)': 'es-US'
};
}
/** /**
* The key to load & store a target's text2speech state. * The key to load & store a target's text2speech state.
* @return {string} The key. * @return {string} The key.
@ -224,10 +252,27 @@ class Scratch3Text2SpeechBlocks {
defaultValue: QUINN_ID defaultValue: QUINN_ID
} }
} }
},
{
opcode: 'setLanguage',
text: formatMessage({
id: 'text2speech.setLanguageBlock',
default: 'set language to [LANGUAGE]',
description: 'Set the language for speech synthesis.'
}),
blockType: BlockType.COMMAND,
arguments: {
LANGUAGE: {
type: ArgumentType.STRING,
menu: 'languages',
defaultValue: this.currentLanguage
}
}
} }
], ],
menus: { menus: {
voices: this.getVoiceMenu() voices: this.getVoiceMenu(),
languages: this.getLanguageMenu()
} }
}; };
} }
@ -260,6 +305,17 @@ class Scratch3Text2SpeechBlocks {
})); }));
} }
/**
* Get the menu of languages for the "set language" block.
* @return {array} the text and value for each menu item.
*/
getLanguageMenu () {
return Object.keys(this.LANGUAGE_INFO).map(languageName => ({
text: languageName,
value: this.LANGUAGE_INFO[languageName]
}));
}
/** /**
* Set the voice for speech synthesis for this sprite. * Set the voice for speech synthesis for this sprite.
* @param {object} args Block arguments * @param {object} args Block arguments
@ -274,6 +330,17 @@ class Scratch3Text2SpeechBlocks {
} }
} }
/**
* Set the language for speech synthesis.
* @param {object} args Block arguments
*/
setLanguage (args) {
// Only set the language if the arg is a valid language code.
if (Object.values(this.LANGUAGE_INFO).includes(args.LANGUAGE)) {
this.currentLanguage = args.LANGUAGE;
}
}
/** /**
* Stop all currently playing speech sounds. * Stop all currently playing speech sounds.
*/ */
@ -305,7 +372,7 @@ class Scratch3Text2SpeechBlocks {
// Build up URL // Build up URL
let path = `${SERVER_HOST}/synth`; let path = `${SERVER_HOST}/synth`;
path += `?locale=${this.getViewerLanguageCode()}`; path += `?locale=${this.currentLanguage}`;
path += `&gender=${gender}`; path += `&gender=${gender}`;
path += `&text=${encodeURI(words.substring(0, 128))}`; path += `&text=${encodeURI(words.substring(0, 128))}`;