react-localize-redux
Version:
Localization library for handling translations in React
1,318 lines (1,040 loc) • 100 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("react"));
else if(typeof define === 'function' && define.amd)
define(["react"], factory);
else if(typeof exports === 'object')
exports["ReactLocalizeRedux"] = factory(require("react"));
else
root["ReactLocalizeRedux"] = factory(root["React"]);
})(this, function(__WEBPACK_EXTERNAL_MODULE_0__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // identity function for calling harmony imports with the correct context
/******/ __webpack_require__.i = function(value) { return value; };
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 13);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE_0__;
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getTranslate = exports.getTranslationsForSpecificLanguage = exports.getTranslationsForActiveLanguage = exports.translationsEqualSelector = exports.getActiveLanguage = exports.getOptions = exports.getLanguages = exports.getTranslations = exports.setActiveLanguage = exports.addTranslationForLanguage = exports.addTranslation = exports.initialize = exports.localizeReducer = exports.defaultTranslateOptions = exports.TRANSLATE = exports.SET_ACTIVE_LANGUAGE = exports.ADD_TRANSLATION_FOR_LANGUAGE = exports.ADD_TRANSLATION = exports.INITIALIZE = undefined;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
exports.languages = languages;
exports.translations = translations;
exports.options = options;
var _react = __webpack_require__(0);
var React = _interopRequireWildcard(_react);
var _flat = __webpack_require__(16);
var _reselect = __webpack_require__(10);
var _utils = __webpack_require__(3);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
/**
* ACTIONS
*/
/**
* TYPES
*/
// This is to get around the whole default options issue with Flow
// I tried using the $Diff approach, but with no luck so for now stuck with this terd.
// Because sometimes you just want flow to shut up!
var INITIALIZE = exports.INITIALIZE = '@@localize/INITIALIZE';
var ADD_TRANSLATION = exports.ADD_TRANSLATION = '@@localize/ADD_TRANSLATION';
var ADD_TRANSLATION_FOR_LANGUAGE = exports.ADD_TRANSLATION_FOR_LANGUAGE = '@@localize/ADD_TRANSLATION_FOR_LANGUAGE';
var SET_ACTIVE_LANGUAGE = exports.SET_ACTIVE_LANGUAGE = '@@localize/SET_ACTIVE_LANGUAGE';
var TRANSLATE = exports.TRANSLATE = '@@localize/TRANSLATE';
/**
* REDUCERS
*/
function languages() {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var action = arguments[1];
switch (action.type) {
case INITIALIZE:
var _options = action.payload.options || {};
return action.payload.languages.map(function (language, index) {
var isActive = function isActive(code) {
return _options.defaultLanguage !== undefined ? code === _options.defaultLanguage : index === 0;
};
// check if it's using array of Language objects, or array of language codes
return typeof language === 'string' ? { code: language, active: isActive(language) // language codes
} : _extends({}, language, { active: isActive(language.code) }); // language objects
});
case SET_ACTIVE_LANGUAGE:
return state.map(function (language) {
return language.code === action.payload.languageCode ? _extends({}, language, { active: true }) : _extends({}, language, { active: false });
});
default:
return state;
}
}
function translations() {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var action = arguments[1];
var flattenedTranslations = void 0;
var translationWithTransform = void 0;
switch (action.type) {
case INITIALIZE:
if (!action.payload.translation) {
return state;
}
flattenedTranslations = (0, _flat.flatten)(action.payload.translation, {
safe: true
});
var _options2 = action.payload.options || {};
var firstLanguage = typeof action.payload.languages[0] === 'string' ? action.payload.languages[0] : action.payload.languages[0].code;
var _defaultLanguage = _options2.defaultLanguage || firstLanguage;
var isMultiLanguageTranslation = Object.keys(flattenedTranslations).some(function (item) {
return Array.isArray(flattenedTranslations[item]);
});
// add translation based on whether it is single vs multi language translation data
var newTranslation = isMultiLanguageTranslation ? flattenedTranslations : (0, _utils.getSingleToMultilanguageTranslation)(_defaultLanguage, action.languageCodes, flattenedTranslations, state);
return _extends({}, state, newTranslation);
case ADD_TRANSLATION:
translationWithTransform = action.payload.translationOptions && action.payload.translationOptions.translationTransform !== undefined ? action.payload.translationOptions.translationTransform(action.payload.translation || {}, action.languageCodes) : action.payload.translation;
return _extends({}, state, (0, _flat.flatten)(translationWithTransform, { safe: true }));
case ADD_TRANSLATION_FOR_LANGUAGE:
flattenedTranslations = (0, _flat.flatten)(action.payload.translation, {
safe: true
});
return _extends({}, state, (0, _utils.getSingleToMultilanguageTranslation)(action.payload.language, action.languageCodes, flattenedTranslations, state));
default:
return state;
}
}
function options() {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultTranslateOptions;
var action = arguments[1];
switch (action.type) {
case INITIALIZE:
var _options3 = action.payload.options || {};
var _defaultLanguage2 = _options3.defaultLanguage || action.languageCodes[0];
return _extends({}, state, (0, _utils.validateOptions)(_options3), { defaultLanguage: _defaultLanguage2 });
default:
return state;
}
}
var defaultTranslateOptions = exports.defaultTranslateOptions = {
renderToStaticMarkup: false,
renderInnerHtml: false,
ignoreTranslateChildren: false,
defaultLanguage: '',
onMissingTranslation: function onMissingTranslation(_ref) {
var translationId = _ref.translationId,
languageCode = _ref.languageCode;
return 'Missing translationId: ${ translationId } for language: ${ languageCode }';
}
};
var initialState = {
languages: [],
translations: {},
options: defaultTranslateOptions
};
var localizeReducer = exports.localizeReducer = function localizeReducer() {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
var action = arguments[1];
// execute the languages reducer first as we need access to those values for other reducers
var languagesState = languages(state.languages, action);
var languageCodes = languagesState.map(function (language) {
return language.code;
});
return {
languages: languagesState,
translations: translations(state.translations, _extends({}, action, {
languageCodes: languageCodes
})),
options: options(state.options, _extends({}, action, { languageCodes: languageCodes }))
};
};
/**
* ACTION CREATORS
*/
var initialize = exports.initialize = function initialize(payload) {
return {
type: INITIALIZE,
payload: payload
};
};
var addTranslation = exports.addTranslation = function addTranslation(translation, options) {
return {
type: ADD_TRANSLATION,
payload: {
translation: translation,
translationOptions: options
}
};
};
var addTranslationForLanguage = exports.addTranslationForLanguage = function addTranslationForLanguage(translation, language) {
return {
type: ADD_TRANSLATION_FOR_LANGUAGE,
payload: { translation: translation, language: language }
};
};
var setActiveLanguage = exports.setActiveLanguage = function setActiveLanguage(languageCode) {
return {
type: SET_ACTIVE_LANGUAGE,
payload: { languageCode: languageCode }
};
};
/**
* SELECTORS
*/
var getTranslations = exports.getTranslations = function getTranslations(state) {
return state.translations;
};
var getLanguages = exports.getLanguages = function getLanguages(state) {
return state.languages;
};
var getOptions = exports.getOptions = function getOptions(state) {
return state.options;
};
var getActiveLanguage = exports.getActiveLanguage = function getActiveLanguage(state) {
var languages = getLanguages(state);
return languages.filter(function (language) {
return language.active === true;
})[0];
};
/**
* A custom equality checker that checker that compares an objects keys and values instead of === comparison
* e.g. {name: 'Ted', sport: 'hockey'} would result in 'name,sport - Ted,hocker' which would be used for comparison
*
* NOTE: This works with activeLanguage, languages, and translations data types.
* If a new data type is added to selector this would need to be updated to accomodate
*/
var translationsEqualSelector = exports.translationsEqualSelector = (0, _reselect.createSelectorCreator)(_reselect.defaultMemoize, function (prev, cur) {
var prevKeys = (typeof prev === 'undefined' ? 'undefined' : _typeof(prev)) === 'object' ? Object.keys(prev).toString() : undefined;
var curKeys = (typeof cur === 'undefined' ? 'undefined' : _typeof(cur)) === 'object' ? Object.keys(cur).toString() : undefined;
var prevValues = (typeof prev === 'undefined' ? 'undefined' : _typeof(prev)) === 'object' ? (0, _utils.objectValuesToString)(prev) : undefined;
var curValues = (typeof cur === 'undefined' ? 'undefined' : _typeof(cur)) === 'object' ? (0, _utils.objectValuesToString)(cur) : undefined;
var prevCacheValue = prevKeys !== undefined && prevValues !== undefined ? prevKeys + ' - ' + prevValues : prev;
var curCacheValue = curKeys !== undefined && curValues !== undefined ? curKeys + ' - ' + curValues : cur;
return prevCacheValue === curCacheValue;
});
var getTranslationsForActiveLanguage = exports.getTranslationsForActiveLanguage = translationsEqualSelector(getActiveLanguage, getLanguages, getTranslations, _utils.getTranslationsForLanguage);
var getTranslationsForSpecificLanguage = exports.getTranslationsForSpecificLanguage = translationsEqualSelector(getLanguages, getTranslations, function (languages, translations) {
return (0, _reselect.defaultMemoize)(function (languageCode) {
return (0, _utils.getTranslationsForLanguage)({ code: languageCode, active: false }, languages, translations);
});
});
var getTranslate = (0, _reselect.createSelector)(getTranslationsForActiveLanguage, getTranslationsForSpecificLanguage, getActiveLanguage, getOptions, function (translationsForActiveLanguage, getTranslationsForLanguage, activeLanguage, initializeOptions) {
return function (value) {
var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var translateOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var defaultLanguage = initializeOptions.defaultLanguage,
defaultOptions = _objectWithoutProperties(initializeOptions, ['defaultLanguage']);
var overrideLanguage = translateOptions.language;
var translations = overrideLanguage !== undefined ? getTranslationsForLanguage(overrideLanguage) : translationsForActiveLanguage;
var defaultTranslations = activeLanguage && activeLanguage.code === defaultLanguage ? translationsForActiveLanguage : getTranslationsForLanguage(defaultLanguage);
var languageCode = overrideLanguage !== undefined ? overrideLanguage : activeLanguage && activeLanguage.code;
var mergedOptions = _extends({}, defaultOptions, translateOptions);
var getTranslation = function getTranslation(translationId) {
var hasValidTranslation = translations[translationId] !== undefined;
var hasValidDefaultTranslation = defaultTranslations[translationId] !== undefined;
var defaultTranslation = hasValidDefaultTranslation ? (0, _utils.getLocalizedElement)({
translation: defaultTranslations[translationId],
data: data,
renderInnerHtml: mergedOptions.renderInnerHtml
}) : "No default translation found! Ensure you've added translations for your default langauge.";
// if translation is not valid then generate the on missing translation message in it's place
var translation = hasValidTranslation ? translations[translationId] : mergedOptions.onMissingTranslation({
translationId: translationId,
languageCode: languageCode,
defaultTranslation: defaultTranslation
});
// if translations are missing than ovrride data to include translationId, languageCode
// as these will be needed to render missing translations message
var translationData = hasValidTranslation ? data : { translationId: translationId, languageCode: languageCode };
return (0, _utils.getLocalizedElement)({
translation: translation,
data: translationData,
languageCode: languageCode,
renderInnerHtml: mergedOptions.renderInnerHtml
});
};
if (typeof value === 'string') {
return getTranslation(value);
} else if (Array.isArray(value)) {
return value.reduce(function (prev, cur) {
return _extends({}, prev, _defineProperty({}, cur, getTranslation(cur)));
}, {});
} else {
throw new Error('react-localize-redux: Invalid key passed to getTranslate.');
}
};
});
exports.getTranslate = getTranslate;
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.LocalizeContext = exports.getContextPropsFromState = undefined;
var _react = __webpack_require__(0);
var _react2 = _interopRequireDefault(_react);
var _createReactContext = __webpack_require__(15);
var _createReactContext2 = _interopRequireDefault(_createReactContext);
var _reselect = __webpack_require__(10);
var _localize = __webpack_require__(1);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var dispatchInitialize = function dispatchInitialize(dispatch) {
return function (payload) {
return dispatch((0, _localize.initialize)(payload));
};
};
var dispatchAddTranslation = function dispatchAddTranslation(dispatch) {
return function (translation) {
return dispatch((0, _localize.addTranslation)(translation));
};
};
var dispatchAddTranslationForLanguage = function dispatchAddTranslationForLanguage(dispatch) {
return function (translation, language) {
return dispatch((0, _localize.addTranslationForLanguage)(translation, language));
};
};
var dispatchSetActiveLanguage = function dispatchSetActiveLanguage(dispatch) {
return function (languageCode) {
return dispatch((0, _localize.setActiveLanguage)(languageCode));
};
};
var getContextPropsFromState = exports.getContextPropsFromState = function getContextPropsFromState(dispatch) {
return (0, _reselect.createSelector)(_localize.getTranslate, _localize.getLanguages, _localize.getActiveLanguage, _localize.getOptions, function (translate, languages, activeLanguage, options) {
var defaultLanguage = options.defaultLanguage || languages[0] && languages[0].code;
var renderToStaticMarkup = options.renderToStaticMarkup;
var ignoreTranslateChildren = options.ignoreTranslateChildren !== undefined ? options.ignoreTranslateChildren : _localize.defaultTranslateOptions.ignoreTranslateChildren;
return {
translate: translate,
languages: languages,
defaultLanguage: defaultLanguage,
activeLanguage: activeLanguage,
initialize: dispatchInitialize(dispatch),
addTranslation: dispatchAddTranslation(dispatch),
addTranslationForLanguage: dispatchAddTranslationForLanguage(dispatch),
setActiveLanguage: dispatchSetActiveLanguage(dispatch),
renderToStaticMarkup: renderToStaticMarkup,
ignoreTranslateChildren: ignoreTranslateChildren
};
});
};
var defaultLocalizeState = (0, _localize.localizeReducer)(undefined, {});
var defaultContext = getContextPropsFromState(function () {})(defaultLocalizeState);
var LocalizeContext = exports.LocalizeContext = (0, _createReactContext2.default)(defaultContext);
/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.warning = exports.get = exports.getSingleToMultilanguageTranslation = exports.storeDidChange = exports.getTranslationsForLanguage = exports.validateOptions = exports.objectValuesToString = exports.getIndexForLanguageCode = exports.templater = exports.hasHtmlTags = exports.getLocalizedElement = undefined;
var _react = __webpack_require__(0);
var _react2 = _interopRequireDefault(_react);
var _localize = __webpack_require__(1);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
var getLocalizedElement = exports.getLocalizedElement = function getLocalizedElement(options) {
var translation = options.translation,
data = options.data,
renderInnerHtml = options.renderInnerHtml;
var translatedValueOrArray = templater(translation, data);
// if result of templater is string, do the usual stuff
if (typeof translatedValueOrArray === 'string') {
return renderInnerHtml === true && hasHtmlTags(translatedValueOrArray) ? _react2.default.createElement('span', {
dangerouslySetInnerHTML: { __html: translatedValueOrArray }
}) : translatedValueOrArray;
}
// at this point we know we have react components;
// check if there are HTMLTags in the translation (not allowed)
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = translatedValueOrArray[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var portion = _step.value;
if (typeof portion === 'string' && hasHtmlTags(portion)) {
warning('HTML tags in the translation string are not supported when passing React components as arguments to the translation.');
return '';
}
}
// return as Element
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return _react2.default.createElement.apply(_react2.default, ['span', null].concat(_toConsumableArray(translatedValueOrArray)));
};
var hasHtmlTags = exports.hasHtmlTags = function hasHtmlTags(value) {
var pattern = /(&[^\s]*;|<\/?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[\^'">\s]+))?)+\s*|\s*)\/?>)/;
return value.search(pattern) >= 0;
};
/**
* @func templater
* @desc A poor mans template parser
* @param {string} strings The template string
* @param {object} data The data that should be inserted in template
* @return {string} The template string with the data merged in
*/
var templater = exports.templater = function templater(strings) {
var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
if (!strings) return '';
// ${**}
// brackets to include it in the result of .split()
var genericPlaceholderPattern = '(\\${\\s*[^\\s}]+\\s*})';
// split: from 'Hey ${name}' -> ['Hey', '${name}']
// filter: clean empty strings
// map: replace ${prop} with data[prop]
var splitStrings = strings.split(new RegExp(genericPlaceholderPattern, 'gmi')).filter(function (str) {
return !!str;
}).map(function (templatePortion) {
var matched = void 0;
for (var prop in data) {
if (matched) break;
var pattern = '\\${\\s*' + prop + '\\s*}';
var regex = new RegExp(pattern, 'gmi');
if (regex.test(templatePortion)) matched = data[prop];
}
if (typeof matched === 'undefined') return templatePortion;
return matched;
});
// if there is a React element, return as array
if (splitStrings.some(function (portion) {
return _react2.default.isValidElement(portion);
})) {
return splitStrings;
}
// otherwise concatenate all portions into the translated value
return splitStrings.reduce(function (translated, portion) {
return translated + ('' + portion);
}, '');
};
var getIndexForLanguageCode = exports.getIndexForLanguageCode = function getIndexForLanguageCode(code, languages) {
return languages.map(function (language) {
return language.code;
}).indexOf(code);
};
var objectValuesToString = exports.objectValuesToString = function objectValuesToString(data) {
return !Object.values ? Object.keys(data).map(function (key) {
return data[key].toString();
}).toString() : Object.values(data).toString();
};
var validateOptions = exports.validateOptions = function validateOptions(options) {
if (options.onMissingTranslation !== undefined && typeof options.onMissingTranslation !== 'function') {
throw new Error('react-localize-redux: an invalid onMissingTranslation function was provided.');
}
if (options.renderToStaticMarkup !== false && typeof options.renderToStaticMarkup !== 'function') {
throw new Error('\n react-localize-redux: initialize option renderToStaticMarkup is invalid.\n Please see https://ryandrewjohnson.github.io/react-localize-redux-docs/#initialize.\n ');
}
return options;
};
var getTranslationsForLanguage = exports.getTranslationsForLanguage = function getTranslationsForLanguage(language, languages, translations) {
// no language! return no translations
if (!language) {
return {};
}
var languageCode = language.code;
var languageIndex = getIndexForLanguageCode(languageCode, languages);
var keys = Object.keys(translations);
var totalKeys = keys.length;
var translationsForLanguage = {};
for (var i = 0; i < totalKeys; i++) {
var key = keys[i];
translationsForLanguage[key] = translations[key][languageIndex];
}
return translationsForLanguage;
};
var storeDidChange = exports.storeDidChange = function storeDidChange(store, onChange) {
var currentState = void 0;
function handleChange() {
var nextState = store.getState();
if (nextState !== currentState) {
onChange(currentState);
currentState = nextState;
}
}
var unsubscribe = store.subscribe(handleChange);
handleChange();
return unsubscribe;
};
var getSingleToMultilanguageTranslation = exports.getSingleToMultilanguageTranslation = function getSingleToMultilanguageTranslation(language, languageCodes, flattenedTranslations, existingTranslations) {
var languageIndex = languageCodes.indexOf(language);
var translations = languageIndex >= 0 ? flattenedTranslations : {};
var keys = Object.keys(translations);
var totalKeys = keys.length;
var singleLanguageTranslations = {};
var _loop = function _loop(i) {
var key = keys[i];
// loop through each language, and for languages that don't match languageIndex
// keep existing translation data, and for languageIndex store new translation data
var translationValues = languageCodes.map(function (code, index) {
var existingValues = existingTranslations[key] || [];
return index === languageIndex ? flattenedTranslations[key] : existingValues[index];
});
singleLanguageTranslations[key] = translationValues;
};
for (var i = 0; i < totalKeys; i++) {
_loop(i);
}
return singleLanguageTranslations;
};
var get = exports.get = function get(obj, path) {
var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
var pathArr = path.split('.').filter(Boolean);
return pathArr.reduce(function (ret, key) {
return ret && ret[key] ? ret[key] : defaultValue;
}, obj);
};
// Thanks react-redux for utility function
// https://github.com/reactjs/react-redux/blob/master/src/utils/warning.js
var warning = exports.warning = function warning(message) {
if (typeof console !== 'undefined' && typeof console.error === 'function') {
console.error(message);
}
try {
// This error was thrown as a convenience so that if you enable
// "break on all exceptions" in your console,
// it would pause the execution at this line.
throw new Error(message);
} catch (e) {}
};
/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/
var emptyFunction = __webpack_require__(6);
/**
* Similar to invariant but only logs a warning if the condition is not met.
* This can be used to log issues in development environments in critical
* paths. Removing the logging code for production environments will keep the
* same logic and follow the same code paths.
*/
var warning = emptyFunction;
if (true) {
var printWarning = function printWarning(format) {
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
var argIndex = 0;
var message = 'Warning: ' + format.replace(/%s/g, function () {
return args[argIndex++];
});
if (typeof console !== 'undefined') {
console.error(message);
}
try {
// --- Welcome to debugging React ---
// This error was thrown as a convenience so that you can use this stack
// to find the callsite that caused this warning to fire.
throw new Error(message);
} catch (x) {}
};
warning = function warning(condition, format) {
if (format === undefined) {
throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');
}
if (format.indexOf('Failed Composite propType: ') === 0) {
return; // Ignore CompositeComponent proptype check.
}
if (!condition) {
for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
args[_key2 - 2] = arguments[_key2];
}
printWarning.apply(undefined, [format].concat(args));
}
};
}
module.exports = warning;
/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
exports.withLocalize = withLocalize;
var _react = __webpack_require__(0);
var _react2 = _interopRequireDefault(_react);
var _hoistNonReactStatics = __webpack_require__(18);
var _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics);
var _LocalizeContext = __webpack_require__(2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
function withLocalize(WrappedComponent) {
var LocalizedComponent = function (_Component) {
_inherits(LocalizedComponent, _Component);
function LocalizedComponent() {
_classCallCheck(this, LocalizedComponent);
return _possibleConstructorReturn(this, (LocalizedComponent.__proto__ || Object.getPrototypeOf(LocalizedComponent)).apply(this, arguments));
}
_createClass(LocalizedComponent, [{
key: 'render',
value: function render() {
var _this2 = this;
return _react2.default.createElement(
_LocalizeContext.LocalizeContext.Consumer,
null,
function (context) {
return _react2.default.createElement(WrappedComponent, _extends({}, context, _this2.props));
}
);
}
}]);
return LocalizedComponent;
}(_react.Component);
(0, _hoistNonReactStatics2.default)(LocalizedComponent, WrappedComponent);
return LocalizedComponent;
}
/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* Copyright (c) 2013-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
*/
function makeEmptyFunction(arg) {
return function () {
return arg;
};
}
/**
* This function accepts and discards inputs; it has no side effects. This is
* primarily useful idiomatically for overridable function endpoints which
* always need to be callable, since JS lacks a null-call idiom ala Cocoa.
*/
var emptyFunction = function emptyFunction() {};
emptyFunction.thatReturns = makeEmptyFunction;
emptyFunction.thatReturnsFalse = makeEmptyFunction(false);
emptyFunction.thatReturnsTrue = makeEmptyFunction(true);
emptyFunction.thatReturnsNull = makeEmptyFunction(null);
emptyFunction.thatReturnsThis = function () {
return this;
};
emptyFunction.thatReturnsArgument = function (arg) {
return arg;
};
module.exports = emptyFunction;
/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* Copyright (c) 2013-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/
/**
* Use invariant() to assert state which your program assumes to be true.
*
* Provide sprintf-style format (only %s is supported) and arguments
* to provide information about what broke and what you were
* expecting.
*
* The invariant message will be stripped in production, but the invariant
* will remain to ensure logic does not differ in production.
*/
var validateFormat = function validateFormat(format) {};
if (true) {
validateFormat = function validateFormat(format) {
if (format === undefined) {
throw new Error('invariant requires an error message argument');
}
};
}
function invariant(condition, format, a, b, c, d, e, f) {
validateFormat(format);
if (!condition) {
var error;
if (format === undefined) {
error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');
} else {
var args = [a, b, c, d, e, f];
var argIndex = 0;
error = new Error(format.replace(/%s/g, function () {
return args[argIndex++];
}));
error.name = 'Invariant Violation';
}
error.framesToPop = 1; // we don't care about invariant's own frame
throw error;
}
}
module.exports = invariant;
/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {
/**
* Copyright (c) 2013-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
if (true) {
var REACT_ELEMENT_TYPE = (typeof Symbol === 'function' &&
Symbol.for &&
Symbol.for('react.element')) ||
0xeac7;
var isValidElement = function(object) {
return typeof object === 'object' &&
object !== null &&
object.$$typeof === REACT_ELEMENT_TYPE;
};
// By explicitly using `prop-types` you are opting into new development behavior.
// http://fb.me/prop-types-in-prod
var throwOnDirectAccess = true;
module.exports = __webpack_require__(22)(isValidElement, throwOnDirectAccess);
} else {
// By explicitly using `prop-types` you are opting into new production behavior.
// http://fb.me/prop-types-in-prod
module.exports = require('./factoryWithThrowingShims')();
}
/***/ }),
/* 9 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* Copyright (c) 2013-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
module.exports = ReactPropTypesSecret;
/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
exports.defaultMemoize = defaultMemoize;
exports.createSelectorCreator = createSelectorCreator;
exports.createStructuredSelector = createStructuredSelector;
function defaultEqualityCheck(a, b) {
return a === b;
}
function areArgumentsShallowlyEqual(equalityCheck, prev, next) {
if (prev === null || next === null || prev.length !== next.length) {
return false;
}
// Do this in a for loop (and not a `forEach` or an `every`) so we can determine equality as fast as possible.
var length = prev.length;
for (var i = 0; i < length; i++) {
if (!equalityCheck(prev[i], next[i])) {
return false;
}
}
return true;
}
function defaultMemoize(func) {
var equalityCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultEqualityCheck;
var lastArgs = null;
var lastResult = null;
// we reference arguments instead of spreading them for performance reasons
return function () {
if (!areArgumentsShallowlyEqual(equalityCheck, lastArgs, arguments)) {
// apply arguments instead of spreading for performance.
lastResult = func.apply(null, arguments);
}
lastArgs = arguments;
return lastResult;
};
}
function getDependencies(funcs) {
var dependencies = Array.isArray(funcs[0]) ? funcs[0] : funcs;
if (!dependencies.every(function (dep) {
return typeof dep === 'function';
})) {
var dependencyTypes = dependencies.map(function (dep) {
return typeof dep;
}).join(', ');
throw new Error('Selector creators expect all input-selectors to be functions, ' + ('instead received the following types: [' + dependencyTypes + ']'));
}
return dependencies;
}
function createSelectorCreator(memoize) {
for (var _len = arguments.length, memoizeOptions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
memoizeOptions[_key - 1] = arguments[_key];
}
return function () {
for (var _len2 = arguments.length, funcs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
funcs[_key2] = arguments[_key2];
}
var recomputations = 0;
var resultFunc = funcs.pop();
var dependencies = getDependencies(funcs);
var memoizedResultFunc = memoize.apply(undefined, [function () {
recomputations++;
// apply arguments instead of spreading for performance.
return resultFunc.apply(null, arguments);
}].concat(memoizeOptions));
// If a selector is called with the exact same arguments we don't need to traverse our dependencies again.
var selector = defaultMemoize(function () {
var params = [];
var length = dependencies.length;
for (var i = 0; i < length; i++) {
// apply arguments instead of spreading and mutate a local list of params for performance.
params.push(dependencies[i].apply(null, arguments));
}
// apply arguments instead of spreading for performance.
return memoizedResultFunc.apply(null, params);
});
selector.resultFunc = resultFunc;
selector.recomputations = function () {
return recomputations;
};
selector.resetRecomputations = function () {
return recomputations = 0;
};
return selector;
};
}
var createSelector = exports.createSelector = createSelectorCreator(defaultMemoize);
function createStructuredSelector(selectors) {
var selectorCreator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : createSelector;
if (typeof selectors !== 'object') {
throw new Error('createStructuredSelector expects first argument to be an object ' + ('where each property is a selector, instead received a ' + typeof selectors));
}
var objectKeys = Object.keys(selectors);
return selectorCreator(objectKeys.map(function (key) {
return selectors[key];
}), function () {
for (var _len3 = arguments.length, values = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
values[_key3] = arguments[_key3];
}
return values.reduce(function (composition, value, index) {
composition[objectKeys[index]] = value;
return composition;
}, {});
});
}
/***/ }),
/* 11 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.LocalizeProvider = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = __webpack_require__(0);
var _react2 = _interopRequireDefault(_react);
var _localize = __webpack_require__(1);
var _LocalizeContext = __webpack_require__(2);
var _utils = __webpack_require__(3);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var LocalizeProvider = exports.LocalizeProvider = function (_Component) {
_inherits(LocalizeProvider, _Component);
function LocalizeProvider(props) {
_classCallCheck(this, LocalizeProvider);
var _this = _possibleConstructorReturn(this, (LocalizeProvider.__proto__ || Object.getPrototypeOf(LocalizeProvider)).call(this, props));
var dispatch = _this.props.store ? _this.props.store.dispatch : _this.dispatch.bind(_this);
_this.getContextPropsSelector = (0, _LocalizeContext.getContextPropsFromState)(dispatch);
var initialState = _this.props.initialize !== undefined ? (0, _localize.localizeReducer)(undefined, {
type: _localize.INITIALIZE,
payload: _this.props.initialize
}) : (0, _localize.localizeReducer)(undefined, {});
_this.state = {
localize: initialState
};
return _this;
}
_createClass(LocalizeProvider, [{
key: 'componentDidMount',
value: function componentDidMount() {
this.initExternalStore();
this.subscribeToExternalStore();
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
this.unsubscribeFromStore && this.unsubscribeFromStore();
}
}, {
key: 'initExternalStore',
value: function initExternalStore() {
var _props = this.props,
store = _props.store,
initialize = _props.initialize;
if (store && initialize) {
store.dispatch((0, _localize.initialize)(initialize));
}
}
}, {
key: 'subscribeToExternalStore',
value: function subscribeToExternalStore() {
var store = this.props.store;
if (store) {
this.unsubscribeFromStore = (0, _utils.storeDidChange)(store, this.onStateDidChange.bind(this));
}
}
}, {
key: 'onStateDidChange',
value: function onStateDidChange(prevState) {
if (!this.props.store) {
return;
}
var getState = this.props.getState || function (state) {
return state.localize;
};
var prevLocalizeState = prevState && getState(prevState);
var curLocalizeState = getState(this.props.store.getState());
var prevActiveLanguage = prevState && (0, _localize.getActiveLanguage)(prevLocalizeState);
var curActiveLanguage = (0, _localize.getActiveLanguage)(curLocalizeState);
var prevOptions = prevState && (0, _localize.getOptions)(prevLocalizeState);
var curOptions = (0, _localize.getOptions)(curLocalizeState);
var prevTranslations = prevState && (0, _localize.getTranslationsForActiveLanguage)(prevLocalizeState);
var curTranslations = (0, _localize.getTranslationsForActiveLanguage)(curLocalizeState);
var hasActiveLangaugeChanged = (prevActiveLanguage && prevActiveLanguage.code) !== (curActiveLanguage && curActiveLanguage.code);
var hasOptionsChanged = prevOptions !== curOptions;
var hasTranslationsChanged = prevTranslations !== curTranslations;
if (hasActiveLangaugeChanged || hasOptionsChanged || hasTranslationsChanged) {
this.setState({ localize: curLocalizeState });
}
}
}, {
key: 'dispatch',
value: function dispatch(action) {
this.setState(function (prevState) {
return {
localize: (0, _localize.localizeReducer)(prevState.localize, action)
};
});
}
}, {
key: 'render',
value: function render() {
this.contextProps = this.getContextPropsSelector(this.state.localize);
return _react2.default.createElement(
_LocalizeContext.LocalizeContext.Provider,
{ value: this.contextProps },
this.props.children
);
}
}]);
return LocalizeProvider;
}(_react.Component);
/***/ }),
/* 12 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Translate = undefined;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = __webpack_require__(0);
var React = _interopRequireWildcard(_react);
var _propTypes = __webpack_require__(8);
var _propTypes2 = _interopRequireDefault(_propTypes);
var _localize = __webpack_require__(1);
var _utils = __webpack_require__(3);
var _LocalizeContext = __webpack_require__(2);
var _withLocalize = __webpack_require__(5);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurabl