From b42d9bd0c568eebf5ce123ec94b9b13438f46855 Mon Sep 17 00:00:00 2001 From: LemonNeko Date: Mon, 1 Apr 2024 07:26:08 +0800 Subject: [PATCH] fallback to empty string message `""` when get nil value (#326) fallback to empty string message when get nil value --- i18n/message.go | 2 +- i18n/parse.go | 7 +++++++ i18n/parse_test.go | 31 +++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/i18n/message.go b/i18n/message.go index 73cd2f6d..99136a2a 100644 --- a/i18n/message.go +++ b/i18n/message.go @@ -188,7 +188,7 @@ func stringSubmap(k string, v interface{}, strdata map[string]string) error { func isMessage(v interface{}) bool { reservedKeys := []string{"id", "description", "hash", "leftdelim", "rightdelim", "zero", "one", "two", "few", "many", "other"} switch data := v.(type) { - case string: + case nil, string: return true case map[string]interface{}: for _, key := range reservedKeys { diff --git a/i18n/parse.go b/i18n/parse.go index 57dd7fe7..103d7bfa 100644 --- a/i18n/parse.go +++ b/i18n/parse.go @@ -112,6 +112,13 @@ func recGetMessages(raw interface{}, isMapMessage, isInitialCall bool) ([]*Messa messages = append(messages, childMessages...) } + case nil: + if isInitialCall { + return nil, errInvalidTranslationFile + } + m, err := NewMessage("") + return []*Message{m}, err + default: return nil, fmt.Errorf("unsupported file format %T", raw) } diff --git a/i18n/parse_test.go b/i18n/parse_test.go index 3272e523..5918bee0 100644 --- a/i18n/parse_test.go +++ b/i18n/parse_test.go @@ -156,6 +156,37 @@ outer: }}, }, }, + { + name: "YAML empty key test", + file: ` +some-keys: + non-empty-key: not empty + empty-key-but-type-specified: "" + empty-key: + null-key: null`, + path: "en.yaml", + unmarshalFuncs: map[string]UnmarshalFunc{"yaml": yaml.Unmarshal}, + messageFile: &MessageFile{ + Path: "en.yaml", + Tag: language.English, + Format: "yaml", + Messages: []*Message{ + { + ID: "some-keys.non-empty-key", + Other: "not empty", + }, + { + ID: "some-keys.empty-key-but-type-specified", + }, + { + ID: "some-keys.empty-key", + }, + { + ID: "some-keys.null-key", + }, + }, + }, + }, } for _, testCase := range testCases { t.Run(testCase.name, func(t *testing.T) {