Эй, сейчас я работаю над приложением django для учебы и подошел к l18n. Локализация самого сайта была очень простой, но теперь я должен разрешить пользователям переводить динамическое содержимое приложения. Пользователи могут сохранять «продукты» в базе данных и давать им имена и описания, но поскольку весь сайт должен быть локализован, я должен предоставить способ перевода этих названий и описаний для пользователей.
Есть ли в django естественный способ сделать это? Или мне нужно реализовать это как часть приложения (путем представления переводов в модели данных)
Спасибо, Янош






Это зависит от того, кто будет переводить. Если вы хотите предоставить веб-интерфейс для перевода, вам необходимо разработать его самостоятельно, а также представить переводы в базе данных.
Если те же переводчики, которые переводили сайт, также будут переводить данные, вы можете предоставить им ту же модель, которую они используют для сайта (предположительно, gettext), а затем вы также можете использовать gettext для этого контента.
«Я должен предоставить способ перевода названий и описаний тезисов пользователям».
"Есть ли в django естественный способ сделать это?"
Вы спрашиваете, может ли Django переводить с языка на язык? Вы спрашиваете о чем-то вроде http://translate.google.com/?
Я не думаю, что Django может переводить вводимые пользователем данные на другой язык.
Если вы собираетесь выполнять перевод для своих пользователей, это должно быть частью вашей модели данных.
Фильтр i18n в Django позволяет вам иметь таблицу строк перевода. Об этом говорит документация.
Я бы посоветовал проверить джанго-многоязычный. Это стороннее приложение, которое позволяет вам определять поля перевода в ваших моделях.
Конечно, вам все равно придется вводить фактические переводы, но они прозрачно хранятся в базе данных (в отличие от статических PO-файлов), о чем, я думаю, вы и спрашиваете.
Следует отметить два проекта переводимого контента в Django: http://code.google.com/p/django-multilingual/http://code.google.com/p/transdb/
Я использую джанго-многоязычный для локализации контента и django-localeurl для выбора языка на основе URL-адреса (например, mypage / en /).
Вы можете увидеть, как работают мультиязычность и localeurl, на странице JewishKrakow.net.
Также ищу плагин локализации контента, или как его написать. Можно добавить в список django-i18n-модель
Я думаю, вам следует действовать в два этапа:
На первом этапе вы должны сообщить Django, что строки, вставленные пользователем, должны быть переведены. Я думаю, что нет собственного способа сделать это. Возможно, вы можете извлечь строки из своей базы данных, поместив их в файлы для конкретной локали, запустить на них makemessages, получить файлы django.po и перевести.
Во-вторых, используйте ugettext для отображения этих строк в вашем веб-приложении.
Надеюсь, это поможет тем, у кого есть такая же проблема.
Или попробуйте это:
http://packages.python.org/django-easymode/i18n/index.html
Это очень похоже на то, как вы обычно делаете модель django, вы просто добавляете 1 декоратор над своей моделью. Он имеет административную поддержку для переведенных полей, включая встроенные и общие встроенные. Практически все, что вы можете делать с обычными моделями и административными классами, вы можете делать с интернационализированными версиями.
да, это используется в продакшене на многих веб-сайтах. Единственная причина, по которой он имеет статус бета-версии, заключается в том, что набор тестов еще не имеет 100% покрытия.
У меня на сайте 2 языка: английский и арабский Пользователи могут переключаться между языками, нажимая на флаг. В моделях я использую прокси-модель:
class Product(models.Model):
name=models.CharField(max_length=100)
name_ar=models.CharField(max_length=100, default='')
def __unicode__(self):
return self.name
class Product_ar(Product):
def __unicode__(self):
return self.name_ar
class Meta:
proxy=True
В формах я использую две формы вместо одной:
class CollectionEditForm_en(forms.Form):
name = forms.CharField(label=_('Name'), max_length=100, widget=forms.TextInput(attrs = {'size':'50'}))
product = forms.ModelChoiceField(label=_('product'), queryset=Product.objects.filter(enabled=True), empty_label=None)
class CollectionEditForm_ar(forms.Form):
name = forms.CharField(label=_('Name'), max_length=100, widget=forms.TextInput(attrs = {'size':'50'}))
product = forms.ModelChoiceField(label=_('product'), queryset=Product_ar.objects.filter(enabled=True), empty_label=None)
На языке проверки кода так:
if request.LANGUAGE_CODE=='ar':
CollectionEditForm=CollectionEditForm_ar
else:
CollectionEditForm=CollectionEditForm_en
Итак, в шаблонах я проверяю:
{% if LANGUAGE_CODE == "ar" %}
<a href = "/product/{{product.alias}}/">{{product.name_ar}}</a>
{% else %}
<a href = "/product/{{product.alias}}/">{{product.name}}</a>
{% endif %}
Надеюсь, это решение поможет кому-нибудь
Вы тестировали решение на производстве и как оно сравнивается с django-Multilingual-ng? Я выбираю новый подход к локализации полей базы данных, поскольку django-Multilingual не работает в Django 1.2+, а django-Multilingual-ng выглядит совершенно мертвым.