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

如何在Django Admin中动态管理站点语言(适配Rosetta)

问题描述

当前项目的多语言站点已在settings.py中硬编码定义了两种语言:

LANGUAGES = (
    ("en-us", _("United States")),
    ("cs", _("Czech Republic")),
)

需要不修改settings.py代码,仅通过Django Admin网页界面添加新语言(比如法语),且添加后该语言要能在Rosetta翻译界面显示,最终效果等价于在配置中新增语言项:

LANGUAGES = (
    ("en-us", _("United States")),
    ("cs", _("Czech Republic")),
    ("fr", _("French")),
)

同时需要了解如何通过Django Admin实现语言的添加、删除或禁用操作。

实现方案

Django默认不支持直接通过Admin动态管理语言配置,需要先完成以下基础开发配置(这部分由开发人员操作),之后你就能在Django Admin中直观管理站点语言:

1. 创建语言存储模型

开发人员需要先创建一个数据库模型来存储可用语言,替代settings.py里的硬编码:

# 项目应用的models.py文件
from django.db import models
from django.utils.translation import gettext_lazy as _

class SiteLanguage(models.Model):
    code = models.CharField(_("语言代码"), max_length=10, unique=True, help_text="示例:en-us、cs、fr")
    name = models.CharField(_("语言名称"), max_length=50, help_text="示例:United States、Czech Republic、French")
    is_active = models.BooleanField(_("是否启用"), default=True)

    class Meta:
        verbose_name = _("站点语言")
        verbose_name_plural = _("站点语言")

    def __str__(self):
        return f"{self.name} ({self.code})"

2. 动态读取语言配置

开发人员修改settings.py,让系统从数据库动态读取启用的语言:

# settings.py文件
from django.utils.translation import gettext_lazy as _
from 你的应用名称.models import SiteLanguage

def get_active_languages():
    # 从数据库获取所有启用的语言
    active_langs = [(lang.code, _(lang.name)) for lang in SiteLanguage.objects.filter(is_active=True)]
    # 如果数据库为空,使用默认的初始语言
    if not active_langs:
        active_langs = (
            ("en-us", _("United States")),
            ("cs", _("Czech Republic")),
        )
    return active_langs

# 替换原来的硬编码LANGUAGES
LANGUAGES = get_active_languages()

3. 注册模型到Django Admin

开发人员将语言模型注册到Admin后台,这样就能在网页界面管理:

# 项目应用的admin.py文件
from django.contrib import admin
from .models import SiteLanguage

@admin.register(SiteLanguage)
class SiteLanguageAdmin(admin.ModelAdmin):
    list_display = ('code', 'name', 'is_active')  # 列表显示的字段
    list_editable = ('is_active',)  # 可直接在列表编辑的字段
    search_fields = ('code', 'name')  # 搜索字段

4. 适配Rosetta翻译工具

Rosetta默认读取settings.LANGUAGES配置,只要完成上述步骤,Rosetta会自动加载数据库中启用的语言。注意:

  • 添加新语言后,可能需要重启Django服务才能让Rosetta识别(部分支持热重载的部署环境无需重启)
  • 新语言的翻译文件需要通过Rosetta界面或Django命令生成

你在Django Admin的操作步骤

完成上述开发配置后,你就可以在Django Admin后台轻松管理语言:

  • 添加语言:进入「站点语言」管理页面,点击「添加站点语言」,输入语言代码(如fr)和名称(如French),保存即可
  • 启用/禁用语言:在「站点语言」列表页,直接勾选或取消「是否启用」选项,保存后该语言会自动从站点可用语言中加入或移除
  • 删除语言:在语言详情页点击「删除」,或在列表页勾选目标语言后批量删除(删除前建议备份对应语言的翻译文件)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:50:37