基于Django多域名目录引擎的按钮差异化翻译最佳实践咨询
最佳实践方案
方案一:结合Django Sites框架与翻译系统(推荐)
Django内置的sites框架专门用于处理多域名站点,配合翻译系统能优雅解决你的需求:
- 启用Sites应用:在
INSTALLED_APPS中添加django.contrib.sites,执行数据库迁移后,在后台为houses.com和games.com分别创建Site实例,记录对应域名、站点名称等信息。 - 自定义上下文处理器:编写处理器将当前请求对应的Site实例传入模板上下文:
# your_app/context_processors.py from django.contrib.sites.shortcuts import get_current_site def current_site(request): return {'current_site': get_current_site(request)}
在settings.TEMPLATES['OPTIONS']['context_processors']中添加该处理器。
3. 模板中动态渲染文本:结合Site信息和翻译标签实现差异化显示:
{% if current_site.domain == 'houses.com' %} {% trans "Add your house" %} {% elif current_site.domain == 'games.com' %} {% trans "Add Your Game" %} {% else %} {% trans "Add Item" %} {% endif %}
后续新增域名时,只需在后台添加Site实例并扩展模板判断即可,维护成本低。
方案二:基于域名动态切换翻译文件
若希望完全通过翻译系统解决、避免模板判断,可以为每个域名维护独立翻译文件:
- 创建域名专属翻译目录:在项目
locale目录下,为每个域名创建子目录(如locale/houses/、locale/games/),分别在其中编译对应语言的翻译文件,将"Add Item"翻译成对应域名的目标文本。 - 编写中间件动态切换翻译:请求到来时根据域名加载对应翻译文件:
# your_app/middleware.py from django.utils.translation import activate, get_language class DomainTranslationMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): domain = request.get_host() translation_map = { 'houses.com': 'houses', 'games.com': 'games' } lang = translation_map.get(domain, get_language()) activate(lang) response = self.get_response(request) return response
将该中间件添加到settings.MIDDLEWARE中(需放在LocaleMiddleware之后)。
3. 模板保持原翻译标签:模板中仍使用{% trans "Add Item" %},中间件会根据域名自动切换对应翻译文本,对模板侵入性极低,适合大量文本需随域名变化的场景。
方案三:自定义模板标签
若仅需修改少量文本,可编写自定义标签快速实现:
- 编写自定义标签:
# your_app/templatetags/domain_tags.py from django import template from django.http import HttpRequest register = template.Library() @register.simple_tag(takes_context=True) def add_item_text(context): request: HttpRequest = context['request'] domain = request.get_host() if domain == 'houses.com': return "Add your house" elif domain == 'games.com': return "Add Your Game" return "Add Item"
- 模板中调用标签:
{% load domain_tags %} <button><a href="{% url 'create_item' %}">{% add_item_text %}</a></button>
该方式代码量少、实现快速,适合仅需修改少量文本的简单场景。
内容的提问来源于stack exchange,提问作者Mirat Bayrak
相关产品推荐
相关产品推荐

