2017-02-02 10:56:56 +02:00
2016-10-21 10:52:27 +03:00
2017-02-02 10:56:56 +02:00
2016-10-21 14:02:56 +03:00
2016-10-21 14:23:18 +03:00
2016-10-21 12:21:11 +03:00
2016-10-21 11:08:24 +03:00
2016-12-16 08:50:04 +02:00
2017-01-26 01:19:37 +02:00

django-localized-fields
=======================

.. image:: https://scrutinizer-ci.com/g/SectorLabs/django-localized-fields/badges/quality-score.png
    :target: https://scrutinizer-ci.com/g/SectorLabs/django-localized-fields/

.. image:: https://scrutinizer-ci.com/g/SectorLabs/django-localized-fields/badges/coverage.png
    :target: https://scrutinizer-ci.com/g/SectorLabs/django-localized-fields/

.. image:: https://travis-ci.com/SectorLabs/django-localized-fields.svg?token=sFgxhDFpypxkMcvhRoSz&branch=master
    :target: https://travis-ci.com/SectorLabs/django-localized-fields

.. image:: https://badge.fury.io/py/django-localized-fields.svg
    :target: https://pypi.python.org/pypi/django-localized-fields

.. image:: https://img.shields.io/github/license/SectorLabs/django-localized-fields.svg

``django-localized-fields`` is an implementation of a field class for Django models that allows the field's value to be set in multiple languages. It does this by utilizing the ``hstore`` type (PostgreSQL specific), which is available as ``models.HStoreField`` in Django 1.10.

This package requires Python 3.5 or newer and Django 1.10 or newer.

In the pipeline
---------------
We're working on making this easier to setup and use. Any feedback is apreciated. Here's a short list of things we're working to improve:

* Make it unnecesarry to add anything to your `INSTALLED_APPS`.

Installation
------------
1. Install the package from PyPi:

    .. code-block:: bash

        $ pip install django-localized-fields

2. Add ``localized_fields`` and ``django.contrib.postgres`` to your ``INSTALLED_APPS``:

     .. code-block:: bash

        INSTALLED_APPS = [
            ....

            'django.contrib.postgres',
            'localized_fields'
        ]

3. Set the database engine to ``localized_fields.db_backend``:

    .. code-block:: python

        DATABASES = {
            'default': {
                ...
                'ENGINE': 'localized_fields.db_backend'
            }
        }

3. Set ``LANGUAGES` and `LANGUAGE_CODE`` in your settings:

     .. code-block:: python

         LANGUAGE_CODE = 'en' # default language
         LANGUAGES = (
             ('en', 'English'),
             ('nl', 'Dutch'),
             ('ro', 'Romanian')
         )

Usage
-----

Preparation
^^^^^^^^^^^
Inherit your model from ``LocalizedModel`` and declare fields on your model as ``LocalizedField``:

.. code-block:: python

     from localized_fields.models import LocalizedModel
     from localized_fields.fields import LocalizedField


     class MyModel(LocalizedModel):
         title = LocalizedField()

``django-localized-fields`` integrates with Django's i18n system, in order for certain languages to be available you have to correctly configure the ``LANGUAGES`` and ``LANGUAGE_CODE`` settings:

.. code-block:: python

     LANGUAGE_CODE = 'en' # default language
     LANGUAGES = (
          ('en', 'English'),
          ('nl', 'Dutch'),
          ('ro', 'Romanian')
     )

All the ``LocalizedField`` you define now will be available in the configured languages.

Basic usage
^^^^^^^^^^^
.. code-block:: python

     new = MyModel()
     new.title.en = 'english title'
     new.title.nl = 'dutch title'
     new.title.ro = 'romanian title'
     new.save()

By changing the active language you can control which language is presented:

.. code-block:: python

     from django.utils import translation

     translation.activate('nl')
     print(new.title) # prints 'dutch title'

     translation.activate('en')
     print(new.title) # prints 'english title'

Or get it in a specific language:

.. code-block:: python

     print(new.title.get('en')) # prints 'english title'
     print(new.title.get('ro')) # prints 'romanian title'
     print(new.title.get()) # whatever language is the primary one

You can also explicitly set a value in a certain language:

.. code-block:: python

     new.title.set('en', 'other english title')
     new.title.set('nl', 'other dutch title')

     new.title.ro = 'other romanian title'

Constraints
^^^^^^^^^^^

**Required/Optional**

At the moment, it is not possible to select two languages to be marked as required. The constraint is **not** enforced on a database level.

* Make the primary language **required** and the others optional (this is the **default**):

    .. code-block:: python

        class MyModel(models.Model):
            title = LocalizedField(required=True)

* Make all languages optional:

    .. code-block:: python

        class MyModel(models.Model):
            title = LocalizedField(null=True)

**Uniqueness**

By default the values stored in a ``LocalizedField`` are *not unique*. You can enforce uniqueness for certain languages. This uniqueness constraint is enforced on a database level using a ``UNIQUE INDEX``.

* Enforce uniqueness for one or more languages:

    .. code-block:: python

        class MyModel(models.Model):
            title = LocalizedField(uniqueness=['en', 'ro'])

* Enforce uniqueness for **all** languages:

    .. code-block:: python

        from localized_fields import get_language_codes

        class MyModel(models.Model):
            title = LocalizedField(uniqueness=get_language_codes())

* Enforce uniqueness for one ore more languages **together** (similar to Django's ``unique_together``):

    .. code-block:: python

        class MyModel(models.Model):
            title = LocalizedField(uniqueness=[('en', 'ro')])

* Enforce uniqueness for **all** languages **together**:

    .. code-block:: python

        from localized_fields import get_language_codes

        class MyModel(models.Model):
            title = LocalizedField(uniqueness=[(*get_language_codes())])


Other fields
^^^^^^^^^^^^
Besides ``LocalizedField``, there's also:

* ``LocalizedAutoSlugField``
     Automatically creates a slug for every language from the specified field.

     Currently only supports ``populate_from``. Example usage:

          .. code-block:: python

              from localized_fields.models import LocalizedModel
              from localized_fields.fields import (LocalizedField,
                                                   LocalizedAutoSlugField)

              class MyModel(LocalizedModel):
                   title = LocalizedField()
                   slug = LocalizedAutoSlugField(populate_from='title')

* ``LocalizedBleachField``
     Automatically bleaches the content of the field.
          * django-bleach

     Example usage:

           .. code-block:: python

              from localized_fields.models import LocalizedModel
              from localized_fields.fields import (LocalizedField,
                                                   LocalizedBleachField)

              class MyModel(LocalizedModel):
                   title = LocalizedField()
                   description = LocalizedBleachField()
Description
Implementation of localized model fields using PostgreSQL HStore fields.
Readme 679 KiB
Languages
Python 97.6%
JavaScript 0.9%
CSS 0.8%
HTML 0.7%