plural.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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_SA":
  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 "gl_ES":
  33. if n != 1 {
  34. return 1
  35. }
  36. return 0
  37. case "id_ID", "ja_JP":
  38. return 0
  39. case "pl_PL":
  40. switch {
  41. case n == 1:
  42. return 0
  43. case n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20):
  44. return 1
  45. default:
  46. return 2
  47. }
  48. case "ro_RO":
  49. switch {
  50. case n == 1:
  51. return 0
  52. case n == 0 || (n%100 > 0 && n%100 < 20):
  53. return 1
  54. default:
  55. return 2
  56. }
  57. case "ru_RU", "uk_UA", "sr_RS":
  58. switch {
  59. case n%10 == 1 && n%100 != 11:
  60. return 0
  61. case n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20):
  62. return 1
  63. default:
  64. return 2
  65. }
  66. case "zh_CN", "zh_TW", "nan_Latn_pehoeji":
  67. return 0
  68. default: // includes fr_FR, pr_BR, tr_TR
  69. if n > 1 {
  70. return 1
  71. }
  72. return 0
  73. }
  74. }