{"version":3,"file":"translation-CD_FiYBO.mjs","sources":["../../lib/locale.ts","../../lib/registry.ts","../../lib/translation.ts"],"sourcesContent":["/*!\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\n/**\n * Returns the user's locale\n */\nexport function getLocale(): string {\n\treturn document.documentElement.dataset.locale || 'en'\n}\n\n/**\n * Returns user's locale in canonical form\n * E.g. `en-US` instead of `en_US`\n */\nexport function getCanonicalLocale(): string {\n\treturn getLocale().replace(/_/g, '-')\n}\n\n/**\n * Returns the user's language\n */\nexport function getLanguage(): string {\n\treturn document.documentElement.lang || 'en'\n}\n\n/**\n * Check whether the current, or a given, language is read right-to-left\n *\n * @param language Language code to check, defaults to current language\n */\nexport function isRTL(language?: string): boolean {\n\tconst languageCode = language || getLanguage()\n\n\t// Source: https://meta.wikimedia.org/wiki/Template:List_of_language_names_ordered_by_code\n\tconst rtlLanguages = [\n\t\t/* eslint-disable no-multi-spaces */\n\t\t'ae', // Avestan\n\t\t'ar', // 'العربية', Arabic\n\t\t'arc', // Aramaic\n\t\t'arz', // 'مصرى', Egyptian\n\t\t'bcc', // 'بلوچی مکرانی', Southern Balochi\n\t\t'bqi', // 'بختياري', Bakthiari\n\t\t'ckb', // 'Soranî / کوردی', Sorani\n\t\t'dv', // Dhivehi\n\t\t'fa', // 'فارسی', Persian\n\t\t'glk', // 'گیلکی', Gilaki\n\t\t'ha', // 'هَوُسَ', Hausa\n\t\t'he', // 'עברית', Hebrew\n\t\t'khw', // 'کھوار', Khowar\n\t\t'ks', // 'कॉशुर / کٲشُر', Kashmiri\n\t\t'ku', // 'Kurdî / كوردی', Kurdish\n\t\t'mzn', // 'مازِرونی', Mazanderani\n\t\t'nqo', // 'ߒߞߏ', N’Ko\n\t\t'pnb', // 'پنجابی', Western Punjabi\n\t\t'ps', // 'پښتو', Pashto,\n\t\t'sd', // 'سنڌي', Sindhi\n\t\t'ug', // 'Uyghurche / ئۇيغۇرچە', Uyghur\n\t\t'ur', // 'اردو', Urdu\n\t\t'ur-PK', // 'اردو', Urdu (nextcloud BCP47 variant)\n\t\t'uz-AF', // 'اوزبیکی', Uzbek Afghan\n\t\t'yi', // 'ייִדיש', Yiddish\n\t\t/* eslint-enable no-multi-spaces */\n\t]\n\n\treturn rtlLanguages.includes(languageCode)\n}\n","/// \n\n/*!\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\n/**\n * Translation bundle\n *\n * @example For German translation\n * ```json\n\t{\n\t\t\"some\": \"einige\",\n\t\t\"_%n tree_::_%n trees_\": [\n\t\t\t\"%n Baum\",\n\t\t\t\"%n Bäume\"\n\t\t]\n\t}\n```\n */\nexport type Translations = Record\n\n/**\n * Function for getting plural form index from translated number\n *\n * @param number Input number to translate\n * @return Index of translation plural form\n * @example For most languages, like English or German\n * ```js\n(number:number) => number === 1 ? 0 : 1\n```\n */\nexport type PluralFunction = (number: number) => number\n\n/**\n * Extended window interface with translation registry\n * Exported just for internal testing purpose\n *\n * @private\n */\nexport interface NextcloudWindowWithRegistry extends Nextcloud.v27.WindowWithGlobals {\n\t_oc_l10n_registry_translations?: Record\n\t_oc_l10n_registry_plural_functions?: Record\n}\n\ndeclare const window: NextcloudWindowWithRegistry\n\nexport interface AppTranslations {\n\ttranslations: Translations\n\tpluralFunction: PluralFunction\n}\n\n/**\n * Check if translations and plural function are set for given app\n *\n * @param {string} appId the app id\n * @return {boolean}\n */\nexport function hasAppTranslations(appId: string) {\n\treturn (\n\t\twindow._oc_l10n_registry_translations?.[appId] !== undefined\n\t\t&& window._oc_l10n_registry_plural_functions?.[appId] !== undefined\n\t)\n}\n\n/**\n * Register new, or extend available, translations for an app\n *\n * @param {string} appId the app id\n * @param {object} translations the translations list\n * @param {Function} pluralFunction the plural function\n */\nexport function registerAppTranslations(\n\tappId: string,\n\ttranslations: Translations,\n\tpluralFunction: PluralFunction,\n) {\n\tif (appId === '__proto__' || appId === 'constructor' || appId === 'prototype') {\n\t\tthrow new Error('Invalid appId')\n\t}\n\n\twindow._oc_l10n_registry_translations = Object.assign(\n\t\twindow._oc_l10n_registry_translations || {},\n\t\t{\n\t\t\t[appId]: Object.assign(window._oc_l10n_registry_translations?.[appId] || {}, translations),\n\t\t},\n\t)\n\n\twindow._oc_l10n_registry_plural_functions = Object.assign(\n\t\twindow._oc_l10n_registry_plural_functions || {},\n\t\t{\n\t\t\t[appId]: pluralFunction,\n\t\t},\n\t)\n}\n\n/**\n * Unregister all translations and plural function for given app\n *\n * @param {string} appId the app id\n */\nexport function unregisterAppTranslations(appId: string) {\n\tdelete window._oc_l10n_registry_translations?.[appId]\n\tdelete window._oc_l10n_registry_plural_functions?.[appId]\n}\n\n/**\n * Get translations bundle for given app and current locale\n *\n * @param {string} appId the app id\n * @return {object}\n */\nexport function getAppTranslations(appId: string): AppTranslations {\n\treturn {\n\t\ttranslations: window._oc_l10n_registry_translations?.[appId] ?? {},\n\t\tpluralFunction: window._oc_l10n_registry_plural_functions?.[appId] ?? ((number: number) => number),\n\t}\n}\n","/*!\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\nimport type { AppTranslations, Translations } from './registry.ts'\nimport { generateFilePath } from '@nextcloud/router'\nimport { getLanguage, getLocale } from './locale.ts'\nimport {\n\tgetAppTranslations,\n\thasAppTranslations,\n\tregisterAppTranslations,\n\tunregisterAppTranslations,\n} from './registry.ts'\n\nimport DOMPurify from 'dompurify'\nimport escapeHTML from 'escape-html'\n\ninterface TranslationOptions {\n\t/** enable/disable auto escape of placeholders (by default enabled) */\n\tescape?: boolean\n\t/** enable/disable sanitization (by default enabled) */\n\tsanitize?: boolean\n\n\t/**\n\t * This is only intended for internal usage.\n\t * @private\n\t */\n\tbundle?: AppTranslations\n}\n\ninterface TranslationVariableReplacementObject {\n\t/** The value to use for the replacement */\n\tvalue: T\n\t/** Overwrite the `escape` option just for this replacement */\n\tescape: boolean\n}\n\n/**\n * Extracts variables from a translation key\n */\ntype ExtractedVariables =\n\tT extends `${string}{${infer Variable}}${infer Rest}`\n\t\t? Variable | ExtractedVariables\n\t\t: never\n\ntype TranslationVariables = Record, string | number | TranslationVariableReplacementObject>\n\nexport function translate(app: string, text: T, placeholders?: TranslationVariables, options?: TranslationOptions): string\nexport function translate(app: string, text: T, number?: number, options?: TranslationOptions): string\n/**\n * @inheritdoc\n * @deprecated This overload is deprecated either use placeholders or a number but not both\n */\nexport function translate(app: string, text: T, placeholders?: TranslationVariables, number?: number, options?: TranslationOptions): string\n\n/**\n * Translate a string\n *\n * @param app the id of the app for which to translate the string\n * @param text the string to translate\n * @param placeholdersOrNumber map of placeholder key to value or a number replacing `%n`\n * @param optionsOrNumber the translation options or a number to replace `%n` with\n * @param options options object\n * @param options.escape enable/disable auto escape of placeholders (by default enabled)\n * @param options.sanitize enable/disable sanitization (by default enabled)\n */\nexport function translate(\n\tapp: string,\n\ttext: T,\n\tplaceholdersOrNumber?: TranslationVariables|number,\n\toptionsOrNumber?: number|TranslationOptions,\n\toptions?: TranslationOptions,\n): string {\n\tconst vars = typeof placeholdersOrNumber === 'object' ? placeholdersOrNumber : undefined\n\tconst number = typeof optionsOrNumber === 'number' ? optionsOrNumber : (typeof placeholdersOrNumber === 'number' ? placeholdersOrNumber : undefined)\n\n\tconst allOptions = {\n\t\t// defaults\n\t\tescape: true,\n\t\tsanitize: true,\n\t\t// overwrite with user config\n\t\t...(\n\t\t\ttypeof options === 'object'\n\t\t\t\t? options\n\t\t\t\t: (\n\t\t\t\t\ttypeof optionsOrNumber === 'object'\n\t\t\t\t\t\t? optionsOrNumber\n\t\t\t\t\t\t: {}\n\t\t\t\t)\n\t\t),\n\t}\n\n\tconst identity = (value: T): T => value\n\tconst optSanitize = allOptions.sanitize ? DOMPurify.sanitize : identity\n\tconst optEscape = allOptions.escape ? escapeHTML : identity\n\n\tconst isValidReplacement = (value: unknown) => typeof value === 'string' || typeof value === 'number'\n\n\t// TODO: cache this function to avoid inline recreation\n\t// of the same function over and over again in case\n\t// translate() is used in a loop\n\tconst _build = (text: string, vars?: TranslationVariables, number?: number) => {\n\t\treturn text.replace(/%n/g, '' + number).replace(/{([^{}]*)}/g, (match, key: ExtractedVariables) => {\n\t\t\tif (vars === undefined || !(key in vars)) {\n\t\t\t\treturn optEscape(match)\n\t\t\t}\n\n\t\t\tconst replacement = vars[key]\n\t\t\tif (isValidReplacement(replacement)) {\n\t\t\t\treturn optEscape(`${replacement}`)\n\t\t\t} else if (typeof replacement === 'object' && isValidReplacement(replacement.value)) {\n\t\t\t\t// Replacement is an object so indiviual escape handling\n\t\t\t\tconst escape = replacement.escape !== false ? escapeHTML : identity\n\t\t\t\treturn escape(`${replacement.value}`)\n\t\t\t} else {\n\t\t\t\t/* This should not happen,\n\t\t\t\t * but the variables are used defined so not allowed types could still be given,\n\t\t\t\t * in this case ignore the replacement and use the placeholder\n\t\t\t\t */\n\t\t\t\treturn optEscape(match)\n\t\t\t}\n\t\t})\n\t}\n\n\tconst bundle = options?.bundle ?? getAppTranslations(app)\n\tlet translation = bundle.translations[text] || text\n\ttranslation = Array.isArray(translation) ? translation[0] : translation\n\n\tif (typeof vars === 'object' || number !== undefined) {\n\t\treturn optSanitize(_build(\n\t\t\ttranslation,\n\t\t\tvars,\n\t\t\tnumber,\n\t\t))\n\t} else {\n\t\treturn optSanitize(translation)\n\t}\n}\n\n/**\n * Translate a string containing an object which possibly requires a plural form\n *\n * @param {string} app the id of the app for which to translate the string\n * @param {string} textSingular the string to translate for exactly one object\n * @param {string} textPlural the string to translate for n objects\n * @param {number} number number to determine whether to use singular or plural\n * @param {object} vars of placeholder key to value\n * @param {object} options options object\n */\nexport function translatePlural(\n\tapp: string,\n\ttextSingular: T,\n\ttextPlural: K,\n\tnumber: number,\n\tvars?: TranslationVariables & TranslationVariables,\n\toptions?: TranslationOptions,\n): string {\n\tconst identifier = '_' + textSingular + '_::_' + textPlural + '_'\n\tconst bundle = options?.bundle ?? getAppTranslations(app)\n\tconst value = bundle.translations[identifier]\n\n\tif (typeof value !== 'undefined') {\n\t\tconst translation = value\n\t\tif (Array.isArray(translation)) {\n\t\t\tconst plural = bundle.pluralFunction(number)\n\t\t\treturn translate(app, translation[plural], vars, number, options)\n\t\t}\n\t}\n\n\t// vars type is casted to allow extra keys without runtime filtering (they are harmless), and without allowing wrong keys in translate\n\tif (number === 1) {\n\t\treturn translate(app, textSingular, vars as TranslationVariables, number, options)\n\t} else {\n\t\treturn translate(app, textPlural, vars as TranslationVariables, number, options)\n\t}\n}\n\n/**\n * Load an app's translation bundle if not loaded already.\n *\n * @param {string} appName name of the app\n * @param {Function} callback callback to be called when\n * the translations are loaded\n * @return {Promise} promise\n */\nexport function loadTranslations(appName: string, callback: (...args: []) => unknown) {\n\tinterface TranslationBundle {\n\t\ttranslations: Translations\n\t\tpluralForm: string\n\t}\n\n\tif (hasAppTranslations(appName) || getLocale() === 'en') {\n\t\treturn Promise.resolve().then(callback)\n\t}\n\n\tconst url = generateFilePath(appName, 'l10n', getLocale() + '.json')\n\n\tconst promise = new Promise((resolve, reject) => {\n\t\tconst request = new XMLHttpRequest()\n\t\trequest.open('GET', url, true)\n\t\trequest.onerror = () => {\n\t\t\treject(new Error(request.statusText || 'Network error'))\n\t\t}\n\t\trequest.onload = () => {\n\t\t\tif (request.status >= 200 && request.status < 300) {\n\t\t\t\ttry {\n\t\t\t\t\tconst bundle = JSON.parse(request.responseText)\n\t\t\t\t\tif (typeof bundle.translations === 'object') resolve(bundle)\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// error is probably a SyntaxError due to invalid response text, this is handled by next line\n\t\t\t\t}\n\t\t\t\treject(new Error('Invalid content of translation bundle'))\n\t\t\t} else {\n\t\t\t\treject(new Error(request.statusText))\n\t\t\t}\n\t\t}\n\t\trequest.send()\n\t})\n\n\t// load JSON translation bundle per AJAX\n\treturn promise\n\t\t.then((result) => {\n\t\t\tregister(appName, result.translations)\n\t\t\treturn result\n\t\t})\n\t\t.then(callback)\n}\n\n/**\n * Register an app's translation bundle.\n *\n * @param {string} appName name of the app\n * @param {Record} bundle translation bundle\n */\nexport function register(appName: string, bundle: Translations) {\n\tregisterAppTranslations(appName, bundle, getPlural)\n}\n\n/**\n * Unregister all translations of an app\n *\n * @param appName name of the app\n * @since 2.1.0\n */\nexport function unregister(appName: string) {\n\treturn unregisterAppTranslations(appName)\n}\n\n/**\n * Get array index of translations for a plural form\n *\n *\n * @param {number} number the number of elements\n * @param {string|undefined} language the language to use (or autodetect if not set)\n * @return {number} 0 for the singular form(, 1 for the first plural form, ...)\n */\nexport function getPlural(number: number, language = getLanguage()) {\n\tif (language === 'pt-BR') {\n\t\t// temporary set a locale for brazilian\n\t\tlanguage = 'xbr'\n\t}\n\n\tif (language.length > 3) {\n\t\tlanguage = language.substring(0, language.lastIndexOf('-'))\n\t}\n\n\t/*\n\t * The plural rules are derived from code of the Zend Framework (2010-09-25),\n\t * which is subject to the new BSD license (http://framework.zend.com/license/new-bsd).\n\t * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)\n\t */\n\tswitch (language) {\n\tcase 'az':\n\tcase 'bo':\n\tcase 'dz':\n\tcase 'id':\n\tcase 'ja':\n\tcase 'jv':\n\tcase 'ka':\n\tcase 'km':\n\tcase 'kn':\n\tcase 'ko':\n\tcase 'ms':\n\tcase 'th':\n\tcase 'tr':\n\tcase 'vi':\n\tcase 'zh':\n\t\treturn 0\n\n\tcase 'af':\n\tcase 'bn':\n\tcase 'bg':\n\tcase 'ca':\n\tcase 'da':\n\tcase 'de':\n\tcase 'el':\n\tcase 'en':\n\tcase 'eo':\n\tcase 'es':\n\tcase 'et':\n\tcase 'eu':\n\tcase 'fa':\n\tcase 'fi':\n\tcase 'fo':\n\tcase 'fur':\n\tcase 'fy':\n\tcase 'gl':\n\tcase 'gu':\n\tcase 'ha':\n\tcase 'he':\n\tcase 'hu':\n\tcase 'is':\n\tcase 'it':\n\tcase 'ku':\n\tcase 'lb':\n\tcase 'ml':\n\tcase 'mn':\n\tcase 'mr':\n\tcase 'nah':\n\tcase 'nb':\n\tcase 'ne':\n\tcase 'nl':\n\tcase 'nn':\n\tcase 'no':\n\tcase 'oc':\n\tcase 'om':\n\tcase 'or':\n\tcase 'pa':\n\tcase 'pap':\n\tcase 'ps':\n\tcase 'pt':\n\tcase 'so':\n\tcase 'sq':\n\tcase 'sv':\n\tcase 'sw':\n\tcase 'ta':\n\tcase 'te':\n\tcase 'tk':\n\tcase 'ur':\n\tcase 'zu':\n\t\treturn number === 1 ? 0 : 1\n\n\tcase 'am':\n\tcase 'bh':\n\tcase 'fil':\n\tcase 'fr':\n\tcase 'gun':\n\tcase 'hi':\n\tcase 'hy':\n\tcase 'ln':\n\tcase 'mg':\n\tcase 'nso':\n\tcase 'xbr':\n\tcase 'ti':\n\tcase 'wa':\n\t\treturn number === 0 || number === 1 ? 0 : 1\n\n\tcase 'be':\n\tcase 'bs':\n\tcase 'hr':\n\tcase 'ru':\n\tcase 'sh':\n\tcase 'sr':\n\tcase 'uk':\n\t\treturn number % 10 === 1 && number % 100 !== 11\n\t\t\t? 0\n\t\t\t: number % 10 >= 2\n\t\t\t\t && number % 10 <= 4\n\t\t\t\t && (number % 100 < 10 || number % 100 >= 20)\n\t\t\t\t? 1\n\t\t\t\t: 2\n\n\tcase 'cs':\n\tcase 'sk':\n\t\treturn number === 1 ? 0 : number >= 2 && number <= 4 ? 1 : 2\n\n\tcase 'ga':\n\t\treturn number === 1 ? 0 : number === 2 ? 1 : 2\n\n\tcase 'lt':\n\t\treturn number % 10 === 1 && number % 100 !== 11\n\t\t\t? 0\n\t\t\t: number % 10 >= 2 && (number % 100 < 10 || number % 100 >= 20)\n\t\t\t\t? 1\n\t\t\t\t: 2\n\n\tcase 'sl':\n\t\treturn number % 100 === 1\n\t\t\t? 0\n\t\t\t: number % 100 === 2\n\t\t\t\t? 1\n\t\t\t\t: number % 100 === 3 || number % 100 === 4\n\t\t\t\t\t? 2\n\t\t\t\t\t: 3\n\n\tcase 'mk':\n\t\treturn number % 10 === 1 ? 0 : 1\n\n\tcase 'mt':\n\t\treturn number === 1\n\t\t\t? 0\n\t\t\t: number === 0 || (number % 100 > 1 && number % 100 < 11)\n\t\t\t\t? 1\n\t\t\t\t: number % 100 > 10 && number % 100 < 20\n\t\t\t\t\t? 2\n\t\t\t\t\t: 3\n\n\tcase 'lv':\n\t\treturn number === 0\n\t\t\t? 0\n\t\t\t: number % 10 === 1 && number % 100 !== 11\n\t\t\t\t? 1\n\t\t\t\t: 2\n\n\tcase 'pl':\n\t\treturn number === 1\n\t\t\t? 0\n\t\t\t: number % 10 >= 2\n\t\t\t\t && number % 10 <= 4\n\t\t\t\t && (number % 100 < 12 || number % 100 > 14)\n\t\t\t\t? 1\n\t\t\t\t: 2\n\n\tcase 'cy':\n\t\treturn number === 1\n\t\t\t? 0\n\t\t\t: number === 2\n\t\t\t\t? 1\n\t\t\t\t: number === 8 || number === 11\n\t\t\t\t\t? 2\n\t\t\t\t\t: 3\n\n\tcase 'ro':\n\t\treturn number === 1\n\t\t\t? 0\n\t\t\t: number === 0 || (number % 100 > 0 && number % 100 < 20)\n\t\t\t\t? 1\n\t\t\t\t: 2\n\n\tcase 'ar':\n\t\treturn number === 0\n\t\t\t? 0\n\t\t\t: number === 1\n\t\t\t\t? 1\n\t\t\t\t: number === 2\n\t\t\t\t\t? 2\n\t\t\t\t\t: number % 100 >= 3 && number % 100 <= 10\n\t\t\t\t\t\t? 3\n\t\t\t\t\t\t: number % 100 >= 11 && number % 100 <= 99\n\t\t\t\t\t\t\t? 4\n\t\t\t\t\t\t\t: 5\n\n\tdefault:\n\t\treturn 0\n\t}\n}\n\n// Export short-hand\n\nexport {\n\ttranslate as t,\n\ttranslatePlural as n,\n}\n"],"names":["text","vars","number"],"mappings":"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"}