Форум сайта python.su
0
Как в больших проектах с множеством модулей организовать текст, чтобы можно было сделать поддержку нескольких языков, удобно в одном месте менять текст(а не лазать по каждому файлу и менять в коде), и чтобы было оптимально по времени/памяти?
Офлайн
1
Посмотрите на реализацию Django, к примеру. Там есть gettext, gettext_lazy и сами Lazy обьекты, которые оборачивают строку и получают перевод только при приведении в unicode.
Офлайн
0
Я Django никогда не пользовался. Сейчас посмотрел в github код - там ничего не понятно без знания и понимания структуры фреймфорка. Кто знает, можете кратко объяснить, как эти ф-ии устроены?
Офлайн
857
nokadosВ коде все сообщения на английском оборачиваются в _(). Это сокращение по типу
можете кратко объяснить, как эти ф-ии устроены?
_ = gettext
Офлайн
49
Универсальный способ для всех языков и фреймворков:
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
nokados
Как в больших проектах с множеством модулей организовать текст, чтобы можно было сделать поддержку нескольких языков, удобно в одном месте менять текст(а не лазать по каждому файлу и менять в коде), и чтобы было оптимально по времени/памяти?
Отредактировано Alen (Сен. 24, 2014 06:00:04)
Офлайн