Index: django/contrib/localflavor/in_/forms.py
===================================================================
--- django/contrib/localflavor/in_/forms.py	(revision 11610)
+++ django/contrib/localflavor/in_/forms.py	(working copy)
@@ -5,31 +5,32 @@
 from django.forms import ValidationError
 from django.forms.fields import Field, RegexField, Select, EMPTY_VALUES
 from django.utils.encoding import smart_unicode
-from django.utils.translation import gettext
-import re
+from django.utils.translation import ugettext_lazy as _
 
 
 class INZipCodeField(RegexField):
     default_error_messages = {
-        'invalid': gettext(u'Enter a zip code in the format XXXXXXX.'),
+        'invalid': _('Enter a zip code in the format XXXXXX.'),
     }
 
     def __init__(self, *args, **kwargs):
         super(INZipCodeField, self).__init__(r'^\d{6}$',
             max_length=None, min_length=None, *args, **kwargs)
 
+
 class INStateField(Field):
     """
     A form field that validates its input is a Indian state name or
     abbreviation. It normalizes the input to the standard two-letter vehicle
     registration abbreviation for the given state or union territory
     """
+
     default_error_messages = {
         'invalid': u'Enter a Indian state or territory.',
     }
 
     def clean(self, value):
-        from in_states import STATES_NORMALIZED
+        from in_states import REGIONS_NORMALIZED
         super(INStateField, self).clean(value)
         if value in EMPTY_VALUES:
             return u''
@@ -39,17 +40,18 @@
             pass
         else:
             try:
-                return smart_unicode(STATES_NORMALIZED[value.strip().lower()])
+                return smart_unicode(REGIONS_NORMALIZED[value.strip().lower()])
             except KeyError:
                 pass
         raise ValidationError(self.error_messages['invalid'])
 
+
 class INStateSelect(Select):
     """
     A Select widget that uses a list of Indian states/territories as its
     choices.
     """
+
     def __init__(self, attrs=None):
-        from in_states import STATE_CHOICES
-        super(INStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
-
+        from in_states import REGION_CHOICES
+        super(INStateSelect, self).__init__(attrs, choices=REGION_CHOICES)
Index: django/contrib/localflavor/in_/in_states.py
===================================================================
--- django/contrib/localflavor/in_/in_states.py	(revision 11610)
+++ django/contrib/localflavor/in_/in_states.py	(working copy)
@@ -1,84 +1,112 @@
 """
+
 A mapping of state misspellings/abbreviations to normalized abbreviations, and
 an alphabetical list of states for use as `choices` in a formfield.
 
 This exists in this standalone file so that it's only imported into memory
 when explicitly needed.
+
 """
+from django.utils.translation import ugettext_lazy as _
 
 STATE_CHOICES = (
-    'KA', 'Karnataka',
-    'AP', 'Andhra Pradesh',
-    'KL', 'Kerala',
-    'TN', 'Tamil Nadu',
-    'MH', 'Maharashtra',
-    'UP', 'Uttar Pradesh',
-    'GA', 'Goa',
-    'GJ', 'Gujarat',
-    'RJ', 'Rajasthan',
-    'HP', 'Himachal Pradesh',
-    'JK', 'Jammu and Kashmir',
-    'AR', 'Arunachal Pradesh',
-    'AS', 'Assam',
-    'BR', 'Bihar',
-    'CG', 'Chattisgarh',
-    'HR', 'Haryana',
-    'JH', 'Jharkhand',
-    'MP', 'Madhya Pradesh',
-    'MN', 'Manipur',
-    'ML', 'Meghalaya',
-    'MZ', 'Mizoram',
-    'NL', 'Nagaland',
-    'OR', 'Orissa',
-    'PB', 'Punjab',
-    'SK', 'Sikkim',
-    'TR', 'Tripura',
-    'UA', 'Uttarakhand',
-    'WB', 'West Bengal',
+    ('AP', _('Andhra Pradesh')),
+    ('AR', _('Arunachal Pradesh')),
+    ('AS', _('Assam')),
+    ('BR', _('Bihar')),
+    ('CG', _('Chattisgarh')),
+    ('GA', _('Goa')),
+    ('GJ', _('Gujarat')),
+    ('HR', _('Haryana')),
+    ('HP', _('Himachal Pradesh')),
+    ('JK', _('Jammu and Kashmir')),
+    ('JH', _('Jharkhand')),
+    ('KA', _('Karnataka')),
+    ('KL', _('Kerala')),
+    ('MP', _('Madhya Pradesh')),
+    ('MH', _('Maharashtra')),
+    ('MN', _('Manipur')),
+    ('ML', _('Meghalaya')),
+    ('MZ', _('Mizoram')),
+    ('NL', _('Nagaland')),
+    ('OR', _('Orissa')),
+    ('PB', _('Punjab')),
+    ('RJ', _('Rajasthan')),
+    ('SK', _('Sikkim')),
+    ('TN', _('Tamil Nadu')),
+    ('TR', _('Tripura')),
+    ('UP', _('Uttar Pradesh')),
+    ('UA', _('Uttarakhand')),
+    ('WB', _('West Bengal')),
+)
 
-    # Union Territories
-    'AN', 'Andaman and Nicobar',
-    'CH', 'Chandigarh',
-    'DN', 'Dadra and Nagar Haveli',
-    'DD', 'Daman and Diu',
-    'DL', 'Delhi',
-    'LD', 'Lakshadweep',
-    'PY', 'Pondicherry',
+# Union Territories
+TERRITORY_CHOICES = (
+    ('AN', _('Andaman and Nicobar Islands')),
+    ('CH', _('Chandigarh')),
+    ('DD', _('Daman and Diu')),
+    ('DL', _('Delhi')),
+    ('DN', _('Dadra and Nagar Haveli')),
+    ('LD', _('Lakshadweep')),
+    ('PY', _('Puducherry')),
 )
 
-STATES_NORMALIZED = {
-    'ka': 'KA',
-    'karnatka': 'KA',
-    'tn': 'TN',
-    'tamilnad': 'TN',
-    'tamilnadu': 'TN',
+REGION_CHOICES = STATE_CHOICES + TERRITORY_CHOICES
+
+REGIONS_NORMALIZED = {
+    # States
+    'ap': 'AP',
     'andra pradesh': 'AP',
     'andrapradesh': 'AP',
     'andhrapradesh': 'AP',
-    'maharastra': 'MH',
-    'mh': 'MH',
-    'ap': 'AP',
-    'dl': 'DL',
-    'dd': 'DD',
+    'ar': 'AR',
+    'as': 'AS',
     'br': 'BR',
-    'ar': 'AR',
-    'sk': 'SK',
-    'kl': 'KL',
+    'cg': 'CG',
     'ga': 'GA',
-    'rj': 'RJ',
-    'rajastan': 'RJ',
-    'rajasthan': 'RJ',
+    'gj': 'GJ',
+    'hr': 'HR',
     'hp': 'HP',
-    'ua': 'UA',
-    'up': 'UP',
+    'jk': 'JK',
+    'ka': 'KA',
+    'karnatka': 'KA',
+    'kl': 'KL',
     'mp': 'MP',
+    'mh': 'MH',
+    'maharastra': 'MH',
+    'mn': 'MN',
+    'ml': 'ML',
     'mz': 'MZ',
-    'bengal': 'WB',
-    'westbengal': 'WB',
     'mizo': 'MZ',
+    'nl': 'NL',
     'orisa': 'OR',
     'odisa': 'OR',
     'or': 'OR',
-    'ar': 'AR',
+    'pb': 'pb',
+    'rj': 'RJ',
+    'rajastan': 'RJ',
+    'rajasthan': 'RJ',
+    'sk': 'SK',
+    'tn': 'TN',
+    'tamilnad': 'TN',
+    'tamilnadu': 'TN',
+    'tr': 'TR',
+    'up': 'UP',
+    'ua': 'UA',
+    'ul': 'UA',
+    'uk': 'UA',
+    'uttaranchal': 'UA',
+    'wb': 'WB',
+    'bengal': 'WB',
+    'westbengal': 'WB',
+
+    # Territories
+    'an': 'AN',
+    'ch': 'CH',
+    'dd': 'DD',
+    'dl': 'DL',
+    'dn': 'DN',
+    'ld': 'LD',
+    'py': 'PY',
+    'pondicherry': 'PY',
 }
-
Index: tests/regressiontests/forms/localflavor/in_.py
===================================================================
--- tests/regressiontests/forms/localflavor/in_.py	(revision 0)
+++ tests/regressiontests/forms/localflavor/in_.py	(revision 0)
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+
+tests = r"""
+# INZipCodeField ##############################################################
+
+>>> from django.contrib.localflavor.in_.forms import INZipCodeField
+>>> f = INZipCodeField()
+>>> f.clean('456001')
+u'456001'
+>>> f.clean(' 456001')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXXX.']
+
+# INStateField ################################################################
+
+>>> from django.contrib.localflavor.in_.forms import INStateField
+>>> f = INStateField()
+>>> f.clean('uttaranchal')
+u'UA'
+>>> f.clean('MZ')
+u'MZ'
+>>> f.clean('mz')
+u'MZ'
+>>> f.clean('wb')
+u'WB'
+>>> f.clean('  maharastra ')
+u'MH'
+>>> f.clean(60606)
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a Indian state or territory.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f = INStateField(required=False)
+>>> f.clean('mz')
+u'MZ'
+>>> f.clean('MZ')
+u'MZ'
+>>> f.clean(60606)
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a Indian state or territory.']
+>>> f.clean(None)
+u''
+>>> f.clean('')
+u''
+
+# INStateSelect #############################################################
+
+>>> from django.contrib.localflavor.in_.forms import INStateSelect
+>>> w = INStateSelect()
+>>> print w.render('states', 'UA')
+<select name="states">
+<option value="AP">Andhra Pradesh</option>
+<option value="AR">Arunachal Pradesh</option>
+<option value="AS">Assam</option>
+<option value="BR">Bihar</option>
+<option value="CG">Chattisgarh</option>
+<option value="GA">Goa</option>
+<option value="GJ">Gujarat</option>
+<option value="HR">Haryana</option>
+<option value="HP">Himachal Pradesh</option>
+<option value="JK">Jammu and Kashmir</option>
+<option value="JH">Jharkhand</option>
+<option value="KA">Karnataka</option>
+<option value="KL">Kerala</option>
+<option value="MP">Madhya Pradesh</option>
+<option value="MH">Maharashtra</option>
+<option value="MN">Manipur</option>
+<option value="ML">Meghalaya</option>
+<option value="MZ">Mizoram</option>
+<option value="NL">Nagaland</option>
+<option value="OR">Orissa</option>
+<option value="PB">Punjab</option>
+<option value="RJ">Rajasthan</option>
+<option value="SK">Sikkim</option>
+<option value="TN">Tamil Nadu</option>
+<option value="TR">Tripura</option>
+<option value="UP">Uttar Pradesh</option>
+<option value="UA" selected="selected">Uttarakhand</option>
+<option value="WB">West Bengal</option>
+<option value="AN">Andaman and Nicobar Islands</option>
+<option value="CH">Chandigarh</option>
+<option value="DD">Daman and Diu</option>
+<option value="DL">Delhi</option>
+<option value="DN">Dadra and Nagar Haveli</option>
+<option value="LD">Lakshadweep</option>
+<option value="PY">Puducherry</option>
+</select>
+"""
Index: tests/regressiontests/forms/tests.py
===================================================================
--- tests/regressiontests/forms/tests.py	(revision 11610)
+++ tests/regressiontests/forms/tests.py	(working copy)
@@ -16,6 +16,7 @@
 from localflavor.fi import tests as localflavor_fi_tests
 from localflavor.fr import tests as localflavor_fr_tests
 from localflavor.generic import tests as localflavor_generic_tests
+from localflavor.in_ import tests as localflavor_in_tests
 from localflavor.is_ import tests as localflavor_is_tests
 from localflavor.it import tests as localflavor_it_tests
 from localflavor.jp import tests as localflavor_jp_tests
@@ -50,6 +51,7 @@
     'localflavor_fi_tests': localflavor_fi_tests,
     'localflavor_fr_tests': localflavor_fr_tests,
     'localflavor_generic_tests': localflavor_generic_tests,
+    'localflavor_in_tests': localflavor_in_tests,
     'localflavor_is_tests': localflavor_is_tests,
     'localflavor_it_tests': localflavor_it_tests,
     'localflavor_jp_tests': localflavor_jp_tests,
