Docs Website
kurotu/VRCQuestTools
Use this skill FIRST for any task whose output lives in the Website/ directory — the VRCQuestTools user manual / docs site (Docusaurus, bilingual en/ja).
Sets the rules for translating and updating Plane's UI strings across locales: do-not-translate terms, plural forms, placeholders and AI translation review.
$ npx skills add makeplane/plane --skill translate -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install makeplane/plane translate --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/makeplane/plane.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/translate .claude/skills/translate && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "translate" agent skill from https://github.com/makeplane/plane/tree/preview/.claude/skills/translate into .claude/skills/translate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "translate", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/makeplane/plane/tree/preview/.claude/skills/translateType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add makeplane/plane --skill translate -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install makeplane/plane translate --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/makeplane/plane.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/translate .agents/skills/translate && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "translate" agent skill from https://github.com/makeplane/plane/tree/preview/.claude/skills/translate into .agents/skills/translate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "translate", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add makeplane/plane --skill translate -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install makeplane/plane translate --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/makeplane/plane.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/translate .cursor/skills/translate && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "translate" agent skill from https://github.com/makeplane/plane/tree/preview/.claude/skills/translate into .cursor/skills/translate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "translate", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/makeplane/plane.git --path .claude/skills/translate--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add makeplane/plane --skill translate -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install makeplane/plane translate --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/makeplane/plane.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/translate .gemini/skills/translate && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "translate" agent skill from https://github.com/makeplane/plane/tree/preview/.claude/skills/translate into .gemini/skills/translate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "translate", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install makeplane/plane translateInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add makeplane/plane --skill translate -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/makeplane/plane.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/translate .github/skills/translate && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "translate" agent skill from https://github.com/makeplane/plane/tree/preview/.claude/skills/translate into .github/skills/translate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "translate", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add makeplane/plane --skill translate -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install makeplane/plane translate --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/makeplane/plane.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/translate .opencode/skills/translate && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "translate" agent skill from https://github.com/makeplane/plane/tree/preview/.claude/skills/translate into .opencode/skills/translate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "translate", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
translateSets the rules for translating and updating Plane's UI strings across locales: do-not-translate terms, plural forms, placeholders and AI translation review.
The skill governs every change to the locale files under packages/i18n/src/locales. The English files are the source of truth and every other locale mirrors them key for key. A sync-check script catches missing, stale and colliding keys but not poor translations, which is the gap this skill fills. It applies when adding or rewording keys, adding a language, syncing after drift is reported, or reviewing a pull request that touches the locales; trivial English typo fixes can skip it.
Two iron rules lead. Trademarks, brand marks, plan tier names, third-party product names, acronyms and code tokens are never translated, while everyday feature nouns such as Cycle, Module, Epic and Page are translated using a glossary. Every target locale must also carry each CLDR plural category its language needs, since a missing form shows the wrong word at runtime and passes the sync check silently. Further sections cover placeholder and tag preservation, per-locale punctuation and register, a review workflow for AI translation, and how to add a locale the skill does not yet document.
2 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 7466675. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pnpmgitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pnpm and git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Plane UI Translation loads about 16k tokens when it runs. Until then it costs about 92 tokens; SKILL.md has 5,855 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from makeplane/plane at commit 7466675, republished under its AGPL-3.0 licence (© makeplane). 5,855 words, ~15,541 tokens.
.claude/skills/translate/SKILL.md (or your agent's skills folder).<!--
`user_invocable: true` is advisory and follows the same convention as the existing
`pr-description.md` and `release-notes.md` skills in this repo. No harness behavior
in this codebase keys off the field today; it documents intent for the Claude Code
skill registry. The skill is invoked via the slash command (`/translate`) registered
in `.claude/commands/translate.md`, or by name when an agent infers relevance.
-->
Single source of truth for turning English UI strings into every target locale under packages/i18n/src/locales/. Follow this skill exactly — every mistake here ships to every user in that language.
The locale list grows over time. This skill is intentionally generic: rules apply to any locale present now or added later. When you add a locale not explicitly named below, see Adding a locale not documented here at the bottom.
Sources distilled from: Microsoft Localization Style Guides, Mozilla L10n, Unicode CLDR plural rules, W3C i18n, Google developer style guide, Apple HIG, GitHub Primer, MQM error typology, Lokalise/Crowdin/Phrase best-practice docs, and Microsoft's AI/LLM-for-translation guidance.
Source of truth: packages/i18n/src/locales/en/<namespace>.json. Every other locale mirrors English key-for-key. The sync-check.ts script catches missing / stale / collision keys; it does not catch value-quality mistakes. That is what this skill is for.
packages/i18n/src/locales/en/*.jsonen/, then translate each file)pnpm --filter @plane/i18n run sync:check reports driftpackages/i18n/src/locales/Skip only for trivial English-only typo fixes that don't change meaning or length meaningfully.
sync-check silently.Common feature nouns — Cycle, Module, Epic, Page — are translated into the target language using the canonical glossary further down. They are not brand marks; they are everyday words that belong in the user's language.
The rest of this skill explains how to execute on those rules.
For each term: the source, the required rendering per script group, and forbidden renderings that have appeared historically and must be reverted when seen.
| Source term | Latin locales (fr, es, it, de, pt-BR, pl, cs, sk, ro, tr-TR, vi-VN, id) | ja (katakana-default) | ko (Hangul-default) | zh-CN / zh-TW | ru | ua | Forbidden (never produce) |
|---|---|---|---|---|---|---|---|
| Plane | Plane | Plane | Plane | Plane | Plane | Plane | 飛行機, 飞机, 비행기, Самолёт, Літак, Avion, Avião, Aereo, Flugzeug |
| Plane AI (formerly PI Chat) | Plane AI | Plane AI | Plane AI | Plane AI | Plane AI | Plane AI | Чат ИИ, AI 聊天, AIチャット, AI 채팅, Chat IA, AI Çet, PI Chat (legacy) |
| Power K | Power K | Power K | Power K | Power K | Power K | Power K | Command K, Command Palette, コマンドパレット, 命令面板, Палитра команд |
| PQL | PQL | PQL | PQL | PQL | PQL | PQL | any expansion of the acronym into the target language |
| Intake (feature name) | Intake | Intake | Intake | Intake | Intake | Intake | Inbox, 受信箱, 收件箱, Входящие, Triage, Boîte de réception |
| Active Cycles (workspace view) | Active Cycles | Active Cycles | Active Cycles | Active Cycles | Active Cycles | Active Cycles | Translate as a unit; never split into generic "active" + localized "cycles" |
| Sticky / Stickies | Sticky / Stickies | Sticky / Stickies | Sticky / Stickies | Sticky / Stickies (Latin inside Chinese text) | Sticky / Stickies | Sticky / Stickies | 便签, 便利貼, メモ, 付箋, スティッキー, 메모, 스티키, заметка, Стикер, Note, Nota |
| Pro (plan tier) | Pro | Pro | Pro | Pro | Pro | Pro | Профессиональный, プロフェッショナル, 专业版, 專業版, Profesional |
| Business (plan tier) | Business | Business | Business | Business | Business | Business | Бизнес, ビジネス, 商业版, 商務版, Negocios, Negócios |
| Enterprise (plan tier) | Enterprise | Enterprise | Enterprise | Enterprise | Enterprise | Enterprise | Корпоративный, エンタープライズ, 企业版, 企業版, Empresarial |
These are common nouns. Translate them into the target language using the canonical form below. This follows Microsoft, Apple, and Mozilla style guides for product-UI translation: feature common nouns belong in the user's language; only trademarks, brand marks, and acronyms stay Latin. Leaving these in Latin in non-Latin locales reads as half-translated and is a measurable quality defect.
Use the table verbatim — never coin new variants; never leave the Latin form in the locale value.
| Source | zh-CN | zh-TW | ja | ko | ru | ua | de | fr | es | it | pt-BR | pl | cs | sk | ro | tr-TR | vi-VN | id |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Cycle | 周期 | 週期 | サイクル | 사이클 | Цикл | Цикл | Zyklus | Cycle | Ciclo | Ciclo | Ciclo | Cykl | Cyklus | Cyklus | Ciclu | Döngü | Chu kỳ | Siklus |
| Cycles | 周期 | 週期 | サイクル | 사이클 | Циклы | Цикли | Zyklen | Cycles | Ciclos | Cicli | Ciclos | Cykle | Cykly | Cykly | Cicluri | Döngüler | Chu kỳ | Siklus |
| Module | 模块 | 模組 | モジュール | 모듈 | Модуль | Модуль | Modul | Module | Módulo | Modulo | Módulo | Moduł | Modul | Modul | Modul | Modül | Mô-đun | Modul |
| Modules | 模块 | 模組 | モジュール | 모듈 | Модули | Модулі | Module | Modules | Módulos | Moduli | Módulos | Moduły | Moduly | Moduly | Module | Modüller | Mô-đun | Modul |
| Epic | 史诗 | 史詩 | エピック | 에픽 | Эпик | Епік | Epic | Epic | Epic | Epic | Epic | Epik | Epik | Epik | Epic | Epik | Epic | Epik |
| Epics | 史诗 | 史詩 | エピック | 에픽 | Эпики | Епіки | Epics | Epics | Epics | Epics | Epics | Epiki | Epiky | Epiky | Epice | Epikler | Epic | Epik |
| Page | 页面 | 頁面 | ページ | 페이지 | Страница | Сторінка | Seite | Page | Página | Pagina | Página | Strona | Stránka | Stránka | Pagină | Sayfa | Trang | Halaman |
| Pages | 页面 | 頁面 | ページ | 페이지 | Страницы | Сторінки | Seiten | Pages | Páginas | Pagine | Páginas | Strony | Stránky | Stránky | Pagini | Sayfalar | Trang | Halaman |
Notes:
{count, plural, ...} blocks, use the case-correct form per CLDR keyword (see the Slavic case-form table further down).Cycle, Module, Page) — that's the natural cognate, not a Latin-preservation rule.épico is for poetry/film; same for it/pt-BR/de/fr). Slavic locales use phonetic transliteration that's standard in their software industry (Эпик, Епік, Epik). CJK locales use the literal/transliterated form (史诗, エピック, 에픽).next page (paginator), the page (browser refresh), status page, web page, life cycle, release cycle, rate-limit cycle, cycle of releases — these are not the Plane Cycle/Page feature; translate them as ordinary words in the surrounding prose.chore(i18n): prefix.When a Slavic plural block counts a Plane feature noun, use these forms:
| Locale | Term | one (nom.sg.) | few | many | other |
|---|---|---|---|---|---|
| ru | Цикл | Цикл | Цикла | Циклов | Цикла |
| ru | Модуль | Модуль | Модуля | Модулей | Модуля |
| ru | Эпик | Эпик | Эпика | Эпиков | Эпика |
| ru | Страница | Страница | Страницы | Страниц | Страницы |
| ua | Цикл | Цикл | Цикла | Циклів | Цикла |
| ua | Модуль | Модуль | Модуля | Модулів | Модуля |
| ua | Епік | Епік | Епіка | Епіків | Епіка |
| ua | Сторінка | Сторінка | Сторінки | Сторінок | Сторінки |
| pl | Cykl | Cykl | Cykle | Cykli | Cyklu |
| pl | Moduł | Moduł | Moduły | Modułów | Modułu |
| pl | Epik | Epik | Epiki | Epików | Epika |
| pl | Strona | Strona | Strony | Stron | Strony |
| cs | Cyklus | Cyklus | Cykly | Cyklu | Cyklů |
| cs | Modul | Modul | Moduly | Modulu | Modulů |
| cs | Epik | Epik | Epiky | Epiku | Epiků |
| cs | Stránka | Stránka | Stránky | Stránky | Stránek |
| sk | Cyklus | Cyklus | Cykly | Cyklu | Cyklov |
| sk | Modul | Modul | Moduly | Modulu | Modulov |
| sk | Epik | Epik | Epiky | Epiku | Epikov |
| sk | Stránka | Stránka | Stránky | Stránky | Stránok |
Per CLDR for ru/ua: one fires for 1, 21, 31… (nom.sg.); few for 2–4, 22–24… (gen.sg.); many for 0, 5–20, 25–30… (gen.pl.); other for non-integer counts (gen.sg.). For pl: one (1), few (2–4 not 12–14, nom.pl.), many (0, 5–20, gen.pl.), other (decimals, gen.sg.). cs/sk: one (1), few (2–4, nom.pl.), many (decimals, gen.sg.), other (0, 5+, gen.pl.).
GitHub, GitLab, Bitbucket, Slack, Discord, Zoom, Microsoft Teams, Jira, Linear, Asana, Notion, Confluence, Trello, Figma, Google, Google Drive, Google Calendar, Google Docs, Google Sheets, Gmail, YouTube, Dropbox, Zapier, Tiptap, ProseMirror, Yjs, Hocuspocus, Socket.IO, React, TypeScript, JavaScript, Python, Django, PostgreSQL, Redis, RabbitMQ.
Also preserve: OAuth, OIDC, SAML, SSO, LDAP, API, REST, GraphQL, URL, URI, ID, UUID, JSON, YAML, CSV, TSV, XML, HTML, PDF, PNG, JPG, SVG, CSS, HTTP, HTTPS, TLS, SSL, IP, CIDR, DNS, ARIA, WCAG.
{count}, {name}, {workspace}, {userName} — never translate, never rename, never move inside {}.plural, select, one, few, many, other, zero, two, =0, =1, # — never translate.<b>…</b>, <a href="…">…</a>, <br/>, <code>…</code> — preserve attributes and nesting; translate only the visible text between tags.Trans numbered fragments: <0>…</0>, <1>…</1> — preserve the numbers exactly; only translate the wrapped text. Never renumber.**bold**, *italic*, `code`, [text](url) — keep the syntax; translate only human-readable prose.\n (newline), \t, \", \\ — preserve at the same positions.Ctrl, Cmd, Shift, Alt, Option, Enter, Return, Esc, Tab, Space, Backspace, arrow glyphs (↑↓←→), and OS glyphs (⌘⌥⌃⇧) — preserve exactly as shown on the physical key..json, .csv, MM/DD/YYYY format strings — preserve.Apply by target-language script, not by locale list. Adding a new Latin-script locale? It follows the Latin-script rules below. Adding a new Cyrillic locale? It follows the Cyrillic section. Scripts not yet shown here (Arabic, Hebrew, Thai, Greek, Hindi/Devanagari, etc.) — see Adding a locale not documented here.
Currently includes fr, es, it, de, pt-BR, pl, cs, sk, ro, tr-TR, vi-VN, id — and any future locale that uses the Latin alphabet (hu, nl, sv, da, nb, fi, hr, bg-using-Latin variants, etc.).
Translate Plane feature nouns (Cycle, Cycles, Module, Modules, Epic, Epics, Page, Pages) using the per-locale form from the glossary above. Keep Latin for Plane brand marks (Plane, Plane AI, Power K, PQL, Active Cycles, Sticky, Stickies, Intake), plan tier names (Pro, Business, Enterprise), and third-party brands (GitHub, Slack, etc.).
✅ "Créer un Cycle" (fr — natural cognate from glossary, identical to English)
✅ "Crear un nuevo Ciclo" (es — natural Spanish cognate from glossary)
✅ "Archiviare questo Modulo" (it — natural Italian cognate from glossary)
✅ "Nueva Epic" (es — Epic has no clean cognate; stays Latin per glossary)
✅ "Archivieren Sie diesen Zyklus" (de — natural German form from glossary)
✅ "Buat Siklus baru" (id — natural Indonesian form from glossary)
✅ "Buat Sticky baru" (id — Sticky is a Plane brand mark, stays Latin)
✅ "Wechseln Sie zum Pro-Plan" (de — Pro is a plan tier name, stays Latin)
❌ "Créer un Cycle" WRONG when the locale should be `Zyklus` (de). Always use the glossary form.
❌ "Archivieren Sie diesen Cycle" (de — feature noun was left in Latin; use Zyklus per glossary)
❌ "Créer un Cercle" (fr — invented translation; use the glossary form)
❌ "Nueva Saga" (es — translated "Epic" with the wrong cognate)
❌ "Buat Catatan Tempel" (id — translated "Sticky" which is a brand mark; keep Latin)Generic uses translate normally and do not follow the glossary: a paginator's next page is nächste Seite / página siguiente (generic noun, not the Plane Pages feature). The glossary applies only when EN refers to the Plane product feature.
Plane feature nouns (Cycle, Module, Epic, Page) use the natural Japanese form per the glossary above (サイクル, モジュール, エピック, ページ — katakana for foreign-origin nouns; native Japanese where one applies, like 付箋 for an Apple/Microsoft-style "sticky note"). Brand marks stay in Latin: Plane, Plane AI, Power K, PQL, Active Cycles, Sticky, Stickies, Intake, GitHub, Slack, Pro/Business/Enterprise.
For new katakana coinages and existing translations, the long-vowel mark ー is added for words ending in -er, -or, -ar, -y in English. This is the Microsoft Japanese style-guide convention and the current industry default:
Tone: polite form です・ます. Never plain form だ・である. Avoid over-formal 尊敬語・謙譲語 for SaaS product copy — it reads stilted.
Quotation marks: 「」 for primary quotes, 『』 for nested or for titles of works. Full-width punctuation: 。、()・!?.
Plane feature nouns (Cycle, Module, Epic, Page) use the natural Korean form per the glossary above (사이클, 모듈, 에픽, 페이지 — Hangul transliteration where the term is product-coined; native Korean word where one applies). Brand marks stay in Latin: Plane, Plane AI, Power K, PQL, Active Cycles, Sticky, Stickies, Intake, GitHub, Slack, Pro/Business/Enterprise.
For new terms not on the glossary: prefer the native Korean word where one exists (설정 for Settings); use Hangul phonetic transliteration for product-coined nouns with no native equivalent. Do not coerce a phonetic loanword when a natural Korean word exists — 버킷 for "Bucket" reads as a foreign trademark, 장바구니 reads as a Korean noun.
Korean particle agreement: when introducing a consonant-ending noun (사이클, 에픽, 모듈), follow with the consonant-form particle (을/은/이/과), not the vowel-form (를/는/가/와). 사이클을 추가 not 사이클를 추가.
Register:
ko/auth.json, ko/error/*.json.ko/empty-state.json, ko/tour.json. Always match the surrounding file rather than introducing a new register mid-namespace.Punctuation: Western punctuation (. , ? !); straight quotes "…" and '…'.
Plane feature nouns (Cycle, Module, Epic, Page) translate to natural Chinese per the glossary above (zh-CN: 周期, 模块, 史诗, 页面 — zh-TW: 週期, 模組, 史詩, 頁面). This is what Microsoft's zh-CN style guide and every mainstream zh-localized SaaS product (Notion, Slack, Atlassian) does for common feature nouns.
Brand marks stay Latin: Plane, Plane AI, Power K, PQL, Active Cycles, Sticky, Stickies, Intake, GitHub, Slack, Pro/Business/Enterprise — these are trademark-style terms.
Insert a half-width space on each side of embedded Latin tokens — this is Microsoft's zh-CN guideline and required for legibility. Exception: no space between a Latin token and adjacent full-width punctuation (。,;:?!); the punctuation already supplies visual breathing room.
✅ "使用 GitHub 登录" (Latin brand → half-width spaces around)
✅ "创建周期" (zh-CN feature noun translated; no Latin = no spaces)
✅ "归档此史诗" (Plane Epic → 史诗 per glossary)
✅ "添加 Sticky" (Sticky is a brand mark → Latin + half-width space)
✅ "升级到 Pro" (Pro is a plan tier → Latin)
✅ "登录 GitHub。" (no space between Latin token and full-width period)
❌ "使用GitHub登录" (Latin brand without surrounding half-width space)
❌ "创建 Cycle" (feature noun left in Latin — should be 周期)
❌ "创建Cycle" (feature noun in Latin AND missing space)
❌ "登录 GitHub 。" (stray space before full-width period)
❌ "创建赛克" (invented transliteration of Cycle — use the glossary's 周期)Punctuation is full-width: 。,?!;:. Quotes:
"…" (primary) and '…' (nested)「…」 (primary) and 『…』 (nested)《…》Variant discipline: zh-CN ≠ zh-TW. They differ in script (简体 vs 繁體) and vocabulary (视频 vs 影片; 软件 vs 軟體; 网络 vs 網路). Never mass-copy between the two directories.
Register: 您 (formal polite) in Plane UI — the product is B2B/SaaS. Reserve 你 for consumer/youth contexts (not applicable here).
Currently includes ru, ua — and any future Cyrillic locale (bg-BG, sr-Cyrl, mk, be, kk-Cyrl, etc.).
Plane feature nouns (Cycle, Module, Epic, Page) use the natural Cyrillic form per the glossary above (Цикл/Циклы, Модуль/Модули, Эпик/Эпики, Страница/Страницы in ru — Цикл/Цикли, Модуль/Модулі, Епік/Епіки, Сторінка/Сторінки in ua). Brand marks stay in Latin: Plane, Plane AI, Power K, PQL, Active Cycles, Sticky, Stickies, Intake, GitHub, Slack, Pro/Business/Enterprise.
For new terms not on the glossary: prefer the native Cyrillic word where one exists; use phonetic transliteration only when no native word applies (Бакет is wrong for "Bucket" — use Корзина/Кошик).
Slavic case forms inside {count, plural, ...} blocks are case-correct per CLDR keyword (one=nom.sg., few=gen.sg., many=gen.pl., other=gen.sg.). See the case-form table in the glossary section.
Register:
Punctuation: primary quotes «…», nested „…".
Plural forms — critical: both ru and ua require one / few / many / other. See CLDR section below.
Every {count, plural, …} string must contain every keyword the target language's CLDR rule requires. other is always required, even in single-form languages.
Canonical source: Unicode CLDR Language Plural Rules chart — the definitive, versioned list of required categories for every language. Always verify against the current CLDR chart when adding a locale, since rules occasionally shift across CLDR releases. Libraries like Intl.PluralRules can resolve the rule at runtime.
Below are the required keywords for locales currently in the repo. When adding a new locale, look up its categories in CLDR and add the row here.
| Locale | Required keywords | Example mapping |
|---|---|---|
| en, es, de, tr-TR, vi-VN, id, ja, ko, zh-CN, zh-TW | one, other (single-form locales may use other alone, but always emit other) | 1 → one; 2+ → other |
| fr | one, many, other | 0, 1 → one; 1 000 000 → many; else other |
| it | one, many, other | 1 → one; 1 000 000 → many; else other |
| pt-BR | one, many, other | 0, 1 → one; 1 000 000 → many; else other |
| ro | one, few, other | 1 → one; 0, 2–19 → few; 20+ → other |
| pl | one, few, many, other | 1 → one; 2–4 (not 12–14) → few; 0, 5–20, many-digit → many; decimals → other |
| cs | one, few, many, other | 1 → one; 2–4 → few; decimals → many; 0, 5+ → other |
| sk | one, few, many, other | same pattern as cs |
| ru | one, few, many, other | 1, 21, 31… → one; 2–4, 22–24… → few; 0, 5–20, 25–30… → many; decimals → other |
| ua | one, few, many, other | same pattern as ru |
| ar (when added) | zero, one, two, few, many, other | Six categories — the maximum any language uses |
Note on the consolidated row. CLDR itself only requires
otherfortr-TR,vi-VN,id,ja,ko,zh-CN,zh-TW(single-form locales). Emitting bothoneandotherwith identical content is a project convention — it keeps tooling and linters consistent across the codebase. It is not a CLDR requirement, andIntl.PluralRuleswill return only"other"for these locales at runtime.
For any locale not listed: look up the CLDR categories before writing a single plural string. Arabic has six; Welsh has six; most Slavic languages have four; most Romance languages have two or three; CJK / Turkic / Thai have one (still emit other).
Rules in practice:
few. Any few clause in de/*.json is a bug and must be removed.one + other with identical content so tooling and linters stay consistent.other case is always the fallback — it must render a grammatically complete sentence on its own.Examples:
// ✅ Correct — Russian (four forms; `other` fires for non-integer counts and takes genitive singular)
"members": "{count, plural, one {# участник} few {# участника} many {# участников} other {# участника}}"
// ✅ Correct — Polish (four forms)
"items": "{count, plural, one {# element} few {# elementy} many {# elementów} other {# elementu}}"
// ✅ Correct — Romanian (three forms)
"days": "{count, plural, one {# zi} few {# zile} other {# de zile}}"
// ✅ Correct — French (three forms; `many` covers 1 000 000, 2 000 000, …)
"members": "{count, plural, one {# membre} many {# membres} other {# membres}}"
// ✅ Correct — Japanese (single form, both keywords emitted)
"label": "{count, plural, one {サイクル} other {サイクル}}"
// ❌ Wrong — German with spurious `few`
"label": "{count, plural, one {Zyklus} few {Zyklen} other {Zyklen}}"
// ❌ Wrong — Russian missing `few` and `many`
"label": "{count, plural, one {Цикл} other {Циклы}}"For every translated string, verify before saving:
{variables} in source and target (character-for-character — {userName} is not {username})Trans numbered tags (<0>…</0>, <1>…</1> — never renumber)**bold**, `code`, [link text](url))\n positions (layout relies on these)Variables may be repositioned for grammatical fit:
en: "Welcome, {name}! You have {count} new work items."
fr: "Bienvenue, {name} ! Vous avez {count} nouveaux work items."
ja: "{name}さん、ようこそ。{count}件の新しい作業項目があります。"Apply in every translated string. These are MQM "Locale Conventions" violations when missed — a measurable quality defect.
Table below covers locales currently in the repo; add a row when you add a locale.
| Locale | Key rules |
|---|---|
| fr | Narrow NBSP (U+202F, fallback U+00A0) before :, ;, ?, !, %, » and after «. Primary quotes « » (with NBSPs), nested "…". |
| de | Primary quotes „…" (low-high); no NBSP before punctuation. Avoid imperatives in system strings; prefer infinitive constructions ("Werkelement erstellen", not "Erstelle ein Werkelement"). |
| es | Inverted ¿…? and ¡…! at the start of questions/exclamations. Primary quotes «…» or "…". |
| it | Primary quotes «…» or "…". |
| pt-BR | Straight quotes "…". |
| pl | Primary quotes „…". |
| cs / sk | Primary quotes „…". |
| ro | Primary quotes „…". |
| tr-TR / vi-VN / id | Straight quotes "…". Vietnamese diacritics are mandatory — never strip (no bạn → ban). |
| ru / ua | Primary «…», nested „…". |
| ja | Full-width 。、()!?・. Primary quotes 「」, nested 『』. Ellipsis … (U+2026), typically doubled as ……. |
| ko | Western . , ? !; straight quotes "…". |
| zh-CN | Full-width 。,?!;:. Primary "…", nested '…'. Work titles 《…》. Half-width space around embedded Latin tokens. |
| zh-TW | Full-width 。,?!;:. Primary 「…」, nested 『…』. Work titles 《…》. Half-width space around embedded Latin tokens. |
Formality defaults for locales currently in the repo. Add a row for each new locale, consulting the Microsoft Style Guide for that locale as the default authority on product-UI register.
| Locale | Default "you" | Notes |
|---|---|---|
| fr | vous | Never "tu" in product UI |
| es | usted + ustedes | Neutral Spanish — no "vosotros", no "tú" |
| it | Lei (formal third-person) | B2B/enterprise convention |
| de | Sie | Use infinitive constructions for system messages |
| pt-BR | você | Semi-formal default; never "tu" |
| pl | Pan/Pani + 3rd-person, or impersonal | Never "ty" |
| cs / sk | Vy (formal, 3rd-person plural) | Never "ty" |
| ro | dumneavoastră (formal) | Or impersonal |
| tr-TR | siz + -iniz endings | Never "sen" |
| vi-VN | bạn (safe neutral) | Never "mày/tao"; consistency > variety |
| id | Anda (always capitalized) | Never "kamu" in product UI |
| ja | です・ます体 | Never plain form; avoid 尊敬語・謙譲語 |
| ko | 합니다체 for system/errors; 해요체 acceptable for onboarding | Match surrounding file |
| zh-CN | 您 | B2B convention; never 你 |
| zh-TW | 您 | B2B convention; never 你 |
| ru | Вы (cap.) for singular direct address, вы (lower) for plural/general | Context-dependent |
| ua | ви (lowercase, modern convention) | Capitalized Ви only for very formal |
General writing rules (apply across all locales):
Design strings knowing translations will grow. Typical expansion vs. English for locales currently in the repo; lookup values from Andiamo / Eriksen / W3C tables when adding a locale.
| Locale | Expansion | Implication |
|---|---|---|
| de | +10–35%, single words up to +180% | Reserve generous space on buttons, tabs, labels |
| fr | +15–25% | |
| es | +15–30% | |
| it | +10–25% | |
| pt-BR | +15–30% | |
| pl | +20–30% | |
| cs, sk | +10–20% | |
| ro | +15–25% | |
| ru, ua | +15% typical, spikes to +30% | |
| tr-TR | +10–30% (agglutination) | |
| vi-VN | +30–40% | Diacritic-heavy, many small words |
| id | +10–20% | |
| ja | −10 to −55% character count (similar pixel width) | |
| ko | −10 to −15% | |
| zh-CN, zh-TW | −40% character count (≈2× char width) |
Rule of thumb: any UI surface must absorb +35% without truncation. If a string is length-capped, add a comment or context in the source.
Never hard-code formats. Use ICU skeletons so the runtime localizes automatically:
"updated_on": "Updated {date, date, medium}",
"percent_done": "{ratio, number, percent} complete",
"item_count": "{count, number} items"Never write "{date}MM/DD/YYYY" in the source — that guarantees a locale bug.
Decimal/thousands separators (runtime-handled):
1,234.56 — de/it/es/pt-BR/ru/ua/pl/cs/sk/tr-TR: 1.234,56 or 1 234,56 — fr: 1 234,56 (thin space) — ja/ko/zh: 1,234.56.Date formats (runtime-handled):
MM/DD/YYYY — most of Europe: DD.MM.YYYY — fr: DD/MM/YYYY — ja: YYYY/MM/DD or YYYY年MM月DD日 — zh: YYYY年MM月DD日 — ko: YYYY년 MM월 DD일.Currency: prefer ISO codes (USD, EUR, INR) in dense UI; localize symbol position via ICU. Units: keep the system (metric/imperial) a product decision, localized consistently.
The repo has no machine-readable translation-status field today (no sidecar, no __meta, no per-key flag) — so "preserve human-reviewed strings" must be enforced via git history, not status metadata. The disciplines below are what actually fires:
target=zh-CN vs target=zh-TW, target=pt-BR vs target=pt-PT. Auto-detect calls blend them and produce mixed vocabulary.git log -- <file> (or git blame -L <line>,<line>) on the key. If the most recent non-bot, non-mass-rewrite commit was authored by a human, treat that line as human-reviewed and keep it. Only overwrite lines whose last edit was a machine sweep or a copy-from-en migration.When reviewing a translation — yours or an AI's — score against these categories and reject if any Major issue is present:
Trans numbered fragment renumbered# or =0 droppedpackages/i18n/src/locales/en/<namespace>.json first. (If the namespace file does not yet exist, see Add a new namespace below — that case has extra steps.)t("my.new_key").src/locales/ — one file at a time. Do not copy the English value into the non-English files as a shortcut — sync-check treats presence as synced and will silently ship English copy to every locale.pnpm --filter @plane/i18n run generate:types (or let the build do it).pnpm --filter @plane/i18n run sync:check — expect 0 missing, 0 stale, 0 collisions.A "namespace" is a top-level JSON file (e.g. common.json, auth.json, epic.json). The set of valid namespace names is a hard-coded const array — adding a JSON file alone is not enough; the runtime will not load it.
NAMESPACES array in packages/i18n/src/constants/namespaces.ts. Keep alphabetical order with the existing entries.<namespace>.json in every locale directory under packages/i18n/src/locales/ — start with en/<namespace>.json (the source of truth), then create the file in all 18 target locales. An empty {} is fine for the targets at this step; sync-check will report missing keys as you add them in step 4.en/<namespace>.json so the namespace has content.en/<namespace>.json into each target locale — apply every rule in this skill.pnpm --filter @plane/i18n run generate:types to regenerate the TTranslationKeys union so component-level t() calls type-check.pnpm --filter @plane/i18n run sync:check — expect 0 missing, 0 stale, 0 collisions.t("<namespace>.my_key")) and spot-check the rendered UI in at least one non-Latin locale.The meaning changed — every target is now stale even if the key still exists. sync-check will not flag this.
en/<namespace>.json.machine_translated (in PR description or commit message) and open a follow-up for native review.cp -r packages/i18n/src/locales/en packages/i18n/src/locales/<xx>packages/i18n/src/constants/language.ts (SUPPORTED_LANGUAGES) and packages/i18n/src/types/language.ts (TLanguage).sync:check — must show 100% coverage before merging."Plane" → "[Plàññéé——]") in a local build and click through the UI. Catches truncation, unextracted strings, and layout bugs before real users see them.# Regenerate the TTranslationKeys union (auto on build)
pnpm --filter @plane/i18n run generate:types
# Report drift
pnpm --filter @plane/i18n run sync:check
# Same, exit 1 on drift (for CI)
pnpm --filter @plane/i18n run check:sync| Question | Answer |
|---|---|
| Translate "Plane" / "Plane AI" / "Power K" / "PQL"? | Never. Latin, every locale. |
| Translate "Sticky" / "Stickies" / "Intake"? | Never. Plane brand marks. Latin, every locale. |
| Translate "Active Cycles"? | Never as a unit (it's a feature page name). Lowercase generic "active cycles" in prose translates normally per the glossary. |
| Translate "Pro" / "Business" / "Enterprise"? | Never. Plan tier names. Latin, every locale. |
| Translate "Cycle" / "Module" / "Epic" / "Page"? | Yes — use the per-locale form from the translation glossary (zh-CN 周期/模块/史诗/页面, ja サイクル/モジュール/エピック/ページ, de Zyklus/Modul/Epic/Seite, etc.). |
| Translate "GitHub" / "Slack" / third-party brands? | Never. Latin, every locale. |
Translate a variable name {name}? | Never. Preserve exactly. |
Translate <0>…</0>? | Translate only the inside text. Never renumber. |
| Russian plural forms? | one / few / many / other — four forms mandatory; case-correct per CLDR. |
| German plural forms? | one / other — never few. |
| French plural forms? | one / many / other — many covers 1M+. |
| CJK plural forms? | one / other (single-form) — still emit both. |
| Informal "you" in de/fr/ru/ja? | Never in product UI. |
| Chinese + embedded "GitHub"? | 使用 GitHub 登录 — half-width space around Latin brand tokens. Feature nouns translate (创建周期, no space because no Latin). |
| Japanese "user"? | ユーザー with long-vowel ー, not ユーザ. |
| Hard-code date formats? | Never. Use ICU {d, date, medium}. |
| Copy English into non-English locale? | Never. Worse than leaving the key missing. |
Plane → 飞机, Plane AI → AI 聊天, Power K → 命令面板, Sticky → 便签 (Sticky is a brand, even though "sticky note" generally translates), Intake → 收件箱. Brand marks stay Latin.创建 Cycle (zh-CN), Создать Cycle (ru), エピックを作成 is fine but Epicを作成 is not. Use the per-locale form from the glossary.Cycle → Cercle (fr — invented; the natural cognate is the same Cycle), Cycle → 循环 (zh-CN — non-glossary; use 周期), Epic → Saga (es — non-glossary; use Epic). The glossary is the source of truth.few / many in Slavic languages — Russian/Polish/Czech/Slovak/Ukrainian strings with only one / other are grammatically wrong for counts 2–4 and 5+. Fix in the same PR.few is genitive singular (# Цикла), not nominative plural (# Циклы). See the case-form table.few in German, many in Spanish, etc. — languages not in CLDR for that form. Remove the spurious keyword.{count} or renaming {name} — ICU variables are lookup keys; rename breaks runtime substitution.<0>/<1> numbering in Trans — react-i18next matches by number; renumbering breaks the component.sync-check passes, users see English. The fastest way to ship bad i18n.使用GitHub登录 is a readability bug. The space rule applies around any remaining Latin token (brand mark), not around translated feature nouns.ー in Japanese katakana (ユーザ instead of ユーザー) — inconsistent with the Microsoft style guide and the rest of the product.du/tu/ты/tú/you (informal) breaks Plane's formal register in languages that distinguish.Ctrl stays Ctrl, never Strg or コントロール, because the physical key says Ctrl."Due on MM/DD/YYYY" is a locale bug waiting to ship; use ICU formatters.PQL, SSO, API — acronyms are DNT. The prose around them may be translated.Pro → Профессиональный, Business → 商业版, Enterprise → エンタープライズ. Plan tiers stay Latin per industry convention (Notion/Slack/Linear/Asana).사이클를 is wrong (vowel-particle after consonant-ending noun); use 사이클을. Same for 모듈, 에픽.bạn is not ban; diacritics are mandatory.anda in Indonesian — Anda is always capitalized in product UI.视频 ≠ 影片, 软件 ≠ 軟體. Never copy-paste between the two directories.You see yourself about to do any of the following → stop, delete, restart this string:
Plane, Plane AI, Power K, PQL, Active Cycles, Sticky, Stickies, Intake, Pro, Business, Enterprise, or any third-party brand (GitHub, Slack, etc.) with a translated form.Cycle / Module / Epic / Page in Latin in a non-Latin locale (zh-CN, zh-TW, ja, ko, ru, ua) — these are common nouns and must be translated per the glossary.Cycle → 循环, Cycle → Cercle, Epic → Saga).{variable}, <tag>, numbered <0>, or Markdown marker.few or many from a Slavic-language plural, or adding few to German.few in ru/ua plural blocks (it should be genitive singular per CLDR).du, tu, ты, tú, plain-form Japanese, or 반말 Korean in any product string.Anda in Indonesian.| Excuse | Reality |
|---|---|
"Keeping Cycle Latin in zh-CN keeps it consistent with English docs." | That's a minority position; Microsoft, Apple, Mozilla, Notion, Atlassian, Slack all translate. Monolingual zh users can't read Latin words; the glossary form is the standard. |
| "史诗 is the established Chinese word for Epic, but Latin reads more brand-y." | Brand-y is the wrong goal for a feature noun. The glossary form (史诗 for zh-CN, Эпик for ru) is what users in those locales expect from a SaaS product. |
"Our Russian users understand Cycle Latin." | They understand it; they don't expect to encounter it. The glossary form (Цикл) is what every other Russian SaaS product uses for the same concept. |
| "I'll just transliterate the Plane brand name into Cyrillic for accessibility." | Brand marks stay Latin in every locale. Плейн is wrong; Plane is right. |
| "Plan tier names should be translated since they're plain words." | Industry standard (Notion, Slack, Linear, Asana, GitHub) is to keep Pro, Business, Enterprise Latin for marketing consistency. Don't translate. |
| "This string is internal / rarely seen, good-enough is fine." | Every string is someone's main screen. Rules are cheap to follow; consistency compounds. |
"sync-check passed, I'm done." | sync-check only compares presence, not value quality. Green does not mean translated. |
| "I'll fix the missing plural forms later." | Missing few in Russian renders the wrong word for counts 2–4 right now in production. Same PR. |
| "The old file already used Latin Cycle everywhere — stay consistent." | Consistency with a bug is still a bug. Migrate occurrences you touch; open a sweep PR for the rest. |
| "AI said this was the right Japanese word for Cycle." | AI does not know our glossary unless you inject it. Check against the glossary table above; the glossary wins. |
| "The German translation is a bit long but still fits on my screen." | It won't fit on every user's screen. Design for +35% expansion; test in a narrow viewport. |
"I renamed {userName} to {nomeUtente} so the Italian reads naturally." | Variables are code. The runtime has no {nomeUtente} in scope — it renders as literal text. Revert. |
"Capitalizing Anda / 您 / Sie looks over-formal." | It's Plane's register in those languages. Deviating breaks brand voice across the product. |
When you add a language whose script, plural rules, punctuation, or register defaults aren't covered above:
zero, one, two, few, many, other). Add a row to the CLDR table above.dir="rtl" at the root and ensure Latin tokens remain LTR inside RTL context; preserve ‏/‎ markers if present.Plane includes طائرة; for Epic includes ملحمة; for Sticky includes ملاحظة.Canonical references to consult:
Per-string review rubric section© makeplane, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/translate of makeplane/plane.
Open the folder on GitHubat commit 7466675
Plane UI Translation next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Plane UI Translation this skillmakeplane/plane | 60k | — | ~16k | Automated safety check: Pass | AGPL-3.0 | |
| Docs Websitekurotu/VRCQuestTools | 373 | — | ~1.3k | Automated safety check: Pass | MIT | |
| Docs I18n ReviewComfy-Org/docs | 299 | — | ~926 | Automated safety check: Notes | GPL-3.0 | |
| Docs I18n TranslateComfy-Org/docs | 299 | — | ~3.2k | Automated safety check: Notes | GPL-3.0 | |
| Translation Diff ExportDevolutions/UniGetUI | 26k | — | ~1.1k | Automated safety check: Pass | MIT | |
| Translation Diff TranslateDevolutions/UniGetUI | 26k | — | ~934 | Automated safety check: Pass | MIT |
kurotu/VRCQuestTools
Use this skill FIRST for any task whose output lives in the Website/ directory — the VRCQuestTools user manual / docs site (Docusaurus, bilingual en/ja).
Comfy-Org/docs
Review ComfyUI docs translation quality with LLM-as-a-judge (review-i18n.ts).
Comfy-Org/docs
Translate ComfyUI Mintlify docs from English MDX to ja/zh/ko using translate-i18n.ts.
Devolutions/UniGetUI
Compares UniGetUI JSON locale files against English, identifies untranslated or source-changed keys, and generates patch, reference, and handoff files for a target language.
Devolutions/UniGetUI
Translates a sparse UniGetUI JSON language patch, writes completed entries into the working copy, preserves placeholders and terminology, and prepares the patch for merge-back.
tagspaces/tagspaces
Translate new or untranslated i18n strings from the English locale files (core.json + peri.json) into all other locales, maintaining consistency with each language's existing translations.
makeplane/plane
Scans React code for lint, accessibility, bundle size and architecture issues, reports a health score and checks that changes do not lower it.
makeplane/plane
Names a new Git branch with a type prefix, the lowercased work item ID and a short kebab-case description, so the ID can be extracted later from the branch name.
makeplane/plane
Opens a pull request for the current branch using the repo's template, a work item ID in the title and a description filled in from the actual diff.
makeplane/plane
Builds categorized release notes for a Plane release pull request from its commits and writes them into the PR description, for both the plane-cloud and plane-ee repos.
Works with
Categories
Sets the rules for translating and updating Plane's UI strings across locales: do-not-translate terms, plural forms, placeholders and AI translation review. The skill governs every change to the locale files under packages/i18n/src/locales. The English files are the source of truth and every other locale mirrors them key for key.
Plane UI Translation fits situations like: adding or rewording an English string and updating every locale; adding a new language to the i18n package; reviewing a pull request that touches the locale JSON files; fixing drift after the sync check reports stale keys.
Run `npx skills add makeplane/plane --skill translate -a claude-code`. Or copy the skill folder (.claude/skills/translate in makeplane/plane) into .claude/skills/translate in your project. Claude Code loads it when a task matches its description.
Run `npx skills add makeplane/plane --skill translate -a codex`. Or copy the skill folder (.claude/skills/translate in makeplane/plane) into .agents/skills/translate in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add makeplane/plane --skill translate -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/translate, .gemini/skills/translate, .github/skills/translate and .opencode/skills/translate in your project.
Going by SKILL.md and its folder, Plane UI Translation needs the command-line tools its instructions call (pnpm and git). Our summary lists: The Plane repository with pnpm.
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Plane UI Translation is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 16k tokens (SKILL.md is roughly 62k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Plane UI Translation: Docs Website (kurotu/VRCQuestTools, 373 stars), Docs I18n Review (Comfy-Org/docs, 299 stars), Docs I18n Translate (Comfy-Org/docs, 299 stars) and Translation Diff Export (Devolutions/UniGetUI, 26k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
makeplane (a GitHub organization) maintains it in makeplane/plane, which has 60,461 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on October 6, 2026.
Source: makeplane/plane on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.