You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
5.1 KiB
132 lines
5.1 KiB
3 years ago
|
"use strict";
|
||
|
|
||
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
exports.useTranslation = useTranslation;
|
||
|
|
||
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
||
|
|
||
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
||
|
|
||
|
var _react = require("react");
|
||
|
|
||
|
var _context = require("./context");
|
||
|
|
||
|
var _utils = require("./utils");
|
||
|
|
||
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
||
|
|
||
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
||
|
|
||
|
var usePrevious = function usePrevious(value, ignore) {
|
||
|
var ref = (0, _react.useRef)();
|
||
|
(0, _react.useEffect)(function () {
|
||
|
ref.current = ignore ? ref.current : value;
|
||
|
}, [value, ignore]);
|
||
|
return ref.current;
|
||
|
};
|
||
|
|
||
|
function useTranslation(ns) {
|
||
|
var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
||
|
var i18nFromProps = props.i18n;
|
||
|
|
||
|
var _ref = (0, _react.useContext)(_context.I18nContext) || {},
|
||
|
i18nFromContext = _ref.i18n,
|
||
|
defaultNSFromContext = _ref.defaultNS;
|
||
|
|
||
|
var i18n = i18nFromProps || i18nFromContext || (0, _context.getI18n)();
|
||
|
if (i18n && !i18n.reportNamespaces) i18n.reportNamespaces = new _context.ReportNamespaces();
|
||
|
|
||
|
if (!i18n) {
|
||
|
(0, _utils.warnOnce)('You will need to pass in an i18next instance by using initReactI18next');
|
||
|
|
||
|
var notReadyT = function notReadyT(k) {
|
||
|
return Array.isArray(k) ? k[k.length - 1] : k;
|
||
|
};
|
||
|
|
||
|
var retNotReady = [notReadyT, {}, false];
|
||
|
retNotReady.t = notReadyT;
|
||
|
retNotReady.i18n = {};
|
||
|
retNotReady.ready = false;
|
||
|
return retNotReady;
|
||
|
}
|
||
|
|
||
|
if (i18n.options.react && i18n.options.react.wait !== undefined) (0, _utils.warnOnce)('It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.');
|
||
|
|
||
|
var i18nOptions = _objectSpread(_objectSpread(_objectSpread({}, (0, _context.getDefaults)()), i18n.options.react), props);
|
||
|
|
||
|
var useSuspense = i18nOptions.useSuspense,
|
||
|
keyPrefix = i18nOptions.keyPrefix;
|
||
|
var namespaces = ns || defaultNSFromContext || i18n.options && i18n.options.defaultNS;
|
||
|
namespaces = typeof namespaces === 'string' ? [namespaces] : namespaces || ['translation'];
|
||
|
if (i18n.reportNamespaces.addUsedNamespaces) i18n.reportNamespaces.addUsedNamespaces(namespaces);
|
||
|
var ready = (i18n.isInitialized || i18n.initializedStoreOnce) && namespaces.every(function (n) {
|
||
|
return (0, _utils.hasLoadedNamespace)(n, i18n, i18nOptions);
|
||
|
});
|
||
|
|
||
|
function getT() {
|
||
|
return i18n.getFixedT(null, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix);
|
||
|
}
|
||
|
|
||
|
var _useState = (0, _react.useState)(getT),
|
||
|
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
||
|
t = _useState2[0],
|
||
|
setT = _useState2[1];
|
||
|
|
||
|
var joinedNS = namespaces.join();
|
||
|
var previousJoinedNS = usePrevious(joinedNS);
|
||
|
var isMounted = (0, _react.useRef)(true);
|
||
|
(0, _react.useEffect)(function () {
|
||
|
var bindI18n = i18nOptions.bindI18n,
|
||
|
bindI18nStore = i18nOptions.bindI18nStore;
|
||
|
isMounted.current = true;
|
||
|
|
||
|
if (!ready && !useSuspense) {
|
||
|
(0, _utils.loadNamespaces)(i18n, namespaces, function () {
|
||
|
if (isMounted.current) setT(getT);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
if (ready && previousJoinedNS && previousJoinedNS !== joinedNS && isMounted.current) {
|
||
|
setT(getT);
|
||
|
}
|
||
|
|
||
|
function boundReset() {
|
||
|
if (isMounted.current) setT(getT);
|
||
|
}
|
||
|
|
||
|
if (bindI18n && i18n) i18n.on(bindI18n, boundReset);
|
||
|
if (bindI18nStore && i18n) i18n.store.on(bindI18nStore, boundReset);
|
||
|
return function () {
|
||
|
isMounted.current = false;
|
||
|
if (bindI18n && i18n) bindI18n.split(' ').forEach(function (e) {
|
||
|
return i18n.off(e, boundReset);
|
||
|
});
|
||
|
if (bindI18nStore && i18n) bindI18nStore.split(' ').forEach(function (e) {
|
||
|
return i18n.store.off(e, boundReset);
|
||
|
});
|
||
|
};
|
||
|
}, [i18n, joinedNS]);
|
||
|
var isInitial = (0, _react.useRef)(true);
|
||
|
(0, _react.useEffect)(function () {
|
||
|
if (isMounted.current && !isInitial.current) {
|
||
|
setT(getT);
|
||
|
}
|
||
|
|
||
|
isInitial.current = false;
|
||
|
}, [i18n, keyPrefix]);
|
||
|
var ret = [t, i18n, ready];
|
||
|
ret.t = t;
|
||
|
ret.i18n = i18n;
|
||
|
ret.ready = ready;
|
||
|
if (ready) return ret;
|
||
|
if (!ready && !useSuspense) return ret;
|
||
|
throw new Promise(function (resolve) {
|
||
|
(0, _utils.loadNamespaces)(i18n, namespaces, function () {
|
||
|
resolve();
|
||
|
});
|
||
|
});
|
||
|
}
|