Ticket #7980: i18n-formatting.1.diff
File i18n-formatting.1.diff, 141.9 KB (added by , 15 years ago) |
---|
-
django/conf/global_settings.py
diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py index 828aef5..b2b6963 100644
a b USE_I18N = True 103 103 LOCALE_PATHS = () 104 104 LANGUAGE_COOKIE_NAME = 'django_language' 105 105 106 # If you set this to True, Django will format dates, numbers and calendars 107 # according to user current locale 108 USE_FORMAT_I18N = False 109 106 110 # Not-necessarily-technical managers of the site. They get broken link 107 111 # notifications and other various e-mails. 108 112 MANAGERS = ADMINS … … FILE_UPLOAD_TEMP_DIR = None 262 266 # you'd pass directly to os.chmod; see http://docs.python.org/lib/os-file-dir.html. 263 267 FILE_UPLOAD_PERMISSIONS = None 264 268 269 # Python module path where user will place custom format definition. 270 # The directory where this setting is pointing should contain subdirectories 271 # named as the locales, containing a formats.py file 272 # (i.e. "myproject.locale" for myproject/locale/en/formats.py etc. use) 273 FORMAT_MODULE_PATH = None 274 265 275 # Default formatting for date objects. See all available format strings here: 266 276 # http://docs.djangoproject.com/en/dev/ref/templates/builtins/#now 267 277 DATE_FORMAT = 'N j, Y' … … YEAR_MONTH_FORMAT = 'F Y' 284 294 # http://docs.djangoproject.com/en/dev/ref/templates/builtins/#now 285 295 MONTH_DAY_FORMAT = 'F j' 286 296 297 # Default shortformatting for date objects. See all available format strings here: 298 # http://docs.djangoproject.com/en/dev/ref/templates/builtins/#now 299 SHORT_DATE_FORMAT = 'm/d/Y' 300 301 # Default short formatting for datetime objects. 302 # See all available format strings here: 303 # http://docs.djangoproject.com/en/dev/ref/templates/builtins/#now 304 SHORT_DATETIME_FORMAT = 'm/d/Y P' 305 306 # Default formats tried to parse dates from input boxes 307 # These formats are tried in the specified order 308 # See all available format string here: 309 # http://docs.python.org/library/datetime.html#strftime-behavior 310 # * Note that these format strings are different from the ones to display dates 311 DATE_INPUT_FORMATS = ( 312 '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' 313 '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' 314 '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' 315 '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' 316 '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' 317 ) 318 319 # Default formats tried to parse times from input boxes 320 # These formats are tried in the specified order 321 # See all available format string here: 322 # http://docs.python.org/library/datetime.html#strftime-behavior 323 # * Note that these format strings are different from the ones to display dates 324 TIME_INPUT_FORMATS = ( 325 '%H:%M:%S', # '14:30:59' 326 '%H:%M', # '14:30' 327 ) 328 329 # Default formats tried to parse dates and times from input boxes 330 # These formats are tried in the specified order 331 # See all available format string here: 332 # http://docs.python.org/library/datetime.html#strftime-behavior 333 # * Note that these format strings are different from the ones to display dates 334 DATETIME_INPUT_FORMATS = ( 335 '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' 336 '%Y-%m-%d %H:%M', # '2006-10-25 14:30' 337 '%Y-%m-%d', # '2006-10-25' 338 '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' 339 '%m/%d/%Y %H:%M', # '10/25/2006 14:30' 340 '%m/%d/%Y', # '10/25/2006' 341 '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' 342 '%m/%d/%y %H:%M', # '10/25/06 14:30' 343 '%m/%d/%y', # '10/25/06' 344 ) 345 346 # First day of week, to be used on calendars 347 # 0 means Sunday, 1 means Monday... 348 FIRST_DAY_OF_WEEK = 0 349 350 # Decimal separator symbol 351 DECIMAL_SEPARATOR = '.' 352 353 # Boolean that sets whether to add thousand separator when formatting numbers 354 USE_THOUSAND_SEPARATOR = False 355 356 # Number of digits that will be togheter, when spliting them by THOUSAND_SEPARATOR 357 # 0 means no grouping, 3 means splitting by thousands... 358 NUMBER_GROUPING = 0 359 360 # Thousand separator symbol 361 THOUSAND_SEPARATOR = ',' 362 287 363 # Do you want to manage transactions manually? 288 364 # Hint: you really don't! 289 365 TRANSACTIONS_MANAGED = False -
new file django/conf/locale/ar/formats.py
diff --git a/django/conf/locale/__init__.py b/django/conf/locale/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/ar/__init__.py b/django/conf/locale/ar/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/ar/formats.py b/django/conf/locale/ar/formats.py new file mode 100644 index 0000000..d8d627f
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F، Y' 6 TIME_FORMAT = 'g:i:s A' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'd/m/Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = '.' 18 # NUMBER_GROUPING = -
new file django/conf/locale/bg/formats.py
diff --git a/django/conf/locale/bg/__init__.py b/django/conf/locale/bg/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/bg/formats.py b/django/conf/locale/bg/formats.py new file mode 100644 index 0000000..045543a
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'd F Y' 6 TIME_FORMAT = 'H:i:s' 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'd.m.Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = ' ' 18 # NUMBER_GROUPING = -
new file django/conf/locale/bn/formats.py
diff --git a/django/conf/locale/bn/__init__.py b/django/conf/locale/bn/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/bn/formats.py b/django/conf/locale/bn/formats.py new file mode 100644 index 0000000..46e5da9
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F, Y' 6 TIME_FORMAT = 'g:i:s A' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'j M, Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = '.' 17 THOUSAND_SEPARATOR = ',' 18 # NUMBER_GROUPING = -
new file django/conf/locale/ca/formats.py
diff --git a/django/conf/locale/ca/__init__.py b/django/conf/locale/ca/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/ca/formats.py b/django/conf/locale/ca/formats.py new file mode 100644 index 0000000..aebaea3
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j \de F \de Y' 6 TIME_FORMAT = 'G:i:s' 7 DATETIME_FORMAT = 'j \de F \de Y \\a \le\s G:i' 8 YEAR_MONTH_FORMAT = 'F \de\l Y' 9 MONTH_DAY_FORMAT = 'j \de F' 10 SHORT_DATE_FORMAT = 'd/m/Y' 11 SHORT_DATETIME_FORMAT = 'd/m/Y G:i' 12 FIRST_DAY_OF_WEEK = 1 # Monday 13 DATE_INPUT_FORMATS = ( 14 # '31/12/2009', '31/12/09' 15 '%d/%m/%Y', '%d/%m/%y' 16 ) 17 TIME_INPUT_FORMATS = ( 18 # '14:30:59', '14:30' 19 '%H:%M:%S', '%H:%M' 20 ) 21 DATETIME_INPUT_FORMATS = ( 22 '%d/%m/%Y %H:%M:%S', 23 '%d/%m/%Y %H:%M', 24 '%d/%m/%y %H:%M:%S', 25 '%d/%m/%y %H:%M', 26 ) 27 DECIMAL_SEPARATOR = ',' 28 THOUSAND_SEPARATOR = '.' 29 NUMBER_GROUPING = 3 30 -
new file django/conf/locale/cs/formats.py
diff --git a/django/conf/locale/cs/__init__.py b/django/conf/locale/cs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/cs/formats.py b/django/conf/locale/cs/formats.py new file mode 100644 index 0000000..327e77e
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j. F Y' 6 TIME_FORMAT = 'G:i:s' 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 MONTH_DAY_FORMAT = 'j. F' 10 SHORT_DATE_FORMAT = 'j.n.Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = ' ' 18 # NUMBER_GROUPING = -
new file django/conf/locale/cy/formats.py
diff --git a/django/conf/locale/cy/__init__.py b/django/conf/locale/cy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/cy/formats.py b/django/conf/locale/cy/formats.py new file mode 100644 index 0000000..a58d81f
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'd F Y' 6 TIME_FORMAT = 'g:i:s A' 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 # MONTH_DAY_FORMAT = 10 SHORT_DATE_FORMAT = 'j M Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 # DECIMAL_SEPARATOR = 17 # THOUSAND_SEPARATOR = 18 # NUMBER_GROUPING = -
new file django/conf/locale/da/formats.py
diff --git a/django/conf/locale/da/__init__.py b/django/conf/locale/da/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/da/formats.py b/django/conf/locale/da/formats.py new file mode 100644 index 0000000..9982014
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j. F Y' 6 TIME_FORMAT = 'H:i' 7 DATETIME_FORMAT = 'j. F Y H:i' 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j. F' 10 SHORT_DATE_FORMAT = 'd.m.Y' 11 SHORT_DATETIME_FORMAT = 'd.m.Y H:i' 12 FIRST_DAY_OF_WEEK = 1 13 DATE_INPUT_FORMATS = ( 14 '%d.%m.%Y', # '25.10.2006' 15 ) 16 TIME_INPUT_FORMATS = ( 17 '%H:%M:%S', # '14:30:59' 18 '%H:%M', # '14:30' 19 ) 20 DATETIME_INPUT_FORMATS = ( 21 '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' 22 '%d.%m.%Y %H:%M', # '25.10.2006 14:30' 23 ) 24 DECIMAL_SEPARATOR = ',' 25 THOUSAND_SEPARATOR = '.' 26 NUMBER_GROUPING = 3 -
new file django/conf/locale/de/formats.py
diff --git a/django/conf/locale/de/__init__.py b/django/conf/locale/de/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/de/formats.py b/django/conf/locale/de/formats.py new file mode 100644 index 0000000..89b5784
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j. F Y' 6 TIME_FORMAT = 'H:i:s' 7 DATETIME_FORMAT = 'j. F Y H:i:s' 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j. F' 10 SHORT_DATE_FORMAT = 'd.m.Y' 11 SHORT_DATETIME_FORMAT = 'd.m.Y H:i:s' 12 FIRST_DAY_OF_WEEK = 1 # Monday 13 DATE_INPUT_FORMATS = ( 14 '%d.%m.%Y', '%d.%m.%y', # '25.10.2006', '25.10.06' 15 '%Y-%m-%d', '%y-%m-%d', # '2006-10-25', '06-10-25' 16 '%d. %B %Y', '%d. %b. %Y', # '25. October 2006', '25. Oct. 2006' 17 ) 18 TIME_INPUT_FORMATS = ( 19 '%H:%M:%S', # '14:30:59' 20 '%H:%M', # '14:30' 21 ) 22 DATETIME_INPUT_FORMATS = ( 23 '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' 24 '%d.%m.%Y %H:%M', # '25.10.2006 14:30' 25 '%d.%m.%Y', # '25.10.2006' 26 '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' 27 '%Y-%m-%d %H:%M', # '2006-10-25 14:30' 28 '%Y-%m-%d', # '2006-10-25' 29 ) 30 DECIMAL_SEPARATOR = ',' 31 THOUSAND_SEPARATOR = '.' 32 NUMBER_GROUPING = 3 -
new file django/conf/locale/el/formats.py
diff --git a/django/conf/locale/el/__init__.py b/django/conf/locale/el/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/el/formats.py b/django/conf/locale/el/formats.py new file mode 100644 index 0000000..d476ab3
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'd F Y' 6 TIME_FORMAT = 'g:i:s A' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'd M Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = '.' 18 # NUMBER_GROUPING = -
new file django/conf/locale/en/formats.py
diff --git a/django/conf/locale/en/__init__.py b/django/conf/locale/en/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/en/formats.py b/django/conf/locale/en/formats.py new file mode 100644 index 0000000..3a507cd
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'N j, Y' 6 TIME_FORMAT = 'P' 7 DATETIME_FORMAT = 'N j, Y, P' 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'F j' 10 SHORT_DATE_FORMAT = 'm/d/Y' 11 SHORT_DATETIME_FORMAT = 'm/d/Y P' 12 FIRST_DAY_OF_WEEK = 0 # Sunday 13 DATE_INPUT_FORMATS = ( 14 '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' 15 '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' 16 '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' 17 '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' 18 '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' 19 ) 20 TIME_INPUT_FORMATS = ( 21 '%H:%M:%S', # '14:30:59' 22 '%H:%M', # '14:30' 23 ) 24 DATETIME_INPUT_FORMATS = ( 25 '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' 26 '%Y-%m-%d %H:%M', # '2006-10-25 14:30' 27 '%Y-%m-%d', # '2006-10-25' 28 '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' 29 '%m/%d/%Y %H:%M', # '10/25/2006 14:30' 30 '%m/%d/%Y', # '10/25/2006' 31 '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' 32 '%m/%d/%y %H:%M', # '10/25/06 14:30' 33 '%m/%d/%y', # '10/25/06' 34 ) 35 DECIMAL_SEPARATOR = '.' 36 THOUSAND_SEPARATOR = ',' 37 NUMBER_GROUPING = 3 38 -
new file django/conf/locale/es/formats.py
diff --git a/django/conf/locale/es/__init__.py b/django/conf/locale/es/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/es/formats.py b/django/conf/locale/es/formats.py new file mode 100644 index 0000000..349810f
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j \de F \de Y' 6 TIME_FORMAT = 'H:i:s' 7 DATETIME_FORMAT = 'j \de F \de Y \a \l\a\s H:i' 8 YEAR_MONTH_FORMAT = 'F \de Y' 9 MONTH_DAY_FORMAT = 'j \de F' 10 SHORT_DATE_FORMAT = 'd/m/Y' 11 SHORT_DATETIME_FORMAT = 'd/m/Y H:i' 12 FIRST_DAY_OF_WEEK = 1 # Monday 13 DATE_INPUT_FORMATS = ( 14 # '31/12/2009', '31/12/09' 15 '%d/%m/%Y', '%d/%m/%y' 16 ) 17 TIME_INPUT_FORMATS = ( 18 # '14:30:59', '14:30' 19 '%H:%M:%S', '%H:%M' 20 ) 21 DATETIME_INPUT_FORMATS = ( 22 '%d/%m/%Y %H:%M:%S', 23 '%d/%m/%Y %H:%M', 24 '%d/%m/%y %H:%M:%S', 25 '%d/%m/%y %H:%M', 26 ) 27 DECIMAL_SEPARATOR = ',' 28 THOUSAND_SEPARATOR = '.' 29 NUMBER_GROUPING = 3 30 -
new file django/conf/locale/es_AR/formats.py
diff --git a/django/conf/locale/es_AR/__init__.py b/django/conf/locale/es_AR/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/es_AR/formats.py b/django/conf/locale/es_AR/formats.py new file mode 100644 index 0000000..6d71786
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 # DATE_FORMAT = 6 # TIME_FORMAT = 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 # MONTH_DAY_FORMAT = 10 # SHORT_DATE_FORMAT = 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 # DECIMAL_SEPARATOR = 17 # THOUSAND_SEPARATOR = 18 # NUMBER_GROUPING = -
new file django/conf/locale/et/formats.py
diff --git a/django/conf/locale/et/__init__.py b/django/conf/locale/et/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/et/formats.py b/django/conf/locale/et/formats.py new file mode 100644 index 0000000..b96420c
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F Y' 6 TIME_FORMAT = 'G:i:s' 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'd.m.Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = ' ' 18 # NUMBER_GROUPING = -
new file django/conf/locale/eu/formats.py
diff --git a/django/conf/locale/eu/__init__.py b/django/conf/locale/eu/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/eu/formats.py b/django/conf/locale/eu/formats.py new file mode 100644 index 0000000..475f924
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'Yeko M\re\n d\a' 6 TIME_FORMAT = 'H:i:s' 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 # MONTH_DAY_FORMAT = 10 SHORT_DATE_FORMAT = 'Y M j' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = '.' 18 # NUMBER_GROUPING = -
new file django/conf/locale/fa/formats.py
diff --git a/django/conf/locale/fa/__init__.py b/django/conf/locale/fa/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/fa/formats.py b/django/conf/locale/fa/formats.py new file mode 100644 index 0000000..dc11281
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F Y' 6 TIME_FORMAT = 'G:i:s' 7 DATETIME_FORMAT = 'j F Y، ساعت G:i:s' 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'Y/n/j' 11 SHORT_DATETIME_FORMAT = 'Y/n/j، G:i:s' 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = '.' 18 # NUMBER_GROUPING = -
new file django/conf/locale/fi/formats.py
diff --git a/django/conf/locale/fi/__init__.py b/django/conf/locale/fi/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/fi/formats.py b/django/conf/locale/fi/formats.py new file mode 100644 index 0000000..670e268
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j. F Y' 6 TIME_FORMAT = 'G.i.s' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j. F' 10 SHORT_DATE_FORMAT = 'j.n.Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = ' ' 18 # NUMBER_GROUPING = -
new file django/conf/locale/fr/formats.py
diff --git a/django/conf/locale/fr/__init__.py b/django/conf/locale/fr/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/fr/formats.py b/django/conf/locale/fr/formats.py new file mode 100644 index 0000000..1d670d7
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F Y' 6 TIME_FORMAT = 'H:i:s' 7 DATETIME_FORMAT = 'j F Y H:i:s' 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'j M Y' 11 SHORT_DATETIME_FORMAT = 'j M Y H:i:s' 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = ' ' 18 # NUMBER_GROUPING = -
new file django/conf/locale/ga/formats.py
diff --git a/django/conf/locale/ga/__init__.py b/django/conf/locale/ga/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/ga/formats.py b/django/conf/locale/ga/formats.py new file mode 100644 index 0000000..f177bb2
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F Y' 6 TIME_FORMAT = 'H:i:s' 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'j M Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = '.' 17 THOUSAND_SEPARATOR = ',' 18 # NUMBER_GROUPING = -
new file django/conf/locale/gl/formats.py
diff --git a/django/conf/locale/gl/__init__.py b/django/conf/locale/gl/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/gl/formats.py b/django/conf/locale/gl/formats.py new file mode 100644 index 0000000..e0a95d5
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'd F Y' 6 TIME_FORMAT = 'H:i:s' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'j M, Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = '.' 18 # NUMBER_GROUPING = -
new file django/conf/locale/he/formats.py
diff --git a/django/conf/locale/he/__init__.py b/django/conf/locale/he/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/he/formats.py b/django/conf/locale/he/formats.py new file mode 100644 index 0000000..8d7c7f2
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j בF Y' 6 TIME_FORMAT = 'H:i:s' 7 DATETIME_FORMAT = 'j בF Y H:i:s' 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j בF' 10 SHORT_DATE_FORMAT = 'd/m/Y' 11 SHORT_DATETIME_FORMAT = 'd/m/Y H:i:s' 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = '.' 17 THOUSAND_SEPARATOR = ',' 18 # NUMBER_GROUPING = -
new file django/conf/locale/hi/formats.py
diff --git a/django/conf/locale/hi/__init__.py b/django/conf/locale/hi/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/hi/formats.py b/django/conf/locale/hi/formats.py new file mode 100644 index 0000000..6afa258
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F Y' 6 TIME_FORMAT = 'g:i:s A' 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'd-m-Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = '.' 17 THOUSAND_SEPARATOR = ',' 18 # NUMBER_GROUPING = -
new file django/conf/locale/hr/formats.py
diff --git a/django/conf/locale/hr/__init__.py b/django/conf/locale/hr/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/hr/formats.py b/django/conf/locale/hr/formats.py new file mode 100644 index 0000000..62d1a7e
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j. F Y.' 6 TIME_FORMAT = 'H:i:s' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'F Y.' 9 MONTH_DAY_FORMAT = 'j. F' 10 SHORT_DATE_FORMAT = 'j.n.Y.' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = '.' 18 # NUMBER_GROUPING = -
new file django/conf/locale/hu/formats.py
diff --git a/django/conf/locale/hu/__init__.py b/django/conf/locale/hu/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/hu/formats.py b/django/conf/locale/hu/formats.py new file mode 100644 index 0000000..6ee2db0
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'Y. F j.' 6 TIME_FORMAT = 'G:i:s' 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 MONTH_DAY_FORMAT = 'F j.' 10 SHORT_DATE_FORMAT = 'Y.m.d.' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = ' ' 18 # NUMBER_GROUPING = -
new file django/conf/locale/is/formats.py
diff --git a/django/conf/locale/is/__init__.py b/django/conf/locale/is/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/is/formats.py b/django/conf/locale/is/formats.py new file mode 100644 index 0000000..b6377db
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j. F Y' 6 TIME_FORMAT = 'H:i:s' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j. F' 10 SHORT_DATE_FORMAT = 'j.n.Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = '.' 18 # NUMBER_GROUPING = -
new file django/conf/locale/it/formats.py
diff --git a/django/conf/locale/it/__init__.py b/django/conf/locale/it/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/it/formats.py b/django/conf/locale/it/formats.py new file mode 100644 index 0000000..fe86b5b
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'd F Y' 6 TIME_FORMAT = 'H.i.s' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'd/M/Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = '.' 18 # NUMBER_GROUPING = -
new file django/conf/locale/ja/formats.py
diff --git a/django/conf/locale/ja/__init__.py b/django/conf/locale/ja/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/ja/formats.py b/django/conf/locale/ja/formats.py new file mode 100644 index 0000000..853056d
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'Y年n月j日' 6 TIME_FORMAT = 'G:i:s' 7 DATETIME_FORMAT = 'Y年n月j日G:i:s' 8 YEAR_MONTH_FORMAT = 'Y年n月' 9 MONTH_DAY_FORMAT = 'n月j日' 10 SHORT_DATE_FORMAT = 'Y/m/d' 11 SHORT_DATETIME_FORMAT = 'Y/m/d G:i:s' 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = '.' 17 THOUSAND_SEPARATOR = ',' 18 # NUMBER_GROUPING = -
new file django/conf/locale/ka/formats.py
diff --git a/django/conf/locale/ka/__init__.py b/django/conf/locale/ka/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/ka/formats.py b/django/conf/locale/ka/formats.py new file mode 100644 index 0000000..665a73f
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'l, j F, Y' 6 TIME_FORMAT = 'h:i:s a' 7 DATETIME_FORMAT = 'j F, Y h:i:s a' 8 YEAR_MONTH_FORMAT = 'F, Y' 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'j.M.Y' 11 SHORT_DATETIME_FORMAT = 'j.M.Y H:i:s' 12 FIRST_DAY_OF_WEEK = 1 # (Monday) 13 DATE_INPUT_FORMATS = ( 14 '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' 15 '%d %b %Y', '%d %b, %Y', '%d %b. %Y', # '25 Oct 2006', '25 Oct, 2006', '25 Oct. 2006' 16 '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' 17 '%d.%m.%Y', '%d.%m.%y', # '25.10.2006', '25.10.06' 18 ) 19 TIME_INPUT_FORMATS = ( 20 '%H:%M:%S', # '14:30:59' 21 '%H:%M', # '14:30' 22 ) 23 DATETIME_INPUT_FORMATS = ( 24 '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' 25 '%Y-%m-%d %H:%M', # '2006-10-25 14:30' 26 '%Y-%m-%d', # '2006-10-25' 27 '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' 28 '%d.%m.%Y %H:%M', # '25.10.2006 14:30' 29 '%d.%m.%Y', # '25.10.2006' 30 '%d.%m.%y %H:%M:%S', # '25.10.06 14:30:59' 31 '%d.%m.%y %H:%M', # '25.10.06 14:30' 32 '%d.%m.%y', # '25.10.06' 33 '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' 34 '%m/%d/%Y %H:%M', # '10/25/2006 14:30' 35 '%m/%d/%Y', # '10/25/2006' 36 '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' 37 '%m/%d/%y %H:%M', # '10/25/06 14:30' 38 '%m/%d/%y', # '10/25/06' 39 ) 40 DECIMAL_SEPARATOR = '.' 41 THOUSAND_SEPARATOR = " " 42 NUMBER_GROUPING = 3 -
new file django/conf/locale/km/formats.py
diff --git a/django/conf/locale/km/__init__.py b/django/conf/locale/km/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/km/formats.py b/django/conf/locale/km/formats.py new file mode 100644 index 0000000..3736d57
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j ខែ F ឆ្នាំ Y' 6 TIME_FORMAT = 'G:i:s' 7 DATETIME_FORMAT = 'j ខែ F ឆ្នាំ Y, G:i:s' 8 # YEAR_MONTH_FORMAT = 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'j M Y' 11 SHORT_DATETIME_FORMAT = 'j M Y, G:i:s' 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = '.' 18 # NUMBER_GROUPING = -
new file django/conf/locale/kn/formats.py
diff --git a/django/conf/locale/kn/__init__.py b/django/conf/locale/kn/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/kn/formats.py b/django/conf/locale/kn/formats.py new file mode 100644 index 0000000..fa7a7b9
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F Y' 6 TIME_FORMAT = 'h:i:s A' 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'j M Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 # DECIMAL_SEPARATOR = 17 # THOUSAND_SEPARATOR = 18 # NUMBER_GROUPING = -
new file django/conf/locale/ko/formats.py
diff --git a/django/conf/locale/ko/__init__.py b/django/conf/locale/ko/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/ko/formats.py b/django/conf/locale/ko/formats.py new file mode 100644 index 0000000..619047d
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'Y년 n월 j일' 6 TIME_FORMAT = 'A g:i:s' 7 DATETIME_FORMAT = 'Y년 n월 j일 g:i:s A' 8 YEAR_MONTH_FORMAT = 'Y년 F월' 9 MONTH_DAY_FORMAT = 'F월 j일' 10 SHORT_DATE_FORMAT = 'Y-n-j.' 11 SHORT_DATETIME_FORMAT = 'Y-n-j H:i' 12 # FIRST_DAY_OF_WEEK = 13 DATE_INPUT_FORMATS = ( 14 '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' 15 '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' 16 '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' 17 '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' 18 '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' 19 '%Y년 %m월 %d일', # '2006년 10월 25일', with localized suffix. 20 ) 21 TIME_INPUT_FORMATS = ( 22 '%H:%M:%S', # '14:30:59' 23 '%H:%M', # '14:30' 24 '%H시 %M분 %S초', # '14시 30분 59초' 25 '%H시 %M분', # '14시 30분' 26 ) 27 DATETIME_INPUT_FORMATS = ( 28 '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' 29 '%Y-%m-%d %H:%M', # '2006-10-25 14:30' 30 '%Y-%m-%d', # '2006-10-25' 31 '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' 32 '%m/%d/%Y %H:%M', # '10/25/2006 14:30' 33 '%m/%d/%Y', # '10/25/2006' 34 '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' 35 '%m/%d/%y %H:%M', # '10/25/06 14:30' 36 '%m/%d/%y', # '10/25/06' 37 38 '%Y년 %m월 %d일 %H시 %M분 %S초', # '2006년 10월 25일 14시 30분 59초' 39 '%Y년 %m월 %d일 %H시 %M분', # '2006년 10월 25일 14시 30분' 40 ) 41 42 DECIMAL_SEPARATOR = '.' 43 THOUSAND_SEPARATOR = ',' 44 NUMBER_GROUPING = 3 -
new file django/conf/locale/lt/formats.py
diff --git a/django/conf/locale/lt/__init__.py b/django/conf/locale/lt/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/lt/formats.py b/django/conf/locale/lt/formats.py new file mode 100644 index 0000000..d9fb0c8
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'Y \m. F j \d.' 6 TIME_FORMAT = 'H:i:s' 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 # MONTH_DAY_FORMAT = 10 SHORT_DATE_FORMAT = 'Y.m.d' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = '.' 18 # NUMBER_GROUPING = -
new file django/conf/locale/lv/formats.py
diff --git a/django/conf/locale/lv/__init__.py b/django/conf/locale/lv/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/lv/formats.py b/django/conf/locale/lv/formats.py new file mode 100644 index 0000000..5dc211c
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'Y. \g\a\d\a j. F' 6 TIME_FORMAT = 'H:i:s' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'Y. \g. F' 9 MONTH_DAY_FORMAT = 'j. F' 10 SHORT_DATE_FORMAT = 'Y. \g\a\d\a j. M' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = ' ' 18 # NUMBER_GROUPING = -
new file django/conf/locale/mk/formats.py
diff --git a/django/conf/locale/mk/__init__.py b/django/conf/locale/mk/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/mk/formats.py b/django/conf/locale/mk/formats.py new file mode 100644 index 0000000..746ac0e
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'd F Y' 6 TIME_FORMAT = 'H:i:s' 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 # MONTH_DAY_FORMAT = 10 SHORT_DATE_FORMAT = 'd.n.Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = '.' 18 # NUMBER_GROUPING = -
new file django/conf/locale/nl/formats.py
diff --git a/django/conf/locale/nl/__init__.py b/django/conf/locale/nl/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/nl/formats.py b/django/conf/locale/nl/formats.py new file mode 100644 index 0000000..dcef8c1
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F Y' # '20 januari 2009' 6 TIME_FORMAT = 'H:i' # '15:23' 7 DATETIME_FORMAT = 'j F Y H:i' # '20 januari 2009 15:23' 8 YEAR_MONTH_FORMAT = 'F Y' # 'januari 2009' 9 MONTH_DAY_FORMAT = 'j F' # '20 januari' 10 SHORT_DATE_FORMAT = 'j-n-Y' # '20-1-2009' 11 SHORT_DATETIME_FORMAT = 'j-n-Y H:i' # '20-1-2009 15:23' 12 FIRST_DAY_OF_WEEK = 1 # Monday (in Dutch 'maandag') 13 DATE_INPUT_FORMATS = ( 14 '%d-%m-%Y', '%d-%m-%y', '%Y-%m-%d', # '20-01-2009', '20-01-09', '2009-01-20' 15 '%d %b %Y', '%d %b %y', # '20 jan 2009', '20 jan 09' 16 '%d %B %Y', '%d %B %y', # '20 januari 2009', '20 januari 09' 17 ) 18 TIME_INPUT_FORMATS = ( 19 '%H:%M:%S', # '15:23:35' 20 '%H.%M:%S', # '15.23:35' 21 '%H.%M', # '15.23' 22 '%H:%M', # '15:23' 23 ) 24 DATETIME_INPUT_FORMATS = ( 25 # With time in %H:%M:%S : 26 '%d-%m-%Y %H:%M:%S', '%d-%m-%y %H:%M:%S', '%Y-%m-%d %H:%M:%S', # '20-01-2009 15:23:35', '20-01-09 15:23:35', '2009-01-20 15:23:35' 27 '%d %b %Y %H:%M:%S', '%d %b %y %H:%M:%S', # '20 jan 2009 15:23:35', '20 jan 09 15:23:35' 28 '%d %B %Y %H:%M:%S', '%d %B %y %H:%M:%S', # '20 januari 2009 15:23:35', '20 januari 2009 15:23:35' 29 # With time in %H.%M:%S : 30 '%d-%m-%Y %H.%M:%S', '%d-%m-%y %H.%M:%S', # '20-01-2009 15.23:35', '20-01-09 15.23:35' 31 '%d %b %Y %H.%M:%S', '%d %b %y %H.%M:%S', # '20 jan 2009 15.23:35', '20 jan 09 15.23:35' 32 '%d %B %Y %H.%M:%S', '%d %B %y %H.%M:%S', # '20 januari 2009 15.23:35', '20 januari 2009 15.23:35' 33 # With time in %H:%M : 34 '%d-%m-%Y %H:%M', '%d-%m-%y %H:%M', '%Y-%m-%d %H:%M', # '20-01-2009 15:23', '20-01-09 15:23', '2009-01-20 15:23' 35 '%d %b %Y %H:%M', '%d %b %y %H:%M', # '20 jan 2009 15:23', '20 jan 09 15:23' 36 '%d %B %Y %H:%M', '%d %B %y %H:%M', # '20 januari 2009 15:23', '20 januari 2009 15:23' 37 # With time in %H.%M : 38 '%d-%m-%Y %H.%M', '%d-%m-%y %H.%M', # '20-01-2009 15.23', '20-01-09 15.23' 39 '%d %b %Y %H.%M', '%d %b %y %H.%M', # '20 jan 2009 15.23', '20 jan 09 15.23' 40 '%d %B %Y %H.%M', '%d %B %y %H.%M', # '20 januari 2009 15.23', '20 januari 2009 15.23' 41 # Without time : 42 '%d-%m-%Y', '%d-%m-%y', '%Y-%m-%d', # '20-01-2009', '20-01-09', '2009-01-20' 43 '%d %b %Y', '%d %b %y', # '20 jan 2009', '20 jan 09' 44 '%d %B %Y', '%d %B %y', # '20 januari 2009', '20 januari 2009' 45 ) 46 DECIMAL_SEPARATOR = ',' 47 THOUSAND_SEPARATOR = '.' 48 NUMBER_GROUPING = 3 -
new file django/conf/locale/no/formats.py
diff --git a/django/conf/locale/no/__init__.py b/django/conf/locale/no/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/no/formats.py b/django/conf/locale/no/formats.py new file mode 100644 index 0000000..62ee886
- + 1 DATE_FORMAT = 'j. F Y' 2 TIME_FORMAT = 'H:i' 3 DATETIME_FORMAT = 'j. F Y H:i' 4 YEAR_MONTH_FORMAT = 'F Y' 5 MONTH_DAY_FORMAT = 'j. F' 6 SHORT_DATE_FORMAT = 'd.m.Y' 7 SHORT_DATETIME_FORMAT = 'd.m.Y H:i' 8 FIRST_DAY_OF_WEEK = 1 # Monday 9 DATE_INPUT_FORMATS = ( 10 '%Y-%m-%d', '%j.%m.%Y', '%j.%m.%y', # '2006-10-25', '25.10.2006', '25.10.06' 11 '%Y-%m-%j', # '2006-10-25', 12 '%j. %b %Y', '%j %b %Y', # '25. okt 2006', '25 okt 2006' 13 '%j. %b. %Y', '%j %b. %Y', # '25. okt. 2006', '25 okt. 2006' 14 '%j. %B %Y', '%j %B %Y', # '25. oktober 2006', '25 oktober 2006' 15 ) 16 TIME_INPUT_FORMATS = ( 17 '%H:%i:%S', # '14:30:59' 18 '%H:%i', # '14:30' 19 ) 20 DATETIME_INPUT_FORMATS = ( 21 '%Y-%m-%d %H:%i:%S', # '2006-10-25 14:30:59' 22 '%Y-%m-%d %H:%i', # '2006-10-25 14:30' 23 '%Y-%m-%d', # '2006-10-25' 24 '%Y-%m-%j', # '2006-10-25' 25 '%j.%m.%Y %H:%i:%S', # '25.10.2006 14:30:59' 26 '%j.%m.%Y %H:%i', # '25.10.2006 14:30' 27 '%j.%m.%Y', # '25.10.2006' 28 '%j.%m.%y %H:%i:%S', # '25.10.06 14:30:59' 29 '%j.%m.%y %H:%i', # '25.10.06 14:30' 30 '%j.%m.%y', # '25.10.06' 31 ) 32 DECIMAL_SEPARATOR = ',' 33 THOUSAND_SEPARATOR = ' ' 34 NUMBER_GROUPING = 3 -
new file django/conf/locale/pl/formats.py
diff --git a/django/conf/locale/pl/__init__.py b/django/conf/locale/pl/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/pl/formats.py b/django/conf/locale/pl/formats.py new file mode 100644 index 0000000..860a4a8
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F Y' 6 TIME_FORMAT = 'H:i:s' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'd-m-Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = ' ' 18 # NUMBER_GROUPING = -
new file django/conf/locale/pt/formats.py
diff --git a/django/conf/locale/pt/__init__.py b/django/conf/locale/pt/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/pt/formats.py b/django/conf/locale/pt/formats.py new file mode 100644 index 0000000..053a48a
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j \de F \de Y' 6 TIME_FORMAT = 'H:i:s' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'F \de Y' 9 MONTH_DAY_FORMAT = 'j \de F' 10 SHORT_DATE_FORMAT = 'd/m/Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = '.' 18 # NUMBER_GROUPING = -
new file django/conf/locale/pt_BR/formats.py
diff --git a/django/conf/locale/pt_BR/__init__.py b/django/conf/locale/pt_BR/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/pt_BR/formats.py b/django/conf/locale/pt_BR/formats.py new file mode 100644 index 0000000..f30d5c4
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j \\de N \\de Y' 6 TIME_FORMAT = 'H:i' 7 DATETIME_FORMAT = 'j \\de N \\de Y à\\s H:i' 8 YEAR_MONTH_FORMAT = 'F \\de Y' 9 MONTH_DAY_FORMAT = 'j \\de F' 10 SHORT_DATE_FORMAT = 'd/m/Y' 11 SHORT_DATETIME_FORMAT = 'd/m/Y H:i' 12 FIRST_DAY_OF_WEEK = 0 # Sunday 13 DATE_INPUT_FORMATS = ( 14 '%Y-%m-%d', '%d/%m/%Y', '%d/%m/%y', # '2006-10-25', '25/10/2006', '25/10/06' 15 '%d de %b de %Y', '%d de %b, %Y', # '25 de Out de 2006', '25 Out, 2006' 16 '%d de %B de %Y', '%d de %B, %Y', # '25 de Outubro de 2006', '25 de Outubro, 2006' 17 ) 18 TIME_INPUT_FORMATS = ( 19 '%H:%M:%S', # '14:30:59' 20 '%H:%M', # '14:30' 21 ) 22 DATETIME_INPUT_FORMATS = ( 23 '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' 24 '%Y-%m-%d %H:%M', # '2006-10-25 14:30' 25 '%Y-%m-%d', # '2006-10-25' 26 '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59' 27 '%d/%m/%Y %H:%M', # '25/10/2006 14:30' 28 '%d/%m/%Y', # '25/10/2006' 29 '%d/%m/%y %H:%M:%S', # '25/10/06 14:30:59' 30 '%d/%m/%y %H:%M', # '25/10/06 14:30' 31 '%d/%m/%y', # '25/10/06' 32 ) 33 DECIMAL_SEPARATOR = ',' 34 THOUSAND_SEPARATOR = '.' 35 NUMBER_GROUPING = 3 -
new file django/conf/locale/ro/formats.py
diff --git a/django/conf/locale/ro/__init__.py b/django/conf/locale/ro/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/ro/formats.py b/django/conf/locale/ro/formats.py new file mode 100644 index 0000000..6d6e800
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F Y' 6 TIME_FORMAT = 'H:i:s' 7 DATETIME_FORMAT = 'j F Y, H:i:s' 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'd.m.Y' 11 SHORT_DATETIME_FORMAT = 'd.m.Y, H:i:s' 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = '.' 18 # NUMBER_GROUPING = -
new file django/conf/locale/ru/formats.py
diff --git a/django/conf/locale/ru/__init__.py b/django/conf/locale/ru/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/ru/formats.py b/django/conf/locale/ru/formats.py new file mode 100644 index 0000000..9a9ee96
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F Y г.' 6 TIME_FORMAT = 'G:i:s' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'd.m.Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = ' ' 18 # NUMBER_GROUPING = -
new file django/conf/locale/sk/formats.py
diff --git a/django/conf/locale/sk/__init__.py b/django/conf/locale/sk/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/sk/formats.py b/django/conf/locale/sk/formats.py new file mode 100644 index 0000000..1bc3549
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j. F Y' 6 TIME_FORMAT = 'G:i:s' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j. F' 10 SHORT_DATE_FORMAT = 'j.n.Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = ' ' 18 # NUMBER_GROUPING = -
new file django/conf/locale/sl/formats.py
diff --git a/django/conf/locale/sl/__init__.py b/django/conf/locale/sl/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/sl/formats.py b/django/conf/locale/sl/formats.py new file mode 100644 index 0000000..4007f10
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'd. F Y' 6 TIME_FORMAT = 'H:i:s' 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 MONTH_DAY_FORMAT = 'j. F' 10 SHORT_DATE_FORMAT = 'j. M. Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = '.' 18 # NUMBER_GROUPING = -
new file django/conf/locale/sr/formats.py
diff --git a/django/conf/locale/sr/__init__.py b/django/conf/locale/sr/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/sr/formats.py b/django/conf/locale/sr/formats.py new file mode 100644 index 0000000..b1aaa77
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'd. F Y.' 6 TIME_FORMAT = 'H.i.s' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'Y F' 9 MONTH_DAY_FORMAT = 'F j.' 10 SHORT_DATE_FORMAT = 'd.m.Y.' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = '.' 17 THOUSAND_SEPARATOR = ',' 18 # NUMBER_GROUPING = -
new file django/conf/locale/sr_Latn/formats.py
diff --git a/django/conf/locale/sr_Latn/__init__.py b/django/conf/locale/sr_Latn/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/sr_Latn/formats.py b/django/conf/locale/sr_Latn/formats.py new file mode 100644 index 0000000..6d71786
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 # DATE_FORMAT = 6 # TIME_FORMAT = 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 # MONTH_DAY_FORMAT = 10 # SHORT_DATE_FORMAT = 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 # DECIMAL_SEPARATOR = 17 # THOUSAND_SEPARATOR = 18 # NUMBER_GROUPING = -
new file django/conf/locale/sv/formats.py
diff --git a/django/conf/locale/sv/__init__.py b/django/conf/locale/sv/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/sv/formats.py b/django/conf/locale/sv/formats.py new file mode 100644 index 0000000..df4e633
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F Y' 6 TIME_FORMAT = 'H.i.s' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'Y F' 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'j M Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = ' ' 18 # NUMBER_GROUPING = -
new file django/conf/locale/ta/formats.py
diff --git a/django/conf/locale/ta/__init__.py b/django/conf/locale/ta/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/ta/formats.py b/django/conf/locale/ta/formats.py new file mode 100644 index 0000000..69fa17d
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F, Y' 6 TIME_FORMAT = 'g:i:s A' 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'j M, Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 # DECIMAL_SEPARATOR = 17 # THOUSAND_SEPARATOR = 18 # NUMBER_GROUPING = -
new file django/conf/locale/te/formats.py
diff --git a/django/conf/locale/te/__init__.py b/django/conf/locale/te/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/te/formats.py b/django/conf/locale/te/formats.py new file mode 100644 index 0000000..e805872
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F Y' 6 TIME_FORMAT = 'g:i:s A' 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'j M Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 # DECIMAL_SEPARATOR = 17 # THOUSAND_SEPARATOR = 18 # NUMBER_GROUPING = -
new file django/conf/locale/th/formats.py
diff --git a/django/conf/locale/th/__init__.py b/django/conf/locale/th/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/th/formats.py b/django/conf/locale/th/formats.py new file mode 100644 index 0000000..7091dc6
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F Y' 6 TIME_FORMAT = 'G:i:s' 7 DATETIME_FORMAT = 'j F Y, G:i:s' 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'j M Y' 11 SHORT_DATETIME_FORMAT = 'j M Y, G:i:s' 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = '.' 17 THOUSAND_SEPARATOR = ',' 18 # NUMBER_GROUPING = -
new file django/conf/locale/tr/formats.py
diff --git a/django/conf/locale/tr/__init__.py b/django/conf/locale/tr/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/tr/formats.py b/django/conf/locale/tr/formats.py new file mode 100644 index 0000000..b978788
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'd F Y' 6 TIME_FORMAT = 'H:i:s' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'd F' 10 SHORT_DATE_FORMAT = 'd M Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = '.' 18 # NUMBER_GROUPING = -
new file django/conf/locale/uk/formats.py
diff --git a/django/conf/locale/uk/__init__.py b/django/conf/locale/uk/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/uk/formats.py b/django/conf/locale/uk/formats.py new file mode 100644 index 0000000..8e41bf0
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 DATE_FORMAT = 'j F Y р.' 6 TIME_FORMAT = 'H:i:s' 7 # DATETIME_FORMAT = 8 YEAR_MONTH_FORMAT = 'F Y' 9 MONTH_DAY_FORMAT = 'j F' 10 SHORT_DATE_FORMAT = 'j M Y' 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 DECIMAL_SEPARATOR = ',' 17 THOUSAND_SEPARATOR = ' ' 18 # NUMBER_GROUPING = -
new file django/conf/locale/zh_CN/formats.py
diff --git a/django/conf/locale/zh_CN/__init__.py b/django/conf/locale/zh_CN/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/zh_CN/formats.py b/django/conf/locale/zh_CN/formats.py new file mode 100644 index 0000000..6d71786
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 # DATE_FORMAT = 6 # TIME_FORMAT = 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 # MONTH_DAY_FORMAT = 10 # SHORT_DATE_FORMAT = 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 # DECIMAL_SEPARATOR = 17 # THOUSAND_SEPARATOR = 18 # NUMBER_GROUPING = -
new file django/conf/locale/zh_TW/formats.py
diff --git a/django/conf/locale/zh_TW/__init__.py b/django/conf/locale/zh_TW/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/conf/locale/zh_TW/formats.py b/django/conf/locale/zh_TW/formats.py new file mode 100644 index 0000000..6d71786
- + 1 # -*- encoding: utf-8 -*- 2 # This file is distributed under the same license as the Django package. 3 # 4 5 # DATE_FORMAT = 6 # TIME_FORMAT = 7 # DATETIME_FORMAT = 8 # YEAR_MONTH_FORMAT = 9 # MONTH_DAY_FORMAT = 10 # SHORT_DATE_FORMAT = 11 # SHORT_DATETIME_FORMAT = 12 # FIRST_DAY_OF_WEEK = 13 # DATE_INPUT_FORMATS = 14 # TIME_INPUT_FORMATS = 15 # DATETIME_INPUT_FORMATS = 16 # DECIMAL_SEPARATOR = 17 # THOUSAND_SEPARATOR = 18 # NUMBER_GROUPING = -
django/contrib/admin/media/js/calendar.js
diff --git a/django/contrib/admin/media/js/calendar.js b/django/contrib/admin/media/js/calendar.js index 9035176..3f57145 100644
a b function quickElement() { 25 25 var CalendarNamespace = { 26 26 monthsOfYear: gettext('January February March April May June July August September October November December').split(' '), 27 27 daysOfWeek: gettext('S M T W T F S').split(' '), 28 firstDayOfWeek: parseInt(gettext('FIRST_DAY_OF_WEEK')), 28 29 isLeapYear: function(year) { 29 30 return (((year % 4)==0) && ((year % 100)!=0) || ((year % 400)==0)); 30 31 }, … … var CalendarNamespace = { 56 57 // Draw days-of-week header 57 58 var tableRow = quickElement('tr', tableBody); 58 59 for (var i = 0; i < 7; i++) { 59 quickElement('th', tableRow, CalendarNamespace.daysOfWeek[ i]);60 quickElement('th', tableRow, CalendarNamespace.daysOfWeek[(i + CalendarNamespace.firstDayOfWeek) % 7]); 60 61 } 61 62 62 var startingPos = new Date(year, month-1, 1 ).getDay();63 var startingPos = new Date(year, month-1, 1 - CalendarNamespace.firstDayOfWeek).getDay(); 63 64 var days = CalendarNamespace.getDaysInMonth(month, year); 64 65 65 66 // Draw blanks before first of month -
django/contrib/admin/templates/admin/object_history.html
diff --git a/django/contrib/admin/templates/admin/object_history.html b/django/contrib/admin/templates/admin/object_history.html index 38b1c34..9e6223a 100644
a b 27 27 <tbody> 28 28 {% for action in action_list %} 29 29 <tr> 30 <th scope="row">{{ action.action_time|date :_("DATETIME_FORMAT")}}</th>30 <th scope="row">{{ action.action_time|date }}</th> 31 31 <td>{{ action.user.username }}{% if action.user.get_full_name %} ({{ action.user.get_full_name }}){% endif %}</td> 32 32 <td>{{ action.change_message }}</td> 33 33 </tr> -
django/contrib/admin/templatetags/admin_list.py
diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py index 5a02ab0..cd05957 100644
a b from django.contrib.admin.views.main import ALL_VAR, EMPTY_CHANGELIST_VALUE 3 3 from django.contrib.admin.views.main import ORDER_VAR, ORDER_TYPE_VAR, PAGE_VAR, SEARCH_VAR 4 4 from django.core.exceptions import ObjectDoesNotExist 5 5 from django.db import models 6 from django.utils import dateformat6 from django.utils import formats 7 7 from django.utils.html import escape, conditional_escape 8 8 from django.utils.text import capfirst 9 9 from django.utils.safestring import mark_safe 10 from django.utils.translation import get_date_formats, get_partial_date_formats,ugettext as _10 from django.utils.translation import ugettext as _ 11 11 from django.utils.encoding import smart_unicode, smart_str, force_unicode 12 12 from django.template import Library 13 13 import datetime … … def items_for_result(cl, result, form): 189 189 # Dates and times are special: They're formatted in a certain way. 190 190 elif isinstance(f, models.DateField) or isinstance(f, models.TimeField): 191 191 if field_val: 192 (date_format, datetime_format, time_format) = get_date_formats() 193 if isinstance(f, models.DateTimeField): 194 result_repr = capfirst(dateformat.format(field_val, datetime_format)) 195 elif isinstance(f, models.TimeField): 196 result_repr = capfirst(dateformat.time_format(field_val, time_format)) 197 else: 198 result_repr = capfirst(dateformat.format(field_val, date_format)) 192 result_repr = formats.localize(field_val) 193 else: 194 result_repr = EMPTY_CHANGELIST_VALUE 195 elif isinstance(f, models.DecimalField): 196 if field_val: 197 result_repr = formats.number_format(field_val, f.decimal_places) 198 else: 199 result_repr = EMPTY_CHANGELIST_VALUE 200 row_class = ' class="nowrap"' 201 elif isinstance(f, models.FloatField): 202 if field_val: 203 result_repr = formats.number_format(field_val) 199 204 else: 200 205 result_repr = EMPTY_CHANGELIST_VALUE 201 206 row_class = ' class="nowrap"' 202 207 # Booleans are special: We use images. 203 208 elif isinstance(f, models.BooleanField) or isinstance(f, models.NullBooleanField): 204 209 result_repr = _boolean_icon(field_val) 205 # DecimalFields are special: Zero-pad the decimals.206 elif isinstance(f, models.DecimalField):207 if field_val is not None:208 result_repr = ('%%.%sf' % f.decimal_places) % field_val209 else:210 result_repr = EMPTY_CHANGELIST_VALUE211 210 # Fields with choices are special: Use the representation 212 211 # of the choice. 213 212 elif f.flatchoices: … … def date_hierarchy(cl): 268 267 year_lookup = cl.params.get(year_field) 269 268 month_lookup = cl.params.get(month_field) 270 269 day_lookup = cl.params.get(day_field) 271 year_month_format, month_day_format = get_partial_date_formats()272 270 273 271 link = lambda d: cl.get_query_string(d, [field_generic]) 274 272 … … def date_hierarchy(cl): 278 276 'show': True, 279 277 'back': { 280 278 'link': link({year_field: year_lookup, month_field: month_lookup}), 281 'title': dateformat.format(day, year_month_format)279 'title': capfirst(formats.date_format(day, 'YEAR_MONTH_FORMAT')) 282 280 }, 283 'choices': [{'title': dateformat.format(day, month_day_format)}]281 'choices': [{'title': capfirst(formats.date_format(day, 'MONTH_DAY_FORMAT'))}] 284 282 } 285 283 elif year_lookup and month_lookup: 286 284 days = cl.query_set.filter(**{year_field: year_lookup, month_field: month_lookup}).dates(field_name, 'day') … … def date_hierarchy(cl): 292 290 }, 293 291 'choices': [{ 294 292 'link': link({year_field: year_lookup, month_field: month_lookup, day_field: day.day}), 295 'title': dateformat.format(day, month_day_format)293 'title': capfirst(formats.date_format(day, 'MONTH_DAY_FORMAT')) 296 294 } for day in days] 297 295 } 298 296 elif year_lookup: … … def date_hierarchy(cl): 305 303 }, 306 304 'choices': [{ 307 305 'link': link({year_field: year_lookup, month_field: month.month}), 308 'title': dateformat.format(month, year_month_format)306 'title': capfirst(formats.date_format(month, 'YEAR_MONTH_FORMAT')) 309 307 } for month in months] 310 308 } 311 309 else: -
django/contrib/databrowse/datastructures.py
diff --git a/django/contrib/databrowse/datastructures.py b/django/contrib/databrowse/datastructures.py index 5fdbdbe..369f825 100644
a b convenience functionality and permalink functions for the databrowse app. 4 4 """ 5 5 6 6 from django.db import models 7 from django.utils import dateformat7 from django.utils import formats 8 8 from django.utils.text import capfirst 9 from django.utils.translation import get_date_formats10 9 from django.utils.encoding import smart_unicode, smart_str, iri_to_uri 11 10 from django.utils.safestring import mark_safe 12 11 from django.db.models.query import QuerySet … … class EasyInstanceField(object): 156 155 objs = dict(self.field.choices).get(self.raw_value, EMPTY_VALUE) 157 156 elif isinstance(self.field, models.DateField) or isinstance(self.field, models.TimeField): 158 157 if self.raw_value: 159 date_format, datetime_format, time_format = get_date_formats()160 158 if isinstance(self.field, models.DateTimeField): 161 objs = capfirst( dateformat.format(self.raw_value, datetime_format))159 objs = capfirst(formats.date_format(self.raw_value, 'DATETIME_FORMAT')) 162 160 elif isinstance(self.field, models.TimeField): 163 objs = capfirst( dateformat.time_format(self.raw_value, time_format))161 objs = capfirst(formats.date_format(self.raw_value, 'TIME_FORMAT')) 164 162 else: 165 objs = capfirst( dateformat.format(self.raw_value, date_format))163 objs = capfirst(formats.date_format(self.raw_value, 'DATE_FORMAT')) 166 164 else: 167 165 objs = EMPTY_VALUE 168 166 elif isinstance(self.field, models.BooleanField) or isinstance(self.field, models.NullBooleanField): -
new file django/core/management/commands/importcldr.py
diff --git a/django/core/management/commands/importcldr.py b/django/core/management/commands/importcldr.py new file mode 100644 index 0000000..c4a13e6
- + 1 import sys 2 import os 3 import re 4 from optparse import make_option, OptionParser 5 6 from django.core.management.base import LabelCommand, CommandError 7 8 try: 9 from lxml import etree 10 except ImportError: 11 raise CommandError('You need to install `python-lxml` to run this script') 12 13 FORMATS_FILE_NAME = 'formats.py' 14 FORMATS_FILE_HEADER = '''# -*- encoding: utf-8 -*- 15 # This file is distributed under the same license as the Django package. 16 # 17 18 ''' 19 20 def quote(nodes, name, locale, previous): 21 if len(nodes): 22 return "'%s'" % unicode(nodes[0].text).replace("'", "\\'") 23 else: 24 return None 25 26 def convert_time(nodes, name, locale, previous): 27 SPECIAL_CHARS = ('a', 'A', 'b', 'B', 'd', 'D', 'f', 'F', 'g', 'G', 'h', 28 'H', 'i', 'I', 'j', 'l', 'L', 'm', 'M', 'n', 'N', 'O', 'P', 'r', 29 's', 'S', 't', 'T', 'U', 'w', 'W', 'y', 'Y', 'z', 'Z') 30 FORMAT_STR_MAP = ( # not using a dict, because we have to apply formats in order 31 ('dd', 'd'), 32 ('d', 'j'), 33 ('MMMM', 'F'), 34 ('MMM', 'M'), 35 ('MM', 'm'), 36 ('M', 'n'), 37 ('yyyy', 'Y'), 38 ('yy', 'y'), 39 ('y', 'Y'), 40 ('hh', 'h'), 41 ('h', 'g'), 42 ('HH', 'H'), 43 ('H', 'G'), 44 ('mm', 'i'), 45 ('ss', 's'), 46 ('a', 'A'), 47 ('LLLL', 'F'), 48 ) 49 if len(nodes): 50 original = nodes[0].text 51 result = '' 52 for cnt, segment in enumerate(original.split("'")): 53 if cnt % 2: 54 for char in SPECIAL_CHARS: 55 segment = segment.replace(char, '\\%s' % char) 56 result += segment 57 else: 58 while segment: 59 found = False 60 for src, dst in FORMAT_STR_MAP: 61 if segment[0:len(src)] == src: 62 result += dst 63 segment = segment[len(src):] 64 found = True 65 break 66 if not found: 67 result += segment[0] 68 segment = segment[1:] 69 70 return "'%s'" % result 71 else: 72 return None 73 74 def datetime(nodes, name, locale, previous): 75 result = None 76 if len(nodes) and 'DATE_FORMAT' in previous and 'TIME_FORMAT' in previous: 77 result = nodes[0].text 78 result = result.replace('{0}', previous['TIME_FORMAT'][1:-1]) 79 if name == 'SHORT_DATETIME_FORMAT' and 'SHORT_DATE_FORMAT' in previous: 80 result = result.replace('{1}', previous['SHORT_DATE_FORMAT'][1:-1]) 81 else: 82 result = result.replace('{1}', previous['DATE_FORMAT'][1:-1]) 83 if result: 84 return "'%s'" % result 85 else: 86 return None 87 88 FORMATS_MAP = [ 89 { 90 'name': 'DATE_FORMAT', 91 'file': os.path.join('common', 'main', '%(locale)s.xml'), 92 'pattern': "/ldml/dates/calendars/calendar[@type='gregorian']/dateFormats/dateFormatLength[@type='long']/dateFormat/pattern", 93 'conversion': convert_time, 94 }, 95 { 96 'name': 'TIME_FORMAT', 97 'file': os.path.join('common', 'main', '%(locale)s.xml'), 98 'pattern': "/ldml/dates/calendars/calendar[@type='gregorian']/timeFormats/timeFormatLength[@type='medium']/timeFormat/pattern", 99 'conversion': convert_time, 100 }, 101 { 102 'name': 'DATETIME_FORMAT', 103 'file': os.path.join('common', 'main', '%(locale)s.xml'), 104 'pattern': "/ldml/dates/calendars/calendar[@type='gregorian']/dateTimeFormats/dateTimeFormatLength[@type='long']/dateTimeFormat/pattern", 105 'conversion': datetime, 106 }, 107 { 108 'name': 'YEAR_MONTH_FORMAT', 109 'file': os.path.join('common', 'main', '%(locale)s.xml'), 110 'pattern': "/ldml/dates/calendars/calendar[@type='gregorian']/dateTimeFormats/availableFormats/dateFormatItem[@id='yMMMM']", 111 'conversion': convert_time, 112 }, 113 { 114 'name': 'MONTH_DAY_FORMAT', 115 'file': os.path.join('common', 'main', '%(locale)s.xml'), 116 'pattern': "/ldml/dates/calendars/calendar[@type='gregorian']/dateTimeFormats/availableFormats/dateFormatItem[@id='MMMMd']", 117 'conversion': convert_time, 118 }, 119 { 120 'name': 'SHORT_DATE_FORMAT', 121 'file': os.path.join('common', 'main', '%(locale)s.xml'), 122 'pattern': "/ldml/dates/calendars/calendar[@type='gregorian']/dateFormats/dateFormatLength[@type='medium']/dateFormat/pattern", 123 'conversion': convert_time, 124 }, 125 { 126 'name': 'SHORT_DATETIME_FORMAT', 127 'file': os.path.join('common', 'main', '%(locale)s.xml'), 128 'pattern': "/ldml/dates/calendars/calendar[@type='gregorian']/dateTimeFormats/dateTimeFormatLength[@type='short']/dateTimeFormat/pattern", 129 'conversion': datetime, 130 }, 131 {'name': 'FIRST_DAY_OF_WEEK'}, 132 {'name': 'DATE_INPUT_FORMATS'}, 133 {'name': 'TIME_INPUT_FORMATS'}, 134 {'name': 'DATETIME_INPUT_FORMATS'}, 135 { 136 'name': 'DECIMAL_SEPARATOR', 137 'file': os.path.join('common', 'main', '%(locale)s.xml'), 138 'pattern': "/ldml/numbers/symbols/decimal", 139 'conversion': quote, 140 }, 141 { 142 'name': 'THOUSAND_SEPARATOR', 143 'file': os.path.join('common', 'main', '%(locale)s.xml'), 144 'pattern': "/ldml/numbers/symbols/group", 145 'conversion': quote, 146 }, 147 {'name': 'NUMBER_GROUPING'}, 148 ] 149 """ 150 """ 151 152 def get_locales(django_locale_dir, locale=None): 153 if locale: 154 yield locale 155 else: 156 locale_re = re.compile('[a-z]{2}(_[A-Z]{2})?') 157 for locale in os.listdir(django_locale_dir): 158 if locale_re.match(locale): 159 yield locale 160 161 def import_cldr(cldr_dir, locale=None, overwrite=False): 162 """ 163 For every locale defined in Django, get from the CLDR locale file all 164 settings defined in output_structure, and write the result to the 165 locale directories on Django. 166 """ 167 if not os.path.isdir(cldr_dir): 168 raise Exception, "Specified CLDR directory '%s' does not exist" % cldr_dir 169 170 import django 171 django_locale_dir = os.path.join(os.path.dirname(django.__file__), 'conf', 'locale') 172 173 for locale in get_locales(django_locale_dir, locale): 174 output_filename = os.path.join(django_locale_dir, locale, FORMATS_FILE_NAME) 175 if os.path.isfile(output_filename) and not overwrite: 176 print "'%s' locale already exists. Skipping" % locale 177 else: 178 result = {} 179 output_file = open(output_filename, 'w') 180 output_file.write(FORMATS_FILE_HEADER) 181 for format in FORMATS_MAP: 182 if 'file' in format: 183 cldr_file = os.path.join(cldr_dir, format['file'] % dict(locale=locale)) 184 tree = etree.parse(cldr_file) # TODO: error control 185 try: 186 original_value = tree.xpath(format['pattern']) 187 except IndexError: 188 output_file.write('# %s = \n' % (format['name'])) 189 else: 190 value = format['conversion'](original_value, format['name'], locale, result) 191 if value: 192 output_file.write('%s = %s\n' % (format['name'], value.encode('utf8'))) 193 result[format['name']] = value 194 else: 195 output_file.write('# %s = \n' % (format['name'])) 196 else: 197 output_file.write('# %s = \n' % (format['name'])) 198 output_file.close() 199 200 init_filename = os.path.join(django_locale_dir, locale, '__init__.py') 201 open(init_filename, 'a').close() 202 203 class Command(LabelCommand): 204 option_list = LabelCommand.option_list + ( 205 make_option('--locale', '-l', dest='locale', 206 help='The locale to process. Default is to process all.'), 207 ) + ( 208 make_option('--overwite', '-o', action='store_true', dest='overwrite', 209 help='Wheter to overwrite format definitions of locales that already have one.'), 210 ) 211 help = 'Creates format definition files for locales, importing data from the CLDR.' 212 args = '[cldrpath]' 213 label = 'CLDR path' 214 requires_model_validation = False 215 can_import_settings = False 216 217 def handle_label(self, cldrpath, **options): 218 locale = options.get('locale') 219 overwrite = options.get('overwrite') 220 import_cldr(cldrpath, locale, overwrite) 221 -
django/forms/extras/widgets.py
diff --git a/django/forms/extras/widgets.py b/django/forms/extras/widgets.py index e36b8a1..04ad24d 100644
a b import re 8 8 from django.forms.widgets import Widget, Select 9 9 from django.utils.dates import MONTHS 10 10 from django.utils.safestring import mark_safe 11 from django.utils.formats import getformat 12 from django.conf import settings 11 13 12 14 __all__ = ('SelectDateWidget',) 13 15 … … class SelectDateWidget(Widget): 45 47 if match: 46 48 year_val, month_val, day_val = [int(v) for v in match.groups()] 47 49 48 output = [] 49 50 if 'id' in self.attrs: 51 id_ = self.attrs['id'] 52 else: 53 id_ = 'id_%s' % name 54 55 month_choices = MONTHS.items() 56 if not (self.required and value): 57 month_choices.append(self.none_value) 58 month_choices.sort() 59 local_attrs = self.build_attrs(id=self.month_field % id_) 60 s = Select(choices=month_choices) 61 select_html = s.render(self.month_field % name, month_val, local_attrs) 62 output.append(select_html) 63 64 day_choices = [(i, i) for i in range(1, 32)] 65 if not (self.required and value): 66 day_choices.insert(0, self.none_value) 67 local_attrs['id'] = self.day_field % id_ 68 s = Select(choices=day_choices) 69 select_html = s.render(self.day_field % name, day_val, local_attrs) 70 output.append(select_html) 71 72 year_choices = [(i, i) for i in self.years] 73 if not (self.required and value): 74 year_choices.insert(0, self.none_value) 75 local_attrs['id'] = self.year_field % id_ 76 s = Select(choices=year_choices) 77 select_html = s.render(self.year_field % name, year_val, local_attrs) 78 output.append(select_html) 50 choices = [(i, i) for i in self.years] 51 year_html = self.create_select(name, self.year_field, value, year_val, choices) 52 choices = MONTHS.items() 53 month_html = self.create_select(name, self.month_field, value, month_val, choices) 54 choices = [(i, i) for i in range(1, 32)] 55 day_html = self.create_select(name, self.day_field, value, day_val, choices) 79 56 57 format = getformat('DATE_FORMAT') 58 escaped = False 59 output = [] 60 for char in format: 61 if escaped: 62 escaped = False 63 elif char == '\\': 64 escaped = True 65 elif char in 'Yy': 66 output.append(year_html) 67 elif char in 'bFMmNn': 68 output.append(month_html) 69 elif char in 'dj': 70 output.append(day_html) 80 71 return mark_safe(u'\n'.join(output)) 81 72 82 73 def id_for_label(self, id_): … … class SelectDateWidget(Widget): 90 81 if y == m == d == "0": 91 82 return None 92 83 if y and m and d: 93 return '%s-%s-%s' % (y, m, d) 84 if settings.USE_FORMAT_I18N: 85 input_format = getformat('DATE_INPUT_FORMATS')[0] 86 try: 87 date_value = datetime.date(int(y), int(m), int(d)) 88 except ValueError: 89 pass 90 else: 91 return date_value.strftime(input_format) 92 else: 93 return '%s-%s-%s' % (y, m, d) 94 94 return data.get(name, None) 95 96 def create_select(self, name, field, value, val, choices): 97 if 'id' in self.attrs: 98 id_ = self.attrs['id'] 99 else: 100 id_ = 'id_%s' % name 101 if not (self.required and value): 102 choices.insert(0, self.none_value) 103 local_attrs = self.build_attrs(id=field % id_) 104 s = Select(choices=choices) 105 select_html = s.render(field % name, val, local_attrs) 106 return select_html 107 -
django/forms/fields.py
diff --git a/django/forms/fields.py b/django/forms/fields.py index 0aef355..6f8c222 100644
a b except NameError: 26 26 import django.core.exceptions 27 27 from django.utils.translation import ugettext_lazy as _ 28 28 from django.utils.encoding import smart_unicode, smart_str 29 from django.utils.formats import getformat 29 30 30 31 from util import ErrorList, ValidationError 31 32 from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, FileInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple, DateInput, DateTimeInput, TimeInput, SplitDateTimeWidget, SplitHiddenDateTimeWidget 32 33 33 34 __all__ = ( 34 35 'Field', 'CharField', 'IntegerField', 35 'DEFAULT_DATE_INPUT_FORMATS', 'DateField', 36 'DEFAULT_TIME_INPUT_FORMATS', 'TimeField', 37 'DEFAULT_DATETIME_INPUT_FORMATS', 'DateTimeField', 'TimeField', 36 'DateField', 'TimeField', 'DateTimeField', 'TimeField', 38 37 'RegexField', 'EmailField', 'FileField', 'ImageField', 'URLField', 39 38 'BooleanField', 'NullBooleanField', 'ChoiceField', 'MultipleChoiceField', 40 39 'ComboField', 'MultiValueField', 'FloatField', 'DecimalField', … … class FloatField(Field): 209 208 if not self.required and value in EMPTY_VALUES: 210 209 return None 211 210 try: 212 value = float(value) 211 # We always accept dot as decimal separator 212 if isinstance(value, str) or isinstance(value, unicode): 213 value = float(value.replace(getformat('DECIMAL_SEPARATOR'), '.')) 213 214 except (ValueError, TypeError): 214 215 raise ValidationError(self.error_messages['invalid']) 215 216 if self.max_value is not None and value > self.max_value: … … class DecimalField(Field): 245 246 return None 246 247 value = smart_str(value).strip() 247 248 try: 248 value = Decimal(value) 249 # We always accept dot as decimal separator 250 if isinstance(value, str) or isinstance(value, unicode): 251 value = Decimal(value.replace(getformat('DECIMAL_SEPARATOR'), '.')) 249 252 except DecimalException: 250 253 raise ValidationError(self.error_messages['invalid']) 251 254 … … class DecimalField(Field): 273 276 raise ValidationError(self.error_messages['max_whole_digits'] % (self.max_digits - self.decimal_places)) 274 277 return value 275 278 276 DEFAULT_DATE_INPUT_FORMATS = (277 '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06'278 '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006'279 '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006'280 '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006'281 '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006'282 )283 284 279 class DateField(Field): 285 280 widget = DateInput 286 281 default_error_messages = { … … class DateField(Field): 289 284 290 285 def __init__(self, input_formats=None, *args, **kwargs): 291 286 super(DateField, self).__init__(*args, **kwargs) 292 self.input_formats = input_formats or DEFAULT_DATE_INPUT_FORMATS287 self.input_formats = input_formats 293 288 294 289 def clean(self, value): 295 290 """ … … class DateField(Field): 303 298 return value.date() 304 299 if isinstance(value, datetime.date): 305 300 return value 306 for format in self.input_formats :301 for format in self.input_formats or getformat('DATE_INPUT_FORMATS'): 307 302 try: 308 303 return datetime.date(*time.strptime(value, format)[:3]) 309 304 except ValueError: 310 305 continue 311 306 raise ValidationError(self.error_messages['invalid']) 312 307 313 DEFAULT_TIME_INPUT_FORMATS = (314 '%H:%M:%S', # '14:30:59'315 '%H:%M', # '14:30'316 )317 318 308 class TimeField(Field): 319 309 widget = TimeInput 320 310 default_error_messages = { … … class TimeField(Field): 323 313 324 314 def __init__(self, input_formats=None, *args, **kwargs): 325 315 super(TimeField, self).__init__(*args, **kwargs) 326 self.input_formats = input_formats or DEFAULT_TIME_INPUT_FORMATS316 self.input_formats = input_formats 327 317 328 318 def clean(self, value): 329 319 """ … … class TimeField(Field): 335 325 return None 336 326 if isinstance(value, datetime.time): 337 327 return value 338 for format in self.input_formats :328 for format in self.input_formats or getformat('TIME_INPUT_FORMATS'): 339 329 try: 340 330 return datetime.time(*time.strptime(value, format)[3:6]) 341 331 except ValueError: 342 332 continue 343 333 raise ValidationError(self.error_messages['invalid']) 344 334 345 DEFAULT_DATETIME_INPUT_FORMATS = (346 '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'347 '%Y-%m-%d %H:%M', # '2006-10-25 14:30'348 '%Y-%m-%d', # '2006-10-25'349 '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59'350 '%m/%d/%Y %H:%M', # '10/25/2006 14:30'351 '%m/%d/%Y', # '10/25/2006'352 '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59'353 '%m/%d/%y %H:%M', # '10/25/06 14:30'354 '%m/%d/%y', # '10/25/06'355 )356 357 335 class DateTimeField(Field): 358 336 widget = DateTimeInput 359 337 default_error_messages = { … … class DateTimeField(Field): 362 340 363 341 def __init__(self, input_formats=None, *args, **kwargs): 364 342 super(DateTimeField, self).__init__(*args, **kwargs) 365 self.input_formats = input_formats or DEFAULT_DATETIME_INPUT_FORMATS343 self.input_formats = input_formats 366 344 367 345 def clean(self, value): 368 346 """ … … class DateTimeField(Field): 382 360 if len(value) != 2: 383 361 raise ValidationError(self.error_messages['invalid']) 384 362 value = '%s %s' % tuple(value) 385 for format in self.input_formats :363 for format in self.input_formats or getformat('DATETIME_INPUT_FORMATS'): 386 364 try: 387 365 return datetime.datetime(*time.strptime(value, format)[:6]) 388 366 except ValueError: -
django/forms/widgets.py
diff --git a/django/forms/widgets.py b/django/forms/widgets.py index b1d2cb7..0161653 100644
a b from django.utils.html import escape, conditional_escape 15 15 from django.utils.translation import ugettext 16 16 from django.utils.encoding import StrAndUnicode, force_unicode 17 17 from django.utils.safestring import mark_safe 18 from django.utils.formats import localize 18 19 from django.utils import datetime_safe 19 20 from datetime import time 20 21 from util import flatatt … … class Input(Widget): 213 214 final_attrs = self.build_attrs(attrs, type=self.input_type, name=name) 214 215 if value != '': 215 216 # Only add the 'value' attribute if a value is non-empty. 216 final_attrs['value'] = force_unicode( value)217 final_attrs['value'] = force_unicode(localize(value, is_input=True)) 217 218 return mark_safe(u'<input%s />' % flatatt(final_attrs)) 218 219 219 220 class TextInput(Input): -
django/template/__init__.py
diff --git a/django/template/__init__.py b/django/template/__init__.py index 8764bfa..4c386be 100644
a b from django.utils.text import smart_split, unescape_string_literal 60 60 from django.utils.encoding import smart_unicode, force_unicode, smart_str 61 61 from django.utils.translation import ugettext as _ 62 62 from django.utils.safestring import SafeData, EscapeData, mark_safe, mark_for_escaping 63 from django.utils.formats import localize 63 64 from django.utils.html import escape 64 65 65 66 __all__ = ('Template', 'Context', 'RequestContext', 'compile_string') … … def _render_value_in_context(value, context): 815 816 means escaping, if required, and conversion to a unicode object. If value 816 817 is a string, it is expected to have already been translated. 817 818 """ 819 value = localize(value) 818 820 value = force_unicode(value) 819 821 if (context.autoescape and not isinstance(value, SafeData)) or isinstance(value, EscapeData): 820 822 return escape(value) -
django/template/debug.py
diff --git a/django/template/debug.py b/django/template/debug.py index c58c854..382fb75 100644
a b from django.template import Lexer, Parser, tag_re, NodeList, VariableNode, Templ 2 2 from django.utils.encoding import force_unicode 3 3 from django.utils.html import escape 4 4 from django.utils.safestring import SafeData, EscapeData 5 from django.utils.formats import localize 5 6 6 7 class DebugLexer(Lexer): 7 8 def __init__(self, template_string, origin): … … class DebugNodeList(NodeList): 84 85 class DebugVariableNode(VariableNode): 85 86 def render(self, context): 86 87 try: 87 output = force_unicode(self.filter_expression.resolve(context)) 88 output = self.filter_expression.resolve(context) 89 output = localize(output) 90 output = force_unicode(output) 88 91 except TemplateSyntaxError, e: 89 92 if not hasattr(e, 'source'): 90 93 e.source = self.source -
django/template/defaultfilters.py
diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py index a8c2567..26b6b5e 100644
a b from django.conf import settings 18 18 from django.utils.translation import ugettext, ungettext 19 19 from django.utils.encoding import force_unicode, iri_to_uri 20 20 from django.utils.safestring import mark_safe, SafeData 21 from django.utils.formats import date_format, number_format 21 22 22 23 register = Library() 23 24 … … def floatformat(text, arg=-1): 166 167 return input_val 167 168 168 169 if not m and p < 0: 169 return mark_safe( u'%d' % (int(d)))170 return mark_safe(number_format(u'%d' % (int(d)), 0)) 170 171 171 172 if p == 0: 172 173 exp = Decimal(1) 173 174 else: 174 175 exp = Decimal('1.0') / (Decimal(10) ** abs(p)) 175 176 try: 176 return mark_safe( u'%s' % str(d.quantize(exp, ROUND_HALF_UP)))177 return mark_safe(number_format(u'%s' % str(d.quantize(exp, ROUND_HALF_UP)), abs(p))) 177 178 except InvalidOperation: 178 179 return input_val 179 180 floatformat.is_safe = True … … def date(value, arg=None): 685 686 if arg is None: 686 687 arg = settings.DATE_FORMAT 687 688 try: 688 return format(value, arg)689 return date_format(value, arg) 689 690 except AttributeError: 690 return '' 691 try: 692 return format(value, arg) 693 except AttributeError: 694 return '' 691 695 date.is_safe = False 692 696 693 697 def time(value, arg=None): … … def time(value, arg=None): 698 702 if arg is None: 699 703 arg = settings.TIME_FORMAT 700 704 try: 701 return time_format(value, arg)705 return date_format(value, arg) 702 706 except AttributeError: 703 return '' 707 try: 708 return time_format(value, arg) 709 except AttributeError: 710 return '' 704 711 time.is_safe = False 705 712 706 713 def timesince(value, arg=None): -
new file django/utils/formats.py
diff --git a/django/utils/formats.py b/django/utils/formats.py new file mode 100644 index 0000000..c594762
- + 1 import decimal 2 import datetime 3 4 from django.conf import settings 5 from django.utils.translation import get_language 6 from django.utils.importlib import import_module 7 from django.utils import dateformat 8 from django.utils import numberformat 9 10 def project_formats_module(): 11 """ 12 Returns the formats module for the current locale, defined 13 on the project 14 """ 15 if settings.FORMAT_MODULE_PATH: 16 try: 17 return import_module('.formats', '%s.%s' % (settings.FORMAT_MODULE_PATH, get_language())) 18 except ImportError: 19 pass 20 return None 21 22 def django_formats_module(): 23 """ 24 Returns the formats module for the current locale, defined 25 on Django 26 """ 27 try: 28 return import_module('.formats', 'django.conf.locale.%s' % get_language()) 29 except ImportError: 30 return None 31 32 def getformat(format_type): 33 """ 34 For a specific format type, returns the format for the 35 current language (locale) defaulting to the format on settings. 36 format_type is the name of the format, for example 'DATE_FORMAT' 37 """ 38 if settings.USE_I18N and settings.USE_FORMAT_I18N: 39 for module in (project_formats_module(), django_formats_module()): 40 if module: 41 try: 42 return getattr(module, format_type) 43 except AttributeError: 44 pass 45 return getattr(settings, format_type) 46 47 def date_format(value, format=None): 48 """ 49 Formats a datetime.date or datetime.datetime object using a 50 localizable format 51 """ 52 return dateformat.format(value, getformat(format or 'DATE_FORMAT')) 53 54 def number_format(value, decimal_pos=None): 55 """ 56 Formats a numeric value using localization settings 57 """ 58 return numberformat.format( 59 value, 60 getformat('DECIMAL_SEPARATOR'), 61 decimal_pos, 62 getformat('NUMBER_GROUPING'), 63 getformat('THOUSAND_SEPARATOR'), 64 ) 65 66 def localize(value, is_input=False): 67 """ 68 Checks value, and if it has a localizable type (date, 69 number...) it returns the value as a string using 70 current locale format 71 """ 72 if settings.USE_I18N and settings.USE_FORMAT_I18N: 73 if isinstance(value, decimal.Decimal): 74 return number_format(value) 75 elif isinstance(value, float): 76 return number_format(value) 77 elif isinstance(value, int): 78 return number_format(value) 79 elif isinstance(value, datetime.datetime): 80 if not is_input: 81 return date_format(value, 'DATETIME_FORMAT') 82 else: 83 return value.strftime(getformat('DATETIME_INPUT_FORMATS')[0]) 84 elif isinstance(value, datetime.date): 85 if not is_input: 86 return date_format(value) 87 else: 88 return value.strftime(getformat('DATE_INPUT_FORMATS')[0]) 89 elif isinstance(value, datetime.time): 90 if not is_input: 91 return date_format(value, 'TIME_FORMAT') 92 else: 93 return value.strftime(getformat('TIME_INPUT_FORMATS')[0]) 94 return value 95 -
new file django/utils/numberformat.py
diff --git a/django/utils/numberformat.py b/django/utils/numberformat.py new file mode 100644 index 0000000..78ecb2f
- + 1 from django.conf import settings 2 3 def format(number, decimal_sep, decimal_pos, grouping=0, thousand_sep=''): 4 """ 5 Gets a number (as a number or string), and returns it as a string, 6 using formats definied as arguments: 7 8 * decimal_sep: Decimal separator symbol (for example ".") 9 * decimal_pos: Number of decimal positions 10 * grouping: Number of digits in every group limited by thousand separator 11 * thousand_sep: Thousand separator symbol (for example ",") 12 13 """ 14 # sign 15 if float(number) < 0: 16 sign = '-' 17 else: 18 sign = '' 19 # decimal part 20 str_number = unicode(number) 21 if str_number[0] == '-': 22 str_number = str_number[1:] 23 if '.' in str_number: 24 int_part, dec_part = str_number.split('.') 25 if decimal_pos: 26 dec_part = dec_part[:decimal_pos] 27 else: 28 int_part, dec_part = str_number, '' 29 if decimal_pos: 30 dec_part = dec_part + ('0' * (decimal_pos - len(dec_part))) 31 if dec_part: dec_part = decimal_sep + dec_part 32 # grouping 33 if settings.USE_THOUSAND_SEPARATOR and grouping: 34 int_part_gd = '' 35 for cnt, digit in enumerate(int_part[::-1]): 36 if cnt and not cnt % grouping: 37 int_part_gd += thousand_sep 38 int_part_gd += digit 39 int_part = int_part_gd[::-1] 40 41 return sign + int_part + dec_part 42 -
django/utils/translation/trans_null.py
diff --git a/django/utils/translation/trans_null.py b/django/utils/translation/trans_null.py index 98c6de6..7a57139 100644
a b activate = lambda x: None 18 18 deactivate = deactivate_all = lambda: None 19 19 get_language = lambda: settings.LANGUAGE_CODE 20 20 get_language_bidi = lambda: settings.LANGUAGE_CODE in settings.LANGUAGES_BIDI 21 get_date_formats = lambda: (settings.DATE_FORMAT, settings.DATETIME_FORMAT, settings.TIME_FORMAT)22 get_partial_date_formats = lambda: (settings.YEAR_MONTH_FORMAT, settings.MONTH_DAY_FORMAT)23 21 check_for_language = lambda x: True 24 22 23 # date formats shouldn't be used using gettext anymore. This 24 # is kept for backward compatibility 25 25 TECHNICAL_ID_MAP = { 26 26 "DATE_WITH_TIME_FULL": settings.DATETIME_FORMAT, 27 27 "DATE_FORMAT": settings.DATE_FORMAT, … … def to_locale(language): 51 51 52 52 def get_language_from_request(request): 53 53 return settings.LANGUAGE_CODE 54 55 # get_date_formats and get_partial_date_formats aren't used anymore from django 56 # itself, and are kept for backward compatibility. 57 get_date_formats = lambda: (settings.DATE_FORMAT, settings.DATETIME_FORMAT, settings.TIME_FORMAT) 58 get_partial_date_formats = lambda: (settings.YEAR_MONTH_FORMAT, settings.MONTH_DAY_FORMAT) -
django/utils/translation/trans_real.py
diff --git a/django/utils/translation/trans_real.py b/django/utils/translation/trans_real.py index 48ed7cc..e9f0a36 100644
a b def do_translate(message, translation_function): 266 266 translation object to use. If no current translation is activated, the 267 267 message will be run through the default translation object. 268 268 """ 269 eol_message = message.replace('\r\n', '\n').replace('\r', '\n') 269 270 global _default, _active 270 271 t = _active.get(currentThread(), None) 271 272 if t is not None: 272 result = getattr(t, translation_function)( message)273 result = getattr(t, translation_function)(eol_message) 273 274 else: 274 275 if _default is None: 275 276 from django.conf import settings 276 277 _default = translation(settings.LANGUAGE_CODE) 277 result = getattr(_default, translation_function)( message)278 result = getattr(_default, translation_function)(eol_message) 278 279 if isinstance(message, SafeData): 279 280 return mark_safe(result) 280 281 return result … … def get_language_from_request(request): 389 390 390 391 return settings.LANGUAGE_CODE 391 392 392 def get_date_formats():393 """394 Checks whether translation files provide a translation for some technical395 message ID to store date and time formats. If it doesn't contain one, the396 formats provided in the settings will be used.397 """398 from django.conf import settings399 date_format = ugettext('DATE_FORMAT')400 datetime_format = ugettext('DATETIME_FORMAT')401 time_format = ugettext('TIME_FORMAT')402 if date_format == 'DATE_FORMAT':403 date_format = settings.DATE_FORMAT404 if datetime_format == 'DATETIME_FORMAT':405 datetime_format = settings.DATETIME_FORMAT406 if time_format == 'TIME_FORMAT':407 time_format = settings.TIME_FORMAT408 return date_format, datetime_format, time_format409 410 def get_partial_date_formats():411 """412 Checks whether translation files provide a translation for some technical413 message ID to store partial date formats. If it doesn't contain one, the414 formats provided in the settings will be used.415 """416 from django.conf import settings417 year_month_format = ugettext('YEAR_MONTH_FORMAT')418 month_day_format = ugettext('MONTH_DAY_FORMAT')419 if year_month_format == 'YEAR_MONTH_FORMAT':420 year_month_format = settings.YEAR_MONTH_FORMAT421 if month_day_format == 'MONTH_DAY_FORMAT':422 month_day_format = settings.MONTH_DAY_FORMAT423 return year_month_format, month_day_format424 425 393 dot_re = re.compile(r'\S') 426 394 def blankout(src, char): 427 395 """ … … def parse_accept_lang_header(lang_string): 537 505 result.append((lang, priority)) 538 506 result.sort(lambda x, y: -cmp(x[1], y[1])) 539 507 return result 508 509 # get_date_formats and get_partial_date_formats aren't used anymore from django 510 # itself, and are kept for backward compatibility. 511 # Note that it's also important to keep format names maked for translation, so 512 # for compatibility we still want to have formats on translation catalogs. That 513 # makes template code like {{ my_date|date:_('DATE_FORMAT') }} go on working 514 def get_date_formats(): 515 """ 516 Checks whether translation files provide a translation for some technical 517 message ID to store date and time formats. If it doesn't contain one, the 518 formats provided in the settings will be used. 519 """ 520 from django.conf import settings 521 date_format = ugettext('DATE_FORMAT') 522 datetime_format = ugettext('DATETIME_FORMAT') 523 time_format = ugettext('TIME_FORMAT') 524 if date_format == 'DATE_FORMAT': 525 date_format = settings.DATE_FORMAT 526 if datetime_format == 'DATETIME_FORMAT': 527 datetime_format = settings.DATETIME_FORMAT 528 if time_format == 'TIME_FORMAT': 529 time_format = settings.TIME_FORMAT 530 return date_format, datetime_format, time_format 531 532 def get_partial_date_formats(): 533 """ 534 Checks whether translation files provide a translation for some technical 535 message ID to store partial date formats. If it doesn't contain one, the 536 formats provided in the settings will be used. 537 """ 538 from django.conf import settings 539 year_month_format = ugettext('YEAR_MONTH_FORMAT') 540 month_day_format = ugettext('MONTH_DAY_FORMAT') 541 if year_month_format == 'YEAR_MONTH_FORMAT': 542 year_month_format = settings.YEAR_MONTH_FORMAT 543 if month_day_format == 'MONTH_DAY_FORMAT': 544 month_day_format = settings.MONTH_DAY_FORMAT 545 return year_month_format, month_day_format 546 -
django/views/i18n.py
diff --git a/django/views/i18n.py b/django/views/i18n.py index 0280698..4bfbf5e 100644
a b from django.conf import settings 3 3 from django.utils import importlib 4 4 from django.utils.translation import check_for_language, activate, to_locale, get_language 5 5 from django.utils.text import javascript_quote 6 from django.utils.formats import project_formats_module, django_formats_module 6 7 import os 7 8 import gettext as gettext_module 8 9 … … def set_language(request): 32 33 response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code) 33 34 return response 34 35 36 def get_formats(): 37 """ 38 Returns an iterator over all formats in formats file 39 """ 40 FORMAT_SETTINGS = ('DATE_FORMAT', 'DATETIME_FORMAT', 'TIME_FORMAT', 41 'YEAR_MONTH_FORMAT', 'MONTH_DAY_FORMAT', 'SHORT_DATE_FORMAT', 42 'SHORT_DATETIME_FORMAT', 'FIRST_DAY_OF_WEEK', 'DECIMAL_SEPARATOR', 43 'THOUSAND_SEPARATOR', 'NUMBER_GROUPING') 44 45 result = {} 46 for module in (settings, django_formats_module(), project_formats_module()): 47 if module: 48 for attr in FORMAT_SETTINGS: 49 try: 50 result[attr] = getattr(module, attr) 51 except AttributeError: 52 pass 53 return result 54 35 55 NullSource = """ 36 56 /* gettext identity library */ 37 57 … … def javascript_catalog(request, domain='djangojs', packages=None): 185 205 else: 186 206 raise TypeError, k 187 207 csrc.sort() 188 for k, v in pdict.items():208 for k, v in pdict.items(): 189 209 src.append("catalog['%s'] = [%s];\n" % (javascript_quote(k), ','.join(["''"]*(v+1)))) 210 for k, v in get_formats().items(): 211 src.append("catalog['%s'] = '%s';\n" % (javascript_quote(k), javascript_quote(unicode(v)))) 190 212 src.extend(csrc) 191 213 src.append(LibFoot) 192 214 src.append(InterPolate) 193 215 src = ''.join(src) 194 216 return http.HttpResponse(src, 'text/javascript') 217 -
docs/ref/settings.txt
diff --git a/docs/ref/settings.txt b/docs/ref/settings.txt index 8ff1509..1b57adf 100644
a b DATE_FORMAT 288 288 289 289 Default: ``'N j, Y'`` (e.g. ``Feb. 4, 2003``) 290 290 291 The default formatting to use for date fields on Django admin change-list 292 pages -- and, possibly, by other parts of the system. See 293 :ttag:`allowed date format strings <now>`. 291 The default formatting to use for date fields in any part of the system. 292 Note that if ``USE_FORMAT_I18N`` is set to ``True``, then locale format will 293 be applied. See :ttag:`allowed date format strings <now>`. 294 295 See also ``DATETIME_FORMAT``, ``TIME_FORMAT`` and ``SHORT_DATE_FORMAT``. 296 297 .. setting:: DATE_INPUT_FORMATS 294 298 295 See also ``DATETIME_FORMAT``, ``TIME_FORMAT``, ``YEAR_MONTH_FORMAT`` 296 and ``MONTH_DAY_FORMAT``. 299 DATE_INPUT_FORMATS 300 ------------------ 301 302 Default:: 303 304 ('%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', '%b %d %Y', 305 '%b %d, %Y', '%d %b %Y', '%d %b, %Y', '%B %d %Y', 306 '%B %d, %Y', '%d %B %Y', '%d %B, %Y') 307 308 A tuple of formats that will be accepted when inputting data on a date 309 field. Formats will be tried in order, using the first valid. 310 Note that these format strings are specified in Python's datetime_ module 311 syntax, that is different from the one used by Django for formatting dates 312 to be displayed. 313 314 See also ``DATETIME_INPUT_FORMATS`` and ``TIME_INPUT_FORMATS``. 315 316 .. _datetime: http://docs.python.org/library/datetime.html#strftime-behavior 297 317 298 318 .. setting:: DATETIME_FORMAT 299 319 … … DATETIME_FORMAT 302 322 303 323 Default: ``'N j, Y, P'`` (e.g. ``Feb. 4, 2003, 4 p.m.``) 304 324 305 The default formatting to use for datetime fields on Django admin change-list 306 pages -- and, possibly, by other parts of the system. See 307 :ttag:`allowed date format strings <now>`. 325 The default formatting to use for datetime fields in any part of the system. 326 Note that if ``USE_FORMAT_I18N`` is set to ``True``, then locale format will 327 be applied. See :ttag:`allowed date format strings <now>`. 328 329 See also ``DATE_FORMAT``, ``TIME_FORMAT`` and ``SHORT_DATETIME_FORMAT``. 308 330 309 See also ``DATE_FORMAT``, ``DATETIME_FORMAT``, ``TIME_FORMAT``, 310 ``YEAR_MONTH_FORMAT`` and ``MONTH_DAY_FORMAT``. 331 .. setting:: DATETIME_INPUT_FORMATS 332 333 DATETIME_INPUT_FORMATS 334 ---------------------- 335 336 Default:: 337 338 ('%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M', '%Y-%m-%d', 339 '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M', '%m/%d/%Y', 340 '%m/%d/%y %H:%M:%S', '%m/%d/%y %H:%M', '%m/%d/%y') 341 342 A tuple of formats that will be accepted when inputting data on a datetime 343 field. Formats will be tried in order, using the first valid. 344 Note that these format strings are specified in Python's datetime_ module 345 syntax, that is different from the one used by Django for formatting dates 346 to be displayed. 347 348 See also ``DATE_INPUT_FORMATS`` and ``TIME_INPUT_FORMATS``. 349 350 .. _datetime: http://docs.python.org/library/datetime.html#strftime-behavior 311 351 312 352 .. setting:: DEBUG 313 353 … … will be suppressed, and exceptions will propagate upwards. This can 347 387 be useful for some test setups, and should never be used on a live 348 388 site. 349 389 390 .. setting:: DECIMAL_SEPARATOR 391 392 DECIMAL_SEPARATOR 393 ----------------- 394 395 Default: ``'.'`` (Dot) 396 397 Default decimal separator used when formatting decimal numbers. 350 398 351 399 .. setting:: DEFAULT_CHARSET 352 400 … … system's standard umask. 596 644 597 645 .. _documentation for os.chmod: http://docs.python.org/lib/os-file-dir.html 598 646 647 .. setting:: FIRST_DAY_OF_WEEK 648 649 FIRST_DAY_OF_WEEK 650 ----------------- 651 652 Default: ``0`` (Sunday) 653 654 Number representing the first day of the week. This is specially useful 655 when displaying a calendar. This value is only used when not using 656 format internationalization, or when a format cannot be found for the 657 current locale. 658 659 The value must be an integer from 0 to 6, where 0 means Sunday, 1 means 660 Monday and so on. 661 599 662 .. setting:: FIXTURE_DIRS 600 663 601 664 FIXTURE_DIRS … … environment variable in any HTTP request. This setting can be used to override 617 680 the server-provided value of ``SCRIPT_NAME``, which may be a rewritten version 618 681 of the preferred value or not supplied at all. 619 682 683 .. setting:: FORMAT_MODULE_PATH 684 685 FORMAT_MODULE_PATH 686 ------------------ 687 688 Default: ``None`` 689 690 A full Python path to a Python package that contains format definitions for 691 project locales. If not ``None``, Django will check for a ``formats.py`` 692 file, under the directory named as the current locale, and will use the 693 formats defined on this file. 694 695 For example, if ``FORMAT_MODULE_PATH`` is set to ``mysite.formats``, and 696 current language is ``en`` (English), Django will expect a directory tree 697 like:: 698 699 mysite/ 700 formats/ 701 __init__.py 702 en/ 703 __init__.py 704 formats.py 705 706 Available formats are ``DATE_FORMAT``, ``TIME_FORMAT``, ``DATETIME_FORMAT``, 707 ``YEAR_MONTH_FORMAT``, ``MONTH_DAY_FORMAT``, ``SHORT_DATE_FORMAT``, 708 ``SHORT_DATETIME_FORMAT``, ``FIRST_DAY_OF_WEEK``, ``DECIMAL_SEPARATOR``, 709 ``THOUSAND_SEPARATOR`` and ``NUMBER_GROUPING``. 710 620 711 .. setting:: IGNORABLE_404_ENDS 621 712 622 713 IGNORABLE_404_ENDS … … locales have different formats. For example, U.S. English would say 886 977 See :ttag:`allowed date format strings <now>`. See also ``DATE_FORMAT``, 887 978 ``DATETIME_FORMAT``, ``TIME_FORMAT`` and ``YEAR_MONTH_FORMAT``. 888 979 980 .. setting:: NUMBER_GROUPING 981 982 NUMBER_GROUPING 983 ---------------- 984 985 Default: ``0`` 986 987 Number of digits grouped together on the integer part of a number. Common use 988 is to display a thousand separator. If this setting is ``0``, then, no grouping 989 will be applied to the number. If this setting is greater than ``0`` then the 990 setting ``THOUSAND_SEPARATOR`` will be used as the separator between those 991 groups. 992 993 See also ``THOUSAND_SEPARATOR`` 994 889 995 .. setting:: PREPEND_WWW 890 996 891 997 PREPEND_WWW … … Default: ``False`` 1077 1183 Whether to save the session data on every request. See 1078 1184 :ref:`topics-http-sessions`. 1079 1185 1186 .. setting:: SHORT_DATE_FORMAT 1187 1188 SHORT_DATE_FORMAT 1189 ----------------- 1190 1191 Default: ``m/d/Y`` (e.g. ``12/31/2003``) 1192 1193 An available formatting that can be used for date fields on templates. 1194 Note that if ``USE_FORMAT_I18N`` is set to ``True``, then locale format will 1195 be applied. See :ttag:`allowed date format strings <now>`. 1196 1197 See also ``DATE_FORMAT`` and ``SHORT_DATETIME_FORMAT``. 1198 1199 .. setting:: SHORT_DATETIME_FORMAT 1200 1201 SHORT_DATETIME_FORMAT 1202 --------------------- 1203 1204 Default: ``m/d/Y P`` (e.g. ``12/31/2003 4 p.m.``) 1205 1206 An available formatting that can be used for datetime fields on templates. 1207 Note that if ``USE_FORMAT_I18N`` is set to ``True``, then locale format will 1208 be applied. See :ttag:`allowed date format strings <now>`. 1209 1210 See also ``DATE_FORMAT`` and ``SHORT_DATETIME_FORMAT``. 1211 1080 1212 .. setting:: SITE_ID 1081 1213 1082 1214 SITE_ID … … The name of the method to use for starting the test suite. See 1231 1363 1232 1364 .. _Testing Django Applications: ../testing/ 1233 1365 1366 .. setting:: THOUSAND_SEPARATOR 1367 1368 THOUSAND_SEPARATOR 1369 ------------------ 1370 1371 Default ``,`` (Comma) 1372 1373 Default thousand separator used when formatting numbers. This setting is 1374 used only when ``NUMBER_GROUPPING`` is set. 1375 1376 See also ``NUMBER_GROUPPING``, ``DECIMAL_SEPARATOR`` 1377 1234 1378 .. setting:: TIME_FORMAT 1235 1379 1236 1380 TIME_FORMAT … … TIME_FORMAT 1238 1382 1239 1383 Default: ``'P'`` (e.g. ``4 p.m.``) 1240 1384 1241 The default formatting to use for time fields on Django admin change-list1242 pages -- and, possibly, by other parts of the system. See 1243 :ttag:`allowed date format strings <now>`.1385 The default formatting to use for time fields in any part of the system. 1386 Note that if ``USE_FORMAT_I18N`` is set to ``True``, then locale format will 1387 be applied. See :ttag:`allowed date format strings <now>`. 1244 1388 1245 See also ``DATE_FORMAT``, ``DATETIME_FORMAT``, ``TIME_FORMAT``, 1246 ``YEAR_MONTH_FORMAT`` and ``MONTH_DAY_FORMAT``. 1389 See also ``DATE_FORMAT`` and ``DATETIME_FORMAT``. 1390 1391 .. setting:: TIME_INPUT_FORMATS 1392 1393 TIME_INPUT_FORMATS 1394 ------------------ 1395 1396 Default: ``('%H:%M:%S', '%H:%M')`` 1397 1398 A tuple of formats that will be accepted when inputting data on a time 1399 field. Formats will be tried in order, using the first valid. 1400 Note that these format strings are specified in Python's datetime_ module 1401 syntax, that is different from the one used by Django for formatting dates 1402 to be displayed. 1403 1404 See also ``DATE_INPUT_FORMATS`` and ``DATETIME_INPUT_FORMATS``. 1405 1406 .. _datetime: http://docs.python.org/library/datetime.html#strftime-behavior 1247 1407 1248 1408 .. setting:: TIME_ZONE 1249 1409 … … A boolean that specifies whether to output the "Etag" header. This saves 1298 1458 bandwidth but slows down performance. This is only used if ``CommonMiddleware`` 1299 1459 is installed (see :ref:`topics-http-middleware`). 1300 1460 1461 .. setting:: USE_FORMAT_I18N 1462 1463 USE_FORMAT_I18N 1464 --------------- 1465 1466 Default ``False`` 1467 1468 A boolean that specifies if data will be localized by default or not. If this is 1469 set to ``True``, Django will display numbers and dates using the format of the 1470 current locale. It is required to set ``USE_I18N`` to ``True`` to allow data 1471 format localization. 1472 1473 See also ``USE_I18N`` 1474 1301 1475 .. setting:: USE_I18N 1302 1476 1303 1477 USE_I18N … … enabled. This provides an easy way to turn it off, for performance. If this is 1310 1484 set to ``False``, Django will make some optimizations so as not to load the 1311 1485 internationalization machinery. 1312 1486 1487 See also ``USE_FORMAT_I18N`` 1488 1489 .. setting:: USE_THOUSAND_SEPARATOR 1490 1491 USE_THOUSAND_SEPARATOR 1492 ---------------------- 1493 1494 Default ``False`` 1495 1496 A boolean that specifies wheter to display numbers using a thousand separator. 1497 If this is set to ``True``, Django will use values from ``THOUSAND_SEPARATOR`` 1498 and ``NUMBER_GROUPING`` from current locale, to format the number. 1499 ``USE_FORMAT_I18N`` must be set to ``True``, in order to format numbers. 1500 1501 See also ``THOUSAND_SEPARATOR`` and ``NUMBER_GROUPING``. 1502 1313 1503 .. setting:: YEAR_MONTH_FORMAT 1314 1504 1315 1505 YEAR_MONTH_FORMAT -
docs/ref/templates/builtins.txt
diff --git a/docs/ref/templates/builtins.txt b/docs/ref/templates/builtins.txt index bf2d9e8..29ccfef 100644
a b If ``value`` is ``"String with spaces"``, the output will be ``"Stringwithspaces 1047 1047 date 1048 1048 ~~~~ 1049 1049 1050 Formats a date according to the given format (same as the `now`_ tag). 1050 Formats a date according to the given format. 1051 1052 Given format can be one of the predefined ones ``DATE_FORMAT``, ``DATETIME_FORMAT``, 1053 ``SHORT_DATE_FORMAT`` or ``SHORT_DATETIME_FORMAT``, or a custom format, same as the 1054 `now`_ tag. Note that prefedined formats vary depending on the current locale. 1051 1055 1052 1056 For example:: 1053 1057 … … When used without a format string:: 1062 1066 {{ value|date }} 1063 1067 1064 1068 ...the formatting string defined in the :setting:`DATE_FORMAT` setting will be 1065 used .1069 used, without applying any localization. 1066 1070 1067 1071 .. templatefilter:: default 1068 1072 … … output will be ``"Joel is a slug"``. 1610 1614 time 1611 1615 ~~~~ 1612 1616 1613 Formats a time according to the given format (same as the `now`_ tag). 1617 Formats a time according to the given format. 1618 1619 Given format can be the predefined one ``TIME_FORMAT``, or a custom format, 1620 same as the `now`_ tag. Note that the predefined format is locale depending. 1621 1614 1622 The time filter will only accept parameters in the format string that relate 1615 1623 to the time of day, not the date (for obvious reasons). If you need to 1616 1624 format a date, use the `date`_ filter. … … When used without a format string:: 1627 1635 {{ value|time }} 1628 1636 1629 1637 ...the formatting string defined in the :setting:`TIME_FORMAT` setting will be 1630 used .1638 used, without aplying any localization. 1631 1639 1632 1640 .. templatefilter:: timesince 1633 1641 -
docs/topics/i18n.txt
diff --git a/docs/topics/i18n.txt b/docs/topics/i18n.txt index c5f4ab6..0fd2663 100644
a b 4 4 Internationalization 5 5 ==================== 6 6 7 Django has full support for internationalization of text in code and templates. 8 Here's how it works. 7 Django has full support for internationalization, including translation 8 capabilities of text in code and templates, and format localization for 9 dates and numbers. Here's how it works. 9 10 10 11 Overview 11 12 ======== 12 13 13 14 The goal of internationalization is to allow a single Web application to offer 14 its content and functionality in multiple languages .15 its content and functionality in multiple languages and locales. 15 16 16 You, the Django developer, can accomplish this goal by adding a minimal amount 17 of hooks to your Python code and templates. These hooks are called 18 **translation strings**. They tell Django: "This text should be translated into 19 t he end user's language, if a translation for this text is available in that20 language."17 For text translation, you, the Django developer, can accomplish this goal by 18 adding a minimal amount of hooks to your Python code and templates. These hooks 19 are called **translation strings**. They tell Django: "This text should be 20 translated into the end user's language, if a translation for this text is 21 available in that language." 21 22 22 23 Django takes care of using these hooks to translate Web apps, on the fly, 23 24 according to users' language preferences. … … Essentially, Django does two things: 29 30 * It uses these hooks to translate Web apps for particular users according 30 31 to their language preferences. 31 32 33 For format localization, it's just necessary to set 34 :setting:`USE_FORMAT_I18N = True <USE_FORMAT_I18N>` in your settings file. If 35 :settings:`USE_FORMAT_I18N` is set to ``True``, then Django will display 36 numbers and dates in the format of the current locale. That includes field 37 representation on templates, and allowed input formats on the admin. 38 32 39 If you don't need internationalization in your app 33 40 ================================================== 34 41 … … have been found to not support this command. Do not attempt to use Django 1074 1081 translation utilities with a ``gettext`` package if the command ``xgettext 1075 1082 --version`` entered at a Windows command prompt causes a popup window saying 1076 1083 "xgettext.exe has generated errors and will be closed by Windows". 1084 1085 Format localization 1086 =================== 1087 1088 Django's formatting system is disabled by default. To enable it, it's necessay 1089 to set :setting:`USE_FORMAT_I18N = True <USE_FORMAT_I18N>` in your settings 1090 file. Note that :setting:`USE_FORMAT_I18N` requires `USE_I18N` to be ``True``. 1091 1092 When using Django's formatting system, dates and numbers on templates will be 1093 displayed using the format specified for the current locale. That means, two 1094 users accessing the same content, but in different language, will see date and 1095 number fields formatted in different ways, depending on the format for their 1096 current locale. 1097 1098 Django will also use localized formats when parsing data in forms. That means 1099 Django uses different formats for different locales when guessing the format 1100 used by the user when inputting data on forms. Note that Django uses different 1101 formats for displaying data, and for parsing it. 1102 1103 Creating custom format files 1104 ---------------------------- 1105 1106 Django provides format definitions for many locales, but sometimes you could 1107 want to create your own ones, because a format files doesn't exist for your 1108 locale, or because you want to overwrite some of the values. 1109 1110 To use custom formats, first thing to do, is to specify the path where you'll 1111 place format files. To do that, just set :setting:`FORMAT_MODULE_PATH` setting 1112 to the the path (in the format ``'foo.bar.baz``) where format files will 1113 exists. 1114 1115 Files are not placed directly in this directory, but in a directory named as 1116 the locale. File must be named ``formats.py``. 1117 1118 For customazing English formats, a structure like this would be needed:: 1119 1120 mysite/ 1121 formats/ 1122 __init__.py 1123 en/ 1124 __init__.py 1125 formats.py 1126 1127 where :file:`formats.py` contains custom format definitions. For example:: 1128 1129 THOUSAND_SEPARATOR = ' ' 1130 1131 to use a space as thousand separator, instead of the default for English, 1132 comma. 1133 -
deleted file tests/regressiontests/i18n/misc.py
diff --git a/tests/regressiontests/i18n/misc.py b/tests/regressiontests/i18n/misc.py deleted file mode 100644 index f8f35ad..0000000
+ - 1 import sys2 3 tests = """4 >>> from django.utils.translation.trans_real import parse_accept_lang_header5 >>> p = parse_accept_lang_header6 7 #8 # Testing HTTP header parsing. First, we test that we can parse the values9 # according to the spec (and that we extract all the pieces in the right order).10 #11 12 Good headers.13 >>> p('de')14 [('de', 1.0)]15 >>> p('en-AU')16 [('en-AU', 1.0)]17 >>> p('*;q=1.00')18 [('*', 1.0)]19 >>> p('en-AU;q=0.123')20 [('en-AU', 0.123)]21 >>> p('en-au;q=0.1')22 [('en-au', 0.10000000000000001)]23 >>> p('en-au;q=1.0')24 [('en-au', 1.0)]25 >>> p('da, en-gb;q=0.25, en;q=0.5')26 [('da', 1.0), ('en', 0.5), ('en-gb', 0.25)]27 >>> p('en-au-xx')28 [('en-au-xx', 1.0)]29 >>> p('de,en-au;q=0.75,en-us;q=0.5,en;q=0.25,es;q=0.125,fa;q=0.125')30 [('de', 1.0), ('en-au', 0.75), ('en-us', 0.5), ('en', 0.25), ('es', 0.125), ('fa', 0.125)]31 >>> p('*')32 [('*', 1.0)]33 >>> p('de;q=0.')34 [('de', 1.0)]35 >>> p('')36 []37 38 Bad headers; should always return [].39 >>> p('en-gb;q=1.0000')40 []41 >>> p('en;q=0.1234')42 []43 >>> p('en;q=.2')44 []45 >>> p('abcdefghi-au')46 []47 >>> p('**')48 []49 >>> p('en,,gb')50 []51 >>> p('en-au;q=0.1.0')52 []53 >>> p('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXZ,en')54 []55 >>> p('da, en-gb;q=0.8, en;q=0.7,#')56 []57 >>> p('de;q=2.0')58 []59 >>> p('de;q=0.a')60 []61 >>> p('')62 []63 64 #65 # Now test that we parse a literal HTTP header correctly.66 #67 68 >>> from django.utils.translation.trans_real import get_language_from_request69 >>> g = get_language_from_request70 >>> from django.http import HttpRequest71 >>> r = HttpRequest72 >>> r.COOKIES = {}73 74 These tests assumes the es, es_AR, pt and pt_BR translations exit in the Django75 source tree.76 >>> r.META = {'HTTP_ACCEPT_LANGUAGE': 'pt-br'}77 >>> g(r)78 'pt-br'79 >>> r.META = {'HTTP_ACCEPT_LANGUAGE': 'pt'}80 >>> g(r)81 'pt'82 >>> r.META = {'HTTP_ACCEPT_LANGUAGE': 'es,de'}83 >>> g(r)84 'es'85 >>> r.META = {'HTTP_ACCEPT_LANGUAGE': 'es-ar,de'}86 >>> g(r)87 'es-ar'88 """89 90 # Python 2.3 and 2.4 return slightly different results for completely bogus91 # locales, so we omit this test for that anything below 2.4. It's relatively92 # harmless in any cases (GIGO). This also means this won't be executed on93 # Jython currently, but life's like that sometimes. (On those platforms,94 # passing in a truly bogus locale will get you the default locale back.)95 if sys.version_info >= (2, 5):96 tests += """97 This test assumes there won't be a Django translation to a US variation98 of the Spanish language, a safe assumption. When the user sets it99 as the preferred language, the main 'es' translation should be selected100 instead.101 >>> r.META = {'HTTP_ACCEPT_LANGUAGE': 'es-us'}102 >>> g(r)103 'es'104 """105 106 tests += """107 This tests the following scenario: there isn't a main language (zh)108 translation of Django but there is a translation to variation (zh_CN)109 the user sets zh-cn as the preferred language, it should be selected by110 Django without falling back nor ignoring it.111 >>> r.META = {'HTTP_ACCEPT_LANGUAGE': 'zh-cn,de'}112 >>> g(r)113 'zh-cn'114 """ -
tests/regressiontests/i18n/tests.py
diff --git a/tests/regressiontests/i18n/tests.py b/tests/regressiontests/i18n/tests.py index 94e792c..67d1082 100644
a b 1 # coding: utf-8 2 import misc 3 4 regressions = ur""" 5 Format string interpolation should work with *_lazy objects. 6 7 >>> from django.utils.translation import ugettext, ugettext_lazy, activate, deactivate, gettext_lazy 8 >>> s = ugettext_lazy('Add %(name)s') 9 >>> d = {'name': 'Ringo'} 10 >>> s % d 11 u'Add Ringo' 12 >>> activate('de') 13 >>> s % d 14 u'Ringo hinzuf\xfcgen' 15 >>> activate('pl') 16 >>> s % d 17 u'Dodaj Ringo' 18 >>> deactivate() 19 20 It should be possible to compare *_lazy objects. 21 22 >>> s1 = ugettext_lazy('Add %(name)s') 23 >>> s == s1 24 True 25 >>> s2 = gettext_lazy('Add %(name)s') 26 >>> s3 = gettext_lazy('Add %(name)s') 27 >>> s2 == s3 28 True 29 >>> s == s2 30 True 31 >>> s4 = ugettext_lazy('Some other string') 32 >>> s == s4 33 False 34 35 unicode(string_concat(...)) should not raise a TypeError - #4796 36 37 >>> import django.utils.translation 38 >>> reload(django.utils.translation) 39 <module 'django.utils.translation' from ...> 40 >>> unicode(django.utils.translation.string_concat("dja", "ngo")) 41 u'django' 42 43 Translating a string requiring no auto-escaping shouldn't change the "safe" 44 status. 45 46 >>> from django.utils.safestring import mark_safe, SafeString 47 >>> s = mark_safe('Password') 48 >>> type(s) 49 <class 'django.utils.safestring.SafeString'> 50 >>> activate('de') 51 >>> type(ugettext(s)) 52 <class 'django.utils.safestring.SafeUnicode'> 53 >>> deactivate() 54 55 >>> SafeString('a') + s 56 'aPassword' 57 >>> s + SafeString('a') 58 'Passworda' 59 >>> s + mark_safe('a') 60 'Passworda' 61 >>> mark_safe('a') + s 62 'aPassword' 63 >>> mark_safe('a') + mark_safe('s') 64 'as' 65 >>> print s 66 Password 67 """ 68 69 __test__ = { 70 'regressions': regressions, 71 'misc': misc.tests, 72 } 1 import sys 2 from django.test import TestCase, client 3 from django.utils.translation import ugettext, ugettext_lazy, activate, deactivate, gettext_lazy 4 5 class TranslationTests(TestCase): 6 7 def test_lazy_objects(self): 8 """ 9 Format string interpolation should work with *_lazy objects. 10 """ 11 s = ugettext_lazy('Add %(name)s') 12 d = {'name': 'Ringo'} 13 self.assertEqual(u'Add Ringo', s % d) 14 activate('de') 15 self.assertEqual(u'Ringo hinzuf\xfcgen', s % d) 16 activate('pl') 17 self.assertEqual(u'Dodaj Ringo', s % d) 18 deactivate() 19 20 # It should be possible to compare *_lazy objects. 21 s1 = ugettext_lazy('Add %(name)s') 22 self.assertEqual(True, s == s1) 23 s2 = gettext_lazy('Add %(name)s') 24 s3 = gettext_lazy('Add %(name)s') 25 self.assertEqual(True, s2 == s3) 26 self.assertEqual(True, s == s2) 27 s4 = ugettext_lazy('Some other string') 28 self.assertEqual(False, s == s4) 29 30 def test_string_concat(self): 31 """ 32 unicode(string_concat(...)) should not raise a TypeError - #4796 33 """ 34 import django.utils.translation 35 self.assertEqual(django.utils.translation, reload(django.utils.translation)) 36 self.assertEqual(u'django', unicode(django.utils.translation.string_concat("dja", "ngo"))) 37 38 def test_safe_status(self): 39 """ 40 Translating a string requiring no auto-escaping shouldn't change the "safe" status. 41 """ 42 from django.utils.safestring import mark_safe, SafeString, SafeUnicode 43 s = mark_safe('Password') 44 self.assertEqual(SafeString, type(s)) 45 activate('de') 46 self.assertEqual(SafeUnicode, type(ugettext(s))) 47 deactivate() 48 self.assertEqual('aPassword', SafeString('a') + s) 49 self.assertEqual('Passworda', s + SafeString('a')) 50 self.assertEqual('Passworda', s + mark_safe('a')) 51 self.assertEqual('aPassword', mark_safe('a') + s) 52 self.assertEqual('as', mark_safe('a') + mark_safe('s')) 53 #self.assertEqual(Password, print s) 54 55 def test_maclines(self): 56 """ 57 Translations on files with mac or dos end of lines will be converted 58 to unix eof in .po catalogs, and they have to match when retrieved 59 """ 60 from django.utils.translation.trans_real import translation 61 ca_translation = translation('ca') 62 ca_translation._catalog[u'Mac\nEOF\n'] = u'Catalan Mac\nEOF\n' 63 ca_translation._catalog[u'Win\nEOF\n'] = u'Catalan Win\nEOF\n' 64 activate('ca') 65 self.assertEqual(u'Catalan Mac\nEOF\n', ugettext(u'Mac\rEOF\r')) 66 self.assertEqual(u'Catalan Win\nEOF\n', ugettext(u'Win\r\nEOF\r\n')) 67 deactivate() 68 69 def test_dates_and_numbers(self): 70 """ 71 Localization of dates and numbers 72 """ 73 import datetime 74 import decimal 75 from django.conf import settings 76 from django.utils.formats import getformat, date_format, number_format, localize 77 from django.utils.numberformat import format 78 from django import template, forms 79 from django.forms.extras import SelectDateWidget 80 81 old_use_i18n = settings.USE_I18N 82 old_use_format_i18n = settings.USE_FORMAT_I18N 83 old_use_thousand_separator = settings.USE_THOUSAND_SEPARATOR 84 85 n = decimal.Decimal('66666.666') 86 f = 99999.999 87 d = datetime.date(2009, 12, 31) 88 dt = datetime.datetime(2009, 12, 31, 20, 50) 89 ctxt = template.Context({'n': n, 'd': d, 'dt': dt, 'f': f}) 90 91 # Locale independent 92 93 class I18nForm(forms.Form): 94 decimal_field = forms.DecimalField() 95 float_field = forms.FloatField() 96 date_field = forms.DateField() 97 datetime_field = forms.DateTimeField() 98 time_field = forms.TimeField() 99 100 class SelectDateForm(forms.Form): 101 date_field = forms.DateField(widget=SelectDateWidget) 102 103 settings.USE_FORMAT_I18N = True 104 settings.USE_THOUSAND_SEPARATOR = False 105 self.assertEqual(u'66666.66', format(n, decimal_sep='.', decimal_pos=2, grouping=3, thousand_sep=',')) 106 self.assertEqual(u'66666A6', format(n, decimal_sep='A', decimal_pos=1, grouping=1, thousand_sep='B')) 107 108 settings.USE_THOUSAND_SEPARATOR = True 109 self.assertEqual(u'66,666.66', format(n, decimal_sep='.', decimal_pos=2, grouping=3, thousand_sep=',')) 110 self.assertEqual(u'6B6B6B6B6A6', format(n, decimal_sep='A', decimal_pos=1, grouping=1, thousand_sep='B')) 111 self.assertEqual(u'-66666.6', format(-66666.666, decimal_sep='.', decimal_pos=1)) 112 self.assertEqual(u'-66666.0', format(int('-66666'), decimal_sep='.', decimal_pos=1)) 113 114 # Catalan locale with format i18n disabled translations will be used, but not formats 115 116 settings.USE_FORMAT_I18N = False 117 activate('ca') 118 self.assertEqual('N j, Y', getformat('DATE_FORMAT')) 119 self.assertEqual(0, getformat('FIRST_DAY_OF_WEEK')) 120 self.assertEqual('.', getformat('DECIMAL_SEPARATOR')) 121 self.assertEqual(u'des. 31, 2009', date_format(d)) 122 self.assertEqual(u'desembre 2009', date_format(d, 'YEAR_MONTH_FORMAT')) 123 self.assertEqual(u'12/31/2009 8:50 p.m.', date_format(dt, 'SHORT_DATETIME_FORMAT')) 124 self.assertEqual('No localizable', localize('No localizable')) 125 self.assertEqual(decimal.Decimal('66666.666'), localize(n)) 126 self.assertEqual(99999.999, localize(f)) 127 self.assertEqual(datetime.date(2009, 12, 31), localize(d)) 128 self.assertEqual(datetime.datetime(2009, 12, 31, 20, 50), localize(dt)) 129 self.assertEqual(u'66666.666', template.Template('{{ n }}').render(ctxt)) 130 self.assertEqual(u'99999.999', template.Template('{{ f }}').render(ctxt)) 131 self.assertEqual(u'2009-12-31', template.Template('{{ d }}').render(ctxt)) 132 self.assertEqual(u'2009-12-31 20:50:00', template.Template('{{ dt }}').render(ctxt)) 133 self.assertEqual(u'66666.67', template.Template('{{ n|floatformat:2 }}').render(ctxt)) 134 self.assertEqual(u'100000.0', template.Template('{{ f|floatformat }}').render(ctxt)) 135 self.assertEqual(u'12/31/2009', template.Template('{{ d|date:"SHORT_DATE_FORMAT" }}').render(ctxt)) 136 self.assertEqual(u'12/31/2009 8:50 p.m.', template.Template('{{ dt|date:"SHORT_DATETIME_FORMAT" }}').render(ctxt)) 137 138 form = I18nForm({ 139 'decimal_field': u'66666,666', 140 'float_field': u'99999,999', 141 'date_field': u'31/12/2009', 142 'datetime_field': u'31/12/2009 20:50', 143 'time_field': u'20:50' 144 }) 145 self.assertEqual(False, form.is_valid()) 146 self.assertEqual([u'Introdu\xefu un n\xfamero.'], form.errors['float_field']) 147 self.assertEqual([u'Introdu\xefu un n\xfamero.'], form.errors['decimal_field']) 148 self.assertEqual([u'Introdu\xefu una data v\xe0lida.'], form.errors['date_field']) 149 self.assertEqual([u'Introdu\xefu una data/hora v\xe0lides.'], form.errors['datetime_field']) 150 151 152 form2 = SelectDateForm({ 153 'date_field_month': u'12', 154 'date_field_day': u'31', 155 'date_field_year': u'2009' 156 }) 157 self.assertEqual(True, form2.is_valid()) 158 self.assertEqual(datetime.date(2009, 12, 31), form2.cleaned_data['date_field']) 159 self.assertEqual(u'<select name="mydate_month" id="id_mydate_month">\n<option value="1">gener</option>\n<option value="2">febrer</option>\n<option value="3">mar\xe7</option>\n<option value="4">abril</option>\n<option value="5">maig</option>\n<option value="6">juny</option>\n<option value="7">juliol</option>\n<option value="8">agost</option>\n<option value="9">setembre</option>\n<option value="10">octubre</option>\n<option value="11">novembre</option>\n<option value="12" selected="selected">desembre</option>\n</select>\n<select name="mydate_day" id="id_mydate_day">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31" selected="selected">31</option>\n</select>\n<select name="mydate_year" id="id_mydate_year">\n<option value="2009" selected="selected">2009</option>\n<option value="2010">2010</option>\n<option value="2011">2011</option>\n<option value="2012">2012</option>\n<option value="2013">2013</option>\n<option value="2014">2014</option>\n<option value="2015">2015</option>\n<option value="2016">2016</option>\n<option value="2017">2017</option>\n<option value="2018">2018</option>\n</select>', SelectDateWidget().render('mydate', datetime.date(2009, 12, 31))) 160 161 # Catalan locale 162 163 settings.USE_FORMAT_I18N = True 164 activate('ca') 165 self.assertEqual('j \de F \de Y', getformat('DATE_FORMAT')) 166 self.assertEqual(1, getformat('FIRST_DAY_OF_WEEK')) 167 self.assertEqual(',', getformat('DECIMAL_SEPARATOR')) 168 self.assertEqual(u'31 de desembre de 2009', date_format(d)) 169 self.assertEqual(u'desembre del 2009', date_format(d, 'YEAR_MONTH_FORMAT')) 170 self.assertEqual(u'31/12/2009 20:50', date_format(dt, 'SHORT_DATETIME_FORMAT')) 171 self.assertEqual('No localizable', localize('No localizable')) 172 173 settings.USE_THOUSAND_SEPARATOR = True 174 self.assertEqual(u'66.666,666', localize(n)) 175 self.assertEqual(u'99.999,999', localize(f)) 176 177 settings.USE_THOUSAND_SEPARATOR = False 178 self.assertEqual(u'66666,666', localize(n)) 179 self.assertEqual(u'99999,999', localize(f)) 180 self.assertEqual(u'31 de desembre de 2009', localize(d)) 181 self.assertEqual(u'31 de desembre de 2009 a les 20:50', localize(dt)) 182 183 settings.USE_THOUSAND_SEPARATOR = True 184 self.assertEqual(u'66.666,666', template.Template('{{ n }}').render(ctxt)) 185 self.assertEqual(u'99.999,999', template.Template('{{ f }}').render(ctxt)) 186 187 settings.USE_THOUSAND_SEPARATOR = False 188 self.assertEqual(u'66666,666', template.Template('{{ n }}').render(ctxt)) 189 self.assertEqual(u'99999,999', template.Template('{{ f }}').render(ctxt)) 190 self.assertEqual(u'31 de desembre de 2009', template.Template('{{ d }}').render(ctxt)) 191 self.assertEqual(u'31 de desembre de 2009 a les 20:50', template.Template('{{ dt }}').render(ctxt)) 192 self.assertEqual(u'66666,67', template.Template('{{ n|floatformat:2 }}').render(ctxt)) 193 self.assertEqual(u'100000,0', template.Template('{{ f|floatformat }}').render(ctxt)) 194 self.assertEqual(u'31/12/2009', template.Template('{{ d|date:"SHORT_DATE_FORMAT" }}').render(ctxt)) 195 self.assertEqual(u'31/12/2009 20:50', template.Template('{{ dt|date:"SHORT_DATETIME_FORMAT" }}').render(ctxt)) 196 197 form3 = I18nForm({ 198 'decimal_field': u'66666,666', 199 'float_field': u'99999,999', 200 'date_field': u'31/12/2009', 201 'datetime_field': u'31/12/2009 20:50', 202 'time_field': u'20:50' 203 }) 204 self.assertEqual(True, form3.is_valid()) 205 self.assertEqual(decimal.Decimal('66666.666'), form3.cleaned_data['decimal_field']) 206 self.assertEqual(99999.999, form3.cleaned_data['float_field']) 207 self.assertEqual(datetime.date(2009, 12, 31), form3.cleaned_data['date_field']) 208 self.assertEqual(datetime.datetime(2009, 12, 31, 20, 50), form3.cleaned_data['datetime_field']) 209 self.assertEqual(datetime.time(20, 50), form3.cleaned_data['time_field']) 210 211 form4 = SelectDateForm({ 212 'date_field_month': u'12', 213 'date_field_day': u'31', 214 'date_field_year': u'2009' 215 }) 216 self.assertEqual(True, form4.is_valid()) 217 self.assertEqual(datetime.date(2009, 12, 31), form4.cleaned_data['date_field']) 218 self.assertEqual(u'<select name="mydate_day" id="id_mydate_day">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31" selected="selected">31</option>\n</select>\n<select name="mydate_month" id="id_mydate_month">\n<option value="1">gener</option>\n<option value="2">febrer</option>\n<option value="3">mar\xe7</option>\n<option value="4">abril</option>\n<option value="5">maig</option>\n<option value="6">juny</option>\n<option value="7">juliol</option>\n<option value="8">agost</option>\n<option value="9">setembre</option>\n<option value="10">octubre</option>\n<option value="11">novembre</option>\n<option value="12" selected="selected">desembre</option>\n</select>\n<select name="mydate_year" id="id_mydate_year">\n<option value="2009" selected="selected">2009</option>\n<option value="2010">2010</option>\n<option value="2011">2011</option>\n<option value="2012">2012</option>\n<option value="2013">2013</option>\n<option value="2014">2014</option>\n<option value="2015">2015</option>\n<option value="2016">2016</option>\n<option value="2017">2017</option>\n<option value="2018">2018</option>\n</select>', SelectDateWidget().render('mydate', datetime.date(2009, 12, 31))) 219 220 # English locale 221 222 settings.USE_FORMAT_I18N = True 223 activate('en') 224 self.assertEqual('N j, Y', getformat('DATE_FORMAT')) 225 self.assertEqual(0, getformat('FIRST_DAY_OF_WEEK')) 226 self.assertEqual('.', getformat('DECIMAL_SEPARATOR')) 227 self.assertEqual(u'Dec. 31, 2009', date_format(d)) 228 self.assertEqual(u'December 2009', date_format(d, 'YEAR_MONTH_FORMAT')) 229 self.assertEqual(u'12/31/2009 8:50 p.m.', date_format(dt, 'SHORT_DATETIME_FORMAT')) 230 self.assertEqual('No localizable', localize('No localizable')) 231 232 settings.USE_THOUSAND_SEPARATOR = True 233 self.assertEqual(u'66,666.666', localize(n)) 234 self.assertEqual(u'99,999.999', localize(f)) 235 236 settings.USE_THOUSAND_SEPARATOR = False 237 self.assertEqual(u'66666.666', localize(n)) 238 self.assertEqual(u'99999.999', localize(f)) 239 self.assertEqual(u'Dec. 31, 2009', localize(d)) 240 self.assertEqual(u'Dec. 31, 2009, 8:50 p.m.', localize(dt)) 241 242 settings.USE_THOUSAND_SEPARATOR = True 243 self.assertEqual(u'66,666.666', template.Template('{{ n }}').render(ctxt)) 244 self.assertEqual(u'99,999.999', template.Template('{{ f }}').render(ctxt)) 245 246 settings.USE_THOUSAND_SEPARATOR = False 247 self.assertEqual(u'66666.666', template.Template('{{ n }}').render(ctxt)) 248 self.assertEqual(u'99999.999', template.Template('{{ f }}').render(ctxt)) 249 self.assertEqual(u'Dec. 31, 2009', template.Template('{{ d }}').render(ctxt)) 250 self.assertEqual(u'Dec. 31, 2009, 8:50 p.m.', template.Template('{{ dt }}').render(ctxt)) 251 self.assertEqual(u'66666.67', template.Template('{{ n|floatformat:2 }}').render(ctxt)) 252 self.assertEqual(u'100000.0', template.Template('{{ f|floatformat }}').render(ctxt)) 253 self.assertEqual(u'12/31/2009', template.Template('{{ d|date:"SHORT_DATE_FORMAT" }}').render(ctxt)) 254 self.assertEqual(u'12/31/2009 8:50 p.m.', template.Template('{{ dt|date:"SHORT_DATETIME_FORMAT" }}').render(ctxt)) 255 256 form5 = I18nForm({ 257 'decimal_field': u'66666.666', 258 'float_field': u'99999.999', 259 'date_field': u'12/31/2009', 260 'datetime_field': u'12/31/2009 20:50', 261 'time_field': u'20:50' 262 }) 263 self.assertEqual(True, form5.is_valid()) 264 self.assertEqual(decimal.Decimal('66666.666'), form5.cleaned_data['decimal_field']) 265 self.assertEqual(99999.999, form5.cleaned_data['float_field']) 266 self.assertEqual(datetime.date(2009, 12, 31), form5.cleaned_data['date_field']) 267 self.assertEqual(datetime.datetime(2009, 12, 31, 20, 50), form5.cleaned_data['datetime_field']) 268 self.assertEqual(datetime.time(20, 50), form5.cleaned_data['time_field']) 269 270 form6 = SelectDateForm({ 271 'date_field_month': u'12', 272 'date_field_day': u'31', 273 'date_field_year': u'2009' 274 }) 275 self.assertEqual(True, form6.is_valid()) 276 self.assertEqual(datetime.date(2009, 12, 31), form6.cleaned_data['date_field']) 277 self.assertEqual(u'<select name="mydate_month" id="id_mydate_month">\n<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6">June</option>\n<option value="7">July</option>\n<option value="8">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12" selected="selected">December</option>\n</select>\n<select name="mydate_day" id="id_mydate_day">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31" selected="selected">31</option>\n</select>\n<select name="mydate_year" id="id_mydate_year">\n<option value="2009" selected="selected">2009</option>\n<option value="2010">2010</option>\n<option value="2011">2011</option>\n<option value="2012">2012</option>\n<option value="2013">2013</option>\n<option value="2014">2014</option>\n<option value="2015">2015</option>\n<option value="2016">2016</option>\n<option value="2017">2017</option>\n<option value="2018">2018</option>\n</select>', SelectDateWidget().render('mydate', datetime.date(2009, 12, 31))) 278 279 # Restore defaults 280 281 settings.USE_I18N = old_use_i18n 282 settings.USE_FORMAT_I18N = old_use_format_i18n 283 settings.USE_THOUSAND_SEPARATOR = old_use_thousand_separator 284 deactivate() 285 286 287 class MiscTests(TestCase): 288 289 def test_parse_spec_http_header(self): 290 """ 291 Testing HTTP header parsing. First, we test that we can parse the 292 values according to the spec (and that we extract all the pieces in 293 the right order). 294 """ 295 from django.utils.translation.trans_real import parse_accept_lang_header 296 p = parse_accept_lang_header 297 # Good headers. 298 self.assertEqual([('de', 1.0)], p('de')) 299 self.assertEqual([('en-AU', 1.0)], p('en-AU')) 300 self.assertEqual([('*', 1.0)], p('*;q=1.00')) 301 self.assertEqual([('en-AU', 0.123)], p('en-AU;q=0.123')) 302 self.assertEqual([('en-au', 0.10000000000000001)], p('en-au;q=0.1')) 303 self.assertEqual([('en-au', 1.0)], p('en-au;q=1.0')) 304 self.assertEqual([('da', 1.0), ('en', 0.5), ('en-gb', 0.25)], p('da, en-gb;q=0.25, en;q=0.5')) 305 self.assertEqual([('en-au-xx', 1.0)], p('en-au-xx')) 306 self.assertEqual([('de', 1.0), ('en-au', 0.75), ('en-us', 0.5), ('en', 0.25), ('es', 0.125), ('fa', 0.125)], p('de,en-au;q=0.75,en-us;q=0.5,en;q=0.25,es;q=0.125,fa;q=0.125')) 307 self.assertEqual([('*', 1.0)], p('*')) 308 self.assertEqual([('de', 1.0)], p('de;q=0.')) 309 self.assertEqual([], p('')) 310 311 # Bad headers; should always return []. 312 self.assertEqual([], p('en-gb;q=1.0000')) 313 self.assertEqual([], p('en;q=0.1234')) 314 self.assertEqual([], p('en;q=.2')) 315 self.assertEqual([], p('abcdefghi-au')) 316 self.assertEqual([], p('**')) 317 self.assertEqual([], p('en,,gb')) 318 self.assertEqual([], p('en-au;q=0.1.0')) 319 self.assertEqual([], p('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXZ,en')) 320 self.assertEqual([], p('da, en-gb;q=0.8, en;q=0.7,#')) 321 self.assertEqual([], p('de;q=2.0')) 322 self.assertEqual([], p('de;q=0.a')) 323 self.assertEqual([], p('')) 324 325 def test_parse_literal_http_header(self): 326 """ 327 Now test that we parse a literal HTTP header correctly. 328 """ 329 from django.utils.translation.trans_real import get_language_from_request 330 g = get_language_from_request 331 from django.http import HttpRequest 332 r = HttpRequest 333 r.COOKIES = {} 334 r.META = {'HTTP_ACCEPT_LANGUAGE': 'pt-br'} 335 self.assertEqual('pt-br', g(r)) 336 337 r.META = {'HTTP_ACCEPT_LANGUAGE': 'pt'} 338 self.assertEqual('pt', g(r)) 339 340 r.META = {'HTTP_ACCEPT_LANGUAGE': 'es,de'} 341 self.assertEqual('es', g(r)) 342 343 r.META = {'HTTP_ACCEPT_LANGUAGE': 'es-ar,de'} 344 self.assertEqual('es-ar', g(r)) 345 346 # Python 2.3 and 2.4 return slightly different results for completely 347 # bogus locales, so we omit this test for that anything below 2.4. 348 # It's relatively harmless in any cases (GIGO). This also means this 349 # won't be executed on Jython currently, but life's like that 350 # sometimes. (On those platforms, passing in a truly bogus locale 351 # will get you the default locale back.) 352 if sys.version_info >= (2, 5): 353 # This test assumes there won't be a Django translation to a US 354 # variation of the Spanish language, a safe assumption. When the 355 # user sets it as the preferred language, the main 'es' 356 # translation should be selected instead. 357 r.META = {'HTTP_ACCEPT_LANGUAGE': 'es-us'} 358 self.assertEqual(g(r), 'es') 359 360 # This tests the following scenario: there isn't a main language (zh) 361 # translation of Django but there is a translation to variation (zh_CN) 362 # the user sets zh-cn as the preferred language, it should be selected 363 # by Django without falling back nor ignoring it. 364 r.META = {'HTTP_ACCEPT_LANGUAGE': 'zh-cn,de'} 365 self.assertEqual(g(r), 'zh-cn')