Django translations of third party apps

风格不统一 提交于 2019-12-06 02:49:50
raratiru

My answer is trying to compile together all the steps described in the answer provided by @catabaran:

# Make symlink to the application that needs to be translated
ln -s ~/.virtualenvs/<virtyalenv>/lib/python3.4/site-packages/<app> ./

# Makemessages following the symlink
./manage.py makemessages -s

# Create a folder called tpa_translation (Third Party Applications Translation) 
#  at the main project folder (where settings.py is located). 
#  Copy there, the directory tree that springs from your language and is located
#  inside the locale directory of the third party application.
mkdir <proj>/tpa_translation/<app>
cp -R ./<app>/locale/<your_lang> <proj>/tpa_translation/<app>/

# Include this path in the locale_paths in settings.py:
...
LOCALE_PATHS = [
    ...,
    join('path', 'to', 'tpa_translation', '<app>'),
    ...,
]
...

#Remove the symlink
rm ./<app>

# Translate the .po file:
vim <proj>/tpa_translation/<app>/<your_lang>/LC_MESSAGES/django.po

# Compile messages
./manage.py compilemessages

# At this point django will message that a .mo file was created at the directory where the new .po file exists.
Craig Blaszczyk

Have you checked makemessages for an app installed in virtualenv?

It says that you need to make a symlink to the app in order for makemessages to find the 3rd party app.

I've just followed that guide and it works for me translating Django REST Framework

The easiest way, I found for myself, is to fork the module, clone it to you computer, get an example project running and then do the translations. Once you push those translation back to your forked repository, you can use that instead of the official version. You can use it your requirements.txt with git+https://github.com/my-respository.git. You can also translate the module and send a merge request to the original authors. If you are lucky, they will merge it into the original repo so you can switch back to that one.

Other solutions are problematic. For instance, if your first language is German, but the module was written in English, you will have a problem getting the correct translations.

Hope that helps.

According with django 2 documentation "How Django discovers translations":

The directories listed in LOCALE_PATHS have the highest precedence, with the ones appearing first having higher precedence than the ones appearing later.

Just create a locale folder in your root directory and set LOCALE_PATHS in your settings:

LOCALE_PATHS = [ os.path.join(BASE_DIR, "locale"), ]

My locales:

$ tree locale
locale
└── ca
    └── LC_MESSAGES
        ├── django.mo
        └── django.po

( Dont forget to compile messages: django-admin compilemessages )

I just tested for my project and runs like a charm.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!