All Projects → django-parler → Django Parler

django-parler / Django Parler

Licence: apache-2.0
Easily translate "cheese omelet" into "omelette au fromage".

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to Django Parler

Django Translations
Django model translation for perfectionists with deadlines.
Stars: ✭ 109 (-76.25%)
Mutual labels:  django, internationalization, translations
Flutter translate
Flutter Translate is a fully featured localization / internationalization (i18n) library for Flutter.
Stars: ✭ 245 (-46.62%)
Mutual labels:  internationalization, translations
Attranslate
Semi-automated Text Translator for Websites and Apps
Stars: ✭ 178 (-61.22%)
Mutual labels:  internationalization, translations
Django Rosetta
Rosetta is a Django application that eases the translation process of your Django projects
Stars: ✭ 806 (+75.6%)
Mutual labels:  django, internationalization
Eslint Plugin I18n Json
Fully extendable eslint plugin for JSON i18n translation files.
Stars: ✭ 101 (-78%)
Mutual labels:  internationalization, translations
Weblate
Web based localization tool with tight version control integration.
Stars: ✭ 2,719 (+492.37%)
Mutual labels:  django, internationalization
Mojito
An automation platform that enables continuous localization.
Stars: ✭ 256 (-44.23%)
Mutual labels:  internationalization, translations
mini i18n
🌐 Minimalistic I18n library for Ruby
Stars: ✭ 93 (-79.74%)
Mutual labels:  translations, internationalization
pH7-Internationalization
🎌 pH7CMS Internationalization (I18N) package 🙊 Get new languages for your pH7CMS website!
Stars: ✭ 17 (-96.3%)
Mutual labels:  translations, internationalization
I18N-Portable
Simple and cross platform internationalization/translations for Xamarin and .NET
Stars: ✭ 102 (-77.78%)
Mutual labels:  translations, internationalization
django-parler-rest
Translatable model support for django-rest-framework
Stars: ✭ 48 (-89.54%)
Mutual labels:  translations, internationalization
I18n Editor
GUI for editing your i18n translation files
Stars: ✭ 290 (-36.82%)
Mutual labels:  internationalization, translations
Babel Plugin React Intl
Extracts string messages from React components that use React Intl.
Stars: ✭ 430 (-6.32%)
Mutual labels:  internationalization
Django Rest Framework
Web APIs for Django. 🎸
Stars: ✭ 22,406 (+4781.48%)
Mutual labels:  django
Django Heroku
A Django library for Heroku apps.
Stars: ✭ 428 (-6.75%)
Mutual labels:  django
Django Markdown Editor
Awesome Django Markdown Editor, supported for Bootstrap & Semantic-UI
Stars: ✭ 423 (-7.84%)
Mutual labels:  django
Ava Docs
Localized docs for AVA
Stars: ✭ 455 (-0.87%)
Mutual labels:  translations
Drf Extra Fields
Extra Fields for Django Rest Framework
Stars: ✭ 445 (-3.05%)
Mutual labels:  django
Django Request
django-request is a statistics module for django. It stores requests in a database for admins to see, it can also be used to get statistics on who is online etc.
Stars: ✭ 419 (-8.71%)
Mutual labels:  django
Drf Spectacular
Sane and flexible OpenAPI 3 schema generation for Django REST framework.
Stars: ✭ 414 (-9.8%)
Mutual labels:  django

.. image:: https://img.shields.io/travis/django-parler/django-parler/master.svg?branch=master :target: http://travis-ci.org/django-parler/django-parler .. image:: https://readthedocs.org/projects/django-parler/badge/?version=stable :target: https://django-parler.readthedocs.io/en/stable/ .. image:: https://img.shields.io/pypi/v/django-parler.svg :target: https://pypi.python.org/pypi/django-parler/ .. image:: https://img.shields.io/pypi/l/django-parler.svg :target: https://pypi.python.org/pypi/django-parler/ .. image:: https://img.shields.io/codecov/c/github/django-parler/django-parler/master.svg :target: https://codecov.io/github/django-parler/django-parler?branch=master

django-parler

Simple Django model translations without nasty hacks.

Features:

  • Nice admin integration.

  • Access translated attributes like regular attributes.

  • Automatic fallback to the default language.

  • Separate table for translated fields, compatible with django-hvad_.

  • Plays nice with others, compatible with django-polymorphic_, django-mptt_ and such:

    • No ORM query hacks.
    • Easy to combine with custom Manager or QuerySet classes.
    • Easy to construct the translations model manually when needed.

See the documentation_ for more details.

A brief overview

Installing django-parler

The package can be installed using:

.. code-block:: bash

pip install django-parler

Add the following settings:

.. code-block:: python

INSTALLED_APPS += (
    'parler',
)

Optionally, the admin tabs can be configured too:

.. code-block:: python

PARLER_LANGUAGES = {
    None: (
        {'code': 'en',},
        {'code': 'en-us',},
        {'code': 'it',},
        {'code': 'nl',},
    ),
    'default': {
        'fallback': 'en',             # defaults to PARLER_DEFAULT_LANGUAGE_CODE
        'hide_untranslated': False,   # the default; let .active_translations() return fallbacks too.
    }
}

Replace None with the SITE_ID when you run a multi-site project with the sites framework. Each SITE_ID can be added as additional entry in the dictionary.

Make sure your project is configured for multiple languages. It might be useful to limit the LANGUAGES setting. For example:

.. code-block:: python

from django.utils.translation import gettext_lazy as _

LANGUAGE_CODE = 'en'

LANGUAGES = (
    ('en', _("English")),
    ('en-us', _("US English")),
    ('it', _('Italian')),
    ('nl', _('Dutch')),
    ('fr', _('French')),
    ('es', _('Spanish')),
)

By default, the fallback language is the same as LANGUAGE_CODE. The fallback language can be changed in the settings:

.. code-block:: python

PARLER_DEFAULT_LANGUAGE_CODE = 'en'

Creating models

Using the TranslatedFields wrapper, model fields can be marked as translatable:

.. code-block:: python

from django.db import models
from parler.models import TranslatableModel, TranslatedFields

class MyModel(TranslatableModel):
    translations = TranslatedFields(
        title = models.CharField(_("Title"), max_length=200)
    )

    def __unicode__(self):
        return self.title

Accessing fields

Translatable fields can be used like regular fields:

.. code-block:: python

>>> object = MyModel.objects.all()[0]
>>> object.get_current_language()
'en'
>>> object.title
u'cheese omelet'

>>> object.set_current_language('fr')       # Only switches
>>> object.title = "omelette du fromage"    # Translation is created on demand.
>>> object.save()

Internally, django-parler stores the translated fields in a separate model, with one row per language.

Filtering translations

To query translated fields, use the .translated() method:

.. code-block:: python

MyObject.objects.translated(title='cheese omelet')

To access objects in both the current and possibly the fallback language, use:

.. code-block:: python

MyObject.objects.active_translations(title='cheese omelet')

This returns objects in the languages which are considered "active", which are:

  • The current language
  • The fallback language when hide_untranslated=False in the PARLER_LANGUAGES setting.

Changing the language

The queryset can be instructed to return objects in a specific language:

.. code-block:: python

>>> objects = MyModel.objects.language('fr').all()
>>> objects[0].title
u'omelette du fromage'

This only sets the language of the object. By default, the current Django language is used.

Use object.get_current_language() and object.set_current_language() to change the language on individual objects. There is a context manager to do this temporary:

.. code-block:: python

from parler.utils.context import switch_language

with switch_language(model, 'fr'):
    print model.title

And a function to query just a specific field:

.. code-block:: python

model.safe_translation_getter('title', language_code='fr')

Advanced Features

This package also includes:

  • Creating the TranslatedFieldsModel manually!
  • Form classes for inline support.
  • View classes for switching languages, creating/updating translatable objects.
  • Template tags for language switching-buttons.
  • ORM methods to handle the translated fields.
  • Admin inlines support.

See the documentation_ for more details.

Special notes

  • Using ModelAdmin.prepopulated_fields doesn't work, but you can use get_prepopulated_fields() as workaround.
  • Due to ORM restrictions <https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships>_ queries for translated fields should be performed in a single .translated(..) or .active_translations(..) call.
  • The .active_translations(..) method typically needs to .distinct() call to avoid duplicate results of the same object.

TODO

  • The list code currently performs one query per object. This needs to be reduced.
  • Preferably, the TranslatedField proxy on the model should behave like a RelatedField, if that would nicely with the ORM too.

Please contribute your improvements or work on these area's!

Contributing

This module is designed to be generic. In case there is anything you didn't like about it, or think it's not flexible enough, please let us know. We'd love to improve it!

If you have any other valuable contribution, suggestion or idea, please let us know as well because we will look into it. Pull requests are welcome too. :-)

.. _django-hvad: https://github.com/kristianoellegaard/django-hvad .. _django-mptt: https://github.com/django-mptt/django-mptt .. _django-fluent-pages: https://github.com/edoburu/django-fluent-pages .. _django-polymorphic: https://github.com/django-polymorphic/django-polymorphic .. _documentation: https://django-parler.readthedocs.io/

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].