Installation
any-i18n has three independent parts. The extension works on its own if you import translation files by hand; the server and the CLI are optional helpers that produce those files.
Requirements
Section titled “Requirements”- A Chromium-based browser (Chrome, Edge) or Firefox 109+ for the extension
- Node.js 22.12+ for the CLI and the build script
- Python 3.10+ for the translation server (
dict[str, str]type syntax is used)
Get the source
Section titled “Get the source”git clone https://github.com/rennerdo30/any-i18n.gitcd any-i18nThere are no dependencies to install for the extension itself — it is plain JavaScript loaded directly by the manifest, with no bundler and no build step for development.
Load the extension
Section titled “Load the extension”- Open
chrome://extensions(oredge://extensions). - Enable Developer mode.
- Click Load unpacked and select the
extension/directory.
- Open
about:debugging#/runtime/this-firefox. - Click Load Temporary Add-on.
- Select
extension/manifest.json.
Temporary add-ons are removed when Firefox restarts. For a persistent install, build a
Firefox package first (see below) — the build adds the required
browser_specific_settings.gecko block.
The extension requests only storage, activeTab, and scripting, plus host access to
http://localhost:39418/* so it can talk to a translation server running on your own machine.
Start the translation server (optional)
Section titled “Start the translation server (optional)”The server translates batches of keys through an LLM backend and caches the results in SQLite.
./server/start.shThe script creates server/.venv if it does not exist, installs
server/requirements.txt into it, and runs python -m server.run from the repository root.
python3 -m venv server/.venvsource server/.venv/bin/activatepip install -r server/requirements.txtpython -m server.runRun it from the repository root — server.main imports its modules as server.*.
server/run.py starts uvicorn on 0.0.0.0 at port 39418 with auto-reload enabled. Pass
--no-reload to disable reloading:
python -m server.run --no-reloadCheck that it is up:
curl http://localhost:39418/api/health# {"status":"ok","backend":"claude-cli"}The default backend shells out to a locally installed CLI tool. See Configuration for the available backends and their environment variables.
Install the CLI (optional)
Section titled “Install the CLI (optional)”cd clinpm installThe CLI is an ESM package with a single dependency (commander) and exposes the any-i18n binary:
npx any-i18n --helpBuild distributable packages
Section titled “Build distributable packages”node scripts/build.js # chrome, firefox and edgenode scripts/build.js --browser chrome # a single targetEach run wipes dist/ and copies extension/ into dist/<browser>/. For the Firefox target the
manifest is patched with browser_specific_settings.gecko (id: any-i18n@extension,
strict_min_version: 109.0). The resulting directories are ready to zip and upload.
The same commands are available through npm scripts:
npm run buildnpm run build:chromenpm run build:firefox