问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-18 04:59

我来回答

1个回答

热心网友 时间:2022-04-18 06:28

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 %}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怎样让孩子主动找老师补课? 表格列求和公式怎么设置 求和函数公式怎么输入 北京注册成立一个公司需要多少钱 北京公司都是什么 手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 如何修改密码 贷款现在没能力偿还了会坐牢么? 购车零首付还了三个月后还不起了会不会坐牢? 问一下popping的一些问题 popping初学流程是不是先学pop,之后练14大元素就可以了?之后练熟之后就自己组合?或者自己 Boogaloo的14个元素,麻烦大神谅解下。小弟感激 两天基本掌握django算快吗 2张gtx960能不能虐过1060?(包括显存) gtx960等于gtx1060吗 gtx960有必要换1060吗 gtx960显卡和1060有啥区别呢 做淘宝的想贷款买车怎么那么难 淘宝网买车的流程 我是做淘宝的 想分期付款买车 其他手续都可以搞定 就是有一点 收入证明办不了 想买车但是银行要求提供资金流水,但我是做淘宝的没法提供,怎么办? 想买车,我是一个淘宝店主,能不能申请小额贷款啊?在杭州的申请条件是什么啊? 淘宝店主怎样贷款买车 怎么在天猫贷款买车 我自己开淘宝想分期买车需要什么手须 手机AMOLED屏和幕电脑LED背光屏还有液晶电视的IPS硬屏什么区别? qtp运行结果写入到excel里面 油菜什么时候种植最好 油菜栽培什么时间育苗? QT的QTableWidget控件中单元格图片如何导出到EXCEL文件对应单元格中 excel 怎么存储变量? 简答题(6分)+简述进程切换的步骤。- 问一问 关于台湾主持人、艺人 艾丽丝 下一站 张艾莉 台湾艾莉丝前男友 台湾的和吴宗宪合作过的搭档女艺人的名字? 台湾艾莉丝离婚了吗 fileopen会发生进程切换吗 UNIX如何进行进程调度?引入线程机制后,进程管理内容包括哪些? 谁能说说12月21日出生的名人 问个台湾偶像剧中的外国女演员? 台湾星座导师艾莉丝参加过命运好好玩综艺 进程在什么情况下从用户态切换到内核态?相应的堆栈是如何切换的 小娴和艾莉丝的贺岁热舞秀 台湾有几家没名气的演绎经济公司呢? 自考《操作系统概论》教材关于“进程切换”的错误