Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 23, 2014 12:49:24

nokados
От: Ростов
Зарегистрирован: 2013-10-15
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Как хранить текст?

Как в больших проектах с множеством модулей организовать текст, чтобы можно было сделать поддержку нескольких языков, удобно в одном месте менять текст(а не лазать по каждому файлу и менять в коде), и чтобы было оптимально по времени/памяти?



моя подпись

Офлайн

#2 Сен. 23, 2014 13:01:26

Andrew_Lvov
Зарегистрирован: 2013-03-05
Сообщения: 19
Репутация: +  1  -
Профиль   Отправить e-mail  

Как хранить текст?

Посмотрите на реализацию Django, к примеру. Там есть gettext, gettext_lazy и сами Lazy обьекты, которые оборачивают строку и получают перевод только при приведении в unicode.

Офлайн

#3 Сен. 23, 2014 13:42:19

nokados
От: Ростов
Зарегистрирован: 2013-10-15
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Как хранить текст?

Я Django никогда не пользовался. Сейчас посмотрел в github код - там ничего не понятно без знания и понимания структуры фреймфорка. Кто знает, можете кратко объяснить, как эти ф-ии устроены?



моя подпись

Офлайн

#4 Сен. 23, 2014 20:44:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10012
Репутация: +  857  -
Профиль   Отправить e-mail  

Как хранить текст?

nokados
можете кратко объяснить, как эти ф-ии устроены?
В коде все сообщения на английском оборачиваются в _(). Это сокращение по типу
_ = gettext
, чтобы каждый раз длинно не писать.
Потом пишется файл, в котором каждому английскому сообщению соответствует сообщение на русском. И вот эта функция потом их транслирует через файл. Так можно написать много языковых файлов.

Это в общих чертах, сам ещё не делал.



Офлайн

#5 Сен. 23, 2014 21:36:16

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Как хранить текст?

Универсальный способ для всех языков и фреймворков:
https://ru.wikipedia.org/wiki/Gettext

Кратко: для каждого языка создается текстовый файл с расширением .po , можно руками можно автоматически (крайне рекомендуется) его создавать.
Все тексты для перевода выделяются с помощью специализированных функций используемого вами фреймворка, но общепринятой практикой является приводить функции перевода к знаку подчеркивания, т.е _(“Hello”) .
Текстовый .po файл заполняется строчками, с переводами по типу:

#: myfile.py
msgid “Hello”
msgstr “Привет”

Для редактирования такого файла подойдет любой текстовый редактор, но есть и специализированные программы, например poedit.
Далее po-файл компилируется, для этого есть команда msgfmt (из пакета gettext), для Django удобнее это делать через интерфейс к django-admin:

django-admin.py compilemessages
Собственно вот и всё.
Полная документация интернационализации в Django http://djbook.ru/ch18.html

nokados
Как в больших проектах с множеством модулей организовать текст, чтобы можно было сделать поддержку нескольких языков, удобно в одном месте менять текст(а не лазать по каждому файлу и менять в коде), и чтобы было оптимально по времени/памяти?

Тут еще нужно уточнить на чём проект. Помимо gettext есть другие решения, например у Qt, хотя никто не мешает пользовать в том же Qt — gettext.

Отредактировано Alen (Сен. 24, 2014 06:00:04)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version