Why internationalization and localization matter

Habr, great time of day for everyone! The Python Web-Developer course will start soon at OTUS: we invite you to the free Demo-lesson “Page Controller and Front Controller Patterns: Implementation in Django” and publish the translation of the article by Nicolle Cysneiros - Full Stack Developer (Labcodes).

, 360 . , , , , – . 4,67% . – , , , , .

, . , Python Django. , , .

— , . 

— . , () . 

Django: , – . 

, . , , :

  • ;

  • ;

  • ;

  • (. );

  • , .

Wikipedia home page in English
Wikipedia home page in Arabic

.

Python?

GNU gettext

, Python. GNU gettext, Translation Project. :

  • , ;

  • , ;

  • , , .

– Hello World app.py, gettext Python (gettext.translation) , . gettext ( gettext ), , , «Hello World!», .

import gettext
gettext.bindtextdomain("app", "/locale")
gettext.textdomain("app")
t = gettext.translation("app", localedir="locale", languages=['en_US'])
t.install()
_ = t.gettext

greeting = _("Hello, world!")
print(greeting)

, GNU xgettext. PO-, .

xgettext -d app app.py

PO- ( Portable Object) , :

#  translator-comments
#. extracted-comments
#: reference…
#, flag…
#| msgid previous-untranslated-string
msgid untranslated-string
msgstr translated-string

, .  ID (msgid), , (msgstr) – .

xgettext , app.py , PO-:

"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-03 13:23-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: app.py:7
msgid "Hello, world!"
msgstr ""

, . «Hello World!» ID . , ID .

PO- . , GNU gettext PO- (<localedir>/<languagecode>/LCMESSAGES/<domain>.po), , , PO-.

|-- app.py
|-- locale
   |-- en_US
   |   |-- LC_MESSAGES
   |       |-- app.po
   |-- pt_BR
       |-- LC_MESSAGES
       |   |-- app.po

PO- :

"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-03 13:23-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: app.py:7
msgid "Hello, world!"
msgstr "Olá, mundo!"

, PO- MO- msgfmt.

msgfmt -o app.mo app.po

MO- , , . , «Olá, mundo!»:

import gettext

gettext.bindtextdomain("app", "/locale")
gettext.textdomain("app")
t = gettext.translation("app", localedir="locale", languages=['pt_BR'])
t.install()
_ = t.gettext

greeting = _("Hello, world!")
print(greeting)

locale

(locale) POSIX, , . locale:

import datetime
import locale

locale.setlocale(locale.LC_ALL, locale='en_US')
local_conv = locale.localeconv()
now = datetime.datetime.now()
some_price = 1234567.89
formatted_price = locale.format('%1.2f', some_price, grouping=True)
currency_symbol = local_conv['currency_symbol']

print(now.strftime('%x'))
print(f'{currency_symbol}{formatted_price}')

, US English . locale.format . %x , . .

Python. , Month/Day/Year, – , – , .

$ python format_example.py
05/03/2019
$1,234,567.89

, Portuguese Brazil, , : Month/Day/Year, , , R$ , . 

import datetime
import locale

locale.setlocale(locale.LC_ALL, locale='pt_BR')
local_conv = locale.localeconv()
now = datetime.datetime.now()
some_price = 1234567.89
formatted_price = locale.format('%1.2f', some_price, grouping=True)
currency_symbol = local_conv['currency_symbol']

print(now.strftime('%x'))
print(f'{currency_symbol}{formatted_price}')

Django?

Django. GNU gettext , Accept-Language, . , Python, , django utils, gettext:

from django.http import HttpResponse
from django.utils.translation import gettext as _

def my_view(request):
    greetings = _('Hello, World!')
    return HttpResponse(greetings)

, Python ( ). trans template , blocktrans , .

<p>{% trans "Hello, World!" %}</p>
<p>{% blocktrans %}This string will have {{ value }} inside.{% endblocktrans %}</p>

gettext Django : , , , . help_text verbose_name Django.

GNU, django admin , . , , django admin makemessages , . locale , PO- .

PO-, django admin compilemessages. PO- , django-admin compilemessages --locale=pt_BR. , Django, .

Django Accept-Language , . DateField DecimalField. , , , localize True .

from django import forms

class DatePriceForm(forms.Form):
    date = forms.DateField(localize=True)
    price = forms.DecimalField(max_digits=10, decimal_places=2, localize=True)

?

. . PO-.

QA. QA , , , , . 

, . , – . , : , , . , .


? «Python Web-Developer» Demo- OTUS!




All Articles