diff --git a/django/utils/translation/__init__.py b/django/utils/translation/__init__.py index e44b556c166..992e1c96646 100644 --- a/django/utils/translation/__init__.py +++ b/django/utils/translation/__init__.py @@ -1,6 +1,7 @@ """ Internationalization support. """ +import warnings from os import path from django.utils.encoding import force_unicode @@ -41,17 +42,20 @@ class Trans(object): from django.conf import settings if settings.USE_I18N: from django.utils.translation import trans_real as trans - + # Make sure the project's locale dir isn't in LOCALE_PATHS if settings.SETTINGS_MODULE is not None: - import warnings parts = settings.SETTINGS_MODULE.split('.') project = import_module(parts[0]) - if path.isdir(path.join(path.dirname(project.__file__), 'locale')): - warnings.warn( - "Translations in the project directory aren't supported anymore. Use the LOCALE_PATHS setting instead.", - PendingDeprecationWarning - ) - + project_locale_path = path.normpath( + path.join(path.dirname(project.__file__), 'locale')) + normalized_locale_paths = [path.normpath(locale_path) + for locale_path in settings.LOCALE_PATHS] + if (path.isdir(project_locale_path) and + not project_locale_path in normalized_locale_paths): + warnings.warn("Translations in the project directory " + "aren't supported anymore. Use the " + "LOCALE_PATHS setting instead.", + PendingDeprecationWarning) else: from django.utils.translation import trans_null as trans setattr(self, real_name, getattr(trans, real_name)) diff --git a/tests/regressiontests/i18n/test_warnings.py b/tests/regressiontests/i18n/test_warnings.py new file mode 100644 index 00000000000..519749252f8 --- /dev/null +++ b/tests/regressiontests/i18n/test_warnings.py @@ -0,0 +1,32 @@ +from os.path import join, normpath, abspath, dirname +import warnings + +import django +from django.conf import settings +from django.test.utils import get_warnings_state, restore_warnings_state +from django.utils.unittest import TestCase + + +class DeprecationWarningTests(TestCase): + + def setUp(self): + self.warning_state = get_warnings_state() + self.old_settings_module = settings.SETTINGS_MODULE + settings.SETTINGS_MODULE = 'regressiontests' + self.old_locale_paths = settings.LOCALE_PATHS + + def tearDown(self): + restore_warnings_state(self.warning_state) + settings.SETTINGS_MODULE = self.old_settings_module + settings.LOCALE_PATHS = self.old_locale_paths + + def test_no_warn_if_project_and_locale_paths_overlap(self): + """Test that PendingDeprecationWarning isn't generated when a deprecated project level locale/ subdir is also included in LOCALE_PATHS.""" + project_path = join(dirname(abspath(__file__)), '..') + settings.LOCALE_PATHS += (normpath(join(project_path, 'locale')),) + warnings.filterwarnings('error', "Translations in the project directory aren't supported anymore\. Use the LOCALE_PATHS setting instead\.", PendingDeprecationWarning) + reload(django.utils.translation) + try: + django.utils.translation.ugettext('Time') + except PendingDeprecationWarning: + self.fail("PendingDeprecationWarning shouldn't be raised when settings/project locale and a LOCALE_PATHS member point to the same file system location.") diff --git a/tests/regressiontests/i18n/tests.py b/tests/regressiontests/i18n/tests.py index c9dc1fb45f8..9a51b4139f1 100644 --- a/tests/regressiontests/i18n/tests.py +++ b/tests/regressiontests/i18n/tests.py @@ -24,6 +24,7 @@ from models import Company, TestModel from commands.tests import * +from test_warnings import DeprecationWarningTests class TranslationTests(TestCase):