我需要为模型上的字段翻译选项。 我有这样的事情:
from django.utils.translation import ugettext as _
from django.db import models
class MyModel(models.Model):
TYPES = (
(1, _("Option one")),
(2, _("Option two"))
(3, _("Option three"))
)
type = models.CharField(max_length=50, choices=TYPES)
在此之前,我在登录视图上有一个脚本:
request.session['django_language'] = request.POST.get("language")
所以,问题是当django在MyModel上调用TYPES时,因为request.session ['django_language']不存在。
非常感谢任何帮助。
...谢谢
答案 0 :(得分:14)
在models.py中,您需要
from django.utils.translation import ugettext_lazy as _
ugettext_lazy将返回可调用字符串而不是已翻译字符串。稍后评估callable时,它将返回已翻译的字符串。它足够晚,它将为视图/模板处理获得正确的语言。
请参阅https://docs.djangoproject.com/en/dev/topics/i18n/translation/#lazy-translations。
下一部分不是你的问题,但是:在django中你应该使用表单来处理用户输入,而不是直接从request.POST.get访问它。这是另一个主题,但我不能在这个答案中解决它,因为担心其他人可能会使用这种方法。
答案 1 :(得分:1)
<强> models.py 强>
CATEGORIES = (
('LAB', 'labor'),
('CAR', 'cars'),
('TRU', 'trucks'),
('WRI', 'writing'),
)
class PostAd(models.Model):
name = models.CharField(max_length=50)
email = models.EmailField()
gist = models.CharField(max_length=50)
category = models.CharField(max_length=3, choices=CATEGORIES)
<强> forms.py 强>
CATEGORIES = (
('LAB', 'labor'),
('CAR', 'cars'),
('TRU', 'trucks'),
('WRI', 'writing'),
)
category = forms.ChoiceField(choices=CATEGORIES, required=True)
<强> category.html 强>
<!-- category -->
<div class="fieldWrapper">
{{ form.category.errors }}
<label for="id_category">Category</label>
{{ form.category }}
</div>
<!-- location -->
答案 2 :(得分:1)
这是一个翻译您保存在数据库中的值的示例。
#models.py
from django.db import models
from django.utils.translation import gettext_noop
CATEGORY_CHOICE = (
("choice one", gettext_noop("choice one")) # gettext_noop will mark the string to be translated when you later do "python3 manage.py makemessages"
("choice two", gettext_noop("choice two"))
)
class Foo(models.Model)
category = models.CharField(choices=CATEGORY_CHOICES, max_length=50)
只需执行 python3 manage.py makemessages
即可生成语言环境 django.po 文件,输入翻译。然后执行 python3 manage.py compilemessages
来编译您的语言环境文件。
现在,在从您的视图或 api 返回此字段时,请确保执行以下操作:
#views.py
from django.utils.translation import ugettext as _
def get_category():
foo = Foo.objects.get(id=1)
return _(foo.category)
答案 3 :(得分:0)
我想我参加聚会迟到了,但是我已经解决了一个类似的问题。 django文档中有一个很好的解决方案。
from django.utils.translation import gettext_lazy as _
class Student(models.Model):
class YearInSchool(models.TextChoices):
FRESHMAN = 'FR', _('Freshman')
SOPHOMORE = 'SO', _('Sophomore')
JUNIOR = 'JR', _('Junior')
SENIOR = 'SR', _('Senior')
GRADUATE = 'GR', _('Graduate')
year_in_school = models.CharField(max_length=2, choices=YearInSchool.choices, default=YearInSchool.FRESHMAN,)
请参阅LINK
或者。
。
from enum import Enum, unique
from django.utils.translation import gettext_lazy as _
@unique class SomeChoice(Enum):
first = _('First Option')
second = _('Second Option')
很显然,您随后将枚举导入模型并根据需要使用。 例如
name = models.CharField(max_length=30, db_index=True, choices=[(s.name, s.value) for s in SomeChoice])
在这个阶段,我假设您已经编写了语言环境文件,因此您已经设置了.po文件。
#Append your translation content within .po | or via rosetta app
django-admin makemessages -all
django-admin compilemessages
点击备用语言链接