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.