Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

First pass at I18N-specific ESLint rules #20555

Merged
merged 47 commits into from Apr 2, 2020
Merged

Conversation

swissspidy
Copy link
Member

@swissspidy swissspidy commented Feb 29, 2020

Description

This PR adds new I18N-related ESLint rules to @wordpress/eslint-plugin and leverages them in Gutenberg. Changes in this PR:

  • New Rule: @wordpress/i18n-text-domain
    makes sure the text domain is not forgotten and matches a whitelist of allowed text domains. For WordPress projects, using the default domain ('default') can be allowed. This rule is also partially auto-fixable!
  • New Rule: @wordpress/i18n-translator-comments
    makes sure any translation functions with placeholders in them have accompanying translator comments.
  • New Rule: @wordpress/i18n-no-variables
    Enforce string literals as translation function arguments
  • New Rule: @wordpress/i18n-no-placeholders-only
    Prevent using only placeholders in translatable strings
  • New Rule: @wordpress/i18n-no-collapsible-whitespace
    Disallow collapsible whitespace in translatable strings.
  • New Rule: @wordpress/i18n-ellipsis
    Disallow using three dots in translatable strings
  • There is a new i18n ruleset that includes all i18n-related rules and is included in the recommended ruleset.
  • The valid-sprintf rule has been moved from the custom ruleset to the i18n ruleset.
  • Fixed Gutenberg code base as per these new rules.

See #19777 for context.

I might work on more enhancements mentioned on that issue depending on usefulness and demand. Please leave a comment there with any suggestions!

How has this been tested?

Rigorous unit tests as well as application of the new rules against the Gutenberg code base.

Types of changes

New feature (non-breaking change which adds functionality)

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR.

@swissspidy swissspidy added [Type] Enhancement A suggestion for improvement. Internationalization (i18n) Issues or PRs related to internationalization efforts [Package] ESLint plugin /packages/eslint-plugin labels Feb 29, 2020
@github-actions
Copy link

github-actions bot commented Feb 29, 2020

Size Change: +2 B (0%)

Total Size: 884 kB

Filename Size Change
build/block-directory/index.js 6.03 kB +5 B (0%)
build/edit-post/index.js 92.3 kB -3 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.02 kB 0 B
build/annotations/index.js 3.45 kB 0 B
build/api-fetch/index.js 3.8 kB 0 B
build/autop/index.js 2.59 kB 0 B
build/blob/index.js 620 B 0 B
build/block-directory/style-rtl.css 760 B 0 B
build/block-directory/style.css 760 B 0 B
build/block-editor/index.js 102 kB 0 B
build/block-editor/style-rtl.css 11.2 kB 0 B
build/block-editor/style.css 11.2 kB 0 B
build/block-library/editor-rtl.css 7.21 kB 0 B
build/block-library/editor.css 7.21 kB 0 B
build/block-library/index.js 110 kB 0 B
build/block-library/style-rtl.css 7.5 kB 0 B
build/block-library/style.css 7.51 kB 0 B
build/block-library/theme-rtl.css 669 B 0 B
build/block-library/theme.css 671 B 0 B
build/block-serialization-default-parser/index.js 1.65 kB 0 B
build/block-serialization-spec-parser/index.js 3.1 kB 0 B
build/blocks/index.js 57.5 kB 0 B
build/components/index.js 195 kB 0 B
build/components/style-rtl.css 16.1 kB 0 B
build/components/style.css 16 kB 0 B
build/compose/index.js 6.21 kB 0 B
build/core-data/index.js 10.7 kB 0 B
build/data-controls/index.js 1.03 kB 0 B
build/data/index.js 8.23 kB 0 B
build/date/index.js 5.37 kB 0 B
build/deprecated/index.js 772 B 0 B
build/dom-ready/index.js 569 B 0 B
build/dom/index.js 3.05 kB 0 B
build/edit-navigation/index.js 2.48 kB 0 B
build/edit-navigation/style-rtl.css 239 B 0 B
build/edit-navigation/style.css 241 B 0 B
build/edit-post/style-rtl.css 12 kB 0 B
build/edit-post/style.css 12 kB 0 B
build/edit-site/index.js 9.09 kB 0 B
build/edit-site/style-rtl.css 4.62 kB 0 B
build/edit-site/style.css 4.62 kB 0 B
build/edit-widgets/index.js 4.43 kB 0 B
build/edit-widgets/style-rtl.css 3.74 kB 0 B
build/edit-widgets/style.css 3.74 kB 0 B
build/editor/editor-styles-rtl.css 423 B 0 B
build/editor/editor-styles.css 426 B 0 B
build/editor/index.js 42.8 kB 0 B
build/editor/style-rtl.css 3.47 kB 0 B
build/editor/style.css 3.47 kB 0 B
build/element/index.js 4.44 kB 0 B
build/escape-html/index.js 733 B 0 B
build/format-library/index.js 6.95 kB 0 B
build/format-library/style-rtl.css 502 B 0 B
build/format-library/style.css 502 B 0 B
build/hooks/index.js 1.93 kB 0 B
build/html-entities/index.js 622 B 0 B
build/i18n/index.js 3.57 kB 0 B
build/is-shallow-equal/index.js 710 B 0 B
build/keyboard-shortcuts/index.js 2.3 kB 0 B
build/keycodes/index.js 1.7 kB 0 B
build/list-reusable-blocks/index.js 2.99 kB 0 B
build/list-reusable-blocks/style-rtl.css 226 B 0 B
build/list-reusable-blocks/style.css 226 B 0 B
build/media-utils/index.js 4.84 kB 0 B
build/notices/index.js 1.57 kB 0 B
build/nux/index.js 3.01 kB 0 B
build/nux/style-rtl.css 616 B 0 B
build/nux/style.css 613 B 0 B
build/plugins/index.js 2.54 kB 0 B
build/primitives/index.js 1.5 kB 0 B
build/priority-queue/index.js 780 B 0 B
build/redux-routine/index.js 2.84 kB 0 B
build/rich-text/index.js 14.5 kB 0 B
build/server-side-render/index.js 2.54 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.28 kB 0 B
build/url/index.js 4.01 kB 0 B
build/viewport/index.js 1.6 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.17 kB 0 B

compressed-size-action

.eslintrc.js Outdated Show resolved Hide resolved
@aaemnnosttv
Copy link

These rules work great! What's left here before this can be merged?

Copy link
Member

@aduth aduth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good 👍

packages/eslint-plugin/rules/i18n-text-domain.js Outdated Show resolved Hide resolved
packages/eslint-plugin/rules/i18n-translator-comments.js Outdated Show resolved Hide resolved
packages/eslint-plugin/utils/get-text-content-from-node.js Outdated Show resolved Hide resolved
@swissspidy
Copy link
Member Author

@aduth Thanks a ton for your multiple rounds of thorough reviews!

I'll wait for the tests to pass and perhaps let it sink for a little bit before eventually merging this :-)

Next up on my plate will be #20574.

@swissspidy swissspidy merged commit 4bbfbc1 into master Apr 2, 2020
@github-actions github-actions bot added this to the Gutenberg 7.9 milestone Apr 2, 2020
@aduth aduth deleted the add/i18n-eslint-rules branch April 2, 2020 13:07
@gziolo
Copy link
Member

gziolo commented Apr 27, 2020

I raised it earlier and now it's reported by JimSchofield in #21920 (i18n ESlint rules do not correctly default text-domain). Any thoughts about how to make things easier for 3rd party projects to use the default ESLint ruleset?

@aduth
Copy link
Member

aduth commented May 1, 2020

I missed in my review that all rules should be included in the table listing in the root README.md of @wordpress/eslint-plugin:

https://github.com/WordPress/gutenberg/blob/master/packages/eslint-plugin/README.md#rules

Fix proposed at: #22042

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Internationalization (i18n) Issues or PRs related to internationalization efforts [Package] ESLint plugin /packages/eslint-plugin [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants