test_translation.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. from django.core.checks import Error
  2. from django.core.checks.translation import (
  3. check_language_settings_consistent, check_setting_language_code,
  4. check_setting_languages, check_setting_languages_bidi,
  5. )
  6. from django.test import SimpleTestCase, override_settings
  7. class TranslationCheckTests(SimpleTestCase):
  8. def setUp(self):
  9. self.valid_tags = (
  10. 'en', # language
  11. 'mas', # language
  12. 'sgn-ase', # language+extlang
  13. 'fr-CA', # language+region
  14. 'es-419', # language+region
  15. 'zh-Hans', # language+script
  16. 'ca-ES-valencia', # language+region+variant
  17. # FIXME: The following should be invalid:
  18. 'sr@latin', # language+script
  19. )
  20. self.invalid_tags = (
  21. None, # invalid type: None.
  22. 123, # invalid type: int.
  23. b'en', # invalid type: bytes.
  24. 'eü', # non-latin characters.
  25. 'en_US', # locale format.
  26. 'en--us', # empty subtag.
  27. '-en', # leading separator.
  28. 'en-', # trailing separator.
  29. 'en-US.UTF-8', # language tag w/ locale encoding.
  30. 'en_US.UTF-8', # locale format - language w/ region and encoding.
  31. 'ca_ES@valencia', # locale format - language w/ region and variant.
  32. # FIXME: The following should be invalid:
  33. # 'sr@latin', # locale instead of language tag.
  34. )
  35. def test_valid_language_code(self):
  36. for tag in self.valid_tags:
  37. with self.subTest(tag), self.settings(LANGUAGE_CODE=tag):
  38. self.assertEqual(check_setting_language_code(None), [])
  39. def test_invalid_language_code(self):
  40. msg = 'You have provided an invalid value for the LANGUAGE_CODE setting: %r.'
  41. for tag in self.invalid_tags:
  42. with self.subTest(tag), self.settings(LANGUAGE_CODE=tag):
  43. self.assertEqual(check_setting_language_code(None), [
  44. Error(msg % tag, id='translation.E001'),
  45. ])
  46. def test_valid_languages(self):
  47. for tag in self.valid_tags:
  48. with self.subTest(tag), self.settings(LANGUAGES=[(tag, tag)]):
  49. self.assertEqual(check_setting_languages(None), [])
  50. def test_invalid_languages(self):
  51. msg = 'You have provided an invalid language code in the LANGUAGES setting: %r.'
  52. for tag in self.invalid_tags:
  53. with self.subTest(tag), self.settings(LANGUAGES=[(tag, tag)]):
  54. self.assertEqual(check_setting_languages(None), [
  55. Error(msg % tag, id='translation.E002'),
  56. ])
  57. def test_valid_languages_bidi(self):
  58. for tag in self.valid_tags:
  59. with self.subTest(tag), self.settings(LANGUAGES_BIDI=[tag]):
  60. self.assertEqual(check_setting_languages_bidi(None), [])
  61. def test_invalid_languages_bidi(self):
  62. msg = 'You have provided an invalid language code in the LANGUAGES_BIDI setting: %r.'
  63. for tag in self.invalid_tags:
  64. with self.subTest(tag), self.settings(LANGUAGES_BIDI=[tag]):
  65. self.assertEqual(check_setting_languages_bidi(None), [
  66. Error(msg % tag, id='translation.E003'),
  67. ])
  68. @override_settings(USE_I18N=True, LANGUAGES=[('en', 'English')])
  69. def test_inconsistent_language_settings(self):
  70. msg = (
  71. 'You have provided a value for the LANGUAGE_CODE setting that is '
  72. 'not in the LANGUAGES setting.'
  73. )
  74. for tag in ['fr', 'fr-CA', 'fr-357']:
  75. with self.subTest(tag), self.settings(LANGUAGE_CODE=tag):
  76. self.assertEqual(check_language_settings_consistent(None), [
  77. Error(msg, id='translation.E004'),
  78. ])
  79. @override_settings(
  80. USE_I18N=True,
  81. LANGUAGES=[
  82. ('de', 'German'),
  83. ('es', 'Spanish'),
  84. ('fr', 'French'),
  85. ('ca', 'Catalan'),
  86. ],
  87. )
  88. def test_valid_variant_consistent_language_settings(self):
  89. tests = [
  90. # language + region.
  91. 'fr-CA',
  92. 'es-419',
  93. 'de-at',
  94. # language + region + variant.
  95. 'ca-ES-valencia',
  96. ]
  97. for tag in tests:
  98. with self.subTest(tag), self.settings(LANGUAGE_CODE=tag):
  99. self.assertEqual(check_language_settings_consistent(None), [])