永发信息网

如何在 Django models 中使用多语言 的简单方法

答案:2  悬赏:80  手机版
解决时间 2021-02-26 20:35
如何在 Django models 中使用多语言 的简单方法
最佳答案
django model中使用多语言支持的快速方法, 该方法通过建立自定义的template tag 选取model中重复的语言field来达到多语言显示的目的.
假设我们有这样一个models.py, 某一个model中包含多个重复的field, 每个重复的field都是用来保存其对应的显示语言:
class MyObject(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)

class MyOtherObject(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:
from django import template
from settings import TRANSLATION_FIELDS

register = template.Library()

class LocalizedContent(template.Node):
def __init__(self, model, language_code):
self.model = model
self.lang = language_code

def render(self, context):
model = template.resolve_variable(self.model, context)
lang = template.resolve_variable(self.lang, context)
for f in TRANSLATION_FIELDS:
try:
setattr(model, f, getattr(model, '%s_%s' % (f, lang)))
except AttributeError:
pass
return ''

@register.tag(name='get_localized_content')
def get_localized_content(parser, token):
bits = list(token.split_contents())
if len(bits) != 3:
raise template.TemplateSyntaxError("'get_localized_content' tag takes exactly 2 arguments")
return LocalizedContent(model=bits[1], language_code=bits[2])

为了在template中使用自定义的tag, 我们首先载入:
{% load lazy_tags %}

然后使用自定义tag, 传入object和语言代码, 取的翻译. 比如西班牙语:
{% get_localized_content object 'es' %}

此时, 如果没有语言代码传入, 那么无法使用obj.description调用某一个语言field. 所以我们配合django.core.context_processors.request, context processor一起使用:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'django.core.context_processors.request',
)

我们就能在template中这样使用:
{% get_localized_content object request.LANGUAGE_CODE %}
全部回答
虽然我很聪明,但这么说真的难到我了
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
羽绒服染色怎么办?
广州航道局地址在哪,我要去那里办事
求转身的六宫无妃 全文
北京利昌嘉业橱柜有限公司怎么去啊,有知道地
现在国内有多少人学习西班牙语
【贵人多忘事】怎样回答贵人多忘事这句话
油墨打印机 是不是 就是喷墨打印机
湖里区兴隆社区计划生育协会在哪里啊,我有事
为什么两姐妹一个长得很高一个很矮 矮的还会
佳林广告怎么去啊,有知道地址的么
【我国有哪些珍稀动物】我国有哪些濒临灭绝的
找一些流行歌曲的数字谱
丰田威驰5.5万公里应作哪些保养
商店进行优惠大酬宾活动,袜子70元/3盒,买3
合格行楷怎么写好看
推荐资讯
兰州正大饲料直销处这个地址在什么地方,我要
万豪SOHOA座地址有知道的么?有点事想过去
四个火五笔怎么打
苹果ios10.3.2信号差
天蝎座分手后
瓜园巷/青年西路(路口)这个地址在什么地方,
飞翔通讯地址有知道的么?有点事想过去
借景抒情的片段加赏析
河南省博泰科贸有限公司地址在什么地方,想过
我是今年报考中南大学的外校考生,总分360,
《建筑施工附着升降脚手架管理暂行规定》是行
浙车牌是什么地方的
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?