how to add new languages into Django? My language "Uyghur" or "Uighur" is not supported in Django

how to add new languages into Django? My language "Uyghur" or "Uighur" is not supported in Django.

Can I add new language locale file in my project and use it? for example: zh_UG

this language is not supported in Django.


Solution 1:

Add a non available language to your Django app

ISO language code of Uighur ئۇيغۇر تىلى is 'ug'.

In your settings.py:

from django.conf import global_settings

gettext_noop = lambda s: s

LANGUAGES = (
       ('ug', gettext_noop('Uighur')),
)

EXTRA_LANG_INFO = {
    'ug': {
        'bidi': True, # right-to-left
        'code': 'ug',
        'name': 'Uighur',
        'name_local': u'\u0626\u06C7\u064A\u063A\u06C7\u0631 \u062A\u0649\u0644\u0649', #unicode codepoints here
    },
}

# Add custom languages not provided by Django
import django.conf.locale
LANG_INFO = dict(django.conf.locale.LANG_INFO, **EXTRA_LANG_INFO)
django.conf.locale.LANG_INFO = LANG_INFO

# Languages using BiDi (right-to-left) layout
LANGUAGES_BIDI = global_settings.LANGUAGES_BIDI + ["ug"]

And:

manage.py makemessages -l ug
manage.py compilemessages

Solution 2:

Based on laffuste's answer. First step, add language define in settings.py:

EXTRA_LANG_INFO = {
    'ms': {
        'bidi': False, # right-to-left
        'code': 'ms',
        'name': 'Bahasa Melayu',
        'name_local': u'Bahasa Melayu', #unicode codepoints here
    },
}

# Add custom languages not provided by Django
import django.conf.locale
from django.conf import global_settings
LANG_INFO = dict(django.conf.locale.LANG_INFO.items() + EXTRA_LANG_INFO.items())
django.conf.locale.LANG_INFO = LANG_INFO

# Languages using BiDi (right-to-left) layout
global_settings.LANGUAGES = global_settings.LANGUAGES + (("ms",'Bahasa Melayu'),)

Second step, Add locale in settings.py:

import os

PACKAGE_ROOT = os.path.abspath(os.path.dirname(__file__))
LOCALE_PATHS = (
    os.path.join(PACKAGE_ROOT, 'locale'),
)

Third step, Add locale defines in locale directory.

Solution 3:

If someone encounters this, and will use the accepted answer (also check the comments on it) and still will have a redirect to /en/ instead of extra language - you need to create the .mo file for that locale. At least a dummy one.

Django checks if language is valid by checking if it can load the .mo file. There is no issue for standard languages because Django is shipped with a bunch of them, but for your custom language it doesn't exists.

I hope that will save your time.

Solution 4:

in your settings.py add

gettext = lambda s: s


LANGUAGES = (
    ('zh_UG', gettext('Uyghur')),
    ('en', gettext('English')),
)
USE_I18N = True

run


manage.py makemessages -l zh_UG

to create language files