Django - 如何翻译表单字段的静态选择

Django - How to translate static choices of a form field

提问人:user3507584 提问时间:9/14/2023 更新时间:9/14/2023 访问量:37

问:

我有一个表格,可以在多语言文本中更新用户的详细信息。在性别下拉列表中,它不会翻译性别选择,如下所示:

Example

我尝试在 model.py 文件中使用选项。我在 .po 文件中看到它们。它仍然不起作用。我做错了什么?gettext_noop

model.py

from django.utils.translation import gettext_noop
Account_sex = [('male',gettext_noop('Male')),('female',gettext_noop('Female'))]  #List of tuples with choices. First one is what's stored in DB and second what is shown in html.

class Account(AbstractBaseUser):
    first_name = models.CharField(max_length=50)
    email = models.EmailField(max_length=100, unique=True)
    sex = models.CharField(max_length=10, blank=True, null=True, choices=Account_sex, default='male') 

view.py

@login_required(login_url='login')
def edit_profile(request):
    if request.user.is_authenticated:
        current_user = Account.objects.get(id=request.user.id)
        form = EditProfileForm(request.POST or None, instance=current_user)
        if form.is_valid():
            form.save()
            messages.success(request,("Your profile has been updated!"))
            return redirect('dashboard')

        return render(request, 'accounts/edit_profile.html',context={'form':form}) #
    else:
        messages.success(request,('You must be logged in!'))
        return redirect('login')

edit_profile.html

<div class="col col-auto form-group">
 <label>{% trans "Sex" %}</label>
 {{ form.sex }}
</div>

姜戈.po

#: .\accounts\models.py:44
msgid "Male"
msgstr "Hombre"

#: .\accounts\models.py:44
msgid "Female"
msgstr "Mujer"
Django 国际化 翻译 gettext django-i18n

评论

0赞 Ivan Starostin 9/14/2023
这里有一个明显的例子:docs.djangoproject.com/en/4.2/topics/i18n/translation/......

答:

2赞 SamSparx 9/14/2023 #1

简单的答案是您需要使用而不是 .gettext_lazygettext_noop

gettext_noop出于 .po 文件等的目的说“这是一个可翻译的字符串”,但实际上并没有翻译它。例如,如果需要在用户消息中使用已翻译的字符串,但在日志中使用未翻译的字符串,这将非常有用。但是你需要使用它来实际翻译它(使用此处的惰性版本来推迟翻译,直到用户选择的语言为止)。gettext_lazy

评论

0赞 user3507584 9/24/2023
谢谢!它确实有效!:)供其他人参考:from django.utils.translation import gettext_lazy Account_sex = [('male',gettext_lazy('Male')),('female',gettext_lazy('Female'))]