UNPKG

@ima/core

Version:

IMA.js framework for isomorphic javascript application

128 lines (127 loc) 5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "MessageFormatDictionary", { enumerable: true, get: function() { return MessageFormatDictionary; } }); const _Dictionary = require("./Dictionary"); const _GenericError = require("../error/GenericError"); class MessageFormatDictionary extends _Dictionary.Dictionary { _language; _dictionary; static get $dependencies() { return []; } /** * Initializes the dictionary. * * @example * dictionary.get('home.hello', {GENDER: 'UNSPECIFIED'}); */ constructor(){ super(); /** * The language of the phrases in the dictionary, represented as a * ISO 639-1 language code. */ this._language = ''; /** * Stored dictionary. */ this._dictionary = {}; } /** * Initializes this dictionary with the provided language and localization * phrases. * * @param config The dictionary configuration. * @param config.$Language The language property is an ISO 639-1 * language code specifying the language of the provided phrases. * @param config.dictionary * The dictionary field contains the localization phrases organized * in a deep plain object map. The top-level key is the name of the * phrase group, the bottom-level key is the phrase key. The * bottom-level value is the localization phrase generator that * takes the phrase placeholder values map as an argument and * produces the localization phrase with its placeholders evaluated * using the provided placeholder values. */ init(config) { this._language = config.$Language; this._dictionary = config.dictionary; } /** * @inheritDoc */ getLanguage() { return this._language; } /** * Retrieves the localization phrase identified by the specified key, * evaluates the phrase's placeholder expressions using the provided * parameters and returns the result. * * @param key The key identifying the localization phrase. The key * consists of at least two parts separated by dots. The first part * denotes the name of the source JSON localization file, while the * rest denote a field path within the localization object within * the given localization file. * @param parameters The * map of parameter names to the parameter values to use. * Defaults to an empty plain object. * @return The specified localization phrase with its placeholders * evaluated using the provided parameters. */ get(key, parameters) { const scope = this._getScope(key); if (!scope) { throw new _GenericError.GenericError(`ima.core.dictionary.MessageFormatDictionary.get: The ` + `localization phrase '${key}' does not exists`, { key, parameters, dictionary: this._dictionary }); } return scope(parameters ?? {}); } /** * Tests whether the specified localization phrase exists in the * dictionary. * * @param key The key identifying the localization phrase. The key * consists of at least two parts separated by dots. The first part * denotes the name of the source JSON localization file, while the * rest denote a field path within the localization object within * the given localization file. * @return `true` if the key exists and denotes a single * localization phrase, otherwise `false`. */ has(key) { if (!/^[^.]+(\.[^.]+)+$/.test(key)) { throw new Error(`The provided key (${key}) is not a valid localization ` + `phrase key, expecting a "file_name.identifier" notation`); } return !!this._getScope(key); } /** * Retrieves the localization scope denoted by the provided partial key. * This may be either an object representing a sub-group of location phrase * generators, or a single generator if the provided keys denotes a single * localization phrase * * @private * @param key The key identifying the localization phrase. The key * consists of at least two parts separated by dots. The first part * denotes the name of the source JSON localization file, while the * rest denote a field path within the localization object within * the given localization file. * @return The requested localization scope, or `null` if the specified * scope does not exist. */ _getScope(key) { const path = key.split('.'); let scope = this._dictionary; for (const scopeKey of path){ if (!scope[scopeKey]) { return null; } scope = scope[scopeKey]; } return scope; } } //# sourceMappingURL=MessageFormatDictionary.js.map