All files / src/components/localized-text LocalizedText.ts

44.83% Statements 13/29
0% Branches 0/6
33.33% Functions 2/6
44.83% Lines 13/29

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 1214x 4x 4x   4x 4x 4x   4x 4x     4x             4x       4x         4x                                                                                                                                                                                       4x
import CustomElement from "../../custom-element/CustomElement";
import defineCustomElement from "../../custom-element/helpers/defineCustomElement";
import mergeStyles from "../../custom-element/helpers/mergeStyles";
import { CustomElementPropertyMetadata } from "../../custom-element/interfaces";
import KindMixin from "../../custom-element/mixins/components/kind/KindMixin";
import SizableMixin from "../../custom-element/mixins/components/sizable/SizableMixin";
import html  from "../../renderer/html";
import { NodePatchingData } from "../../renderer/NodePatcher";
import appCtrl from "../app/appCtrl";
import styles from "./LocalizedText.css";
 
//@ts-ignore
export default class LocalizedText extends
    SizableMixin(
        KindMixin(
            CustomElement
        )
    ) {
 
    static atomic = true;
 
    static get styles(): string {
 
        return mergeStyles(super.styles, styles);
    }
 
    static get properties(): Record<string, CustomElementPropertyMetadata> {
 
        return {
 
            /**
             * The key to retrieve a localized value from an i18n provider
             */
            resourceKey: {
                attribute: 'resource-key',
                type: String
            },
 
            /**
             * The language to translate to
             */
            lang: {
                type: String,
                mutable: true,
                reflect: true
            },
 
            /**
             * The value of the translated resource
             */
            value: {
                type: String,
                mutable: true,
                reflect: true
            }
        };
    }
 
    connectedCallback() {
 
        super.connectedCallback?.();
 
        const {
            lang,
            resourceKey
        } = this;
 
        if (resourceKey !== undefined) {
 
            const {
                intlProvider
            } = appCtrl;
 
            intlProvider.subscribe(this);
 
            this.value = intlProvider.getTranslation(lang, resourceKey);
        }
    }
 
    disconnectedCallback() {
 
        super.disconnectedCallback?.();
 
        const {
            resourceKey
        } = this;
 
        if (resourceKey) {
 
            appCtrl.intlProvider.unsubscribe(this);
        }
    }
 
    render(): NodePatchingData {
 
        const {
            value
        } = this;
 
        if (value === undefined) {
 
            return html`<slot></slot>`;
        }
        else {
 
            return html`${value}`;
        }
    }
 
    handleLanguageChanged(provider) {
 
        const {
            resourceKey,
            lang
        } = this;
 
        this.value = provider.getTranslation(lang, resourceKey);
    }
}
 
defineCustomElement('gcl-localized-text', LocalizedText);