From b41ebcf1b9454bf0905c69594fa2dd1af19e7a60 Mon Sep 17 00:00:00 2001 From: Ramiro Morales Date: Sat, 31 Mar 2012 22:24:24 +0000 Subject: [PATCH] Fixed #18040 -- Removed so-called project-level locale trees from the list of paths the translation loading process takes in account. Deprecated in Django 1.3. Removed completely for Django 1.5. Thanks Claude for the review. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17861 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/utils/translation/__init__.py | 18 ------------- django/utils/translation/trans_real.py | 12 --------- docs/topics/i18n/translation.txt | 24 ++--------------- tests/regressiontests/admin_scripts/tests.py | 10 ------- tests/regressiontests/i18n/tests.py | 24 ----------------- .../locale/de/LC_MESSAGES/django.mo | Bin 497 -> 0 bytes .../locale/de/LC_MESSAGES/django.po | 25 ------------------ tests/runtests.py | 2 +- 8 files changed, 3 insertions(+), 112 deletions(-) delete mode 100644 tests/regressiontests/locale/de/LC_MESSAGES/django.mo delete mode 100644 tests/regressiontests/locale/de/LC_MESSAGES/django.po diff --git a/django/utils/translation/__init__.py b/django/utils/translation/__init__.py index 02694067b3..ac062823a4 100644 --- a/django/utils/translation/__init__.py +++ b/django/utils/translation/__init__.py @@ -1,12 +1,8 @@ """ Internationalization support. """ -import warnings -from os import path - from django.utils.encoding import force_unicode from django.utils.functional import lazy -from django.utils.importlib import import_module __all__ = [ @@ -47,20 +43,6 @@ 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: - parts = settings.SETTINGS_MODULE.split('.') - project = import_module(parts[0]) - 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.", - DeprecationWarning) else: from django.utils.translation import trans_null as trans setattr(self, real_name, getattr(trans, real_name)) diff --git a/django/utils/translation/trans_real.py b/django/utils/translation/trans_real.py index 82072b1397..76c9bfc1ea 100644 --- a/django/utils/translation/trans_real.py +++ b/django/utils/translation/trans_real.py @@ -111,13 +111,6 @@ def translation(language): globalpath = os.path.join(os.path.dirname(sys.modules[settings.__module__].__file__), 'locale') - if settings.SETTINGS_MODULE is not None: - parts = settings.SETTINGS_MODULE.split('.') - project = import_module(parts[0]) - projectpath = os.path.join(os.path.dirname(project.__file__), 'locale') - else: - projectpath = None - def _fetch(lang, fallback=None): global _translations @@ -163,11 +156,6 @@ def translation(language): if os.path.isdir(apppath): res = _merge(apppath) - localepaths = [os.path.normpath(path) for path in settings.LOCALE_PATHS] - if (projectpath and os.path.isdir(projectpath) and - os.path.normpath(projectpath) not in localepaths): - res = _merge(projectpath) - for localepath in reversed(settings.LOCALE_PATHS): if os.path.isdir(localepath): res = _merge(localepath) diff --git a/docs/topics/i18n/translation.txt b/docs/topics/i18n/translation.txt index 6bb6a0c5e4..052109b72c 100644 --- a/docs/topics/i18n/translation.txt +++ b/docs/topics/i18n/translation.txt @@ -1503,18 +1503,9 @@ translations for the same literal: 2. Then, it looks for and uses if it exists a ``locale`` directory in each of the installed apps listed in :setting:`INSTALLED_APPS`. The ones appearing first have higher precedence than the ones appearing later. -3. Then, it looks for a ``locale`` directory in the project directory, or - more accurately, in the directory containing your settings file. -4. Finally, the Django-provided base translation in ``django/conf/locale`` +3. Finally, the Django-provided base translation in ``django/conf/locale`` is used as a fallback. -.. deprecated:: 1.3 - Lookup in the ``locale`` subdirectory of the directory containing your - settings file (item 3 above) is deprecated since the 1.3 release and will be - removed in Django 1.5. You can use the :setting:`LOCALE_PATHS` setting - instead, by listing the absolute filesystem path of such ``locale`` - directory in the setting value. - .. seealso:: The translations for literals included in JavaScript assets are looked up @@ -1527,25 +1518,14 @@ be named using :term:`locale name` notation. E.g. ``de``, ``pt_BR``, ``es_AR``, etc. This way, you can write applications that include their own translations, and -you can override base translations in your project path. Or, you can just build +you can override base translations in your project. Or, you can just build a big project out of several apps and put all translations into one big common message file specific to the project you are composing. The choice is yours. -.. note:: - - If you're using manually configured settings, as described in - :ref:`settings-without-django-settings-module`, the ``locale`` directory in - the project directory will not be examined, since Django loses the ability - to work out the location of the project directory. (Django normally uses the - location of the settings file to determine this, and a settings file doesn't - exist if you're manually configuring your settings.) - All message file repositories are structured the same way. They are: * All paths listed in :setting:`LOCALE_PATHS` in your settings file are searched for ``/LC_MESSAGES/django.(po|mo)`` -* ``$PROJECTPATH/locale//LC_MESSAGES/django.(po|mo)`` -- - deprecated, see above. * ``$APPPATH/locale//LC_MESSAGES/django.(po|mo)`` * ``$PYTHONPATH/django/conf/locale//LC_MESSAGES/django.(po|mo)`` diff --git a/tests/regressiontests/admin_scripts/tests.py b/tests/regressiontests/admin_scripts/tests.py index dd3b0b4385..68ebda064a 100644 --- a/tests/regressiontests/admin_scripts/tests.py +++ b/tests/regressiontests/admin_scripts/tests.py @@ -157,16 +157,6 @@ class AdminScriptTestCase(unittest.TestCase): def assertNoOutput(self, stream): "Utility assertion: assert that the given stream is empty" - # HACK: Under Windows, ignore warnings of the form: - # 'warning: Not loading directory '...\tests\regressiontests\locale': missing __init__.py' - # It has been impossible to filter them out using other means like: - # * Using warning.filterwarnings() (for the Python interpreter running the - # tests) and/or - # * Using -Wignore:... (for the python interpreter spawned in self.run_test()) - # Instead use a strategy copied from Mercurial's setup.py - if sys.platform == 'win32': - stream = [e for e in stream.splitlines() - if not e.startswith('warning: Not importing directory')] self.assertEqual(len(stream), 0, "Stream should be empty: actually contains '%s'" % stream) def assertOutput(self, stream, msg): diff --git a/tests/regressiontests/i18n/tests.py b/tests/regressiontests/i18n/tests.py index f0b4a61abb..faed4e55c7 100644 --- a/tests/regressiontests/i18n/tests.py +++ b/tests/regressiontests/i18n/tests.py @@ -40,7 +40,6 @@ from .patterns.tests import (URLRedirectWithoutTrailingSlashTests, URLTranslationTests, URLDisabledTests, URLTagTests, URLTestCaseBase, URLRedirectWithoutTrailingSlashSettingTests, URLNamespaceTests, URLPrefixTests, URLResponseTests, URLRedirectTests, PathUnusedTests) -from .test_warnings import DeprecationWarningTests here = os.path.dirname(os.path.abspath(__file__)) @@ -869,29 +868,6 @@ class LocalePathsResolutionOrderI18NTests(ResolutionOrderI18NTests): with self.settings(INSTALLED_APPS=extended_apps): self.assertUgettext('Time', 'LOCALE_PATHS') - def test_locale_paths_override_project_translation(self): - with self.settings(SETTINGS_MODULE='regressiontests'): - self.assertUgettext('Date/time', 'LOCALE_PATHS') - -class ProjectResolutionOrderI18NTests(ResolutionOrderI18NTests): - - def setUp(self): - self.old_settings_module = settings.SETTINGS_MODULE - settings.SETTINGS_MODULE = 'regressiontests' - super(ProjectResolutionOrderI18NTests, self).setUp() - - def tearDown(self): - settings.SETTINGS_MODULE = self.old_settings_module - super(ProjectResolutionOrderI18NTests, self).tearDown() - - def test_project_translation(self): - self.assertUgettext('Date/time', 'PROJECT') - - def test_project_override_app_translation(self): - extended_apps = list(settings.INSTALLED_APPS) + ['regressiontests.i18n.resolution'] - with self.settings(INSTALLED_APPS=extended_apps): - self.assertUgettext('Date/time', 'PROJECT') - class DjangoFallbackResolutionOrderI18NTests(ResolutionOrderI18NTests): def test_django_fallback(self): diff --git a/tests/regressiontests/locale/de/LC_MESSAGES/django.mo b/tests/regressiontests/locale/de/LC_MESSAGES/django.mo deleted file mode 100644 index c53908bf3d1a892f619b64a000892a5026bf1778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497 zcmZ9Iu};G<5QYPkfeZ|Yk>S{=klUm|YGo)Qv}sk8Kvhx(#DHl{a7paQb`d-XkHsr6 z@FZM7s1hfCzB}pn@3TL5YVQul2C|17A)82yRB?}NAq=S@&&b`H^&5c34all^GfGeIdJt0qSCA zEJ-z!CTCV@3WI4J!)2I6a1tfqC_W4O{Yi9veTq_Fm@^MoF}Kk>Bv#o|2YJyyLCJVJ&~P%`#^~9>eU3X~S)Inhr>3rK@In^91;6fAf4wZ4w_I2_7*DP)qF!2e{, YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: django tests\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-14 17:33+0100\n" -"PO-Revision-Date: 2011-02-07 13:13-0300\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -#: models.py:3 -msgid "Time" -msgstr "Zeit (PROJECT)" - -#: models.py:5 -msgid "Date/time" -msgstr "Datum/Zeit (PROJECT)" diff --git a/tests/runtests.py b/tests/runtests.py index f7db3411cd..257aa3083d 100755 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -25,7 +25,7 @@ REGRESSION_TEST_DIR = os.path.join(RUNTESTS_DIR, REGRESSION_TESTS_DIR_NAME) TEMP_DIR = tempfile.mkdtemp(prefix='django_') os.environ['DJANGO_TEST_TEMP_DIR'] = TEMP_DIR -REGRESSION_SUBDIRS_TO_SKIP = ['locale'] +REGRESSION_SUBDIRS_TO_SKIP = [] ALWAYS_INSTALLED_APPS = [ 'django.contrib.contenttypes',