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):
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%}
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%}