Skip to content

Commit ef03618

Browse files
nicksnyderbep
authored andcommitted
Fix case sensitivity with message keys (nicksnyder#358)
Fixes nicksnyder#357
1 parent 67b81d2 commit ef03618

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) {
@@ -138,7 +140,9 @@ func TestJSON(t *testing.T) {
138140
"two": "two translation",
139141
"few": "few translation",
140142
"many": "many translation",
141-
"other": "other translation"
143+
"other": "other translation",
144+
"leftDelim": "<<",
145+
"rightDelim": ">>"
142146
}
143147
}`), "en-US.json")
144148

@@ -168,6 +172,8 @@ everything:
168172
few: few translation
169173
many: many translation
170174
other: other translation
175+
leftDelim: "<<"
176+
rightDelim: ">>"
171177
`), "en-US.yaml")
172178

173179
expectMessage(t, bundle, language.AmericanEnglish, "simple", simpleMessage)
@@ -196,6 +202,8 @@ everything:
196202
few: few translation
197203
many: many translation
198204
other: other translation
205+
leftDelim: "<<"
206+
rightDelmin: ">>"
199207
garbage: something
200208
201209
description: translation
@@ -237,6 +245,8 @@ two = "two translation"
237245
few = "few translation"
238246
many = "many translation"
239247
other = "other translation"
248+
leftDelim = "<<"
249+
rightDelim = ">>"
240250
`), "en-US.toml")
241251

242252
expectMessage(t, bundle, language.AmericanEnglish, "simple", simpleMessage)
@@ -266,9 +276,7 @@ func TestV1Format(t *testing.T) {
266276
`), "en-US.json")
267277

268278
expectMessage(t, bundle, language.AmericanEnglish, "simple", simpleMessage)
269-
e := *everythingMessage
270-
e.Description = ""
271-
expectMessage(t, bundle, language.AmericanEnglish, "everything", &e)
279+
expectMessage(t, bundle, language.AmericanEnglish, "everything", newV1EverythingMessage())
272280
}
273281

274282
func TestV1FlatFormat(t *testing.T) {
@@ -289,15 +297,21 @@ func TestV1FlatFormat(t *testing.T) {
289297
`), "en-US.json")
290298

291299
expectMessage(t, bundle, language.AmericanEnglish, "simple", simpleMessage)
292-
e := *everythingMessage
293-
e.Description = ""
294-
expectMessage(t, bundle, language.AmericanEnglish, "everything", &e)
300+
expectMessage(t, bundle, language.AmericanEnglish, "everything", newV1EverythingMessage())
295301
}
296302

297303
func expectMessage(t *testing.T, bundle *Bundle, tag language.Tag, messageID string, message *Message) {
298304
expected := NewMessageTemplate(message)
299305
actual := bundle.messageTemplates[tag][messageID]
300306
if !reflect.DeepEqual(actual, expected) {
301-
t.Errorf("bundle.MessageTemplates[%q][%q] = %#v; want %#v", tag, messageID, actual, expected)
307+
t.Errorf("bundle.MessageTemplates[%q][%q]\ngot %#v\nwant %#v", tag, messageID, actual, expected)
302308
}
303309
}
310+
311+
func newV1EverythingMessage() *Message {
312+
e := *everythingMessage
313+
e.Description = ""
314+
e.LeftDelim = ""
315+
e.RightDelim = ""
316+
return &e
317+
}

‎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)