Use language picker for cloud tts language (#16363)

* Use language picker for cloud tts language

* Update ha-browse-media-tts.ts
This commit is contained in:
Bram Kragten 2023-05-02 10:49:01 +02:00 committed by GitHub
parent 3ed3dab0a1
commit f2a8528429
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 54 additions and 61 deletions

View File

@ -21,6 +21,7 @@ import { buttonLinkStyle } from "../../resources/styles";
import { HomeAssistant } from "../../types";
import "../ha-select";
import "../ha-textarea";
import "../ha-language-picker";
export interface TtsMediaPickedEvent {
item: MediaPlayerItem;
@ -103,21 +104,17 @@ class BrowseMediaTTS extends LitElement {
return html`
<div class="cloud-options">
<ha-select
fixedMenuPosition
naturalMenuWidth
<ha-language-picker
.hass=${this.hass}
.label=${this.hass.localize(
"ui.components.media-browser.tts.language"
)}
.value=${selectedVoice[0]}
@selected=${this._handleLanguageChange}
.languages=${languages}
@closed=${stopPropagation}
@value-changed=${this._handleLanguageChange}
>
${languages.map(
([key, label]) =>
html`<mwc-list-item .value=${key}>${label}</mwc-list-item>`
)}
</ha-select>
</ha-language-picker>
<ha-select
fixedMenuPosition
@ -184,10 +181,10 @@ class BrowseMediaTTS extends LitElement {
}
async _handleLanguageChange(ev) {
if (ev.target.value === this._cloudOptions![0]) {
if (ev.detail.value === this._cloudOptions![0]) {
return;
}
this._cloudOptions = [ev.target.value, this._cloudOptions![1]];
this._cloudOptions = [ev.detail.value, this._cloudOptions![1]];
}
async _handleGenderChange(ev) {
@ -256,7 +253,8 @@ class BrowseMediaTTS extends LitElement {
display: flex;
justify-content: space-between;
}
.cloud-options ha-select {
.cloud-options ha-select,
ha-language-picker {
width: 48%;
}
ha-textarea {

View File

@ -1,6 +1,5 @@
import { caseInsensitiveStringCompare } from "../../common/string/compare";
import { LocalizeFunc } from "../../common/translations/localize";
import { translationMetadata } from "../../resources/translations-metadata";
import { HomeAssistant } from "../../types";
export interface CloudTTSInfo {
@ -11,7 +10,7 @@ export const getCloudTTSInfo = (hass: HomeAssistant) =>
hass.callWS<CloudTTSInfo>({ type: "cloud/tts/info" });
export const getCloudTtsLanguages = (info?: CloudTTSInfo) => {
const languages: Array<[string, string]> = [];
const languages: string[] = [];
if (!info) {
return languages;
@ -23,25 +22,9 @@ export const getCloudTtsLanguages = (info?: CloudTTSInfo) => {
continue;
}
seen.add(lang);
let label = lang;
if (lang in translationMetadata.translations) {
label = translationMetadata.translations[lang].nativeName;
} else {
const [langFamily, dialect] = lang.split("-");
if (langFamily in translationMetadata.translations) {
label = `${translationMetadata.translations[langFamily].nativeName}`;
if (langFamily.toLowerCase() !== dialect.toLowerCase()) {
label += ` (${dialect})`;
}
}
}
languages.push([lang, label]);
languages.push(lang);
}
return languages.sort((a, b) => caseInsensitiveStringCompare(a[1], b[1]));
return languages;
};
export const getCloudTtsSupportedGenders = (

View File

@ -8,6 +8,7 @@ import "../../../../components/ha-card";
import "../../../../components/ha-select";
import "../../../../components/ha-svg-icon";
import "../../../../components/ha-switch";
import "../../../../components/ha-language-picker";
import { CloudStatusLoggedIn, updateCloudPref } from "../../../../data/cloud";
import {
CloudTTSInfo,
@ -54,34 +55,33 @@ export class CloudTTSPref extends LitElement {
'"tts.cloud_say"'
)}
<br /><br />
<div class="row">
<ha-language-picker
.hass=${this.hass}
.label=${this.hass.localize(
"ui.panel.config.cloud.account.tts.default_language"
)}
.disabled=${this.savingPreferences}
.value=${defaultVoice[0]}
.languages=${languages}
@value-changed=${this._handleLanguageChange}
>
</ha-language-picker>
<ha-select
.label=${this.hass.localize(
"ui.panel.config.cloud.account.tts.default_language"
)}
.disabled=${this.savingPreferences}
.value=${defaultVoice[0]}
@selected=${this._handleLanguageChange}
>
${languages.map(
([key, label]) =>
html`<mwc-list-item .value=${key}>${label}</mwc-list-item>`
)}
</ha-select>
<ha-select
.label=${this.hass.localize(
"ui.panel.config.cloud.account.tts.default_gender"
)}
.disabled=${this.savingPreferences}
.value=${defaultVoice[1]}
@selected=${this._handleGenderChange}
>
${genders.map(
([key, label]) =>
html`<mwc-list-item .value=${key}>${label}</mwc-list-item>`
)}
</ha-select>
<ha-select
.label=${this.hass.localize(
"ui.panel.config.cloud.account.tts.default_gender"
)}
.disabled=${this.savingPreferences}
.value=${defaultVoice[1]}
@selected=${this._handleGenderChange}
>
${genders.map(
([key, label]) =>
html`<mwc-list-item .value=${key}>${label}</mwc-list-item>`
)}
</ha-select>
</div>
</div>
<div class="card-actions">
<mwc-button @click=${this._openTryDialog}>
@ -115,11 +115,11 @@ export class CloudTTSPref extends LitElement {
}
async _handleLanguageChange(ev) {
if (ev.target.value === this.cloudStatus!.prefs.tts_default_voice[0]) {
if (ev.detail.value === this.cloudStatus!.prefs.tts_default_voice[0]) {
return;
}
this.savingPreferences = true;
const language = ev.target.value;
const language = ev.detail.value;
const curGender = this.cloudStatus!.prefs.tts_default_voice[1];
const genders = this.getSupportedGenders(
@ -185,6 +185,18 @@ export class CloudTTSPref extends LitElement {
right: auto;
left: 24px;
}
.row {
display: flex;
}
.row > * {
flex: 1;
}
.row > *:first-child {
margin-right: 8px;
}
.row > *:last-child {
margin-left: 8px;
}
.card-actions {
display: flex;
flex-direction: row-reverse;