@randajan/say 1.0.3 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -2
- package/dist/cjs/index.cjs +65 -24
- package/dist/cjs/index.cjs.map +2 -2
- package/dist/esm/index.mjs +65 -24
- package/dist/esm/index.mjs.map +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -36,21 +36,29 @@ Creates a callable instance that can be invoked like a function: `say("phraseId"
|
|
|
36
36
|
Options:
|
|
37
37
|
- `langs` (`string[]`): Ordered list of language codes.
|
|
38
38
|
- `translations` (`Record<string, string[]>`): Phrase table, where each entry aligns with `langs`.
|
|
39
|
-
- `defaultLang` (`string`): Default language to use when none is provided.
|
|
39
|
+
- `defaultLang` (`string`): Default language to use when none is provided. If omitted, `langs[0]` is used. Can be changed later via `setLang`.
|
|
40
40
|
- `parent` (`Say | null`): Optional parent instance for fallback lookups.
|
|
41
41
|
|
|
42
42
|
### `say(phraseId, lang?)`
|
|
43
43
|
|
|
44
|
-
Returns the translation for `phraseId` in `lang` or the default language. Falls back to `parent` if not found.
|
|
44
|
+
Returns the translation for `phraseId` in `lang` or the current default language. Falls back to `parent` if not found.
|
|
45
45
|
|
|
46
46
|
### `bindLang(lang)`
|
|
47
47
|
|
|
48
48
|
Returns a new instance with `defaultLang` set to `lang`, keeping the same language list and parent chain.
|
|
49
49
|
|
|
50
|
+
### `setLang(lang)`
|
|
51
|
+
|
|
52
|
+
Mutates the current instance by setting `defaultLang` to `lang` and returns the same instance.
|
|
53
|
+
|
|
50
54
|
### `extend({ defaultLang, langs, translations } = {})`
|
|
51
55
|
|
|
52
56
|
Creates a new instance that can override `defaultLang`, `langs`, or `translations` and chains the current instance as `parent`.
|
|
53
57
|
|
|
58
|
+
### `append(brother)`
|
|
59
|
+
|
|
60
|
+
Appends another `Say` instance as a "brother" for fallback lookups. Returns the same instance. `brother` must be an instance of `Say`.
|
|
61
|
+
|
|
54
62
|
### `has(phraseId, lang?)`
|
|
55
63
|
|
|
56
64
|
Returns `true` if the phrase exists (including via fallback), otherwise `false`.
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -34,21 +34,22 @@ var Say = class _Say extends Function {
|
|
|
34
34
|
* @param {object} opts
|
|
35
35
|
* @param {string[]} opts.langs
|
|
36
36
|
* @param {Record<string, string[]>} opts.translations
|
|
37
|
-
* @param {string
|
|
37
|
+
* @param {string} opts.defaultLang
|
|
38
38
|
* @param {Say|null} opts.parent
|
|
39
39
|
*/
|
|
40
40
|
constructor({ defaultLang = null, langs = [], translations = {}, parent = null } = {}) {
|
|
41
41
|
super();
|
|
42
|
+
const brothers = [];
|
|
42
43
|
langs = langs ?? [];
|
|
43
44
|
translations = translations ?? {};
|
|
44
|
-
defaultLang = defaultLang ?? langs[0];
|
|
45
|
-
const _say = (
|
|
45
|
+
this.defaultLang = defaultLang ?? langs[0];
|
|
46
|
+
const _say = (phraseId, lang) => _say.say(phraseId, lang);
|
|
46
47
|
(0, import_props.solids)(_say, {
|
|
47
|
-
defaultLang,
|
|
48
48
|
langs,
|
|
49
49
|
langIndex: makeLangIndex(langs),
|
|
50
50
|
translations,
|
|
51
|
-
parent
|
|
51
|
+
parent,
|
|
52
|
+
brothers
|
|
52
53
|
});
|
|
53
54
|
return Object.setPrototypeOf(_say, new.target.prototype);
|
|
54
55
|
}
|
|
@@ -63,16 +64,45 @@ var Say = class _Say extends Function {
|
|
|
63
64
|
}
|
|
64
65
|
return arr[i];
|
|
65
66
|
}
|
|
66
|
-
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
_lookupBrothers(phraseId, lang, seen = /* @__PURE__ */ new WeakSet()) {
|
|
68
|
+
const { brothers } = this;
|
|
69
|
+
if (!brothers.length) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
for (const bro of brothers) {
|
|
73
|
+
const r = bro._lookup(phraseId, lang, false, seen);
|
|
74
|
+
if (r != null) {
|
|
75
|
+
return r;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
_lookupParent(phraseId, lang, seen = /* @__PURE__ */ new WeakSet()) {
|
|
80
|
+
const { parent } = this;
|
|
81
|
+
return parent?._lookup(phraseId, lang, false, seen);
|
|
82
|
+
}
|
|
83
|
+
_lookup(phraseId, lang, throwError = true, seen = /* @__PURE__ */ new WeakSet()) {
|
|
84
|
+
if (seen.has(this)) {
|
|
85
|
+
return;
|
|
86
|
+
} else {
|
|
87
|
+
seen.add(this);
|
|
88
|
+
}
|
|
89
|
+
const el = lang ?? this.defaultLang;
|
|
90
|
+
const vh = this._lookupHere(phraseId, el);
|
|
91
|
+
if (vh != null) {
|
|
92
|
+
return vh;
|
|
93
|
+
}
|
|
94
|
+
const vb = this._lookupBrothers(phraseId, el, seen);
|
|
95
|
+
if (vb != null) {
|
|
96
|
+
return vb;
|
|
97
|
+
}
|
|
98
|
+
const vp = this._lookupParent(phraseId, el, seen);
|
|
99
|
+
if (vp != null) {
|
|
100
|
+
return vp;
|
|
71
101
|
}
|
|
72
|
-
if (
|
|
73
|
-
return
|
|
102
|
+
if (!throwError) {
|
|
103
|
+
return;
|
|
74
104
|
}
|
|
75
|
-
throw new Error(`Phrase '${phraseId}' not found (lang '${
|
|
105
|
+
throw new Error(`Phrase '${phraseId}' not found (lang '${el}').`);
|
|
76
106
|
}
|
|
77
107
|
bindLang(lang) {
|
|
78
108
|
return this.extend({ defaultLang: lang });
|
|
@@ -85,20 +115,31 @@ var Say = class _Say extends Function {
|
|
|
85
115
|
}
|
|
86
116
|
return new _Say({ defaultLang, langs, translations, parent: this });
|
|
87
117
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
118
|
+
append(brother) {
|
|
119
|
+
if (brother === this) {
|
|
120
|
+
throw new Error(`Say.append(children) can't accept itself`);
|
|
121
|
+
}
|
|
122
|
+
if (brother === this.parent) {
|
|
123
|
+
throw new Error(`Say.append(children) can't accept own parent`);
|
|
94
124
|
}
|
|
125
|
+
if (!(brother instanceof _Say)) {
|
|
126
|
+
throw new Error(`Say.append(children) must by instanceof Say()`);
|
|
127
|
+
}
|
|
128
|
+
this.brothers.push(brother);
|
|
129
|
+
return this;
|
|
130
|
+
}
|
|
131
|
+
has(phraseId, lang) {
|
|
132
|
+
return this._lookup(phraseId, lang, false) != null;
|
|
95
133
|
}
|
|
96
134
|
sayOr(phraseId, fallback, lang) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
135
|
+
return this._lookup(phraseId, lang, false) ?? fallback;
|
|
136
|
+
}
|
|
137
|
+
say(phraseId, lang) {
|
|
138
|
+
return this.sayOr(phraseId, `{${phraseId}}`, lang);
|
|
139
|
+
}
|
|
140
|
+
setLang(lang) {
|
|
141
|
+
this.defaultLang = lang;
|
|
142
|
+
return this;
|
|
102
143
|
}
|
|
103
144
|
};
|
|
104
145
|
var index_default = Say;
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.js"],
|
|
4
|
-
"sourcesContent": ["import { solids } from \"@randajan/props\";\n\nconst makeLangIndex = (langs = []) => {\n const idx = {};\n for (let i = 0; i < langs.length; i++) idx[langs[i]] = i;\n return idx;\n};\n\nexport class Say extends Function {\n /**\n * @param {object} opts\n * @param {string[]} opts.langs\n * @param {Record<string, string[]>} opts.translations\n * @param {string
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAuB;AAEvB,IAAM,gBAAgB,CAAC,QAAQ,CAAC,MAAM;AAClC,QAAM,MAAM,CAAC;AACb,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAK,KAAI,MAAM,CAAC,CAAC,IAAI;AACvD,SAAO;AACX;AAEO,IAAM,MAAN,MAAM,aAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ9B,YAAY,EAAE,cAAc,MAAM,QAAQ,CAAC,GAAG,eAAe,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG;AACnF,UAAM;AAEN,YAAQ,SAAS,CAAC;AAClB,mBAAe,gBAAgB,CAAC;AAChC,
|
|
4
|
+
"sourcesContent": ["import { solids } from \"@randajan/props\";\n\nconst makeLangIndex = (langs = []) => {\n const idx = {};\n for (let i = 0; i < langs.length; i++) idx[langs[i]] = i;\n return idx;\n};\n\nexport class Say extends Function {\n /**\n * @param {object} opts\n * @param {string[]} opts.langs\n * @param {Record<string, string[]>} opts.translations\n * @param {string} opts.defaultLang\n * @param {Say|null} opts.parent\n */\n constructor({ defaultLang = null, langs = [], translations = {}, parent = null } = {}) {\n super();\n\n const brothers = [];\n langs = langs ?? [];\n translations = translations ?? {};\n this.defaultLang = defaultLang ?? langs[0];\n\n // Important: keep prototype = Say so instance methods work\n const _say = (phraseId, lang) => _say.say(phraseId, lang);\n\n solids(_say, {\n langs,\n langIndex: makeLangIndex(langs),\n translations,\n parent,\n brothers\n });\n\n return Object.setPrototypeOf(_say, new.target.prototype);\n }\n\n _lookupHere(phraseId, lang) {\n const i = this.langIndex[lang];\n if (i == null) { return; }\n const arr = this.translations?.[phraseId];\n if (!Array.isArray(arr)) { return; }\n return arr[i];\n }\n\n _lookupBrothers(phraseId, lang, seen=new WeakSet()) {\n const { brothers } = this;\n if (!brothers.length) { return; }\n for (const bro of brothers) {\n const r = bro._lookup(phraseId, lang, false, seen);\n if (r != null) { return r; }\n }\n }\n\n _lookupParent(phraseId, lang, seen=new WeakSet()) {\n const { parent } = this;\n return parent?._lookup(phraseId, lang, false, seen);\n }\n \n _lookup(phraseId, lang, throwError=true, seen=new WeakSet()) {\n if (seen.has(this)) { return; } else { seen.add(this); }\n\n const el = lang ?? this.defaultLang;\n const vh = this._lookupHere(phraseId, el);\n if (vh != null) { return vh; }\n\n const vb = this._lookupBrothers(phraseId, el, seen);\n if (vb != null) { return vb; }\n\n const vp = this._lookupParent(phraseId, el, seen);\n if (vp != null) { return vp; }\n\n if (!throwError) { return; }\n throw new Error(`Phrase '${phraseId}' not found (lang '${el}').`);\n }\n\n bindLang(lang) {\n return this.extend({defaultLang:lang});\n }\n\n extend({ defaultLang, langs, translations} = {}) {\n if (!langs) { langs = this.langs; }\n else if (!defaultLang) { defaultLang = this.defaultLang; }\n return new Say({defaultLang, langs, translations, parent:this});\n }\n \n append(brother) {\n if (brother === this) {\n throw new Error(`Say.append(children) can't accept itself`);\n }\n if (brother === this.parent) {\n throw new Error(`Say.append(children) can't accept own parent`);\n }\n if (!(brother instanceof Say)) {\n throw new Error(`Say.append(children) must by instanceof Say()`);\n }\n this.brothers.push(brother);\n return this;\n }\n\n has(phraseId, lang) {\n return this._lookup(phraseId, lang, false) != null;\n }\n\n sayOr(phraseId, fallback, lang) {\n return this._lookup(phraseId, lang, false) ?? fallback;\n }\n\n say(phraseId, lang) {\n return this.sayOr(phraseId, `{${phraseId}}`, lang);\n }\n\n setLang(lang) {\n this.defaultLang = lang;\n return this;\n }\n}\n\nexport default Say;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -10,21 +10,22 @@ var Say = class _Say extends Function {
|
|
|
10
10
|
* @param {object} opts
|
|
11
11
|
* @param {string[]} opts.langs
|
|
12
12
|
* @param {Record<string, string[]>} opts.translations
|
|
13
|
-
* @param {string
|
|
13
|
+
* @param {string} opts.defaultLang
|
|
14
14
|
* @param {Say|null} opts.parent
|
|
15
15
|
*/
|
|
16
16
|
constructor({ defaultLang = null, langs = [], translations = {}, parent = null } = {}) {
|
|
17
17
|
super();
|
|
18
|
+
const brothers = [];
|
|
18
19
|
langs = langs ?? [];
|
|
19
20
|
translations = translations ?? {};
|
|
20
|
-
defaultLang = defaultLang ?? langs[0];
|
|
21
|
-
const _say = (
|
|
21
|
+
this.defaultLang = defaultLang ?? langs[0];
|
|
22
|
+
const _say = (phraseId, lang) => _say.say(phraseId, lang);
|
|
22
23
|
solids(_say, {
|
|
23
|
-
defaultLang,
|
|
24
24
|
langs,
|
|
25
25
|
langIndex: makeLangIndex(langs),
|
|
26
26
|
translations,
|
|
27
|
-
parent
|
|
27
|
+
parent,
|
|
28
|
+
brothers
|
|
28
29
|
});
|
|
29
30
|
return Object.setPrototypeOf(_say, new.target.prototype);
|
|
30
31
|
}
|
|
@@ -39,16 +40,45 @@ var Say = class _Say extends Function {
|
|
|
39
40
|
}
|
|
40
41
|
return arr[i];
|
|
41
42
|
}
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
_lookupBrothers(phraseId, lang, seen = /* @__PURE__ */ new WeakSet()) {
|
|
44
|
+
const { brothers } = this;
|
|
45
|
+
if (!brothers.length) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
for (const bro of brothers) {
|
|
49
|
+
const r = bro._lookup(phraseId, lang, false, seen);
|
|
50
|
+
if (r != null) {
|
|
51
|
+
return r;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
_lookupParent(phraseId, lang, seen = /* @__PURE__ */ new WeakSet()) {
|
|
56
|
+
const { parent } = this;
|
|
57
|
+
return parent?._lookup(phraseId, lang, false, seen);
|
|
58
|
+
}
|
|
59
|
+
_lookup(phraseId, lang, throwError = true, seen = /* @__PURE__ */ new WeakSet()) {
|
|
60
|
+
if (seen.has(this)) {
|
|
61
|
+
return;
|
|
62
|
+
} else {
|
|
63
|
+
seen.add(this);
|
|
64
|
+
}
|
|
65
|
+
const el = lang ?? this.defaultLang;
|
|
66
|
+
const vh = this._lookupHere(phraseId, el);
|
|
67
|
+
if (vh != null) {
|
|
68
|
+
return vh;
|
|
69
|
+
}
|
|
70
|
+
const vb = this._lookupBrothers(phraseId, el, seen);
|
|
71
|
+
if (vb != null) {
|
|
72
|
+
return vb;
|
|
73
|
+
}
|
|
74
|
+
const vp = this._lookupParent(phraseId, el, seen);
|
|
75
|
+
if (vp != null) {
|
|
76
|
+
return vp;
|
|
47
77
|
}
|
|
48
|
-
if (
|
|
49
|
-
return
|
|
78
|
+
if (!throwError) {
|
|
79
|
+
return;
|
|
50
80
|
}
|
|
51
|
-
throw new Error(`Phrase '${phraseId}' not found (lang '${
|
|
81
|
+
throw new Error(`Phrase '${phraseId}' not found (lang '${el}').`);
|
|
52
82
|
}
|
|
53
83
|
bindLang(lang) {
|
|
54
84
|
return this.extend({ defaultLang: lang });
|
|
@@ -61,20 +91,31 @@ var Say = class _Say extends Function {
|
|
|
61
91
|
}
|
|
62
92
|
return new _Say({ defaultLang, langs, translations, parent: this });
|
|
63
93
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
94
|
+
append(brother) {
|
|
95
|
+
if (brother === this) {
|
|
96
|
+
throw new Error(`Say.append(children) can't accept itself`);
|
|
97
|
+
}
|
|
98
|
+
if (brother === this.parent) {
|
|
99
|
+
throw new Error(`Say.append(children) can't accept own parent`);
|
|
70
100
|
}
|
|
101
|
+
if (!(brother instanceof _Say)) {
|
|
102
|
+
throw new Error(`Say.append(children) must by instanceof Say()`);
|
|
103
|
+
}
|
|
104
|
+
this.brothers.push(brother);
|
|
105
|
+
return this;
|
|
106
|
+
}
|
|
107
|
+
has(phraseId, lang) {
|
|
108
|
+
return this._lookup(phraseId, lang, false) != null;
|
|
71
109
|
}
|
|
72
110
|
sayOr(phraseId, fallback, lang) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
111
|
+
return this._lookup(phraseId, lang, false) ?? fallback;
|
|
112
|
+
}
|
|
113
|
+
say(phraseId, lang) {
|
|
114
|
+
return this.sayOr(phraseId, `{${phraseId}}`, lang);
|
|
115
|
+
}
|
|
116
|
+
setLang(lang) {
|
|
117
|
+
this.defaultLang = lang;
|
|
118
|
+
return this;
|
|
78
119
|
}
|
|
79
120
|
};
|
|
80
121
|
var index_default = Say;
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.js"],
|
|
4
|
-
"sourcesContent": ["import { solids } from \"@randajan/props\";\n\nconst makeLangIndex = (langs = []) => {\n const idx = {};\n for (let i = 0; i < langs.length; i++) idx[langs[i]] = i;\n return idx;\n};\n\nexport class Say extends Function {\n /**\n * @param {object} opts\n * @param {string[]} opts.langs\n * @param {Record<string, string[]>} opts.translations\n * @param {string
|
|
5
|
-
"mappings": ";AAAA,SAAS,cAAc;AAEvB,IAAM,gBAAgB,CAAC,QAAQ,CAAC,MAAM;AAClC,QAAM,MAAM,CAAC;AACb,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAK,KAAI,MAAM,CAAC,CAAC,IAAI;AACvD,SAAO;AACX;AAEO,IAAM,MAAN,MAAM,aAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ9B,YAAY,EAAE,cAAc,MAAM,QAAQ,CAAC,GAAG,eAAe,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG;AACnF,UAAM;AAEN,YAAQ,SAAS,CAAC;AAClB,mBAAe,gBAAgB,CAAC;AAChC,
|
|
4
|
+
"sourcesContent": ["import { solids } from \"@randajan/props\";\n\nconst makeLangIndex = (langs = []) => {\n const idx = {};\n for (let i = 0; i < langs.length; i++) idx[langs[i]] = i;\n return idx;\n};\n\nexport class Say extends Function {\n /**\n * @param {object} opts\n * @param {string[]} opts.langs\n * @param {Record<string, string[]>} opts.translations\n * @param {string} opts.defaultLang\n * @param {Say|null} opts.parent\n */\n constructor({ defaultLang = null, langs = [], translations = {}, parent = null } = {}) {\n super();\n\n const brothers = [];\n langs = langs ?? [];\n translations = translations ?? {};\n this.defaultLang = defaultLang ?? langs[0];\n\n // Important: keep prototype = Say so instance methods work\n const _say = (phraseId, lang) => _say.say(phraseId, lang);\n\n solids(_say, {\n langs,\n langIndex: makeLangIndex(langs),\n translations,\n parent,\n brothers\n });\n\n return Object.setPrototypeOf(_say, new.target.prototype);\n }\n\n _lookupHere(phraseId, lang) {\n const i = this.langIndex[lang];\n if (i == null) { return; }\n const arr = this.translations?.[phraseId];\n if (!Array.isArray(arr)) { return; }\n return arr[i];\n }\n\n _lookupBrothers(phraseId, lang, seen=new WeakSet()) {\n const { brothers } = this;\n if (!brothers.length) { return; }\n for (const bro of brothers) {\n const r = bro._lookup(phraseId, lang, false, seen);\n if (r != null) { return r; }\n }\n }\n\n _lookupParent(phraseId, lang, seen=new WeakSet()) {\n const { parent } = this;\n return parent?._lookup(phraseId, lang, false, seen);\n }\n \n _lookup(phraseId, lang, throwError=true, seen=new WeakSet()) {\n if (seen.has(this)) { return; } else { seen.add(this); }\n\n const el = lang ?? this.defaultLang;\n const vh = this._lookupHere(phraseId, el);\n if (vh != null) { return vh; }\n\n const vb = this._lookupBrothers(phraseId, el, seen);\n if (vb != null) { return vb; }\n\n const vp = this._lookupParent(phraseId, el, seen);\n if (vp != null) { return vp; }\n\n if (!throwError) { return; }\n throw new Error(`Phrase '${phraseId}' not found (lang '${el}').`);\n }\n\n bindLang(lang) {\n return this.extend({defaultLang:lang});\n }\n\n extend({ defaultLang, langs, translations} = {}) {\n if (!langs) { langs = this.langs; }\n else if (!defaultLang) { defaultLang = this.defaultLang; }\n return new Say({defaultLang, langs, translations, parent:this});\n }\n \n append(brother) {\n if (brother === this) {\n throw new Error(`Say.append(children) can't accept itself`);\n }\n if (brother === this.parent) {\n throw new Error(`Say.append(children) can't accept own parent`);\n }\n if (!(brother instanceof Say)) {\n throw new Error(`Say.append(children) must by instanceof Say()`);\n }\n this.brothers.push(brother);\n return this;\n }\n\n has(phraseId, lang) {\n return this._lookup(phraseId, lang, false) != null;\n }\n\n sayOr(phraseId, fallback, lang) {\n return this._lookup(phraseId, lang, false) ?? fallback;\n }\n\n say(phraseId, lang) {\n return this.sayOr(phraseId, `{${phraseId}}`, lang);\n }\n\n setLang(lang) {\n this.defaultLang = lang;\n return this;\n }\n}\n\nexport default Say;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|