@form-engine-ts/translator-mock 1.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 nitta-a
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # @form-engine-ts/translator-mock
2
+
3
+ Synchronous English/Japanese translation adapter for form-engine-ts demos and tests, with interpolation and locale fallback.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pnpm add @form-engine-ts/core @form-engine-ts/translator-mock
9
+ ```
10
+
11
+ ## Quick start
12
+
13
+ ```ts
14
+ import { createMockTranslationAdapter } from "@form-engine-ts/translator-mock";
15
+
16
+ const translator = createMockTranslationAdapter({
17
+ en: { greeting: "Hello, {{name}}!" },
18
+ ja: { greeting: "こんにちは、{{name}}さん!" }
19
+ });
20
+
21
+ translator.translate("greeting", "ja", { name: "Ada" });
22
+ ```
package/dist/index.cjs ADDED
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ createMockTranslationAdapter: () => createMockTranslationAdapter,
24
+ mockCatalogs: () => mockCatalogs,
25
+ mockTranslator: () => mockTranslator
26
+ });
27
+ module.exports = __toCommonJS(index_exports);
28
+ var sharedEnglish = {
29
+ "form.title": "Customer feedback",
30
+ "form.description": "Tell us about your experience. Required fields are marked.",
31
+ "form.submit": "Send response",
32
+ "field.name.label": "Your name",
33
+ "field.name.help": "Enter at least {{min}} characters.",
34
+ "field.name.placeholder": "Ada Lovelace",
35
+ "field.reference.label": "Reference code",
36
+ "field.reference.help": "Use three uppercase letters followed by three digits.",
37
+ "field.reference.placeholder": "ABC123",
38
+ "field.comments.label": "What could we improve?",
39
+ "field.comments.placeholder": "Share the details that matter most\u2026",
40
+ "field.age.label": "Your age",
41
+ "field.age.placeholder": "18\u2013100",
42
+ "field.team.label": "Team",
43
+ "field.team.help": "Choose the team you worked with.",
44
+ "field.channels.label": "How did you contact us?",
45
+ "field.channels.help": "Choose one or two channels.",
46
+ "field.consent.label": "I agree that this response may be analyzed.",
47
+ "field.recommend.label": "Would you recommend us?",
48
+ "field.rating.label": "How would you rate your experience?",
49
+ "field.followup.label": "What made the experience disappointing?",
50
+ "option.team.product": "Product",
51
+ "option.team.support": "Support",
52
+ "option.team.sales": "Sales",
53
+ "option.channel.email": "Email",
54
+ "option.channel.chat": "Chat",
55
+ "option.channel.phone": "Phone",
56
+ "option.yes": "Yes",
57
+ "option.no": "No",
58
+ "validation.required": "This field is required.",
59
+ "validation.invalidType": "Enter a value in the expected format.",
60
+ "validation.minLength": "Enter at least {{min}} characters.",
61
+ "validation.maxLength": "Enter no more than {{max}} characters.",
62
+ "validation.pattern": "Use the requested format.",
63
+ "validation.min": "Enter a value of at least {{min}}.",
64
+ "validation.max": "Enter a value no greater than {{max}}.",
65
+ "validation.step": "Use increments of {{step}}.",
66
+ "validation.invalidOption": "Choose one of the available options.",
67
+ "validation.minSelections": "Choose at least {{min}} options.",
68
+ "validation.maxSelections": "Choose no more than {{max}} options.",
69
+ "validation.unknownField": "This response contains an unknown field.",
70
+ "preview.language": "Language",
71
+ "preview.success": "Response saved. Thank you!",
72
+ "preview.error": "The response could not be saved. Try again.",
73
+ "preview.analytics": "Analytics dashboard",
74
+ "preview.responses": "Responses",
75
+ "preview.noResponses": "Submit the form to see aggregate results.",
76
+ "preview.answered": "Answered",
77
+ "preview.unanswered": "Unanswered",
78
+ "preview.minimum": "Minimum",
79
+ "preview.maximum": "Maximum",
80
+ "preview.average": "Average",
81
+ "preview.total": "Total",
82
+ "preview.true": "Checked",
83
+ "preview.false": "Not checked",
84
+ "preview.builder": "Form Builder",
85
+ "preview.respondent": "Respondent Preview",
86
+ "preview.export": "Download CSV",
87
+ "preview.schemaJson": "Schema JSON",
88
+ "preview.storage": "Storage",
89
+ "preview.memory": "Memory",
90
+ "preview.localStorage": "LocalStorage",
91
+ "preview.freeText": "Free-text responses",
92
+ "preview.resetResponses": "Reset responses",
93
+ "preview.resetConfirmation": "Delete every response for this form?",
94
+ "preview.confirmReset": "Confirm reset",
95
+ "preview.cancel": "Cancel",
96
+ "preview.resetSuccess": "All responses for this form were deleted.",
97
+ "preview.resetError": "Responses could not be deleted.",
98
+ "preview.resetUnavailable": "The selected storage does not support response reset.",
99
+ "builder.formBuilder": "Form builder",
100
+ "builder.moveUp": "Move {{title}} up",
101
+ "builder.moveDown": "Move {{title}} down",
102
+ "builder.delete": "Delete {{title}}",
103
+ "builder.deleteAction": "Delete",
104
+ "builder.questionTitle": "\u8CEA\u554F\u6587 / Question Title",
105
+ "builder.questionTitlePlaceholder": "Example: Tell us what we could improve",
106
+ "builder.newQuestionTitle": "New question",
107
+ "builder.type": "Type",
108
+ "builder.required": "Required",
109
+ "builder.minimum": "Minimum",
110
+ "builder.maximum": "Maximum",
111
+ "builder.options": "Options",
112
+ "builder.optionLabel": "\u9078\u629E\u80A2 / Option Label {{index}}",
113
+ "builder.optionLabelPlaceholder": "Example: Very satisfied",
114
+ "builder.newOptionLabel": "Option {{index}}",
115
+ "builder.remove": "Remove",
116
+ "builder.addOption": "Add option",
117
+ "builder.displayCondition": "Display condition",
118
+ "builder.alwaysVisible": "Always visible",
119
+ "builder.conditionOperator": "Condition operator",
120
+ "builder.conditionValue": "Condition value",
121
+ "builder.conditionTrue": "true",
122
+ "builder.conditionFalse": "false",
123
+ "builder.addQuestion": "Add question",
124
+ "builder.fieldType.text": "Text",
125
+ "builder.fieldType.textarea": "Textarea",
126
+ "builder.fieldType.number": "Number",
127
+ "builder.fieldType.rating": "Rating",
128
+ "builder.fieldType.select": "Select",
129
+ "builder.fieldType.multi-select": "Multi-select",
130
+ "builder.fieldType.checkbox": "Checkbox",
131
+ "builder.fieldType.radio": "Radio",
132
+ "builder.operator.equals": "equals",
133
+ "builder.operator.not_equals": "does not equal",
134
+ "builder.operator.contains": "contains",
135
+ "builder.operator.not_empty": "is not empty"
136
+ };
137
+ var sharedJapanese = {
138
+ "form.title": "\u304A\u5BA2\u69D8\u30A2\u30F3\u30B1\u30FC\u30C8",
139
+ "form.description": "\u3054\u5229\u7528\u4F53\u9A13\u306B\u3064\u3044\u3066\u304A\u805E\u304B\u305B\u304F\u3060\u3055\u3044\u3002\u5FC5\u9808\u9805\u76EE\u306B\u306F\u5370\u304C\u3042\u308A\u307E\u3059\u3002",
140
+ "form.submit": "\u56DE\u7B54\u3092\u9001\u4FE1",
141
+ "field.name.label": "\u304A\u540D\u524D",
142
+ "field.name.help": "{{min}}\u6587\u5B57\u4EE5\u4E0A\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
143
+ "field.name.placeholder": "\u5C71\u7530 \u592A\u90CE",
144
+ "field.reference.label": "\u53C2\u7167\u30B3\u30FC\u30C9",
145
+ "field.reference.help": "\u82F1\u5927\u6587\u5B573\u6587\u5B57\u3068\u6570\u5B573\u6841\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
146
+ "field.reference.placeholder": "ABC123",
147
+ "field.comments.label": "\u6539\u5584\u3057\u3066\u307B\u3057\u3044\u70B9",
148
+ "field.comments.placeholder": "\u7279\u306B\u91CD\u8981\u306A\u70B9\u3092\u3054\u8A18\u5165\u304F\u3060\u3055\u3044\u2026",
149
+ "field.age.label": "\u5E74\u9F62",
150
+ "field.age.placeholder": "18\u301C100",
151
+ "field.team.label": "\u62C5\u5F53\u30C1\u30FC\u30E0",
152
+ "field.team.help": "\u3054\u5229\u7528\u306B\u306A\u3063\u305F\u30C1\u30FC\u30E0\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
153
+ "field.channels.label": "\u304A\u554F\u3044\u5408\u308F\u305B\u65B9\u6CD5",
154
+ "field.channels.help": "1\u3064\u307E\u305F\u306F2\u3064\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
155
+ "field.consent.label": "\u3053\u306E\u56DE\u7B54\u3092\u5206\u6790\u306B\u5229\u7528\u3059\u308B\u3053\u3068\u306B\u540C\u610F\u3057\u307E\u3059\u3002",
156
+ "field.recommend.label": "\u4ED6\u306E\u65B9\u306B\u304A\u3059\u3059\u3081\u3057\u307E\u3059\u304B\uFF1F",
157
+ "field.rating.label": "\u4ECA\u56DE\u306E\u4F53\u9A13\u3092\u8A55\u4FA1\u3057\u3066\u304F\u3060\u3055\u3044",
158
+ "field.followup.label": "\u6B8B\u5FF5\u3060\u3063\u305F\u7406\u7531\u3092\u6559\u3048\u3066\u304F\u3060\u3055\u3044",
159
+ "option.team.product": "\u88FD\u54C1",
160
+ "option.team.support": "\u30B5\u30DD\u30FC\u30C8",
161
+ "option.team.sales": "\u55B6\u696D",
162
+ "option.channel.email": "\u30E1\u30FC\u30EB",
163
+ "option.channel.chat": "\u30C1\u30E3\u30C3\u30C8",
164
+ "option.channel.phone": "\u96FB\u8A71",
165
+ "option.yes": "\u306F\u3044",
166
+ "option.no": "\u3044\u3044\u3048",
167
+ "validation.required": "\u3053\u306E\u9805\u76EE\u306F\u5FC5\u9808\u3067\u3059\u3002",
168
+ "validation.invalidType": "\u6B63\u3057\u3044\u5F62\u5F0F\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
169
+ "validation.minLength": "{{min}}\u6587\u5B57\u4EE5\u4E0A\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
170
+ "validation.maxLength": "{{max}}\u6587\u5B57\u4EE5\u5185\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
171
+ "validation.pattern": "\u6307\u5B9A\u3055\u308C\u305F\u5F62\u5F0F\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
172
+ "validation.min": "{{min}}\u4EE5\u4E0A\u306E\u5024\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
173
+ "validation.max": "{{max}}\u4EE5\u4E0B\u306E\u5024\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
174
+ "validation.step": "{{step}}\u523B\u307F\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
175
+ "validation.invalidOption": "\u9078\u629E\u80A2\u304B\u3089\u9078\u3093\u3067\u304F\u3060\u3055\u3044\u3002",
176
+ "validation.minSelections": "{{min}}\u3064\u4EE5\u4E0A\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
177
+ "validation.maxSelections": "{{max}}\u3064\u4EE5\u5185\u3067\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
178
+ "validation.unknownField": "\u4E0D\u660E\u306A\u9805\u76EE\u304C\u56DE\u7B54\u306B\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002",
179
+ "preview.language": "\u8A00\u8A9E",
180
+ "preview.success": "\u56DE\u7B54\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002\u3042\u308A\u304C\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002",
181
+ "preview.error": "\u56DE\u7B54\u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",
182
+ "preview.analytics": "\u96C6\u8A08\u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9",
183
+ "preview.responses": "\u56DE\u7B54\u6570",
184
+ "preview.noResponses": "\u30D5\u30A9\u30FC\u30E0\u3092\u9001\u4FE1\u3059\u308B\u3068\u96C6\u8A08\u7D50\u679C\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002",
185
+ "preview.answered": "\u56DE\u7B54\u6E08\u307F",
186
+ "preview.unanswered": "\u672A\u56DE\u7B54",
187
+ "preview.minimum": "\u6700\u5C0F",
188
+ "preview.maximum": "\u6700\u5927",
189
+ "preview.average": "\u5E73\u5747",
190
+ "preview.total": "\u5408\u8A08",
191
+ "preview.true": "\u30C1\u30A7\u30C3\u30AF\u6E08\u307F",
192
+ "preview.false": "\u672A\u30C1\u30A7\u30C3\u30AF",
193
+ "preview.builder": "\u30D5\u30A9\u30FC\u30E0\u30D3\u30EB\u30C0\u30FC",
194
+ "preview.respondent": "\u56DE\u7B54\u30D7\u30EC\u30D3\u30E5\u30FC",
195
+ "preview.export": "CSV\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9",
196
+ "preview.schemaJson": "\u30B9\u30AD\u30FC\u30DEJSON",
197
+ "preview.storage": "\u30B9\u30C8\u30EC\u30FC\u30B8",
198
+ "preview.memory": "\u30E1\u30E2\u30EA",
199
+ "preview.localStorage": "LocalStorage",
200
+ "preview.freeText": "\u81EA\u7531\u8A18\u8FF0\u56DE\u7B54",
201
+ "preview.resetResponses": "\u56DE\u7B54\u30C7\u30FC\u30BF\u3092\u5168\u4EF6\u30AF\u30EA\u30A2",
202
+ "preview.resetConfirmation": "\u3053\u306E\u30D5\u30A9\u30FC\u30E0\u306E\u56DE\u7B54\u3092\u3059\u3079\u3066\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F",
203
+ "preview.confirmReset": "\u524A\u9664\u3092\u78BA\u5B9A",
204
+ "preview.cancel": "\u30AD\u30E3\u30F3\u30BB\u30EB",
205
+ "preview.resetSuccess": "\u3053\u306E\u30D5\u30A9\u30FC\u30E0\u306E\u56DE\u7B54\u3092\u3059\u3079\u3066\u524A\u9664\u3057\u307E\u3057\u305F\u3002",
206
+ "preview.resetError": "\u56DE\u7B54\u3092\u524A\u9664\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002",
207
+ "preview.resetUnavailable": "\u9078\u629E\u4E2D\u306E\u30B9\u30C8\u30EC\u30FC\u30B8\u306F\u56DE\u7B54\u30EA\u30BB\u30C3\u30C8\u306B\u5BFE\u5FDC\u3057\u3066\u3044\u307E\u305B\u3093\u3002",
208
+ "builder.formBuilder": "\u30D5\u30A9\u30FC\u30E0\u30D3\u30EB\u30C0\u30FC",
209
+ "builder.moveUp": "\u300C{{title}}\u300D\u3092\u4E0A\u3078\u79FB\u52D5",
210
+ "builder.moveDown": "\u300C{{title}}\u300D\u3092\u4E0B\u3078\u79FB\u52D5",
211
+ "builder.delete": "\u300C{{title}}\u300D\u3092\u524A\u9664",
212
+ "builder.deleteAction": "\u524A\u9664",
213
+ "builder.questionTitle": "\u8CEA\u554F\u6587 / Question Title",
214
+ "builder.questionTitlePlaceholder": "\u4F8B: \u3054\u610F\u898B\u30FB\u3054\u8981\u671B\u3092\u3054\u8A18\u5165\u304F\u3060\u3055\u3044",
215
+ "builder.newQuestionTitle": "\u65B0\u3057\u3044\u8CEA\u554F",
216
+ "builder.type": "\u7A2E\u985E",
217
+ "builder.required": "\u5FC5\u9808",
218
+ "builder.minimum": "\u6700\u5C0F\u5024",
219
+ "builder.maximum": "\u6700\u5927\u5024",
220
+ "builder.options": "\u9078\u629E\u80A2",
221
+ "builder.optionLabel": "\u9078\u629E\u80A2 / Option Label {{index}}",
222
+ "builder.optionLabelPlaceholder": "\u4F8B: \u5927\u5909\u6E80\u8DB3",
223
+ "builder.newOptionLabel": "\u9078\u629E\u80A2 {{index}}",
224
+ "builder.remove": "\u524A\u9664",
225
+ "builder.addOption": "\u9078\u629E\u80A2\u3092\u8FFD\u52A0",
226
+ "builder.displayCondition": "\u8868\u793A\u6761\u4EF6",
227
+ "builder.alwaysVisible": "\u5E38\u306B\u8868\u793A",
228
+ "builder.conditionOperator": "\u6761\u4EF6\u6F14\u7B97\u5B50",
229
+ "builder.conditionValue": "\u6761\u4EF6\u5024",
230
+ "builder.conditionTrue": "\u306F\u3044",
231
+ "builder.conditionFalse": "\u3044\u3044\u3048",
232
+ "builder.addQuestion": "\u8CEA\u554F\u3092\u8FFD\u52A0",
233
+ "builder.fieldType.text": "\u30C6\u30AD\u30B9\u30C8",
234
+ "builder.fieldType.textarea": "\u30C6\u30AD\u30B9\u30C8\u30A8\u30EA\u30A2",
235
+ "builder.fieldType.number": "\u6570\u5024",
236
+ "builder.fieldType.rating": "\u8A55\u4FA1",
237
+ "builder.fieldType.select": "\u5358\u4E00\u9078\u629E",
238
+ "builder.fieldType.multi-select": "\u8907\u6570\u9078\u629E",
239
+ "builder.fieldType.checkbox": "\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9",
240
+ "builder.fieldType.radio": "\u30E9\u30B8\u30AA\u30DC\u30BF\u30F3",
241
+ "builder.operator.equals": "\u7B49\u3057\u3044",
242
+ "builder.operator.not_equals": "\u7B49\u3057\u304F\u306A\u3044",
243
+ "builder.operator.contains": "\u542B\u3080",
244
+ "builder.operator.not_empty": "\u7A7A\u3067\u306F\u306A\u3044"
245
+ };
246
+ var mockCatalogs = { en: sharedEnglish, ja: sharedJapanese };
247
+ function createMockTranslationAdapter(catalogs = mockCatalogs, fallbackLocale = "en") {
248
+ return {
249
+ translate(key, locale, params = {}) {
250
+ const template = catalogs[locale]?.[key] ?? catalogs[fallbackLocale]?.[key] ?? key;
251
+ return template.replace(
252
+ /\{\{(\w+)\}\}/g,
253
+ (token, name) => Object.hasOwn(params, name) ? String(params[name]) : token
254
+ );
255
+ }
256
+ };
257
+ }
258
+ var mockTranslator = createMockTranslationAdapter();
259
+ // Annotate the CommonJS export names for ESM import in node:
260
+ 0 && (module.exports = {
261
+ createMockTranslationAdapter,
262
+ mockCatalogs,
263
+ mockTranslator
264
+ });
@@ -0,0 +1,9 @@
1
+ import { TranslationAdapter } from '@form-engine-ts/core';
2
+
3
+ type TranslationCatalog = Readonly<Record<string, string>>;
4
+ type TranslationCatalogs = Readonly<Record<string, TranslationCatalog>>;
5
+ declare const mockCatalogs: TranslationCatalogs;
6
+ declare function createMockTranslationAdapter(catalogs?: TranslationCatalogs, fallbackLocale?: string): TranslationAdapter;
7
+ declare const mockTranslator: TranslationAdapter;
8
+
9
+ export { type TranslationCatalog, type TranslationCatalogs, createMockTranslationAdapter, mockCatalogs, mockTranslator };
@@ -0,0 +1,9 @@
1
+ import { TranslationAdapter } from '@form-engine-ts/core';
2
+
3
+ type TranslationCatalog = Readonly<Record<string, string>>;
4
+ type TranslationCatalogs = Readonly<Record<string, TranslationCatalog>>;
5
+ declare const mockCatalogs: TranslationCatalogs;
6
+ declare function createMockTranslationAdapter(catalogs?: TranslationCatalogs, fallbackLocale?: string): TranslationAdapter;
7
+ declare const mockTranslator: TranslationAdapter;
8
+
9
+ export { type TranslationCatalog, type TranslationCatalogs, createMockTranslationAdapter, mockCatalogs, mockTranslator };
package/dist/index.js ADDED
@@ -0,0 +1,237 @@
1
+ // src/index.ts
2
+ var sharedEnglish = {
3
+ "form.title": "Customer feedback",
4
+ "form.description": "Tell us about your experience. Required fields are marked.",
5
+ "form.submit": "Send response",
6
+ "field.name.label": "Your name",
7
+ "field.name.help": "Enter at least {{min}} characters.",
8
+ "field.name.placeholder": "Ada Lovelace",
9
+ "field.reference.label": "Reference code",
10
+ "field.reference.help": "Use three uppercase letters followed by three digits.",
11
+ "field.reference.placeholder": "ABC123",
12
+ "field.comments.label": "What could we improve?",
13
+ "field.comments.placeholder": "Share the details that matter most\u2026",
14
+ "field.age.label": "Your age",
15
+ "field.age.placeholder": "18\u2013100",
16
+ "field.team.label": "Team",
17
+ "field.team.help": "Choose the team you worked with.",
18
+ "field.channels.label": "How did you contact us?",
19
+ "field.channels.help": "Choose one or two channels.",
20
+ "field.consent.label": "I agree that this response may be analyzed.",
21
+ "field.recommend.label": "Would you recommend us?",
22
+ "field.rating.label": "How would you rate your experience?",
23
+ "field.followup.label": "What made the experience disappointing?",
24
+ "option.team.product": "Product",
25
+ "option.team.support": "Support",
26
+ "option.team.sales": "Sales",
27
+ "option.channel.email": "Email",
28
+ "option.channel.chat": "Chat",
29
+ "option.channel.phone": "Phone",
30
+ "option.yes": "Yes",
31
+ "option.no": "No",
32
+ "validation.required": "This field is required.",
33
+ "validation.invalidType": "Enter a value in the expected format.",
34
+ "validation.minLength": "Enter at least {{min}} characters.",
35
+ "validation.maxLength": "Enter no more than {{max}} characters.",
36
+ "validation.pattern": "Use the requested format.",
37
+ "validation.min": "Enter a value of at least {{min}}.",
38
+ "validation.max": "Enter a value no greater than {{max}}.",
39
+ "validation.step": "Use increments of {{step}}.",
40
+ "validation.invalidOption": "Choose one of the available options.",
41
+ "validation.minSelections": "Choose at least {{min}} options.",
42
+ "validation.maxSelections": "Choose no more than {{max}} options.",
43
+ "validation.unknownField": "This response contains an unknown field.",
44
+ "preview.language": "Language",
45
+ "preview.success": "Response saved. Thank you!",
46
+ "preview.error": "The response could not be saved. Try again.",
47
+ "preview.analytics": "Analytics dashboard",
48
+ "preview.responses": "Responses",
49
+ "preview.noResponses": "Submit the form to see aggregate results.",
50
+ "preview.answered": "Answered",
51
+ "preview.unanswered": "Unanswered",
52
+ "preview.minimum": "Minimum",
53
+ "preview.maximum": "Maximum",
54
+ "preview.average": "Average",
55
+ "preview.total": "Total",
56
+ "preview.true": "Checked",
57
+ "preview.false": "Not checked",
58
+ "preview.builder": "Form Builder",
59
+ "preview.respondent": "Respondent Preview",
60
+ "preview.export": "Download CSV",
61
+ "preview.schemaJson": "Schema JSON",
62
+ "preview.storage": "Storage",
63
+ "preview.memory": "Memory",
64
+ "preview.localStorage": "LocalStorage",
65
+ "preview.freeText": "Free-text responses",
66
+ "preview.resetResponses": "Reset responses",
67
+ "preview.resetConfirmation": "Delete every response for this form?",
68
+ "preview.confirmReset": "Confirm reset",
69
+ "preview.cancel": "Cancel",
70
+ "preview.resetSuccess": "All responses for this form were deleted.",
71
+ "preview.resetError": "Responses could not be deleted.",
72
+ "preview.resetUnavailable": "The selected storage does not support response reset.",
73
+ "builder.formBuilder": "Form builder",
74
+ "builder.moveUp": "Move {{title}} up",
75
+ "builder.moveDown": "Move {{title}} down",
76
+ "builder.delete": "Delete {{title}}",
77
+ "builder.deleteAction": "Delete",
78
+ "builder.questionTitle": "\u8CEA\u554F\u6587 / Question Title",
79
+ "builder.questionTitlePlaceholder": "Example: Tell us what we could improve",
80
+ "builder.newQuestionTitle": "New question",
81
+ "builder.type": "Type",
82
+ "builder.required": "Required",
83
+ "builder.minimum": "Minimum",
84
+ "builder.maximum": "Maximum",
85
+ "builder.options": "Options",
86
+ "builder.optionLabel": "\u9078\u629E\u80A2 / Option Label {{index}}",
87
+ "builder.optionLabelPlaceholder": "Example: Very satisfied",
88
+ "builder.newOptionLabel": "Option {{index}}",
89
+ "builder.remove": "Remove",
90
+ "builder.addOption": "Add option",
91
+ "builder.displayCondition": "Display condition",
92
+ "builder.alwaysVisible": "Always visible",
93
+ "builder.conditionOperator": "Condition operator",
94
+ "builder.conditionValue": "Condition value",
95
+ "builder.conditionTrue": "true",
96
+ "builder.conditionFalse": "false",
97
+ "builder.addQuestion": "Add question",
98
+ "builder.fieldType.text": "Text",
99
+ "builder.fieldType.textarea": "Textarea",
100
+ "builder.fieldType.number": "Number",
101
+ "builder.fieldType.rating": "Rating",
102
+ "builder.fieldType.select": "Select",
103
+ "builder.fieldType.multi-select": "Multi-select",
104
+ "builder.fieldType.checkbox": "Checkbox",
105
+ "builder.fieldType.radio": "Radio",
106
+ "builder.operator.equals": "equals",
107
+ "builder.operator.not_equals": "does not equal",
108
+ "builder.operator.contains": "contains",
109
+ "builder.operator.not_empty": "is not empty"
110
+ };
111
+ var sharedJapanese = {
112
+ "form.title": "\u304A\u5BA2\u69D8\u30A2\u30F3\u30B1\u30FC\u30C8",
113
+ "form.description": "\u3054\u5229\u7528\u4F53\u9A13\u306B\u3064\u3044\u3066\u304A\u805E\u304B\u305B\u304F\u3060\u3055\u3044\u3002\u5FC5\u9808\u9805\u76EE\u306B\u306F\u5370\u304C\u3042\u308A\u307E\u3059\u3002",
114
+ "form.submit": "\u56DE\u7B54\u3092\u9001\u4FE1",
115
+ "field.name.label": "\u304A\u540D\u524D",
116
+ "field.name.help": "{{min}}\u6587\u5B57\u4EE5\u4E0A\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
117
+ "field.name.placeholder": "\u5C71\u7530 \u592A\u90CE",
118
+ "field.reference.label": "\u53C2\u7167\u30B3\u30FC\u30C9",
119
+ "field.reference.help": "\u82F1\u5927\u6587\u5B573\u6587\u5B57\u3068\u6570\u5B573\u6841\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
120
+ "field.reference.placeholder": "ABC123",
121
+ "field.comments.label": "\u6539\u5584\u3057\u3066\u307B\u3057\u3044\u70B9",
122
+ "field.comments.placeholder": "\u7279\u306B\u91CD\u8981\u306A\u70B9\u3092\u3054\u8A18\u5165\u304F\u3060\u3055\u3044\u2026",
123
+ "field.age.label": "\u5E74\u9F62",
124
+ "field.age.placeholder": "18\u301C100",
125
+ "field.team.label": "\u62C5\u5F53\u30C1\u30FC\u30E0",
126
+ "field.team.help": "\u3054\u5229\u7528\u306B\u306A\u3063\u305F\u30C1\u30FC\u30E0\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
127
+ "field.channels.label": "\u304A\u554F\u3044\u5408\u308F\u305B\u65B9\u6CD5",
128
+ "field.channels.help": "1\u3064\u307E\u305F\u306F2\u3064\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
129
+ "field.consent.label": "\u3053\u306E\u56DE\u7B54\u3092\u5206\u6790\u306B\u5229\u7528\u3059\u308B\u3053\u3068\u306B\u540C\u610F\u3057\u307E\u3059\u3002",
130
+ "field.recommend.label": "\u4ED6\u306E\u65B9\u306B\u304A\u3059\u3059\u3081\u3057\u307E\u3059\u304B\uFF1F",
131
+ "field.rating.label": "\u4ECA\u56DE\u306E\u4F53\u9A13\u3092\u8A55\u4FA1\u3057\u3066\u304F\u3060\u3055\u3044",
132
+ "field.followup.label": "\u6B8B\u5FF5\u3060\u3063\u305F\u7406\u7531\u3092\u6559\u3048\u3066\u304F\u3060\u3055\u3044",
133
+ "option.team.product": "\u88FD\u54C1",
134
+ "option.team.support": "\u30B5\u30DD\u30FC\u30C8",
135
+ "option.team.sales": "\u55B6\u696D",
136
+ "option.channel.email": "\u30E1\u30FC\u30EB",
137
+ "option.channel.chat": "\u30C1\u30E3\u30C3\u30C8",
138
+ "option.channel.phone": "\u96FB\u8A71",
139
+ "option.yes": "\u306F\u3044",
140
+ "option.no": "\u3044\u3044\u3048",
141
+ "validation.required": "\u3053\u306E\u9805\u76EE\u306F\u5FC5\u9808\u3067\u3059\u3002",
142
+ "validation.invalidType": "\u6B63\u3057\u3044\u5F62\u5F0F\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
143
+ "validation.minLength": "{{min}}\u6587\u5B57\u4EE5\u4E0A\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
144
+ "validation.maxLength": "{{max}}\u6587\u5B57\u4EE5\u5185\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
145
+ "validation.pattern": "\u6307\u5B9A\u3055\u308C\u305F\u5F62\u5F0F\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
146
+ "validation.min": "{{min}}\u4EE5\u4E0A\u306E\u5024\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
147
+ "validation.max": "{{max}}\u4EE5\u4E0B\u306E\u5024\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
148
+ "validation.step": "{{step}}\u523B\u307F\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
149
+ "validation.invalidOption": "\u9078\u629E\u80A2\u304B\u3089\u9078\u3093\u3067\u304F\u3060\u3055\u3044\u3002",
150
+ "validation.minSelections": "{{min}}\u3064\u4EE5\u4E0A\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
151
+ "validation.maxSelections": "{{max}}\u3064\u4EE5\u5185\u3067\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
152
+ "validation.unknownField": "\u4E0D\u660E\u306A\u9805\u76EE\u304C\u56DE\u7B54\u306B\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002",
153
+ "preview.language": "\u8A00\u8A9E",
154
+ "preview.success": "\u56DE\u7B54\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002\u3042\u308A\u304C\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002",
155
+ "preview.error": "\u56DE\u7B54\u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",
156
+ "preview.analytics": "\u96C6\u8A08\u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9",
157
+ "preview.responses": "\u56DE\u7B54\u6570",
158
+ "preview.noResponses": "\u30D5\u30A9\u30FC\u30E0\u3092\u9001\u4FE1\u3059\u308B\u3068\u96C6\u8A08\u7D50\u679C\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002",
159
+ "preview.answered": "\u56DE\u7B54\u6E08\u307F",
160
+ "preview.unanswered": "\u672A\u56DE\u7B54",
161
+ "preview.minimum": "\u6700\u5C0F",
162
+ "preview.maximum": "\u6700\u5927",
163
+ "preview.average": "\u5E73\u5747",
164
+ "preview.total": "\u5408\u8A08",
165
+ "preview.true": "\u30C1\u30A7\u30C3\u30AF\u6E08\u307F",
166
+ "preview.false": "\u672A\u30C1\u30A7\u30C3\u30AF",
167
+ "preview.builder": "\u30D5\u30A9\u30FC\u30E0\u30D3\u30EB\u30C0\u30FC",
168
+ "preview.respondent": "\u56DE\u7B54\u30D7\u30EC\u30D3\u30E5\u30FC",
169
+ "preview.export": "CSV\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9",
170
+ "preview.schemaJson": "\u30B9\u30AD\u30FC\u30DEJSON",
171
+ "preview.storage": "\u30B9\u30C8\u30EC\u30FC\u30B8",
172
+ "preview.memory": "\u30E1\u30E2\u30EA",
173
+ "preview.localStorage": "LocalStorage",
174
+ "preview.freeText": "\u81EA\u7531\u8A18\u8FF0\u56DE\u7B54",
175
+ "preview.resetResponses": "\u56DE\u7B54\u30C7\u30FC\u30BF\u3092\u5168\u4EF6\u30AF\u30EA\u30A2",
176
+ "preview.resetConfirmation": "\u3053\u306E\u30D5\u30A9\u30FC\u30E0\u306E\u56DE\u7B54\u3092\u3059\u3079\u3066\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F",
177
+ "preview.confirmReset": "\u524A\u9664\u3092\u78BA\u5B9A",
178
+ "preview.cancel": "\u30AD\u30E3\u30F3\u30BB\u30EB",
179
+ "preview.resetSuccess": "\u3053\u306E\u30D5\u30A9\u30FC\u30E0\u306E\u56DE\u7B54\u3092\u3059\u3079\u3066\u524A\u9664\u3057\u307E\u3057\u305F\u3002",
180
+ "preview.resetError": "\u56DE\u7B54\u3092\u524A\u9664\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002",
181
+ "preview.resetUnavailable": "\u9078\u629E\u4E2D\u306E\u30B9\u30C8\u30EC\u30FC\u30B8\u306F\u56DE\u7B54\u30EA\u30BB\u30C3\u30C8\u306B\u5BFE\u5FDC\u3057\u3066\u3044\u307E\u305B\u3093\u3002",
182
+ "builder.formBuilder": "\u30D5\u30A9\u30FC\u30E0\u30D3\u30EB\u30C0\u30FC",
183
+ "builder.moveUp": "\u300C{{title}}\u300D\u3092\u4E0A\u3078\u79FB\u52D5",
184
+ "builder.moveDown": "\u300C{{title}}\u300D\u3092\u4E0B\u3078\u79FB\u52D5",
185
+ "builder.delete": "\u300C{{title}}\u300D\u3092\u524A\u9664",
186
+ "builder.deleteAction": "\u524A\u9664",
187
+ "builder.questionTitle": "\u8CEA\u554F\u6587 / Question Title",
188
+ "builder.questionTitlePlaceholder": "\u4F8B: \u3054\u610F\u898B\u30FB\u3054\u8981\u671B\u3092\u3054\u8A18\u5165\u304F\u3060\u3055\u3044",
189
+ "builder.newQuestionTitle": "\u65B0\u3057\u3044\u8CEA\u554F",
190
+ "builder.type": "\u7A2E\u985E",
191
+ "builder.required": "\u5FC5\u9808",
192
+ "builder.minimum": "\u6700\u5C0F\u5024",
193
+ "builder.maximum": "\u6700\u5927\u5024",
194
+ "builder.options": "\u9078\u629E\u80A2",
195
+ "builder.optionLabel": "\u9078\u629E\u80A2 / Option Label {{index}}",
196
+ "builder.optionLabelPlaceholder": "\u4F8B: \u5927\u5909\u6E80\u8DB3",
197
+ "builder.newOptionLabel": "\u9078\u629E\u80A2 {{index}}",
198
+ "builder.remove": "\u524A\u9664",
199
+ "builder.addOption": "\u9078\u629E\u80A2\u3092\u8FFD\u52A0",
200
+ "builder.displayCondition": "\u8868\u793A\u6761\u4EF6",
201
+ "builder.alwaysVisible": "\u5E38\u306B\u8868\u793A",
202
+ "builder.conditionOperator": "\u6761\u4EF6\u6F14\u7B97\u5B50",
203
+ "builder.conditionValue": "\u6761\u4EF6\u5024",
204
+ "builder.conditionTrue": "\u306F\u3044",
205
+ "builder.conditionFalse": "\u3044\u3044\u3048",
206
+ "builder.addQuestion": "\u8CEA\u554F\u3092\u8FFD\u52A0",
207
+ "builder.fieldType.text": "\u30C6\u30AD\u30B9\u30C8",
208
+ "builder.fieldType.textarea": "\u30C6\u30AD\u30B9\u30C8\u30A8\u30EA\u30A2",
209
+ "builder.fieldType.number": "\u6570\u5024",
210
+ "builder.fieldType.rating": "\u8A55\u4FA1",
211
+ "builder.fieldType.select": "\u5358\u4E00\u9078\u629E",
212
+ "builder.fieldType.multi-select": "\u8907\u6570\u9078\u629E",
213
+ "builder.fieldType.checkbox": "\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9",
214
+ "builder.fieldType.radio": "\u30E9\u30B8\u30AA\u30DC\u30BF\u30F3",
215
+ "builder.operator.equals": "\u7B49\u3057\u3044",
216
+ "builder.operator.not_equals": "\u7B49\u3057\u304F\u306A\u3044",
217
+ "builder.operator.contains": "\u542B\u3080",
218
+ "builder.operator.not_empty": "\u7A7A\u3067\u306F\u306A\u3044"
219
+ };
220
+ var mockCatalogs = { en: sharedEnglish, ja: sharedJapanese };
221
+ function createMockTranslationAdapter(catalogs = mockCatalogs, fallbackLocale = "en") {
222
+ return {
223
+ translate(key, locale, params = {}) {
224
+ const template = catalogs[locale]?.[key] ?? catalogs[fallbackLocale]?.[key] ?? key;
225
+ return template.replace(
226
+ /\{\{(\w+)\}\}/g,
227
+ (token, name) => Object.hasOwn(params, name) ? String(params[name]) : token
228
+ );
229
+ }
230
+ };
231
+ }
232
+ var mockTranslator = createMockTranslationAdapter();
233
+ export {
234
+ createMockTranslationAdapter,
235
+ mockCatalogs,
236
+ mockTranslator
237
+ };
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@form-engine-ts/translator-mock",
3
+ "version": "1.0.0",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "type": "module",
8
+ "sideEffects": false,
9
+ "files": [
10
+ "dist",
11
+ "README.md",
12
+ "LICENSE"
13
+ ],
14
+ "main": "./dist/index.cjs",
15
+ "module": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js",
21
+ "require": "./dist/index.cjs"
22
+ }
23
+ },
24
+ "license": "MIT",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/nitta-a/form-engine-ts.git",
28
+ "directory": "packages/translator-mock"
29
+ },
30
+ "bugs": {
31
+ "url": "https://github.com/nitta-a/form-engine-ts/issues"
32
+ },
33
+ "homepage": "https://github.com/nitta-a/form-engine-ts#readme",
34
+ "keywords": [
35
+ "form",
36
+ "translation",
37
+ "mock",
38
+ "i18n",
39
+ "typescript"
40
+ ],
41
+ "dependencies": {
42
+ "@form-engine-ts/core": "1.0.0"
43
+ },
44
+ "scripts": {
45
+ "build": "tsup src/index.ts --format esm,cjs --dts --clean --external @form-engine-ts/core",
46
+ "check": "biome check . && tsc --noEmit",
47
+ "test": "vitest run --globals",
48
+ "typecheck": "tsc --noEmit"
49
+ }
50
+ }