plural.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. // See https://localization-guide.readthedocs.io/en/latest/l10n/pluralforms.html
  5. // And http://www.unicode.org/cldr/charts/29/supplemental/language_plural_rules.html
  6. func getPluralForm(lang string, n int) int {
  7. switch lang {
  8. case "ar_AR":
  9. switch {
  10. case n == 0:
  11. return 0
  12. case n == 1:
  13. return 1
  14. case n == 2:
  15. return 2
  16. case n%100 >= 3 && n%100 <= 10:
  17. return 3
  18. case n%100 >= 11:
  19. return 4
  20. default:
  21. return 5
  22. }
  23. case "cs_CZ":
  24. switch {
  25. case n == 1:
  26. return 0
  27. case n >= 2 && n <= 4:
  28. return 1
  29. default:
  30. return 2
  31. }
  32. case "id_ID", "ja_JP":
  33. return 0
  34. case "pl_PL":
  35. switch {
  36. case n == 1:
  37. return 0
  38. case n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20):
  39. return 1
  40. default:
  41. return 2
  42. }
  43. case "ro_RO":
  44. switch {
  45. case n == 1:
  46. return 0
  47. case n == 0 || (n%100 > 0 && n%100 < 20):
  48. return 1
  49. default:
  50. return 2
  51. }
  52. case "ru_RU", "uk_UA", "sr_RS":
  53. switch {
  54. case n%10 == 1 && n%100 != 11:
  55. return 0
  56. case n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20):
  57. return 1
  58. default:
  59. return 2
  60. }
  61. case "zh_CN", "zh_TW", "nan_Latn_pehoeji":
  62. return 0
  63. default: // includes fr_FR, pr_BR, tr_TR
  64. if n > 1 {
  65. return 1
  66. }
  67. return 0
  68. }
  69. }