react-localization/lib/LocalizedStrings.js
2018-10-18 22:52:03 +02:00

89 lines
3.3 KiB
JavaScript

'use strict';
/**
* Simple module to localize the React interface using the same syntax
* used in the ReactNativeLocalization module
* (https://github.com/stefalda/ReactNativeLocalization)
*
* Originally developed by Stefano Falda (stefano.falda@gmail.com)
*
* It uses a call to the Navigator/Browser object to get the current interface language,
* then display the correct language strings or the default language (the first
* one if a match is not found).
*
* This library has been refactored to use the newly created localized-strings package so to
* unify the code and make it easier to mantain
*
* How to use:
* Check the instructions at:
* https://github.com/stefalda/react-localization
*/
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 _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _localizedStrings = require('localized-strings');
var _localizedStrings2 = _interopRequireDefault(_localizedStrings);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var placeholderRegex = /(\{[\d|\w]+\})/;
/**
* Format the passed string replacing the numbered or tokenized placeholders
* eg. 1: I'd like some {0} and {1}, or just {0}
* eg. 2: I'd like some {bread} and {butter}, or just {bread}
* Use example:
* eg. 1: strings.formatString(strings.question, strings.bread, strings.butter)
* eg. 2: strings.formatString(strings.question, { bread: strings.bread, butter: strings.butter }
*
* THIS METHOD OVERRIDE the one of the parent class by adding support for JSX code
*/
_localizedStrings2.default.prototype.formatString = function (str) {
for (var _len = arguments.length, valuesForPlaceholders = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
valuesForPlaceholders[_key - 1] = arguments[_key];
}
var hasObject = false;
var res = (str || '').split(placeholderRegex).filter(function (textPart) {
return !!textPart;
}).map(function (textPart, index) {
if (textPart.match(placeholderRegex)) {
var matchedKey = textPart.slice(1, -1);
var valueForPlaceholder = valuesForPlaceholders[matchedKey];
// If no value found, check if working with an object instead
if (valueForPlaceholder == undefined) {
var valueFromObjectPlaceholder = valuesForPlaceholders[0][matchedKey];
if (valueFromObjectPlaceholder !== undefined) {
valueForPlaceholder = valueFromObjectPlaceholder;
} else {
// If value still isn't found, then it must have been undefined/null
return valueForPlaceholder;
}
}
if (_react2.default.isValidElement(valueForPlaceholder)) {
hasObject = true;
return _react2.default.Children.toArray(valueForPlaceholder).map(function (component) {
return _extends({}, component, { key: index.toString() });
});
}
return valueForPlaceholder;
}
return textPart;
});
// If the results contains a object return an array otherwise return a string
if (hasObject) return res;
return res.join('');
};
exports.default = _localizedStrings2.default;