64

I am trying to translate a string.

{% load i18n %}
{% trans "Well, Hello there, how are you?" %}

to...

Hola amigo, ¿que tal?

My settings.py file has this:

LOCALE_PATHS = (
 os.path.join(BASE_DIR, 'translations'),
)

And I am getting this:

(env)glitch:translations nathann$ django-admin.py compilemessages
CommandError: Can't find msgfmt. Make sure you have GNU gettext tools 0.15 or newer installed.

I also don't understand this error message.

(env)glitch:ipals nathann$ django-admin.py makemessages -l es
CommandError:
This script should be run from the Django Git tree or your project or
app tree. If you did indeed run it from the Git checkout or your project
or application, maybe you are just missing the conf / locale(in the
django tree) or locale(for project and application) directory? It is not
created automatically, you have to create it by hand if you want to
enable i18n for your project or application.

The docs: https://docs.djangoproject.com/en/1.6/ref/django-admin/#django-admin-makemessages

And for bonus upvotes, a related question: gettext wasn't linked when I installed it... Any help with this one? Should I force it?

glitch:translations nathann$ brew link gettext
Warning: gettext is keg-only and must be linked with --force
Note that doing so can interfere with building software.

Thanks!


UPDATES:

I have since changed the name of translations to locale and updated my settings.py accordingly. then I ran this again and it's still complaining about gettext:

(env)glitch:ipals nathann$ mv translations/ locale
(env)glitch:ipals nathann$ django-admin.py makemessages -l es
CommandError: Can't find xgettext. Make sure you have GNU gettext tools 0.15 or newer installed.

I also found this:

Understand homebrew and keg-only dependencies

after reading this:

(env)glitch:ipals nathann$ brew install gettext
Warning: gettext-0.18.3.2 already installed
(env)glitch:ipals nathann$ brew link gettext
Warning: gettext is keg-only and must be linked with --force
Note that doing so can interfere with building software.
asked Apr 28, 2014 at 23:49

11 Answers 11

79

After making sure I had this in settings:

LOCALE_PATHS = (
 os.path.join(BASE_DIR, 'locale'),
)
print(LOCALE_PATHS)

I double checked I had the locale directory in the right place with its name spelled correctly.

I ended up linking gettext (after asking about that on superuser):

brew link gettext --force
manage.py compilemessages
django-admin.py makemessages -l es

And BAM. I've got my po file.

But the doctor says:

Warning: Some keg-only formula are linked into the Cellar.
Linking a keg-only formula, such as gettext, into the cellar with
`brew link <formula>` will cause other formulae to detect them during
the `./configure` step. This may cause problems when compiling those
other formulae.
Binaries provided by keg-only formulae may override system binaries
with other strange results.
You may wish to `brew unlink` these brews:
 gettext
answered Apr 29, 2014 at 16:32
Sign up to request clarification or add additional context in comments.

2 Comments

brew link gettext --force is all I needed, awesome :)
"brew link gettext --force" help me too! Magic!
74

Please try this in Ubuntu

sudo apt-get install gettext

And use brew install gettext in OSX

Also make sure to set the local path in settings.py file.

sodimel
9342 gold badges13 silver badges27 bronze badges
answered Aug 1, 2014 at 7:14

1 Comment

I run Debian9 and interestingly gettext (which seems to be the primary requirement) was already installed in version 0.19.8.1. But msgfmt not. So told apt-get to install gettext as suggested, although gettext was already present. It was installed and it was fixed. shurg
16

Here is the solution for those having problems with translations or are creating a multi-language site for the very first time in Django. Here is the way I do it, and I have been doing since Django 1.4, below is tested in 1.7.1:

In settings.py ...

Add to MIDDLEWEAR_CLASSES, locale, it enables language selection based on request:

'django.middleware.locale.LocaleMiddleware',

Add LOCALE_PATHS, this is where your translation files will be stored, also enable i18N:

USE_I18N = True
LOCALE_PATHS = (
 os.path.join(PROJECT_PATH, 'locale/'),
)

Set LANGUAGES that you will be translating the site to:

ugettext = lambda s: s
LANGUAGES = (
 ('en', ugettext('English')),
 ('fr', ugettext('French')),
 ('pl', ugettext('Polish')),
)

Add i18n template context processor, requests will now include LANGUAGES and LANGUAGE_CODE:

TEMPLATE_CONTEXT_PROCESSORS = (
 'django.contrib.auth.context_processors.auth',
 'django.core.context_processors.debug',
 'django.core.context_processors.i18n', # this one
 'django.core.context_processors.request',
 'django.core.context_processors.static',
 'django.contrib.messages.context_processors.messages', 
)

Nest, in urls.py :

In url_patterns, add the below, it will enable the set language redirect view:

url(r'^i18n/', include('django.conf.urls.i18n')),

See Miscellaneous in Translations for more on this.

Add the following imports, and encapsulate the urls you want translated with i18n_patterns. Here is what mine looks like:

from django.conf.urls.i18n import i18n_patterns
from django.utils.translation import ugettext_lazy as _
urlpatterns = patterns('',
 url(r'^admin/', include(admin.site.urls)),
 url(r'^i18n/', include('django.conf.urls.i18n')),
)
urlpatterns += i18n_patterns('',
 (_(r'^dual-lang/'), include('duallang.urls')),
 (r'^', include('home.urls')),
)

Note: You can also drop your admin urls into the i18n_patterns.

Now anywhere you use text and want to convert it, import lazytext and wrap every string with it like so _('text'), you can even go to your other urls.py files and do url translation like so:

url(_(r'^dual_language/$'), landing, name='duallang_landing'),

You can wrap text that you want translated in your other files, such as models.py, views.py etc.. Here is an example model field with translations for label and help_text:

name = models.CharField(_('name'), max_length=255, unique=True, help_text=_("Name of the FAQ Topic"))

Django translation docs are great for this!

In your html templates...

Now you can go into your templates and load the i18n templatetag and use trans and transblock on the static stuff you want to translate. Here is an example:

{% load i18n %}
{% trans "This is a translation" %}<br><br>
{% blocktrans with book_t='book title'|title author_t='an author'|title %}
This is {{ book_t }} by {{ author_t }}. Block trans is powerful!
{% endblocktrans %}

Now run a makemessages for each of your locales:

./manage.py makemessages -l pl

And now all is left is to go into your /locales folder, and edit each of the .po files. Fill in the data for each msgstr. Here is one such example of that:

msgid "English"
msgstr "Angielski"

And finally compile the messages:

./manage.py compilemessages

There is a lot more to learn with translations and internationalization is closely related to this topic, so check out the docs for it too. I also recommend checking out some of the internationalization packages available for Django like django-rosetta, and django-linguo. They help translate model content, django-rosetta does not create new entries for this in your database, while django-linguo does.

If you followed this you should be off to a good start. I believe this is the most standardized way to get your site running in multiple languages. Cheers!

answered Oct 23, 2014 at 1:20

2 Comments

@FabrizioA what version of django?
Django version 1.9.12 👍🏼
7

For Mac users brew link gettext --force can be risk, as Brew advises. A better work around is to set a new PATH variable for your virtual environment. So, in the postactivate file, which is located in the bin folder of your virtual environment folder, type:

export TEMP_PATH=$PATH
export PATH=$PATH:/usr/local/Cellar/gettext/0.19.7/bin

Note that you have to replace 0.19.7 by the version that is installed in your machine.

And in your predeactivate file, which is located in the same folder of postactivate file, type:

export PATH=$TEMP_PATH
unset TEMP_PATH

Now you can use the python manage.py makemessages -l <desired_language> without worries. :)

Cheers.

answered Feb 23, 2016 at 14:08

Comments

5

For macOS :

brew install gettext export PATH="/usr/local/opt/gettext/bin:$PATH"

answered Jun 7, 2018 at 8:09

1 Comment

brew install gettext brew link --force gettext
2

Have you added {% load i18n %} to the top of your template?

Bonus: You don't need to link gettext, what is the output from brew doctor?

answered Apr 28, 2014 at 23:53

9 Comments

Yes I have. I am having trouble with the command, not the template.
It looks like it can't find your locale file. Is BASE_DIR set up correctly and it is in the correct folder?
/Users/nathann/Code/ipals/ipals/translations exists and is being referenced correctly. It's an empty directory. I thought I was supposed to use makemessages to populate it. What do you mean by locale file ?
I think I am making progress. I change the names of things and now it just can't find xgettext
Are the programs in the /bin folder of gettext on your PATH? If you're using venv the PATH will be different
|
2

Please install gettext in your ubuntu OS using sudo apt-get command

Or in Mac

using brew command

answered Aug 1, 2014 at 7:15

Comments

0

If you don't want to link gettext (which you shouldn't because messing about with OS X internals is bad) then you can set the PATH for the makemessages command. The following should work (but you need to adjust your gettext version number):

PATH=/usr/local/Cellar/gettext/<installed version>/bin/:$PATH && \
django-admin makemessages -l <language>

If you do it that way your installed gettext remains keg-only and django-admin will be happy and find all the programms it needs.

answered Jul 20, 2015 at 21:43

Comments

0

One of the possibilities is that after you have successfully done all the above and done

pip install python-gettext

you may have improperly configured your IDE or venv. In order to bypass this, go to the command prompt, navigate to your root folder and run py manage.py makemessages from there. It will work.

answered Sep 23, 2020 at 9:03

Comments

0

For me, on Windows 10, the problem was that I used gettext installed with pip install (I got version 0.19-something). I made it work by:

  1. Uninstalling gettext with pip.
  2. downloading gettext (as a zip) from here istead: https://mlocati.github.io/articles/gettext-iconv-windows.html
  3. Extracting the files in a foler on "C:/program files"
  4. Added the path to the "bin" folder (inside the extracted folder) to PATH in my environment variables in windows.

After that it worked! (after 5 h frustrated debugging...)

answered Mar 17, 2022 at 21:48

Comments

0

For me it was the reason that I tried to use some different extensions for the template files instead of html, and it couldn't find them or search for them, so I just renamed the file extensions to html and it worked.

And the reason that I changed their extensions was because the vs code formatter is not expecting them to be django templates instead they are expected to be html files.

./templates/app_name/template.html Good ./templates/app_name/folder/template.html Not working

answered Jan 9, 2024 at 12:58

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.