You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Django多域名目录引擎的按钮差异化翻译最佳实践咨询

最佳实践方案

方案一:结合Django Sites框架与翻译系统(推荐)

Django内置的sites框架专门用于处理多域名站点,配合翻译系统能优雅解决你的需求:

  1. 启用Sites应用:在INSTALLED_APPS中添加django.contrib.sites,执行数据库迁移后,在后台为houses.com和games.com分别创建Site实例,记录对应域名、站点名称等信息。
  2. 自定义上下文处理器:编写处理器将当前请求对应的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实例并扩展模板判断即可,维护成本低。

方案二:基于域名动态切换翻译文件

若希望完全通过翻译系统解决、避免模板判断,可以为每个域名维护独立翻译文件:

  1. 创建域名专属翻译目录:在项目locale目录下,为每个域名创建子目录(如locale/houses/、locale/games/),分别在其中编译对应语言的翻译文件,将"Add Item"翻译成对应域名的目标文本。
  2. 编写中间件动态切换翻译:请求到来时根据域名加载对应翻译文件:
# 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" %},中间件会根据域名自动切换对应翻译文本,对模板侵入性极低,适合大量文本需随域名变化的场景。

方案三:自定义模板标签

若仅需修改少量文本,可编写自定义标签快速实现:

  1. 编写自定义标签:
# 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"
  1. 模板中调用标签:
{% load domain_tags %}
<button><a href="{% url 'create_item' %}">{% add_item_text %}</a></button>

该方式代码量少、实现快速,适合仅需修改少量文本的简单场景。


内容的提问来源于stack exchange,提问作者Mirat Bayrak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 02:28:14