SOC 職業分類に基づく
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
直接コマンドでは確認用 Prompt が省略されます。実行前にソースを確認してください。
npx skills add https://github.com/CodySwannGT/lisa --skill phaser-i18nコマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?SkillsMP が現在取得できるファイルをダウンロードできます。
SKILL.md を表示中
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.
| 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.