compiler: text keys below a row, trf padding and tr's cast (ECS's 26.4 gaps) - a @Text Key in a record nested in a row, or in each item of a list of them, is filled with its derived key <registry>.<row>.<field>.<i>.<field> as a top-level one is, and a @Text []Key a row leaves out takes <...>.0, .1, ... for as many as en.po has (so no .lres spells a key; the manifest and en.po are now read before the parse that fills the rows); field: null is no text; trf / trn's trailing "" literals are padding, not counted against the English's holes; and string(x) of a string or a Key is x itself to the escape analysis, no allocation site, so tr(key) passes arena strict (a template's lone hole still copies); examples/lang/i18n_nested and its feat_case (added, not run); LANGUAGE.md and the changeset; reseeded, bootstrap-cfree fixpoint holds

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-09-30 00:41:05 +03:00
parent 9a0011c38f
commit 10a394ae6c
12 changed files with 75642 additions and 73902 deletions

View file

@ -202,6 +202,7 @@ entry {
if (target != null) { g_target_win = has_sub(target, "windows") }
else { g_target_win = host_is_windows() }
i18n_manifest(path) # phase 26: a `lang` line and its en.po, before the parse fills rows from it
let src = read_file(path)
if (src == null) { die("ludicc: cannot open input\n") }
@ -224,7 +225,6 @@ entry {
maybe_splice_runtime()
fence_manifest(path) # 25.1: a `fence` line in the program's package.ludic
i18n_manifest(path) # phase 26: a `lang` line, and its en.po (i18n.ludic)
ui_register_gotos() # `goto:` buttons -> generated UiClicked listeners
# a game gets a window by default; a plain program stays headless. An explicit