Skip to content

`i18n-lint` is a tool for detecting possible hardcoded strings in HTML and HTML-based template source files. It can be used a CLI utility, a library or a Grunt plugin. ⛺




Repository files navigation

i18n-lint GitHub version

Detect possible instances of untranslated strings being used in HTML and HTML-derived template languages

Build Status Dependency Status devDependency Status Coverage Status

i18n-lint is a tool for detecting hardcoded (untranslated) strings in HTML and template source files. It can be used a CLI utility, or as library. i18n-lint detects instances where a HTML element's text node or certain attributes look like a hardcoded string.

See for the full documentation and demos.

i18n-lint screenshot

Getting started


Install using npm:

  $ npm install -g jwarby/i18n-lint

Installing globally will give you access to the i18n-lint binary from anywhere.


See for the full documentation.


The CLI program is called i18n-lint, and will be available once i18n-lint has been installed globally.


  $ i18n-lint [OPTIONS] <file ...>

Program help and information

  • Run i18n-lint --help or i18n-lint -h to display help output and then exit
  • Run i18n-lint --version or i18n-lint -V to display version and then exit
  • Run man i18n-lint on systems which support man to view the Linux manual page

Linting files

To lint a file, call i18n-lint <file>:

  $ i18n-lint some_file.html

You can use a glob pattern too:

  $ i18n-lint app/views/**/*.html


-h, --help

Display help and then exit

-V, --version

Display version information and then exit

-t, --template-delimiters <delimiters>

Set the template delimiters which the source files use. The value should be the start and end delimiters, separated by a comma. For example, if running i18n-lint against template files which use a Mustache-like syntax, use the following:

  $ i18n-lint -t "{{,}}" views/**/*.hbs

Similarly, but for EJS-syntax:

  $ i18n-lint -t "<%,%>" views/**/*.ejs
-a, --attributes <attributes>
default: alt,placeholder,title

A comma-separated list of which HTML attributes should be checked.

-i, --ignore-tags <tags>
default: style,script

A comma-separated list of HTML tags to ignore when searching for hardcoded strings.

-r, --reporter <reporter>
default: default

The reporter to use when outputting information. The reporters follow the same structure as JSHint reporters, and the i18n-lint library reports error in the same manner as JSHint - this means you can use any existing JSHint reporters as reporters for i18n-lint!

There are 3 built-in reporters that get shipped with i18n-lint: default, unix and json.

To write your own reporters, look to lib/reporters/*.js as a starting point.

--exclude <patterns>

A comma-separated list of file patterns to exclude, such as 'docs/,ignored.html'.


Maintain/turn off colored output. For more info, see

Exit Status

  • 0: if everything went OK, and no hardcoded strings were found
  • 1: if hardcoded strings were found
  • 64: command-line usage error, e.g. no input files provided ([EX_USAGE])
  • 66: cannot open input, e.g. input files I/O error, specified reporter file does not exist ([EX_NOINPUT])
  • 70: internal software error ([EX_SOFTWARE])

Colored Output

To maintain colored output, run i18n-lint with the --color flag:

  $ i18n-lint --color **/*.html | less -R


To use i18n-lint as a library, install it locally and require it in your projects:

  $ npm install --save-dev i18n-lint
var I18nLint = require('i18n-lint');

var errors = I18nLint('some_file.ejs', {
  templateDelimiters: ['<%','%>'],
  attributes: ['title', 'alt', 'data-custom-attr']

If you want to scan a string instead of reading in a file, you can use the scan function:

var I18nLint = require('i18n-lint');

var context = '<h1>Some hardcoded string</h1>\n<br>\n<p>\ncontent not translated</p>';

var options = {
  // ...snip...

var errors = I18nLint.scan(context, options);

The scan function can also accept a fileName parameter:

var I18nLint = require('i18n-lint');

var stdin = '';

// Read stdin stream
// ...snip...

// Once stdin has finished...
var errors = I18nLint(context, options, 'stdin');

This allows more meaningful output when the reporters print a filename.


Options are passed as an object, as the second parameter to i18n-lint.

type: Array, default: []

Specify the start and end template delimiters which the source files use. For example, when linting EJS files:

  I18nLint('file.ejs', {
    templateDelimiters: ['<%', '%>']
type: Array, default: ['alt', 'placeholder', 'title']

Specify which HTML attributes to check when searching for hardcoded strings.

type: Array, default: ['style', 'script', 'pre', 'code']

An array of tags which should be ignored when searching for hardcoded strings.

Using Reporters

When using i18n-lint as a library, you can still use the reporters:

// {
//  default: [Function]
// }

var reporter = I18nLint.reporters.default;
var errors = I18nLint('file.html', {});


There are currently 3 built-in reporters: default, unix and json.

To use other reporters, simply require them:

var I18nLint = require('i18n-lint');
var reporter = require('i18n-lint-awesome-reporter');

reporter(I18nLint('file.html', {}));

Error Format

  file: '', // string, file which contains the errors,
  error: {
    id: String, // usually '(error)'
    code: String, // warning code (see Warning Numbers)
    reason: String, // message describing the error
    evidence: RegExp, // with the offending text in match groups
    line: Number, // line number of the error
    character: Number, // column where evidence begins
    scope: String // where the error was found


There is a grunt task which wraps i18n-lint's functionality, which can be found at

Warning Numbers

  • W001: hardcoded text node found
  • W002: hardcoded attribute value found



Running Tests

  • npm test
    • lints JS files in bin/, lib/ and test/
    • runs mocha test suite

Generate Code Coverage Report

  • npm run-script coverage
    • coverage is output to a ./coverage directory

Release History

i18n-lint follows SemVer rules for version numbers.

No releases yet


Copyright (c) 2015 James Warwood. Licensed under the MIT license.


See AUTHORS.txt.



`i18n-lint` is a tool for detecting possible hardcoded strings in HTML and HTML-based template source files. It can be used a CLI utility, a library or a Grunt plugin. ⛺







No releases published


No packages published


  • JavaScript 100.0%