core/translation.service.js

/**
 * @name translationService
 * @memberof app.core
 * @description
 *
 * The 'translationService' service is provided to $translateProvider as a custom language loader.
 * It allows translations to be added by plugins at any point in the application life cycle.
 */
angular
    .module('app.core')
    .factory('translationService', translationService);

/**
 * Translate service
 * @function compile
 * @param {Object} $q Angular object
 * @param {Object} translations Translation object who contains one properties for every language
 * @param {Object} $translate Angular object
 * @returns {Function}    Function who contain translation data
 */
function translationService($q, translations, $translate) {
    const translationData = translations;

    return options => {
        // default custom loader implementation returns a promise which resolves with language translation data
        if (options.action === 'loader') {
            return $q(resolve => {
                resolve(translationData[options.key]);
            });

        // add translations to existing languages
        } else {
            Object.keys(options).forEach(key => {
                if (translationData[key]) {
                    if (!translationData[key].plugin) {
                        translationData[key].plugin = {};
                    }
                    Object.assign(translationData[key].plugin, options[key].plugin);
                    $translate.refresh();
                }
            });
        }
    };
}