8.12.1 • Published 10 months ago

@gooddata/i18n-toolkit v8.12.1

Weekly downloads
-
License
MIT
Repository
github
Last release
10 months ago

Validation script for translations

npm version  npm monthly downloads  typescript

This package is a part of the GoodData.UI SDK. To learn more, check the source monorepo.

This is a translations validator script that is able to validate rules for valid translations files.

What this toolkit validates?

  1. Structure of localisation .json files - Toolkit validate structure of json files based on json schema that is defined in src/schema/localization.ts. If file is not valid by this schema, validation immediately failed.
  2. Message format - Validation of message format if is valid based on ICU. More information about using ICU can be found here https://unicode-org.github.io/icu/userguide/format_parse/messages/. First error in ICU will cause validation failed.
  3. HTML syntax - Because we use html like syntax in some messages, we need to validate if this html is valid or not. Toolkit iterate all messages and if found html inside, make validation on it. First error will cause validation failed.

How to install it?

Install by npm ...

npm install @gooddata/i18n-toolkit --save-dev

... or by yarn

yarn add @gooddata/i18n-toolkit -D

How to use it?

Toolkit is used from command line and has some options to enabled all checks. By default, all check are disabled and need to be turn on by one by for all cases.

Option -p, --paths <paths>

This option is required and it is more paths for directory where are translations jsons that is split by ",". There can be lots of *.json files, all files are behaving as a localisations files and need to be valid. There need to be file en-US.json that is used as a default file for other validations. Without this path and file, validator can not work.

Example

 i18n-toolkit --paths src/share/translations src/Component/translations

Option -c, --config <path>

This option is path for Configuration file that can be used for determine all options and also specified rules for option -u, --usage that turns on localisation usage messages id validation.

Option -s, --structure

Turn on validation of structure base ond json schema.

Option -i, --intl

Turn on validation of ICU messages used in localisation files.

Option -h, --html

Turn on validation of HTML marks inside localisation messages.

Option -u, --usage

Turn on localisation message id usage validation. This fill turn on feature that try to find if key is really used in application or not. There are more options related to this see Configuration file.

Option -d, --debug

Turn on debug mode that shows more info on errors and spam console more often that in normal mode.

Option -w, --cwd <path>

This option is used to define another working directory that is current. By defaul this tool has working directory as directory where program run, but this option can override this and define another directory as cwd.

Examples script

package.json

{
    ...
    "scripts": {
        ...
        "validate-locales": "i18n-toolkit --paths app/localization --structure --intl --html"
    },
    "devDependencies": {
        "@gooddata/i18n-toolkit": "^8.10.0-alpha.101",
        ...
    }
}

Configuration file .i18nrc.js

Instead of command line arguments, this tool also be configured by config file. Configuration file is necessary to use if you want to use --usage otpion to determine if localizations ids are used or not because there are rules for messages. By default, toolkit search for config file .i18nrc.js in cwd, but can be overridden by --config option on command line.

Structure of config file

module.exports = {
    paths: ["./src/fixtures/", "./src/translations/"],
    //settings
    structure: true, //OPTIONAL, same as "--structure" option on command line
    intl: true, //OPTIONAL, same as "--intl" option on command line
    html: true, //OPTIONAL, same as "--html" option on command line
    usage: true, //OPTIONAL, same as "--usage" option on command line
    debug: true, //OPTIONAL, same as "--debug" option on command line
    //REQUIRED if usage=true, source files with code from tool reads and parse usage of localisations messages
    source: "src/**/*.{ts,js,tsx,jsx}",
    //REQUIRED if usage=true, rules definition for validation usage
    rules: [
        {
            //OPTIONAL, define regular expression, this option will be valid only for locales inside dir that match expression
            dir: /src\/fixtures/,
            //REQUIRED, define pattern for messages id to have been process with this rule, if you want all, use /.+/ pattern, can be array of expressions or single expression
            pattern: [/^text\./, /^properly\./],
            //OPTIONAL, if set true, locales messages will be filtered by previous regex pattern and other messages will be skipped, more info bellow
            filterTranslationFile: false,
            //OPTIONAL, all messages for this rule will be ignored (not processed and not marked as missing or unused)
            ignore: false,
        },
    ],
};

Property source: string

This is setting for usage check and its only required if usage=true. It is pattern for source files with code from tool reads and parse usage of localisations messages. Default value is src/**/*.{ts,js,tsx,jsx} and can be changed to any glob style files path.

Property rules: Array<ToolkitTranslationRule>

List of rules that will be applied on extracted and loaded rules. Tool extract all messages from source files and load localisation files defined in path or paths and then apply these rules on files. Every rule can have some special settings and these properties are described below.

Property rules[].dir: RegExp

Define regular expression, this option will be valid only for locales inside dir that match expression. If there are more directories with locales (for example src/locales and src/external/locales) you can specify, that this rule can be valid only for locales that is inside directory with matching regex pattern. If dir is omitted, this rule will be applied in every folder.

Property rules[].pattern: RegExp

Define pattern for messages id to have been process with this rule, if you want all, use /.+/ pattern, can be array of expressions or single expression. If filterTranslationFile is set to false and there will be messages. that not match by pattern Regex, tool automatically mark this messages as invalid.

Property rules[].filterTranslationFile: boolean

If set true, locales messages will be filtered by previous regex pattern and other messages will be skipped. This is useful if your locales file contains also locales for 3rd party library, and you want to validate only yours validation messages and others will be skipped. In this case you need to define 2 rules tha one validate messages and second mark others as ignored.

rules: [
    //all message that starts with dialogs. and screen. will be validated
    {
        pattern: [/^dialogs\./, /^screen\./],
        filterTranslationFile: true,
    },
    //all messages that starts with share.widget will be ignored
    {
        pattern: [/^share\.widget\./],
        filterTranslationFile: true,
        ignore: true,
    },
];

Property rules[].ignore: boolean

All messages for this rule will be ignored (not processed and not marked as missing or unused). Its handy for keys that can be extracted from source code or keys that are used in other apps.

How to right define messages in code to make usage check work?

Basic usage and recommended one is used <FormatMessage /> component for react. There is an example how to use this component.

<FormattedMessage
    id="message.id"
    values={{
        count: 0,
        name: "Stanley",
    }}
/>

In case that we need to get only string, and we are not able to use component, use intl.formatMessage as we can see below.

const text = intl.formatMessage(
    { id: "message.id" },
    {
        count: 0,
        name: "Stanley",
    },
);

Dynamic usage of message id?

Do not create message id dynamically. Try to always used full strings without any conditions. With dynamic messages, this is not possible to found usages of localisation string!

It is good practice using defineMessages that is intended to define all messages in current component / file. This allows us to use some dynamic operations with messages.

const messages = defineMessages({
    textOne: { id: "message.textOne" },
    textTwo: { id: "message.textTwo" },
});

const text = intl.formatMessage(condition ? messages.textOne : messages.textTwo);

License

(C) 2017-2022 GoodData Corporation

This project is under MIT License. See LICENSE.

9.0.0-alpha.26

10 months ago

9.0.0-alpha.25

10 months ago

9.0.0-alpha.7

11 months ago

9.0.0-alpha.6

11 months ago

9.0.0-alpha.9

11 months ago

9.0.0-alpha.8

11 months ago

9.0.0-alpha.24

10 months ago

9.0.0-alpha.22

10 months ago

9.0.0-alpha.23

10 months ago

9.0.0-alpha.17

10 months ago

9.0.0-alpha.18

10 months ago

9.0.0-alpha.15

11 months ago

9.0.0-alpha.16

11 months ago

9.0.0-alpha.13

11 months ago

9.0.0-alpha.14

11 months ago

9.0.0-alpha.11

11 months ago

9.0.0-alpha.12

11 months ago

9.0.0-alpha.19

10 months ago

9.0.0-alpha.20

10 months ago

9.0.0-alpha.21

10 months ago

9.0.0-alpha.10

11 months ago

9.0.0-alpha.5

11 months ago

9.0.0-alpha.4

11 months ago

9.0.0-alpha.3

11 months ago

9.0.0-alpha.2

11 months ago

9.0.0-alpha.1

11 months ago

8.12.1

1 year ago

8.13.0-alpha.60

12 months ago

8.13.0-alpha.62

12 months ago

8.13.0-alpha.61

12 months ago

8.13.0-alpha.53

12 months ago

8.13.0-alpha.52

1 year ago

8.13.0-alpha.55

12 months ago

8.13.0-alpha.54

12 months ago

8.13.0-alpha.57

12 months ago

8.13.0-alpha.56

12 months ago

8.13.0-alpha.59

12 months ago

8.13.0-alpha.58

12 months ago

8.13.0-alpha.71

12 months ago

8.13.0-alpha.70

12 months ago

8.13.0-alpha.73

12 months ago

8.13.0-alpha.72

12 months ago

8.13.0-alpha.64

12 months ago

8.13.0-alpha.63

12 months ago

8.13.0-alpha.66

12 months ago

8.13.0-alpha.65

12 months ago

8.13.0-alpha.68

12 months ago

8.13.0-alpha.67

12 months ago

8.13.0-alpha.69

12 months ago

8.13.0-alpha.40

1 year ago

8.13.0-alpha.35

1 year ago

8.13.0-alpha.37

1 year ago

8.13.0-alpha.36

1 year ago

8.13.0-alpha.39

1 year ago

8.13.0-alpha.38

1 year ago

8.13.0-alpha.51

1 year ago

8.13.0-alpha.50

1 year ago

8.13.0-alpha.42

1 year ago

8.13.0-alpha.41

1 year ago

8.13.0-alpha.44

1 year ago

8.13.0-alpha.43

1 year ago

8.13.0-alpha.46

1 year ago

8.13.0-alpha.45

1 year ago

8.13.0-alpha.48

1 year ago

8.13.0-alpha.47

1 year ago

8.13.0-alpha.49

1 year ago

8.13.0-alpha.80

11 months ago

8.13.0-alpha.82

11 months ago

8.13.0-alpha.81

11 months ago

8.13.0-alpha.75

12 months ago

8.13.0-alpha.74

12 months ago

8.13.0-alpha.77

11 months ago

8.13.0-alpha.76

11 months ago

8.13.0-alpha.79

11 months ago

8.13.0-alpha.78

11 months ago

8.13.0-alpha.11

1 year ago

8.13.0-alpha.10

1 year ago

8.13.0-alpha.13

1 year ago

8.13.0-alpha.12

1 year ago

8.13.0-alpha.15

1 year ago

8.13.0-alpha.14

1 year ago

8.13.0-alpha.17

1 year ago

8.13.0-alpha.16

1 year ago

8.13.0-alpha.19

1 year ago

8.13.0-alpha.18

1 year ago

8.13.0-alpha.20

1 year ago

8.13.0-alpha.22

1 year ago

8.13.0-alpha.21

1 year ago

8.13.0-alpha.24

1 year ago

8.13.0-alpha.23

1 year ago

8.13.0-alpha.26

1 year ago

8.13.0-alpha.25

1 year ago

8.13.0-alpha.28

1 year ago

8.13.0-alpha.27

1 year ago

8.13.0-alpha.29

1 year ago

8.12.1-beta.1

1 year ago

8.12.0

1 year ago

8.13.0-alpha.4

1 year ago

8.13.0-alpha.6

1 year ago

8.13.0-alpha.5

1 year ago

8.13.0-alpha.8

1 year ago

8.13.0-alpha.7

1 year ago

8.13.0-alpha.9

1 year ago

8.13.0-alpha.31

1 year ago

8.13.0-alpha.30

1 year ago

8.13.0-alpha.33

1 year ago

8.13.0-alpha.32

1 year ago

8.13.0-alpha.34

1 year ago

8.13.0-alpha.2

1 year ago

8.13.0-alpha.3

1 year ago

8.12.0-beta.2

1 year ago

8.12.0-beta.1

1 year ago

8.13.0-alpha.1

1 year ago

8.12.0-beta.0

1 year ago

8.12.0-alpha.65

1 year ago

8.12.0-alpha.64

1 year ago

8.12.0-alpha.63

1 year ago

8.12.0-alpha.62

1 year ago

8.12.0-alpha.69

1 year ago

8.12.0-alpha.68

1 year ago

8.12.0-alpha.67

1 year ago

8.12.0-alpha.66

1 year ago

8.11.0

2 years ago

8.12.0-alpha.72

1 year ago

8.12.0-alpha.71

1 year ago

8.12.0-alpha.70

1 year ago

8.12.0-alpha.76

1 year ago

8.12.0-alpha.75

1 year ago

8.12.0-alpha.74

1 year ago

8.12.0-alpha.73

1 year ago

8.12.0-alpha.79

1 year ago

8.12.0-alpha.78

1 year ago

8.12.0-alpha.77

1 year ago

8.12.0-alpha.83

1 year ago

8.12.0-alpha.82

1 year ago

8.12.0-alpha.81

1 year ago

8.12.0-alpha.80

1 year ago

8.12.0-alpha.87

1 year ago

8.12.0-alpha.86

1 year ago

8.12.0-alpha.85

1 year ago

8.12.0-alpha.84

1 year ago

8.12.0-alpha.89

1 year ago

8.12.0-alpha.88

1 year ago

8.12.0-alpha.94

1 year ago

8.12.0-alpha.93

1 year ago

8.12.0-alpha.92

1 year ago

8.12.0-alpha.91

1 year ago

8.12.0-alpha.98

1 year ago

8.12.0-alpha.97

1 year ago

8.12.0-alpha.96

1 year ago

8.12.0-alpha.95

1 year ago

8.12.0-alpha.99

1 year ago

8.12.0-alpha.8

2 years ago

8.12.0-alpha.9

2 years ago

8.12.0-alpha.7

2 years ago

8.11.0-beta.6

2 years ago

8.11.0-beta.7

2 years ago

8.12.0-alpha.10

2 years ago

8.12.0-alpha.14

2 years ago

8.12.0-alpha.13

2 years ago

8.12.0-alpha.12

2 years ago

8.12.0-alpha.11

2 years ago

8.12.0-alpha.18

1 year ago

8.12.0-alpha.17

1 year ago

8.12.0-alpha.16

1 year ago

8.12.0-alpha.15

2 years ago

8.12.0-alpha.19

1 year ago

8.12.0-alpha.21

1 year ago

8.12.0-alpha.20

1 year ago

8.12.0-alpha.25

1 year ago

8.12.0-alpha.24

1 year ago

8.12.0-alpha.23

1 year ago

8.12.0-alpha.22

1 year ago

8.12.0-alpha.29

1 year ago

8.12.0-alpha.28

1 year ago

8.12.0-alpha.27

1 year ago

8.12.0-alpha.26

1 year ago

8.12.0-alpha.32

1 year ago

8.12.0-alpha.31

1 year ago

8.12.0-alpha.30

1 year ago

8.12.0-alpha.36

1 year ago

8.12.0-alpha.35

1 year ago

8.12.0-alpha.34

1 year ago

8.12.0-alpha.33

1 year ago

8.12.0-alpha.39

1 year ago

8.12.0-alpha.38

1 year ago

8.12.0-alpha.37

1 year ago

8.12.0-alpha.43

1 year ago

8.12.0-alpha.42

1 year ago

8.12.0-alpha.41

1 year ago

8.12.0-alpha.40

1 year ago

8.12.0-alpha.47

1 year ago

8.12.0-alpha.46

1 year ago

8.12.0-alpha.45

1 year ago

8.12.0-alpha.44

1 year ago

8.12.0-alpha.49

1 year ago

8.12.0-alpha.48

1 year ago

8.12.0-alpha.50

1 year ago

8.12.0-alpha.54

1 year ago

8.12.0-alpha.53

1 year ago

8.12.0-alpha.52

1 year ago

8.12.0-alpha.51

1 year ago

8.12.0-alpha.58

1 year ago

8.12.0-alpha.57

1 year ago

8.12.0-alpha.56

1 year ago

8.12.0-alpha.55

1 year ago

8.12.0-alpha.59

1 year ago

8.12.0-alpha.61

1 year ago

8.12.0-alpha.60

1 year ago

8.11.0-alpha.100

2 years ago

8.11.0-alpha.101

2 years ago

8.12.0-alpha.2

2 years ago

8.12.0-alpha.3

2 years ago

8.12.0-alpha.1

2 years ago

8.11.0-alpha.98

2 years ago

8.11.0-alpha.99

2 years ago

8.12.0-alpha.6

2 years ago

8.11.0-alpha.94

2 years ago

8.11.0-alpha.95

2 years ago

8.12.0-alpha.4

2 years ago

8.11.0-alpha.96

2 years ago

8.12.0-alpha.5

2 years ago

8.11.0-alpha.97

2 years ago

8.11.0-beta.1

2 years ago

8.11.0-beta.2

2 years ago

8.11.0-beta.3

2 years ago

8.11.0-beta.4

2 years ago

8.11.0-beta.5

2 years ago

8.11.0-beta.0

2 years ago

8.11.0-alpha.90

2 years ago

8.11.0-alpha.91

2 years ago

8.11.0-alpha.92

2 years ago

8.11.0-alpha.93

2 years ago

8.11.0-alpha.87

2 years ago

8.11.0-alpha.88

2 years ago

8.11.0-alpha.89

2 years ago

8.11.0-alpha.70

2 years ago

8.11.0-alpha.71

2 years ago

8.11.0-alpha.65

2 years ago

8.11.0-alpha.66

2 years ago

8.11.0-alpha.67

2 years ago

8.11.0-alpha.68

2 years ago

8.11.0-alpha.61

2 years ago

8.11.0-alpha.62

2 years ago

8.11.0-alpha.63

2 years ago

8.11.0-alpha.64

2 years ago

8.11.0-alpha.69

2 years ago

8.11.0-alpha.60

2 years ago

8.11.0-alpha.54

2 years ago

8.11.0-alpha.55

2 years ago

8.11.0-alpha.56

2 years ago

8.11.0-alpha.57

2 years ago

8.11.0-alpha.50

2 years ago

8.11.0-alpha.51

2 years ago

8.11.0-alpha.52

2 years ago

8.11.0-alpha.53

2 years ago

8.11.0-alpha.58

2 years ago

8.11.0-alpha.59

2 years ago

8.11.0-alpha.83

2 years ago

8.11.0-alpha.84

2 years ago

8.11.0-alpha.85

2 years ago

8.11.0-alpha.86

2 years ago

8.11.0-alpha.80

2 years ago

8.11.0-alpha.81

2 years ago

8.11.0-alpha.82

2 years ago

8.11.0-alpha.76

2 years ago

8.11.0-alpha.77

2 years ago

8.11.0-alpha.78

2 years ago

8.11.0-alpha.79

2 years ago

8.11.0-alpha.72

2 years ago

8.11.0-alpha.73

2 years ago

8.11.0-alpha.74

2 years ago

8.11.0-alpha.75

2 years ago

8.11.0-alpha.48

2 years ago

8.11.0-alpha.49

2 years ago

8.11.0-alpha.45

2 years ago

8.11.0-alpha.46

2 years ago

8.11.0-alpha.47

2 years ago

8.11.0-alpha.3

2 years ago

8.11.0-alpha.4

2 years ago

8.11.0-alpha.1

2 years ago

8.11.0-alpha.2

2 years ago

8.10.0-alpha.126

2 years ago

8.10.0-alpha.125

2 years ago

8.10.0-alpha.124

2 years ago

8.10.0-alpha.129

2 years ago

8.10.0-alpha.128

2 years ago

8.10.0-alpha.127

2 years ago

8.11.0-alpha.7

2 years ago

8.11.0-alpha.8

2 years ago

8.11.0-alpha.5

2 years ago

8.11.0-alpha.6

2 years ago

8.11.0-alpha.9

2 years ago

8.10.0-alpha.162

2 years ago

8.10.0-alpha.161

2 years ago

8.10.0-alpha.160

2 years ago

8.10.0-alpha.163

2 years ago

8.11.0-alpha.21

2 years ago

8.11.0-alpha.22

2 years ago

8.11.0-alpha.23

2 years ago

8.11.0-alpha.24

2 years ago

8.11.0-alpha.20

2 years ago

8.11.0-alpha.29

2 years ago

8.11.0-alpha.25

2 years ago

8.11.0-alpha.26

2 years ago

8.11.0-alpha.27

2 years ago

8.11.0-alpha.28

2 years ago

8.10.0-alpha.151

2 years ago

8.10.0-alpha.150

2 years ago

8.10.0-alpha.155

2 years ago

8.10.0-alpha.154

2 years ago

8.10.0-alpha.153

2 years ago

8.10.0-alpha.152

2 years ago

8.10.0-alpha.159

2 years ago

8.10.0-alpha.158

2 years ago

8.10.0-alpha.157

2 years ago

8.10.0-alpha.156

2 years ago

8.11.0-alpha.10

2 years ago

8.11.0-alpha.11

2 years ago

8.11.0-alpha.12

2 years ago

8.11.0-alpha.13

2 years ago

8.11.0-alpha.18

2 years ago

8.11.0-alpha.19

2 years ago

8.11.0-alpha.14

2 years ago

8.11.0-alpha.15

2 years ago

8.11.0-alpha.16

2 years ago

8.11.0-alpha.17

2 years ago

8.10.0-alpha.140

2 years ago

8.10.0

2 years ago

8.10.0-alpha.144

2 years ago

8.10.0-alpha.143

2 years ago

8.10.0-beta.0

2 years ago

8.10.0-alpha.142

2 years ago

8.10.0-beta.1

2 years ago

8.10.0-alpha.141

2 years ago

8.10.0-alpha.148

2 years ago

8.10.0-alpha.147

2 years ago

8.10.0-alpha.146

2 years ago

8.10.0-alpha.145

2 years ago

8.11.0-alpha.43

2 years ago

8.11.0-alpha.44

2 years ago

8.10.0-alpha.149

2 years ago

8.11.0-alpha.40

2 years ago

8.11.0-alpha.41

2 years ago

8.11.0-alpha.42

2 years ago

8.10.0-alpha.133

2 years ago

8.10.0-alpha.132

2 years ago

8.10.0-alpha.131

2 years ago

8.10.0-alpha.130

2 years ago

8.10.0-alpha.137

2 years ago

8.10.0-alpha.136

2 years ago

8.10.0-alpha.135

2 years ago

8.10.0-alpha.134

2 years ago

8.11.0-alpha.32

2 years ago

8.11.0-alpha.33

2 years ago

8.11.0-alpha.34

2 years ago

8.10.0-alpha.139

2 years ago

8.11.0-alpha.35

2 years ago

8.10.0-alpha.138

2 years ago

8.11.0-alpha.30

2 years ago

8.11.0-alpha.31

2 years ago

8.11.0-alpha.36

2 years ago

8.11.0-alpha.37

2 years ago

8.11.0-alpha.38

2 years ago

8.11.0-alpha.39

2 years ago

8.10.0-alpha.123

2 years ago

8.10.0-alpha.122

2 years ago

8.10.0-alpha.121

2 years ago

8.10.0-alpha.120

2 years ago

8.10.0-alpha.119

2 years ago

8.10.0-alpha.118

2 years ago

8.10.0-alpha.117

2 years ago

8.10.0-alpha.116

2 years ago

8.10.0-alpha.115

2 years ago

8.10.0-alpha.114

2 years ago

8.10.0-alpha.113

2 years ago

8.10.0-alpha.112

2 years ago

8.10.0-alpha.111

2 years ago

8.10.0-alpha.110

2 years ago

8.10.0-alpha.109

2 years ago

8.10.0-alpha.108

2 years ago

8.10.0-alpha.107

2 years ago

8.10.0-alpha.106

2 years ago

8.10.0-alpha.105

2 years ago

8.10.0-alpha.104

2 years ago

8.10.0-alpha.103

2 years ago