Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #9523 -- Restart runserver after translation MO files change

Thanks to Krzysztof Kulewski for the initial patch.
  • Loading branch information...
commit c3936c0d79d79aced25ceba8beff0c91a6b5c2ed 1 parent 090315f
@Bouke Bouke authored
View
1  AUTHORS
@@ -369,6 +369,7 @@ answer newbie questions, and generally made Django that much better:
knox <christobzr@gmail.com>
David Krauth
Kevin Kubasik <kevin@kubasik.net>
+ Krzysztof Kulewski <kulewski@gmail.com>
kurtiss@meetro.com
Vladimir Kuzma <vladimirkuzma.ch@gmail.com>
Denis Kuzmichyov <kuzmichyov@gmail.com>
View
21 django/utils/autoreload.py
@@ -28,13 +28,13 @@
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-import datetime
import os
import signal
import sys
import time
import traceback
+from django.conf import settings
from django.core.signals import request_finished
try:
from django.utils.six.moves import _thread as thread
@@ -86,13 +86,28 @@
_error_files = []
-
def gen_filenames():
"""
- Yields a generator over filenames referenced in sys.modules.
+ Yields a generator over filenames referenced in sys.modules and translation
+ files.
"""
filenames = [filename.__file__ for filename in sys.modules.values()
if hasattr(filename, '__file__')]
+
+ # Add the names of the .mo files that can be generated
+ # by compilemessages management command to the list of files watched.
+ basedirs = [os.path.join(os.path.dirname(os.path.dirname(__file__)),
+ 'conf', 'locale'),
+ 'locale']
+ basedirs.extend(settings.LOCALE_PATHS)
+ basedirs = [os.path.abspath(basedir) for basedir in basedirs
+ if os.path.isdir(basedir)]
+ for basedir in basedirs:
+ for dirpath, dirnames, locale_filenames in os.walk(basedir):
+ for filename in locale_filenames:
+ if filename.endswith('.mo'):
+ filenames.append(os.path.join(dirpath, filename))
+
for filename in filenames + _error_files:
if not filename:
continue
View
8 docs/ref/django-admin.txt
@@ -791,8 +791,12 @@ Django.)
The development server automatically reloads Python code for each request, as
needed. You don't need to restart the server for code changes to take effect.
-However, some actions like adding files or compiling translation files don't
-trigger a restart, so you'll have to restart the server in these cases.
+However, some actions like adding files don't trigger a restart, so you'll
+have to restart the server in these cases.
+
+.. versionchanged:: 1.7
+
+ Compiling translation files now also restarts the development server.
If you are using Linux and install `pyinotify`_, kernel signals will be used to
autoreload the server (rather than polling file modification timestamps each
View
3  docs/releases/1.7.txt
@@ -346,6 +346,9 @@ Management Commands
* The :djadmin:`runserver` command now uses ``inotify`` Linux kernel signals
for autoreloading if ``pyinotify`` is installed.
+* The :djadmin:`runserver` command is now restarted when a translation file is
+ changed.
+
Models
^^^^^^
View
BIN  tests/utils_tests/locale/nl/LC_MESSAGES/django.mo
Binary file not shown
View
17 tests/utils_tests/locale/nl/LC_MESSAGES/django.po
@@ -0,0 +1,17 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-09-15 19:15+0200\n"
+"PO-Revision-Date: 2010-05-12 12:41-0300\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
View
37 tests/utils_tests/test_autoreload.py
@@ -0,0 +1,37 @@
+import os
+
+from django import conf
+from django.test import TestCase, override_settings
+from django.utils.autoreload import gen_filenames
+
+LOCALE_PATH = os.path.join(os.path.dirname(__file__), 'locale')
+
+
+class TestFilenameGenerator(TestCase):
+ def test_django_locales(self):
+ """
+ Test that gen_filenames() also yields the built-in django locale files.
+ """
+ filenames = list(gen_filenames())
+ locales = []
+
+ basedir = os.path.join(os.path.dirname(conf.__file__), 'locale')
+ for dirpath, dirnames, locale_filenames in os.walk(basedir):
+ for filename in locale_filenames:
+ if filename.endswith('.mo'):
+ locales.append(os.path.join(dirpath, filename))
+
+ self.assertTrue(len(locales) > 10) # assume a few available locales
+ for filename in locales:
+ self.assertIn(filename, filenames)
+
+ @override_settings(
+ LOCALE_PATHS=(LOCALE_PATH,)
+ )
+ def test_app_locales(self):
+ """
+ Test that gen_filenames also yields from LOCALE_PATHS.
+ """
+ filenames = list(gen_filenames())
+ self.assertIn(os.path.join(LOCALE_PATH, 'nl', 'LC_MESSAGES', 'django.mo'),
+ filenames)
Please sign in to comment.
Something went wrong with that request. Please try again.