auto-lang 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
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) => {};