用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/CodySwannGT/lisa --skill phaser-i18n命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
This skill should be used for any non-trivial request — features, bugs, stories, epics, spikes, or multi-step tasks. It accepts a ticket URL (Jira, Linear, GitHub), a file path containing a spec, or a plain-text prompt. It assembles an agent team, breaks the work into structured tasks, and manages the full lifecycle from research through implementation, code review, deploy, and empirical verification.
any non-trivial request —…
This skill should be used for any non-trivial request — features, bugs, stories, epics, spikes, or multi-step tasks. It accepts a ticket URL (Jira, Linear, GitHub), a file path containing a spec, or a plain-text prompt. It assembles an agent team, breaks the work into structured tasks, and manages the full lifecycle from research through implementation, code review, deploy, and empirical verification.
基于 SOC 职业分类
正在显示 SKILL.md
| name | phaser-i18n |
| description | localizing a Phaser 4 game — a… |
No user-facing string is hardcoded in a scene. All player-visible text comes from a typed string catalog keyed by typed constants, so a missing or misspelled key is a compile error and every string has a home for translation. The catalog is a small typed wrapper (no heavy dependency required); locale switching re-renders any open text. Announced strings ([[phaser-accessibility]]) and service messages ([[phaser-services]]) draw from the same catalog.
One module owns the locales and the lookup. The key type is derived from the default locale so every locale must cover the same keys:
// src/i18n/catalog.ts
const en = {
"menu.play": "Play",
"menu.settings": "Settings",
"hud.score": "Score: {score}",
"result.cleared": "Level {level} cleared!",
"lives": "{n} life|{n} lives", // singular|plural
} as const;
const es: Record<keyof typeof en, string> = {
"menu.play": "Jugar", "menu.settings": "Ajustes",
"hud.score": "Puntos: {score}", "result.cleared": "¡Nivel {level} superado!",
"lives": "{n} vida|{n} vidas",
};
export type StringKey = keyof typeof en;
const locales = { en, es } as const;
export type Locale = keyof typeof locales;
t() function: interpolation + pluralization// src/i18n/i18n.ts
let current: Locale = "en";
export function setLocale(l: Locale) { current = l; EventCenter.emit(GameEvent.LocaleChanged); }
export function getLocale() { return current; }
export function t(key: StringKey, params?: Record<string, string | number>): string {
let s = (locales[current][key] ?? locales.en[key]) as string; // fall back to en, never crash
if (s.includes("|") && params && "n" in params) // pick plural form
s = (Number(params.n) === 1 ? s.split("|")[0] : s.split("|")[1]);
return s.replace(, (params?.[k] ?? ));
}
Usage is always t(...) with a typed key — never a raw string in a scene:
this.add.bitmapText(x, y, Font.UI, t("hud.score", { score: 0 }));
this.announce(t("result.cleared", { level })); // [[phaser-accessibility]] live region
The plural/interpolation rules are pure functions — put them in src/logic/**
so Vitest covers them ([[phaser-testing]]).
Changing language must update text that is already on screen. Emit a
LocaleChanged event on the EventsCenter ([[phaser-services]]); each scene with
visible text subscribes and re-applies t() to its labels, then removes the
listener in shutdown (the on/off discipline).
create() {
const refresh = () => this.scoreText.setText(t("hud.score", { score: this.score }));
EventCenter.on(GameEvent.LocaleChanged, refresh);
this.events.once(Phaser.Scenes.Events.SHUTDOWN, () => EventCenter.off(GameEvent.LocaleChanged, refresh));
}
Persist the chosen locale via SaveService and apply it on boot; default from
navigator.language when there is no saved choice.
The performance advice "use BitmapText for hot text" (the official game-object-components skill)
collides with i18n: a bitmap font only contains the glyphs it was generated with.
Rule of thumb: BitmapText for high-churn numeric/short HUD with a covered glyph
set; Text for translated prose and any locale whose script the bitmap font does
not include. For RTL locales (Arabic/Hebrew), use canvas Text with
rtl: true/right alignment and lay out mirrored — BitmapText does not shape RTL.
t(StringKey, …) call — no inline literals in
scenes/entities (this mirrors the no-raw-string-keys discipline).src/logic/**; the catalog and t() live
in src/i18n/**.Verified by switching locale at runtime and confirming on-screen text updates
live (no reload), a missing key fails bun run typecheck, and pluralization unit
tests pass for n=0/1/many. For non-Latin locales, confirm glyphs render (no tofu
boxes) — that is the signal you need a per-script BMFont page or canvas Text.