Update PlainTab I18N

SkillDev tools

Maintain PlainTab runtime UI translations and i18n language packs. Use when adding, editing, formatting, validating, or reviewing UI text in js/i18n/*.js, js/languages.js, data-i18n markup, or t(key) calls; also use when onboarding/help copy or new settings need localized strings.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Update PlainTab I18N skill

What this skill tells your AI

The instructions your AI receives, as published by kaininx/plaintab in .agents/skills/update-i18n/SKILL.md and read by ahel’s review.

Use this skill for PlainTab runtime UI copy. Keep the runtime contract unchanged:

  • js/languages.js is the synchronous language bootstrap and must stay early in index.html.
  • js/i18n/*.js are language packs that assign flat objects to window.I18N["locale"].
  • Runtime code should call t(key) or use existing data-i18n; do not hard-code UI language branches.
  • Keep all language packs key-complete. zh-CN and en need carefully maintained copy, and every supported locale should receive localized UI text for newly added runtime keys. Do not use English as the default fallback for non-English packs; only leave a product name, protocol, shortcut, or technical token in English when that exact token is the UI concept.

Workflow

  1. Read .claude/rules/30-language.md and any touched runtime file.
  2. Add or update flat keys in every js/i18n/*.js file. New user-facing keys must be localized for all supported locales, not copied from en.
  3. Keep language packs multi-line, one key per line:
window.I18N["en"] = {
    "someKey": "Some text",
    "anotherKey": "Another text"
};
  1. In runtime code, reference keys through t("someKey"). Avoid detecting language manually for UI strings.
  2. For generated or mechanical updates, preserve UTF-8 text. Be careful with PowerShell pipelines that can turn non-ASCII text into ?; prefer apply_patch or an ASCII-safe temporary script that is deleted after use.
  3. If adding user-facing behavior, keep first-paint rules intact; do not move js/languages.js or js/preload.js.

Validation

Run these checks before finishing:

Get-ChildItem js\i18n\*.js | ForEach-Object { node --check $_.FullName }
node --check js\languages.js
node --check js\newtab.js
@'
const fs = require('fs');
global.window = {};
global.document = { write() {} };
global.navigator = { language: 'en' };
global.localStorage = { getItem() { return ''; } };
require('./js/languages.js');
for (const file of fs.readdirSync('js/i18n').filter(f => f.endsWith('.js'))) require('./js/i18n/' + file);
const report = window.validatePlainTabI18N({ silent: true });
if (!report.ok) {
  console.log(JSON.stringify(report, null, 2));
  process.exit(1);
}
console.log('validatePlainTabI18N ok');
'@ | node -

If only specific runtime files changed, still run git diff --check on the touched files.

Also audit newly added keys for accidental English fallback in non-English packs. A value that is identical to window.I18N.en[key] should be treated as suspicious unless it is an intentional product name, protocol, shortcut, or technical token.

Signals

GitHub stars
88
Forks
5
Last commit
May 2026
Advanced
Catalog kind
skill
Gateway key
update-i18n
Source
github.com/kaininx/plaintab