Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

124 строки
5.1 KiB

  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.useTranslation = useTranslation;
  7. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  8. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  9. var _react = require("react");
  10. var _context = require("./context");
  11. var _utils = require("./utils");
  12. 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; }
  13. function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
  14. function useTranslation(ns) {
  15. var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  16. // assert we have the needed i18nInstance
  17. var i18nFromProps = props.i18n;
  18. var ReactI18nContext = (0, _react.useContext)(_context.I18nContext);
  19. var _ref = (0, _context.getHasUsedI18nextProvider)() ? ReactI18nContext || {} : {},
  20. i18nFromContext = _ref.i18n,
  21. defaultNSFromContext = _ref.defaultNS;
  22. var i18n = i18nFromProps || i18nFromContext || (0, _context.getI18n)();
  23. if (i18n && !i18n.reportNamespaces) i18n.reportNamespaces = new _context.ReportNamespaces();
  24. if (!i18n) {
  25. (0, _utils.warnOnce)('You will need pass in an i18next instance by using initReactI18next');
  26. var retNotReady = [function (k) {
  27. return k;
  28. }, {}, false];
  29. retNotReady.t = function (k) {
  30. return k;
  31. };
  32. retNotReady.i18n = {};
  33. retNotReady.ready = false;
  34. return retNotReady;
  35. }
  36. var i18nOptions = _objectSpread({}, (0, _context.getDefaults)(), {}, i18n.options.react);
  37. var _props$useSuspense = props.useSuspense,
  38. useSuspense = _props$useSuspense === void 0 ? i18nOptions.useSuspense : _props$useSuspense; // prepare having a namespace
  39. var namespaces = ns || defaultNSFromContext || i18n.options && i18n.options.defaultNS;
  40. namespaces = typeof namespaces === 'string' ? [namespaces] : namespaces || ['translation']; // report namespaces as used
  41. if (i18n.reportNamespaces.addUsedNamespaces) i18n.reportNamespaces.addUsedNamespaces(namespaces); // are we ready? yes if all namespaces in first language are loaded already (either with data or empty object on failed load)
  42. var ready = (i18n.isInitialized || i18n.initializedStoreOnce) && namespaces.every(function (n) {
  43. return (0, _utils.hasLoadedNamespace)(n, i18n);
  44. }); // binding t function to namespace (acts also as rerender trigger)
  45. function getT() {
  46. return {
  47. t: i18n.getFixedT(null, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0])
  48. };
  49. }
  50. var _useState = (0, _react.useState)(getT()),
  51. _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
  52. t = _useState2[0],
  53. setT = _useState2[1]; // seems we can't have functions as value -> wrap it in obj
  54. (0, _react.useEffect)(function () {
  55. var isMounted = true;
  56. var bindI18n = i18nOptions.bindI18n,
  57. bindI18nStore = i18nOptions.bindI18nStore; // if not ready and not using suspense load the namespaces
  58. // in side effect and do not call resetT if unmounted
  59. if (!ready && !useSuspense) {
  60. (0, _utils.loadNamespaces)(i18n, namespaces, function () {
  61. if (isMounted) setT(getT());
  62. });
  63. }
  64. function boundReset() {
  65. if (isMounted) setT(getT());
  66. } // bind events to trigger change, like languageChanged
  67. if (bindI18n && i18n) i18n.on(bindI18n, boundReset);
  68. if (bindI18nStore && i18n) i18n.store.on(bindI18nStore, boundReset); // unbinding on unmount
  69. return function () {
  70. isMounted = false;
  71. if (bindI18n && i18n) bindI18n.split(' ').forEach(function (e) {
  72. return i18n.off(e, boundReset);
  73. });
  74. if (bindI18nStore && i18n) bindI18nStore.split(' ').forEach(function (e) {
  75. return i18n.store.off(e, boundReset);
  76. });
  77. };
  78. }, [namespaces.join()]); // re-run effect whenever list of namespaces changes
  79. var ret = [t.t, i18n, ready];
  80. ret.t = t.t;
  81. ret.i18n = i18n;
  82. ret.ready = ready; // return hook stuff if ready
  83. if (ready) return ret; // not yet loaded namespaces -> load them -> and return if useSuspense option set false
  84. if (!ready && !useSuspense) return ret; // not yet loaded namespaces -> load them -> and trigger suspense
  85. throw new Promise(function (resolve) {
  86. (0, _utils.loadNamespaces)(i18n, namespaces, function () {
  87. setT(getT());
  88. resolve();
  89. });
  90. });
  91. }