@itwin/core-i18n 5.0.0-dev.8 → 5.0.0-dev.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/ITwinLocalization.js.map +1 -1
- package/lib/cjs/core-i18n.js.map +1 -1
- package/lib/cjs/test/ITwinLocalization.test.js.map +1 -1
- package/lib/cjs/test/webpack/bundled-tests.instrumented.js +142 -142
- package/lib/cjs/test/webpack/bundled-tests.instrumented.js.map +1 -1
- package/lib/cjs/test/webpack/bundled-tests.js.map +1 -1
- package/lib/esm/ITwinLocalization.js.map +1 -1
- package/lib/esm/core-i18n.js.map +1 -1
- package/lib/esm/test/ITwinLocalization.test.js.map +1 -1
- package/package.json +6 -6
|
@@ -17,13 +17,13 @@
|
|
|
17
17
|
/** @packageDocumentation
|
|
18
18
|
* @module Localization
|
|
19
19
|
*/
|
|
20
|
-
function
|
|
21
|
-
var path = "D:\\vsts_a\\
|
|
22
|
-
var hash = "
|
|
20
|
+
function cov_1641apqh2r() {
|
|
21
|
+
var path = "D:\\vsts_a\\15\\s\\core\\i18n\\lib\\cjs\\ITwinLocalization.js";
|
|
22
|
+
var hash = "0bd66c6e46dafd0f25cae2e77397077aa383733f";
|
|
23
23
|
var global = new Function("return this")();
|
|
24
24
|
var gcv = "__coverage__";
|
|
25
25
|
var coverageData = {
|
|
26
|
-
path: "D:\\vsts_a\\
|
|
26
|
+
path: "D:\\vsts_a\\15\\s\\core\\i18n\\lib\\cjs\\ITwinLocalization.js",
|
|
27
27
|
statementMap: {
|
|
28
28
|
"0": {
|
|
29
29
|
start: {
|
|
@@ -2270,13 +2270,13 @@ function cov_2gf1ykuj23() {
|
|
|
2270
2270
|
inputSourceMap: {
|
|
2271
2271
|
version: 3,
|
|
2272
2272
|
file: "ITwinLocalization.js",
|
|
2273
|
-
sources: ["D:\\vsts_a\\
|
|
2273
|
+
sources: ["D:\\vsts_a\\15\\s\\core\\i18n\\src\\ITwinLocalization.ts"],
|
|
2274
2274
|
names: [],
|
|
2275
2275
|
mappings: "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",
|
|
2276
|
-
sourcesContent: ["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Localization\n */\n\nimport i18next, { i18n, InitOptions, Module, TOptionsBase } from \"i18next\";\nimport i18nextBrowserLanguageDetector, { DetectorOptions } from \"i18next-browser-languagedetector\";\nimport Backend, { BackendOptions } from \"i18next-http-backend\";\nimport { Logger } from \"@itwin/core-bentley\";\nimport type { Localization } from \"@itwin/core-common\";\n\nconst DEFAULT_MAX_RETRIES: number = 1; // a low number prevents wasted time and potential timeouts when requesting localization files throws an error\n\n/** Options for ITwinLocalization\n * @public\n */\nexport interface LocalizationOptions {\n urlTemplate?: string;\n backendPlugin?: Module;\n detectorPlugin?: Module;\n initOptions?: InitOptions;\n backendHttpOptions?: BackendOptions;\n detectorOptions?: DetectorOptions;\n}\n\n/** Supplies localizations for iTwin.js\n * @note this class uses the [i18next](https://www.i18next.com/) package.\n * @public\n */\nexport class ITwinLocalization implements Localization {\n public i18next: i18n;\n private readonly _initOptions: InitOptions;\n private readonly _backendOptions: BackendOptions;\n private readonly _detectionOptions: DetectorOptions;\n private readonly _namespaces = new Map<string, Promise<void>>();\n\n public constructor(options?: LocalizationOptions) {\n this.i18next = i18next.createInstance();\n\n this._backendOptions = {\n loadPath: options?.urlTemplate ?? \"locales/{{lng}}/{{ns}}.json\",\n crossDomain: true,\n ...options?.backendHttpOptions,\n };\n\n this._detectionOptions = {\n order: [\"querystring\", \"navigator\", \"htmlTag\"],\n lookupQuerystring: \"lng\",\n caches: [],\n ...options?.detectorOptions,\n };\n\n this._initOptions = {\n interpolation: { escapeValue: true },\n fallbackLng: \"en\",\n maxRetries: DEFAULT_MAX_RETRIES,\n backend: this._backendOptions,\n detection: this._detectionOptions,\n ...options?.initOptions,\n };\n\n this.i18next\n .use(options?.detectorPlugin ?? i18nextBrowserLanguageDetector)\n .use(options?.backendPlugin ?? Backend)\n .use(TranslationLogger);\n }\n\n public async initialize(namespaces: string[]): Promise<void> {\n\n // Also consider namespaces passed into constructor\n const initNamespaces: string[] = [this._initOptions.ns || []].flat();\n const combinedNamespaces: Set<string> = new Set([...namespaces, ...initNamespaces]); // without duplicates\n\n const defaultNamespace: string | false | readonly string[] = this._initOptions.defaultNS ?? namespaces[0];\n if (defaultNamespace)\n combinedNamespaces.add(defaultNamespace as string); // Make sure default namespace is in namespaces list\n\n const initOptions: InitOptions = {\n ...this._initOptions,\n defaultNS: defaultNamespace,\n ns: [...combinedNamespaces],\n };\n\n // if in a development environment, set debugging\n if (process.env.NODE_ENV === \"development\")\n initOptions.debug = true;\n\n const initPromise = this.i18next.init(initOptions) as unknown as Promise<void>;\n\n for (const ns of namespaces)\n this._namespaces.set(ns, initPromise);\n\n return initPromise;\n }\n\n /** Replace all instances of `%{key}` within a string with the translations of those keys.\n * For example:\n * ``` ts\n * \"MyKeys\": {\n * \"Key1\": \"First value\",\n * \"Key2\": \"Second value\"\n * }\n * ```\n *\n * ``` ts\n * i18.translateKeys(\"string with %{MyKeys.Key1} followed by %{MyKeys.Key2}!\"\") // returns \"string with First Value followed by Second Value!\"\n * ```\n * @param line The input line, potentially containing %{keys}.\n * @returns The line with all %{keys} translated\n * @public\n */\n public getLocalizedKeys(line: string): string {\n return line.replace(/\\%\\{(.+?)\\}/g, (_match, tag) => this.getLocalizedString(tag));\n }\n\n /** Return the translated value of a key.\n * @param key - the key that matches a property in the JSON localization file.\n * @note The key includes the namespace, which identifies the particular localization file that contains the property,\n * followed by a colon, followed by the property in the JSON file.\n * For example:\n * ``` ts\n * const dataString: string = IModelApp.localization.getLocalizedString(\"iModelJs:BackgroundMap.BingDataAttribution\");\n * ```\n * assigns to dataString the string with property BackgroundMap.BingDataAttribution from the iModelJs.json localization file.\n * @returns The string corresponding to the first key that resolves.\n * @throws Error if no keys resolve to a string.\n * @public\n */\n public getLocalizedString(key: string | string[], options?: TOptionsBase): string {\n if (options?.returnDetails || options?.returnObjects) {\n throw new Error(\"Translation key must map to a string, but the given options will result in an object\");\n }\n\n const value = this.i18next.t(key, options);\n\n if (typeof value !== \"string\") {\n throw new Error(\"Translation key(s) string not found\");\n }\n\n return value;\n }\n\n /** Similar to `getLocalizedString` but the default namespace is a separate parameter and the key does not need\n * to include a namespace. If a key includes a namespace, that namespace will be used for interpolating that key.\n * @param namespace - the namespace that identifies the particular localization file that contains the property.\n * @param key - the key that matches a property in the JSON localization file.\n * @returns The string corresponding to the first key that resolves.\n * @throws Error if no keys resolve to a string.\n * @internal\n */\n public getLocalizedStringWithNamespace(namespace: string, key: string | string[], options?: TOptionsBase): string {\n let fullKey: string | string[] = \"\";\n\n if (typeof key === \"string\") {\n fullKey = `${namespace}:${key}`;\n } else {\n fullKey = key.map((subKey: string) => {\n return `${namespace}:${subKey}`;\n });\n }\n\n return this.getLocalizedString(fullKey, options);\n }\n\n /** Gets the English translation.\n * @param namespace - the namespace that identifies the particular localization file that contains the property.\n * @param key - the key that matches a property in the JSON localization file.\n * @returns The string corresponding to the first key that resolves.\n * @throws Error if no keys resolve to a string.\n * @internal\n */\n public getEnglishString(namespace: string, key: string | string[], options?: TOptionsBase): string {\n if (options?.returnDetails || options?.returnObjects) {\n throw new Error(\"Translation key must map to a string, but the given options will result in an object\");\n }\n\n options = {\n ...options,\n ns: namespace, // ensure namespace argument is used\n };\n\n const en = this.i18next.getFixedT(\"en\", namespace);\n const str = en(key, options);\n if (typeof str !== \"string\")\n throw new Error(\"Translation key(s) not found\");\n\n return str;\n }\n\n /** Get the promise for an already registered Namespace.\n * @param name - the name of the namespace\n * @public\n */\n public getNamespacePromise(name: string): Promise<void> | undefined {\n return this._namespaces.get(name);\n }\n\n /** @internal */\n public getLanguageList(): readonly string[] {\n return this.i18next.languages;\n }\n\n /** override the language detected in the browser */\n public async changeLanguage(language: string) {\n return this.i18next.changeLanguage(language) as unknown as Promise<void>;\n }\n\n /** Register a new Namespace and return it. If the namespace is already registered, it will be returned.\n * @param name - the name of the namespace, which is the base name of the JSON file that contains the localization properties.\n * @note - The registerNamespace method starts fetching the appropriate version of the JSON localization file from the server,\n * based on the current locale. To make sure that fetch is complete before performing translations from this namespace, await\n * fulfillment of the readPromise Promise property of the returned LocalizationNamespace.\n * @see [Localization in iTwin.js]($docs/learning/frontend/Localization.md)\n * @public\n */\n public async registerNamespace(name: string): Promise<void> {\n const existing = this._namespaces.get(name);\n if (existing !== undefined)\n return existing;\n\n const theReadPromise = new Promise<void>((resolve) => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.i18next.loadNamespaces(name, (err) => {\n if (!err)\n return resolve();\n\n // Here we got a non-null err object.\n // This method is called when the system has attempted to load the resources for the namespaces for each possible locale.\n // For example 'fr-ca' might be the most specific locale, in which case 'fr' and 'en' are fallback locales.\n // Using Backend from i18next-http-backend, err will be an array of strings of each namespace it tried to read and its locale.\n // There might be errs for some other namespaces as well as this one. We resolve the promise unless there's an error for each possible locale.\n let locales = this.getLanguageList().map((thisLocale: any) => `/${thisLocale}/`);\n\n try {\n for (const thisError of err) {\n if (typeof thisError === \"string\")\n locales = locales.filter((thisLocale) => !thisError.includes(thisLocale));\n }\n } catch {\n locales = [];\n }\n // if we removed every locale from the array, it wasn't loaded.\n if (locales.length === 0)\n Logger.logError(\"i18n\", `No resources for namespace ${name} could be loaded`);\n\n resolve();\n });\n });\n this._namespaces.set(name, theReadPromise);\n return theReadPromise;\n }\n\n /** @internal */\n public unregisterNamespace(name: string): void {\n this._namespaces.delete(name);\n }\n}\n\nclass TranslationLogger {\n public static readonly type = \"logger\";\n public log(args: string[]) { Logger.logInfo(\"i18n\", this.createLogMessage(args)); }\n public warn(args: string[]) { Logger.logWarning(\"i18n\", this.createLogMessage(args)); }\n public error(args: string[]) { Logger.logError(\"i18n\", this.createLogMessage(args)); }\n private createLogMessage(args: string[]) {\n let message = args[0];\n for (let i = 1; i < args.length; ++i) {\n if (typeof args[i] === \"string\")\n message += `\\n ${args[i]}`;\n }\n return message;\n }\n}\n"]
|
|
2276
|
+
sourcesContent: ["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Localization\r\n */\r\n\r\nimport i18next, { i18n, InitOptions, Module, TOptionsBase } from \"i18next\";\r\nimport i18nextBrowserLanguageDetector, { DetectorOptions } from \"i18next-browser-languagedetector\";\r\nimport Backend, { BackendOptions } from \"i18next-http-backend\";\r\nimport { Logger } from \"@itwin/core-bentley\";\r\nimport type { Localization } from \"@itwin/core-common\";\r\n\r\nconst DEFAULT_MAX_RETRIES: number = 1; // a low number prevents wasted time and potential timeouts when requesting localization files throws an error\r\n\r\n/** Options for ITwinLocalization\r\n * @public\r\n */\r\nexport interface LocalizationOptions {\r\n urlTemplate?: string;\r\n backendPlugin?: Module;\r\n detectorPlugin?: Module;\r\n initOptions?: InitOptions;\r\n backendHttpOptions?: BackendOptions;\r\n detectorOptions?: DetectorOptions;\r\n}\r\n\r\n/** Supplies localizations for iTwin.js\r\n * @note this class uses the [i18next](https://www.i18next.com/) package.\r\n * @public\r\n */\r\nexport class ITwinLocalization implements Localization {\r\n public i18next: i18n;\r\n private readonly _initOptions: InitOptions;\r\n private readonly _backendOptions: BackendOptions;\r\n private readonly _detectionOptions: DetectorOptions;\r\n private readonly _namespaces = new Map<string, Promise<void>>();\r\n\r\n public constructor(options?: LocalizationOptions) {\r\n this.i18next = i18next.createInstance();\r\n\r\n this._backendOptions = {\r\n loadPath: options?.urlTemplate ?? \"locales/{{lng}}/{{ns}}.json\",\r\n crossDomain: true,\r\n ...options?.backendHttpOptions,\r\n };\r\n\r\n this._detectionOptions = {\r\n order: [\"querystring\", \"navigator\", \"htmlTag\"],\r\n lookupQuerystring: \"lng\",\r\n caches: [],\r\n ...options?.detectorOptions,\r\n };\r\n\r\n this._initOptions = {\r\n interpolation: { escapeValue: true },\r\n fallbackLng: \"en\",\r\n maxRetries: DEFAULT_MAX_RETRIES,\r\n backend: this._backendOptions,\r\n detection: this._detectionOptions,\r\n ...options?.initOptions,\r\n };\r\n\r\n this.i18next\r\n .use(options?.detectorPlugin ?? i18nextBrowserLanguageDetector)\r\n .use(options?.backendPlugin ?? Backend)\r\n .use(TranslationLogger);\r\n }\r\n\r\n public async initialize(namespaces: string[]): Promise<void> {\r\n\r\n // Also consider namespaces passed into constructor\r\n const initNamespaces: string[] = [this._initOptions.ns || []].flat();\r\n const combinedNamespaces: Set<string> = new Set([...namespaces, ...initNamespaces]); // without duplicates\r\n\r\n const defaultNamespace: string | false | readonly string[] = this._initOptions.defaultNS ?? namespaces[0];\r\n if (defaultNamespace)\r\n combinedNamespaces.add(defaultNamespace as string); // Make sure default namespace is in namespaces list\r\n\r\n const initOptions: InitOptions = {\r\n ...this._initOptions,\r\n defaultNS: defaultNamespace,\r\n ns: [...combinedNamespaces],\r\n };\r\n\r\n // if in a development environment, set debugging\r\n if (process.env.NODE_ENV === \"development\")\r\n initOptions.debug = true;\r\n\r\n const initPromise = this.i18next.init(initOptions) as unknown as Promise<void>;\r\n\r\n for (const ns of namespaces)\r\n this._namespaces.set(ns, initPromise);\r\n\r\n return initPromise;\r\n }\r\n\r\n /** Replace all instances of `%{key}` within a string with the translations of those keys.\r\n * For example:\r\n * ``` ts\r\n * \"MyKeys\": {\r\n * \"Key1\": \"First value\",\r\n * \"Key2\": \"Second value\"\r\n * }\r\n * ```\r\n *\r\n * ``` ts\r\n * i18.translateKeys(\"string with %{MyKeys.Key1} followed by %{MyKeys.Key2}!\"\") // returns \"string with First Value followed by Second Value!\"\r\n * ```\r\n * @param line The input line, potentially containing %{keys}.\r\n * @returns The line with all %{keys} translated\r\n * @public\r\n */\r\n public getLocalizedKeys(line: string): string {\r\n return line.replace(/\\%\\{(.+?)\\}/g, (_match, tag) => this.getLocalizedString(tag));\r\n }\r\n\r\n /** Return the translated value of a key.\r\n * @param key - the key that matches a property in the JSON localization file.\r\n * @note The key includes the namespace, which identifies the particular localization file that contains the property,\r\n * followed by a colon, followed by the property in the JSON file.\r\n * For example:\r\n * ``` ts\r\n * const dataString: string = IModelApp.localization.getLocalizedString(\"iModelJs:BackgroundMap.BingDataAttribution\");\r\n * ```\r\n * assigns to dataString the string with property BackgroundMap.BingDataAttribution from the iModelJs.json localization file.\r\n * @returns The string corresponding to the first key that resolves.\r\n * @throws Error if no keys resolve to a string.\r\n * @public\r\n */\r\n public getLocalizedString(key: string | string[], options?: TOptionsBase): string {\r\n if (options?.returnDetails || options?.returnObjects) {\r\n throw new Error(\"Translation key must map to a string, but the given options will result in an object\");\r\n }\r\n\r\n const value = this.i18next.t(key, options);\r\n\r\n if (typeof value !== \"string\") {\r\n throw new Error(\"Translation key(s) string not found\");\r\n }\r\n\r\n return value;\r\n }\r\n\r\n /** Similar to `getLocalizedString` but the default namespace is a separate parameter and the key does not need\r\n * to include a namespace. If a key includes a namespace, that namespace will be used for interpolating that key.\r\n * @param namespace - the namespace that identifies the particular localization file that contains the property.\r\n * @param key - the key that matches a property in the JSON localization file.\r\n * @returns The string corresponding to the first key that resolves.\r\n * @throws Error if no keys resolve to a string.\r\n * @internal\r\n */\r\n public getLocalizedStringWithNamespace(namespace: string, key: string | string[], options?: TOptionsBase): string {\r\n let fullKey: string | string[] = \"\";\r\n\r\n if (typeof key === \"string\") {\r\n fullKey = `${namespace}:${key}`;\r\n } else {\r\n fullKey = key.map((subKey: string) => {\r\n return `${namespace}:${subKey}`;\r\n });\r\n }\r\n\r\n return this.getLocalizedString(fullKey, options);\r\n }\r\n\r\n /** Gets the English translation.\r\n * @param namespace - the namespace that identifies the particular localization file that contains the property.\r\n * @param key - the key that matches a property in the JSON localization file.\r\n * @returns The string corresponding to the first key that resolves.\r\n * @throws Error if no keys resolve to a string.\r\n * @internal\r\n */\r\n public getEnglishString(namespace: string, key: string | string[], options?: TOptionsBase): string {\r\n if (options?.returnDetails || options?.returnObjects) {\r\n throw new Error(\"Translation key must map to a string, but the given options will result in an object\");\r\n }\r\n\r\n options = {\r\n ...options,\r\n ns: namespace, // ensure namespace argument is used\r\n };\r\n\r\n const en = this.i18next.getFixedT(\"en\", namespace);\r\n const str = en(key, options);\r\n if (typeof str !== \"string\")\r\n throw new Error(\"Translation key(s) not found\");\r\n\r\n return str;\r\n }\r\n\r\n /** Get the promise for an already registered Namespace.\r\n * @param name - the name of the namespace\r\n * @public\r\n */\r\n public getNamespacePromise(name: string): Promise<void> | undefined {\r\n return this._namespaces.get(name);\r\n }\r\n\r\n /** @internal */\r\n public getLanguageList(): readonly string[] {\r\n return this.i18next.languages;\r\n }\r\n\r\n /** override the language detected in the browser */\r\n public async changeLanguage(language: string) {\r\n return this.i18next.changeLanguage(language) as unknown as Promise<void>;\r\n }\r\n\r\n /** Register a new Namespace and return it. If the namespace is already registered, it will be returned.\r\n * @param name - the name of the namespace, which is the base name of the JSON file that contains the localization properties.\r\n * @note - The registerNamespace method starts fetching the appropriate version of the JSON localization file from the server,\r\n * based on the current locale. To make sure that fetch is complete before performing translations from this namespace, await\r\n * fulfillment of the readPromise Promise property of the returned LocalizationNamespace.\r\n * @see [Localization in iTwin.js]($docs/learning/frontend/Localization.md)\r\n * @public\r\n */\r\n public async registerNamespace(name: string): Promise<void> {\r\n const existing = this._namespaces.get(name);\r\n if (existing !== undefined)\r\n return existing;\r\n\r\n const theReadPromise = new Promise<void>((resolve) => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.i18next.loadNamespaces(name, (err) => {\r\n if (!err)\r\n return resolve();\r\n\r\n // Here we got a non-null err object.\r\n // This method is called when the system has attempted to load the resources for the namespaces for each possible locale.\r\n // For example 'fr-ca' might be the most specific locale, in which case 'fr' and 'en' are fallback locales.\r\n // Using Backend from i18next-http-backend, err will be an array of strings of each namespace it tried to read and its locale.\r\n // There might be errs for some other namespaces as well as this one. We resolve the promise unless there's an error for each possible locale.\r\n let locales = this.getLanguageList().map((thisLocale: any) => `/${thisLocale}/`);\r\n\r\n try {\r\n for (const thisError of err) {\r\n if (typeof thisError === \"string\")\r\n locales = locales.filter((thisLocale) => !thisError.includes(thisLocale));\r\n }\r\n } catch {\r\n locales = [];\r\n }\r\n // if we removed every locale from the array, it wasn't loaded.\r\n if (locales.length === 0)\r\n Logger.logError(\"i18n\", `No resources for namespace ${name} could be loaded`);\r\n\r\n resolve();\r\n });\r\n });\r\n this._namespaces.set(name, theReadPromise);\r\n return theReadPromise;\r\n }\r\n\r\n /** @internal */\r\n public unregisterNamespace(name: string): void {\r\n this._namespaces.delete(name);\r\n }\r\n}\r\n\r\nclass TranslationLogger {\r\n public static readonly type = \"logger\";\r\n public log(args: string[]) { Logger.logInfo(\"i18n\", this.createLogMessage(args)); }\r\n public warn(args: string[]) { Logger.logWarning(\"i18n\", this.createLogMessage(args)); }\r\n public error(args: string[]) { Logger.logError(\"i18n\", this.createLogMessage(args)); }\r\n private createLogMessage(args: string[]) {\r\n let message = args[0];\r\n for (let i = 1; i < args.length; ++i) {\r\n if (typeof args[i] === \"string\")\r\n message += `\\n ${args[i]}`;\r\n }\r\n return message;\r\n }\r\n}\r\n"]
|
|
2277
2277
|
},
|
|
2278
2278
|
_coverageSchema: "1a1c01bbd47fc00a2c39e90264f33305004495a9",
|
|
2279
|
-
hash: "
|
|
2279
|
+
hash: "0bd66c6e46dafd0f25cae2e77397077aa383733f"
|
|
2280
2280
|
};
|
|
2281
2281
|
var coverage = global[gcv] || (global[gcv] = {});
|
|
2282
2282
|
if (!coverage[path] || coverage[path].hash !== hash) {
|
|
@@ -2285,56 +2285,56 @@ function cov_2gf1ykuj23() {
|
|
|
2285
2285
|
var actualCoverage = coverage[path];
|
|
2286
2286
|
{
|
|
2287
2287
|
// @ts-ignore
|
|
2288
|
-
|
|
2288
|
+
cov_1641apqh2r = function () {
|
|
2289
2289
|
return actualCoverage;
|
|
2290
2290
|
};
|
|
2291
2291
|
}
|
|
2292
2292
|
return actualCoverage;
|
|
2293
2293
|
}
|
|
2294
|
-
|
|
2295
|
-
var __importDefault = (
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
return (
|
|
2294
|
+
cov_1641apqh2r();
|
|
2295
|
+
var __importDefault = (cov_1641apqh2r().s[0]++, (cov_1641apqh2r().b[0][0]++, this) && (cov_1641apqh2r().b[0][1]++, this.__importDefault) || (cov_1641apqh2r().b[0][2]++, function (mod) {
|
|
2296
|
+
cov_1641apqh2r().f[0]++;
|
|
2297
|
+
cov_1641apqh2r().s[1]++;
|
|
2298
|
+
return (cov_1641apqh2r().b[2][0]++, mod) && (cov_1641apqh2r().b[2][1]++, mod.__esModule) ? (cov_1641apqh2r().b[1][0]++, mod) : (cov_1641apqh2r().b[1][1]++, {
|
|
2299
2299
|
"default": mod
|
|
2300
2300
|
});
|
|
2301
2301
|
}));
|
|
2302
|
-
|
|
2302
|
+
cov_1641apqh2r().s[2]++;
|
|
2303
2303
|
Object.defineProperty(exports, "__esModule", ({
|
|
2304
2304
|
value: true
|
|
2305
2305
|
}));
|
|
2306
|
-
|
|
2306
|
+
cov_1641apqh2r().s[3]++;
|
|
2307
2307
|
exports.ITwinLocalization = void 0;
|
|
2308
|
-
const i18next_1 = (
|
|
2309
|
-
const i18next_browser_languagedetector_1 = (
|
|
2310
|
-
const i18next_http_backend_1 = (
|
|
2311
|
-
const core_bentley_1 = (
|
|
2312
|
-
const DEFAULT_MAX_RETRIES = (
|
|
2308
|
+
const i18next_1 = (cov_1641apqh2r().s[4]++, __importDefault(__webpack_require__(/*! i18next */ "../../common/temp/node_modules/.pnpm/i18next@21.9.1/node_modules/i18next/dist/cjs/i18next.js")));
|
|
2309
|
+
const i18next_browser_languagedetector_1 = (cov_1641apqh2r().s[5]++, __importDefault(__webpack_require__(/*! i18next-browser-languagedetector */ "../../common/temp/node_modules/.pnpm/i18next-browser-languagedetector@6.1.2/node_modules/i18next-browser-languagedetector/dist/esm/i18nextBrowserLanguageDetector.js")));
|
|
2310
|
+
const i18next_http_backend_1 = (cov_1641apqh2r().s[6]++, __importDefault(__webpack_require__(/*! i18next-http-backend */ "../../common/temp/node_modules/.pnpm/i18next-http-backend@1.4.4/node_modules/i18next-http-backend/cjs/index.js")));
|
|
2311
|
+
const core_bentley_1 = (cov_1641apqh2r().s[7]++, __webpack_require__(/*! @itwin/core-bentley */ "../bentley/lib/esm/core-bentley.js"));
|
|
2312
|
+
const DEFAULT_MAX_RETRIES = (cov_1641apqh2r().s[8]++, 1); // a low number prevents wasted time and potential timeouts when requesting localization files throws an error
|
|
2313
2313
|
/** Supplies localizations for iTwin.js
|
|
2314
2314
|
* @note this class uses the [i18next](https://www.i18next.com/) package.
|
|
2315
2315
|
* @public
|
|
2316
2316
|
*/
|
|
2317
2317
|
class ITwinLocalization {
|
|
2318
2318
|
constructor(options) {
|
|
2319
|
-
|
|
2320
|
-
|
|
2319
|
+
cov_1641apqh2r().f[1]++;
|
|
2320
|
+
cov_1641apqh2r().s[9]++;
|
|
2321
2321
|
this._namespaces = new Map();
|
|
2322
|
-
|
|
2322
|
+
cov_1641apqh2r().s[10]++;
|
|
2323
2323
|
this.i18next = i18next_1.default.createInstance();
|
|
2324
|
-
|
|
2324
|
+
cov_1641apqh2r().s[11]++;
|
|
2325
2325
|
this._backendOptions = {
|
|
2326
|
-
loadPath: (
|
|
2326
|
+
loadPath: (cov_1641apqh2r().b[3][0]++, options?.urlTemplate) ?? (cov_1641apqh2r().b[3][1]++, "locales/{{lng}}/{{ns}}.json"),
|
|
2327
2327
|
crossDomain: true,
|
|
2328
2328
|
...options?.backendHttpOptions
|
|
2329
2329
|
};
|
|
2330
|
-
|
|
2330
|
+
cov_1641apqh2r().s[12]++;
|
|
2331
2331
|
this._detectionOptions = {
|
|
2332
2332
|
order: ["querystring", "navigator", "htmlTag"],
|
|
2333
2333
|
lookupQuerystring: "lng",
|
|
2334
2334
|
caches: [],
|
|
2335
2335
|
...options?.detectorOptions
|
|
2336
2336
|
};
|
|
2337
|
-
|
|
2337
|
+
cov_1641apqh2r().s[13]++;
|
|
2338
2338
|
this._initOptions = {
|
|
2339
2339
|
interpolation: {
|
|
2340
2340
|
escapeValue: true
|
|
@@ -2345,40 +2345,40 @@ class ITwinLocalization {
|
|
|
2345
2345
|
detection: this._detectionOptions,
|
|
2346
2346
|
...options?.initOptions
|
|
2347
2347
|
};
|
|
2348
|
-
|
|
2349
|
-
this.i18next.use((
|
|
2348
|
+
cov_1641apqh2r().s[14]++;
|
|
2349
|
+
this.i18next.use((cov_1641apqh2r().b[4][0]++, options?.detectorPlugin) ?? (cov_1641apqh2r().b[4][1]++, i18next_browser_languagedetector_1.default)).use((cov_1641apqh2r().b[5][0]++, options?.backendPlugin) ?? (cov_1641apqh2r().b[5][1]++, i18next_http_backend_1.default)).use(TranslationLogger);
|
|
2350
2350
|
}
|
|
2351
2351
|
async initialize(namespaces) {
|
|
2352
|
-
|
|
2352
|
+
cov_1641apqh2r().f[2]++;
|
|
2353
2353
|
// Also consider namespaces passed into constructor
|
|
2354
|
-
const initNamespaces = (
|
|
2355
|
-
const combinedNamespaces = (
|
|
2356
|
-
const defaultNamespace = (
|
|
2357
|
-
|
|
2354
|
+
const initNamespaces = (cov_1641apqh2r().s[15]++, [(cov_1641apqh2r().b[6][0]++, this._initOptions.ns) || (cov_1641apqh2r().b[6][1]++, [])].flat());
|
|
2355
|
+
const combinedNamespaces = (cov_1641apqh2r().s[16]++, new Set([...namespaces, ...initNamespaces])); // without duplicates
|
|
2356
|
+
const defaultNamespace = (cov_1641apqh2r().s[17]++, (cov_1641apqh2r().b[7][0]++, this._initOptions.defaultNS) ?? (cov_1641apqh2r().b[7][1]++, namespaces[0]));
|
|
2357
|
+
cov_1641apqh2r().s[18]++;
|
|
2358
2358
|
if (defaultNamespace) {
|
|
2359
|
-
|
|
2360
|
-
|
|
2359
|
+
cov_1641apqh2r().b[8][0]++;
|
|
2360
|
+
cov_1641apqh2r().s[19]++;
|
|
2361
2361
|
combinedNamespaces.add(defaultNamespace);
|
|
2362
2362
|
} else {
|
|
2363
|
-
|
|
2363
|
+
cov_1641apqh2r().b[8][1]++;
|
|
2364
2364
|
} // Make sure default namespace is in namespaces list
|
|
2365
|
-
const initOptions = (
|
|
2365
|
+
const initOptions = (cov_1641apqh2r().s[20]++, {
|
|
2366
2366
|
...this._initOptions,
|
|
2367
2367
|
defaultNS: defaultNamespace,
|
|
2368
2368
|
ns: [...combinedNamespaces]
|
|
2369
2369
|
});
|
|
2370
2370
|
// if in a development environment, set debugging
|
|
2371
|
-
|
|
2371
|
+
cov_1641apqh2r().s[21]++;
|
|
2372
2372
|
if (false) {} else {
|
|
2373
|
-
|
|
2373
|
+
cov_1641apqh2r().b[9][1]++;
|
|
2374
2374
|
}
|
|
2375
|
-
const initPromise = (
|
|
2376
|
-
|
|
2375
|
+
const initPromise = (cov_1641apqh2r().s[23]++, this.i18next.init(initOptions));
|
|
2376
|
+
cov_1641apqh2r().s[24]++;
|
|
2377
2377
|
for (const ns of namespaces) {
|
|
2378
|
-
|
|
2378
|
+
cov_1641apqh2r().s[25]++;
|
|
2379
2379
|
this._namespaces.set(ns, initPromise);
|
|
2380
2380
|
}
|
|
2381
|
-
|
|
2381
|
+
cov_1641apqh2r().s[26]++;
|
|
2382
2382
|
return initPromise;
|
|
2383
2383
|
}
|
|
2384
2384
|
/** Replace all instances of `%{key}` within a string with the translations of those keys.
|
|
@@ -2398,11 +2398,11 @@ class ITwinLocalization {
|
|
|
2398
2398
|
* @public
|
|
2399
2399
|
*/
|
|
2400
2400
|
getLocalizedKeys(line) {
|
|
2401
|
-
|
|
2402
|
-
|
|
2401
|
+
cov_1641apqh2r().f[3]++;
|
|
2402
|
+
cov_1641apqh2r().s[27]++;
|
|
2403
2403
|
return line.replace(/\%\{(.+?)\}/g, (_match, tag) => {
|
|
2404
|
-
|
|
2405
|
-
|
|
2404
|
+
cov_1641apqh2r().f[4]++;
|
|
2405
|
+
cov_1641apqh2r().s[28]++;
|
|
2406
2406
|
return this.getLocalizedString(tag);
|
|
2407
2407
|
});
|
|
2408
2408
|
}
|
|
@@ -2420,25 +2420,25 @@ class ITwinLocalization {
|
|
|
2420
2420
|
* @public
|
|
2421
2421
|
*/
|
|
2422
2422
|
getLocalizedString(key, options) {
|
|
2423
|
-
|
|
2424
|
-
|
|
2425
|
-
if ((
|
|
2426
|
-
|
|
2427
|
-
|
|
2423
|
+
cov_1641apqh2r().f[5]++;
|
|
2424
|
+
cov_1641apqh2r().s[29]++;
|
|
2425
|
+
if ((cov_1641apqh2r().b[11][0]++, options?.returnDetails) || (cov_1641apqh2r().b[11][1]++, options?.returnObjects)) {
|
|
2426
|
+
cov_1641apqh2r().b[10][0]++;
|
|
2427
|
+
cov_1641apqh2r().s[30]++;
|
|
2428
2428
|
throw new Error("Translation key must map to a string, but the given options will result in an object");
|
|
2429
2429
|
} else {
|
|
2430
|
-
|
|
2430
|
+
cov_1641apqh2r().b[10][1]++;
|
|
2431
2431
|
}
|
|
2432
|
-
const value = (
|
|
2433
|
-
|
|
2432
|
+
const value = (cov_1641apqh2r().s[31]++, this.i18next.t(key, options));
|
|
2433
|
+
cov_1641apqh2r().s[32]++;
|
|
2434
2434
|
if (typeof value !== "string") {
|
|
2435
|
-
|
|
2436
|
-
|
|
2435
|
+
cov_1641apqh2r().b[12][0]++;
|
|
2436
|
+
cov_1641apqh2r().s[33]++;
|
|
2437
2437
|
throw new Error("Translation key(s) string not found");
|
|
2438
2438
|
} else {
|
|
2439
|
-
|
|
2439
|
+
cov_1641apqh2r().b[12][1]++;
|
|
2440
2440
|
}
|
|
2441
|
-
|
|
2441
|
+
cov_1641apqh2r().s[34]++;
|
|
2442
2442
|
return value;
|
|
2443
2443
|
}
|
|
2444
2444
|
/** Similar to `getLocalizedString` but the default namespace is a separate parameter and the key does not need
|
|
@@ -2450,23 +2450,23 @@ class ITwinLocalization {
|
|
|
2450
2450
|
* @internal
|
|
2451
2451
|
*/
|
|
2452
2452
|
getLocalizedStringWithNamespace(namespace, key, options) {
|
|
2453
|
-
|
|
2454
|
-
let fullKey = (
|
|
2455
|
-
|
|
2453
|
+
cov_1641apqh2r().f[6]++;
|
|
2454
|
+
let fullKey = (cov_1641apqh2r().s[35]++, "");
|
|
2455
|
+
cov_1641apqh2r().s[36]++;
|
|
2456
2456
|
if (typeof key === "string") {
|
|
2457
|
-
|
|
2458
|
-
|
|
2457
|
+
cov_1641apqh2r().b[13][0]++;
|
|
2458
|
+
cov_1641apqh2r().s[37]++;
|
|
2459
2459
|
fullKey = `${namespace}:${key}`;
|
|
2460
2460
|
} else {
|
|
2461
|
-
|
|
2462
|
-
|
|
2461
|
+
cov_1641apqh2r().b[13][1]++;
|
|
2462
|
+
cov_1641apqh2r().s[38]++;
|
|
2463
2463
|
fullKey = key.map(subKey => {
|
|
2464
|
-
|
|
2465
|
-
|
|
2464
|
+
cov_1641apqh2r().f[7]++;
|
|
2465
|
+
cov_1641apqh2r().s[39]++;
|
|
2466
2466
|
return `${namespace}:${subKey}`;
|
|
2467
2467
|
});
|
|
2468
2468
|
}
|
|
2469
|
-
|
|
2469
|
+
cov_1641apqh2r().s[40]++;
|
|
2470
2470
|
return this.getLocalizedString(fullKey, options);
|
|
2471
2471
|
}
|
|
2472
2472
|
/** Gets the English translation.
|
|
@@ -2477,31 +2477,31 @@ class ITwinLocalization {
|
|
|
2477
2477
|
* @internal
|
|
2478
2478
|
*/
|
|
2479
2479
|
getEnglishString(namespace, key, options) {
|
|
2480
|
-
|
|
2481
|
-
|
|
2482
|
-
if ((
|
|
2483
|
-
|
|
2484
|
-
|
|
2480
|
+
cov_1641apqh2r().f[8]++;
|
|
2481
|
+
cov_1641apqh2r().s[41]++;
|
|
2482
|
+
if ((cov_1641apqh2r().b[15][0]++, options?.returnDetails) || (cov_1641apqh2r().b[15][1]++, options?.returnObjects)) {
|
|
2483
|
+
cov_1641apqh2r().b[14][0]++;
|
|
2484
|
+
cov_1641apqh2r().s[42]++;
|
|
2485
2485
|
throw new Error("Translation key must map to a string, but the given options will result in an object");
|
|
2486
2486
|
} else {
|
|
2487
|
-
|
|
2487
|
+
cov_1641apqh2r().b[14][1]++;
|
|
2488
2488
|
}
|
|
2489
|
-
|
|
2489
|
+
cov_1641apqh2r().s[43]++;
|
|
2490
2490
|
options = {
|
|
2491
2491
|
...options,
|
|
2492
2492
|
ns: namespace // ensure namespace argument is used
|
|
2493
2493
|
};
|
|
2494
|
-
const en = (
|
|
2495
|
-
const str = (
|
|
2496
|
-
|
|
2494
|
+
const en = (cov_1641apqh2r().s[44]++, this.i18next.getFixedT("en", namespace));
|
|
2495
|
+
const str = (cov_1641apqh2r().s[45]++, en(key, options));
|
|
2496
|
+
cov_1641apqh2r().s[46]++;
|
|
2497
2497
|
if (typeof str !== "string") {
|
|
2498
|
-
|
|
2499
|
-
|
|
2498
|
+
cov_1641apqh2r().b[16][0]++;
|
|
2499
|
+
cov_1641apqh2r().s[47]++;
|
|
2500
2500
|
throw new Error("Translation key(s) not found");
|
|
2501
2501
|
} else {
|
|
2502
|
-
|
|
2502
|
+
cov_1641apqh2r().b[16][1]++;
|
|
2503
2503
|
}
|
|
2504
|
-
|
|
2504
|
+
cov_1641apqh2r().s[48]++;
|
|
2505
2505
|
return str;
|
|
2506
2506
|
}
|
|
2507
2507
|
/** Get the promise for an already registered Namespace.
|
|
@@ -2509,20 +2509,20 @@ class ITwinLocalization {
|
|
|
2509
2509
|
* @public
|
|
2510
2510
|
*/
|
|
2511
2511
|
getNamespacePromise(name) {
|
|
2512
|
-
|
|
2513
|
-
|
|
2512
|
+
cov_1641apqh2r().f[9]++;
|
|
2513
|
+
cov_1641apqh2r().s[49]++;
|
|
2514
2514
|
return this._namespaces.get(name);
|
|
2515
2515
|
}
|
|
2516
2516
|
/** @internal */
|
|
2517
2517
|
getLanguageList() {
|
|
2518
|
-
|
|
2519
|
-
|
|
2518
|
+
cov_1641apqh2r().f[10]++;
|
|
2519
|
+
cov_1641apqh2r().s[50]++;
|
|
2520
2520
|
return this.i18next.languages;
|
|
2521
2521
|
}
|
|
2522
2522
|
/** override the language detected in the browser */
|
|
2523
2523
|
async changeLanguage(language) {
|
|
2524
|
-
|
|
2525
|
-
|
|
2524
|
+
cov_1641apqh2r().f[11]++;
|
|
2525
|
+
cov_1641apqh2r().s[51]++;
|
|
2526
2526
|
return this.i18next.changeLanguage(language);
|
|
2527
2527
|
}
|
|
2528
2528
|
/** Register a new Namespace and return it. If the namespace is already registered, it will be returned.
|
|
@@ -2534,123 +2534,123 @@ class ITwinLocalization {
|
|
|
2534
2534
|
* @public
|
|
2535
2535
|
*/
|
|
2536
2536
|
async registerNamespace(name) {
|
|
2537
|
-
|
|
2538
|
-
const existing = (
|
|
2539
|
-
|
|
2537
|
+
cov_1641apqh2r().f[12]++;
|
|
2538
|
+
const existing = (cov_1641apqh2r().s[52]++, this._namespaces.get(name));
|
|
2539
|
+
cov_1641apqh2r().s[53]++;
|
|
2540
2540
|
if (existing !== undefined) {
|
|
2541
|
-
|
|
2542
|
-
|
|
2541
|
+
cov_1641apqh2r().b[17][0]++;
|
|
2542
|
+
cov_1641apqh2r().s[54]++;
|
|
2543
2543
|
return existing;
|
|
2544
2544
|
} else {
|
|
2545
|
-
|
|
2545
|
+
cov_1641apqh2r().b[17][1]++;
|
|
2546
2546
|
}
|
|
2547
|
-
const theReadPromise = (
|
|
2548
|
-
|
|
2549
|
-
|
|
2547
|
+
const theReadPromise = (cov_1641apqh2r().s[55]++, new Promise(resolve => {
|
|
2548
|
+
cov_1641apqh2r().f[13]++;
|
|
2549
|
+
cov_1641apqh2r().s[56]++;
|
|
2550
2550
|
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
2551
2551
|
this.i18next.loadNamespaces(name, err => {
|
|
2552
|
-
|
|
2553
|
-
|
|
2552
|
+
cov_1641apqh2r().f[14]++;
|
|
2553
|
+
cov_1641apqh2r().s[57]++;
|
|
2554
2554
|
if (!err) {
|
|
2555
|
-
|
|
2556
|
-
|
|
2555
|
+
cov_1641apqh2r().b[18][0]++;
|
|
2556
|
+
cov_1641apqh2r().s[58]++;
|
|
2557
2557
|
return resolve();
|
|
2558
2558
|
} else {
|
|
2559
|
-
|
|
2559
|
+
cov_1641apqh2r().b[18][1]++;
|
|
2560
2560
|
}
|
|
2561
2561
|
// Here we got a non-null err object.
|
|
2562
2562
|
// This method is called when the system has attempted to load the resources for the namespaces for each possible locale.
|
|
2563
2563
|
// For example 'fr-ca' might be the most specific locale, in which case 'fr' and 'en' are fallback locales.
|
|
2564
2564
|
// Using Backend from i18next-http-backend, err will be an array of strings of each namespace it tried to read and its locale.
|
|
2565
2565
|
// There might be errs for some other namespaces as well as this one. We resolve the promise unless there's an error for each possible locale.
|
|
2566
|
-
let locales = (
|
|
2567
|
-
|
|
2568
|
-
|
|
2566
|
+
let locales = (cov_1641apqh2r().s[59]++, this.getLanguageList().map(thisLocale => {
|
|
2567
|
+
cov_1641apqh2r().f[15]++;
|
|
2568
|
+
cov_1641apqh2r().s[60]++;
|
|
2569
2569
|
return `/${thisLocale}/`;
|
|
2570
2570
|
}));
|
|
2571
|
-
|
|
2571
|
+
cov_1641apqh2r().s[61]++;
|
|
2572
2572
|
try {
|
|
2573
|
-
|
|
2573
|
+
cov_1641apqh2r().s[62]++;
|
|
2574
2574
|
for (const thisError of err) {
|
|
2575
|
-
|
|
2575
|
+
cov_1641apqh2r().s[63]++;
|
|
2576
2576
|
if (typeof thisError === "string") {
|
|
2577
|
-
|
|
2578
|
-
|
|
2577
|
+
cov_1641apqh2r().b[19][0]++;
|
|
2578
|
+
cov_1641apqh2r().s[64]++;
|
|
2579
2579
|
locales = locales.filter(thisLocale => {
|
|
2580
|
-
|
|
2581
|
-
|
|
2580
|
+
cov_1641apqh2r().f[16]++;
|
|
2581
|
+
cov_1641apqh2r().s[65]++;
|
|
2582
2582
|
return !thisError.includes(thisLocale);
|
|
2583
2583
|
});
|
|
2584
2584
|
} else {
|
|
2585
|
-
|
|
2585
|
+
cov_1641apqh2r().b[19][1]++;
|
|
2586
2586
|
}
|
|
2587
2587
|
}
|
|
2588
2588
|
} catch {
|
|
2589
|
-
|
|
2589
|
+
cov_1641apqh2r().s[66]++;
|
|
2590
2590
|
locales = [];
|
|
2591
2591
|
}
|
|
2592
2592
|
// if we removed every locale from the array, it wasn't loaded.
|
|
2593
|
-
|
|
2593
|
+
cov_1641apqh2r().s[67]++;
|
|
2594
2594
|
if (locales.length === 0) {
|
|
2595
|
-
|
|
2596
|
-
|
|
2595
|
+
cov_1641apqh2r().b[20][0]++;
|
|
2596
|
+
cov_1641apqh2r().s[68]++;
|
|
2597
2597
|
core_bentley_1.Logger.logError("i18n", `No resources for namespace ${name} could be loaded`);
|
|
2598
2598
|
} else {
|
|
2599
|
-
|
|
2599
|
+
cov_1641apqh2r().b[20][1]++;
|
|
2600
2600
|
}
|
|
2601
|
-
|
|
2601
|
+
cov_1641apqh2r().s[69]++;
|
|
2602
2602
|
resolve();
|
|
2603
2603
|
});
|
|
2604
2604
|
}));
|
|
2605
|
-
|
|
2605
|
+
cov_1641apqh2r().s[70]++;
|
|
2606
2606
|
this._namespaces.set(name, theReadPromise);
|
|
2607
|
-
|
|
2607
|
+
cov_1641apqh2r().s[71]++;
|
|
2608
2608
|
return theReadPromise;
|
|
2609
2609
|
}
|
|
2610
2610
|
/** @internal */
|
|
2611
2611
|
unregisterNamespace(name) {
|
|
2612
|
-
|
|
2613
|
-
|
|
2612
|
+
cov_1641apqh2r().f[17]++;
|
|
2613
|
+
cov_1641apqh2r().s[72]++;
|
|
2614
2614
|
this._namespaces.delete(name);
|
|
2615
2615
|
}
|
|
2616
2616
|
}
|
|
2617
|
-
|
|
2617
|
+
cov_1641apqh2r().s[73]++;
|
|
2618
2618
|
exports.ITwinLocalization = ITwinLocalization;
|
|
2619
2619
|
class TranslationLogger {
|
|
2620
2620
|
log(args) {
|
|
2621
|
-
|
|
2622
|
-
|
|
2621
|
+
cov_1641apqh2r().f[18]++;
|
|
2622
|
+
cov_1641apqh2r().s[74]++;
|
|
2623
2623
|
core_bentley_1.Logger.logInfo("i18n", this.createLogMessage(args));
|
|
2624
2624
|
}
|
|
2625
2625
|
warn(args) {
|
|
2626
|
-
|
|
2627
|
-
|
|
2626
|
+
cov_1641apqh2r().f[19]++;
|
|
2627
|
+
cov_1641apqh2r().s[75]++;
|
|
2628
2628
|
core_bentley_1.Logger.logWarning("i18n", this.createLogMessage(args));
|
|
2629
2629
|
}
|
|
2630
2630
|
error(args) {
|
|
2631
|
-
|
|
2632
|
-
|
|
2631
|
+
cov_1641apqh2r().f[20]++;
|
|
2632
|
+
cov_1641apqh2r().s[76]++;
|
|
2633
2633
|
core_bentley_1.Logger.logError("i18n", this.createLogMessage(args));
|
|
2634
2634
|
}
|
|
2635
2635
|
createLogMessage(args) {
|
|
2636
|
-
|
|
2637
|
-
let message = (
|
|
2638
|
-
|
|
2639
|
-
for (let i = (
|
|
2640
|
-
|
|
2636
|
+
cov_1641apqh2r().f[21]++;
|
|
2637
|
+
let message = (cov_1641apqh2r().s[77]++, args[0]);
|
|
2638
|
+
cov_1641apqh2r().s[78]++;
|
|
2639
|
+
for (let i = (cov_1641apqh2r().s[79]++, 1); i < args.length; ++i) {
|
|
2640
|
+
cov_1641apqh2r().s[80]++;
|
|
2641
2641
|
if (typeof args[i] === "string") {
|
|
2642
|
-
|
|
2643
|
-
|
|
2642
|
+
cov_1641apqh2r().b[21][0]++;
|
|
2643
|
+
cov_1641apqh2r().s[81]++;
|
|
2644
2644
|
message += `\n ${args[i]}`;
|
|
2645
2645
|
} else {
|
|
2646
|
-
|
|
2646
|
+
cov_1641apqh2r().b[21][1]++;
|
|
2647
2647
|
}
|
|
2648
2648
|
}
|
|
2649
|
-
|
|
2649
|
+
cov_1641apqh2r().s[82]++;
|
|
2650
2650
|
return message;
|
|
2651
2651
|
}
|
|
2652
2652
|
}
|
|
2653
|
-
|
|
2653
|
+
cov_1641apqh2r().s[83]++;
|
|
2654
2654
|
TranslationLogger.type = "logger";
|
|
2655
2655
|
|
|
2656
2656
|
/***/ }),
|