@schukai/monster
Version:
Monster is a simple library for creating fast, robust and lightweight websites.
91 lines (79 loc) • 2.61 kB
JavaScript
/**
* Copyright © Volker Schukai and all contributing authors, {{copyRightYear}}. All rights reserved.
* Node module: @schukai/monster
*
* This source code is licensed under the GNU Affero General Public License version 3 (AGPLv3).
* The full text of the license can be found at: https://www.gnu.org/licenses/agpl-3.0.en.html
*
* For those who do not wish to adhere to the AGPLv3, a commercial license is available.
* Acquiring a commercial license allows you to use this software without complying with the AGPLv3 terms.
* For more information about purchasing a commercial license, please contact Volker Schukai.
*
* SPDX-License-Identifier: AGPL-3.0
*/
import { parseLocale } from "../i18n/locale.mjs";
import { getDocument } from "./util.mjs";
import { getGlobalObject } from "../types/global.mjs";
export { getLocaleOfDocument };
/**
* @private
* @type {string}
*/
const DEFAULT_LANGUAGE = "en";
/**
* With this function, you can read the language version set by the document.
* For this, the attribute `lang` in the HTML tag is read. If no attribute is set, `en` is used as default.
* Alternatively, the language version of the browser is used.
*
* ```html
* <html lang="en">
* ```
*
* You can call the function via `getLocaleOfDocument()`.
*
* @license AGPLv3
* @since 1.13.0
* @copyright Volker Schukai
* @throws {TypeError} value is not a string
* @throws {Error} unsupported locale
* @summary Tries to determine the locale used
* @return {Locale}
*/
function getLocaleOfDocument() {
const document = getDocument();
const html = document.querySelector("html");
if (html instanceof HTMLElement && html.hasAttribute("lang")) {
const locale = html.getAttribute("lang");
if (locale) {
return new parseLocale(locale);
}
}
const navigatorLanguage = getNavigatorLanguage();
if (navigatorLanguage) {
return parseLocale(navigatorLanguage);
}
return parseLocale(DEFAULT_LANGUAGE);
}
/**
* @private
* @return {string|undefined|*}
* @see https://developer.mozilla.org/en-US/docs/Web/API/Navigator/language
* @see https://developer.mozilla.org/en-US/docs/Web/API/Navigator/languages
*/
const getNavigatorLanguage = () => {
const navigator = getGlobalObject("navigator");
if (navigator === undefined) {
return undefined;
}
if (navigator.hasOwnProperty("language")) {
const language = navigator.language;
if (typeof language === "string" && language.length > 0) {
return language;
}
}
const languages = navigator?.languages;
if (Array.isArray(languages) && languages.length > 0) {
return languages[0];
}
return undefined;
};