Gettext linting rules for ESLint.
We're using this rule to lint against misuse of the jed gettext integration and the django JS catalog; so we're confident it should work against any gettext integration.
- Install ESLint.
- Install eslint-plugin-gettext plugin.
npm install eslint --save-dev
npm install eslint-plugin-gettext --save-dev
- Load plugin.
- Enable rules.
{
"plugins": ["gettext"],
"rules": {
"gettext/no-variable-string": "error",
"gettext/no-interpolate-string": "error",
"gettext/required-positional-markers-for-multiple-variables": "error"
}
}
Disallow non literal strings inside common gettext
functions. This is a very common mistake that disallow translation system from statically collecting the translatable strings.
// Disallows any non string literals in string reserved fields:
gettext(variable)
gettext(123)
gettext('foo' variable)
ngettext(varA, varB, 5)
pgettext(varA, varB)
npgettext(varA, varB, varC, 5)
ninterpolate(varA, varB, 5)
ninterpolate(varA, varB, 5, {})
// Allows:
gettext('hello')
gettext('hello' 'world')
ngettext('cat', '%d cats', 5)
pgettext('homepage', 'hello')
npgettext('homepage', 'cat', '%d cats', 5)
i18n.gettext('hello') // any object can expose the gettext API
this.gettext('hello')
ninterpolate('cat', '%d cats', 5)
ninterpolate('cat', '%(count)s cats', 5, {count: 5})
Disallow literal strings inside interpolate
functions. The interpolated string must be (a variable) wrapped with gettext.
// Disallows:
interpolate('bla')
// Allows:
interpolate(gettext('bla'))
interpolate(hopefullyTranslatedVar)
Require that all strings containing multiple variables also includes positional marker. This allows translator to reorder variables, and prevents sprintf()
errors if someone change the order of %s
and %d
.
// Disallows:
gettext('There is %d more event in the %s.')
gettext('There is %d more event in the %1$s.')
// Allows:
gettext('There is %d more event in the game.')
ngettext('cat %1$s $2$s', '%1$d cats %2$d dogs', count)
MIT © App Annie