From 2bc014750adb093131f77e4c20bc17ba64b75cac Mon Sep 17 00:00:00 2001
From: Bartosz Grabski <bartosz.grabski@gmail.com>
Date: Sun, 27 May 2018 14:09:54 +0200
Subject: [PATCH] Fixed #29452 -- Fixed makemessages setting charset of .pot
 files.

---
 AUTHORS                                       |  1 +
 .../core/management/commands/makemessages.py  |  5 ++--
 tests/i18n/test_extraction.py                 | 23 ++++++++++++++++++-
 3 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/AUTHORS b/AUTHORS
index 27fb443f91..257f8f2c5d 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -97,6 +97,7 @@ answer newbie questions, and generally made Django that much better:
     Baptiste Mispelon <bmispelon@gmail.com>
     Barry Pederson <bp@barryp.org>
     Bartolome Sanchez Salado <i42sasab@uco.es>
+    Bartosz Grabski <bartosz.grabski@gmail.com>
     Bashar Al-Abdulhadi
     Bastian Kleineidam <calvin@debian.org>
     Batiste Bieler <batiste.bieler@gmail.com>
diff --git a/django/core/management/commands/makemessages.py b/django/core/management/commands/makemessages.py
index a1e72c73ad..d0776488c3 100644
--- a/django/core/management/commands/makemessages.py
+++ b/django/core/management/commands/makemessages.py
@@ -182,8 +182,9 @@ def write_pot_file(potfile, msgs):
         found, header_read = False, False
         for line in pot_lines:
             if not found and not header_read:
-                found = True
-                line = line.replace('charset=CHARSET', 'charset=UTF-8')
+                if 'charset=CHARSET' in line:
+                    found = True
+                    line = line.replace('charset=CHARSET', 'charset=UTF-8')
             if not line and not found:
                 header_read = True
             lines.append(line)
diff --git a/tests/i18n/test_extraction.py b/tests/i18n/test_extraction.py
index d9ce3b43c7..e1463f2a8e 100644
--- a/tests/i18n/test_extraction.py
+++ b/tests/i18n/test_extraction.py
@@ -1,6 +1,7 @@
 import os
 import re
 import shutil
+import tempfile
 import time
 import warnings
 from io import StringIO
@@ -12,7 +13,7 @@ from django.core import management
 from django.core.management import execute_from_command_line
 from django.core.management.base import CommandError
 from django.core.management.commands.makemessages import (
-    Command as MakeMessagesCommand,
+    Command as MakeMessagesCommand, write_pot_file,
 )
 from django.core.management.utils import find_command
 from django.test import SimpleTestCase, override_settings
@@ -394,6 +395,26 @@ class BasicExtractorTests(ExtractorTests):
             po_contents = fp.read()
             self.assertMsgStr("Größe", po_contents)
 
+    def test_pot_charset_header_is_utf8(self):
+        """Content-Type: ... charset=CHARSET is replaced with charset=UTF-8"""
+        msgs = (
+            '# SOME DESCRIPTIVE TITLE.\n'
+            '# (some lines truncated as they are not relevant)\n'
+            '"Content-Type: text/plain; charset=CHARSET\\n"\n'
+            '"Content-Transfer-Encoding: 8bit\\n"\n'
+            '\n'
+            '#: somefile.py:8\n'
+            'msgid "mañana; charset=CHARSET"\n'
+            'msgstr ""\n'
+        )
+        with tempfile.NamedTemporaryFile() as pot_file:
+            pot_filename = pot_file.name
+        write_pot_file(pot_filename, msgs)
+        with open(pot_filename, 'r', encoding='utf-8') as fp:
+            pot_contents = fp.read()
+            self.assertIn('Content-Type: text/plain; charset=UTF-8', pot_contents)
+            self.assertIn('mañana; charset=CHARSET', pot_contents)
+
 
 class JavascriptExtractorTests(ExtractorTests):