How to integrate multi-languages support by creating language files in Django 2.0?
Asked Answered
K

1

6

I want to create a Django 2.0 powered website(including auto generated Admin site) that should support multiple languages.

For now I only want to keep 2 languages English and Arabic.

I read number of tutorials articles on web to use django-admin's makemessages and compilemessages commands to generate language files(.po files) & compile .mo files(generated by makemessages command).

But I did not get any specific solution regarding this integration using Django2.0 and still I am facing the issue.

Can anyone please help me in solving this problem.

And also suggest how will I make it for English to Arabic translation.

Keim answered 22/12, 2017 at 11:16 Comment(2)
Considering a poor documentation about this, it is not a low vote deserve question.Monohydric
Thank you @AlexJolig. Yes, you are right as we can't find enough running/working example for this in a single place.Keim
K
17

Now I got the solution of question, I am explaining it one by one.

As I want to translate my model names, model field names, some other texts available in modules and some static/dynamic texts present in my Django template.

Let's assume, I have the models.py and index.html as follows.

models.py

from django.db import models


class Student(models.Model):
    first_name = models.CharField(max_length=100, null=True, blank=True, help_text="First name of student", verbose_name="First name")
    last_name = models.CharField(max_length=100, null=True, blank=True, help_text="Last name of student" , verbose_name="Last name")
    age = models.IntegerField(help_text="Age" , verbose_name="Age")

    def __str__(self):
        return "Student " + str(self.id) + " - " + self.first_name + " " + self.last_name + created_by_user % (self.userid.username)

    class Meta:
        verbose_name = "Student"
        verbose_name_plural = "Students"

index.html

{% extends "base.html" %}
<h1> HOME PAGE </h1>
<h2> Django is nice </h2>

Now, I need to place translation texts in my modules and templates. I want my Django application to support Arabic & English.

  1. Replace the code of models.py and index.html as follows.

models.py

from django.db import models
from django.utils.translation import gettext_lazy as _


class Student(models.Model):
    first_name = models.CharField(max_length=100, null=True, blank=True, help_text = _("First name of student") , verbose_name =_("First name"))
    last_name = models.CharField(max_length=100, null=True, blank=True, help_text = _("Last name of student") , verbose_name =_("Last name"))
    age = models.IntegerField(help_text = _("Age") , verbose_name =_("Age"))

    def __str__(self):
        return "Student " + str(self.id) + " - " + self.first_name + " " + self.last_name + created_by_user % (self.userid.username)

    class Meta:
        verbose_name = _("Student")
        verbose_name_plural = _("Students")

index.html

{% extends "base.html" %}
{% load i18n %}
<h1> {% trans "HOME PAGE" %} </h1>
<h2> {% trans "Django is nice" %} </h2>
  1. In settings.py, add the following(In my case I created folder named locale inside BASE_DIR you can choose another location and specify the location in settings.py).

    from django.utils.translation import gettext_lazy as _
    
    LOCALE_PATHS = (
       os.path.join(BASE_DIR, 'locale'),
    )
    
    LANGUAGES = (
        ('ar', _('Arabic')),
        ('en', _('English')),
    )
    
    MULTILINGUAL_LANGUAGES = (
        "en-us",
        "ar-ae",
    )
    
  2. Run the makemessages command from any one of the 2 places based on the requirement as the command looks for the translation texts through all the child directories from which it is run.

    a. Project's root directory where manage.py resides.

    b. App's root directory where models.py, views.py resides.

    django-admin.py makemessages -l ar
    

    Click here to check the language codes

  3. The above command will create a directory named ar inside locale directory with the following folder structure.

    .
    └── ar
        └── LC_MESSAGES
            └── django.po
    
  4. In my case, django.po contains the following lines.

    # SOME DESCRIPTIVE TITLE.
    # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
    # This file is distributed under the same license as the PACKAGE package.
    # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
    #
    msgid ""
    msgstr ""
    "Project-Id-Version: \n"
    "Report-Msgid-Bugs-To: \n"
    "POT-Creation-Date: 2017-12-24 12:34+0530\n"
    "PO-Revision-Date: 2017-12-24 11:56+0400\n"
    "MIME-Version: 1.0\n"
    "Content-Type: text/plain; charset=UTF-8\n"
    "Content-Transfer-Encoding: 8bit\n"
    "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
    "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
    "Last-Translator: \n"
    "Language-Team: \n"
    "X-Generator: Poedit 1.8.11\n"
    
    #: student_activity_reporter_app/models.py:169
    msgid "First name of student"
    msgstr ""
    
    #: student_activity_reporter_app/models.py:169
    msgid "First name"
    msgstr ""
    
    #: student_activity_reporter_app/models.py:170
    msgid "Last name of student"
    msgstr ""
    
    #: student_activity_reporter_app/models.py:170
    msgid "Last name"
    msgstr ""
    
    #: student_activity_reporter_app/models.py:172
    msgid "Age"
    msgstr ""
    
    #: student_activity_reporter_app/templates/student_activity_reporter_app/index.html:93
    msgid "HOME"
    msgstr ""
    ...
    ...
    

    Now, fill the value of msgstr as the Arabic translation of the English string denoted by msgid as follows.

    # SOME DESCRIPTIVE TITLE.
    # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
    # This file is distributed under the same license as the PACKAGE package.
    # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
    #
    msgid ""
    msgstr ""
    "Project-Id-Version: \n"
    "Report-Msgid-Bugs-To: \n"
    "POT-Creation-Date: 2017-12-24 12:34+0530\n"
    "PO-Revision-Date: 2017-12-24 11:56+0400\n"
    "MIME-Version: 1.0\n"
    "Content-Type: text/plain; charset=UTF-8\n"
    "Content-Transfer-Encoding: 8bit\n"
    "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
    "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
    "Last-Translator: \n"
    "Language-Team: \n"
    "X-Generator: Poedit 1.8.11\n"
    
    #: student_activity_reporter_app/models.py:169
    msgid "First name of student"
    msgstr "الاسم الاول للمتهم"
    
    #: student_activity_reporter_app/models.py:169
    msgid "First name"
    msgstr "الاسم الاول"
    
    #: student_activity_reporter_app/models.py:170
    msgid "Last name of student"
    msgstr "اسم المتهم الأخير"
    
    #: student_activity_reporter_app/models.py:170
    msgid "Last name"
    msgstr "اسم الأخير"
    
    #: student_activity_reporter_app/models.py:172
    msgid "Age"
    msgstr "العمر"
    
    #: student_activity_reporter_app/templates/student_activity_reporter_app/index.html:93
    msgid "HOME"
    msgstr "الصفحه الرئيسيه"
    
  5. Now run the compilemessages from the same directory as mentioned above, it will generate django.mo file.

    django-admin.py compilemessages

    The directory structure of loacle directory will look like this.

    .
    └── ar
        └── LC_MESSAGES
            ├── django.mo
            └── django.po
    
  6. Start the development server using

    python manage.py runserver

    Visit http://127.0.0.1:8000/en/admin/ to view/access the English based Admin site. You will see the login page like below. English login page

    Visit http://127.0.0.1:8000/ar/admin/ to view/access the Arabic based Admin site. Now, you will see the login page like below. enter image description here

Add as many as translation texts to modules and templates, do proper configurations in settings.py, execute commands from proper place, choose proper language code and enjoy the multilingual support in your Django powered website.

References:

how to use django-admin.py makemessages --all

https://docs.djangoproject.com/en/2.0/topics/i18n/translation/

Localization: How to Create Language Files

Keim answered 31/12, 2017 at 7:17 Comment(2)
Tnx for the details answer. But not sure why you haven't mentioned anything about urls.py. isn't that required to /ar/ work ?Scrimp
Actually, you don't need to make any changes in urls.py.It will be taken care by django. As I can see in my case.Keim

© 2022 - 2024 — McMap. All rights reserved.