diff --git a/i18n/message.go b/i18n/message.go index 73cd2f6..99136a2 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 57dd7fe..103d7bf 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 3272e52..5918bee 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) {