django-admin.py makemessagesに関する注意点

Djangoに付属しているツール、django-admin.pyを使って国際化対応用のメッセージファイルを作成しようとした際に、思わぬエラーが発生しました。すぐに解決できる問題でしたが、今後同じトラブルに時間を割かないようにするためにメモをしておきます。

問題: django-admin.pyのmakemessages.pyを実行する際に、テンプレートファイルのコメントタグの中に日本語が入っていると、「UnicodeDecodeError」が発生

例) 失敗する例

--- test.html ---

<div>これはOKです</div>
{% comment %}これはだめです{% endcomment %}
$ django-admin.py makemessages -l ja
   -> これでUnicodeDecodeErrorが発生します。

コメントタグの中で無ければエラーは発生しません。

例) 成功する例

--- test.html ---

<div>これはOKです</div>
$ django-admin.py makemessages -l ja
   -> これは成功します。

参考: Re: [Django] #15774: UnicodeDecodeError with makemessages

なおエラーは以下の通りです。

processing language ja
Traceback (most recent call last):
  File "/usr/local/python/bin/django-admin.py", line 5, in <module>
    management.execute_from_command_line()
  File "/usr/local/python/lib/python2.7/site-packages/django/core/management/__init__.py", line 429, in execute_from_command_line
    utility.execute()
  File "/usr/local/python/lib/python2.7/site-packages/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/python/lib/python2.7/site-packages/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/python/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/usr/local/python/lib/python2.7/site-packages/django/core/management/base.py", line 351, in handle
    return self.handle_noargs(**options)
  File "/usr/local/python/lib/python2.7/site-packages/django/core/management/commands/makemessages.py", line 365, in handle_noargs
    make_messages(locale, domain, verbosity, process_all, extensions, symlinks, ignore_patterns, no_wrap, no_obsolete)
  File "/usr/local/python/lib/python2.7/site-packages/django/core/management/commands/makemessages.py", line 233, in make_messages
    f.write(templatize(src, orig_file[2:]))
  File "/usr/local/python/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 127, in templatize
    return _trans.templatize(src, origin)
  File "/usr/local/python/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 450, in templatize
    content = u".join(comment)
UnicodeDecodeError: ‘ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)

この記事が役に立った場合、シェアしていただけると励みになります!!