printer.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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 dict, err := GetTranslationDict(p.language); err == nil {
  11. if str, ok := dict[key]; ok {
  12. if translation, ok := str.(string); ok {
  13. return translation
  14. }
  15. }
  16. }
  17. return key
  18. }
  19. // Printf is like fmt.Printf, but using language-specific formatting.
  20. func (p *Printer) Printf(key string, args ...interface{}) string {
  21. translation := key
  22. if dict, err := GetTranslationDict(p.language); err == nil {
  23. str, found := dict[key]
  24. if found {
  25. var valid bool
  26. translation, valid = str.(string)
  27. if !valid {
  28. translation = key
  29. }
  30. }
  31. }
  32. return fmt.Sprintf(translation, args...)
  33. }
  34. // Plural returns the translation of the given key by using the language plural form.
  35. func (p *Printer) Plural(key string, n int, args ...interface{}) string {
  36. dict, err := GetTranslationDict(p.language)
  37. if err != nil {
  38. return key
  39. }
  40. if choices, found := dict[key]; found {
  41. var plurals []string
  42. switch v := choices.(type) {
  43. case []interface{}:
  44. for _, v := range v {
  45. plurals = append(plurals, fmt.Sprint(v))
  46. }
  47. case []string:
  48. plurals = v
  49. default:
  50. return key
  51. }
  52. pluralForm, found := pluralForms[p.language]
  53. if !found {
  54. pluralForm = pluralForms["default"]
  55. }
  56. index := pluralForm(n)
  57. if len(plurals) > index {
  58. return fmt.Sprintf(plurals[index], args...)
  59. }
  60. }
  61. return key
  62. }
  63. // NewPrinter creates a new Printer.
  64. func NewPrinter(language string) *Printer {
  65. return &Printer{language}
  66. }