i18n/plural.go

Functions Structs

Functions

func Get

Get returns the message string for the given plural category.

 

If the requested category has an empty string, falls back to Other.

func (p PluralForms) Get(cat PluralCategory) string {
	var s string

	switch cat {
	case PluralZero:
		s = p.Zero
	case PluralOne:
		s = p.One
	case PluralTwo:
		s = p.Two
	case PluralFew:
		s = p.Few
	case PluralMany:
		s = p.Many
	case PluralOther:
		s = p.Other
	}

	if s == "" {
		return p.Other
	}

	return s
}

func PluralRuleArabic

PluralRuleArabic implements CLDR plural rules for Arabic.

 

Categories:

- zero: n=0

- one: n=1

- two: n=2

- few: n%100 in 3..10

- many: n%100 in 11..99

- other: everything else (100, 200, ...)

func PluralRuleArabic(count int) PluralCategory {
	n := abs(count)
	mod100 := n % 100

	switch {
	case n == 0:
		return PluralZero
	case n == 1:
		return PluralOne
	case n == 2:
		return PluralTwo
	case mod100 >= 3 && mod100 <= 10:
		return PluralFew
	case mod100 >= 11 && mod100 <= 99:
		return PluralMany
	default:
		return PluralOther
	}
}

func PluralRuleEnglish

PluralRuleEnglish implements CLDR plural rules for English.

 

Categories: one (n=1), other (everything else).

func PluralRuleEnglish(count int) PluralCategory {
	if abs(count) == 1 {
		return PluralOne
	}
	return PluralOther
}

func PluralRuleFrench

PluralRuleFrench implements CLDR plural rules for French and

other Romance languages that treat 0 as singular.

 

Categories: one (n=0 or n=1), other (everything else).

func PluralRuleFrench(count int) PluralCategory {
	n := abs(count)
	if n <= 1 {
		return PluralOne
	}
	return PluralOther
}

func PluralRuleJapanese

PluralRuleJapanese implements CLDR plural rules for Japanese, Chinese,

Korean, Thai, and other languages with no grammatical plural.

 

Categories: other (always).

func PluralRuleJapanese(count int) PluralCategory {
	_ = count	// all counts map to other
	return PluralOther
}

func PluralRulePolish

PluralRulePolish implements CLDR plural rules for Polish.

 

Categories:

- one: n=1

- few: n%10 in 2..4 and n%100 not in 12..14

- many: everything else

func PluralRulePolish(count int) PluralCategory {
	n := abs(count)
	mod10 := n % 10
	mod100 := n % 100

	switch {
	case n == 1:
		return PluralOne
	case mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14):
		return PluralFew
	default:
		return PluralMany
	}
}

func PluralRuleRussian

PluralRuleRussian implements CLDR plural rules for Russian and other

Slavic languages (Ukrainian, Belarusian, Serbian, Croatian).

 

Categories:

- one: n%10=1 and n%100!=11 (1, 21, 31, 41...)

- few: n%10 in 2..4 and n%100 not in 12..14 (2-4, 22-24, 32-34...)

- many: n%10=0 or n%10 in 5..9 or n%100 in 11..14 (0, 5-20, 25-30...)

- other: fallback (non-integer, but we handle int only)

func PluralRuleRussian(count int) PluralCategory {
	n := abs(count)
	mod10 := n % 10
	mod100 := n % 100

	switch {
	case mod10 == 1 && mod100 != 11:
		return PluralOne
	case mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14):
		return PluralFew
	default:
		return PluralMany
	}
}

Structs

type PluralForms struct

PluralForms holds message strings for each CLDR plural category.

 

Not all categories are used by every language. For example, English only

uses One and Other, while Arabic uses all six categories. When a category

is not set (empty string), the translator falls back to Other.

 

Example (English):

 

PluralForms{One: "%d item", Other: "%d items"}

 

Example (Russian):

 

PluralForms{

One: "%d файл", // 1, 21, 31...

Few: "%d файла", // 2-4, 22-24...

Many: "%d файлов", // 5-20, 25-30...

Other: "%d файлов", // fallback

}

type PluralForms struct {
	// Zero form (used in Arabic for 0).
	Zero	string

	// One form (singular).
	One	string

	// Two form (dual, used in Arabic for 2).
	Two	string

	// Few form (e.g., Russian 2-4).
	Few	string

	// Many form (e.g., Russian 5-20).
	Many	string

	// Other form (default fallback).
	Other	string
}