mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-14 04:46:34 +00:00
Load and subscribe to backend translations (#894)
* Load backend translations * Add support for component level state translations * Fix selected language backend translation loading
This commit is contained in:
parent
bae1ab822c
commit
101794c88e
@ -53,9 +53,11 @@ export default function computeStateDisplay(localize, stateObj, language) {
|
|||||||
} else {
|
} else {
|
||||||
stateObj._stateDisplay = localize(`state.${domain}.${stateObj.state}`);
|
stateObj._stateDisplay = localize(`state.${domain}.${stateObj.state}`);
|
||||||
}
|
}
|
||||||
// Fall back to default or raw state if nothing else matches.
|
// Fall back to default, component backend translation, or raw state if nothing else matches.
|
||||||
stateObj._stateDisplay = stateObj._stateDisplay
|
stateObj._stateDisplay = stateObj._stateDisplay
|
||||||
|| localize(`state.default.${stateObj.state}`) || stateObj.state;
|
|| localize(`state.default.${stateObj.state}`)
|
||||||
|
|| localize(`component.${domain}.state.${stateObj.state}`)
|
||||||
|
|| stateObj.state;
|
||||||
}
|
}
|
||||||
|
|
||||||
return stateObj._stateDisplay;
|
return stateObj._stateDisplay;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
<link rel='import' href='../../../bower_components/polymer/polymer-element.html'>
|
<link rel='import' href='../../../bower_components/polymer/polymer-element.html'>
|
||||||
|
|
||||||
<link rel='import' href='../../../src/util/hass-mixins.html'>
|
<link rel='import' href='../../../src/util/hass-mixins.html'>
|
||||||
|
<link rel="import" href="../../../src/util/hass-util.html">
|
||||||
|
|
||||||
<link rel='import' href='../ha-label-badge.html'>
|
<link rel='import' href='../ha-label-badge.html'>
|
||||||
|
|
||||||
@ -37,7 +38,7 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<ha-label-badge class$='[[computeClasses(state)]]'
|
<ha-label-badge class$='[[computeClasses(state)]]'
|
||||||
value='[[computeValue(state)]]'
|
value='[[computeValue(localize, state)]]'
|
||||||
icon='[[computeIcon(state)]]'
|
icon='[[computeIcon(state)]]'
|
||||||
image='[[computeImage(state)]]'
|
image='[[computeImage(state)]]'
|
||||||
label='[[computeLabel(localize, state, timerTimeRemaining)]]'
|
label='[[computeLabel(localize, state, timerTimeRemaining)]]'
|
||||||
@ -99,8 +100,9 @@ class HaStateLabelBadge extends
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
computeValue(state) {
|
computeValue(localize, state) {
|
||||||
switch (window.hassUtil.computeDomain(state)) {
|
const domain = window.hassUtil.computeDomain(state);
|
||||||
|
switch (domain) {
|
||||||
case 'binary_sensor':
|
case 'binary_sensor':
|
||||||
case 'device_tracker':
|
case 'device_tracker':
|
||||||
case 'updater':
|
case 'updater':
|
||||||
@ -110,7 +112,10 @@ class HaStateLabelBadge extends
|
|||||||
return null;
|
return null;
|
||||||
case 'sensor':
|
case 'sensor':
|
||||||
default:
|
default:
|
||||||
return state.state === 'unknown' ? '-' : state.state;
|
return state.state === 'unknown' ? '-' : (
|
||||||
|
localize(`component.${domain}.state.${state.state}`)
|
||||||
|
|| state.state
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,6 +119,18 @@ class HomeAssistant extends Polymer.Element {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loadBackendTranslations() {
|
||||||
|
if (!this.hass.language) return;
|
||||||
|
|
||||||
|
const language = this.hass.selectedLanguage;
|
||||||
|
this.hass.callApi('get', `translations/${language}`).then((result) => {
|
||||||
|
// If we've switched selected languages just ignore this response
|
||||||
|
if (!this.hass.selectedLanguage === language) return;
|
||||||
|
|
||||||
|
this._updateResources(language, result.resources);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
_updateResources(language, data) {
|
_updateResources(language, data) {
|
||||||
// Update the language in hass, and update the resources with the newly
|
// Update the language in hass, and update the resources with the newly
|
||||||
// loaded resources. This merges the new data on top of the old data for
|
// loaded resources. This merges the new data on top of the old data for
|
||||||
@ -201,6 +213,7 @@ class HomeAssistant extends Polymer.Element {
|
|||||||
|
|
||||||
var reconnected = () => {
|
var reconnected = () => {
|
||||||
this._updateHass({ connected: true });
|
this._updateHass({ connected: true });
|
||||||
|
this.loadBackendTranslations();
|
||||||
};
|
};
|
||||||
|
|
||||||
conn.addEventListener('ready', reconnected);
|
conn.addEventListener('ready', reconnected);
|
||||||
@ -240,6 +253,8 @@ class HomeAssistant extends Polymer.Element {
|
|||||||
unsubThemes = unsub;
|
unsubThemes = unsub;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.loadBackendTranslations();
|
||||||
|
|
||||||
this.unsubConnection = function () {
|
this.unsubConnection = function () {
|
||||||
conn.removeEventListener('ready', reconnected);
|
conn.removeEventListener('ready', reconnected);
|
||||||
conn.removeEventListener('disconnected', disconnected);
|
conn.removeEventListener('disconnected', disconnected);
|
||||||
@ -307,6 +322,7 @@ class HomeAssistant extends Polymer.Element {
|
|||||||
this._updateHass({ selectedLanguage: event.detail.language });
|
this._updateHass({ selectedLanguage: event.detail.language });
|
||||||
this.$.storage.storeState();
|
this.$.storage.storeState();
|
||||||
this.loadResources();
|
this.loadResources();
|
||||||
|
this.loadBackendTranslations();
|
||||||
this.loadTranslationFragment(this.panelUrl);
|
this.loadTranslationFragment(this.panelUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,6 +85,20 @@ describe('computeStateDisplay', () => {
|
|||||||
assert.strictEqual(computeStateDisplay(altLocalize, stateObj, 'en'), 'state.default.unavailable');
|
assert.strictEqual(computeStateDisplay(altLocalize, stateObj, 'en'), 'state.default.unavailable');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('Localizes sensor value with component translation', () => {
|
||||||
|
const altLocalize = function (message, ...args) {
|
||||||
|
if (message !== 'component.sensor.state.custom_state') return null;
|
||||||
|
return localize(message, ...args);
|
||||||
|
};
|
||||||
|
const stateObj = {
|
||||||
|
entity_id: 'sensor.test',
|
||||||
|
state: 'custom_state',
|
||||||
|
attributes: {
|
||||||
|
},
|
||||||
|
};
|
||||||
|
assert.strictEqual(computeStateDisplay(altLocalize, stateObj, 'en'), 'component.sensor.state.custom_state');
|
||||||
|
});
|
||||||
|
|
||||||
it('Localizes input_datetime with full date time', () => {
|
it('Localizes input_datetime with full date time', () => {
|
||||||
const stateObj = {
|
const stateObj = {
|
||||||
entity_id: 'input_datetime.test',
|
entity_id: 'input_datetime.test',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user