Skip to content

Commit 6d605d0

Browse files
authored
attempt fallback to "other" plural form (#174)
1 parent 4cc2a0f commit 6d605d0

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

v2/i18n/localizer.go

+11
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ func (l *Localizer) LocalizeMessage(msg *Message) (string, error) {
121121
// }
122122

123123
// LocalizeWithTag returns a localized message and the language tag.
124+
// It may return a best effort localized message even if an error happens.
124125
func (l *Localizer) LocalizeWithTag(lc *LocalizeConfig) (string, language.Tag, error) {
125126
messageID := lc.MessageID
126127
if lc.DefaultMessage != nil {
@@ -144,16 +145,26 @@ func (l *Localizer) LocalizeWithTag(lc *LocalizeConfig) (string, language.Tag, e
144145
}
145146
}
146147
}
148+
147149
tag, template := l.getTemplate(messageID, lc.DefaultMessage)
148150
if template == nil {
149151
return "", language.Und, &MessageNotFoundErr{messageID: messageID}
150152
}
153+
151154
pluralForm := l.pluralForm(tag, operands)
152155
if pluralForm == plural.Invalid {
153156
return "", language.Und, &pluralizeErr{messageID: messageID, tag: tag}
154157
}
158+
155159
msg, err := template.Execute(pluralForm, templateData, lc.Funcs)
156160
if err != nil {
161+
// Attempt to fallback to "Other" pluralization in case translations are incomplete.
162+
if pluralForm != plural.Other {
163+
msg2, err2 := template.Execute(plural.Other, templateData, lc.Funcs)
164+
if err2 == nil {
165+
return msg2, tag, err
166+
}
167+
}
157168
return "", language.Und, err
158169
}
159170
return msg, tag, nil

v2/i18n/localizer_test.go

+29
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"reflect"
55
"testing"
66

7+
"github.com/nicksnyder/go-i18n/v2/internal/plural"
78
"golang.org/x/text/language"
89
)
910

@@ -266,6 +267,34 @@ func TestLocalizer_Localize(t *testing.T) {
266267
},
267268
expectedLocalized: "I have 1 cat",
268269
},
270+
{
271+
name: "plural count missing one, default message",
272+
defaultLanguage: language.English,
273+
acceptLangs: []string{"en"},
274+
conf: &LocalizeConfig{
275+
PluralCount: 1,
276+
DefaultMessage: &Message{
277+
ID: "Cats",
278+
Other: "I have {{.PluralCount}} cats",
279+
},
280+
},
281+
expectedLocalized: "I have 1 cats",
282+
expectedErr: pluralFormNotFoundError{messageID: "Cats", pluralForm: plural.One},
283+
},
284+
{
285+
name: "plural count missing other, default message",
286+
defaultLanguage: language.English,
287+
acceptLangs: []string{"en"},
288+
conf: &LocalizeConfig{
289+
PluralCount: 2,
290+
DefaultMessage: &Message{
291+
ID: "Cats",
292+
One: "I have {{.PluralCount}} cat",
293+
},
294+
},
295+
expectedLocalized: "",
296+
expectedErr: pluralFormNotFoundError{messageID: "Cats", pluralForm: plural.Other},
297+
},
269298
{
270299
name: "plural count other, default message",
271300
defaultLanguage: language.English,

0 commit comments

Comments
 (0)