Объяснил
Хорошо, поэтому я отвечу на это в двух частях, учитывая тот факт, что вы вроде задали два вопроса, оба из которых относительно просты и, к счастью, просты.
Вопрос первый
Вы спрашивали, как получить _
выбранных языков, которые вы хотели бы поддерживать, ну, это просто, это так же просто, как манипулировать массивом, в моем примере яЯ использовал функцию reduce
, довольно простую вещь.
PS Ради некоторой консистенции я написал этот фрагмент в очень стиле, подобном тому, который я написал в другой вопрос , который вы задали в отношении speechSynthesis
.
Допущения
Как указано в комментариях к коду, я написал этот фрагмент так, чтобы не было дублированных записей, т.е.в приведенном ниже фрагменте вы получите список, содержащий только одну сущность, поддерживающую английский язык.Другими словами, у вас не будет обоих en-GB
& en-US
, конечно, вы можете изменить это, я просто предположил , что вы хотите этот тип функции, конечно, это доВы и ваши требования полностью.
// IIFE for the sake of it.
(function() {
"use strict";
// This is a simple list of languages that you wish to support.
var supportedLanguages = ['en', 'de', 'es', 'fr'];
var languages = [];
// This is essentially similar to jQuery's $.ready.
var ready = function(callback) {
var d = document,
s = d.readyState;
// DOMContentLoaded was fired
if (s == "complete" || s == "loaded" || s == "interactive") {
callback();
} else {
if (d.addEventListener) {
d.addEventListener("DOMContentLoaded", callback, false);
} else {
d.attachEvent("onDOMContentLoaded", callback);
}
}
};
// This is just a simple function to process whether or not you'd like to
// push a voice onto the array or not.
var shouldPush = function(array, object) {
var language = object.lang || '';
var snipped = language.substring(0, 2);
// Generate a list of all of the known languages.
var languageList = array.map(function(object) {
return object.lang;
});
// Create a list of short hand language names.
var snippedList = languageList.map(function(language) {
return language.substring(0, 2);
});
// Save having a bloated if statement, personally I find this
// more readable.
//
// Only push relevant ones, saves having any duplicated entities, i.e.
// this will not allow for both en-US & en-GB to be among the list,
// this can be altered, this is merely based on an assumption that you
// wouldn't want both en-US & en-GB, etc.
var isToPush = !snippedList.includes(snipped) &&
!languageList.includes(language) &&
supportedLanguages.includes(snipped);
// If true, push to array.
if (isToPush) {
array.push(object);
}
// Then of course return the array object.
return array;
};
// This is essentially the list of voices that you've picked to support.
var getSelectedLanguages = function() {
languages = speechSynthesis.getVoices().reduce(shouldPush, []);
};
// A starting point for this snippet.
var start = function() {
speechSynthesis.onvoiceschanged = function() {
getSelectedLanguages();
console.log(languages);
};
};
// Run the code when ready.
ready(start);
})();
Вопрос второй
Я не совсем уверен, есть ли «чистый и легкий» способ сделать это, проведя собственное исследование по этому вопросуЯ обнаружил, что выглядит так, как будто это потребует некоторой формы переделок.Один из лучших источников информации, которые я нашел, это этот вопрос .
Более подробно рассмотрев этот вопрос, похоже, что Artyom
также предполагает, что не существует простого способа добиться этого, он выглядит , как будто вы можете только добавитьязык путем установки языка в операционной системе, поэтому я склонен верить.
Заключение
Одна возможная идея состоит в том, что вы могли бы , и я подчеркиваю слово может возможно, сделайте это с помощью реализации собственного API, однако Я не могу представить, что это будет надежная или надежная реализация, так как мой вывод основан на исследованиях, предлагаемых длядополнительный язык, который будет включен, пользователь в некоторой степени отвечает за это, так как он выглядит так, как будто ему нужно, чтобы пользователь установил язык _
в своей ОС, чтобы speechSynthesis
чтобы использовать _
язык.
Я действительно нахожу немного странным, что кажется, что есть небольшая / нет формальная документация по этому предмету, скорее я просто нашел в основномнеофициальная документация, предложения и предположения.Однако это может быть связано с моим отсутствием расследования, учитывая, что я потратил ~ 15 минут на изучение этого вопроса.
Источники
- Ссылка на flaviocopes.com относительно
speechSynthesis
. - Ссылка на Artyom.js, aбиблиотека для API, связанных с речью.
- Ссылка на предыдущий вопрос переполнения стека, аналогичная второй части этого вопроса.
- Ссылка настатья среднего размера.
- Документация MDN.
- Пост в блоге на дереве.
Хотя у меня может не быть ответа, который вы хотите получить на свой второй вопрос, я надеюсь, что весь этот ответ помог в той или иной форме!:)