Skip to content

docs(spec): spec-0029 — i18n v2, the client picks the language - #330

Merged
stellarfeline merged 2 commits into
mainfrom
docs/spec-0029-i18n-v2
Aug 8, 2026
Merged

docs(spec): spec-0029 — i18n v2, the client picks the language#330
stellarfeline merged 2 commits into
mainfrom
docs/spec-0029-i18n-v2

Conversation

@stellarfeline

Copy link
Copy Markdown
Owner

The spec PR #314 implements. Owner directive 2026-08-06.

nobodys-cave-island v1.0.0 shipped Chinese-only because build --lang zh-cn swaps every player-visible string before compiling: the datapack carries exactly one language and there is no fallback path at all. This makes a delve carry all of them and lets the client choose.

Opened now because it had none: the branch existed with content and was invisible on every board. A branch without a PR does not exist for the next session, which reads the world from the PR list.

stellarfeline and others added 2 commits August 5, 2026 22:40
spec-0024 §2 recorded the owner ruling that v1 releases ship baked in one
language and v2 ships every declared language in the resource pack, the client
auto-selecting and falling back to English. v2 was unblocked and never built, so
nobodys-cave-island v1.0.0 shipped Chinese-only: an English player reads Chinese
with no fallback. The owner directed v2 built and the island re-released as v1.1.

The work is smaller than it looks because the hard half exists. `each_string`
already visits every player-visible string under a stable key across all five
effect roots, and DW0330/DW0331 already width-check source AND translation. Only
the delivery shape is missing: emit `{"translate": key, "fallback": english}`
instead of the literal, and write one lang file per declared language into the
pack `build_pack` already accepts arbitrary assets for.

The fallback lives on the component rather than on the pack's en_us.json for one
reason worth stating: a player who DECLINES the resource-pack prompt has no lang
files at all, and the delve still has to be playable.

Four risks are accepted with what they owe: an emission site that cannot carry a
component becomes a named exclusion plus a diagnostic, never a silent literal;
the bot's displayNameOf preference heuristic gets weaker and must be MEASURED
rather than assumed; PackTest text assertions get the same audit; and the width
gates become load-bearing rather than belt-and-braces, since any declared
language may now be what a player sees.

No DSL change and no dsl_version bump — emission only. Every campaign's bytes
move; released delves reproduce through their pinned engine.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@stellarfeline
stellarfeline merged commit fe8d1e3 into main Aug 8, 2026
12 checks passed
@stellarfeline
stellarfeline deleted the docs/spec-0029-i18n-v2 branch August 8, 2026 03:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant