fnando/i18n-js
66.8
Adequate · 28 September 2026
1.5k
lines of production code
Ruby
with TypeScript
2
measurements over time
What this system is
This system is a Ruby gem that provides a command-line interface and library for managing internationalization (i18n) in JavaScript and TypeScript projects. It automates the extraction, linting, and export of translation keys, supporting parallel processing and configurable pipelines. The tool allows developers to transform translations via a plugin architecture and ensures consistency by detecting missing or extraneous keys in source code.
Features
Introduction of a plugin API and enhanced configuration validation
The library now supports a plugin system that allows users to transform translations and process exported files via a configurable pipeline. This change introduces a new \pipeline\ configuration section where plugins can be ordered and enabled/disabled, along with schema validation for these new settings. Additionally, the configuration schema has been expanded to include \lint\_scripts\ and \lint\_translations\ sections, improving the structure and validation of linting rules. The Guard integration has also been updated to shell out to the \i18n export\ command instead of calling the library directly, ensuring consistent behavior with the CLI.
i18n-js · high confidence
New linting commands and enhanced CLI output options
The CLI now includes \lint:scripts\ and \lint:translations\ commands to detect missing or extraneous translation keys in JavaScript/TypeScript files and across locales, respectively, supporting glob-based ignore patterns. The \export\ command gains a \--quiet\ flag to suppress non-error output, and the \init\ command now defaults to \config/i18n.yml\ if no config file is specified. Additionally, the UI layer now supports colored output (with \NO\_COLOR\ environment variable support) and improved timing benchmarks.
lib/i18n-js/cli · high confidence
Behavioural changes
CLI entry point now loads the dedicated CLI module
The executable script in the exe directory has been updated to require the specific CLI implementation (lib/i18n-js/cli) instead of the general library entry point. This change ensures that only the code necessary for command-line operation is loaded when running the tool, potentially reducing startup overhead and preventing unintended side effects from loading the full library.
exe · high confidence
Enhanced export pipeline with plugins, parallel processing, and smart file updates
The translation export process now supports a plugin API that allows transformations to be applied to translations before they are written to disk. Exports are processed in parallel when the output path includes a :locale placeholder, significantly improving performance for multi-locale projects. Additionally, the system now supports MD5 digests in output filenames (:digest) and avoids rewriting files if their content has not changed, which helps asset pipelines detect changes more accurately. Configuration files are now parsed as ERB templates, enabling dynamic configuration values.
lib · high confidence
Major release v5.0.0-rc1 with plugin architecture and new CLI commands
This release introduces a new plugin system that allows transforming translations and exporting files via templates, including a built-in plugin to respect I18n fallback chains. The CLI now supports linting JavaScript/TypeScript files for translation usage and managing plugins, while the watch mode has been improved to support multiple locale directories, custom options, and controlled export timing on boot.
lib/i18n-js · high confidence
New release script using npm for compilation
A new release script has been added to the bin directory that automates versioning and release processes. The script now uses npm to install dependencies and compile the project before updating the version number and changelog, replacing previous methods. It supports major, minor, and patch version bumps, as well as pre-release tags like alpha and rc, and includes a dry-run mode for testing without committing changes.
bin · high confidence
Test coverage
Added and updated CLI command tests; Added test configuration files for translation pipeline features; Added test coverage for i18n-js plugin system and export behavior; Added test fixtures for i18n plugin features; Updated test helper configuration and coverage setup.
Dependencies
Dependency updates and Ruby version requirement increase
The project now requires Ruby 3.2 or higher and adds a new runtime dependency on concurrent-ruby (\>= 1.3.1). The gemspec also excludes images from the package and includes the generated lint.js file. Additionally, the Node.js tooling has been updated to use esbuild 0.28.1, glob 13.0.6, and TypeScript 5.6.0, with @types/node 25.9.1 as a dev dependency.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 65 → 67 (+1.5)
- Rubric changed (rubric-2026.09.8 → rubric-2026.09.16) — scores are not directly comparable.
Lenses
- Code Health 100 → 100 (+0.0)
- Architecture 69 → 69 (+0.0)
- Maturity 55 → 55 (+0.0)
- Readiness 77 → 79 (+1.7)
- Security 74 → 88 (+14.1)
Resolved (5)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- High CVE: [CVE redacted] (package-lock.json)
- High CVE: [CVE redacted] (package-lock.json)
- High CVE: [CVE redacted] (package-lock.json)
New (4)
- Conflicting lifecycle management. I18nJS.listen appears to start the watcher/process, while I18njs.start() and I18njs.stop() suggest a separate explicit lifecycle control. It is unclear if listen implicitly calls start, or if they are redundant ways to start the service.
- Duplicate intent with different casing and namespace. Both I18nJS and I18njs (note the case difference) expose a capture method. It is unclear if these are aliases, distinct implementations, or a legacy vs. new API conflict.
- Inconsistent initialization patterns. The main entry point I18nJS uses call for its primary setup, while the internal I18njs module uses initialize. Furthermore, various sub-components (CLI, Command, UI, Template, Plugin, Schema) all use initialize but with vastly different signatures and responsibilities, making the entry point confusing. I18nJS.call is an unusual name for a setup/configuration method compared to standard initialize or configure patterns seen elsewhere in the codebase.
- Inconsistent naming for similar operations. relative_path handles a single path, while relative_path_list handles a list. Standard convention often uses pluralization for collections (e.g., relative_paths) or a generic method that accepts both, rather than switching suffixes between _path and _path_list.
Architecture
- Unchanged — 0 containers · 1 contexts · 0 edges
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
fnando/i18n-js was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 28 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 8a75353191741da46738eadec28614db1455e800 — the exact code this score is about.
- Scored under rubric-2026.09.16 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-2d9048c36d26.