diff --git a/src/components/ha-service-control.ts b/src/components/ha-service-control.ts index 556389da74fb..e1e1a612d6ed 100644 --- a/src/components/ha-service-control.ts +++ b/src/components/ha-service-control.ts @@ -464,10 +464,16 @@ export class HaServiceControl extends LitElement { ? computeObjectId(this._value.action) : undefined; + const descriptionPlaceholders = + domain && serviceName + ? this.hass.services[domain][serviceName].description_placeholders + : undefined; + const description = (serviceName && this.hass.localize( - `component.${domain}.services.${serviceName}.description` + `component.${domain}.services.${serviceName}.description`, + descriptionPlaceholders )) || serviceData?.description; @@ -536,7 +542,8 @@ export class HaServiceControl extends LitElement { .disabled=${this.disabled} .value=${this._value?.data?.entity_id} .label=${this.hass.localize( - `component.${domain}.services.${serviceName}.fields.entity_id.description` + `component.${domain}.services.${serviceName}.fields.entity_id.description`, + descriptionPlaceholders ) || entityId.description} @value-changed=${this._entityPicked} allow-custom-entity @@ -574,7 +581,8 @@ export class HaServiceControl extends LitElement { left-chevron .expanded=${!dataField.collapsed} .header=${this.hass.localize( - `component.${domain}.services.${serviceName}.sections.${dataField.key}.name` + `component.${domain}.services.${serviceName}.sections.${dataField.key}.name`, + descriptionPlaceholders ) || dataField.name || dataField.key} @@ -610,7 +618,10 @@ export class HaServiceControl extends LitElement { serviceName: string | undefined ) { return this.hass!.localize( - `component.${domain}.services.${serviceName}.sections.${dataField.key}.description` + `component.${domain}.services.${serviceName}.sections.${dataField.key}.description`, + domain && serviceName + ? this.hass.services[domain][serviceName].description_placeholders + : undefined ); } @@ -657,6 +668,10 @@ export class HaServiceControl extends LitElement { } const showOptional = showOptionalToggle(dataField); + const descriptionPlaceholders = + domain && serviceName + ? this.hass.services[domain][serviceName].description_placeholders + : undefined; return dataField.selector && (!dataField.advanced || @@ -678,14 +693,16 @@ export class HaServiceControl extends LitElement { >`} ${this.hass.localize( - `component.${domain}.services.${serviceName}.fields.${dataField.key}.name` + `component.${domain}.services.${serviceName}.fields.${dataField.key}.name`, + descriptionPlaceholders ) || dataField.name || dataField.key} ${this.hass.localize( - `component.${domain}.services.${serviceName}.fields.${dataField.key}.description` + `component.${domain}.services.${serviceName}.fields.${dataField.key}.description`, + descriptionPlaceholders ) || dataField?.description} ( if (config.action) { const [domain, serviceName] = config.action.split(".", 2); + const descriptionPlaceholders = + hass.services[domain][serviceName].description_placeholders; const service = - hass.localize(`component.${domain}.services.${serviceName}.name`) || - hass.services[domain][serviceName]?.name; + hass.localize( + `component.${domain}.services.${serviceName}.name`, + descriptionPlaceholders + ) || hass.services[domain][serviceName]?.name; if (config.metadata) { return hass.localize( diff --git a/src/panels/config/automation/add-automation-element-dialog.ts b/src/panels/config/automation/add-automation-element-dialog.ts index 96fd43225b79..0dbcad461815 100644 --- a/src/panels/config/automation/add-automation-element-dialog.ts +++ b/src/panels/config/automation/add-automation-element-dialog.ts @@ -556,13 +556,17 @@ class DialogAddAutomationElement `, key: `${SERVICE_PREFIX}${dmn}.${service}`, name: `${domain ? "" : `${domainToName(localize, dmn)}: `}${ - this.hass.localize(`component.${dmn}.services.${service}.name`) || + this.hass.localize( + `component.${dmn}.services.${service}.name`, + this.hass.services[dmn][service].description_placeholders + ) || services[dmn][service]?.name || service }`, description: this.hass.localize( - `component.${dmn}.services.${service}.description` + `component.${dmn}.services.${service}.description`, + this.hass.services[dmn][service].description_placeholders ) || services[dmn][service]?.description || "", diff --git a/src/panels/developer-tools/action/developer-tools-action.ts b/src/panels/developer-tools/action/developer-tools-action.ts index 0dd538d17f2c..12e4240bfedd 100644 --- a/src/panels/developer-tools/action/developer-tools-action.ts +++ b/src/panels/developer-tools/action/developer-tools-action.ts @@ -135,6 +135,11 @@ class HaPanelDevAction extends LitElement { ? computeObjectId(this._serviceData?.action) : undefined; + const descriptionPlaceholders = + domain && serviceName + ? this.hass.services[domain][serviceName].description_placeholders + : undefined; + return html`

@@ -307,12 +312,14 @@ class HaPanelDevAction extends LitElement {

${field.key}
${this.hass.localize( - `component.${domain}.services.${serviceName}.fields.${field.key}.description` + `component.${domain}.services.${serviceName}.fields.${field.key}.description`, + descriptionPlaceholders ) || field.description} ${this.hass.localize( - `component.${domain}.services.${serviceName}.fields.${field.key}.example` + `component.${domain}.services.${serviceName}.fields.${field.key}.example`, + descriptionPlaceholders ) || field.example} ` @@ -643,7 +650,11 @@ class HaPanelDevAction extends LitElement { } catch (_err: any) { value = this.hass.localize( - `component.${domain}.services.${serviceName}.fields.${field.key}.example` + `component.${domain}.services.${serviceName}.fields.${field.key}.example`, + domain && serviceName + ? this.hass.services[domain][serviceName] + .description_placeholders + : undefined ) || field.example; } example[field.key] = value; diff --git a/src/panels/logbook/ha-logbook-renderer.ts b/src/panels/logbook/ha-logbook-renderer.ts index ad5d89afbf51..8ba5497dac5d 100644 --- a/src/panels/logbook/ha-logbook-renderer.ts +++ b/src/panels/logbook/ha-logbook-renderer.ts @@ -400,7 +400,9 @@ class HaLogbookRenderer extends LitElement { ? `${domainToName(this.hass.localize, item.context_domain)}: ${ this.hass.localize( - `component.${item.context_domain}.services.${item.context_service}.name` + `component.${item.context_domain}.services.${item.context_service}.name`, + this.hass.services[item.context_domain][item.context_service] + .description_placeholders ) || this.hass.services[item.context_domain]?.[item.context_service]?.name || item.context_service diff --git a/src/panels/lovelace/common/handle-action.ts b/src/panels/lovelace/common/handle-action.ts index 56c60ccae31e..11b675fe29c9 100644 --- a/src/panels/lovelace/common/handle-action.ts +++ b/src/panels/lovelace/common/handle-action.ts @@ -67,7 +67,10 @@ export const handleAction = async ( await hass.loadBackendTranslation("title"); const localize = await hass.loadBackendTranslation("services"); serviceName = `${domainToName(localize, domain)}: ${ - localize(`component.${domain}.services.${service}.name`) || + localize( + `component.${domain}.services.${service}.name`, + hass.services[domain][service].description_placeholders + ) || serviceDomains[domain][service].name || service }`;