Django中德语与奥地利德语版本无法区分的问题求助
解决Django中区分德语(de)与奥地利德语(de-at)的问题
我之前在做多语言Django项目时也碰到过几乎一模一样的问题——区分标准德语和奥地利德语,下拉框总是显示成一样的,翻译也不生效。给你几个亲测有效的解决思路:
1. 手动控制下拉选项的显示文本
Django默认的语言信息解析会把de-at归类为德语,导致下拉框显示重复。最直接的办法就是在模板里通过条件判断自定义每个语言选项的显示内容,不依赖Django自动生成的名称。
修改你的语言切换表单代码,比如:
<form action="{% url 'set_language' %}" method="post"> {% csrf_token %} <input name="next" type="hidden" value="{{ redirect_to }}"> <select name="language"> {% get_current_language as LANGUAGE_CODE %} {% for lang_code, lang_name in LANGUAGES %} <option value="{{ lang_code }}" {% if lang_code == LANGUAGE_CODE %}selected{% endif %}> {% if lang_code == 'de' %}Deutsch (Deutschland){% elif lang_code == 'de-at' %}Deutsch (Österreich){% else %}{{ lang_name }}{% endif %} </option> {% endfor %} </select> <input type="submit" value="Sprache wechseln"> </form>
这样就能强制让两个德语变体显示不同的文本,用户一眼就能区分开。
2. 修正LANGUAGES配置与翻译文件
首先,在settings.py里明确给每个语言代码设置唯一的显示名称:
from django.utils.translation import gettext_lazy as _ LANGUAGES = [ ('en', _('English')), ('de', _('German (Germany)')), ('de-at', _('German (Austria)')), ]
然后要注意翻译文件的命名规范:Django遵循POSIX标准,语言区域代码用下划线分隔,所以奥地利德语的翻译文件夹应该是locale/de_AT/LC_MESSAGES(不是de-at),里面放置django.po和django.mo文件。
编译翻译文件时,使用命令:
django-admin compilemessages
之后在模板里循环LANGUAGES时,就能正确显示你定义的差异化名称了。
3. 验证语言切换的有效性
切换语言后,在模板里输出{{ LANGUAGE_CODE }},确认当前生效的语言代码是de-at而不是de。如果还是显示de,说明Django的语言中间件自动降级了语言代码,这时候可以:
- 检查
settings.py里的LANGUAGE_COOKIE_NAME是否正确配置 - 确保
django.middleware.locale.LocaleMiddleware在中间件列表中的位置正确(放在SessionMiddleware之后,CommonMiddleware之前)
4. 自定义语言信息解析(进阶)
如果你想彻底解决Django对区域语言的识别问题,可以自定义一个函数来替换默认的get_language_info,比如在utils.py里写:
from django.utils.translation import gettext_lazy as _ def get_custom_language_info(lang_code): lang_info = { 'de': {'name': _('German (Germany)'), 'code': 'de'}, 'de-at': {'name': _('German (Austria)'), 'code': 'de-at'}, 'en': {'name': _('English'), 'code': 'en'}, } return lang_info.get(lang_code, {'name': lang_code, 'code': lang_code})
然后在模板里调用这个函数来获取语言名称,而不是用Django默认的方法。
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

