create-pixi-vn 1.7.3 → 1.7.4

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.
Files changed (182) hide show
  1. package/package.json +3 -3
  2. package/template-game-engine/package.json +1 -1
  3. package/template-nqtr-react-vite-muijoy/.vscode/settings.json +4 -0
  4. package/template-nqtr-react-vite-muijoy/package.json +2 -2
  5. package/template-nqtr-react-vite-muijoy/src/hooks/useKeyboardDetector.ts +2 -2
  6. package/template-nqtr-react-vite-muijoy/src/hooks/useMinigame.ts +3 -2
  7. package/template-nqtr-react-vite-muijoy/src/i18n.ts +25 -3
  8. package/template-nqtr-react-vite-muijoy/src/locales/strings_en.json +28 -27
  9. package/template-nqtr-react-vite-muijoy/src/screens/QuickTools.tsx +2 -2
  10. package/template-nqtr-react-vite-muijoy/src/screens/Settings.tsx +2 -0
  11. package/template-nqtr-react-vite-muijoy/src/screens/modals/SaveLoadAlert.tsx +2 -2
  12. package/template-nqtr-react-vite-muijoy/src/screens/settings/DownloadFileToTranslateSettingButton.tsx +32 -0
  13. package/template-nqtr-react-vite-muijoy/src/screens/settings/SaveLoadSettingButtons.tsx +3 -7
  14. package/template-nqtr-react-vite-muijoy/src/utils/indexedDB-utility.ts +1 -1
  15. package/template-nqtr-react-vite-muijoy/src/utils/save-utility.ts +9 -9
  16. package/template-nqtr-react-vite-muijoy-ink/.vscode/settings.json +4 -0
  17. package/template-nqtr-react-vite-muijoy-ink/package.json +3 -3
  18. package/template-nqtr-react-vite-muijoy-ink/src/hooks/useInkInitialization.tsx +3 -1
  19. package/template-nqtr-react-vite-muijoy-ink/src/hooks/useKeyboardDetector.ts +2 -2
  20. package/template-nqtr-react-vite-muijoy-ink/src/hooks/useMinigame.ts +3 -2
  21. package/template-nqtr-react-vite-muijoy-ink/src/i18n.ts +41 -3
  22. package/template-nqtr-react-vite-muijoy-ink/src/locales/strings_en.json +28 -27
  23. package/template-nqtr-react-vite-muijoy-ink/src/main.tsx +53 -51
  24. package/template-nqtr-react-vite-muijoy-ink/src/screens/QuickTools.tsx +2 -2
  25. package/template-nqtr-react-vite-muijoy-ink/src/screens/Settings.tsx +2 -0
  26. package/template-nqtr-react-vite-muijoy-ink/src/screens/modals/SaveLoadAlert.tsx +2 -2
  27. package/template-nqtr-react-vite-muijoy-ink/src/screens/settings/DownloadFileToTranslateSettingButton.tsx +32 -0
  28. package/template-nqtr-react-vite-muijoy-ink/src/screens/settings/SaveLoadSettingButtons.tsx +3 -7
  29. package/template-nqtr-react-vite-muijoy-ink/src/utils/indexedDB-utility.ts +1 -1
  30. package/template-nqtr-react-vite-muijoy-ink/src/utils/ink-utility.ts +22 -5
  31. package/template-nqtr-react-vite-muijoy-ink/src/utils/save-utility.ts +9 -9
  32. package/template-nqtr-react-vite-muijoy-ink/vite.config.ts +2 -0
  33. package/template-nqtr-react-vite-muijoy-ink-tauri/.vscode/settings.json +4 -0
  34. package/template-nqtr-react-vite-muijoy-ink-tauri/package.json +4 -4
  35. package/template-nqtr-react-vite-muijoy-ink-tauri/src/hooks/useInkInitialization.tsx +3 -1
  36. package/template-nqtr-react-vite-muijoy-ink-tauri/src/hooks/useKeyboardDetector.ts +2 -2
  37. package/template-nqtr-react-vite-muijoy-ink-tauri/src/hooks/useMinigame.ts +3 -2
  38. package/template-nqtr-react-vite-muijoy-ink-tauri/src/i18n.ts +41 -3
  39. package/template-nqtr-react-vite-muijoy-ink-tauri/src/locales/strings_en.json +28 -27
  40. package/template-nqtr-react-vite-muijoy-ink-tauri/src/main.tsx +53 -51
  41. package/template-nqtr-react-vite-muijoy-ink-tauri/src/screens/QuickTools.tsx +2 -2
  42. package/template-nqtr-react-vite-muijoy-ink-tauri/src/screens/Settings.tsx +2 -0
  43. package/template-nqtr-react-vite-muijoy-ink-tauri/src/screens/modals/SaveLoadAlert.tsx +2 -2
  44. package/template-nqtr-react-vite-muijoy-ink-tauri/src/screens/settings/DownloadFileToTranslateSettingButton.tsx +32 -0
  45. package/template-nqtr-react-vite-muijoy-ink-tauri/src/screens/settings/SaveLoadSettingButtons.tsx +3 -7
  46. package/template-nqtr-react-vite-muijoy-ink-tauri/src/utils/indexedDB-utility.ts +1 -1
  47. package/template-nqtr-react-vite-muijoy-ink-tauri/src/utils/ink-utility.ts +22 -5
  48. package/template-nqtr-react-vite-muijoy-ink-tauri/src/utils/save-utility.ts +9 -9
  49. package/template-nqtr-react-vite-muijoy-ink-tauri/vite.config.ts +2 -0
  50. package/template-nqtr-react-vite-muijoy-tauri/.vscode/settings.json +4 -0
  51. package/template-nqtr-react-vite-muijoy-tauri/package.json +2 -2
  52. package/template-nqtr-react-vite-muijoy-tauri/src/hooks/useKeyboardDetector.ts +2 -2
  53. package/template-nqtr-react-vite-muijoy-tauri/src/hooks/useMinigame.ts +3 -2
  54. package/template-nqtr-react-vite-muijoy-tauri/src/i18n.ts +25 -3
  55. package/template-nqtr-react-vite-muijoy-tauri/src/locales/strings_en.json +28 -27
  56. package/template-nqtr-react-vite-muijoy-tauri/src/screens/QuickTools.tsx +2 -2
  57. package/template-nqtr-react-vite-muijoy-tauri/src/screens/Settings.tsx +2 -0
  58. package/template-nqtr-react-vite-muijoy-tauri/src/screens/modals/SaveLoadAlert.tsx +2 -2
  59. package/template-nqtr-react-vite-muijoy-tauri/src/screens/settings/DownloadFileToTranslateSettingButton.tsx +32 -0
  60. package/template-nqtr-react-vite-muijoy-tauri/src/screens/settings/SaveLoadSettingButtons.tsx +3 -7
  61. package/template-nqtr-react-vite-muijoy-tauri/src/utils/indexedDB-utility.ts +1 -1
  62. package/template-nqtr-react-vite-muijoy-tauri/src/utils/save-utility.ts +9 -9
  63. package/template-react-vite-muijoy/.vscode/settings.json +4 -0
  64. package/template-react-vite-muijoy/package.json +2 -2
  65. package/template-react-vite-muijoy/src/hooks/useKeyboardDetector.ts +2 -2
  66. package/template-react-vite-muijoy/src/hooks/useMinigame.ts +3 -2
  67. package/template-react-vite-muijoy/src/i18n.ts +25 -3
  68. package/template-react-vite-muijoy/src/locales/strings_en.json +4 -3
  69. package/template-react-vite-muijoy/src/screens/QuickTools.tsx +2 -2
  70. package/template-react-vite-muijoy/src/screens/Settings.tsx +2 -0
  71. package/template-react-vite-muijoy/src/screens/modals/SaveLoadAlert.tsx +2 -2
  72. package/template-react-vite-muijoy/src/screens/settings/DownloadFileToTranslateSettingButton.tsx +32 -0
  73. package/template-react-vite-muijoy/src/screens/settings/SaveLoadSettingButtons.tsx +3 -7
  74. package/template-react-vite-muijoy/src/utils/indexedDB-utility.ts +1 -1
  75. package/template-react-vite-muijoy/src/utils/save-utility.ts +9 -9
  76. package/template-react-vite-muijoy-ink/.vscode/settings.json +4 -0
  77. package/template-react-vite-muijoy-ink/package.json +3 -3
  78. package/template-react-vite-muijoy-ink/src/hooks/useInkInitialization.tsx +3 -1
  79. package/template-react-vite-muijoy-ink/src/hooks/useKeyboardDetector.ts +2 -2
  80. package/template-react-vite-muijoy-ink/src/hooks/useMinigame.ts +3 -2
  81. package/template-react-vite-muijoy-ink/src/i18n.ts +41 -3
  82. package/template-react-vite-muijoy-ink/src/locales/strings_en.json +4 -3
  83. package/template-react-vite-muijoy-ink/src/main.tsx +3 -0
  84. package/template-react-vite-muijoy-ink/src/screens/QuickTools.tsx +2 -2
  85. package/template-react-vite-muijoy-ink/src/screens/Settings.tsx +2 -0
  86. package/template-react-vite-muijoy-ink/src/screens/modals/SaveLoadAlert.tsx +2 -2
  87. package/template-react-vite-muijoy-ink/src/screens/settings/DownloadFileToTranslateSettingButton.tsx +32 -0
  88. package/template-react-vite-muijoy-ink/src/screens/settings/SaveLoadSettingButtons.tsx +3 -7
  89. package/template-react-vite-muijoy-ink/src/utils/indexedDB-utility.ts +1 -1
  90. package/template-react-vite-muijoy-ink/src/utils/ink-utility.ts +22 -5
  91. package/template-react-vite-muijoy-ink/src/utils/save-utility.ts +9 -9
  92. package/template-react-vite-muijoy-ink/vite.config.ts +2 -0
  93. package/template-react-vite-muijoy-ink-tauri/.vscode/settings.json +4 -0
  94. package/template-react-vite-muijoy-ink-tauri/package.json +4 -4
  95. package/template-react-vite-muijoy-ink-tauri/src/hooks/useInkInitialization.tsx +3 -1
  96. package/template-react-vite-muijoy-ink-tauri/src/hooks/useKeyboardDetector.ts +2 -2
  97. package/template-react-vite-muijoy-ink-tauri/src/hooks/useMinigame.ts +3 -2
  98. package/template-react-vite-muijoy-ink-tauri/src/i18n.ts +41 -3
  99. package/template-react-vite-muijoy-ink-tauri/src/locales/strings_en.json +4 -3
  100. package/template-react-vite-muijoy-ink-tauri/src/main.tsx +3 -0
  101. package/template-react-vite-muijoy-ink-tauri/src/screens/QuickTools.tsx +2 -2
  102. package/template-react-vite-muijoy-ink-tauri/src/screens/Settings.tsx +2 -0
  103. package/template-react-vite-muijoy-ink-tauri/src/screens/modals/SaveLoadAlert.tsx +2 -2
  104. package/template-react-vite-muijoy-ink-tauri/src/screens/settings/DownloadFileToTranslateSettingButton.tsx +32 -0
  105. package/template-react-vite-muijoy-ink-tauri/src/screens/settings/SaveLoadSettingButtons.tsx +3 -7
  106. package/template-react-vite-muijoy-ink-tauri/src/utils/indexedDB-utility.ts +1 -1
  107. package/template-react-vite-muijoy-ink-tauri/src/utils/ink-utility.ts +22 -5
  108. package/template-react-vite-muijoy-ink-tauri/src/utils/save-utility.ts +9 -9
  109. package/template-react-vite-muijoy-ink-tauri/vite.config.ts +2 -0
  110. package/template-react-vite-muijoy-tauri/.vscode/settings.json +4 -0
  111. package/template-react-vite-muijoy-tauri/package.json +2 -2
  112. package/template-react-vite-muijoy-tauri/src/hooks/useKeyboardDetector.ts +2 -2
  113. package/template-react-vite-muijoy-tauri/src/hooks/useMinigame.ts +3 -2
  114. package/template-react-vite-muijoy-tauri/src/i18n.ts +25 -3
  115. package/template-react-vite-muijoy-tauri/src/locales/strings_en.json +4 -3
  116. package/template-react-vite-muijoy-tauri/src/screens/QuickTools.tsx +2 -2
  117. package/template-react-vite-muijoy-tauri/src/screens/Settings.tsx +2 -0
  118. package/template-react-vite-muijoy-tauri/src/screens/modals/SaveLoadAlert.tsx +2 -2
  119. package/template-react-vite-muijoy-tauri/src/screens/settings/DownloadFileToTranslateSettingButton.tsx +32 -0
  120. package/template-react-vite-muijoy-tauri/src/screens/settings/SaveLoadSettingButtons.tsx +3 -7
  121. package/template-react-vite-muijoy-tauri/src/utils/indexedDB-utility.ts +1 -1
  122. package/template-react-vite-muijoy-tauri/src/utils/save-utility.ts +9 -9
  123. package/template-story-react-vite-muijoy/.vscode/settings.json +4 -0
  124. package/template-story-react-vite-muijoy/package.json +2 -2
  125. package/template-story-react-vite-muijoy/src/hooks/useKeyboardDetector.ts +2 -2
  126. package/template-story-react-vite-muijoy/src/hooks/useMinigame.ts +3 -2
  127. package/template-story-react-vite-muijoy/src/i18n.ts +25 -3
  128. package/template-story-react-vite-muijoy/src/locales/strings_en.json +4 -3
  129. package/template-story-react-vite-muijoy/src/screens/QuickTools.tsx +2 -2
  130. package/template-story-react-vite-muijoy/src/screens/Settings.tsx +2 -0
  131. package/template-story-react-vite-muijoy/src/screens/modals/SaveLoadAlert.tsx +2 -2
  132. package/template-story-react-vite-muijoy/src/screens/settings/DownloadFileToTranslateSettingButton.tsx +32 -0
  133. package/template-story-react-vite-muijoy/src/screens/settings/SaveLoadSettingButtons.tsx +3 -7
  134. package/template-story-react-vite-muijoy/src/utils/indexedDB-utility.ts +1 -1
  135. package/template-story-react-vite-muijoy/src/utils/save-utility.ts +9 -9
  136. package/template-story-react-vite-muijoy-ink/.vscode/settings.json +4 -0
  137. package/template-story-react-vite-muijoy-ink/package.json +3 -3
  138. package/template-story-react-vite-muijoy-ink/src/hooks/useInkInitialization.tsx +3 -1
  139. package/template-story-react-vite-muijoy-ink/src/hooks/useKeyboardDetector.ts +2 -2
  140. package/template-story-react-vite-muijoy-ink/src/hooks/useMinigame.ts +3 -2
  141. package/template-story-react-vite-muijoy-ink/src/i18n.ts +41 -3
  142. package/template-story-react-vite-muijoy-ink/src/locales/strings_en.json +4 -3
  143. package/template-story-react-vite-muijoy-ink/src/main.tsx +3 -0
  144. package/template-story-react-vite-muijoy-ink/src/screens/QuickTools.tsx +2 -2
  145. package/template-story-react-vite-muijoy-ink/src/screens/Settings.tsx +2 -0
  146. package/template-story-react-vite-muijoy-ink/src/screens/modals/SaveLoadAlert.tsx +2 -2
  147. package/template-story-react-vite-muijoy-ink/src/screens/settings/DownloadFileToTranslateSettingButton.tsx +32 -0
  148. package/template-story-react-vite-muijoy-ink/src/screens/settings/SaveLoadSettingButtons.tsx +3 -7
  149. package/template-story-react-vite-muijoy-ink/src/utils/indexedDB-utility.ts +1 -1
  150. package/template-story-react-vite-muijoy-ink/src/utils/ink-utility.ts +22 -5
  151. package/template-story-react-vite-muijoy-ink/src/utils/save-utility.ts +9 -9
  152. package/template-story-react-vite-muijoy-ink/vite.config.ts +2 -0
  153. package/template-story-react-vite-muijoy-ink-tauri/.vscode/settings.json +4 -0
  154. package/template-story-react-vite-muijoy-ink-tauri/package.json +4 -4
  155. package/template-story-react-vite-muijoy-ink-tauri/src/hooks/useInkInitialization.tsx +3 -1
  156. package/template-story-react-vite-muijoy-ink-tauri/src/hooks/useKeyboardDetector.ts +2 -2
  157. package/template-story-react-vite-muijoy-ink-tauri/src/hooks/useMinigame.ts +3 -2
  158. package/template-story-react-vite-muijoy-ink-tauri/src/i18n.ts +41 -3
  159. package/template-story-react-vite-muijoy-ink-tauri/src/locales/strings_en.json +4 -3
  160. package/template-story-react-vite-muijoy-ink-tauri/src/main.tsx +3 -0
  161. package/template-story-react-vite-muijoy-ink-tauri/src/screens/QuickTools.tsx +2 -2
  162. package/template-story-react-vite-muijoy-ink-tauri/src/screens/Settings.tsx +2 -0
  163. package/template-story-react-vite-muijoy-ink-tauri/src/screens/modals/SaveLoadAlert.tsx +2 -2
  164. package/template-story-react-vite-muijoy-ink-tauri/src/screens/settings/DownloadFileToTranslateSettingButton.tsx +32 -0
  165. package/template-story-react-vite-muijoy-ink-tauri/src/screens/settings/SaveLoadSettingButtons.tsx +3 -7
  166. package/template-story-react-vite-muijoy-ink-tauri/src/utils/indexedDB-utility.ts +1 -1
  167. package/template-story-react-vite-muijoy-ink-tauri/src/utils/ink-utility.ts +22 -5
  168. package/template-story-react-vite-muijoy-ink-tauri/src/utils/save-utility.ts +9 -9
  169. package/template-story-react-vite-muijoy-ink-tauri/vite.config.ts +2 -0
  170. package/template-story-react-vite-muijoy-tauri/.vscode/settings.json +4 -0
  171. package/template-story-react-vite-muijoy-tauri/package.json +2 -2
  172. package/template-story-react-vite-muijoy-tauri/src/hooks/useKeyboardDetector.ts +2 -2
  173. package/template-story-react-vite-muijoy-tauri/src/hooks/useMinigame.ts +3 -2
  174. package/template-story-react-vite-muijoy-tauri/src/i18n.ts +25 -3
  175. package/template-story-react-vite-muijoy-tauri/src/locales/strings_en.json +4 -3
  176. package/template-story-react-vite-muijoy-tauri/src/screens/QuickTools.tsx +2 -2
  177. package/template-story-react-vite-muijoy-tauri/src/screens/Settings.tsx +2 -0
  178. package/template-story-react-vite-muijoy-tauri/src/screens/modals/SaveLoadAlert.tsx +2 -2
  179. package/template-story-react-vite-muijoy-tauri/src/screens/settings/DownloadFileToTranslateSettingButton.tsx +32 -0
  180. package/template-story-react-vite-muijoy-tauri/src/screens/settings/SaveLoadSettingButtons.tsx +3 -7
  181. package/template-story-react-vite-muijoy-tauri/src/utils/indexedDB-utility.ts +1 -1
  182. package/template-story-react-vite-muijoy-tauri/src/utils/save-utility.ts +9 -9
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "create-pixi-vn",
3
3
  "description": "Create a new Pixi’VN project",
4
- "version": "1.7.3",
4
+ "version": "1.7.4",
5
5
  "type": "module",
6
6
  "license": "GPL-3.0",
7
7
  "author": "DRincs-Productions",
@@ -50,10 +50,10 @@
50
50
  "@clack/prompts": "^0.11.0",
51
51
  "@types/minimist": "^1.2.5",
52
52
  "@types/which": "^3.0.4",
53
- "inquirer": "^12.8.0",
53
+ "inquirer": "^12.9.3",
54
54
  "kolorist": "^1.8.0",
55
55
  "minimist": "^1.2.8",
56
- "unbuild": "^3.5.0"
56
+ "unbuild": "^3.6.1"
57
57
  },
58
58
  "dependencies": {
59
59
  "execa": "^9.6.0",
@@ -19,7 +19,7 @@
19
19
  "pixi.js": "^8.12.0"
20
20
  },
21
21
  "devDependencies": {
22
- "@drincs/pixi-vn": "^1.3.2",
22
+ "@drincs/pixi-vn": "^1.3.19",
23
23
  "@types/crypto-js": "^4.2.2",
24
24
  "crypto-js": "^4.2.0",
25
25
  "ts-node": "^10.9.2",
@@ -25,6 +25,10 @@
25
25
  "editor.formatOnSave": true,
26
26
  "prettier.tabWidth": 2,
27
27
  },
28
+ "[json]": {
29
+ "editor.defaultFormatter": "vscode.json-language-features",
30
+ "editor.formatOnSave": true
31
+ },
28
32
  "prettier.jsxSingleQuote": true,
29
33
  "prettier.printWidth": 120,
30
34
  "prettier.useTabs": false,
@@ -12,7 +12,7 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "@drincs/nqtr": "^0.5.7",
15
- "@drincs/pixi-vn": "^1.3.13",
15
+ "@drincs/pixi-vn": "^1.3.19",
16
16
  "@emotion/react": "^11.14.0",
17
17
  "@emotion/styled": "^11.14.1",
18
18
  "@mui/icons-material": "^7.3.1",
@@ -70,4 +70,4 @@
70
70
  "visual-novel",
71
71
  "vn"
72
72
  ]
73
- }
73
+ }
@@ -4,7 +4,7 @@ import { useCallback } from "react";
4
4
  import { useTranslation } from "react-i18next";
5
5
  import { useLocation } from "react-router-dom";
6
6
  import useGameSaveScreenStore from "../stores/useGameSaveScreenStore";
7
- import { putSaveIntoIndexDB } from "../utils/save-utility";
7
+ import { saveGameToIndexDB } from "../utils/save-utility";
8
8
  import useEventListener from "./useKeyDetector";
9
9
  import useQueryLastSave, { LAST_SAVE_USE_QUEY_KEY } from "./useQueryLastSave";
10
10
  import { SAVES_USE_QUEY_KEY } from "./useQuerySaves";
@@ -26,7 +26,7 @@ export default function useKeyboardDetector() {
26
26
  console.log("Can't save on home page");
27
27
  break;
28
28
  }
29
- putSaveIntoIndexDB()
29
+ saveGameToIndexDB()
30
30
  .then((save) => {
31
31
  queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
32
32
  queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
@@ -1,4 +1,5 @@
1
- import { canvas, Layer, PIXI } from "@drincs/pixi-vn";
1
+ import { canvas, Layer } from "@drincs/pixi-vn";
2
+ import { Container } from "@drincs/pixi-vn/pixi.js";
2
3
  import { useEffect, useRef } from "react";
3
4
  import { CANVAS_MINIGAME_LAYER_NAME } from "../constans";
4
5
 
@@ -27,7 +28,7 @@ export default function useMinigame(
27
28
  useEffect(() => {
28
29
  // Create the layer and start the game once
29
30
  loading.current = true;
30
- const layer = canvas.addLayer(CANVAS_MINIGAME_LAYER_NAME, new PIXI.Container());
31
+ const layer = canvas.addLayer(CANVAS_MINIGAME_LAYER_NAME, new Container());
31
32
  if (!layer) {
32
33
  console.error("Failed to create UI layer for minigame");
33
34
  return;
@@ -3,10 +3,32 @@ import Backend from "i18next-chained-backend";
3
3
  import resourcesToBackend from "i18next-resources-to-backend";
4
4
  import { initReactI18next } from "react-i18next";
5
5
 
6
- const getUserLang = (): string => {
6
+ function getUserLang(): string {
7
7
  let userLang: string = navigator.language || "en";
8
8
  return userLang?.toLocaleLowerCase()?.split("-")[0];
9
- };
9
+ }
10
+
11
+ function getLocalesResource(lng: string): Promise<any> {
12
+ return import(`./locales/strings_${lng}.json`);
13
+ }
14
+
15
+ function generateResourceToTranslate(lng: string): Promise<any> {
16
+ return getLocalesResource(lng);
17
+ }
18
+
19
+ export async function downloadResourceToTranslate() {
20
+ const lng = i18n.options.fallbackLng?.toString() || "en";
21
+ const data = await generateResourceToTranslate(lng);
22
+ const jsonString = JSON.stringify(data);
23
+ // download the save data as a JSON file
24
+ const blob = new Blob([jsonString], { type: "application/json" });
25
+ // download the file
26
+ const url = URL.createObjectURL(blob);
27
+ const a = document.createElement("a");
28
+ a.href = url;
29
+ a.download = `strings_${lng}.json`;
30
+ a.click();
31
+ }
10
32
 
11
33
  export const useI18n = () => {
12
34
  if (!i18n.isInitialized) {
@@ -23,7 +45,7 @@ export const useI18n = () => {
23
45
  backend: {
24
46
  backends: [
25
47
  resourcesToBackend(async (lng: string, ns: string) => {
26
- let object = await import(`./locales/strings_${lng}.json`);
48
+ let object = await getLocalesResource(lng);
27
49
  return object[ns];
28
50
  }),
29
51
  ],
@@ -1,4 +1,5 @@
1
1
  {
2
+ "narration": {},
2
3
  "ui": {
3
4
  "allert_error_occurred": "An error occurred, please report it to the developer",
4
5
  "attention": "Attention",
@@ -55,36 +56,36 @@
55
56
  "you_sure_to_delete_save": "Are you sure you want to delete this save file?",
56
57
  "you_sure_to_load_save": "Are you sure you want to load this save file?",
57
58
  "you_sure_to_return_main_menu": "Are you sure you want to return to the main menu? All unsaved progress will be lost.",
58
- "morning" : "Morning",
59
- "afternoon" : "Afternoon",
60
- "evening" : "Evening",
61
- "night" : "Night",
62
- "monday" : "Monday",
63
- "tuesday" : "Tuesday",
64
- "wednesday" : "Wednesday",
65
- "thursday" : "Thursday",
66
- "friday" : "Friday",
67
- "saturday" : "Saturday",
68
- "sunday" : "Sunday",
69
- "nap" : "Nap",
70
- "sleep" : "Sleep",
71
- "allarm_menu_item" : "{{hour}} 00",
72
- "nap_menu_item" : "{{hour}} hours",
73
- "wait" : "Wait",
74
- "quests" : "Quests",
75
- "completed" : "Completed",
76
- "failed" : "Failed",
77
- "memo" : "Memo",
78
- "map" : "Map",
79
- "quest_completed_description" : "This quest has been completed.",
80
- "quest_is_in_development" : "That is all for the moment. The quest is in development.",
81
- "notify_quest_is_started" : "The \"{{quest}}\" quest has started.",
82
- "notify_quest_is_updated" : "The \"{{quest}}\" quest has been updated.",
59
+ "download_locale": "Download File to Translate",
60
+ "morning": "Morning",
61
+ "afternoon": "Afternoon",
62
+ "evening": "Evening",
63
+ "night": "Night",
64
+ "monday": "Monday",
65
+ "tuesday": "Tuesday",
66
+ "wednesday": "Wednesday",
67
+ "thursday": "Thursday",
68
+ "friday": "Friday",
69
+ "saturday": "Saturday",
70
+ "sunday": "Sunday",
71
+ "nap": "Nap",
72
+ "sleep": "Sleep",
73
+ "allarm_menu_item": "{{hour}} 00",
74
+ "nap_menu_item": "{{hour}} hours",
75
+ "wait": "Wait",
76
+ "quests": "Quests",
77
+ "completed": "Completed",
78
+ "failed": "Failed",
79
+ "memo": "Memo",
80
+ "map": "Map",
81
+ "quest_completed_description": "This quest has been completed.",
82
+ "quest_is_in_development": "That is all for the moment. The quest is in development.",
83
+ "notify_quest_is_started": "The \"{{quest}}\" quest has started.",
84
+ "notify_quest_is_updated": "The \"{{quest}}\" quest has been updated.",
83
85
  "bed": "Bed",
84
86
  "order_product": "Order Products",
85
87
  "take_product": "Take Product",
86
88
  "cant_sleep_now": "You can't sleep now",
87
89
  "cant_wait_now": "You can't wait anymore, you should sleep now"
88
- },
89
- "narration": {}
90
+ }
90
91
  }
@@ -15,7 +15,7 @@ import useInterfaceStore from "../stores/useInterfaceStore";
15
15
  import useSettingsScreenStore from "../stores/useSettingsScreenStore";
16
16
  import useSkipStore from "../stores/useSkipStore";
17
17
  import useStepStore from "../stores/useStepStore";
18
- import { putSaveIntoIndexDB } from "../utils/save-utility";
18
+ import { saveGameToIndexDB } from "../utils/save-utility";
19
19
 
20
20
  export default function QuickTools() {
21
21
  const editOpenSettings = useSettingsScreenStore((state) => state.editOpen);
@@ -93,7 +93,7 @@ export default function QuickTools() {
93
93
  </TextMenuButton>
94
94
  <TextMenuButton
95
95
  onClick={() => {
96
- putSaveIntoIndexDB()
96
+ saveGameToIndexDB()
97
97
  .then((save) => {
98
98
  queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
99
99
  queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
@@ -17,6 +17,7 @@ import useEventListener from "../hooks/useKeyDetector";
17
17
  import useSettingsScreenStore from "../stores/useSettingsScreenStore";
18
18
  import AutoSettingToggle from "./settings/AutoSettingToggle";
19
19
  import DialoguesSettings from "./settings/DialoguesSettings";
20
+ import DownloadFileToTranslateSettingButton from "./settings/DownloadFileToTranslateSettingButton";
20
21
  import FullScreenSettings from "./settings/FullScreenSettings";
21
22
  import HideInterfaceSettingToggle from "./settings/HideInterfaceSettingToggle";
22
23
  import OpenHistorySettingButton from "./settings/OpenHistorySettingButton";
@@ -89,6 +90,7 @@ export default function Settings() {
89
90
  <OpenHistorySettingButton />
90
91
  <SaveLoadSettingButtons />
91
92
  <HideInterfaceSettingToggle />
93
+ <DownloadFileToTranslateSettingButton />
92
94
  </Box>
93
95
  </RadioGroup>
94
96
  </FormControl>
@@ -10,7 +10,7 @@ import { INTERFACE_DATA_USE_QUEY_KEY } from "../../hooks/useQueryInterface";
10
10
  import { LAST_SAVE_USE_QUEY_KEY } from "../../hooks/useQueryLastSave";
11
11
  import { SAVES_USE_QUEY_KEY } from "../../hooks/useQuerySaves";
12
12
  import useGameSaveScreenStore from "../../stores/useGameSaveScreenStore";
13
- import { deleteSaveFromIndexDB, loadSave, putSaveIntoIndexDB } from "../../utils/save-utility";
13
+ import { deleteSaveFromIndexDB, loadSave, saveGameToIndexDB } from "../../utils/save-utility";
14
14
 
15
15
  export default function SaveLoadAlert() {
16
16
  const navigate = useMyNavigate();
@@ -73,7 +73,7 @@ export default function SaveLoadAlert() {
73
73
  });
74
74
  case "save":
75
75
  case "overwrite_save":
76
- return putSaveIntoIndexDB({ id: alertData.data, name: tempSaveName })
76
+ return saveGameToIndexDB({ id: alertData.data, name: tempSaveName })
77
77
  .then((save) => {
78
78
  queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
79
79
  queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
@@ -0,0 +1,32 @@
1
+ import TranslateIcon from "@mui/icons-material/Translate";
2
+ import { Typography } from "@mui/joy";
3
+ import { useState } from "react";
4
+ import { useTranslation } from "react-i18next";
5
+ import SettingButton from "../../components/SettingButton";
6
+ import { downloadResourceToTranslate } from "../../i18n";
7
+
8
+ export default function DownloadFileToTranslateSettingButton() {
9
+ const { t } = useTranslation(["ui"]);
10
+ const [loading, setLoading] = useState(false);
11
+
12
+ // Only show this button in development mode
13
+ if (import.meta.env.PROD) {
14
+ return null;
15
+ }
16
+
17
+ return (
18
+ <SettingButton
19
+ key={"download_locale"}
20
+ onClick={() => {
21
+ setLoading(true);
22
+ downloadResourceToTranslate()
23
+ .then(() => setLoading(false))
24
+ .catch(() => setLoading(false));
25
+ }}
26
+ disabled={loading}
27
+ >
28
+ <TranslateIcon />
29
+ <Typography level='title-md'>{t("download_locale")}</Typography>
30
+ </SettingButton>
31
+ );
32
+ }
@@ -15,7 +15,7 @@ import useQueryLastSave, { LAST_SAVE_USE_QUEY_KEY } from "../../hooks/useQueryLa
15
15
  import { SAVES_USE_QUEY_KEY } from "../../hooks/useQuerySaves";
16
16
  import useGameSaveScreenStore from "../../stores/useGameSaveScreenStore";
17
17
  import useSettingsScreenStore from "../../stores/useSettingsScreenStore";
18
- import { downloadGameSave, loadGameSaveFromFile, putSaveIntoIndexDB } from "../../utils/save-utility";
18
+ import { downloadGameSave, loadGameSaveFromFile, saveGameToIndexDB } from "../../utils/save-utility";
19
19
 
20
20
  export default function SaveLoadSettingButtons() {
21
21
  const navigate = useMyNavigate();
@@ -33,7 +33,7 @@ export default function SaveLoadSettingButtons() {
33
33
  <SettingButton
34
34
  key={"quick_save_button"}
35
35
  onClick={() => {
36
- putSaveIntoIndexDB()
36
+ saveGameToIndexDB()
37
37
  .then((save) => {
38
38
  queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
39
39
  queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
@@ -91,11 +91,7 @@ export default function SaveLoadSettingButtons() {
91
91
  <Typography level='title-md'>{t(`${t("save")}/${t("load")}`)}</Typography>
92
92
  </SettingButton>,
93
93
  location.pathname === "/" ? null : (
94
- <SettingButton
95
- key={"download_button"}
96
- onClick={() => downloadGameSave()}
97
- disabled={location.pathname === "/"}
98
- >
94
+ <SettingButton key={"save_to_file"} onClick={() => downloadGameSave()} disabled={location.pathname === "/"}>
99
95
  <DownloadIcon />
100
96
  <Typography level='title-md'>{t("save_to_file")}</Typography>
101
97
  </SettingButton>
@@ -1,4 +1,4 @@
1
- const INDEXED_DB_VERSION = 2;
1
+ const INDEXED_DB_VERSION = 2; // Increment this version number when you change the database schema
2
2
  const INDEXED_DB_NAME = "game_db";
3
3
  export const INDEXED_DB_SAVE_TABLE = "saves";
4
4
 
@@ -13,31 +13,31 @@ import {
13
13
 
14
14
  const SAVE_FILE_EXTENSION = "json";
15
15
 
16
- export function getSave(image?: string): GameSaveData {
16
+ export function createGameSave(options?: { image?: string; name?: string }): GameSaveData {
17
+ const { image, name = "" } = options || {};
17
18
  return {
18
19
  saveData: Game.exportGameState(),
19
20
  gameVersion: __APP_VERSION__,
20
21
  date: new Date(),
21
- name: "",
22
+ name: name,
22
23
  image: image,
23
24
  };
24
25
  }
25
26
 
26
27
  export async function loadSave(saveData: GameSaveData, navigate: NavigateFunction) {
27
28
  await navigate(LOADING_ROUTE);
28
- // load the save data from the JSON string
29
29
  await Game.restoreGameState(saveData.saveData, navigate);
30
30
  }
31
31
 
32
- export async function putSaveIntoIndexDB(
32
+ export async function saveGameToIndexDB(
33
33
  info: Partial<GameSaveData> & { id?: number } = {},
34
- data = getSave()
34
+ data = createGameSave()
35
35
  ): Promise<GameSaveData & { id: number }> {
36
- let image = await canvas.extractImage();
36
+ const { image = await canvas.extractImage(), ...rest } = info;
37
37
  let item = {
38
38
  ...data,
39
39
  image: image,
40
- ...info,
40
+ ...rest,
41
41
  };
42
42
  if (item.id === undefined) {
43
43
  let lastSave = await getLastRowFromIndexDB<GameSaveData & { id: number }>(INDEXED_DB_SAVE_TABLE);
@@ -73,7 +73,7 @@ export async function deleteSaveFromIndexDB(id: number): Promise<void> {
73
73
  return await deleteRowFromIndexDB(INDEXED_DB_SAVE_TABLE, id);
74
74
  }
75
75
 
76
- export function downloadGameSave(data: GameSaveData = getSave()) {
76
+ export function downloadGameSave(data: GameSaveData = createGameSave()) {
77
77
  const jsonString = JSON.stringify(data);
78
78
  // download the save data as a JSON file
79
79
  const blob = new Blob([jsonString], { type: "application/json" });
@@ -114,7 +114,7 @@ export function loadGameSaveFromFile(navigate: NavigateFunction, afterLoad?: ()
114
114
  }
115
115
 
116
116
  export async function addRefreshSave() {
117
- const data = getSave();
117
+ const data = createGameSave();
118
118
  let jsonString = JSON.stringify(data);
119
119
  if (jsonString) {
120
120
  localStorage.setItem(REFRESH_SAVE_LOCAL_STORAGE_KEY, jsonString);
@@ -25,6 +25,10 @@
25
25
  "editor.formatOnSave": true,
26
26
  "prettier.tabWidth": 2,
27
27
  },
28
+ "[json]": {
29
+ "editor.defaultFormatter": "vscode.json-language-features",
30
+ "editor.formatOnSave": true
31
+ },
28
32
  "prettier.jsxSingleQuote": true,
29
33
  "prettier.printWidth": 120,
30
34
  "prettier.useTabs": false,
@@ -12,8 +12,8 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "@drincs/nqtr": "^0.5.7",
15
- "@drincs/pixi-vn": "^1.3.13",
16
- "@drincs/pixi-vn-ink": "^0.8.0",
15
+ "@drincs/pixi-vn": "^1.3.19",
16
+ "@drincs/pixi-vn-ink": "^0.9.6",
17
17
  "@emotion/react": "^11.14.0",
18
18
  "@emotion/styled": "^11.14.1",
19
19
  "@mui/icons-material": "^7.3.1",
@@ -71,4 +71,4 @@
71
71
  "visual-novel",
72
72
  "vn"
73
73
  ]
74
- }
74
+ }
@@ -1,9 +1,11 @@
1
1
  import { useEffect } from "react";
2
+ import { useTranslation } from "react-i18next";
2
3
  import { initializeInk } from "../utils/ink-utility";
3
4
 
4
5
  export default function useInkInitialization() {
6
+ const { t } = useTranslation(["narration"]);
5
7
  useEffect(() => {
6
- initializeInk();
8
+ initializeInk({ t });
7
9
  }, []);
8
10
 
9
11
  return null;
@@ -4,7 +4,7 @@ import { useCallback } from "react";
4
4
  import { useTranslation } from "react-i18next";
5
5
  import { useLocation } from "react-router-dom";
6
6
  import useGameSaveScreenStore from "../stores/useGameSaveScreenStore";
7
- import { putSaveIntoIndexDB } from "../utils/save-utility";
7
+ import { saveGameToIndexDB } from "../utils/save-utility";
8
8
  import useEventListener from "./useKeyDetector";
9
9
  import useQueryLastSave, { LAST_SAVE_USE_QUEY_KEY } from "./useQueryLastSave";
10
10
  import { SAVES_USE_QUEY_KEY } from "./useQuerySaves";
@@ -26,7 +26,7 @@ export default function useKeyboardDetector() {
26
26
  console.log("Can't save on home page");
27
27
  break;
28
28
  }
29
- putSaveIntoIndexDB()
29
+ saveGameToIndexDB()
30
30
  .then((save) => {
31
31
  queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
32
32
  queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
@@ -1,4 +1,5 @@
1
- import { canvas, Layer, PIXI } from "@drincs/pixi-vn";
1
+ import { canvas, Layer } from "@drincs/pixi-vn";
2
+ import { Container } from "@drincs/pixi-vn/pixi.js";
2
3
  import { useEffect, useRef } from "react";
3
4
  import { CANVAS_MINIGAME_LAYER_NAME } from "../constans";
4
5
 
@@ -27,7 +28,7 @@ export default function useMinigame(
27
28
  useEffect(() => {
28
29
  // Create the layer and start the game once
29
30
  loading.current = true;
30
- const layer = canvas.addLayer(CANVAS_MINIGAME_LAYER_NAME, new PIXI.Container());
31
+ const layer = canvas.addLayer(CANVAS_MINIGAME_LAYER_NAME, new Container());
31
32
  if (!layer) {
32
33
  console.error("Failed to create UI layer for minigame");
33
34
  return;
@@ -1,13 +1,51 @@
1
1
  import { RegisteredCharacters } from "@drincs/pixi-vn";
2
+ import { generateJsonInkTranslation } from "@drincs/pixi-vn-ink";
2
3
  import i18n from "i18next";
3
4
  import Backend from "i18next-chained-backend";
4
5
  import resourcesToBackend from "i18next-resources-to-backend";
5
6
  import { initReactI18next } from "react-i18next";
7
+ import { convertInkToJson } from "./utils/ink-utility";
6
8
 
7
- const getUserLang = (): string => {
9
+ function getUserLang(): string {
8
10
  let userLang: string = navigator.language || "en";
9
11
  return userLang?.toLocaleLowerCase()?.split("-")[0];
10
- };
12
+ }
13
+
14
+ function getLocalesResource(lng: string): Promise<any> {
15
+ return import(`./locales/strings_${lng}.json`);
16
+ }
17
+
18
+ async function generateResourceToTranslate(lng: string): Promise<any> {
19
+ let res = await getLocalesResource(lng);
20
+ res = { ...res };
21
+ if (!res) {
22
+ res = {};
23
+ }
24
+ if (!res.narration) {
25
+ res.narration = {};
26
+ }
27
+ if (res.default) {
28
+ delete res.default;
29
+ }
30
+ (await convertInkToJson()).forEach((element) => {
31
+ element && generateJsonInkTranslation(element, res.narration);
32
+ });
33
+ return res;
34
+ }
35
+
36
+ export async function downloadResourceToTranslate() {
37
+ const lng = i18n.options.fallbackLng?.toString() || "en";
38
+ const data = await generateResourceToTranslate(lng);
39
+ const jsonString = JSON.stringify(data);
40
+ // download the save data as a JSON file
41
+ const blob = new Blob([jsonString], { type: "application/json" });
42
+ // download the file
43
+ const url = URL.createObjectURL(blob);
44
+ const a = document.createElement("a");
45
+ a.href = url;
46
+ a.download = `strings_${lng}.json`;
47
+ a.click();
48
+ }
11
49
 
12
50
  export const useI18n = () => {
13
51
  if (!i18n.isInitialized) {
@@ -24,7 +62,7 @@ export const useI18n = () => {
24
62
  backend: {
25
63
  backends: [
26
64
  resourcesToBackend(async (lng: string, ns: string) => {
27
- let object = await import(`./locales/strings_${lng}.json`);
65
+ let object = await getLocalesResource(lng);
28
66
  return object[ns];
29
67
  }),
30
68
  ],
@@ -1,4 +1,5 @@
1
1
  {
2
+ "narration": {},
2
3
  "ui": {
3
4
  "allert_error_occurred": "An error occurred, please report it to the developer",
4
5
  "attention": "Attention",
@@ -55,36 +56,36 @@
55
56
  "you_sure_to_delete_save": "Are you sure you want to delete this save file?",
56
57
  "you_sure_to_load_save": "Are you sure you want to load this save file?",
57
58
  "you_sure_to_return_main_menu": "Are you sure you want to return to the main menu? All unsaved progress will be lost.",
58
- "morning" : "Morning",
59
- "afternoon" : "Afternoon",
60
- "evening" : "Evening",
61
- "night" : "Night",
62
- "monday" : "Monday",
63
- "tuesday" : "Tuesday",
64
- "wednesday" : "Wednesday",
65
- "thursday" : "Thursday",
66
- "friday" : "Friday",
67
- "saturday" : "Saturday",
68
- "sunday" : "Sunday",
69
- "nap" : "Nap",
70
- "sleep" : "Sleep",
71
- "allarm_menu_item" : "{{hour}} 00",
72
- "nap_menu_item" : "{{hour}} hours",
73
- "wait" : "Wait",
74
- "quests" : "Quests",
75
- "completed" : "Completed",
76
- "failed" : "Failed",
77
- "memo" : "Memo",
78
- "map" : "Map",
79
- "quest_completed_description" : "This quest has been completed.",
80
- "quest_is_in_development" : "That is all for the moment. The quest is in development.",
81
- "notify_quest_is_started" : "The \"{{quest}}\" quest has started.",
82
- "notify_quest_is_updated" : "The \"{{quest}}\" quest has been updated.",
59
+ "download_locale": "Download File to Translate",
60
+ "morning": "Morning",
61
+ "afternoon": "Afternoon",
62
+ "evening": "Evening",
63
+ "night": "Night",
64
+ "monday": "Monday",
65
+ "tuesday": "Tuesday",
66
+ "wednesday": "Wednesday",
67
+ "thursday": "Thursday",
68
+ "friday": "Friday",
69
+ "saturday": "Saturday",
70
+ "sunday": "Sunday",
71
+ "nap": "Nap",
72
+ "sleep": "Sleep",
73
+ "allarm_menu_item": "{{hour}} 00",
74
+ "nap_menu_item": "{{hour}} hours",
75
+ "wait": "Wait",
76
+ "quests": "Quests",
77
+ "completed": "Completed",
78
+ "failed": "Failed",
79
+ "memo": "Memo",
80
+ "map": "Map",
81
+ "quest_completed_description": "This quest has been completed.",
82
+ "quest_is_in_development": "That is all for the moment. The quest is in development.",
83
+ "notify_quest_is_started": "The \"{{quest}}\" quest has started.",
84
+ "notify_quest_is_updated": "The \"{{quest}}\" quest has been updated.",
83
85
  "bed": "Bed",
84
86
  "order_product": "Order Products",
85
87
  "take_product": "Take Product",
86
88
  "cant_sleep_now": "You can't sleep now",
87
89
  "cant_wait_now": "You can't wait anymore, you should sleep now"
88
- },
89
- "narration": {}
90
+ }
90
91
  }