0.25.0 • Published 9 months ago

eslint-plugin-string-to-lingui v0.25.0

Weekly downloads
461
License
ISC
Repository
-
Last release
9 months ago

eslint-plugin-string-to-lingui

ESlint plugin to check if all strings are translated

Installation

You'll first need to install ESLint:

$ yarn add eslint --dev

Next, install eslint-plugin-string-to-lingui:

$ yarn add eslint-plugin-string-to-lingui --dev

Note: If you installed ESLint globally (using the -g flag) then you must also install eslint-plugin-string-to-lingui globally.

Usage

Add string-to-lingui to the plugins section of your .eslintrc configuration file. You can omit the eslint-plugin- prefix:

{
  "plugins": ["string-to-lingui"]
}

Then configure the rules you want to use under the rules section.

{
  "rules": {
    "string-to-lingui/missing-lingui-transformation": 2,
    "string-to-lingui/t-call-in-function": 2,
    "string-to-lingui/macro-inside-t-and-i18": 2,
    "string-to-lingui/t-should-be-before-macro": 2,
    "string-to-lingui/no-single-varibles-to-translate": 2,
    "string-to-lingui/check-en-messages: [1, {
        "sourcePath": "node_modules/@pleo-io/product-web-translations/en/messages.json",
        "similarityThreshold": 0.9,
        "maxSuggestions": 3
    }],
    "string-to-lingui/text-restrictions": [
      2,
      {
        "rules": [
          {
            "patterns": ["''", "’", "“"],
            "message": "Error message"
          }
        ]
      }
    ],
    "string-to-lingui/forbid-i18n-calls": [
      2,
      {
        "rules": [
          {
            "handlerName": "_",
            "message": "Use t`` from '@lingui/macro' instead"
          },
          {
            "handlerName": "number",
            "message": "Use formatCurrency or formatNumber instead"
          }
        ]
      }
    ]
  }
}

Supported Rules

missing-lingui-transformation

Check that code doesn't contain strings/templates/jsxText what should be wraped into <Trans> or i18n

Options

ignore

The ignore option specifies exceptions not to check for literal strings that match one of regexp paterns.

Examples of correct code for the { "ignore": ["rgba"] } option:

/*eslint string-to-lingui/missing-lingui-transformation ["error", {"ignore": ["rgba"]}]*/
const a = <div color="rgba(100, 100, 100, 0.4)"></div>;

ignoreFunction

THe ignoreFunction option speficies exceptions not check for function calls whose names match one of regexp patterns.

Examples of correct code for the { "ignoreFunction": ["showIntercomMessage"] } option:

/*eslint string-to-lingui/missing-lingui-transformation: ["error", { "ignoreFunction": ["showIntercomMessage"] }]*/
const bar = showIntercomMessage("Please, write me");

ignoreAttribute

The ignoreAttribute option specifies exceptions not to check for JSX attributes that match one of ignored attributes.

Examples of correct code for the { "ignoreAttribute": ["style"] } option:

/*eslint string-to-lingui/missing-lingui-transformation: ["error", { "ignoreAttribute": ["style"] }]*/
const element = <div style={{ margin: "1rem 2rem" }} />;

t-call-in-function

Check that t calls are inside function. It is necessary for language switching.

i18n-number-call-in-function

Check that i18n.number calls are inside function. It is necessary for language switching.

i18n-only-identifiers

Check that t doesn't contain member or function expressions like t\${obj.prop} or tfunc()`

check-en-messages

Checks similar messages from the source and give suggestions for replacement

forbid-i18n-calls

Check that i18n.* is not used at all. For now, it is needed to prevent i18n._ and i18n.number. i18n._ is not needed because with lingui@v3+ it is working incorrectly (Messages are not extracted) t from macro should be used instead. i18n.numberis not needed because we create handlers formatCurrency and formatNumber

macro-inside-t-and-i18

Check that macro calls: number,date are inside t which is inside i18n call. It is necessary for macro to be working correctly.

t-should-be-before-macro

Check that t is imported from @lingui/macro before number or date

no-single-varibles-to-translate

Doesn't allow single variables without text to translate like {variable} or t${variable}

text-restrictions

Check that strings/templates/jsxText doesn't contain patterns from the rules

Options

rules

rules is array of rules when one rule has structure { "patterns": ["first", "second"], "message": "error message" }.

each rule has a structure:

  • patterns is an array of regex or strings
  • message is a error message that will be displayed if restricting pattern matches text
  • flags is a string with regex flags for patterns
  • isOnlyForTranslation is a boolean indicating that patterns should be found only inside Trans tags or t tagged template

no-dynamic-keys

Doesn't allow dynamic keys for i18n.t

// nope ⛔️
i18n.t(hello);

// ok ✅
i18n.t("hello");

no-linebreaks

Doesn't allow linebreaks (\r or \n or both) in messages to be translated with t macro e.g:

// nope ⛔️
t`foo\n`;

t`foo
bar`;

// ok ✅
t`foo bar`;

no-tags-in-trans

Ensures <Trans></Trans> isn't wrapping a single element unnecessarily

// nope ⛔️
<Trans><strong>Foo bar</strong></Trans>

// ok ✅
<strong><Trans>Foo bar</Trans></strong>
0.25.0

9 months ago

0.24.0

10 months ago

0.23.17

1 year ago

0.23.16

1 year ago

0.23.15

1 year ago

0.23.13

1 year ago

0.23.12

1 year ago

0.23.14

1 year ago

0.23.10

1 year ago

0.23.3

1 year ago

0.23.2

1 year ago

0.23.1

1 year ago

0.23.0

1 year ago

0.22.5

2 years ago

0.22.4

2 years ago

0.22.3

2 years ago

0.22.2

2 years ago

0.22.1

2 years ago

0.22.0

2 years ago

0.21.1

2 years ago

0.21.0

2 years ago

0.21.0-beta.1

2 years ago

0.19.22

2 years ago

0.19.23

2 years ago

0.19.24

2 years ago

0.19.25

2 years ago

0.20.1

2 years ago

0.19.8

2 years ago

0.20.0

2 years ago

0.19.9

2 years ago

0.19.20

2 years ago

0.19.21

2 years ago

0.19.1

2 years ago

0.19.2

2 years ago

0.19.3

2 years ago

0.19.4

2 years ago

0.19.5

2 years ago

0.19.6

2 years ago

0.19.7

2 years ago

0.19.11

2 years ago

0.19.12

2 years ago

0.19.13

2 years ago

0.19.14

2 years ago

0.19.15

2 years ago

0.19.16

2 years ago

0.19.17

2 years ago

0.19.18

2 years ago

0.19.10

2 years ago

0.20.6

2 years ago

0.20.5

2 years ago

0.20.3

2 years ago

0.20.2

2 years ago

0.19.19

2 years ago

0.19.0

3 years ago

0.19.0-beta.0

3 years ago

0.18.0-beta.0

3 years ago

0.18.0

3 years ago

0.17.0-beta.0

3 years ago

0.17.0-beta.1

3 years ago

0.16.0-beta.1

3 years ago

0.16.0-beta.0

3 years ago

0.16.0-beta.2

3 years ago

0.17.0

3 years ago

0.16.0

3 years ago

0.13.0

4 years ago

0.14.0

3 years ago

0.15.0

3 years ago

0.14.1

3 years ago

0.14.2

3 years ago

0.14.3

3 years ago

0.12.1

4 years ago

0.11.0

4 years ago

0.10.1

4 years ago

0.12.0

4 years ago

0.11.1

4 years ago

0.10.0

4 years ago

0.9.0

4 years ago

0.8.0

5 years ago

0.7.2

5 years ago

0.7.1

5 years ago

0.7.0

5 years ago

0.6.2

5 years ago

0.5.0

5 years ago

0.6.1

5 years ago

0.6.0

5 years ago

0.4.4

5 years ago

0.4.3

5 years ago

0.4.1

5 years ago

0.4.2

5 years ago

0.4.0

5 years ago

0.3.0

5 years ago

0.2.1

5 years ago

0.2.0

5 years ago

0.2.2

5 years ago

0.1.11

5 years ago

0.1.9

5 years ago

0.1.8

5 years ago

0.1.7

5 years ago

0.1.6

5 years ago

0.1.5

5 years ago

0.1.4

5 years ago

0.1.3

5 years ago

0.1.2

5 years ago

0.1.1

5 years ago

0.1.0

5 years ago

0.0.2

6 years ago

0.0.1

6 years ago