import { LitElement, html, css } from "lit"; import { state, property } from "lit/decorators.js"; import { ifDefined } from "lit/directives/if-defined.js"; import { localized, msg } from "@lit/localize"; import sortBy from "lodash/fp/sortBy"; import ISO6391 from "iso-639-1"; import type { LanguageCode } from "iso-639-1"; import type { SlSelect } from "@shoelace-style/shoelace"; const languages = sortBy("name")( ISO6391.getLanguages(ISO6391.getAllCodes()) ) as unknown as Array<{ code: LanguageCode; name: string; nativeName: string; }>; /** * Choose language from dropdown. * Uses ISO 639-1 codes (2 letters representing macrolanguages.) * * Usage: * ```ts * * Label * * ``` * * @event on-change */ @localized() export class LanguageSelect extends LitElement { static styles = css` sl-select::part(control) { box-shadow: var(--sl-shadow-small); } sl-menu-item:not(:hover) .secondaryText { color: var(--sl-color-neutral-400); } `; @property({ type: String }) value?: LanguageCode; @property({ type: Boolean }) hoist = false; render() { return html` { e.stopPropagation(); this.dispatchEvent( new CustomEvent("on-change", { detail: { value: (e.target as SlSelect).value, }, }) ); }} >
${msg("Language")}
${languages.map( ({ code, name, nativeName }) => html` ${name} (${nativeName}) ` )}
`; } }