Django应用中如何使用德语非正式称呼“du”?
嗨!我之前做德语本地化的Django项目时刚好碰到过这个需求,下面分两种常见场景给你详细说明实现方式:
场景1:全站统一使用非正式“du”称呼
如果你的站点面向的都是熟人或固定用户群体,不需要切换正式/非正式称呼,操作步骤很简单:
确认项目开启国际化支持
打开项目的settings.py,检查并配置以下关键项:USE_I18N = True # 必须设为True,开启国际化功能 LANGUAGE_CODE = 'de' # 设置默认语言为德语 LOCALE_PATHS = [ os.path.join(BASE_DIR, 'locale'), # 指定自定义翻译文件的存放路径 ]生成并修改德语翻译文件
用Django自带的命令生成德语翻译模板:django-admin makemessages -l de执行后会在
locale/de/LC_MESSAGES/目录下生成django.po文件。打开这个文件,找到所有包含正式称呼“Sie”“Ihnen”的翻译条目,将对应的msgstr替换为“du”相关的非正式表达:
比如原条目:msgid "Can you help me?" msgstr "Können Sie mir helfen?"修改为:
msgid "Can you help me?" msgstr "Kannst du mir helfen?"编译翻译文件使其生效
修改完成后,执行编译命令:django-admin compilemessages之后你的站点在德语环境下,所有翻译文本都会自动使用“du”的非正式称呼。
场景2:允许用户自主选择正式/非正式称呼
如果需要让用户自行选择用“Sie”还是“du”,需要添加一些自定义逻辑:
给用户模型添加称呼偏好字段
如果你使用自定义用户模型,直接添加字段;如果是默认User模型,可以用OneToOneField扩展:# 示例:自定义用户模型 from django.db import models from django.contrib.auth.models import AbstractUser class CustomUser(AbstractUser): # 选项:0=正式Sie,1=非正式du,默认使用非正式 address_formality = models.IntegerField( default=1, choices=((0, 'Sie'), (1, 'du')) )添加上下文处理器传递用户偏好
在你的app中新建context_processors.py文件,编写一个处理器将用户的称呼偏好传到模板:def address_formality(request): if request.user.is_authenticated: return {'address_formality': request.user.address_formality} return {'address_formality': 1} # 未登录用户默认使用非正式然后在
settings.py的TEMPLATES配置中,将这个处理器加入context_processors列表:TEMPLATES = [ { # 其他配置项 'OPTIONS': { 'context_processors': [ # 原有处理器 'your_app_name.context_processors.address_formality', ], }, }, ]模板中根据偏好加载对应翻译
最优雅的方式是结合翻译上下文,在django.po中为同一个msgid添加不同上下文的翻译:msgctxt "formal" msgid "Can you help me?" msgstr "Können Sie mir helfen?" msgctxt "informal" msgid "Can you help me?" msgstr "Kannst du mir helfen?"然后在模板里根据用户偏好调用对应上下文的翻译:
{% if address_formality == 1 %} {% trans "Can you help me?" context "informal" %} {% else %} {% trans "Can you help me?" context "formal" %} {% endif %}
这样就能灵活实现德语称呼的正式/非正式切换啦~
内容的提问来源于stack exchange,提问作者Aliquis

