From 0e914911fa563646d407a6a42e98a37d8fd5cf9b Mon Sep 17 00:00:00 2001 From: Virgil Date: Fri, 3 Apr 2026 07:51:09 +0000 Subject: [PATCH] fix(loader): accept grammar aliases --- loader.go | 10 ++++++++- loader_test.go | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/loader.go b/loader.go index f6654f4..a69ba83 100644 --- a/loader.go +++ b/loader.go @@ -277,7 +277,7 @@ func loadGrammarNoun(fullKey, key string, v map[string]any, grammar *GrammarData } func loadGrammarSignals(fullKey string, v map[string]any, grammar *GrammarData) bool { - if grammar == nil || fullKey != "gram.signal" { + if grammar == nil || (fullKey != "gram.signal" && fullKey != "gram.signals") { return false } loadSignalStringList := func(dst *[]string, raw any) { @@ -327,6 +327,14 @@ func loadGrammarArticle(fullKey string, v map[string]any, grammar *GrammarData) } } } + if bg, ok := v["byGender"].(map[string]any); ok { + grammar.Articles.ByGender = make(map[string]string, len(bg)) + for g, art := range bg { + if s, ok := art.(string); ok { + grammar.Articles.ByGender[g] = s + } + } + } return true } diff --git a/loader_test.go b/loader_test.go index c5d0ada..0d5fbb6 100644 --- a/loader_test.go +++ b/loader_test.go @@ -683,6 +683,62 @@ func TestNewWithLoader_LoadsGrammarOnlyLocale(t *testing.T) { } } +func TestNewWithLoader_AcceptsGrammarAliases(t *testing.T) { + loaderFS := fstest.MapFS{ + "en.json": &fstest.MapFile{ + Data: []byte(`{ + "gram": { + "article": { + "byGender": { "f": "la", "m": "le" } + }, + "noun": { + "user": { "one": "user", "other": "users", "gender": "f" } + }, + "signals": { + "noun_determiner": ["the"], + "verb_auxiliary": ["will"], + "verb_infinitive": ["to"], + "verb_negation": ["never"] + } + } + }`), + }, + } + + svc, err := NewWithLoader(NewFSLoader(loaderFS, ".")) + if err != nil { + t.Fatalf("NewWithLoader() failed: %v", err) + } + + data := GetGrammarData("en") + if data == nil { + t.Fatal("alias grammar data was not loaded") + } + if data.Articles.ByGender["f"] != "la" || data.Articles.ByGender["m"] != "le" { + t.Fatalf("article byGender alias not loaded: %+v", data.Articles.ByGender) + } + if got, want := data.Signals.NounDeterminers, []string{"the"}; !slices.Equal(got, want) { + t.Fatalf("signal alias noun_determiner = %v, want %v", got, want) + } + if got, want := data.Signals.VerbAuxiliaries, []string{"will"}; !slices.Equal(got, want) { + t.Fatalf("signal alias verb_auxiliary = %v, want %v", got, want) + } + if got, want := data.Signals.VerbInfinitive, []string{"to"}; !slices.Equal(got, want) { + t.Fatalf("signal alias verb_infinitive = %v, want %v", got, want) + } + if got, want := data.Signals.VerbNegation, []string{"never"}; !slices.Equal(got, want) { + t.Fatalf("signal alias verb_negation = %v, want %v", got, want) + } + + if err := svc.SetLanguage("en"); err != nil { + t.Fatalf("SetLanguage(en) failed: %v", err) + } + SetDefault(svc) + if got := DefinitePhrase("user"); got != "la user" && got != "la User" { + t.Fatalf("DefinitePhrase(user) = %q, want article from byGender alias", got) + } +} + func TestFlattenPluralObject(t *testing.T) { messages := make(map[string]Message) raw := map[string]any{