@novely/core 0.12.5 → 0.14.0

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/dist/index.js CHANGED
@@ -76,13 +76,20 @@ var findLastIndex = (array, fn) => {
76
76
  }
77
77
  return -1;
78
78
  };
79
- var createDeferredPromise = () => {
79
+ var createControlledPromise = () => {
80
80
  let resolve, reject;
81
81
  const promise = new Promise((res, rej) => {
82
82
  resolve = res;
83
83
  reject = rej;
84
84
  });
85
- return { resolve, reject, promise };
85
+ return {
86
+ resolve,
87
+ reject,
88
+ promise,
89
+ reset() {
90
+ Object.assign(this, createControlledPromise());
91
+ }
92
+ };
86
93
  };
87
94
  var findLastPathItemBeforeItemOfType = (path, name) => {
88
95
  const index = findLastIndex(path, ([_name, _value], next) => {
@@ -104,6 +111,20 @@ var noop = () => {
104
111
  var isAction = (element) => {
105
112
  return Array.isArray(element) && isString(element[0]);
106
113
  };
114
+ var flattenStory = (story) => {
115
+ const entries = Object.entries(story).map(([name, items]) => {
116
+ const flat = (item) => {
117
+ return item.flatMap((data) => {
118
+ const type = data[0];
119
+ if (Array.isArray(type))
120
+ return flat(data);
121
+ return [data];
122
+ });
123
+ };
124
+ return [name, flat(items)];
125
+ });
126
+ return Object.fromEntries(entries);
127
+ };
107
128
 
108
129
  // src/global.ts
109
130
  var PRELOADED_ASSETS = /* @__PURE__ */ new Set();
@@ -229,15 +250,79 @@ function klona(val) {
229
250
  return val;
230
251
  }
231
252
 
253
+ // src/translation.ts
254
+ var RGX = /{{(.*?)}}/g;
255
+ var split = (input, delimeters) => {
256
+ const output = [];
257
+ for (const delimeter of delimeters) {
258
+ if (!input)
259
+ break;
260
+ const [start, end] = input.split(delimeter, 2);
261
+ output.push(start);
262
+ input = end;
263
+ }
264
+ output.push(input);
265
+ return output;
266
+ };
267
+ var unwrap = (c) => {
268
+ if (Array.isArray(c)) {
269
+ return c.map((item) => unwrap(item)).join("<br>");
270
+ }
271
+ if (typeof c === "function") {
272
+ return unwrap(c());
273
+ }
274
+ return c;
275
+ };
276
+ var replace = (str2, obj, pluralization, actions, pr) => {
277
+ return unwrap(str2).replaceAll(RGX, (x, key, y) => {
278
+ x = 0;
279
+ y = obj;
280
+ const [pathstr, plural, action] = split(key.trim(), ["@", "%"]);
281
+ if (!pathstr) {
282
+ return "";
283
+ }
284
+ const path = pathstr.split(".");
285
+ while (y && x < path.length)
286
+ y = y[path[x++]];
287
+ if (plural && pluralization && y && pr) {
288
+ y = pluralization[plural][pr.select(y)];
289
+ }
290
+ const actionHandler = actions && action && actions[action];
291
+ if (actionHandler)
292
+ y = actionHandler(y);
293
+ return y == null ? "" : y;
294
+ });
295
+ };
296
+
297
+ // src/storage.ts
298
+ var localStorageStorage = (options) => {
299
+ return {
300
+ async get() {
301
+ const fallback = { saves: [], data: {}, meta: [] };
302
+ try {
303
+ const value = localStorage.getItem(options.key);
304
+ return value ? JSON.parse(value) : fallback;
305
+ } catch {
306
+ return fallback;
307
+ }
308
+ },
309
+ async set(data) {
310
+ try {
311
+ localStorage.setItem(options.key, JSON.stringify(data));
312
+ } catch {
313
+ }
314
+ }
315
+ };
316
+ };
317
+
232
318
  // src/novely.ts
233
- import { replace as replaceT9N } from "@novely/t9n";
234
319
  var novely = ({
235
320
  characters,
236
- storage,
321
+ storage = localStorageStorage({ key: "novely-game-storage" }),
237
322
  storageDelay = Promise.resolve(),
238
323
  renderer: createRenderer,
239
324
  initialScreen = "mainmenu",
240
- t9n,
325
+ translation,
241
326
  languages,
242
327
  state: defaultState,
243
328
  data: defaultData,
@@ -249,29 +334,20 @@ var novely = ({
249
334
  askBeforeExit = true,
250
335
  preloadAssets = "lazy"
251
336
  }) => {
252
- let story;
337
+ const story = {};
253
338
  const times = /* @__PURE__ */ new Set();
254
339
  const ASSETS_TO_PRELOAD = /* @__PURE__ */ new Set();
255
- const assetsLoaded = createDeferredPromise();
340
+ const assetsLoaded = createControlledPromise();
256
341
  defaultData ||= {};
257
342
  defaultState ||= {};
258
343
  const intime = (value) => {
259
344
  return times.add(value), value;
260
345
  };
261
- const withStory = async (s) => {
262
- story = Object.fromEntries(
263
- Object.entries(s).map(([name, items]) => {
264
- const flat = (item) => {
265
- return item.flatMap((data2) => {
266
- const type = data2[0];
267
- if (Array.isArray(type))
268
- return flat(data2);
269
- return [data2];
270
- });
271
- };
272
- return [name, flat(items)];
273
- })
274
- );
346
+ const script = (part) => {
347
+ Object.assign(story, flattenStory(part));
348
+ };
349
+ const withStory = async (story2) => {
350
+ script(story2);
275
351
  if (preloadAssets === "blocking" && ASSETS_TO_PRELOAD.size > 0) {
276
352
  renderer.ui.showScreen("loading");
277
353
  await renderer.misc.preloadImagesBlocking(ASSETS_TO_PRELOAD);
@@ -313,7 +389,7 @@ var novely = ({
313
389
  const getDefaultSave = (state2 = {}) => {
314
390
  return [
315
391
  [
316
- [null, "start"],
392
+ ["jump", "start"],
317
393
  [null, 0]
318
394
  ],
319
395
  state2,
@@ -358,6 +434,9 @@ var novely = ({
358
434
  storage.set(value);
359
435
  };
360
436
  const throttledOnStorageDataChange = throttle(onStorageDataChange, throttleTimeout);
437
+ const throttledEmergencyOnStorageDataChange = throttle(() => {
438
+ onStorageDataChange($.get());
439
+ }, 10);
361
440
  $.subscribe(throttledOnStorageDataChange);
362
441
  const getStoredData = async () => {
363
442
  let stored = await storage.get();
@@ -385,12 +464,10 @@ var novely = ({
385
464
  const stack = createStack(initial);
386
465
  addEventListener("visibilitychange", () => {
387
466
  if (document.visibilityState === "hidden") {
388
- onStorageDataChange($.get());
467
+ throttledEmergencyOnStorageDataChange();
389
468
  }
390
469
  });
391
- addEventListener("beforeunload", () => {
392
- onStorageDataChange($.get());
393
- });
470
+ addEventListener("beforeunload", throttledEmergencyOnStorageDataChange);
394
471
  const save = (override = false, type = override ? "auto" : "manual") => {
395
472
  if (!$$.get().dataLoaded)
396
473
  return;
@@ -461,7 +538,10 @@ var novely = ({
461
538
  const characters2 = /* @__PURE__ */ new Set();
462
539
  const blocks = [];
463
540
  for (const [type, val] of path) {
464
- if (type === null) {
541
+ if (type === "jump") {
542
+ precurrent = story;
543
+ current = current[val];
544
+ } else if (type === null) {
465
545
  precurrent = current;
466
546
  if (isNumber(val)) {
467
547
  index++;
@@ -558,7 +638,11 @@ var novely = ({
558
638
  let precurrent = story;
559
639
  const blocks = [];
560
640
  for (const [type, val] of path) {
561
- if (type === null) {
641
+ console.log(type, val);
642
+ if (type === "jump") {
643
+ precurrent = story;
644
+ current = current[val];
645
+ } else if (type === null) {
562
646
  precurrent = current;
563
647
  current = current[val];
564
648
  } else if (type === "choice") {
@@ -597,6 +681,9 @@ var novely = ({
597
681
  const back = () => {
598
682
  return stack.back(), restore(stack.value);
599
683
  };
684
+ const t = (key, lang) => {
685
+ return translation[lang].internal[key];
686
+ };
600
687
  const renderer = createRenderer({
601
688
  characters,
602
689
  set,
@@ -605,9 +692,9 @@ var novely = ({
605
692
  newGame,
606
693
  exit,
607
694
  back,
695
+ t,
608
696
  stack,
609
697
  languages,
610
- t: t9n.i,
611
698
  $,
612
699
  $$
613
700
  });
@@ -654,7 +741,7 @@ var novely = ({
654
741
  }
655
742
  return c || "";
656
743
  })();
657
- const run = renderer.dialog(unwrap(content), unwrap(name), character, emotion);
744
+ const run = renderer.dialog(unwrap2(content), unwrap2(name), character, emotion);
658
745
  run(forward, goingBack);
659
746
  },
660
747
  function([fn]) {
@@ -670,10 +757,10 @@ var novely = ({
670
757
  question = "";
671
758
  }
672
759
  const unwrapped = choices.map(([content, action2, visible]) => {
673
- return [unwrap(content), action2, visible];
760
+ return [unwrap2(content), action2, visible];
674
761
  });
675
762
  const run = renderer.choices(
676
- unwrap(question),
763
+ unwrap2(question),
677
764
  unwrapped
678
765
  );
679
766
  run((selected) => {
@@ -686,7 +773,7 @@ var novely = ({
686
773
  },
687
774
  jump([scene]) {
688
775
  stack.value[0] = [
689
- [null, scene],
776
+ ["jump", scene],
690
777
  [null, -1]
691
778
  ];
692
779
  match("clear", []);
@@ -712,7 +799,7 @@ var novely = ({
712
799
  times.clear();
713
800
  },
714
801
  input([question, onInput, setup]) {
715
- renderer.input(unwrap(question), onInput, setup)(forward);
802
+ renderer.input(unwrap2(question), onInput, setup)(forward);
716
803
  },
717
804
  custom([handler]) {
718
805
  const result = renderer.custom(handler, goingBack, () => {
@@ -752,7 +839,7 @@ var novely = ({
752
839
  match("custom", [handler]);
753
840
  },
754
841
  text(text) {
755
- renderer.text(text.map((content) => unwrap(content)).join(" "), forward, goingBack);
842
+ renderer.text(text.map((content) => unwrap2(content)).join(" "), forward, goingBack);
756
843
  },
757
844
  exit() {
758
845
  if (restoring)
@@ -817,7 +904,7 @@ var novely = ({
817
904
  const next = () => {
818
905
  const path = stack.value[0];
819
906
  const last = path.at(-1);
820
- if (last && isNull(last[0]) && isNumber(last[1])) {
907
+ if (last && (isNull(last[0]) || last[0] === "jump") && isNumber(last[1])) {
821
908
  last[1]++;
822
909
  } else {
823
910
  path.push([null, 0]);
@@ -844,15 +931,19 @@ var novely = ({
844
931
  const interactivity = (value = false) => {
845
932
  interacted = value ? interacted + 1 : 0;
846
933
  };
847
- const unwrap = (content, global = false) => {
934
+ const unwrap2 = (content, global = false) => {
848
935
  const {
849
936
  data: data2,
850
937
  meta: [lang]
851
938
  } = $.get();
852
939
  const obj = global ? data2 : state();
853
- const cnt = isFunction(content) ? content(lang, obj) : typeof content === "string" ? content : content[lang];
940
+ const cnt = isFunction(content) ? content() : typeof content === "string" ? content : content[lang];
854
941
  const str2 = isFunction(cnt) ? cnt() : cnt;
855
- return replaceT9N(str2, obj);
942
+ const trans = translation[lang];
943
+ if (trans.actions || trans.plural) {
944
+ return replace(str2, obj, trans.plural, trans.actions, new Intl.PluralRules(trans.tag || lang));
945
+ }
946
+ return replace(str2, obj);
856
947
  };
857
948
  function data(value) {
858
949
  if (!value)
@@ -885,28 +976,149 @@ var novely = ({
885
976
  * Unwraps translatable content to a string value
886
977
  */
887
978
  unwrap(content) {
888
- return unwrap(content, true);
889
- },
890
- /**
891
- * Function that is used for translation
892
- */
893
- t: t9n.t
979
+ return unwrap2(content, true);
980
+ }
894
981
  };
895
982
  };
896
983
 
897
- // src/storage.ts
898
- var localStorageStorage = (options) => {
899
- return {
900
- async get() {
901
- const value = localStorage.getItem(options.key);
902
- return value ? JSON.parse(value) : { saves: [], data: {}, meta: [] };
903
- },
904
- async set(data) {
905
- localStorage.setItem(options.key, JSON.stringify(data));
906
- }
907
- };
984
+ // src/translations.ts
985
+ var RU = {
986
+ NewGame: "\u041D\u043E\u0432\u0430\u044F \u0438\u0433\u0440\u0430",
987
+ HomeScreen: "\u0413\u043B\u0430\u0432\u043D\u044B\u0439 \u044D\u043A\u0440\u0430\u043D",
988
+ ToTheGame: "\u041A \u0438\u0433\u0440\u0435",
989
+ Language: "\u042F\u0437\u044B\u043A",
990
+ NoSaves: "\u0421\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0439 \u043D\u0435\u0442",
991
+ LoadSave: "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C",
992
+ Saves: "\u0421\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F",
993
+ Settings: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438",
994
+ Sumbit: "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C",
995
+ GoBack: "\u041D\u0430\u0437\u0430\u0434",
996
+ DoSave: "\u0421\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435",
997
+ Auto: "\u0410\u0432\u0442\u043E",
998
+ Stop: "\u0421\u0442\u043E\u043F",
999
+ Exit: "\u0412\u044B\u0445\u043E\u0434",
1000
+ Automatic: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435",
1001
+ Manual: "\u0420\u0443\u0447\u043D\u043E\u0435",
1002
+ Remove: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C",
1003
+ LoadASaveFrom: "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u043E\u0442",
1004
+ DeleteASaveFrom: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u043E\u0442",
1005
+ TextSpeed: "\u0421\u043A\u043E\u0440\u043E\u0441\u0442\u044C \u0422\u0435\u043A\u0441\u0442\u0430",
1006
+ TextSpeedSlow: "\u041C\u0435\u0434\u043B\u0435\u043D\u043D\u0430\u044F",
1007
+ TextSpeedMedium: "\u0421\u0440\u0435\u0434\u043D\u044F\u044F",
1008
+ TextSpeedFast: "\u0411\u044B\u0441\u0442\u0440\u0430\u044F",
1009
+ TextSpeedAuto: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0430\u044F",
1010
+ CompleteText: "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044C \u0442\u0435\u043A\u0441\u0442",
1011
+ GoForward: "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0432\u043F\u0435\u0440\u0451\u0434",
1012
+ ExitDialogWarning: "\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, \u0447\u0442\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0432\u044B\u0439\u0442\u0438? \u041F\u0440\u043E\u0433\u0440\u0435\u0441\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D.",
1013
+ ExitDialogExit: "\u0412\u044B\u0439\u0442\u0438",
1014
+ ExitDialogBack: "\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u0432 \u0438\u0433\u0440\u0443",
1015
+ OpenMenu: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043C\u0435\u043D\u044E",
1016
+ CloseMenu: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u043C\u0435\u043D\u044E"
1017
+ };
1018
+ var EN = {
1019
+ NewGame: "New Game",
1020
+ HomeScreen: "Home Screen",
1021
+ ToTheGame: "To the Game",
1022
+ Language: "Language",
1023
+ NoSaves: "No saves",
1024
+ LoadSave: "Load",
1025
+ Saves: "Saves",
1026
+ Settings: "Settings",
1027
+ Sumbit: "Submit",
1028
+ GoBack: "Go back",
1029
+ DoSave: "Save",
1030
+ Auto: "Auto",
1031
+ Stop: "Stop",
1032
+ Exit: "Exit",
1033
+ Automatic: "Automatic",
1034
+ Manual: "Manual",
1035
+ Remove: "Remove",
1036
+ LoadASaveFrom: "Load a save from",
1037
+ DeleteASaveFrom: "Delete a save from",
1038
+ TextSpeed: "Text Speed",
1039
+ TextSpeedSlow: "Slow",
1040
+ TextSpeedMedium: "Medium",
1041
+ TextSpeedFast: "Fast",
1042
+ TextSpeedAuto: "Auto",
1043
+ CompleteText: "Complete text",
1044
+ GoForward: "Go forward",
1045
+ ExitDialogWarning: "Are you sure you want to exit? Progress will be saved.",
1046
+ ExitDialogExit: "Exit",
1047
+ ExitDialogBack: "Return to game",
1048
+ OpenMenu: "Open menu",
1049
+ CloseMenu: "Close menu"
1050
+ };
1051
+ var KK = {
1052
+ NewGame: "\u0416\u0430\u04A3\u0430 \u043E\u0439\u044B\u043D",
1053
+ HomeScreen: "\u041D\u0435\u0433\u0456\u0437\u0433\u0456 \u044D\u043A\u0440\u0430\u043D",
1054
+ ToTheGame: "\u041E\u0439\u044B\u043D\u0493\u0430",
1055
+ Language: "\u0422\u0456\u043B",
1056
+ NoSaves: "\u0421\u0430\u049B\u0442\u0430\u0443 \u0436\u043E\u049B",
1057
+ LoadSave: "\u0416\u04AF\u043A\u0442\u0435\u0443",
1058
+ Saves: "\u0421\u0430\u049B\u0442\u0430\u0443",
1059
+ Settings: "\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043B\u0435\u0440",
1060
+ Sumbit: "\u0420\u0430\u0441\u0442\u0430\u0443",
1061
+ GoBack: "\u0410\u0440\u0442\u049B\u0430",
1062
+ DoSave: "\u0421\u0430\u049B\u0442\u0430\u0443",
1063
+ Auto: "\u0410\u0432\u0442\u043E",
1064
+ Stop: "\u0422\u043E\u049B\u0442\u0430",
1065
+ Exit: "\u0428\u044B\u0493\u0443",
1066
+ Automatic: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0442\u044B",
1067
+ Manual: "\u049A\u043E\u043B\u043C\u0435\u043D",
1068
+ Remove: "\u0416\u043E\u044E",
1069
+ LoadASaveFrom: "\u0421\u0430\u049B\u0442\u0430\u0443\u0434\u044B \u0436\u04AF\u043A\u0442\u0435\u0443",
1070
+ DeleteASaveFrom: "\u0421\u0430\u049B\u0442\u0430\u0443\u0434\u044B \u0436\u043E\u044E",
1071
+ TextSpeed: "\u041C\u04D9\u0442\u0456\u043D \u0416\u044B\u043B\u0434\u0430\u043C\u0434\u044B\u0493\u044B",
1072
+ TextSpeedSlow: "\u0411\u0430\u044F\u0443",
1073
+ TextSpeedMedium: "\u041E\u0440\u0442\u0430\u0448\u0430",
1074
+ TextSpeedFast: "\u0416\u044B\u043B\u0434\u0430\u043C",
1075
+ TextSpeedAuto: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0442\u044B",
1076
+ CompleteText: "\u041C\u04D9\u0442\u0456\u043D\u0434\u0456 \u0430\u044F\u049B\u0442\u0430\u0443",
1077
+ GoForward: "\u0410\u043B\u0493\u0430 \u0436\u044B\u043B\u0436\u0443",
1078
+ ExitDialogWarning: "\u0421\u0456\u0437 \u0448\u044B\u049B\u049B\u044B\u04A3\u044B\u0437 \u043A\u0435\u043B\u0435\u0442\u0456\u043D\u0456\u043D\u0435 \u0441\u0435\u043D\u0456\u043C\u0434\u0456\u0441\u0456\u0437 \u0431\u0435? \u041F\u0440\u043E\u0433\u0440\u0435\u0441\u0441 \u0441\u0430\u049B\u0442\u0430\u043B\u0430\u0434\u044B",
1079
+ ExitDialogExit: "\u0428\u044B\u0493\u0443",
1080
+ ExitDialogBack: "\u041E\u0439\u044B\u043D\u0493\u0430 \u043E\u0440\u0430\u043B\u0443",
1081
+ OpenMenu: "\u041C\u04D9\u0437\u0456\u0440\u0434\u0456 \u0430\u0448\u044B\u04A3\u044B\u0437",
1082
+ CloseMenu: "\u041C\u04D9\u0437\u0456\u0440\u0434\u0456 \u0436\u0430\u0431\u0443"
1083
+ };
1084
+ var JP = {
1085
+ NewGame: "\u300C\u65B0\u3057\u3044\u30B2\u30FC\u30E0\u300D",
1086
+ HomeScreen: "\u30DB\u30FC\u30E0\u753B\u9762",
1087
+ ToTheGame: "\u300C\u30B2\u30FC\u30E0\u306B\u623B\u308B\u300D",
1088
+ Language: "\u8A00\u8A9E",
1089
+ NoSaves: "\u30CE\u30FC\u30BB\u30FC\u30D6",
1090
+ LoadSave: "\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9",
1091
+ Saves: "\u4FDD\u5B58",
1092
+ Settings: "\u8A2D\u5B9A",
1093
+ Sumbit: "\u78BA\u8A8D",
1094
+ GoBack: "\u300C\u623B\u308B\u300D",
1095
+ DoSave: "\u4FDD\u5B58",
1096
+ Auto: "\u30AA\u30FC\u30C8",
1097
+ Stop: "\u6B62\u307E\u308C",
1098
+ Exit: "\u51FA\u53E3",
1099
+ Automatic: "\u81EA\u52D5",
1100
+ Manual: "\u30DE\u30CB\u30E5\u30A2\u30EB",
1101
+ Remove: "\u524A\u9664",
1102
+ LoadASaveFrom: "\u30ED\u30FC\u30C9\u30BB\u30FC\u30D6\u304B\u3089",
1103
+ DeleteASaveFrom: "\u304B\u3089\u4FDD\u5B58\u3092\u524A\u9664",
1104
+ TextSpeed: "\u30C6\u30AD\u30B9\u30C8\u30B9\u30D4\u30FC\u30C9",
1105
+ TextSpeedSlow: "\u300C\u9045\u3044\u300D",
1106
+ TextSpeedMedium: "\u30DF\u30C7\u30A3\u30A2\u30E0",
1107
+ TextSpeedFast: "\u300C\u901F\u3044\u300D",
1108
+ TextSpeedAuto: "\u81EA\u52D5",
1109
+ CompleteText: "\u30C6\u30AD\u30B9\u30C8\u3092\u5B8C\u6210\u3055\u305B\u308B",
1110
+ GoForward: "\u5148\u306B\u884C\u304F",
1111
+ ExitDialogWarning: "\u672C\u5F53\u306B\u7D42\u4E86\u3057\u307E\u3059\u304B\uFF1F\u9032\u884C\u72B6\u6CC1\u306F\u4FDD\u5B58\u3055\u308C\u307E\u3059",
1112
+ ExitDialogExit: "\u7D42\u4E86",
1113
+ ExitDialogBack: "\u30B2\u30FC\u30E0\u306B\u623B\u308B",
1114
+ OpenMenu: "\u30E1\u30CB\u30E5\u30FC\u3092\u958B\u304F",
1115
+ CloseMenu: "\u30E1\u30CB\u30E5\u30FC\u3092\u9589\u3058\u308B"
908
1116
  };
909
1117
  export {
1118
+ EN,
1119
+ JP,
1120
+ KK,
1121
+ RU,
910
1122
  localStorageStorage,
911
1123
  novely
912
1124
  };