printer.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package locale // import "miniflux.app/v2/internal/locale"
  4. import "fmt"
  5. // Printer converts translation keys to language-specific strings.
  6. type Printer struct {
  7. language string
  8. }
  9. func (p *Printer) Print(key string) string {
  10. if str, ok := defaultCatalog[p.language][key]; ok {
  11. if translation, ok := str.(string); ok {
  12. return translation
  13. }
  14. }
  15. return key
  16. }
  17. // Printf is like fmt.Printf, but using language-specific formatting.
  18. func (p *Printer) Printf(key string, args ...interface{}) string {
  19. var translation string
  20. str, found := defaultCatalog[p.language][key]
  21. if !found {
  22. translation = key
  23. } else {
  24. var valid bool
  25. translation, valid = str.(string)
  26. if !valid {
  27. translation = key
  28. }
  29. }
  30. return fmt.Sprintf(translation, args...)
  31. }
  32. // Plural returns the translation of the given key by using the language plural form.
  33. func (p *Printer) Plural(key string, n int, args ...interface{}) string {
  34. choices, found := defaultCatalog[p.language][key]
  35. if found {
  36. var plurals []string
  37. switch v := choices.(type) {
  38. case []interface{}:
  39. for _, v := range v {
  40. plurals = append(plurals, fmt.Sprint(v))
  41. }
  42. case []string:
  43. plurals = v
  44. default:
  45. return key
  46. }
  47. pluralForm, found := pluralForms[p.language]
  48. if !found {
  49. pluralForm = pluralForms["default"]
  50. }
  51. index := pluralForm(n)
  52. if len(plurals) > index {
  53. return fmt.Sprintf(plurals[index], args...)
  54. }
  55. }
  56. return key
  57. }
  58. // NewPrinter creates a new Printer.
  59. func NewPrinter(language string) *Printer {
  60. return &Printer{language}
  61. }