1 | ;
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.default = exports.HydrationStateToken = void 0;
|
7 |
|
8 | var _fusionTokens = require("fusion-tokens");
|
9 |
|
10 | var _fusionCore = require("fusion-core");
|
11 |
|
12 | var _fusionPluginUniversalEvents = require("fusion-plugin-universal-events");
|
13 |
|
14 | /** Copyright (c) 2018 Uber Technologies, Inc.
|
15 | *
|
16 | * This source code is licensed under the MIT license found in the
|
17 | * LICENSE file in the root directory of this source tree.
|
18 | *
|
19 | *
|
20 | */
|
21 |
|
22 | /* eslint-env browser */
|
23 | function loadTranslations() {
|
24 | const element = document.getElementById('__TRANSLATIONS__');
|
25 |
|
26 | if (!element) {
|
27 | throw new Error('[fusion-plugin-i18n] - Could not find a __TRANSLATIONS__ element');
|
28 | }
|
29 |
|
30 | try {
|
31 | return JSON.parse((0, _fusionCore.unescape)(element.textContent));
|
32 | } catch (e) {
|
33 | throw new Error('[fusion-plugin-i18n] - Error parsing __TRANSLATIONS__ element content');
|
34 | }
|
35 | }
|
36 |
|
37 | const HydrationStateToken = (0, _fusionCore.createToken)('HydrationStateToken');
|
38 | exports.HydrationStateToken = HydrationStateToken;
|
39 |
|
40 | const pluginFactory = () => (0, _fusionCore.createPlugin)({
|
41 | deps: {
|
42 | fetch: _fusionTokens.FetchToken.optional,
|
43 | hydrationState: HydrationStateToken.optional,
|
44 | events: _fusionPluginUniversalEvents.UniversalEventsToken.optional
|
45 | },
|
46 | provides: ({
|
47 | fetch = window.fetch,
|
48 | hydrationState,
|
49 | events
|
50 | } = {}) => {
|
51 | class I18n {
|
52 | constructor() {
|
53 | const {
|
54 | localeCode,
|
55 | translations
|
56 | } = hydrationState || loadTranslations();
|
57 | this.requestedKeys = new Set();
|
58 | this.translations = translations || {};
|
59 |
|
60 | if (localeCode) {
|
61 | this.locale = localeCode;
|
62 | }
|
63 | }
|
64 |
|
65 | async load(translationKeys) {
|
66 | const loadedKeys = Object.keys(this.translations);
|
67 | const unloaded = translationKeys.filter(key => {
|
68 | return loadedKeys.indexOf(key) < 0 && !this.requestedKeys.has(key);
|
69 | });
|
70 |
|
71 | if (unloaded.length > 0) {
|
72 | // Don't try to load translations again if a request is already in
|
73 | // flight. This means that we need to add unloaded chunks to
|
74 | // loadedChunks optimistically and remove them if some error happens
|
75 | unloaded.forEach(key => {
|
76 | this.requestedKeys.add(key);
|
77 | });
|
78 | const fetchOpts = {
|
79 | method: 'POST',
|
80 | headers: {
|
81 | Accept: '*/*',
|
82 | 'Content-Type': 'application/json',
|
83 | ...(this.locale ? {
|
84 | 'X-Fusion-Locale-Code': this.locale
|
85 | } : {})
|
86 | },
|
87 | body: JSON.stringify(unloaded)
|
88 | }; // TODO(#3) don't append prefix if injected fetch also injects prefix
|
89 |
|
90 | return fetch(`/_translations${this.locale ? `?localeCode=${this.locale}` : ''}`, fetchOpts).then(r => {
|
91 | try {
|
92 | return r.json();
|
93 | } catch (err) {
|
94 | events && events.emit('i18n-load-error', {
|
95 | text: r.text()
|
96 | });
|
97 | throw err;
|
98 | }
|
99 | }).then(data => {
|
100 | for (const key in data) {
|
101 | this.translations[key] = data[key];
|
102 | this.requestedKeys.delete(key);
|
103 | }
|
104 | }).catch(err => {
|
105 | // An error occurred, so remove the chunks we were trying to load
|
106 | // from loadedChunks. This allows us to try to load those chunk
|
107 | // translations again
|
108 | unloaded.forEach(key => {
|
109 | this.requestedKeys.delete(key);
|
110 | });
|
111 | });
|
112 | }
|
113 | }
|
114 |
|
115 | translate(key, interpolations = {}) {
|
116 | const template = this.translations[key];
|
117 |
|
118 | if (typeof template !== 'string') {
|
119 | events && events.emit('i18n-translate-miss', {
|
120 | key
|
121 | });
|
122 | return key;
|
123 | }
|
124 |
|
125 | return template.replace(/\${(.*?)}/g, (_, k) => interpolations[k] === void 0 ? '${' + k + '}' : String(interpolations[k]));
|
126 | }
|
127 |
|
128 | }
|
129 |
|
130 | const i18n = new I18n();
|
131 | return {
|
132 | from: () => i18n
|
133 | };
|
134 | }
|
135 | });
|
136 |
|
137 | var _default = false && pluginFactory();
|
138 |
|
139 | exports.default = _default;
|
140 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJyb3dzZXIuanMiXSwibmFtZXMiOlsibG9hZFRyYW5zbGF0aW9ucyIsImVsZW1lbnQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiRXJyb3IiLCJKU09OIiwicGFyc2UiLCJ0ZXh0Q29udGVudCIsImUiLCJIeWRyYXRpb25TdGF0ZVRva2VuIiwicGx1Z2luRmFjdG9yeSIsImRlcHMiLCJmZXRjaCIsIkZldGNoVG9rZW4iLCJvcHRpb25hbCIsImh5ZHJhdGlvblN0YXRlIiwiZXZlbnRzIiwiVW5pdmVyc2FsRXZlbnRzVG9rZW4iLCJwcm92aWRlcyIsIndpbmRvdyIsIkkxOG4iLCJjb25zdHJ1Y3RvciIsImxvY2FsZUNvZGUiLCJ0cmFuc2xhdGlvbnMiLCJyZXF1ZXN0ZWRLZXlzIiwiU2V0IiwibG9jYWxlIiwibG9hZCIsInRyYW5zbGF0aW9uS2V5cyIsImxvYWRlZEtleXMiLCJPYmplY3QiLCJrZXlzIiwidW5sb2FkZWQiLCJmaWx0ZXIiLCJrZXkiLCJpbmRleE9mIiwiaGFzIiwibGVuZ3RoIiwiZm9yRWFjaCIsImFkZCIsImZldGNoT3B0cyIsIm1ldGhvZCIsImhlYWRlcnMiLCJBY2NlcHQiLCJib2R5Iiwic3RyaW5naWZ5IiwidGhlbiIsInIiLCJqc29uIiwiZXJyIiwiZW1pdCIsInRleHQiLCJkYXRhIiwiZGVsZXRlIiwiY2F0Y2giLCJ0cmFuc2xhdGUiLCJpbnRlcnBvbGF0aW9ucyIsInRlbXBsYXRlIiwicmVwbGFjZSIsIl8iLCJrIiwiU3RyaW5nIiwiaTE4biIsImZyb20iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFTQTs7QUFDQTs7QUFFQTs7QUFaQTs7Ozs7Ozs7QUFRQTtBQWdCQSxTQUFTQSxnQkFBVCxHQUFvRDtBQUNsRCxRQUFNQyxPQUFPLEdBQUdDLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixrQkFBeEIsQ0FBaEI7O0FBQ0EsTUFBSSxDQUFDRixPQUFMLEVBQWM7QUFDWixVQUFNLElBQUlHLEtBQUosQ0FDSixrRUFESSxDQUFOO0FBR0Q7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V0FBTztBQUFDMkMsTUFBQUEsSUFBSSxFQUFFLE1BQU1EO0FBQWIsS0FBUDtBQUNEO0FBMUZVLENBQWIsQ0FERjs7ZUE4RmlCLFNBQWVwRCxhQUFhLEUiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQ29weXJpZ2h0IChjKSAyMDE4IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKlxuICogQGZsb3dcbiAqL1xuXG4vKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbmltcG9ydCB7RmV0Y2hUb2tlbn0gZnJvbSAnZnVzaW9uLXRva2Vucyc7XG5pbXBvcnQge2NyZWF0ZVBsdWdpbiwgdW5lc2NhcGUsIGNyZWF0ZVRva2VufSBmcm9tICdmdXNpb24tY29yZSc7XG5pbXBvcnQgdHlwZSB7RnVzaW9uUGx1Z2luLCBUb2tlbn0gZnJvbSAnZnVzaW9uLWNvcmUnO1xuaW1wb3J0IHtVbml2ZXJzYWxFdmVudHNUb2tlbn0gZnJvbSAnZnVzaW9uLXBsdWdpbi11bml2ZXJzYWwtZXZlbnRzJztcblxuaW1wb3J0IHR5cGUge1xuICBJMThuRGVwc1R5cGUsXG4gIEkxOG5TZXJ2aWNlVHlwZSxcbiAgVHJhbnNsYXRpb25zT2JqZWN0VHlwZSxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbnR5cGUgTG9hZGVkVHJhbnNsYXRpb25zVHlwZSA9IHtcbiAgbG9jYWxlQ29kZT86IHN0cmluZyxcbiAgdHJhbnNsYXRpb25zPzogVHJhbnNsYXRpb25zT2JqZWN0VHlwZSxcbn07XG5mdW5jdGlvbiBsb2FkVHJhbnNsYXRpb25zKCk6IExvYWRlZFRyYW5zbGF0aW9uc1R5cGUge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19fVFJBTlNMQVRJT05TX18nKTtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1tmdXNpb24tcGx1Z2luLWkxOG5dIC0gQ291bGQgbm90IGZpbmQgYSBfX1RSQU5TTEFUSU9OU19fIGVsZW1lbnQnXG4gICAgKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHVuZXNjYXBlKGVsZW1lbnQudGV4dENvbnRlbnQpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdbZnVzaW9uLXBsdWdpbi1pMThuXSAtIEVycm9yIHBhcnNpbmcgX19UUkFOU0xBVElPTlNfXyBlbGVtZW50IGNvbnRlbnQnXG4gICAgKTtcbiAgfVxufVxuXG50eXBlIEh5ZHJhdGlvblN0YXRlVHlwZSA9IHtcbiAgbG9jYWxlQ29kZT86IHN0cmluZyxcbiAgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbnNPYmplY3RUeXBlLFxufTtcbmV4cG9ydCBjb25zdCBIeWRyYXRpb25TdGF0ZVRva2VuOiBUb2tlbjxIeWRyYXRpb25TdGF0ZVR5cGU+ID0gY3JlYXRlVG9rZW4oXG4gICdIeWRyYXRpb25TdGF0ZVRva2VuJ1xuKTtcblxudHlwZSBQbHVnaW5UeXBlID0gRnVzaW9uUGx1Z2luPEkxOG5EZXBzVHlwZSwgSTE4blNlcnZpY2VUeXBlPjtcbmNvbnN0IHBsdWdpbkZhY3Rvcnk6ICgpID0+IFBsdWdpblR5cGUgPSAoKSA9PlxuICBjcmVhdGVQbHVnaW4oe1xuICAgIGRlcHM6IHtcbiAgICAgIGZldGNoOiBGZXRjaFRva2VuLm9wdGlvbmFsLFxuICAgICAgaHlkcmF0aW9uU3RhdGU6IEh5ZHJhdGlvblN0YXRlVG9rZW4ub3B0aW9uYWwsXG4gICAgICBldmVudHM6IFVuaXZlcnNhbEV2ZW50c1Rva2VuLm9wdGlvbmFsLFxuICAgIH0sXG4gICAgcHJvdmlkZXM6ICh7ZmV0Y2ggPSB3aW5kb3cuZmV0Y2gsIGh5ZHJhdGlvblN0YXRlLCBldmVudHN9ID0ge30pID0+IHtcbiAgICAgIGNsYXNzIEkxOG4ge1xuICAgICAgICBsb2NhbGU6IHN0cmluZztcbiAgICAgICAgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbnNPYmplY3RUeXBlO1xuICAgICAgICByZXF1ZXN0ZWRLZXlzOiBTZXQ8c3RyaW5nPjtcblxuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICBjb25zdCB7bG9jYWxlQ29kZSwgdHJhbnNsYXRpb25zfSA9XG4gICAgICAgICAgICBoeWRyYXRpb25TdGF0ZSB8fCBsb2FkVHJhbnNsYXRpb25zKCk7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0ZWRLZXlzID0gbmV3IFNldCgpO1xuICAgICAgICAgIHRoaXMudHJhbnNsYXRpb25zID0gdHJhbnNsYXRpb25zIHx8IHt9O1xuICAgICAgICAgIGlmIChsb2NhbGVDb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZUNvZGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGxvYWQodHJhbnNsYXRpb25LZXlzKSB7XG4gICAgICAgICAgY29uc3QgbG9hZGVkS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMudHJhbnNsYXRpb25zKTtcbiAgICAgICAgICBjb25zdCB1bmxvYWRlZCA9IHRyYW5zbGF0aW9uS2V5cy5maWx0ZXIoa2V5ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2FkZWRLZXlzLmluZGV4T2Yoa2V5KSA8IDAgJiYgIXRoaXMucmVxdWVzdGVkS2V5cy5oYXMoa2V5KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAodW5sb2FkZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIGxvYWQgdHJhbnNsYXRpb25zIGFnYWluIGlmIGEgcmVxdWVzdCBpcyBhbHJlYWR5IGluXG4gICAgICAgICAgICAvLyBmbGlnaHQuIFRoaXMgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIGFkZCB1bmxvYWRlZCBjaHVua3MgdG9cbiAgICAgICAgICAgIC8vIGxvYWRlZENodW5rcyBvcHRpbWlzdGljYWxseSBhbmQgcmVtb3ZlIHRoZW0gaWYgc29tZSBlcnJvciBoYXBwZW5zXG4gICAgICAgICAgICB1bmxvYWRlZC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucmVxdWVzdGVkS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZmV0Y2hPcHRzID0ge1xuICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEFjY2VwdDogJyovKicsXG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5sb2NhbGUgPyB7J1gtRnVzaW9uLUxvY2FsZS1Db2RlJzogdGhpcy5sb2NhbGV9IDoge30pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh1bmxvYWRlZCksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gVE9ETygjMykgZG9uJ3QgYXBwZW5kIHByZWZpeCBpZiBpbmplY3RlZCBmZXRjaCBhbHNvIGluamVjdHMgcHJlZml4XG4gICAgICAgICAgICByZXR1cm4gZmV0Y2goXG4gICAgICAgICAgICAgIGAvX3RyYW5zbGF0aW9ucyR7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbGUgPyBgP2xvY2FsZUNvZGU9JHt0aGlzLmxvY2FsZX1gIDogJydcbiAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgIGZldGNoT3B0c1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAudGhlbihyID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuanNvbigpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgZXZlbnRzICYmIGV2ZW50cy5lbWl0KCdpMThuLWxvYWQtZXJyb3InLCB7dGV4dDogci50ZXh0KCl9KTtcbiAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC50aGVuKChkYXRhOiB7W3N0cmluZ106IHN0cmluZ30pID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uc1trZXldID0gZGF0YVtrZXldO1xuICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ZWRLZXlzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnI6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQsIHNvIHJlbW92ZSB0aGUgY2h1bmtzIHdlIHdlcmUgdHJ5aW5nIHRvIGxvYWRcbiAgICAgICAgICAgICAgICAvLyBmcm9tIGxvYWRlZENodW5rcy4gVGhpcyBhbGxvd3MgdXMgdG8gdHJ5IHRvIGxvYWQgdGhvc2UgY2h1bmtcbiAgICAgICAgICAgICAgICAvLyB0cmFuc2xhdGlvbnMgYWdhaW5cbiAgICAgICAgICAgICAgICB1bmxvYWRlZC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RlZEtleXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmFuc2xhdGUoa2V5LCBpbnRlcnBvbGF0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLnRyYW5zbGF0aW9uc1trZXldO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGV2ZW50cyAmJiBldmVudHMuZW1pdCgnaTE4bi10cmFuc2xhdGUtbWlzcycsIHtrZXl9KTtcbiAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL1xcJHsoLio/KX0vZywgKF8sIGspID0+XG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uc1trXSA9PT0gdm9pZCAwXG4gICAgICAgICAgICAgID8gJyR7JyArIGsgKyAnfSdcbiAgICAgICAgICAgICAgOiBTdHJpbmcoaW50ZXJwb2xhdGlvbnNba10pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgaTE4biA9IG5ldyBJMThuKCk7XG4gICAgICByZXR1cm4ge2Zyb206ICgpID0+IGkxOG59O1xuICAgIH0sXG4gIH0pO1xuXG5leHBvcnQgZGVmYXVsdCAoKF9fQlJPV1NFUl9fICYmIHBsdWdpbkZhY3RvcnkoKTogYW55KTogUGx1Z2luVHlwZSk7XG4iXX0= |
\ | No newline at end of file |