ngx-translate-messageformat-compiler
Version:
> Compiler for ngx-translate that uses messageformat.js to compile translations using ICU syntax for handling pluralization and gender
1 lines • 10.5 kB
Source Map (JSON)
{"version":3,"file":"ngx-translate-messageformat-compiler.mjs","sources":["../../src/lib/message-format-config.ts","../../src/lib/translate-message-format-compiler.ts","../../src/lib/translate-message-format-debug-compiler.ts","../../src/public-api.ts","../../src/ngx-translate-messageformat-compiler.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\nimport { CustomFormatter } from \"@messageformat/core\";\n\nexport const MESSAGE_FORMAT_CONFIG = new InjectionToken<MessageFormatConfig>(\n \"MESSAGE_FORMAT_CONFIG\",\n);\n\nexport interface MessageFormatConfig {\n biDiSupport?: boolean;\n formatters?: {\n [key: string]: CustomFormatter;\n };\n strictNumberSign?: boolean;\n currency?: string;\n strictPluralKeys?: boolean;\n throwOnError?: boolean;\n fallbackPrefix?: string;\n}\n\nexport const defaultConfig: MessageFormatConfig = {\n biDiSupport: false,\n formatters: {},\n strictNumberSign: false,\n currency: \"USD\",\n strictPluralKeys: true,\n throwOnError: false,\n fallbackPrefix: undefined,\n};\n","import { Inject, Injectable, Optional } from \"@angular/core\";\nimport { TranslateCompiler } from \"@ngx-translate/core\";\nimport MessageFormat, {\n MessageFormatOptions,\n MessageFunction,\n} from \"@messageformat/core\";\nimport {\n defaultConfig,\n MessageFormatConfig,\n MESSAGE_FORMAT_CONFIG,\n} from \"./message-format-config\";\n\nexport type CompilationResult = MessageFunction<\"string\"> | string;\n\n/**\n * This compiler expects ICU syntax and compiles the expressions with messageformat.js\n */\n@Injectable()\nexport class TranslateMessageFormatCompiler extends TranslateCompiler {\n private mfCache = new Map<string, MessageFormat>();\n private messageFormatOptions: MessageFormatOptions<\"string\">;\n private throwOnError: boolean;\n private fallbackPrefix?: string;\n\n constructor(\n @Optional()\n @Inject(MESSAGE_FORMAT_CONFIG)\n config?: MessageFormatConfig,\n ) {\n super();\n\n const {\n formatters: customFormatters,\n biDiSupport,\n strictNumberSign: strict,\n currency,\n strictPluralKeys,\n throwOnError,\n fallbackPrefix,\n } = {\n ...defaultConfig,\n ...config,\n };\n\n this.messageFormatOptions = {\n customFormatters,\n biDiSupport,\n strict,\n currency,\n strictPluralKeys,\n };\n this.throwOnError = !!throwOnError;\n this.fallbackPrefix = fallbackPrefix;\n }\n\n public compile<Result extends CompilationResult = MessageFunction<\"string\">>(\n value: string,\n lang: string,\n ): Result {\n if (this.fallbackPrefix && value.startsWith(this.fallbackPrefix)) {\n return value.slice(this.fallbackPrefix.length) as Result;\n }\n\n let result: MessageFunction<\"string\">;\n\n try {\n result = this.getMessageFormatInstance(lang).compile(value);\n } catch (err) {\n if (this.throwOnError) {\n throw err;\n }\n\n console.error(err);\n console.error(\n `[ngx-translate-messageformat-compiler] Could not compile message for lang '${lang}': '${value}'`,\n );\n result = compileFallback(value, lang);\n }\n\n if (!this.throwOnError) {\n result = wrapInterpolationFunction(result, value);\n }\n\n return result as Result;\n }\n\n public compileTranslations(translations: any, lang: string): any {\n if (typeof translations === \"string\") {\n return this.compile(translations, lang);\n }\n\n return Object.keys(translations).reduce<{ [key: string]: any }>(\n (acc, key) => {\n const value = translations[key];\n acc[key] = this.compileTranslations(value, lang);\n return acc;\n },\n {},\n );\n }\n\n private getMessageFormatInstance(locale: string): MessageFormat {\n if (!this.mfCache.has(locale)) {\n this.mfCache.set(\n locale,\n new MessageFormat<\"string\">(locale, this.messageFormatOptions),\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.mfCache.get(locale)!;\n }\n}\n\nfunction wrapInterpolationFunction(\n fn: MessageFunction<\"string\">,\n message: string,\n): MessageFunction<\"string\"> {\n return (params: any) => {\n let result: string = message;\n\n try {\n result = fn(params);\n } catch (err) {\n console.error(err);\n console.error(\n `[ngx-translate-messageformat-compiler] Could not interpolate '${message}' with params '${params}'`,\n );\n }\n\n return result;\n };\n}\n\nfunction compileFallback(\n message: string,\n lang: string,\n): MessageFunction<\"string\"> {\n return () => {\n console.warn(\n `[ngx-translate-messageformat-compiler] Falling back to original invalid message: '${message}' ('${lang}')`,\n );\n\n return String(message);\n };\n}\n","import { Injectable } from \"@angular/core\";\nimport { MessageFunction } from \"@messageformat/core\";\nimport {\n CompilationResult,\n TranslateMessageFormatCompiler,\n} from \"./translate-message-format-compiler\";\n\n/* eslint-disable-next-line no-console */\nconst log = (...message: string[]) => console.log(tag, ...message);\nconst tag = \"[TranslateMessageFormatCompiler]\";\n\n@Injectable()\nexport class TranslateMessageFormatDebugCompiler extends TranslateMessageFormatCompiler {\n public compile<Result extends CompilationResult = MessageFunction<\"string\">>(\n value: string,\n lang: string,\n ): Result {\n log(`COMPILE (${lang})`, value);\n const interpolationFn = super.compile(value, lang);\n\n return isFunction(interpolationFn)\n ? (this.wrap(interpolationFn, value) as Result)\n : (value as Result);\n }\n\n public compileTranslations(value: any, lang: string): any {\n log(`COMPILE (${lang})`, value);\n return super.compileTranslations(value, lang);\n }\n\n private wrap(\n fn: MessageFunction<\"string\">,\n reference: string,\n ): MessageFunction<\"string\"> {\n return (params: any) => {\n log(\"INTERPOLATE\", reference, params);\n return fn(params);\n };\n }\n}\n\nfunction isFunction(value: any): value is (...params: unknown[]) => unknown {\n return typeof value === \"function\";\n}\n","/*\n * Public API Surface of ngx-translate-messageformat-compiler\n */\n\nexport * from \"./lib/message-format-config\";\nexport * from \"./lib/translate-message-format-compiler\";\nexport * from \"./lib/translate-message-format-debug-compiler\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}