Django双语博客开发:如何翻译模型查询返回的文章内容?
嘿,我懂你现在的困惑——{% blocktrans %}确实能帮你处理带变量的静态模板文本翻译,但它可不是用来搞定数据库里动态文章内容的哦!让我给你捋捋正确的解决思路:
最推荐的方案:使用django-modeltranslation库
这是Django生态里处理模型多语言字段最成熟的工具,官方也很推荐,步骤超清晰:
安装库
在终端运行:pip install django-modeltranslation配置settings.py
把modeltranslation加到INSTALLED_APPS里,注意要放在django.contrib.admin前面,不然后台显示会有问题:INSTALLED_APPS = [ 'modeltranslation', 'django.contrib.admin', # 其他已有的app... ]同时确保你已经在settings里配置了支持的语言,比如:
LANGUAGES = [ ('en', 'English'), ('zh-hans', '简体中文'), ] USE_I18N = True配置模型的翻译字段
可以在你的models.py里直接添加翻译配置,或者单独建一个translation.py文件(更规范)。比如你的文章模型是Article:from django.db import models from modeltranslation.translator import register, TranslationOptions class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() # 其他字段比如创建时间、作者之类的... # 注册翻译配置 @register(Article) class ArticleTranslationOptions(TranslationOptions): # 指定需要翻译的字段 fields = ('title', 'content',)迁移数据库
运行以下命令让Django自动生成多语言对应的数据库字段(比如title_en、content_zh-hans):python manage.py makemigrations python manage.py migrate后台管理与模板使用
- 后台会自动生成对应语言的输入框,你可以直接在后台填写不同语言的标题和内容;
- 模板里不用任何特殊翻译标签,直接调用字段就行,Django会根据当前激活的语言自动加载对应版本:
<h2>{{ article.title }}</h2> <div class="article-content">{{ article.content }}</div>
如果需要手动指定语言(比如做语言切换按钮),也可以直接调用
article.title_en、article.content_zh-hans这类字段。
手动实现方案(不依赖第三方库)
如果你不想用第三方库,也可以手动给模型添加多语言字段:
class Article(models.Model): title_en = models.CharField(max_length=200, verbose_name="英文标题") title_zh = models.CharField(max_length=200, verbose_name="中文标题") content_en = models.TextField(verbose_name="英文内容") content_zh = models.TextField(verbose_name="中文内容") # 其他字段...
然后在模板里根据当前语言判断显示哪个字段:
{% if request.LANGUAGE_CODE == 'en' %} <h2>{{ article.title_en }}</h2> <div>{{ article.content_en }}</div> {% else %} <h2>{{ article.title_zh }}</h2> <div>{{ article.content_zh }}</div> {% endif %}
不过这种方法比较繁琐,后台管理也要自己配置字段显示,适合简单场景。
为什么{% blocktrans %}没用?
再给你补个知识点:{% blocktrans %}的作用是把模板里的静态文本提取到po/mo翻译文件里,而数据库里的文章内容是动态存储的,不属于模板的静态字符串,所以这个标签根本没法处理这类内容哦~
内容的提问来源于stack exchange,提问作者swordfish

