Skip to main content

Django application to provide useful utils and reusable parts of code for multi-languages sites.

Project description

django-lang PyPi license

PyPi status PyPi version PyPi python version PyPi downloads PyPi downloads PyPi downloads

GitHub GitHub release GitHub release

Test codecov.io pre-commit.ci status gitthub.com

Check Demo Project

  • Check the demo repo on GitHub

Requirements

  • Python 3.9+ supported.
  • Django 3.2+ supported.

Setup

  1. Install from pip:

    pip install django-lang
    
  2. Modify settings.py by adding the app to INSTALLED_APPS:

    INSTALLED_APPS = [
        # ...
        "lang",
        # ...
    ]
    
  3. Modify settings.py by adding the app to INSTALLED_APPS:

    TEMPLATES = [
        {
            "BACKEND": "django.template.backends.django.DjangoTemplates",
            "DIRS": [os.path.join(PROJECT_DIR, "templates")],
            "APP_DIRS": True,
            "OPTIONS": {
                "context_processors": [
                    "django.template.context_processors.debug",
                    "django.template.context_processors.request",
                    "django.contrib.auth.context_processors.auth",
                    "django.contrib.messages.context_processors.messages",
                    "lang.context_processors.from_settings",
                    "lang.context_processors.seo_i18n",
                ],
            },
        },
    ]
    

    Optional: lang.context_processors.language_switcher_next (fills redirect_to for the packaged language form).

Optional: SetLanguageNextPathMiddleware

Only needed if you use translated URL segments (gettext_lazy under i18n_patterns) and see language switches that POST to set_language but stay on the wrong prefix. Short how-to: docs/set_language_middleware.md.

  1. Modify your project's base template base.html to include language's switcher styles:
    <head>
        ...
        <link rel="stylesheet" type="text/css" href="{% static 'lang/css/nav-link.css' %}">
        ...
    </head>
    
  2. Modify your project's base template base.html to include attributes using translate_url template's tag:
    <head>
        ...
        <meta name="language" content="{{ LANGUAGE_CODE }}" />
        {% include "hreflang.html" %}
        ...
    </head>
    
  3. Modify your project's nav template nav.html to include language's switcher:
    <nav class="navbar">
        ...
        <ul class="nav navbar-nav">
            {% include "lang/nav-link.html" %}
        </ul>
        ...
    </nav>
    

Configuration: lang.conf and APP_CONFIG

Built-in maps live in lang.defaults. At runtime, :mod:lang.conf resolves values lazily:

  1. Top-level Django settings (LANGUAGE_HREFLANG_MAP, LANGUAGE_WIKIPEDIA_SAMEAS, OG_LOCALE_BY_LANGUAGE, HREFLANG_DEFAULT_LANGUAGE, LANGUAGE_FLAG_MAP), if set.
  2. Partial dicts under settings.APP_CONFIG["lang"] merged onto the package defaults (for the three LANGUAGE_* / OG_* maps and flag overrides).
  3. Otherwise the content of lang.defaults.

You do not need to import lang.defaults from settings.py. Typical site-only override for x-default::

APP_CONFIG = {
    "lang": {
        "HREFLANG_DEFAULT_LANGUAGE": "it",
    },
}

Or use the usual flat settings (full replacement for the dict keys, or HREFLANG_DEFAULT_LANGUAGE at top level) if you prefer.

Optional: language control beside the hamburger on small viewports

nav-link-standalone.css shows the extra switcher next to the menu toggle below the lg breakpoint (~992px) and hides the duplicate inside the collapsed drawer. Optional script display-standalone-class.js only adds class display-standalone on <html> for installed web apps; layout no longer depends on it.

  1. In settings.py, add the optional context processor so redirect_to is filled for set_language’s next (unless you pass redirect_to from each view):
    "lang.context_processors.language_switcher_next",
    
  2. In the base layout <head>, after nav-link.css, add:
    <link rel="stylesheet" href="{% static 'lang/css/nav-link-standalone.css' %}">
    <script src="{% static 'lang/js/display-standalone-class.js' %}"></script>
    
  3. Next to your mobile menu button, include:
    {% include "lang/nav-link-standalone.html" %}
    

Packaged templates:

  • hreflang.html (app template root) — <link rel="alternate" hreflang="…"> for the current view.
  • lang/nav-link.html — language <select> (optional context: lang_switcher_id, lang_switcher_extra_class).
  • lang/nav-link-standalone.html — duplicate switcher beside the mobile toggle (small viewports / PWA).

Run Example Project

git clone --depth=50 --branch=django-lang https://github.com/DLRSP/example.git DLRSP/example
cd DLRSP/example
python manage.py runserver

Now browser the app @ http://127.0.0.1:8000

References

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_lang-0.6.4.tar.gz (31.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_lang-0.6.4-py3-none-any.whl (22.5 kB view details)

Uploaded Python 3

File details

Details for the file django_lang-0.6.4.tar.gz.

File metadata

  • Download URL: django_lang-0.6.4.tar.gz
  • Upload date:
  • Size: 31.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for django_lang-0.6.4.tar.gz
Algorithm Hash digest
SHA256 6e57b654777e0a5acee182594fb0baf517336cbba46568129d87bc8681ff3fc8
MD5 ce25e36bddd802535e05d9679f95bb07
BLAKE2b-256 d3ba86bff56dd624ac24bab4c4c6952b437286618d6dc46e5bb7538bfc386ef8

See more details on using hashes here.

File details

Details for the file django_lang-0.6.4-py3-none-any.whl.

File metadata

  • Download URL: django_lang-0.6.4-py3-none-any.whl
  • Upload date:
  • Size: 22.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for django_lang-0.6.4-py3-none-any.whl
Algorithm Hash digest
SHA256 adc2e460a8a02d548142d2e71e0fd44f0daa3b787e35280885f149129c22a42a
MD5 65934234e1b4a528cf68f710b287f617
BLAKE2b-256 94f44d5ca3c553cc30740cdf94701ba75354e18f93cd940c60f504f6246c514e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page