Skip to content

Commit 4333871

Browse files
authored
Fix case sensitivity with message keys (#358)
Fixes #357
1 parent 711fb20 commit 4333871

File tree

2 files changed

+47
-50
lines changed

2 files changed

+47
-50
lines changed

‎i18n/bundle_test.go‎

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ var everythingMessage = MustNewMessage(map[string]string{
3030
"few": "few translation",
3131
"many": "many translation",
3232
"other": "other translation",
33+
"leftDelim": "<<",
34+
"rightDelim": ">>",
3335
})
3436

3537
func TestConcurrentAccess(t *testing.T) {
@@ -113,7 +115,9 @@ func TestJSON(t *testing.T) {
113115
"two": "two translation",
114116
"few": "few translation",
115117
"many": "many translation",
116-
"other": "other translation"
118+
"other": "other translation",
119+
"leftDelim": "<<",
120+
"rightDelim": ">>"
117121
}
118122
}`), "en-US.json")
119123

@@ -143,6 +147,8 @@ everything:
143147
few: few translation
144148
many: many translation
145149
other: other translation
150+
leftDelim: "<<"
151+
rightDelim: ">>"
146152
`), "en-US.yaml")
147153

148154
expectMessage(t, bundle, language.AmericanEnglish, "simple", simpleMessage)
@@ -171,6 +177,8 @@ everything:
171177
few: few translation
172178
many: many translation
173179
other: other translation
180+
leftDelim: "<<"
181+
rightDelmin: ">>"
174182
garbage: something
175183
176184
description: translation
@@ -212,6 +220,8 @@ two = "two translation"
212220
few = "few translation"
213221
many = "many translation"
214222
other = "other translation"
223+
leftDelim = "<<"
224+
rightDelim = ">>"
215225
`), "en-US.toml")
216226

217227
expectMessage(t, bundle, language.AmericanEnglish, "simple", simpleMessage)
@@ -241,9 +251,7 @@ func TestV1Format(t *testing.T) {
241251
`), "en-US.json")
242252

243253
expectMessage(t, bundle, language.AmericanEnglish, "simple", simpleMessage)
244-
e := *everythingMessage
245-
e.Description = ""
246-
expectMessage(t, bundle, language.AmericanEnglish, "everything", &e)
254+
expectMessage(t, bundle, language.AmericanEnglish, "everything", newV1EverythingMessage())
247255
}
248256

249257
func TestV1FlatFormat(t *testing.T) {
@@ -264,15 +272,21 @@ func TestV1FlatFormat(t *testing.T) {
264272
`), "en-US.json")
265273

266274
expectMessage(t, bundle, language.AmericanEnglish, "simple", simpleMessage)
267-
e := *everythingMessage
268-
e.Description = ""
269-
expectMessage(t, bundle, language.AmericanEnglish, "everything", &e)
275+
expectMessage(t, bundle, language.AmericanEnglish, "everything", newV1EverythingMessage())
270276
}
271277

272278
func expectMessage(t *testing.T, bundle *Bundle, tag language.Tag, messageID string, message *Message) {
273279
expected := NewMessageTemplate(message)
274280
actual := bundle.messageTemplates[tag][messageID]
275281
if !reflect.DeepEqual(actual, expected) {
276-
t.Errorf("bundle.MessageTemplates[%q][%q] = %#v; want %#v", tag, messageID, actual, expected)
282+
t.Errorf("bundle.MessageTemplates[%q][%q]\ngot %#v\nwant %#v", tag, messageID, actual, expected)
277283
}
278284
}
285+
286+
func newV1EverythingMessage() *Message {
287+
e := *everythingMessage
288+
e.Description = ""
289+
e.LeftDelim = ""
290+
e.RightDelim = ""
291+
return &e
292+
}

‎i18n/message.go‎

Lines changed: 25 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,8 @@ var reservedKeys = map[string]struct{}{
192192
}
193193

194194
func isReserved(key string, val any) bool {
195-
if _, ok := reservedKeys[key]; ok {
195+
lk := strings.ToLower(key)
196+
if _, ok := reservedKeys[lk]; ok {
196197
if key == "translation" {
197198
return true
198199
}
@@ -214,62 +215,44 @@ func isMessage(v interface{}) (bool, error) {
214215
case nil, string:
215216
return true, nil
216217
case map[string]interface{}:
217-
reservedKeyCount := 0
218-
for key := range reservedKeys {
219-
val, ok := data[key]
220-
if ok && isReserved(key, val) {
221-
reservedKeyCount++
218+
reservedKeys := make([]string, 0, len(reservedKeys))
219+
unreservedKeys := make([]string, 0, len(data))
220+
for k, v := range data {
221+
if isReserved(k, v) {
222+
reservedKeys = append(reservedKeys, k)
223+
} else {
224+
unreservedKeys = append(unreservedKeys, k)
222225
}
223226
}
224-
if reservedKeyCount == 0 {
225-
return false, nil
226-
}
227-
if len(data) > reservedKeyCount {
228-
reservedKeys := make([]string, 0, reservedKeyCount)
229-
unreservedKeys := make([]string, 0, len(data)-reservedKeyCount)
230-
for k, v := range data {
231-
if isReserved(k, v) {
232-
reservedKeys = append(reservedKeys, k)
233-
} else {
234-
unreservedKeys = append(unreservedKeys, k)
235-
}
236-
}
227+
hasReservedKeys := len(reservedKeys) > 0
228+
if hasReservedKeys && len(unreservedKeys) > 0 {
237229
return false, &mixedKeysError{
238230
reservedKeys: reservedKeys,
239231
unreservedKeys: unreservedKeys,
240232
}
241233
}
242-
return true, nil
234+
return hasReservedKeys, nil
243235
case map[interface{}]interface{}:
244-
reservedKeyCount := 0
245-
for key := range reservedKeys {
246-
val, ok := data[key]
247-
if ok && isReserved(key, val) {
248-
reservedKeyCount++
236+
reservedKeys := make([]string, 0, len(reservedKeys))
237+
unreservedKeys := make([]string, 0, len(data))
238+
for key, v := range data {
239+
k, ok := key.(string)
240+
if !ok {
241+
unreservedKeys = append(unreservedKeys, fmt.Sprintf("%+v", key))
242+
} else if isReserved(k, v) {
243+
reservedKeys = append(reservedKeys, k)
244+
} else {
245+
unreservedKeys = append(unreservedKeys, k)
249246
}
250247
}
251-
if reservedKeyCount == 0 {
252-
return false, nil
253-
}
254-
if len(data) > reservedKeyCount {
255-
reservedKeys := make([]string, 0, reservedKeyCount)
256-
unreservedKeys := make([]string, 0, len(data)-reservedKeyCount)
257-
for key, v := range data {
258-
k, ok := key.(string)
259-
if !ok {
260-
unreservedKeys = append(unreservedKeys, fmt.Sprintf("%+v", key))
261-
} else if isReserved(k, v) {
262-
reservedKeys = append(reservedKeys, k)
263-
} else {
264-
unreservedKeys = append(unreservedKeys, k)
265-
}
266-
}
248+
hasReservedKeys := len(reservedKeys) > 0
249+
if hasReservedKeys && len(unreservedKeys) > 0 {
267250
return false, &mixedKeysError{
268251
reservedKeys: reservedKeys,
269252
unreservedKeys: unreservedKeys,
270253
}
271254
}
272-
return true, nil
255+
return hasReservedKeys, nil
273256
}
274257
return false, nil
275258
}

0 commit comments

Comments
 (0)