UNPKG

botbuilder-dialogs-adaptive

Version:

Rule system for the Microsoft BotBuilder dialog system.

941 lines (931 loc) • 17.4 kB
/** * @module botbuilder-dialogs-adaptive */ /** * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. */ import { Converter } from 'botbuilder-dialogs'; /** * Language policy with fallback for each language as most specific to default en-us -> en -> default. */ export class LanguagePolicy extends Map<string, string[]> { /** * Initializes a new instance of the [LanguagePolicy](xref:botbuilder-dialogs-adaptive.LanguagePolicy) class. * * @param defaultLanguages Default languages to use. */ constructor(...defaultLanguages: string[]) { super(LanguagePolicy.defaultPolicy(defaultLanguages)); } static readonly locales = [ '', 'aa', 'aa-dj', 'aa-er', 'aa-et', 'af', 'af-na', 'af-za', 'agq', 'agq-cm', 'ak', 'ak-gh', 'am', 'am-et', 'ar', 'ar-001', 'ar-ae', 'ar-bh', 'ar-dj', 'ar-dz', 'ar-eg', 'ar-er', 'ar-il', 'ar-iq', 'ar-jo', 'ar-km', 'ar-kw', 'ar-lb', 'ar-ly', 'ar-ma', 'ar-mr', 'ar-om', 'ar-ps', 'ar-qa', 'ar-sa', 'ar-sd', 'ar-so', 'ar-ss', 'ar-sy', 'ar-td', 'ar-tn', 'ar-ye', 'arn', 'arn-cl', 'as', 'as-in', 'asa', 'asa-tz', 'ast', 'ast-es', 'az', 'az-cyrl', 'az-cyrl-az', 'az-latn', 'az-latn-az', 'ba', 'ba-ru', 'bas', 'bas-cm', 'be', 'be-by', 'bem', 'bem-zm', 'bez', 'bez-tz', 'bg', 'bg-bg', 'bin', 'bin-ng', 'bm', 'bm-latn', 'bm-latn-ml', 'bn', 'bn-bd', 'bn-in', 'bo', 'bo-cn', 'bo-in', 'br', 'br-fr', 'brx', 'brx-in', 'bs', 'bs-cyrl', 'bs-cyrl-ba', 'bs-latn', 'bs-latn-ba', 'byn', 'byn-er', 'ca', 'ca-ad', 'ca-es', 'ca-es-valencia', 'ca-fr', 'ca-it', 'ce', 'ce-ru', 'cgg', 'cgg-ug', 'chr', 'chr-cher', 'chr-cher-us', 'co', 'co-fr', 'cs', 'cs-cz', 'cu', 'cu-ru', 'cy', 'cy-gb', 'da', 'da-dk', 'da-gl', 'dav', 'dav-ke', 'de', 'de-at', 'de-be', 'de-ch', 'de-de', 'de-it', 'de-li', 'de-lu', 'dje', 'dje-ne', 'dsb', 'dsb-de', 'dua', 'dua-cm', 'dv', 'dv-mv', 'dyo', 'dyo-sn', 'dz', 'dz-bt', 'ebu', 'ebu-ke', 'ee', 'ee-gh', 'ee-tg', 'el', 'el-cy', 'el-gr', 'en', 'en-001', 'en-029', 'en-150', 'en-ag', 'en-ai', 'en-as', 'en-at', 'en-au', 'en-bb', 'en-be', 'en-bi', 'en-bm', 'en-bs', 'en-bw', 'en-bz', 'en-ca', 'en-cc', 'en-ch', 'en-ck', 'en-cm', 'en-cx', 'en-cy', 'en-de', 'en-dk', 'en-dm', 'en-er', 'en-fi', 'en-fj', 'en-fk', 'en-fm', 'en-gb', 'en-gd', 'en-gg', 'en-gh', 'en-gi', 'en-gm', 'en-gu', 'en-gy', 'en-hk', 'en-id', 'en-ie', 'en-il', 'en-im', 'en-in', 'en-io', 'en-je', 'en-jm', 'en-ke', 'en-ki', 'en-kn', 'en-ky', 'en-lc', 'en-lr', 'en-ls', 'en-mg', 'en-mh', 'en-mo', 'en-mp', 'en-ms', 'en-mt', 'en-mu', 'en-mw', 'en-my', 'en-na', 'en-nf', 'en-ng', 'en-nl', 'en-nr', 'en-nu', 'en-nz', 'en-pg', 'en-ph', 'en-pk', 'en-pn', 'en-pr', 'en-pw', 'en-rw', 'en-sb', 'en-sc', 'en-sd', 'en-se', 'en-sg', 'en-sh', 'en-si', 'en-sl', 'en-ss', 'en-sx', 'en-sz', 'en-tc', 'en-tk', 'en-to', 'en-tt', 'en-tv', 'en-tz', 'en-ug', 'en-um', 'en-us', 'en-vc', 'en-vg', 'en-vi', 'en-vu', 'en-ws', 'en-za', 'en-zm', 'en-zw', 'eo', 'eo-001', 'es', 'es-419', 'es-ar', 'es-bo', 'es-br', 'es-bz', 'es-cl', 'es-co', 'es-cr', 'es-cu', 'es-do', 'es-ec', 'es-es', 'es-gq', 'es-gt', 'es-hn', 'es-mx', 'es-ni', 'es-pa', 'es-pe', 'es-ph', 'es-pr', 'es-py', 'es-sv', 'es-us', 'es-uy', 'es-ve', 'et', 'et-ee', 'eu', 'eu-es', 'ewo', 'ewo-cm', 'fa', 'fa-ir', 'ff', 'ff-latn', 'ff-latn-bf', 'ff-latn-cm', 'ff-latn-gh', 'ff-latn-gm', 'ff-latn-gn', 'ff-latn-gw', 'ff-latn-lr', 'ff-latn-mr', 'ff-latn-ne', 'ff-latn-ng', 'ff-latn-sl', 'ff-latn-sn', 'fi', 'fi-fi', 'fil', 'fil-ph', 'fo', 'fo-dk', 'fo-fo', 'fr', 'fr-029', 'fr-be', 'fr-bf', 'fr-bi', 'fr-bj', 'fr-bl', 'fr-ca', 'fr-cd', 'fr-cf', 'fr-cg', 'fr-ch', 'fr-ci', 'fr-cm', 'fr-dj', 'fr-dz', 'fr-fr', 'fr-ga', 'fr-gf', 'fr-gn', 'fr-gp', 'fr-gq', 'fr-ht', 'fr-km', 'fr-lu', 'fr-ma', 'fr-mc', 'fr-mf', 'fr-mg', 'fr-ml', 'fr-mq', 'fr-mr', 'fr-mu', 'fr-nc', 'fr-ne', 'fr-pf', 'fr-pm', 'fr-re', 'fr-rw', 'fr-sc', 'fr-sn', 'fr-sy', 'fr-td', 'fr-tg', 'fr-tn', 'fr-vu', 'fr-wf', 'fr-yt', 'fur', 'fur-it', 'fy', 'fy-nl', 'ga', 'ga-ie', 'gd', 'gd-gb', 'gl', 'gl-es', 'gn', 'gn-py', 'gsw', 'gsw-ch', 'gsw-fr', 'gsw-li', 'gu', 'gu-in', 'guz', 'guz-ke', 'gv', 'gv-im', 'ha', 'ha-latn', 'ha-latn-gh', 'ha-latn-ne', 'ha-latn-ng', 'haw', 'haw-us', 'he', 'he-il', 'hi', 'hi-in', 'hr', 'hr-ba', 'hr-hr', 'hsb', 'hsb-de', 'hu', 'hu-hu', 'hy', 'hy-am', 'ia', 'ia-001', 'ibb', 'ibb-ng', 'id', 'id-id', 'ig', 'ig-ng', 'ii', 'ii-cn', 'is', 'is-is', 'it', 'it-ch', 'it-it', 'it-sm', 'it-va', 'iu', 'iu-cans', 'iu-cans-ca', 'iu-latn', 'iu-latn-ca', 'ja', 'ja-jp', 'jgo', 'jgo-cm', 'jmc', 'jmc-tz', 'jv', 'jv-java', 'jv-java-id', 'jv-latn', 'jv-latn-id', 'ka', 'ka-ge', 'kab', 'kab-dz', 'kam', 'kam-ke', 'kde', 'kde-tz', 'kea', 'kea-cv', 'khq', 'khq-ml', 'ki', 'ki-ke', 'kk', 'kk-kz', 'kkj', 'kkj-cm', 'kl', 'kl-gl', 'kln', 'kln-ke', 'km', 'km-kh', 'kn', 'kn-in', 'ko', 'ko-kp', 'ko-kr', 'kok', 'kok-in', 'kr', 'kr-latn', 'kr-latn-ng', 'ks', 'ks-arab', 'ks-arab-in', 'ks-deva', 'ks-deva-in', 'ksb', 'ksb-tz', 'ksf', 'ksf-cm', 'ksh', 'ksh-de', 'ku', 'ku-arab', 'ku-arab-iq', 'ku-arab-ir', 'kw', 'kw-gb', 'ky', 'ky-kg', 'la', 'la-001', 'lag', 'lag-tz', 'lb', 'lb-lu', 'lg', 'lg-ug', 'lkt', 'lkt-us', 'ln', 'ln-ao', 'ln-cd', 'ln-cf', 'ln-cg', 'lo', 'lo-la', 'lrc', 'lrc-iq', 'lrc-ir', 'lt', 'lt-lt', 'lu', 'lu-cd', 'luo', 'luo-ke', 'luy', 'luy-ke', 'lv', 'lv-lv', 'mas', 'mas-ke', 'mas-tz', 'mer', 'mer-ke', 'mfe', 'mfe-mu', 'mg', 'mg-mg', 'mgh', 'mgh-mz', 'mgo', 'mgo-cm', 'mi', 'mi-nz', 'mk', 'mk-mk', 'ml', 'ml-in', 'mn', 'mn-cyrl', 'mn-mn', 'mn-mong', 'mn-mong-cn', 'mn-mong-mn', 'mni', 'mni-in', 'moh', 'moh-ca', 'mr', 'mr-in', 'ms', 'ms-bn', 'ms-my', 'ms-sg', 'mt', 'mt-mt', 'mua', 'mua-cm', 'my', 'my-mm', 'mzn', 'mzn-ir', 'naq', 'naq-na', 'nb', 'nb-no', 'nb-sj', 'nd', 'nd-zw', 'nds', 'nds-de', 'nds-nl', 'ne', 'ne-in', 'ne-np', 'nl', 'nl-aw', 'nl-be', 'nl-bq', 'nl-cw', 'nl-nl', 'nl-sr', 'nl-sx', 'nmg', 'nmg-cm', 'nn', 'nn-no', 'nnh', 'nnh-cm', 'no', 'nqo', 'nqo-gn', 'nr', 'nr-za', 'nso', 'nso-za', 'nus', 'nus-ss', 'nyn', 'nyn-ug', 'oc', 'oc-fr', 'om', 'om-et', 'om-ke', 'or', 'or-in', 'os', 'os-ge', 'os-ru', 'pa', 'pa-arab', 'pa-arab-pk', 'pa-guru', 'pa-in', 'pap', 'pap-029', 'pl', 'pl-pl', 'prg', 'prg-001', 'prs', 'prs-af', 'ps', 'ps-af', 'pt', 'pt-ao', 'pt-br', 'pt-ch', 'pt-cv', 'pt-gq', 'pt-gw', 'pt-lu', 'pt-mo', 'pt-mz', 'pt-pt', 'pt-st', 'pt-tl', 'quc', 'quc-latn', 'quc-latn-gt', 'quz', 'quz-bo', 'quz-ec', 'quz-pe', 'rm', 'rm-ch', 'rn', 'rn-bi', 'ro', 'ro-md', 'ro-ro', 'rof', 'rof-tz', 'ru', 'ru-by', 'ru-kg', 'ru-kz', 'ru-md', 'ru-ru', 'ru-ua', 'rw', 'rw-rw', 'rwk', 'rwk-tz', 'sa', 'sa-in', 'sah', 'sah-ru', 'saq', 'saq-ke', 'sbp', 'sbp-tz', 'sd', 'sd-arab', 'sd-arab-pk', 'sd-deva', 'sd-deva-in', 'se', 'se-fi', 'se-no', 'se-se', 'seh', 'seh-mz', 'ses', 'ses-ml', 'sg', 'sg-cf', 'shi', 'shi-latn', 'shi-latn-ma', 'shi-tfng', 'shi-tfng-ma', 'si', 'si-lk', 'sk', 'sk-sk', 'sl', 'sl-si', 'sma', 'sma-no', 'sma-se', 'smj', 'smj-no', 'smj-se', 'smn', 'smn-fi', 'sms', 'sms-fi', 'sn', 'sn-latn', 'sn-latn-zw', 'so', 'so-dj', 'so-et', 'so-ke', 'so-so', 'sq', 'sq-al', 'sq-mk', 'sq-xk', 'sr', 'sr-cyrl', 'sr-cyrl-ba', 'sr-cyrl-me', 'sr-cyrl-rs', 'sr-cyrl-xk', 'sr-latn', 'sr-latn-ba', 'sr-latn-me', 'sr-latn-rs', 'sr-latn-xk', 'ss', 'ss-sz', 'ss-za', 'ssy', 'ssy-er', 'st', 'st-ls', 'st-za', 'sv', 'sv-ax', 'sv-fi', 'sv-se', 'sw', 'sw-cd', 'sw-ke', 'sw-tz', 'sw-ug', 'syr', 'syr-sy', 'ta', 'ta-in', 'ta-lk', 'ta-my', 'ta-sg', 'te', 'te-in', 'teo', 'teo-ke', 'teo-ug', 'tg', 'tg-cyrl', 'tg-cyrl-tj', 'th', 'th-th', 'ti', 'ti-er', 'ti-et', 'tig', 'tig-er', 'tk', 'tk-tm', 'tn', 'tn-bw', 'tn-za', 'to', 'to-to', 'tr', 'tr-cy', 'tr-tr', 'ts', 'ts-za', 'tt', 'tt-ru', 'twq', 'twq-ne', 'tzm', 'tzm-arab', 'tzm-arab-ma', 'tzm-latn', 'tzm-latn-dz', 'tzm-latn-ma', 'tzm-tfng', 'tzm-tfng-ma', 'ug', 'ug-cn', 'uk', 'uk-ua', 'ur', 'ur-in', 'ur-pk', 'uz', 'uz-arab', 'uz-arab-af', 'uz-cyrl', 'uz-cyrl-uz', 'uz-latn', 'uz-latn-uz', 'vai', 'vai-latn', 'vai-latn-lr', 'vai-vaii', 'vai-vaii-lr', 've', 've-za', 'vi', 'vi-vn', 'vo', 'vo-001', 'vun', 'vun-tz', 'wae', 'wae-ch', 'wal', 'wal-et', 'wo', 'wo-sn', 'xh', 'xh-za', 'xog', 'xog-ug', 'yav', 'yav-cm', 'yi', 'yi-001', 'yo', 'yo-bj', 'yo-ng', 'zgh', 'zgh-tfng', 'zgh-tfng-ma', 'zh', 'zh-cn', 'zh-hans', 'zh-hans-hk', 'zh-hans-mo', 'zh-hant', 'zh-hk', 'zh-mo', 'zh-sg', 'zh-tw', 'zu', 'zu-za', ]; /** * Walk through all of the cultures and create a dictionary map with most specific to least specific. * * @param defaultLanguages Default languages to use. * @returns A Map object with a string array for each key. * @example Example output "en-us" will generate fallback rule like this: * "en-us" -> "en" -> "" * "en" -> "" * So that when we get a locale such as en-gb, we can try to resolve to "en-gb" then "en" then "" * See commented section for full sample of output of this function. */ static defaultPolicy(defaultLanguages: string[] = []): Map<string, string[]> { const result = new Map<string, string[]>(); for (const locale of LanguagePolicy.locales) { let lang = locale.toLowerCase(); const fallback: string[] = []; while (lang) { fallback.push(lang); const i = lang.lastIndexOf('-'); if (i > 0) { lang = lang.substr(0, i); } else { break; } } if (locale === '') { if (defaultLanguages.length) { defaultLanguages.forEach((u): number => fallback.push(u)); } else { fallback.push(''); } } result.set(locale, fallback); } return result; } } /** * Language policy converter that implements `Converter`. */ export class LanguagePolicyConverter implements Converter<Record<string, string[]>, LanguagePolicy> { /** * Converts an object to a [LanguagePolicy](xref:botbuilder-dialogs-adaptive.LanguagePolicy) instance. * * @param value Object. * @returns A new [LanguagePolicy](xref:botbuilder-dialogs-adaptive.LanguagePolicy) instance. */ convert(value: Record<string, string[]> | LanguagePolicy): LanguagePolicy { if (value instanceof LanguagePolicy) { return value; } const policy = new LanguagePolicy(); policy.clear(); // Empty default policy to load custom language policy for (const key in value) { if (Array.isArray(value[key])) { policy.set(key, value[key]); } } return policy; } }