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