UNPKG

turbocommons-ts

Version:

General purpose library that implements frequently used and generic software development tasks

397 lines (396 loc) 20.8 kB
/** * TurboCommons is a general purpose and cross-language library that implements frequently used and generic software development tasks. * * Website : -> https://turboframework.org/en/libs/turbocommons * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License. * License Url : -> http://www.apache.org/licenses/LICENSE-2.0 * CopyRight : -> Copyright 2015 Edertone Advanded Solutions (08211 Castellar del Vallès, Barcelona). http://www.edertone.com */ /** * Fully featured translation manager to be used with any application that requires text internationalization. */ export declare class LocalizationManager { /** * Defines the behaviour for get(), getStartCase(), etc... methods when a key is not found on * a bundle or the bundle does not exist * * If this value is empty, all missing keys will return an empty value * If this value contains a string, all missing keys will return that string * If this value contains a string with some of the following wildcards: * - $key will be replaced with the key name. For example: get("NAME") will output [NAME] if the key is not found and missingKeyFormat = '[$key]' * - $exception (This is the default value) will throw an exception with the problem cause description. */ missingKeyFormat: string; /** * Wildcards are string fragments that are placed inside the translated texts. Their main purpose is to be replaced at * runtime by custom values like for example a user name, a date, a numeric value, etc.. * * This class helps with this process by including a parameter called 'toReplace' on all .get methods which allows us * to specify a string or list of strings that will replace the respective wildcards on the translated text. Each wildcard * must follow the format specified here, and contain a numeric digit that will be used to find the replacement text at the * 'toReplace' list. For example, if we define $N as the wildcard format, and we have a translation that contains $0, $1, $2, * $0 will be replaced with the first element on toReplace, $1 with the second and so. * * Note that N is mandayory on the wildcards format and the first index value is 0. */ wildCardsFormat: string; /** * If set to true, when we call any get method from this class to retrieve a translated text, we will be forced * to provide the bundle for the key we are looking for. If set to false, only the key parameter will be required. */ isBundleMandatory: boolean; /** * Tells if the class has been initialized or not */ private _initialized; /** * @see this.locales() */ private _locales; /** * @see this.languages() */ private _languages; /** * Stores the latest resource bundle that's been used to read a localized value. * This is used by default when calling get without a bundle value */ private _activeBundle; /** * Stores the label for the latest location that's been used to read a localized value * This is used by default when calling get without a location value */ private _activeLocation; /** * Stores all the provided location definitions */ private _definedLocations; /** * Stores all the loaded localization data by location name, locales, bundle and key */ protected _loadedTranslations: { [location: string]: { [locale: string]: { [bundle: string]: { [key: string]: string; }; }; }; }; /** * A files manager instance used to load the data when paths are from file system. * * (Note that FilesManager class is part of the TurboDepot library) */ private _filesManager; /** * An http manager instance used to load the data when paths are urls */ private _httpManager; /** * Check if the class has been correctly initialized */ isInitialized(): boolean; /** * Checks if the specified locale is currently loaded for the currently defined bundles and paths. * * @param locale A locale to check. For example 'en_US' * * @return True if the locale is currently loaded on the class, false if not. */ isLocaleLoaded(locale: string): boolean; /** * Checks if the specified 2 digit language is currently loaded for the currently defined bundles and paths. * * @param language A language to check. For example 'en' * * @return True if the language is currently loaded on the class, false if not. */ isLanguageLoaded(language: string): boolean; /** * Performs the initial data load by looking for resource bundles on all the specified locations. * All the translations will be loaded for each of the specified locales. * * Calling this method is mandatory before starting to use this class. * * @param locationsLoader An instance of HTTPManager or FilesManager that will be used to load the provided locations. If we are working * with paths that are urls, we will pass here an HTTPManager. If we are working with file system paths, we will pass a FilesManager. * (Note that FilesManager class is part of the TurboDepot library) * @param locales List of languages for which we want to load the translations. The list also defines the preferred * translation order when a specified key is not found for a locale. * @param locations A list (sorted by preference) where each item defines a translations location and must have three properties: * - label: A name that will be used to reference the location * - path: A relative or absolute string that defines a location where resourcebundles reside. It must contain some wildcards: * - $locale wildcard will be replaced by each specific locale when trying to reach a path * - $bundle wildcard will be replaced by each specific bundle name when trying to reach a path * Example1: 'myFolder/$locale/$bundle.txt' will resolve to * 'myFolder/en_US/Customers.txt' when trying to load the Customers bundle for US english locale. * Example2: 'myFolder/$bundle_$locale.properties' will resolve to * 'myFolder/Customers_en_US.properties' when trying to load the Customers bundle for US english locale. * - bundles: The list of bundles to be loaded from the specified path * @param finishedCallback A method that will be executed once the initialization ends. An errors variable will be passed * to this method containing an array with information on errors that may have happened while loading the data. * @param progressCallback A method that can be used to track the loading progress when lots of bundles and locales are used. * * @return void */ initialize(locationsLoader: any, locales: string[], locations: { label: string; path: string; bundles: string[]; }[], finishedCallback?: ((errors: { path: string; errorMsg: string; errorCode: number; }[]) => void) | null, progressCallback?: ((completedUrl: string, totalUrls: number) => void) | null): void; /** * Adds extra locales to the end of the list of currently active locales and load its related translation data. * * This method can only be called after the class has been initialized in case we need to load the translations for more languages. * If any of the provided new locales is already loaded, its translation data will be refreshed * * @param locales List of languages for which we want to load the translations. The list will be appended at the end of any previously * loaded locales and included in the preferred translation order. The translation data will be loaded from all the currently defined locations. * @param finishedCallback A method that will be executed once the load ends. An errors variable will be passed * to this method containing an array with information on errors that may have happened while loading the data. * @param progressCallback A method that can be used to track the loading progress when lots of bundles and locales are used. * * @return void */ loadLocales(locales: string[], finishedCallback?: ((errors: { path: string; errorMsg: string; errorCode: number; }[]) => void) | null, progressCallback?: ((completedUrl: string, totalUrls: number) => void) | null): void; /** * Loads on the specified location the translation data for the specified bundles. * This method can only be called after the class has been initialized in case we need to refresh or add more bundles to an already loaded location. * * @param bundles List of bundles to load from the specified location * @param location The label for an already defined location. The extra bundles translation data will be added to the already loaded ones. If not defined, * the current active location will be used. * @param finishedCallback A method that will be executed once the load ends. An errors variable will be passed * to this method containing an array with information on errors that may have happened while loading the data. * @param progressCallback A method that can be used to track the loading progress when lots of bundles and locales are used. * * @see this.initialize() * * @return void */ loadBundles(bundles: string[], location?: string, finishedCallback?: ((errors: { path: string; errorMsg: string; errorCode: number; }[]) => void) | null, progressCallback?: ((completedUrl: string, totalUrls: number) => void) | null): void; /** * Auxiliary method used to perform the translation data load * * @see this.initialize() * * @param locales List of locales to load * @param locations A list of locations and respective bundles to be loaded * @param finishedCallback A method that will be executed once the load ends. An errors variable will be passed * to this method containing an array with information on errors that may have happened while loading the data. * @param progressCallback Executed after each request is performed */ private _loadData; /** * Perform the paths load from file system * * @param pathsToLoad list of paths that need to be loaded * @param pathsToLoadInfo original info about the paths to load * @param finishedCallback method to execute once finished * @param progressCallback method to execute after each path is loaded */ /** * Perform the paths load from urls * * @param pathsToLoad list of paths that need to be loaded * @param pathsToLoadInfo original info about the paths to load * @param finishedCallback method to execute once finished * @param progressCallback method to execute after each path is loaded */ private _loadDataFromUrls; /** * A list of strings containing the locales that are used by this class to translate the given keys, sorted by preference. * Each string is formatted as a standard locale code with language and country joined by an underscore, like: en_US, fr_FR * * When a key and bundle are requested for translation, the class will check on the first language of this * list for a translated text. If missing, the next one will be used, and so. This list is constructed after the initialize * or loadLocales methods are called. * * @example: After loading the following list of locales ['en_US', 'es_ES', 'fr_FR'] if we call localizationManager.get('HELLO', 'Greetings') * the localization manager will try to locate the en_US value for the HELLO tag on the Greetings bundle. If the tag is not found for the * specified locale and bundle, the same search will be performed for the es_ES locale, and so, till a value is found or no more locales * are defined. */ locales(): readonly string[]; /** * A list of strings containing the languages that are used by this class to translate the given keys, sorted by preference. * Each string is formatted as a 2 digit language code, like: en, fr * * This list is the same as the locales() one, but containing only the language part of each locale (the first two digits) * * @see this.locales() */ languages(): readonly string[]; /** * Get the bundle that is currently being used by default when traslating texts * * @return The name for the currently active bundle */ activeBundle(): string; /** * Get the first locale from the list of loaded locales, which is the currently used to search for translated texts. * * @return The locale that is defined as the primary one. For example: en_US, es_ES, .. */ primaryLocale(): string; /** * Get the first language from the list of loaded locales, which is the currently used to search for translated texts. * * @return The 2 digit language code that is defined as the primary one. For example: en, es, .. */ primaryLanguage(): string; /** * Define the bundle that is used by default when no bundle is specified on the get methods * * @param bundle A currently loaded bundle to be used as the active one * * @return void */ setActiveBundle(bundle: string): void; /** * Define the locale that will be placed at the front of the currently loaded locales list (moving all the others one position to the right). * * This will be the first locale to use when trying to get a translation. * * @param locale A currently loaded locale that will be moved to the first position of the loaded locales list. If the specified locale * is not currently loaded, an exception will happen. * * @return void */ setPrimaryLocale(locale: string): void; /** * Moves the specified locales to the beginning of the locales list. This also alters the translation priority by setting the first * provided locale as the most prioritary, the second as the next one and so. * * This method basically works exactly the same way as setPrimaryLocale but letting us add many locales at once. * * @see LocalizationManager.setPrimaryLocale() * * @param locales A list of locales to be moved to the beginning of the translation priority. First locales item will be the prefered * locale for translation, second will be the next one in case some key is not translated for the first one and so. If any of the * specified locales is not currently loaded, an exception will happen. * * @return void */ setPrimaryLocales(locales: string[]): void; /** * Define the 2 digit language that will be placed at the front of the currently loaded locales list (moving all the others one position to the right). * * This will be the first language to use when trying to get a translation. * * @param language A 2 digit language code that matches with any of the currently loaded locales, which will * be moved to the first position of the loaded locales list. If the specified language does not match with * a locale that is currently loaded, an exception will happen. * * @return void */ setPrimaryLanguage(language: string): void; /** * Moves the locales that match the specified languages to the beginning of the locales list. * Works the same as setPrimaryLocales() but with a list of the 2 digit language codes that match the respective locales. * * @see LocalizationManager.setPrimaryLocale() * @see LocalizationManager.setPrimaryLanguage() * * @param languages A list of 2 digit language codes to be moved to the beginning of the translation priority. If any of the * specified languages does not match with a locale that is currently loaded, an exception will happen. * * @return void */ setPrimaryLanguages(languages: string[]): void; /** * Change the loaded locales translation preference order. The same locales that are currently loaded must be passed * but with a different order to change the translation priority. * * @param locales A list with the new locales translation priority * * @return void */ setLocalesOrder(locales: string[]): void; /** * Get the translation for the given key, bundle and location * * @param key The key we want to read from the specified resource bundle and path * @param bundle The name for the resource bundle file. If not specified, the value * that was used on the inmediate previous call of this method will be used. This can save us lots of typing * if we are reading multiple consecutive keys from the same bundle. * @param location In case we have multiple bundles with the same name on different locations, we can set this parameter with * the location label to uniquely reference the bundle and resolve the conflict. If all of our bundles have different * names, this parameter can be ignored. Just like the bundle parameter, this one is remembered between get() calls. * @param toReplace A list of values that will replace the wildcards that are found on the translated text. Each wildcard * will be replaced with the element whose index on the list matches it. Check the documentation for this.wildCardsFormat * property to know more about how to setup wildcards. * * @returns The localized text */ get(key: string, bundle?: string, location?: string, toReplace?: string | string[]): string; /** * Get the translation for the given key and bundle as a string with all words first character capitalized * and all the rest of the word with lower case * * @see LocalizationManager.get * @see StringUtils.formatCase * * @returns The localized and case formatted text */ getStartCase(key: string, bundle?: string, location?: string, toReplace?: string | string[]): string; /** * Get the translation for the given key and bundle as an all upper case string * * @see LocalizationManager.get * @see StringUtils.formatCase * * @returns The localized and case formatted text */ getAllUpperCase(key: string, bundle?: string, location?: string, toReplace?: string | string[]): string; /** * Get the translation for the given key and bundle as an all lower case string * * @see LocalizationManager.get * @see StringUtils.formatCase * * @returns The localized and case formatted text */ getAllLowerCase(key: string, bundle?: string, location?: string, toReplace?: string | string[]): string; /** * Get the translation for the given key and bundle as a string with the first character as Upper case * and all the rest as lower case * * @see LocalizationManager.get * @see StringUtils.formatCase * * @returns The localized and case formatted text */ getFirstUpperRestLower(key: string, bundle?: string, location?: string, toReplace?: string | string[]): string; /** * Auxiliary method that can be overriden when extending this class to customize the parsing of Json formatted * resource bundles * * @param jsonString An object with the read resourcebundle json string */ protected parseJson(jsonString: string): { [key: string]: string; }; /** * Auxiliary method that can be overriden when extending this class to customize the parsing of Java properties * formatted resource bundles * * @param propertiesString A string containing the read resourcebundle java properties format string */ protected parseProperties(propertiesString: string): { [key: string]: string; }; }