UNPKG

15.6 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = exports.HydrationStateToken = void 0;
7
8var _fusionTokens = require("fusion-tokens");
9
10var _fusionCore = require("fusion-core");
11
12var _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 */
23function 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
37const HydrationStateToken = (0, _fusionCore.createToken)('HydrationStateToken');
38exports.HydrationStateToken = HydrationStateToken;
39
40const 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
137var _default = true && pluginFactory();
138
139exports.default = _default;
140//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJyb3dzZXIuanMiXSwibmFtZXMiOlsibG9hZFRyYW5zbGF0aW9ucyIsImVsZW1lbnQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiRXJyb3IiLCJKU09OIiwicGFyc2UiLCJ0ZXh0Q29udGVudCIsImUiLCJIeWRyYXRpb25TdGF0ZVRva2VuIiwicGx1Z2luRmFjdG9yeSIsImRlcHMiLCJmZXRjaCIsIkZldGNoVG9rZW4iLCJvcHRpb25hbCIsImh5ZHJhdGlvblN0YXRlIiwiZXZlbnRzIiwiVW5pdmVyc2FsRXZlbnRzVG9rZW4iLCJwcm92aWRlcyIsIndpbmRvdyIsIkkxOG4iLCJjb25zdHJ1Y3RvciIsImxvY2FsZUNvZGUiLCJ0cmFuc2xhdGlvbnMiLCJyZXF1ZXN0ZWRLZXlzIiwiU2V0IiwibG9jYWxlIiwibG9hZCIsInRyYW5zbGF0aW9uS2V5cyIsImxvYWRlZEtleXMiLCJPYmplY3QiLCJrZXlzIiwidW5sb2FkZWQiLCJmaWx0ZXIiLCJrZXkiLCJpbmRleE9mIiwiaGFzIiwibGVuZ3RoIiwiZm9yRWFjaCIsImFkZCIsImZldGNoT3B0cyIsIm1ldGhvZCIsImhlYWRlcnMiLCJBY2NlcHQiLCJib2R5Iiwic3RyaW5naWZ5IiwidGhlbiIsInIiLCJqc29uIiwiZXJyIiwiZW1pdCIsInRleHQiLCJkYXRhIiwiZGVsZXRlIiwiY2F0Y2giLCJ0cmFuc2xhdGUiLCJpbnRlcnBvbGF0aW9ucyIsInRlbXBsYXRlIiwicmVwbGFjZSIsIl8iLCJrIiwiU3RyaW5nIiwiaTE4biIsImZyb20iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFTQTs7QUFDQTs7QUFFQTs7QUFaQTs7Ozs7Ozs7QUFRQTtBQWdCQSxTQUFTQSxnQkFBVCxHQUFvRDtBQUNsRCxRQUFNQyxPQUFPLEdBQUdDLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixrQkFBeEIsQ0FBaEI7O0FBQ0EsTUFBSSxDQUFDRixPQUFMLEVBQWM7QUFDWixVQUFNLElBQUlHLEtBQUosQ0FDSixrRUFESSxDQUFOO0FBR0Q7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V0FBTztBQUFDMkMsTUFBQUEsSUFBSSxFQUFFLE1BQU1EO0FBQWIsS0FBUDtBQUNEO0FBMUZVLENBQWIsQ0FERjs7ZUE4RmlCLFFBQWVwRCxhQUFhLEUiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQ29weXJpZ2h0IChjKSAyMDE4IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKlxuICogQGZsb3dcbiAqL1xuXG4vKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbmltcG9ydCB7RmV0Y2hUb2tlbn0gZnJvbSAnZnVzaW9uLXRva2Vucyc7XG5pbXBvcnQge2NyZWF0ZVBsdWdpbiwgdW5lc2NhcGUsIGNyZWF0ZVRva2VufSBmcm9tICdmdXNpb24tY29yZSc7XG5pbXBvcnQgdHlwZSB7RnVzaW9uUGx1Z2luLCBUb2tlbn0gZnJvbSAnZnVzaW9uLWNvcmUnO1xuaW1wb3J0IHtVbml2ZXJzYWxFdmVudHNUb2tlbn0gZnJvbSAnZnVzaW9uLXBsdWdpbi11bml2ZXJzYWwtZXZlbnRzJztcblxuaW1wb3J0IHR5cGUge1xuICBJMThuRGVwc1R5cGUsXG4gIEkxOG5TZXJ2aWNlVHlwZSxcbiAgVHJhbnNsYXRpb25zT2JqZWN0VHlwZSxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbnR5cGUgTG9hZGVkVHJhbnNsYXRpb25zVHlwZSA9IHtcbiAgbG9jYWxlQ29kZT86IHN0cmluZyxcbiAgdHJhbnNsYXRpb25zPzogVHJhbnNsYXRpb25zT2JqZWN0VHlwZSxcbn07XG5mdW5jdGlvbiBsb2FkVHJhbnNsYXRpb25zKCk6IExvYWRlZFRyYW5zbGF0aW9uc1R5cGUge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19fVFJBTlNMQVRJT05TX18nKTtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1tmdXNpb24tcGx1Z2luLWkxOG5dIC0gQ291bGQgbm90IGZpbmQgYSBfX1RSQU5TTEFUSU9OU19fIGVsZW1lbnQnXG4gICAgKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHVuZXNjYXBlKGVsZW1lbnQudGV4dENvbnRlbnQpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdbZnVzaW9uLXBsdWdpbi1pMThuXSAtIEVycm9yIHBhcnNpbmcgX19UUkFOU0xBVElPTlNfXyBlbGVtZW50IGNvbnRlbnQnXG4gICAgKTtcbiAgfVxufVxuXG50eXBlIEh5ZHJhdGlvblN0YXRlVHlwZSA9IHtcbiAgbG9jYWxlQ29kZT86IHN0cmluZyxcbiAgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbnNPYmplY3RUeXBlLFxufTtcbmV4cG9ydCBjb25zdCBIeWRyYXRpb25TdGF0ZVRva2VuOiBUb2tlbjxIeWRyYXRpb25TdGF0ZVR5cGU+ID0gY3JlYXRlVG9rZW4oXG4gICdIeWRyYXRpb25TdGF0ZVRva2VuJ1xuKTtcblxudHlwZSBQbHVnaW5UeXBlID0gRnVzaW9uUGx1Z2luPEkxOG5EZXBzVHlwZSwgSTE4blNlcnZpY2VUeXBlPjtcbmNvbnN0IHBsdWdpbkZhY3Rvcnk6ICgpID0+IFBsdWdpblR5cGUgPSAoKSA9PlxuICBjcmVhdGVQbHVnaW4oe1xuICAgIGRlcHM6IHtcbiAgICAgIGZldGNoOiBGZXRjaFRva2VuLm9wdGlvbmFsLFxuICAgICAgaHlkcmF0aW9uU3RhdGU6IEh5ZHJhdGlvblN0YXRlVG9rZW4ub3B0aW9uYWwsXG4gICAgICBldmVudHM6IFVuaXZlcnNhbEV2ZW50c1Rva2VuLm9wdGlvbmFsLFxuICAgIH0sXG4gICAgcHJvdmlkZXM6ICh7ZmV0Y2ggPSB3aW5kb3cuZmV0Y2gsIGh5ZHJhdGlvblN0YXRlLCBldmVudHN9ID0ge30pID0+IHtcbiAgICAgIGNsYXNzIEkxOG4ge1xuICAgICAgICBsb2NhbGU6IHN0cmluZztcbiAgICAgICAgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbnNPYmplY3RUeXBlO1xuICAgICAgICByZXF1ZXN0ZWRLZXlzOiBTZXQ8c3RyaW5nPjtcblxuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICBjb25zdCB7bG9jYWxlQ29kZSwgdHJhbnNsYXRpb25zfSA9XG4gICAgICAgICAgICBoeWRyYXRpb25TdGF0ZSB8fCBsb2FkVHJhbnNsYXRpb25zKCk7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0ZWRLZXlzID0gbmV3IFNldCgpO1xuICAgICAgICAgIHRoaXMudHJhbnNsYXRpb25zID0gdHJhbnNsYXRpb25zIHx8IHt9O1xuICAgICAgICAgIGlmIChsb2NhbGVDb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZUNvZGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGxvYWQodHJhbnNsYXRpb25LZXlzKSB7XG4gICAgICAgICAgY29uc3QgbG9hZGVkS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMudHJhbnNsYXRpb25zKTtcbiAgICAgICAgICBjb25zdCB1bmxvYWRlZCA9IHRyYW5zbGF0aW9uS2V5cy5maWx0ZXIoa2V5ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2FkZWRLZXlzLmluZGV4T2Yoa2V5KSA8IDAgJiYgIXRoaXMucmVxdWVzdGVkS2V5cy5oYXMoa2V5KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAodW5sb2FkZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIGxvYWQgdHJhbnNsYXRpb25zIGFnYWluIGlmIGEgcmVxdWVzdCBpcyBhbHJlYWR5IGluXG4gICAgICAgICAgICAvLyBmbGlnaHQuIFRoaXMgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIGFkZCB1bmxvYWRlZCBjaHVua3MgdG9cbiAgICAgICAgICAgIC8vIGxvYWRlZENodW5rcyBvcHRpbWlzdGljYWxseSBhbmQgcmVtb3ZlIHRoZW0gaWYgc29tZSBlcnJvciBoYXBwZW5zXG4gICAgICAgICAgICB1bmxvYWRlZC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucmVxdWVzdGVkS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZmV0Y2hPcHRzID0ge1xuICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEFjY2VwdDogJyovKicsXG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5sb2NhbGUgPyB7J1gtRnVzaW9uLUxvY2FsZS1Db2RlJzogdGhpcy5sb2NhbGV9IDoge30pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh1bmxvYWRlZCksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gVE9ETygjMykgZG9uJ3QgYXBwZW5kIHByZWZpeCBpZiBpbmplY3RlZCBmZXRjaCBhbHNvIGluamVjdHMgcHJlZml4XG4gICAgICAgICAgICByZXR1cm4gZmV0Y2goXG4gICAgICAgICAgICAgIGAvX3RyYW5zbGF0aW9ucyR7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbGUgPyBgP2xvY2FsZUNvZGU9JHt0aGlzLmxvY2FsZX1gIDogJydcbiAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgIGZldGNoT3B0c1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAudGhlbihyID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuanNvbigpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgZXZlbnRzICYmIGV2ZW50cy5lbWl0KCdpMThuLWxvYWQtZXJyb3InLCB7dGV4dDogci50ZXh0KCl9KTtcbiAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC50aGVuKChkYXRhOiB7W3N0cmluZ106IHN0cmluZ30pID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uc1trZXldID0gZGF0YVtrZXldO1xuICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ZWRLZXlzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnI6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQsIHNvIHJlbW92ZSB0aGUgY2h1bmtzIHdlIHdlcmUgdHJ5aW5nIHRvIGxvYWRcbiAgICAgICAgICAgICAgICAvLyBmcm9tIGxvYWRlZENodW5rcy4gVGhpcyBhbGxvd3MgdXMgdG8gdHJ5IHRvIGxvYWQgdGhvc2UgY2h1bmtcbiAgICAgICAgICAgICAgICAvLyB0cmFuc2xhdGlvbnMgYWdhaW5cbiAgICAgICAgICAgICAgICB1bmxvYWRlZC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RlZEtleXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmFuc2xhdGUoa2V5LCBpbnRlcnBvbGF0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLnRyYW5zbGF0aW9uc1trZXldO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGV2ZW50cyAmJiBldmVudHMuZW1pdCgnaTE4bi10cmFuc2xhdGUtbWlzcycsIHtrZXl9KTtcbiAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL1xcJHsoLio/KX0vZywgKF8sIGspID0+XG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uc1trXSA9PT0gdm9pZCAwXG4gICAgICAgICAgICAgID8gJyR7JyArIGsgKyAnfSdcbiAgICAgICAgICAgICAgOiBTdHJpbmcoaW50ZXJwb2xhdGlvbnNba10pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgaTE4biA9IG5ldyBJMThuKCk7XG4gICAgICByZXR1cm4ge2Zyb206ICgpID0+IGkxOG59O1xuICAgIH0sXG4gIH0pO1xuXG5leHBvcnQgZGVmYXVsdCAoKF9fQlJPV1NFUl9fICYmIHBsdWdpbkZhY3RvcnkoKTogYW55KTogUGx1Z2luVHlwZSk7XG4iXX0=
\No newline at end of file