14

I am using localization in Django 1.11 application. I can exclude the virtual environment folder and node_modules folder while adding the messages in message file using -i option like:

django-admin makemessages -l 'no' -i venv
django-admin makemessages -d djangojs --locale no -i venv -i node_modules

After adding the translations I am compiling messages using:

django-admin compilemessages

It processes django.po files of all installed packages located in virtual environment folder. Thus it takes longer time to finish compiling translations.

I did not find any argument parameter to skip a specific path from compilemessages command in documentation.

Is there any option to skip the venv or specific path from compilemessages?

arshovon
  • 13,270
  • 9
  • 51
  • 69
  • 1
    I have the same question, and am surprised the ignore flag is possible for `makemessages` and not `compilemessages`. Have you found any solution in the meantime? This [thread](https://code.djangoproject.com/ticket/30133) recommends moving the `venv` folder out of the django project, but the possibility to ignore it in the `compilemessages` command would be preferable. – sc28 Mar 22 '19 at 09:15
  • No. I have not found any solution yet. – arshovon Mar 22 '19 at 10:43

5 Answers5

18

Django 3.0 added --ignore option

django-admin compilemessages --ignore=cache --ignore=outdated/*/locale

Docs: https://docs.djangoproject.com/en/3.2/ref/django-admin/#cmdoption-compilemessages-ignore


(Method #2)

BEFORE THAT THE BEST HACK I FOUND TO IGNORE THE VENV IS:

cd to project
python ../manage.py makemessages  (jumping one directory up)
python ../manage.py compilemessages

(This little hack from a workmate avoids compiling the venv .po)


(Method #3)

And also before, another workaround was trying the more complicated way of using the --exclude flag

usage: django-admin compilemessages [-h] [--version] [-v {0,1,2,3}]
                                    [--settings SETTINGS]
                                    [--pythonpath PYTHONPATH] [--traceback]
                                    [--no-color] [--locale LOCALE]
                                    [--exclude EXCLUDE] [--use-fuzzy]

github

        parser.add_argument(
            '--exclude', '-x', action='append', default=[],
            help='Locales to exclude. Default is none. Can be used multiple times.',
        )

Unfortunately this is for locales, but it is the only thing I found so far

From these internal communications on the development of Django, I can see the ignore flag has been copied from makemessages to compilemessages for a future version

For my own usage I used (excluding es and en)

django-admin compilemessages --exclude=sw --exclude=sl --exclude=sk --exclude=km --exclude=sv --exclude=ko --exclude=sq --exclude=sr --exclude=kk --exclude=ka --exclude=es_MX --exclude=fa --exclude=fy --exclude=fr --exclude=en_AU --exclude=ne --exclude=nb --exclude=nn --exclude=nl --exclude=id --exclude=az --exclude=io --exclude=ar --exclude=ia --exclude=kn --exclude=it --exclude=is --exclude=vi --exclude=af --exclude=my --exclude=mr --exclude=uk --exclude=pl --exclude=ur --exclude=mk --exclude=mn --exclude=ml --exclude=he --exclude=hi --exclude=hu --exclude=hr --exclude=en_GB --exclude=pa --exclude=cs --exclude=fi --exclude=cy --exclude=sr_Latn --exclude=os --exclude=pt --exclude=ja --exclude=bs --exclude=br --exclude=bn --exclude=ast --exclude=bg --exclude=hsb --exclude=dsb --exclude=ro --exclude=es_CO --exclude=ru --exclude=et --exclude=eu --exclude=zh_Hant --exclude=zh_Hans --exclude=be --exclude=eo --exclude=el --exclude=da --exclude=de --exclude=pt_BR --exclude=ta --exclude=ca --exclude=te --exclude=es_AR --exclude=th --exclude=lt --exclude=lv --exclude=tr --exclude=tt --exclude=es_VE --exclude=lb --exclude=gl --exclude=ga --exclude=gd --exclude=udm--exclude=sw --exclude=sl --exclude=sk --exclude=km --exclude=sv --exclude=ko --exclude=sq --exclude=sr --exclude=kk --exclude=ka --exclude=es_MX --exclude=fa --exclude=fy --exclude=fr --exclude=en_AU --exclude=ne --exclude=nb --exclude=nn --exclude=nl --exclude=id --exclude=az --exclude=io --exclude=ar --exclude=ia --exclude=kn --exclude=it --exclude=is --exclude=vi --exclude=af --exclude=my --exclude=mr --exclude=uk --exclude=pl --exclude=ur --exclude=mk --exclude=mn --exclude=ml --exclude=he --exclude=hi --exclude=hu --exclude=hr --exclude=en_GB --exclude=pa --exclude=cs --exclude=fi --exclude=cy --exclude=sr_Latn --exclude=os --exclude=pt --exclude=ja --exclude=bs --exclude=br --exclude=bn --exclude=ast --exclude=bg --exclude=hsb --exclude=dsb --exclude=ro --exclude=es_CO --exclude=ru --exclude=et --exclude=eu --exclude=zh_Hant --exclude=zh_Hans --exclude=be --exclude=eo --exclude=el --exclude=da --exclude=de --exclude=pt_BR --exclude=ta --exclude=ca --exclude=te --exclude=es_AR --exclude=th --exclude=lt --exclude=lv --exclude=tr --exclude=tt --exclude=es_VE --exclude=lb --exclude=gl --exclude=ga --exclude=gd --exclude=udm --exclude=zh_CN  --exclude=ky --exclude=zh_TW --exclude=no --exclude=pt_PT  --exclude=hy
gdvalderrama
  • 713
  • 1
  • 17
  • 26
Mr-Programs
  • 767
  • 4
  • 20
  • If you're getting the error: "CommandError: This script should be run from the Django Git checkout or your project or app tree, or with the settings module specified." , you might need to set [`LOCALE_PATHS`](https://docs.djangoproject.com/en/stable/ref/settings/#locale-paths) in your settings. – Flimm Jun 14 '19 at 11:00
8

As others already stated, in Django 2.x sadly there are only hacks to deal with this. (Django 3.0 finally added the --ignore to compilemessages.)

The one I found to be most transparent was to debug into compilemessages and look at the subprocess calls it issues. From that you can derive the direct calls to the msgfmt tool.

For our comparably simple project, makemessages collects the *.po files in locale/$LANGUAGE/LC_MESSAGES/django.po. Then msgfmt would put the generated *.mo in the same folder. So we just wrote a script to perform steps like this:

set -e

django-admin makemessages --all --ignore venv

# HACK: Run msgfmt manually instead from "django-admin compilemessages"
# because the latter also searches venv.
msgfmt -o locale/de/LC_MESSAGES/django.mo locale/de/LC_MESSAGES/django.po
msgfmt -o locale/en/LC_MESSAGES/django.mo locale/en/LC_MESSAGES/django.po
msgfmt -o locale/hu/LC_MESSAGES/django.mo locale/hu/LC_MESSAGES/django.po
# ...add other languages as needed.

This is of course incredibly clumsy but easy to understand and extend.

roskakori
  • 3,139
  • 1
  • 30
  • 29
5

Django 3.0 added --ignore option

django-admin compilemessages --ignore=cache --ignore=outdated/*/locale

Docs: https://docs.djangoproject.com/en/3.1/ref/django-admin/#cmdoption-compilemessages-ignore

Max Semikin
  • 974
  • 1
  • 11
  • 19
2

Using ignore option

python manage.py compilemessages -i "venv*"

this command worked for me. Make sure, venv should be in double quotes(""), not single quote('')

  • If you are using docker, make sure the path is relative to the pwd, when I tried `./manage.py compilemessages -i "/app/.tox*"` it didn't work, I needed to use `./manage.py compilemessages -i ".tox*"` – RobertPro Dec 06 '20 at 18:23
0

If you are running this command manually from python, here is the correct syntax for ignoring the virtualenv:

management.call_command("compilemessages", ignore_patterns=[".venv/*"])
smac89
  • 39,374
  • 15
  • 132
  • 179