
Research
/Security News
Mini Shai-Hulud Campaign Hits Red Hat Cloud Services npm Packages
A mini Shai-Hulud campaign compromised Red Hat Cloud Services npm packages to steal developer and CI/CD secrets during installation.
i18n-state-manager
Advanced tools
Git-native translation management with intelligent stale detection. Hash-based state tracking ensures your translations stay synchronized with your code.
Git-native translation management with intelligent stale detection
Most translation management tools can detect missing translations, but they cannot identify when translations become outdated.
When you change source text from "Click to save" to "Click to save changes", other languages still reference the old translation. Traditional tools don't catch this because the translation technically exists.
i18n-state-manager uses hash-based state tracking to detect three translation states:
check-usage and find-unused commands)Install ripgrep:
# macOS
brew install ripgrep
# Ubuntu/Debian
apt install ripgrep
# Arch Linux
pacman -S ripgrep
# Fedora
dnf install ripgrep
# Windows
choco install ripgrep
# Install
npm install -D i18n-state-manager
# Initialize
npx i18n-state init
# Sync translations
npx i18n-state sync
# Check status
npx i18n-state verify
i18n.manifest.json)Contains SHA1 hashes of all source language strings:
{
"common.save": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",
"common.cancel": "c3499c2729730a7f807efb8676a92dcb6f8a3f8f"
}
i18n.state.json)Tracks translation status for each locale:
{
"fr": {
"common.save": {
"source": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",
"translation": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8"
}
}
}
When English changes from "Save" to "Save changes":
i18n-state syncUpdate manifest and state files after changing translations.
i18n-state verifyCheck for missing and stale translations (fails on issues - perfect for CI).
$ npx i18n-state verify
Translation Statistics:
fr: 1465/1540 (95%) up-to-date, 0 stale
de: 1487/1540 (97%) up-to-date, 0 stale
Missing translations:
[fr] 75 missing keys:
- settings.newFeature.title
- settings.newFeature.description
...
i18n-state statusShow translation coverage summary (non-failing).
i18n-state check-usageFind translation keys used in code and verify they exist in source locale.
$ npx i18n-state check-usage
Found 1172 unique translation keys in source code
Keys used in code but missing from en.ts:
- modals.newModal.title
i18n-state find-unusedFind keys in source locale that aren't used in source code.
i18n-state check-duplicatesCheck for duplicate keys in translation files.
i18n-state generate-template <locale>Generate a translation template file.
$ npx i18n-state generate-template fr
Statistics:
Total keys: 1540
Up-to-date: 1465
Missing: 75
Stale: 0
# Template file contains:
# - Existing translations (preserved)
# - Missing keys marked "TODO: English text"
# - Stale keys marked "STALE: old translation"
Create i18n-state.config.json:
{
"sourceLocale": "en",
"resourcesDir": "src/i18n/resources",
"manifestPath": "i18n.manifest.json",
"statePath": "i18n.state.json",
"scanDirs": ["src"],
"scanExtensions": ["ts", "tsx", "js", "jsx"],
"patterns": [
{
"name": "t()",
"regex": "\\bt\\([\"']([^\"']+)[\"']\\)"
},
{
"name": "translate()",
"regex": "\\btranslate\\([\"']([^\"']+)[\"']\\)"
}
]
}
# 1. Add English strings
# Edit src/i18n/resources/en.ts
# 2. Update manifest/state
npx i18n-state sync
# 3. Generate templates for other locales
npx i18n-state generate-template fr
npx i18n-state generate-template de
# 4. Translate TODO items in *.template.ts files
# 5. Verify everything
npx i18n-state verify
Add to your GitHub Actions workflow:
- name: Check translations are up-to-date
run: |
npm run i18n-state sync
if [[ -n "$(git status --porcelain)" ]]; then
echo "Translation files are out of date"
exit 1
fi
npm run i18n-state verify
Currently supports TypeScript (.ts) files only:
import { Translation } from "../types";
export const fr: Translation = {
common: {
save: "Enregistrer",
cancel: "Annuler",
},
settings: {
title: "Paramètres",
}
};
Note: JSON and JavaScript formats are not currently supported. Translation files must be TypeScript files with the structure shown above.
| Feature | i18n-state-manager | i18n-tasks | Locize | react-intl |
|---|---|---|---|---|
| Stale detection | Hash-based | No | Timestamp-based | No |
| Local-first | Yes | Yes | Cloud-only | Yes |
| Find unused keys | Yes | Yes | Yes | Basic |
| CI/CD enforcement | Yes | Manual | Yes | No |
| Template generation | Yes | No | Web UI | No |
| Cost | Free | Free | $500+/mo | Free |
Contributions welcome! Please read our Contributing Guide.
MIT © Callum Alpass
Developed as part of TaskNotes, an Obsidian plugin for task management.
FAQs
Git-native translation management with intelligent stale detection. Hash-based state tracking ensures your translations stay synchronized with your code.
We found that i18n-state-manager demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
A mini Shai-Hulud campaign compromised Red Hat Cloud Services npm packages to steal developer and CI/CD secrets during installation.

Research
/Security News
The North Korean malware loader hides in a Packagist-listed package and its GitHub branch to fetch and execute remote code in a likely Contagious Interview-style lure.

Security News
The Rust project is moving toward formal rules on LLM use in contributions after months of internal debate over maintainer burden, code quality, and contributor experience.