auto-lang 1.0.5 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,13 +10,159 @@ Write once for a single language and automatically get translated json files for
10
10
  $ yarn add auto-lang
11
11
 
12
12
  ## Usage
13
- Run `auto-lang [options]`
13
+ You could either install the package and add a script to `package.json` or use the `npx` command directly from the terminal.
14
14
 
15
- ### Options
15
+ ### 1. Using the `npx` command
16
+ $ npx auto-lang [options]
17
+
18
+ ### 2. Using a script in `package.json`
19
+
20
+ ```json:
21
+ {
22
+ "scripts": {
23
+ "gen-lang": "auto-lang [options]"
24
+ }
25
+ }
26
+ ```
27
+
28
+ You can give your script any name you wish. Also, replace `[options]` with any of the options below.
29
+
30
+ #### Options
16
31
 
17
32
  -V, --version output the version number
18
33
  -f, --from <lang> language to translate from
19
34
  -t, --to <lang...> languages to translate to (seperated by space)
20
35
  -d, --dir <directory> directory containing the language files (default: "translations")
21
36
  -g, --gen-type <lang> generate types from language file
22
- -h, --help display help for command
37
+ -h, --help display help for command
38
+
39
+ **Note:** `<lang>` must be a valid [ISO 639-1 language code](https://localizely.com/iso-639-1-list/).
40
+
41
+ ### Examples
42
+
43
+ These examples assume there's a folder `translations` in the root directory the command is executed.
44
+
45
+ You can also pass `--dir <directory>` to change the folder that contains your language `json` files.
46
+
47
+ There is a file `en.json` in the translations folder
48
+
49
+ ```json:
50
+ {
51
+ "GENERAL": {
52
+ "OK": "OK",
53
+ "CANCEL": "Cancel",
54
+ "ACCEPT": "Accept",
55
+ "DECLINE": "Decline"
56
+ },
57
+ "GREETINGS": {
58
+ "HELLO": "Hello",
59
+ "HI": "Hi",
60
+ "GOOD_MORNING": "Good morning"
61
+ }
62
+ }
63
+ ```
64
+ Get translation files for French (fr) and Spanish (es).
65
+ $ npx auto-lang --from en --to fr es
66
+
67
+ Two files have been created; `fr.json` and `es.json` in the `translations` folder.
68
+
69
+ +-- root
70
+ | +-- translations
71
+ | | +-- en.json
72
+ | | +-- fr.json
73
+ | | +-- es.json
74
+
75
+ ```json:
76
+ /* fr.json */
77
+
78
+ {
79
+ "GENERAL": {
80
+ "OK": "D'ACCORD",
81
+ "CANCEL": "Annuler",
82
+ "ACCEPT": "Accepter",
83
+ "DECLINE": "Déclin"
84
+ },
85
+ "GREETINGS": {
86
+ "HELLO": "Bonjour",
87
+ "HI": "Salut",
88
+ "GOOD_MORNING": "Bonjour"
89
+ }
90
+ }
91
+ ```
92
+
93
+ ```json:
94
+ /* es.json */
95
+
96
+ {
97
+ "GENERAL": {
98
+ "OK": "OK",
99
+ "CANCEL": "Cancelar",
100
+ "ACCEPT": "Aceptar",
101
+ "DECLINE": "Rechazar"
102
+ },
103
+ "GREETINGS": {
104
+ "HELLO": "Hola",
105
+ "HI": "Hola",
106
+ "GOOD_MORNING": "Buenos dias"
107
+ }
108
+ }
109
+ ```
110
+
111
+ If you use typescript in your project, you can generate a typescript file to use in your code.
112
+
113
+ $ npx auto-lang --gen-type en
114
+
115
+ This will generate a `GlobalTranslation` type based on the structure of the `translations/en.json` file.
116
+
117
+ +-- root
118
+ | +-- translations
119
+ | | +-- types
120
+ | | | +-- index.ts
121
+ | | +-- en.json
122
+ | | +-- fr.json
123
+ | | +-- es.json
124
+
125
+ ```ts:
126
+ /* translations/types/index.ts */
127
+
128
+ type NestedKeyOf<ObjectType extends object> = {
129
+ [Key in keyof ObjectType & string]: ObjectType[Key] extends object
130
+ ? // @ts-ignore
131
+ `${Key}.${NestedKeyOf<ObjectType[Key]>}`
132
+ : `${Key}`;
133
+ }[keyof ObjectType & string];
134
+
135
+ export type GlobalTranslation = NestedKeyOf<GlobalTranslationType>;
136
+
137
+ interface GlobalTranslationType {
138
+ GENERAL: GENERAL;
139
+ GREETINGS: GREETINGS;
140
+ }
141
+
142
+ interface GREETINGS {
143
+ HELLO: string;
144
+ HI: string;
145
+ GOOD_MORNING: string;
146
+ }
147
+
148
+ interface GENERAL {
149
+ OK: string;
150
+ CANCEL: string;
151
+ ACCEPT: string;
152
+ DECLINE: string;
153
+ }
154
+
155
+ ```
156
+
157
+ Now you should be able to use `GlobalTranslation` in your code.
158
+
159
+ ```ts:
160
+ import { GlobalTranslation } from './translations/types';
161
+
162
+ const translate = (key: GlobalTranslation) => {
163
+ // your code
164
+ };
165
+
166
+ translate('GENERAL.ACCEPT'); // Intellisense and type check from GlobalTranslation
167
+
168
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "auto-lang",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "Automatically create language json files for internationalization",
5
5
  "main": "./src/index.js",
6
6
  "scripts": {
package/src/index.js CHANGED
@@ -14,7 +14,7 @@ import { Logger } from './utils/Logger.mjs';
14
14
  import chalk from 'chalk';
15
15
  import { validateOptions } from './utils/validation.mjs';
16
16
 
17
- const APP_VERSION = '1.0.5';
17
+ const APP_VERSION = '1.0.6';
18
18
 
19
19
  const program = new Command();
20
20
  const nodeMajVer = parseInt(process.version.substring(1).split('.')[0]);
@@ -22,7 +22,7 @@ const nodeMajVer = parseInt(process.version.substring(1).split('.')[0]);
22
22
  if (nodeMajVer < 14) {
23
23
  Logger.error(`Node version >= 14.x.x is required`);
24
24
 
25
- exit(1);
25
+ process.exit(1);
26
26
  }
27
27
 
28
28
  program
@@ -47,7 +47,7 @@ const { from, to, genType, inputFile, genTypeFile, dir } = validateOptions(
47
47
  );
48
48
 
49
49
  const inputJson = JSON.parse(
50
- await fs.readFile(inputFile, { encoding: 'utf-8' })
50
+ await fs.readFile(from ? inputFile : genTypeFile, { encoding: 'utf-8' })
51
51
  );
52
52
 
53
53
  async function makeTranslatedCopy(obj1, obj2, options) {
@@ -61,7 +61,7 @@ async function makeTranslatedCopy(obj1, obj2, options) {
61
61
  } catch (err) {
62
62
  console.log('\n');
63
63
  Logger.error(err.message);
64
- exit(1);
64
+ process.exit(1);
65
65
  }
66
66
  }
67
67
  }
@@ -89,8 +89,6 @@ async function createDeclarationFile() {
89
89
  const declarationFile = path.join(typesDir, 'index.ts');
90
90
 
91
91
  const result = `
92
- /* eslint-disable no-var */
93
-
94
92
  type NestedKeyOf<ObjectType extends object> = {
95
93
  [Key in keyof ObjectType & string]: ObjectType[Key] extends object
96
94
  ? // @ts-ignore
@@ -8,7 +8,7 @@ export function validateOptions(opts) {
8
8
  if (!Object.keys(opts).length) {
9
9
  Logger.error(`Invalid arguments. Use ${chalk.gray('--help')} for usage`);
10
10
 
11
- exit(1);
11
+ process.exit(1);
12
12
  }
13
13
 
14
14
  const { to, from, dir, genType } = opts;
@@ -17,7 +17,7 @@ export function validateOptions(opts) {
17
17
  Logger.error(
18
18
  `${chalk.gray('--from')} and ${chalk.gray('--to')} are dependent options`
19
19
  );
20
- exit(1);
20
+ process.exit(1);
21
21
  }
22
22
 
23
23
  const inputFile = path.join(process.cwd(), dir, `${from}.json`);
@@ -25,12 +25,12 @@ export function validateOptions(opts) {
25
25
 
26
26
  if (!existsSync(inputFile) && from) {
27
27
  Logger.error(`File "${inputFile}" not found`);
28
- exit(1);
28
+ process.exit(1);
29
29
  }
30
30
 
31
31
  if (!existsSync(genTypeFile) && genType) {
32
- Logger.error(`File "${genType}" not found`);
33
- exit(1);
32
+ Logger.error(`File "${genTypeFile}" not found`);
33
+ process.exit(1);
34
34
  }
35
35
 
36
36
  return { ...opts, inputFile, genTypeFile };
package/src/test.ts DELETED
@@ -1,3 +0,0 @@
1
- import { GlobalTranslation } from './translations/types';
2
-
3
- const t = (key: GlobalTranslation) => {};