Django中的“gettext()”vs“gettext_lazy()”

ha5z0ras  于 2023-06-25  发布在  Go
关注(0)|答案(4)|浏览(221)

我有一个关于使用ugettext和gettext_lazy()进行翻译的问题。我了解到在模型中应该使用gettext_lazy(),而在视图中应该使用ugettext。但是还有其他地方,我也应该使用gettext_lazy()吗?那么表单定义呢?它们之间是否存在性能差异?

**编辑:**还有一件事。有时,使用gettext_noop()代替gettext_lazy()。正如文档所说,gettext_noop()字符串只标记为翻译,并在显示给用户之前尽可能晚地翻译,但我有点困惑,这不是类似于gettext_lazy()的做法吗?我仍然很难决定,我应该在我的模型和表单中使用哪个。

v440hwme

v440hwme1#

gettext()对比gettext_lazy()

在表单或模型等定义中,你应该使用gettext_lazy,因为这些定义的代码只执行一次(主要是在django启动时); gettext_lazy以惰性方式翻译字符串,这意味着,例如。每次你访问一个模型的属性名时,字符串都会被重新翻译-这完全是有意义的,因为自从django启动以来,你可能会在不同的语言中看到这个模型!
在视图和类似的函数调用中,你可以毫无问题地使用gettext,因为每次视图被调用时,gettext都会被重新执行,所以你总是会得到适合请求的正确翻译!

关于gettext_noop()

正如Bryce在他的回答中指出的那样,这个函数将一个字符串标记为可提取以进行翻译,但确实返回未翻译的字符串。这对于在两个地方使用字符串很有用-已翻译和未翻译。请参见以下示例:

import logging
from django.http import HttpResponse
from django.utils.translation import gettext as _, gettext_noop as _noop

def view(request):
    msg = _noop("An error has occurred")
    logging.error(msg)
    return HttpResponse(_(msg))
nxagd54h

nxagd54h2#

_noop的一个很好的用法是,当你想为开发人员记录一条英语消息,但将翻译后的字符串呈现给查看者时。例如,http://blog.bessas.me/posts/using-gettext-in-django/

ix0qys7i

ix0qys7i3#

懒惰版本返回一个代理对象而不是字符串,在某些情况下,它不会按预期工作。例如:

def get(self, request, format=None):
   search_str = request.GET.get('search', '')
   data = self.search(search_str)
   lst = []
   lst.append({'name': ugettext_lazy('Client'), 'result': data})
   return HttpResponse(json.dumps(lst), content_type='application/json')

会失败,因为最后一行会尝试将lst对象序列化为JSON,而不是“client”的字符串,它将具有代理对象。代理对象不可序列化为json。

bnlyeluc

bnlyeluc4#

gettext()可以在函数内部工作,但不能在函数外部工作。
gettext_lazy()可以在函数内部和外部工作。

  • 最好按照Translation的例子使用gettext_lazy()外部函数。

<gettext()>

下面是gettext()可以工作的地方:

# "my_app1/views.py"

from django.http import HttpResponse
from django.utils.translation import gettext as _

def hello(request):
    HttpResponse(_("Hello")) # Here

<gettext_lazy()>

下面是gettext_lazy()可以工作的地方:

# "core/settings.py"

from django.utils.translation import gettext_lazy as _

LANGUAGES = (
    ('en', _('English')),
    ('fr', _('French'))
)
# "my_app1/views.py"

from django.http import HttpResponse
from django.utils.translation import gettext_lazy as _

def hello(request): # Here
    HttpResponse(_("Hello"))
# "my_app1/urls.py"

from django.urls import path
from . import views
from django.utils.translation import gettext_lazy as _

app_name = "my_app1"

urlpatterns = [
    path(_('hello'), views.hello, name="hello"),
]        # Here
# "my_app1/models.py"

from django.db import models
from django.utils.translation import gettext_lazy as _

class Person(models.Model):                             # Here
    name = models.CharField(max_length=20, verbose_name=_("name"))

    class Meta:
        verbose_name = _('person') # Here
        verbose_name_plural = _('persons') # Here
# "my_app1/admin.py"

from django.contrib import admin
from django import forms
from .models import Person
from django.utils.translation import gettext_lazy as _

admin.site.site_title = _('My site title') # Here
admin.site.site_header = _('My site header') # Here
admin.site.index_title = _('My index title') # Here

class PersonForm(forms.ModelForm): # Here
    name = forms.CharField(label=_('name')) 

    class Meta:
        model = Person
        fields = "__all__"

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):    
    form = PersonForm
# "my_app1/apps.py"

from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _

class App1Config(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'my_app1'
    verbose_name = _('my app1') # Here

相关问题