@acorex/platform-generator 20.3.0-next.1 → 20.3.0-next.10

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/package.json CHANGED
@@ -1,17 +1,8 @@
1
1
  {
2
2
  "name": "@acorex/platform-generator",
3
- "version": "20.3.0-next.1",
4
- "dependencies": {
5
- "@nx/devkit": "19.2.2",
6
- "tslib": "^2.3.0"
7
- },
3
+ "version": "20.3.0-next.10",
8
4
  "peerDependencies": {
9
- "@acorex/platform": ">=19.0.0",
10
- "@acorex/modules": ">=19.0.0",
11
- "@acorex/styles": ">=19.0.0",
12
- "@acorex/core": ">=19.0.0",
13
- "@acorex/components": ">=19.0.0",
14
- "@acorex/connectivity": ">=19.0.0"
5
+ "@acorex/modules": ">=20.0.0"
15
6
  },
16
7
  "type": "commonjs",
17
8
  "main": "./src/index.js",
@@ -21,5 +12,6 @@
21
12
  "bin": {
22
13
  "acx-create-entity": "./src/bin/interactive-entity-creator.js"
23
14
  },
15
+ "sideEffects": false,
24
16
  "types": "./src/index.d.ts"
25
17
  }
@@ -27,18 +27,18 @@ function validateName(name) {
27
27
  if (!name || name.trim() === '') {
28
28
  return 'Name cannot be empty.';
29
29
  }
30
-
30
+
31
31
  // Ensure name is not just a number
32
32
  if (/^\d+$/.test(name)) {
33
33
  return 'Name cannot be just a number. Please include at least one letter.';
34
34
  }
35
-
35
+
36
36
  // Less restrictive validation that allows non-Latin characters
37
37
  // Just check for spaces, special characters, and make sure it starts with a letter or non-Latin character
38
38
  if (/^[^a-zA-Z\p{L}]|\s|[^\w\p{L}]/u.test(name)) {
39
39
  return 'Name must start with a letter and cannot contain spaces or special characters.';
40
40
  }
41
-
41
+
42
42
  return null; // No error
43
43
  }
44
44
 
@@ -48,15 +48,13 @@ const isDryRun = process.argv.includes('--dryRun');
48
48
  // Create an interface for readline
49
49
  const rl = readline.createInterface({
50
50
  input: process.stdin,
51
- output: process.stdout
51
+ output: process.stdout,
52
52
  });
53
53
 
54
54
  // Define widget catalog - copied from widget-catalog.ts
55
55
  const widgetCatalog = {
56
56
  text: 'text-editor',
57
- email: 'email-editor',
58
57
  password: 'password-editor',
59
- phone: 'phone-editor',
60
58
  largeText: 'large-text-editor',
61
59
  richText: 'rich-text-editor',
62
60
  number: 'number-editor',
@@ -66,7 +64,6 @@ const widgetCatalog = {
66
64
  toggle: 'toggle-editor',
67
65
  dateTime: 'date-time-editor',
68
66
  color: 'color-editor',
69
- link: 'link-editor',
70
67
  contact: 'contact-editor',
71
68
  tagable: 'tagable-editor',
72
69
  file: 'file',
@@ -78,15 +75,13 @@ const widgetCatalog = {
78
75
  table: 'table-editor',
79
76
  qrcode: 'qrcode',
80
77
  singleFileBox: 'single-file-box-editor',
81
- metaData: 'meta-data-editor'
78
+ metaData: 'meta-data-editor',
82
79
  };
83
80
 
84
81
  // Define widget to data type mapping
85
82
  const widgetToDataType = {
86
83
  'text-editor': 'string',
87
- 'email-editor': 'string',
88
84
  'password-editor': 'string',
89
- 'phone-editor': 'string',
90
85
  'large-text-editor': 'string',
91
86
  'rich-text-editor': 'string',
92
87
  'number-editor': 'number',
@@ -96,35 +91,32 @@ const widgetToDataType = {
96
91
  'toggle-editor': 'boolean',
97
92
  'date-time-editor': 'date',
98
93
  'color-editor': 'string',
99
- 'link-editor': 'string',
100
94
  'contact-editor': 'object',
101
95
  'tagable-editor': 'string',
102
- 'file': 'object',
103
- 'gallery': 'object',
104
- 'signature': 'string',
105
- 'map': 'object',
96
+ file: 'object',
97
+ gallery: 'object',
98
+ signature: 'string',
99
+ map: 'object',
106
100
  'lookup-editor': 'object',
107
101
  'selection-list-editor': 'array',
108
102
  'table-editor': 'array',
109
- 'qrcode': 'string',
103
+ qrcode: 'string',
110
104
  'single-file-box-editor': 'object',
111
- 'meta-data-editor': 'object'
105
+ 'meta-data-editor': 'object',
112
106
  };
113
107
 
114
108
  // Widget groups for better display
115
109
  const widgetGroups = {
116
- 'Basic': ['text-editor', 'large-text-editor', 'rich-text-editor', 'number-editor', 'checkbox-editor', 'toggle-editor'],
117
- 'Input': ['email-editor', 'password-editor', 'phone-editor', 'date-time-editor', 'color-editor'],
118
- 'Complex': ['select-editor', 'lookup-editor', 'selection-list-editor', 'table-editor'],
119
- 'Media': ['file', 'gallery', 'signature', 'map', 'qrcode']
110
+ Basic: ['text-editor', 'large-text-editor', 'rich-text-editor', 'number-editor', 'checkbox-editor', 'toggle-editor'],
111
+ Input: ['password-editor', 'date-time-editor', 'color-editor'],
112
+ Complex: ['select-editor', 'lookup-editor', 'selection-list-editor', 'table-editor'],
113
+ Media: ['file', 'gallery', 'signature', 'map', 'qrcode'],
120
114
  };
121
115
 
122
116
  // Define default colSpan based on widget type
123
117
  const widgetToColSpan = {
124
118
  'text-editor': 6,
125
- 'email-editor': 6,
126
119
  'password-editor': 6,
127
- 'phone-editor': 6,
128
120
  'large-text-editor': 12,
129
121
  'rich-text-editor': 12,
130
122
  'number-editor': 4,
@@ -134,19 +126,18 @@ const widgetToColSpan = {
134
126
  'toggle-editor': 4,
135
127
  'date-time-editor': 6,
136
128
  'color-editor': 4,
137
- 'link-editor': 6,
138
129
  'contact-editor': 8,
139
130
  'tagable-editor': 8,
140
- 'file': 6,
141
- 'gallery': 12,
142
- 'signature': 8,
143
- 'map': 12,
131
+ file: 6,
132
+ gallery: 12,
133
+ signature: 8,
134
+ map: 12,
144
135
  'lookup-editor': 6,
145
136
  'selection-list-editor': 8,
146
137
  'table-editor': 12,
147
- 'qrcode': 6,
138
+ qrcode: 6,
148
139
  'single-file-box-editor': 6,
149
- 'meta-data-editor': 8
140
+ 'meta-data-editor': 8,
150
141
  };
151
142
 
152
143
  // Create data object to store all user input
@@ -163,13 +154,13 @@ const data = {
163
154
  enableSorts: [],
164
155
  enableFilters: [],
165
156
  enableInlineFilters: [],
166
- inColumn: [] // اضافه کردن آرایه جدید برای ذخیره وضعیت نمایش در ستون
157
+ inColumn: [], // اضافه کردن آرایه جدید برای ذخیره وضعیت نمایش در ستون
167
158
  };
168
159
 
169
160
  // Run the prompts in sequence
170
161
  async function runPrompts() {
171
162
  console.log('\n=== AcoreX Platform Interactive Entity Generator ===\n');
172
-
163
+
173
164
  // Get module name with validation
174
165
  while (true) {
175
166
  data.moduleName = await askQuestion('Module name: ');
@@ -180,7 +171,7 @@ async function runPrompts() {
180
171
  break;
181
172
  }
182
173
  }
183
-
174
+
184
175
  // Get entity name with validation
185
176
  while (true) {
186
177
  data.name = await askQuestion('Entity name: ');
@@ -191,7 +182,7 @@ async function runPrompts() {
191
182
  break;
192
183
  }
193
184
  }
194
-
185
+
195
186
  // Get properties
196
187
  console.log('\nEnter properties (type "done" when finished):');
197
188
  let propCount = 1;
@@ -201,50 +192,53 @@ async function runPrompts() {
201
192
  break;
202
193
  }
203
194
  data.properties.push(prop);
204
-
195
+
205
196
  // Get widget for this property
206
197
  const widget = await selectWidget(`Select widget for "${prop}": `);
207
198
  data.widgets.push(widget);
208
-
199
+
209
200
  // Automatically determine data type based on widget
210
201
  const dataType = widgetToDataType[widget] || 'string';
211
202
  data.dataTypes.push(dataType);
212
-
203
+
213
204
  // Ask if this property is required
214
205
  const isRequired = await askQuestion(`Is "${prop}" required? (y/n): `, 'n');
215
206
  if (isRequired.toLowerCase() === 'y') {
216
207
  data.required.push(prop);
217
208
  }
218
-
209
+
219
210
  // Ask if this property should be displayed in columns
220
211
  const showInColumn = await askQuestion(`Show "${prop}" in table columns? (y/n): `, 'y');
221
212
  data.inColumn.push(showInColumn.toLowerCase() === 'y' ? 'true' : 'false');
222
-
213
+
223
214
  // Get colSpan for this property (1-12)
224
215
  const defaultColSpan = widgetToColSpan[widget] || 6;
225
216
  const colSpan = await askQuestion(`Column span for "${prop}" (1-12): `, defaultColSpan.toString());
226
217
  data.colSpans.push(parseInt(colSpan));
227
-
218
+
228
219
  // Get order for this property
229
220
  const defaultOrder = propCount; // Default order is sequential
230
- const order = await askQuestion(`Display order for "${prop}" (default: ${defaultOrder}): `, defaultOrder.toString());
221
+ const order = await askQuestion(
222
+ `Display order for "${prop}" (default: ${defaultOrder}): `,
223
+ defaultOrder.toString(),
224
+ );
231
225
  data.orders.push(parseInt(order));
232
-
226
+
233
227
  // Ask about sort
234
228
  const enableSort = await askQuestion(`Enable sorting for "${prop}"? (y/n): `, 'y');
235
229
  data.enableSorts.push(enableSort.toLowerCase() === 'y' ? 'true' : 'false');
236
-
230
+
237
231
  // Ask about filter
238
232
  const enableFilter = await askQuestion(`Enable filtering for "${prop}"? (y/n): `, 'y');
239
233
  data.enableFilters.push(enableFilter.toLowerCase() === 'y' ? 'true' : 'false');
240
-
234
+
241
235
  // Ask about inline filter
242
236
  const enableInlineFilter = await askQuestion(`Enable inline filtering for "${prop}"? (y/n): `, 'n');
243
237
  data.enableInlineFilters.push(enableInlineFilter.toLowerCase() === 'y' ? 'true' : 'false');
244
-
238
+
245
239
  propCount++;
246
240
  }
247
-
241
+
248
242
  // Get icon
249
243
  console.log('\nSelect an icon:');
250
244
  console.log('1. Default icon (fa-light fa-default)');
@@ -253,28 +247,28 @@ async function runPrompts() {
253
247
  console.log('4. Shopping cart (fa-solid fa-shopping-cart)');
254
248
  console.log('5. File (fa-solid fa-file)');
255
249
  console.log('6. Custom icon');
256
-
250
+
257
251
  const iconChoice = await askQuestion('Select option (1-6): ', '1');
258
252
  const iconOptions = [
259
253
  'fa-light fa-default',
260
254
  'fa-solid fa-box',
261
255
  'fa-solid fa-user',
262
256
  'fa-solid fa-shopping-cart',
263
- 'fa-solid fa-file'
257
+ 'fa-solid fa-file',
264
258
  ];
265
-
259
+
266
260
  if (iconChoice >= 1 && iconChoice <= 5) {
267
261
  data.icon = iconOptions[iconChoice - 1];
268
262
  } else if (iconChoice == 6) {
269
263
  data.icon = await askQuestion('Enter custom icon (format: fa-solid fa-xyz): ', 'fa-solid fa-star');
270
264
  }
271
-
265
+
272
266
  // Show summary
273
267
  console.log('\n=== Summary ===');
274
268
  console.log(`Module: ${data.moduleName}`);
275
269
  console.log(`Entity: ${data.name}`);
276
270
  console.log('Properties:');
277
-
271
+
278
272
  // Sort properties by order for display
279
273
  const propSummary = data.properties.map((prop, i) => ({
280
274
  name: prop,
@@ -286,18 +280,20 @@ async function runPrompts() {
286
280
  enableSort: data.enableSorts[i],
287
281
  enableFilter: data.enableFilters[i],
288
282
  enableInlineFilter: data.enableInlineFilters[i],
289
- inColumn: data.inColumn[i]
283
+ inColumn: data.inColumn[i],
290
284
  }));
291
-
285
+
292
286
  // Sort by order
293
287
  propSummary.sort((a, b) => a.order - b.order);
294
-
295
- propSummary.forEach(prop => {
296
- console.log(` - ${prop.name} (Widget: ${prop.widget}, Type: ${prop.dataType}${prop.required ? ', Required' : ''}, ColSpan: ${prop.colSpan}, Order: ${prop.order}, Sort: ${prop.enableSort ? 'Enabled' : 'Disabled'}, Filter: ${prop.enableFilter ? 'Enabled' : 'Disabled'}, Inline Filter: ${prop.enableInlineFilter ? 'Enabled' : 'Disabled'}, In Column: ${prop.inColumn === 'true' ? 'Yes' : 'No'})`);
288
+
289
+ propSummary.forEach((prop) => {
290
+ console.log(
291
+ ` - ${prop.name} (Widget: ${prop.widget}, Type: ${prop.dataType}${prop.required ? ', Required' : ''}, ColSpan: ${prop.colSpan}, Order: ${prop.order}, Sort: ${prop.enableSort ? 'Enabled' : 'Disabled'}, Filter: ${prop.enableFilter ? 'Enabled' : 'Disabled'}, Inline Filter: ${prop.enableInlineFilter ? 'Enabled' : 'Disabled'}, In Column: ${prop.inColumn === 'true' ? 'Yes' : 'No'})`,
292
+ );
297
293
  });
298
-
294
+
299
295
  console.log(`Icon: ${data.icon}`);
300
-
296
+
301
297
  const confirm = await askQuestion('\nGenerate entity with these settings? (y/n): ', 'y');
302
298
  if (confirm.toLowerCase() === 'y') {
303
299
  runNxGenerator();
@@ -309,9 +305,9 @@ async function runPrompts() {
309
305
 
310
306
  // Helper function to ask questions and get answers
311
307
  function askQuestion(question, defaultAnswer) {
312
- return new Promise(resolve => {
308
+ return new Promise((resolve) => {
313
309
  const prompt = defaultAnswer ? `${question} [${defaultAnswer}] ` : question;
314
-
310
+
315
311
  rl.question(prompt, (answer) => {
316
312
  // If answer is empty and there's a default, use the default
317
313
  const result = answer.trim() === '' && defaultAnswer ? defaultAnswer : answer.trim();
@@ -324,7 +320,7 @@ function askQuestion(question, defaultAnswer) {
324
320
  async function selectWidget(prompt) {
325
321
  console.log(`\n${prompt}`);
326
322
  console.log('Available widgets (you can type to filter):');
327
-
323
+
328
324
  // Display widgets by groups
329
325
  for (const [groupName, groupWidgets] of Object.entries(widgetGroups)) {
330
326
  console.log(`\n${groupName} widgets:`);
@@ -333,17 +329,17 @@ async function selectWidget(prompt) {
333
329
  console.log(` ${(index + 1).toString().padStart(2)}: ${widget} (${widgetKey})`);
334
330
  });
335
331
  }
336
-
332
+
337
333
  // Handling widget selection with filtering
338
334
  let selectedWidget = '';
339
335
  while (!selectedWidget) {
340
336
  const input = await askQuestion('\nEnter widget name or number (or part of name to filter): ');
341
-
337
+
342
338
  // Check if input is a number
343
339
  if (!isNaN(input) && input > 0 && input <= Object.values(widgetCatalog).length) {
344
340
  const allWidgets = Object.values(widgetCatalog);
345
341
  selectedWidget = allWidgets[parseInt(input) - 1];
346
- }
342
+ }
347
343
  // Check if input exactly matches a widget name
348
344
  else if (Object.values(widgetCatalog).includes(input)) {
349
345
  selectedWidget = input;
@@ -354,55 +350,53 @@ async function selectWidget(prompt) {
354
350
  }
355
351
  // Filter widgets by input
356
352
  else {
357
- const filteredWidgets = Object.entries(widgetCatalog)
358
- .filter(([key, value]) =>
359
- key.toLowerCase().includes(input.toLowerCase()) ||
360
- value.toLowerCase().includes(input.toLowerCase())
361
- );
362
-
353
+ const filteredWidgets = Object.entries(widgetCatalog).filter(
354
+ ([key, value]) =>
355
+ key.toLowerCase().includes(input.toLowerCase()) || value.toLowerCase().includes(input.toLowerCase()),
356
+ );
357
+
363
358
  if (filteredWidgets.length === 1) {
364
359
  selectedWidget = filteredWidgets[0][1]; // Pick the only match
365
- }
366
- else if (filteredWidgets.length > 1) {
360
+ } else if (filteredWidgets.length > 1) {
367
361
  console.log('\nFiltered widgets:');
368
362
  filteredWidgets.forEach(([key, value], index) => {
369
363
  console.log(` ${(index + 1).toString().padStart(2)}: ${value} (${key})`);
370
364
  });
371
-
365
+
372
366
  const selection = await askQuestion('Select number or continue typing to filter more: ');
373
367
  if (!isNaN(selection) && selection > 0 && selection <= filteredWidgets.length) {
374
368
  selectedWidget = filteredWidgets[parseInt(selection) - 1][1];
375
369
  }
376
- }
377
- else {
370
+ } else {
378
371
  console.log('No matches found. Try again.');
379
372
  }
380
373
  }
381
374
  }
382
-
375
+
383
376
  return selectedWidget;
384
377
  }
385
378
 
386
379
  // Run the NX generator with collected data
387
380
  function runNxGenerator() {
388
381
  // Handle special cases and ensure proper formatting
389
-
382
+
390
383
  // For empty required array, use "_none_"
391
- const requiredValue = data.required.length === 0 ? "_none_" : data.required.join(',');
392
-
384
+ const requiredValue = data.required.length === 0 ? '_none_' : data.required.join(',');
385
+
393
386
  // Ensure single values for colSpans and orders have trailing commas
394
387
  let colSpansStr = data.colSpans.join(',');
395
388
  if (data.colSpans.length === 1) {
396
389
  colSpansStr = colSpansStr + ',';
397
390
  }
398
-
391
+
399
392
  let ordersStr = data.orders.join(',');
400
393
  if (data.orders.length === 1) {
401
394
  ordersStr = ordersStr + ',';
402
395
  }
403
-
396
+
404
397
  // Prepare arguments properly
405
- const command = `cd "${projectRoot}" && npx nx g @acorex-platform/generator:create-module-entity` +
398
+ const command =
399
+ `cd "${projectRoot}" && npx nx g @acorex-platform/generator:create-module-entity` +
406
400
  ` --moduleName=${data.moduleName}` +
407
401
  ` --name=${data.name}` +
408
402
  ` --properties=${data.properties.join(',')}` +
@@ -416,22 +410,22 @@ function runNxGenerator() {
416
410
  ` --enableInlineFilters=${data.enableInlineFilters.join(',')}` +
417
411
  ` --inColumn=${data.inColumn.join(',')}` +
418
412
  (isDryRun ? ' --dryRun' : '');
419
-
413
+
420
414
  console.log(`\nRunning: ${command}`);
421
-
415
+
422
416
  try {
423
417
  // Execute the command as a shell command to ensure proper environment
424
418
  const { execSync } = require('child_process');
425
- const options = {
419
+ const options = {
426
420
  stdio: 'inherit',
427
- shell: true
421
+ shell: true,
428
422
  };
429
-
423
+
430
424
  execSync(command, options);
431
425
  console.log(`\nGenerator completed successfully`);
432
426
  } catch (error) {
433
427
  console.error(`\nGenerator failed with error: ${error.message}`);
434
-
428
+
435
429
  // Show more detailed error information
436
430
  if (error.stderr) {
437
431
  console.error(`Error details: ${error.stderr.toString()}`);
@@ -442,7 +436,7 @@ function runNxGenerator() {
442
436
  }
443
437
 
444
438
  // Start the prompts
445
- runPrompts().catch(err => {
439
+ runPrompts().catch((err) => {
446
440
  console.error('An error occurred:', err);
447
441
  rl.close();
448
- });
442
+ });
@@ -41,11 +41,11 @@ export class MyTranslationLoader implements AXTranslationLoader {
41
41
  useValue: translationConfig({
42
42
  preload: {
43
43
  langs: ['en-US'],
44
- scopes: ['common'],
44
+ scopes: ['acorex', 'general'],
45
45
  },
46
46
  defaults: {
47
47
  lang: 'en-US',
48
- scope: 'common',
48
+ scope: 'general',
49
49
  },
50
50
  }),
51
51
  },
@@ -153,7 +153,7 @@ export async function sampleFactory(injector: Injector): Promise<AXPEntity | nul
153
153
  },
154
154
  list: {
155
155
  execute: async (e: any) => {
156
- return await dataService.query({ skip: e.skip, take: e.take, filter: e.filter, sort: e.sort });
156
+ return await dataService.query(e);
157
157
  },
158
158
  type: AXPEntityQueryType.List,
159
159
  },
@@ -1,404 +0,0 @@
1
- {
2
- "search": "Search",
3
- "type": "Type",
4
- "yes": "yes",
5
- "no": "No",
6
- "allItems": "All Items",
7
- "confirm": "Confirm",
8
- "welcome": "Welcome",
9
- "okay": "Okay",
10
- "accept": "Accept",
11
- "decline": "Decline",
12
- "cancel": "Cancel",
13
- "close": "Close",
14
- "clear": "Clear",
15
- "select": "Select...",
16
- "canceled": "Canceled",
17
- "failed": "Failed",
18
- "remove": "Remove",
19
- "pinned": "Pinned",
20
- "recent": "Recent",
21
- "edit": "Edit",
22
- "delete": "Delete",
23
- "refresh": "Refresh",
24
- "deleteItems": "Delete Items",
25
- "detail": "Details",
26
- "actions": "Actions",
27
- "archive": "Archive",
28
- "create": "Create",
29
- "choose": "Choose",
30
- "configs": "Configs",
31
- "no-result-found": "No results found",
32
- "no-result-for": "No results for &nbsp<b>\"{{ exp }}\"</b>",
33
- "searching": "searching ...",
34
- "save": "Save",
35
- "save-as": "Save As...",
36
- "save-changes": "Save Changes",
37
- "title": "Title",
38
- "subtitle": "Subtitle",
39
- "description": "Description",
40
- "code": "Code",
41
- "permissions": "Permissions",
42
- "status": "Status",
43
- "address": "Address",
44
- "name": "Name",
45
- "uniquename": "Unique Name",
46
- "size": "Size",
47
- "add-item": "Add Item",
48
- "color": "Color",
49
- "display": "Display",
50
- "min-value": "Min Value",
51
- "value": "Value",
52
- "max-value": "Max Value",
53
- "refresh-rate": "Refresh Rate",
54
- "condition": "Condition",
55
- "loading": "loading",
56
- "firstname": "Firstname",
57
- "lastname": "Lastname",
58
- "email": "Email",
59
- "employeeCode": "Employee Code",
60
- "position": "Position",
61
- "employmentType": "Employment Type",
62
- "hireDate": "Hire Date",
63
- "required": "Required",
64
- "submit": "Submit",
65
- "viewAll": "View All",
66
- "viewLess": "View Less",
67
- "processing": "Processing...",
68
- "redirecting": "Redirecting...",
69
- "apply": "Apply",
70
- "reset": "Reset",
71
- "home": "Home",
72
- "export": "Export",
73
- "print": "Print",
74
- "import": "Import",
75
- "settings": "Settings",
76
- "create-new": "Create New",
77
- "continue": "Continue",
78
- "discard": "Discard",
79
- "overview": "Overview",
80
- "history": "History",
81
- "comments": "Comments",
82
- "itemsSelected": "Items Selected",
83
- "unselect": "Unselect",
84
- "information": "Information",
85
- "unknown": "Unknown",
86
- "category": "Category",
87
- "categories": "Categories",
88
- "province": "Province",
89
- "provinces": "Provinces",
90
- "country": "Country",
91
- "countries": "Countries",
92
- "city": "City",
93
- "cities": "Cities",
94
- "allItem": "All Item",
95
- "geo": "Geo",
96
- "currencies": "Currencies",
97
- "currency": "Currency",
98
- "dialogs": {
99
- "delete": {
100
- "title": "Delete Confirmation",
101
- "message": "Are you sure you want to delete the selected item(s)? This action is permanent and cannot be undone."
102
- }
103
- },
104
- "authentication": {
105
- "with-google": "Sign in with Google",
106
- "with-apple": "Sign in with Apple"
107
- },
108
-
109
- "dateTime": {
110
- "weekdays": {
111
- "short": {
112
- "0": "Sun",
113
- "1": "Mon",
114
- "2": "Tue",
115
- "3": "Wed",
116
- "4": "Thu",
117
- "5": "Fri",
118
- "6": "Sat"
119
- },
120
- "long": {
121
- "0": "Sunday",
122
- "1": "Monday",
123
- "2": "Tuesday",
124
- "3": "Wednesday",
125
- "4": "Thursday",
126
- "5": "Friday",
127
- "6": "Saturday"
128
- }
129
- },
130
- "months": {
131
- "georgian": {
132
- "short": {
133
- "0": "Jan",
134
- "1": "Feb",
135
- "2": "Mar",
136
- "3": "Apr",
137
- "4": "May",
138
- "5": "Jun",
139
- "6": "Jul",
140
- "7": "Aug",
141
- "8": "Sep",
142
- "9": "Oct",
143
- "10": "Nov",
144
- "11": "Dec"
145
- },
146
- "long": {
147
- "0": "January",
148
- "1": "February",
149
- "2": "March",
150
- "3": "April",
151
- "4": "May",
152
- "5": "June",
153
- "6": "July",
154
- "7": "August",
155
- "8": "September",
156
- "9": "October",
157
- "10": "November",
158
- "11": "December"
159
- }
160
- },
161
- "jalali": {
162
- "short": {
163
- "0": "Far",
164
- "1": "Ordi",
165
- "2": "Khor",
166
- "3": "Tir",
167
- "4": "Mordad",
168
- "5": "Shah",
169
- "6": "Mehr",
170
- "7": "Aban",
171
- "8": "Azar",
172
- "9": "Dey",
173
- "10": "Bah",
174
- "11": "Esf"
175
- },
176
- "long": {
177
- "0": "Farvardin",
178
- "1": "Ordibehesht",
179
- "2": "Khordad",
180
- "3": "Tir",
181
- "4": "Mordad",
182
- "5": "Shahrivar",
183
- "6": "Mehr",
184
- "7": "Aban",
185
- "8": "Azar",
186
- "9": "Dey",
187
- "10": "Bahman",
188
- "11": "Esfand"
189
- }
190
- }
191
- },
192
- "dayTime": {
193
- "am": "am",
194
- "pm": "pm",
195
- "m": "m",
196
- "a": "a",
197
- "p": "p"
198
- },
199
- "set": "Set",
200
- "today": "Today",
201
- "now": "Now",
202
- "hour": "Hour",
203
- "minute": "Minute",
204
- "second": "Second",
205
- "date": "Date",
206
- "time": "Time",
207
- "duration": {
208
- "format_second": "{0} second(s)",
209
- "format_minute": "{0} minute(s)"
210
- }
211
- },
212
- "validation": {
213
- "messages": {
214
- "title": "Please fix the following error(s):",
215
- "required": "This field is required",
216
- "email": "Please enter a valid email address!",
217
- "phone": "Please enter a valid phone number!",
218
- "url": "Please enter a valid url!",
219
- "invalid-rull-name": "Invalid rule name: &nbsp<b>\"{{ name }}\"</b>"
220
- }
221
- },
222
- "selectbox": {
223
- "popover": {
224
- "title": "Choose an items..."
225
- }
226
- },
227
- "datepicker": {
228
- "popover": {
229
- "title": "Choose a date..."
230
- }
231
- },
232
- "datapager": {
233
- "info": {
234
- "text": "[page] of [totalPages] pages ([totalItems] items)"
235
- }
236
- },
237
- "uploader": {
238
- "zone": {
239
- "text": "Drop files to upload them",
240
- "drag": "Drag & Drop or ",
241
- "choose": "Choose File",
242
- "to-upload": " to Upload"
243
- }
244
- },
245
- "action-sheet": {
246
- "title": "Action Sheet..."
247
- },
248
- "entity": {
249
- "home": "Home",
250
- "public-view": "Public Views",
251
- "action": "Action",
252
- "actions": "Actions",
253
- "columns": "Columns",
254
- "sort": "Sort",
255
- "sorts": "Sorts",
256
- "no-sort": "No Sorts Selected",
257
- "ask-sort": "Please select field(s) that you want to sort",
258
- "add-field": "Add Field",
259
- "modify": "Modify"
260
- },
261
- "widget": {
262
- "phone": {
263
- "mobile": "Mobile",
264
- "home": "Home",
265
- "work": "Work",
266
- "other": "Other"
267
- },
268
- "lookup": {
269
- "search": "Search on "
270
- },
271
- "tasklist": {
272
- "title": "Tasks",
273
- "pending": "pending",
274
- "completed": "completed",
275
- "noTasks": "No tasks available",
276
- "user": "User"
277
- },
278
- "notification": {
279
- "new": "New",
280
- "all": "All",
281
- "noNotifications": "No notifications available",
282
- "user": "User"
283
- }
284
- },
285
- "profile": {
286
- "edit": "Edit Profile",
287
- "logout": "Logout",
288
- "sessions": {
289
- "title": "Active Sessions",
290
- "expiration": {
291
- "time": "Session termination"
292
- }
293
- }
294
- },
295
- "comment": {
296
- "view": "View",
297
- "reply": "Reply",
298
- "replies": "Replies"
299
- },
300
- "designer": {
301
- "modules": "Modules",
302
- "features": "Features",
303
- "entities": "Entities",
304
- "permissions": "Permissions",
305
- "createModule": "Create New Module",
306
- "emptyModulesText": "No record found"
307
- },
308
- "filter": {
309
- "title": "Filters",
310
- "apply": "Apply",
311
- "reset": "Reset",
312
- "addField": "Add Field",
313
- "discard": "Discard",
314
- "emptyTitle": "No Filters Selected",
315
- "emptyDescription": "Please select field(s) that you want to filter",
316
- "fields": "Fields"
317
- },
318
- "sort": {
319
- "title": "Sorts"
320
- },
321
- "column": {
322
- "title": "Columns"
323
- },
324
- "search": {
325
- "placeholder": "Search..."
326
- },
327
- "workflow": {
328
- "entity-created-title": "Entity Created",
329
- "entity-created-body": "New Record has been successfully created.",
330
- "entity-modified-title": "Entity Modified",
331
- "entity-modified-body": "Record has been successfully updated",
332
- "warning": "Warning",
333
- "confirm-delete": "Are you sure want to delete selected item(s)?",
334
- "no-need": "No Deletion Needed",
335
- "no-item": "No items were available to delete.",
336
- "deleting": "Deleting Record...",
337
- "fail-delete-title": "Deletion Failed",
338
- "fail-delete-body": "No items were deleted. [item] item(s) failed to delete.",
339
- "success-delete-title": "Deletion Successful",
340
- "success-delete-body": "[item] item(s) has been deleted.",
341
- "success-partial-delete-title": "Partial Deletion Completed",
342
- "success-partial-delete-body": "[success] item(s) deleted successfully. However, [fail] item(s) could not be deleted."
343
- },
344
-
345
- "time": {
346
- "second": "second",
347
- "Seconds": "Seconds",
348
- "minute": "minute",
349
- "Minutes": "Minutes",
350
- "month": "month",
351
- "Months": "Months",
352
- "hour": "hour",
353
- "Hours": "Hours",
354
- "day": "day",
355
- "Days": "Days",
356
- "year": "year",
357
- "Years": "Years"
358
- },
359
- "custom": "Custom",
360
- "every": "Every",
361
- "between": "between",
362
- "and": "and",
363
- "select-second": "select second(s)",
364
- "select-minute": "select minute(s)",
365
- "select-month": "select month(s)",
366
- "select-hour": "select hour(s)",
367
- "select-day": "select day(s)",
368
- "select-year": "select year(s)",
369
- "second-starting": "second(s) starting at second",
370
- "minute-starting": "minute(s) starting at minute",
371
- "month-starting": "month(s) starting at month",
372
- "hour-starting": "hour(s) starting at hour",
373
- "year-starting": "year(s) starting at year",
374
- "specific-second": "Specific second(s) (choose one or many)",
375
- "specific-minute": "Specific minute(s) (choose one or many)",
376
- "specific-month": "Specific month(s) (choose one or many)",
377
- "specific-hour": "Specific hour(s) (choose one or many)",
378
- "specific-year": "Specific year(s) (choose one or many)",
379
- "base-on-week": "Base on week",
380
- "on-the-last": "On the last",
381
- "of-the-month": "of the month",
382
- "on-the": "On the",
383
- "st": "st",
384
- "of-month": "of month",
385
- "base-on-month": "Base on Month",
386
- "on-the-last-day-of-the-month": "On the Last day of the month",
387
- "day-before-the-end-of-the-month": "day(s) before the end of the month",
388
- "st-of-the-month": "st of the month",
389
- "specific-day-of-month": "Specific day(s) of month (choose one or many)",
390
- "specific-day-of-week": "Specific day(s) of week (choose one or many)",
391
- "day-starting-on": "day(s) starting on",
392
- "more-notification": "And {{ number }} more...",
393
- "more-toast": "And {{ number }} more...",
394
- "at-least-8-characters": "At least 8 characters",
395
- "english-upper-case-letter": "English upper case letter",
396
- "english-lower-case-letter": "English lower case letter",
397
- "special-character": "Special character(%,#...)",
398
- "digits": "Digits (0-9)",
399
- "fragile": "Fragile",
400
- "weak": "Weak",
401
- "good": "Good",
402
- "strong": "Strong",
403
- "unbreakable": "Unbreakable"
404
- }
@@ -1,386 +0,0 @@
1
- {
2
- "search": "جستجو",
3
- "yes": "بله",
4
- "type": "نوع",
5
- "no": "خیر",
6
- "allItems": "همه موارد",
7
- "confirm": "تایید",
8
- "welcome": "خوش آمدید",
9
- "okay": "باشه",
10
- "accept": "پذیرفتن",
11
- "decline": "رد کردن",
12
- "cancel": "لغو",
13
- "canceled": "لغو شد",
14
- "failed": "ناموفق",
15
- "remove": "حذف",
16
- "pinned": "ثبت شده",
17
- "recent": "اخیر",
18
- "close": "بستن",
19
- "clear": "پاک کردن",
20
- "select": "انتخاب ...",
21
- "edit": "ویرایش",
22
- "delete": "حذف",
23
- "deleteItems": "حذف موارد",
24
- "detail": "جزئیات",
25
- "actions": "عملیات",
26
- "archive": "بایگانی",
27
- "create": "ایجاد",
28
- "choose": "انتخاب",
29
- "configs": "پیکربندی‌ها",
30
- "fields": "فیلدها",
31
- "no-result-found": "نتیجه‌ای یافت نشد",
32
- "no-result-for": "نتیجه‌ای برای &nbsp<b>\"{{ exp }}\"</b> یافت نشد",
33
- "searching": "در حال جستجو ...",
34
- "save": "ذخیره",
35
- "save-as": "ذخیره به عنوان...",
36
- "save-changes": "ذخیره تغییرات",
37
- "title": "عنوان",
38
- "subtitle": "عنوان فرعی",
39
- "description": "توضیحات",
40
- "code": "کد",
41
- "permissions": "دسترسی‌ها",
42
- "status": "وضعیت",
43
- "address": "آدرس",
44
- "name": "نام",
45
- "uniquename": "نام منحصر به فرد",
46
- "size": "اندازه",
47
- "add-item": "افزودن",
48
- "color": "رنگ",
49
- "display": "نمایش",
50
- "min-value": "حداقل مقدار",
51
- "value": "مقدار",
52
- "max-value": "حداکثر مقدار",
53
- "refresh-rate": "نرخ تازه‌سازی",
54
- "condition": "شرط",
55
- "loading": "در حال بارگذاری",
56
- "firstname": "نام",
57
- "lastname": "نام خانوادگی",
58
- "email": "ایمیل",
59
- "employeeCode": "کد کارمندی",
60
- "position": "موقعیت",
61
- "employmentType": "نوع استخدام",
62
- "hireDate": "تاریخ استخدام",
63
- "required": "الزامی",
64
- "submit": "ارسال",
65
- "viewAll": "مشاهده همه",
66
- "viewLess": "مشاهده کمتر",
67
- "processing": "در حال پردازش...",
68
- "redirecting": "در حال انتقال...",
69
- "apply": "اعمال",
70
- "reset": "بازنشانی",
71
- "home": "خانه",
72
- "export": "خروجی گرفتن",
73
- "print": "چاپ گرفتن",
74
- "import": "ورودی گرفتن",
75
- "settings": "تنظیمات",
76
- "create-new": "ایجاد",
77
- "continue": "ادامه",
78
- "discard": "لغو",
79
- "overview": "بررسی کلی",
80
- "allItem": "همه موارد",
81
- "history": "تاریخچه",
82
- "comments": "نظرات",
83
- "itemsSelected": "مورد انتخاب شده ",
84
- "unselect": "لغو انتخاب",
85
- "category": "دسته بندی",
86
- "categories": "دسته بندی ها",
87
- "province": "استان",
88
- "provinces": "استان ها",
89
- "country": "کشور",
90
- "countries": "کشورها",
91
- "city": "شهر",
92
- "cities": "شهرها",
93
- "geo": "جغرافیا",
94
- "currency": "ارز",
95
- "currencies": "ارز ها",
96
- "unknown": "نامشخص",
97
- "dialogs": {
98
- "delete": {
99
- "title": "تایید حذف",
100
- "message": "آیا مطمئن هستید که می‌خواهید آیتم(های) انتخاب شده را حذف کنید؟ این عملیات غیرقابل بازگشت می‌باشد."
101
- }
102
- },
103
- "authentication": {
104
- "with-google": "ورود با گوگل",
105
- "with-apple": "ورود با اپل"
106
- },
107
- "dateTime": {
108
- "weekdays": {
109
- "short": {
110
- "0": "ی",
111
- "1": "د",
112
- "2": "س",
113
- "3": "چ",
114
- "4": "پ",
115
- "5": "ج",
116
- "6": "ش"
117
- },
118
- "long": {
119
- "0": "یک‌شنبه",
120
- "1": "دوشنبه",
121
- "2": "سه‌شنبه",
122
- "3": "چهارشنبه",
123
- "4": "پنج‌شنبه",
124
- "5": "جمعه",
125
- "6": "شنبه"
126
- }
127
- },
128
- "months": {
129
- "georgian": {
130
- "short": {
131
- "0": "ژان",
132
- "1": "فور",
133
- "2": "مار",
134
- "3": "آپر",
135
- "4": "مه",
136
- "5": "ژوئن",
137
- "6": "ژوئیه",
138
- "7": "آگو",
139
- "8": "سپت",
140
- "9": "اکت",
141
- "10": "نوام",
142
- "11": "دسام"
143
- },
144
- "long": {
145
- "0": "ژانویه",
146
- "1": "فوریه",
147
- "2": "مارس",
148
- "3": "آوریل",
149
- "4": "مه",
150
- "5": "ژوئن",
151
- "6": "ژوئیه",
152
- "7": "آگوست",
153
- "8": "سپتامبر",
154
- "9": "اکتبر",
155
- "10": "نوامبر",
156
- "11": "دسامبر"
157
- }
158
- },
159
- "jalali": {
160
- "short": {
161
- "0": "فرورد",
162
- "1": "اردی",
163
- "2": "خرد",
164
- "3": "تیر",
165
- "4": "مرد",
166
- "5": "شهر",
167
- "6": "مهر",
168
- "7": "آبان",
169
- "8": "آذر",
170
- "9": "دی",
171
- "10": "بهم",
172
- "11": "اسف"
173
- },
174
- "long": {
175
- "0": "فروردین",
176
- "1": "اردیبهشت",
177
- "2": "خرداد",
178
- "3": "تیر",
179
- "4": "مرداد",
180
- "5": "شهریور",
181
- "6": "مهر",
182
- "7": "آبان",
183
- "8": "آذر",
184
- "9": "دی",
185
- "10": "بهمن",
186
- "11": "اسفند"
187
- }
188
- }
189
- },
190
- "dayTime": {
191
- "am": "صبح",
192
- "pm": "بعد از ظهر",
193
- "m": "م",
194
- "a": "ق.ظ",
195
- "p": "ب.ظ"
196
- },
197
- "set": "تنظیم",
198
- "today": "امروز",
199
- "now": "الان",
200
- "hour": "ساعت",
201
- "minute": "دقیقه",
202
- "second": "ثانیه",
203
- "date": "تاریخ",
204
- "time": "زمان",
205
- "duration": {
206
- "format_second": "{0} ثانیه(ها)",
207
- "format_minute": "{0} دقیقه(ها)"
208
- }
209
- },
210
- "validation": {
211
- "messages": {
212
- "title": "لطفا خطا(های) زیر را اصلاح کنید:",
213
- "required": "این فیلد الزامی است",
214
- "email": "لطفا یک آدرس ایمیل معتبر وارد کنید!",
215
- "phone": "لطفا یک شماره تلفن معتبر وارد کنید!",
216
- "url": "لطفا یک آدرس وب معتبر وارد کنید!",
217
- "invalid-rull-name": "نام قانون نامعتبر: &nbsp<b>\"{{ name }}\"</b>"
218
- }
219
- },
220
- "selectbox": {
221
- "popover": {
222
- "title": "انتخاب آیتم..."
223
- }
224
- },
225
- "datepicker": {
226
- "popover": {
227
- "title": "انتخاب تاریخ..."
228
- }
229
- },
230
- "datapager": {
231
- "info": {
232
- "text": "[page] از [totalPages] صفحه ([totalItems] آیتم)"
233
- }
234
- },
235
- "uploader": {
236
- "zone": {
237
- "text": "فایل‌ها را بیاندازید تا بارگذاری شوند",
238
- "drag": "بکشید یا رها کنید یا ",
239
- "choose": "فایل را انتخاب کنید",
240
- "to-upload": " برای آپلود"
241
- }
242
- },
243
- "action-sheet": {
244
- "title": "برگه عمل..."
245
- },
246
- "entity": {
247
- "home": "خانه",
248
- "public-view": "نمایش‌های عمومی",
249
- "action": "عمل",
250
- "actions": "عملیات‌ها",
251
- "columns": "ستون‌ها",
252
- "sort": "مرتب‌سازی",
253
- "no-sort": "مرتب‌سازی انتخاب نشده",
254
- "ask-sort": "لطفا فیلد(های) مرتب‌سازی را انتخاب کنید",
255
- "add-field": "افزودن فیلد",
256
- "modify": "ویرایش"
257
- },
258
- "widget": {
259
- "phone": {
260
- "mobile": "موبایل",
261
- "home": "خانه",
262
- "work": "کار",
263
- "other": "دیگر"
264
- },
265
- "lookup": {
266
- "search": "جستجو در "
267
- },
268
- "tasklist": {
269
- "title": "وظایف",
270
- "pending": "در انتظار",
271
- "completed": "تکمیل شده",
272
- "noTasks": "هیچ وظیفه‌ای موجود نیست",
273
- "user": "کاربر"
274
- },
275
- "notification": {
276
- "new": "جدید",
277
- "all": "همه",
278
- "noNotifications": "هیچ اعلانی موجود نیست",
279
- "user": "کاربر"
280
- }
281
- },
282
- "profile": {
283
- "edit": "ویرایش پروفایل",
284
- "logout": "خروج"
285
- },
286
- "comment": {
287
- "view": "مشاهده",
288
- "reply": "پاسخ",
289
- "replies": "پاسخ‌ها"
290
- },
291
- "designer": {
292
- "modules": "ماژول‌ها",
293
- "features": "ویژگی‌ها",
294
- "entities": "واحدها",
295
- "permissions": "مجوزها",
296
- "createModule": "ایجاد ماژول جدید",
297
- "emptyModulesText": "هیچ رکوردی یافت نشد"
298
- },
299
- "filter": {
300
- "title": "فیلترها",
301
- "apply": "اعمال",
302
- "reset": "بازنشانی",
303
- "addField": "افزودن فیلد",
304
- "discard": "لغو",
305
- "emptyTitle": "هیچ فیلتری انتخاب نشده است",
306
- "emptyDescription": "لطفاً فیلد(هایی) را که می‌خواهید فیلتر کنید انتخاب کنید",
307
- "fields": "فیلدها"
308
- },
309
- "workflow": {
310
- "entity-created-title": "موجودیت ایجاد شد",
311
- "entity-created-body": "رکورد جدید با موفقیت ایجاد شد.",
312
- "entity-modified-title": "موجودیت اصلاح شد",
313
- "entity-modified-body": "رکورد با موفقیت به‌روزرسانی شد.",
314
- "warning": "هشدار",
315
- "confirm-delete": "آیا مطمئن هستید که می‌خواهید مورد(های) انتخاب‌شده را حذف کنید؟",
316
- "no-need": "نیازی به حذف نیست",
317
- "no-item": "هیچ موردی برای حذف در دسترس نیست.",
318
- "deleting": "در حال حذف رکورد...",
319
- "fail-delete-title": "حذف ناموفق بود",
320
- "fail-delete-body": "هیچ موردی حذف نشد. [item] مورد(ها) حذف نشدند.",
321
- "success-delete-title": "حذف با موفقیت انجام شد",
322
- "success-delete-body": "[item] مورد(ها) حذف شد.",
323
- "success-partial-delete-title": "حذف جزئی انجام شد",
324
- "success-partial-delete-body": "[success] مورد(ها) با موفقیت حذف شدند. با این حال، [fail] مورد(ها) حذف نشدند."
325
- },
326
- "time": {
327
- "second": "ثانیه",
328
- "Seconds": "ثانیه ها",
329
- "minute": "دقیقه",
330
- "Minutes": "دقیقه ها",
331
- "month": "ماه",
332
- "Months": "ماه ها",
333
- "hour": "ساعت",
334
- "Hours": "ساعت ها",
335
- "day": "روز",
336
- "Days": "روز ها",
337
- "year": "سال",
338
- "Years": "سال ها"
339
- },
340
-
341
- "custom": "سفارشی",
342
- "every": "هر",
343
- "between": "بین",
344
- "and": "و",
345
- "select-second": "انتخاب ثانیه( ها)",
346
- "select-minute": "انتخاب دقیقه( ها)",
347
- "select-month": "انتخاب ماه( ها)",
348
- "select-hour": "انتخاب ساعت( ها)",
349
- "select-day": "انتخاب روز( ها)",
350
- "select-year": "انتخاب سال( ها)",
351
- "second-starting": "ثانیه(هایی) که شروع میشوند از ثانیه",
352
- "minute-starting": "دقیقه(هایی) که شروع میشوند از دقیقه",
353
- "month-starting": "ماه(هایی) که شروع میشوند از ماه",
354
- "hour-starting": "ساعت(هایی) که شروع میشوند از ساعت",
355
- "year-starting": "سال(هایی) که شروع میشوند از سال",
356
- "specific-second": "ثانیه(های) به خصوص (انتخاب یکی یا بیشتر)",
357
- "specific-minute": "دقیقه(های) به خصوص (انتخاب یکی یا بیشتر)",
358
- "specific-month": "ماه(های) به خصوص (انتخاب یکی یا بیشتر)",
359
- "specific-hour": "ساعت(های) به خصوص (انتخاب یکی یا بیشتر)",
360
- "specific-year": "سال(های) به خصوص (انتخاب یکی یا بیشتر)",
361
- "base-on-week": "بر اساس هفته",
362
- "on-the-last": "در آخرین",
363
- "of-the-month": "ماه",
364
- "on-the": "در",
365
- "st": "امین",
366
- "of-month": "ماه",
367
- "base-on-month": "بر اساس ماه",
368
- "on-the-last-day-of-the-month": "در آخرین روز ماه",
369
- "day-before-the-end-of-the-month": "روز(های) قبل از اتمام ماه",
370
- "st-of-the-month": "ام ماه",
371
- "specific-day-of-month": "روز(های) به خصوص از ماه(انتخاب یک مورد یا بیشنر)",
372
- "specific-day-of-week": "روز(های) به خصوص از هفته(انتخاب یک مورد یا بیشنر)",
373
- "day-starting-on": "روزی(های) که شروع میشود در",
374
- "more-notification": "و {{ number }} اعلان دیگر...",
375
- "more-toast": "و {{ number }} اعلان دیگر...",
376
- "at-least-8-characters": "حداقل هشت کاراکتر",
377
- "english-upper-case-letter": "استفاده از حروف بزرگ",
378
- "english-lower-case-letter": "استفاده از حروف کوچک",
379
- "special-character": "استفاده از کاراکتر های ویژه (%,$, ...)",
380
- "digits": "استفاده از اعداد",
381
- "fragile": "شکننده",
382
- "weak": "ضعیف",
383
- "good": "خوب",
384
- "strong": "قوی",
385
- "unbreakable": "مستحکم"
386
- }