回覆列表
  • 1 # 使用者1220686403821

    djangomodel中使用多語言支援的快速方法,該方法透過建立自定義的templatetag選取model中重複的語言field來達到多語言顯示的目的.

    假設我們有這樣一個models.py,某一個model中包含多個重複的field,每個重複的field都是用來儲存其對應的顯示語言:

    classMyObject(models.Model):

    name=models.CharField(max_length=50)

    title_en=models.CharField(max_length=50)

    title_es=models.CharField(max_length=100)

    title_fr=models.CharField(max_length=100)

    description_en=models.CharField(max_length=100)

    description_es=models.CharField(max_length=100)

    description_fr=models.CharField(max_length=100)

    classMyOtherObject(models.Model):

    name=models.CharField(max_length=50)

    content_en=models.CharField(max_length=200)

    content_es=models.CharField(max_length=200)

    content_fr=models.CharField(max_length=200)

    注意,我們將下劃線和語言程式碼作為字尾放在對應的field後面,這將作為一個語言的查詢標記.

    然後我們在settings.py中新增需要翻譯的field名:

    TRANSLATION_FIELDS=("title","description","content")

    在專案目錄中新增templatetags目錄(不要忘了怎家__init__.py),並在其中建立lazy_tags.py:

    fromdjangoimporttemplate

    fromsettingsimportTRANSLATION_FIELDS

    register=template.Library()

    classLocalizedContent(template.Node):

    def__init__(self,model,language_code):

    self.model=model

    self.lang=language_code

    defrender(self,context):

    model=template.resolve_variable(self.model,context)

    lang=template.resolve_variable(self.lang,context)

    forfinTRANSLATION_FIELDS:

    try:

    setattr(model,f,getattr(model,"%s_%s"%(f,lang)))

    exceptAttributeError:

    pass

    return""

    @register.tag(name="get_localized_content")

    defget_localized_content(parser,token):

    bits=list(token.split_contents())

    iflen(bits)!=3:

    raisetemplate.TemplateSyntaxError(""get_localized_content"tagtakesexactly2arguments")

    returnLocalizedContent(model=bits[1],language_code=bits[2])

    為了在template中使用自定義的tag,我們首先載入:

    {%loadlazy_tags%}

    然後使用自定義tag,傳入object和語言程式碼,取的翻譯.比如西班牙語:

    {%get_localized_contentobject"es"%}

    此時,如果沒有語言程式碼傳入,那麼無法使用obj.description呼叫某一個語言field.所以我們配合django.core.context_processors.request,contextprocessor一起使用:

    TEMPLATE_CONTEXT_PROCESSORS=(

    ...

    "django.core.context_processors.request",

    )

    我們就能在template中這樣使用:

    {%get_localized_contentobjectrequest.LANGUAGE_CODE%}

  • 中秋節和大豐收的關聯?
  • 一加6t的8+128G版和魅族16plus的8+128G版,哪款更好?