Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revisão 6786)
+++ django/db/models/fields/__init__.py	(cópia de trabalho)
@@ -1072,3 +1072,31 @@
 
     def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True):
         return [oldforms.HiddenField(name_prefix + self.name)]
+
+class LanguageField(CharField):
+    def __init__(self, *args, **kwargs):
+        from django.contrib.localflavor.generic import isValidLanguage
+
+        kwargs.setdefault('max_length', 5)
+        kwargs.setdefault('choices', settings.LANGUAGES)
+        kwargs.setdefault('validator_list', []).append(isValidLanguage)
+        
+        super(CharField, self).__init__(*args, **kwargs)
+
+    def get_internal_type(self):
+        return "CharField"
+
+class CountryField(CharField):
+    def __init__(self, *args, **kwargs):
+        from django.contrib.localflavor.generic import COUNTRIES
+        from django.contrib.localflavor.generic import isValidCountry
+
+        kwargs.setdefault('max_length', 2)
+        kwargs.setdefault('choices', COUNTRIES)
+        kwargs.setdefault('validator_list', []).append(isValidCountry)
+
+        super(CharField, self).__init__(*args, **kwargs)
+
+    def get_internal_type(self):
+        return "CharField"
+
Index: django/contrib/localflavor/generic/__init__.py
===================================================================
--- django/contrib/localflavor/generic/__init__.py	(revisão 6786)
+++ django/contrib/localflavor/generic/__init__.py	(cópia de trabalho)
@@ -0,0 +1,256 @@
+from django.utils.translation import ugettext as _
+from django.core.validators import ValidationError
+from django.conf import settings
+
+# Countries list - ISO 3166-1993 (E)
+# http://xml.coverpages.org/country3166.html
+COUNTRIES = (
+    ('AD', _('Andorra')),
+    ('AE', _('United Arab Emirates')),
+    ('AF', _('Afghanistan')),
+    ('AG', _('Antigua & Barbuda')),
+    ('AI', _('Anguilla')),
+    ('AL', _('Albania')),
+    ('AM', _('Armenia')),
+    ('AN', _('Netherlands Antilles')),
+    ('AO', _('Angola')),
+    ('AQ', _('Antarctica')),
+    ('AR', _('Argentina')),
+    ('AS', _('American Samoa')),
+    ('AT', _('Austria')),
+    ('AU', _('Australia')),
+    ('AW', _('Aruba')),
+    ('AZ', _('Azerbaijan')),
+    ('BA', _('Bosnia and Herzegovina')),
+    ('BB', _('Barbados')),
+    ('BD', _('Bangladesh')),
+    ('BE', _('Belgium')),
+    ('BF', _('Burkina Faso')),
+    ('BG', _('Bulgaria')),
+    ('BH', _('Bahrain')),
+    ('BI', _('Burundi')),
+    ('BJ', _('Benin')),
+    ('BM', _('Bermuda')),
+    ('BN', _('Brunei Darussalam')),
+    ('BO', _('Bolivia')),
+    ('BR', _('Brazil')),
+    ('BS', _('Bahama')),
+    ('BT', _('Bhutan')),
+    ('BV', _('Bouvet Island')),
+    ('BW', _('Botswana')),
+    ('BY', _('Belarus')),
+    ('BZ', _('Belize')),
+    ('CA', _('Canada')),
+    ('CC', _('Cocos (Keeling) Islands')),
+    ('CF', _('Central African Republic')),
+    ('CG', _('Congo')),
+    ('CH', _('Switzerland')),
+    ('CI', _('Ivory Coast')),
+    ('CK', _('Cook Iislands')),
+    ('CL', _('Chile')),
+    ('CM', _('Cameroon')),
+    ('CN', _('China')),
+    ('CO', _('Colombia')),
+    ('CR', _('Costa Rica')),
+    ('CU', _('Cuba')),
+    ('CV', _('Cape Verde')),
+    ('CX', _('Christmas Island')),
+    ('CY', _('Cyprus')),
+    ('CZ', _('Czech Republic')),
+    ('DE', _('Germany')),
+    ('DJ', _('Djibouti')),
+    ('DK', _('Denmark')),
+    ('DM', _('Dominica')),
+    ('DO', _('Dominican Republic')),
+    ('DZ', _('Algeria')),
+    ('EC', _('Ecuador')),
+    ('EE', _('Estonia')),
+    ('EG', _('Egypt')),
+    ('EH', _('Western Sahara')),
+    ('ER', _('Eritrea')),
+    ('ES', _('Spain')),
+    ('ET', _('Ethiopia')),
+    ('FI', _('Finland')),
+    ('FJ', _('Fiji')),
+    ('FK', _('Falkland Islands (Malvinas)')),
+    ('FM', _('Micronesia')),
+    ('FO', _('Faroe Islands')),
+    ('FR', _('France')),
+    ('FX', _('France, Metropolitan')),
+    ('GA', _('Gabon')),
+    ('GB', _('United Kingdom (Great Britain)')),
+    ('GD', _('Grenada')),
+    ('GE', _('Georgia')),
+    ('GF', _('French Guiana')),
+    ('GH', _('Ghana')),
+    ('GI', _('Gibraltar')),
+    ('GL', _('Greenland')),
+    ('GM', _('Gambia')),
+    ('GN', _('Guinea')),
+    ('GP', _('Guadeloupe')),
+    ('GQ', _('Equatorial Guinea')),
+    ('GR', _('Greece')),
+    ('GS', _('South Georgia and the South Sandwich Islands')),
+    ('GT', _('Guatemala')),
+    ('GU', _('Guam')),
+    ('GW', _('Guinea-Bissau')),
+    ('GY', _('Guyana')),
+    ('HK', _('Hong Kong')),
+    ('HM', _('Heard & McDonald Islands')),
+    ('HN', _('Honduras')),
+    ('HR', _('Croatia')),
+    ('HT', _('Haiti')),
+    ('HU', _('Hungary')),
+    ('ID', _('Indonesia')),
+    ('IE', _('Ireland')),
+    ('IL', _('Israel')),
+    ('IN', _('India')),
+    ('IO', _('British Indian Ocean Territory')),
+    ('IQ', _('Iraq')),
+    ('IR', _('Islamic Republic of Iran')),
+    ('IS', _('Iceland')),
+    ('IT', _('Italy')),
+    ('JM', _('Jamaica')),
+    ('JO', _('Jordan')),
+    ('JP', _('Japan')),
+    ('KE', _('Kenya')),
+    ('KG', _('Kyrgyzstan')),
+    ('KH', _('Cambodia')),
+    ('KI', _('Kiribati')),
+    ('KM', _('Comoros')),
+    ('KN', _('St. Kitts and Nevis')),
+    ('KP', _('Korea, Democratic People\'s Republic of')),
+    ('KR', _('Korea, Republic of')),
+    ('KW', _('Kuwait')),
+    ('KY', _('Cayman Islands')),
+    ('KZ', _('Kazakhstan')),
+    ('LA', _('Lao People\'s Democratic Republic')),
+    ('LB', _('Lebanon')),
+    ('LC', _('Saint Lucia')),
+    ('LI', _('Liechtenstein')),
+    ('LK', _('Sri Lanka')),
+    ('LR', _('Liberia')),
+    ('LS', _('Lesotho')),
+    ('LT', _('Lithuania')),
+    ('LU', _('Luxembourg')),
+    ('LV', _('Latvia')),
+    ('LY', _('Libyan Arab Jamahiriya')),
+    ('MA', _('Morocco')),
+    ('MC', _('Monaco')),
+    ('MD', _('Moldova, Republic of')),
+    ('MG', _('Madagascar')),
+    ('MH', _('Marshall Islands')),
+    ('ML', _('Mali')),
+    ('MN', _('Mongolia')),
+    ('MM', _('Myanmar')),
+    ('MO', _('Macau')),
+    ('MP', _('Northern Mariana Islands')),
+    ('MQ', _('Martinique')),
+    ('MR', _('Mauritania')),
+    ('MS', _('Monserrat')),
+    ('MT', _('Malta')),
+    ('MU', _('Mauritius')),
+    ('MV', _('Maldives')),
+    ('MW', _('Malawi')),
+    ('MX', _('Mexico')),
+    ('MY', _('Malaysia')),
+    ('MZ', _('Mozambique')),
+    ('NA', _('Namibia')),
+    ('NC', _('New Caledonia')),
+    ('NE', _('Niger')),
+    ('NF', _('Norfolk Island')),
+    ('NG', _('Nigeria')),
+    ('NI', _('Nicaragua')),
+    ('NL', _('Netherlands')),
+    ('NO', _('Norway')),
+    ('NP', _('Nepal')),
+    ('NR', _('Nauru')),
+    ('NU', _('Niue')),
+    ('NZ', _('New Zealand')),
+    ('OM', _('Oman')),
+    ('PA', _('Panama')),
+    ('PE', _('Peru')),
+    ('PF', _('French Polynesia')),
+    ('PG', _('Papua New Guinea')),
+    ('PH', _('Philippines')),
+    ('PK', _('Pakistan')),
+    ('PL', _('Poland')),
+    ('PM', _('St. Pierre & Miquelon')),
+    ('PN', _('Pitcairn')),
+    ('PR', _('Puerto Rico')),
+    ('PT', _('Portugal')),
+    ('PW', _('Palau')),
+    ('PY', _('Paraguay')),
+    ('QA', _('Qatar')),
+    ('RE', _('Reunion')),
+    ('RO', _('Romania')),
+    ('RU', _('Russian Federation')),
+    ('RW', _('Rwanda')),
+    ('SA', _('Saudi Arabia')),
+    ('SB', _('Solomon Islands')),
+    ('SC', _('Seychelles')),
+    ('SD', _('Sudan')),
+    ('SE', _('Sweden')),
+    ('SG', _('Singapore')),
+    ('SH', _('St. Helena')),
+    ('SI', _('Slovenia')),
+    ('SJ', _('Svalbard & Jan Mayen Islands')),
+    ('SK', _('Slovakia')),
+    ('SL', _('Sierra Leone')),
+    ('SM', _('San Marino')),
+    ('SN', _('Senegal')),
+    ('SO', _('Somalia')),
+    ('SR', _('Suriname')),
+    ('ST', _('Sao Tome & Principe')),
+    ('SV', _('El Salvador')),
+    ('SY', _('Syrian Arab Republic')),
+    ('SZ', _('Swaziland')),
+    ('TC', _('Turks & Caicos Islands')),
+    ('TD', _('Chad')),
+    ('TF', _('French Southern Territories')),
+    ('TG', _('Togo')),
+    ('TH', _('Thailand')),
+    ('TJ', _('Tajikistan')),
+    ('TK', _('Tokelau')),
+    ('TM', _('Turkmenistan')),
+    ('TN', _('Tunisia')),
+    ('TO', _('Tonga')),
+    ('TP', _('East Timor')),
+    ('TR', _('Turkey')),
+    ('TT', _('Trinidad & Tobago')),
+    ('TV', _('Tuvalu')),
+    ('TW', _('Taiwan, Province of China')),
+    ('TZ', _('Tanzania, United Republic of')),
+    ('UA', _('Ukraine')),
+    ('UG', _('Uganda')),
+    ('UM', _('United States Minor Outlying Islands')),
+    ('US', _('United States of America')),
+    ('UY', _('Uruguay')),
+    ('UZ', _('Uzbekistan')),
+    ('VA', _('Vatican City State (Holy See)')),
+    ('VC', _('St. Vincent & the Grenadines')),
+    ('VE', _('Venezuela')),
+    ('VG', _('British Virgin Islands')),
+    ('VI', _('United States Virgin Islands')),
+    ('VN', _('Viet Nam')),
+    ('VU', _('Vanuatu')),
+    ('WF', _('Wallis & Futuna Islands')),
+    ('WS', _('Samoa')),
+    ('YE', _('Yemen')),
+    ('YT', _('Mayotte')),
+    ('YU', _('Yugoslavia')),
+    ('ZA', _('South Africa')),
+    ('ZM', _('Zambia')),
+    ('ZR', _('Zaire')),
+    ('ZW', _('Zimbabwe')),
+    ('ZZ', _('Unknown or unspecified country')),
+)
+
+def isValidLanguage(field_data, all_data):
+    if not field_data in [lang[0] for lang in settings.LANGUAGES]:
+        raise ValidationError, _("This value must be in LANGUAGES setting in settings.py module.")
+
+def isValidCountry(field_data, all_data):
+    if not field_data in [lang[0] for lang in COUNTRIES]:
+        raise ValidationError, _("This value must be in COUNTRIES setting in localflavor.generic package.")
+
Index: tests/modeltests/countries/__init__.py
===================================================================
Index: tests/modeltests/countries/models.py
===================================================================
--- tests/modeltests/countries/models.py	(revisão 0)
+++ tests/modeltests/countries/models.py	(revisão 0)
@@ -0,0 +1,37 @@
+"""
+Test of LanguageField and CountryField fields.
+Task #5446
+"""
+
+from django.db import models
+
+class Person(models.Model):
+    name = models.CharField(max_length=20)
+    language = models.LanguageField()
+    country = models.CountryField()
+
+    def __unicode__(self):
+        return self.name
+
+__test__ = {'API_TESTS':"""
+>>> tarsila = Person(name='Tarsila', language='pt-br', country='BR')
+>>> tarsila.save()
+>>> tarsila.language
+'pt-br'
+>>> tarsila.country
+'BR'
+>>> tarsila.get_language_display()
+u'Brazilian'
+>>> tarsila.get_country_display()
+u'Brazil'
+>>> mychelle = Person(name='Mychelle', language='en', country='US')
+>>> mychelle.save()
+>>> mychelle.language
+'en'
+>>> mychelle.country
+'US'
+>>> mychelle.get_language_display()
+u'English'
+>>> mychelle.get_country_display()
+u'United States of America'
+"""}
Index: docs/model-api.txt
===================================================================
--- docs/model-api.txt	(revisão 6786)
+++ docs/model-api.txt	(cópia de trabalho)
@@ -156,6 +156,16 @@
 A field of integers separated by commas. As in ``CharField``, the ``max_length``
 argument is required.
 
+``CountryField``
+~~~~~~~~~~~~~~~~~
+
+An uppercase two-letter ISO 3166-1993 (E) standard country code. You can see more
+about these codes at this `Country Code List`_.
+
+.. _`Country Code List`: http://xml.coverpages.org/country3166.html
+
+The admin represents this as an ``<select>`` with a large list of valid countries.
+
 ``DateField``
 ~~~~~~~~~~~~~
 
@@ -388,6 +398,14 @@
 
 The admin represents this as an ``<input type="text">`` (a single-line input).
 
+``LanguageField``
+~~~~~~~~~~~~~~~~~
+
+A field that accept user put a language code. The languages list is taked from then
+``LANGUAGES`` setting.
+
+The admin represents this as an ``<select>`` with a large list of valid languages.
+
 ``NullBooleanField``
 ~~~~~~~~~~~~~~~~~~~~
 
Index: django/newforms/widgets.py
===================================================================
--- django/newforms/widgets.py  (revision 6914)
+++ django/newforms/widgets.py  (working copy)
@@ -426,7 +426,7 @@
             if id_:
                 final_attrs = dict(final_attrs, id='%s_%s' % (id_, i))
             output.append(widget.render(name + '_%s' % i, widget_value, final_attrs))
-        return self.format_output(output)
+        return mark_safe(self.format_output(output))
 
     def id_for_label(self, id_):
         # See the comment for RadioSelect.id_for_label()

Index: django/newforms/widgets.py
===================================================================
--- django/newforms/widgets.py  (revision 6914)
+++ django/newforms/widgets.py  (working copy)
@@ -426,7 +426,7 @@
             if id_:
                 final_attrs = dict(final_attrs, id='%s_%s' % (id_, i))
             output.append(widget.render(name + '_%s' % i, widget_value, final_attrs))
-        return self.format_output(output)
+        return mark_safe(self.format_output(output))
 
     def id_for_label(self, id_):
         # See the comment for RadioSelect.id_for_label()
