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

如何让Django调用localflavor时正确遵循区域语言设置?

解决Django Ajax请求中localflavor地区名称翻译不生效的问题

核心问题

  • 多语言配置完成后,Ajax视图返回django-localflavor的JP_PREFECTURES数据时,无法根据会话语言输出日语翻译,始终返回英文
  • 直接返回__proxy__类型的延迟翻译对象会触发Object of type __proxy__ is not JSON serializable错误
  • 使用translation.override()尝试切换语言无效

问题根源

  1. django-localflavor中的地区名称用gettext_lazy包装,属于延迟翻译对象,必须在正确的语言上下文内解析才能生成对应语言的字符串
  2. 未正确编译翻译文件,导致目标语言的翻译资源无法被加载
  3. translation.override()的临时上下文未覆盖延迟对象的解析时机

解决方案

1. 编译翻译文件

确保django-localflavor的日语翻译已编译生效:

  • 检查项目或django-localflavor安装目录下的locale/ja/LC_MESSAGES路径,确认存在django.po翻译文件
  • 运行编译命令生成二进制翻译文件:
python manage.py compilemessages

2. 修正视图语言激活逻辑

在视图中先激活目标语言,再解析延迟翻译对象,确保字符串转换在正确的语言环境中进行:

from django.utils import translation
from django.http import JsonResponse
from localflavor.jp.jp_prefectures import JP_PREFECTURES

def get_country_states(request):
    current_lang = request.session.get('l', 'en')
    country_code = request.GET.get('code')
    
    states = {}
    if country_code == 'ja':
        # 激活会话指定的目标语言
        translation.activate(current_lang)
        # 在激活的语言环境下将延迟翻译对象转为字符串
        states = {k: str(v) for k, v in JP_PREFECTURES}
        # 可选:恢复默认语言环境
        translation.deactivate()
    # 其他国家/地区的处理逻辑...
    
    # 使用JsonResponse自动处理JSON序列化,避免手动转换错误
    return JsonResponse({'states': states})

3. 备选方案:手动映射翻译(适合小范围场景)

如果上述方法仍不生效,可直接手动定义目标语言的地区名称映射:

JP_PREFECTURES_JA = (
    ('01', '北海道'),
    ('02', '青森県'),
    ('03', '岩手県'),
    # 补充剩余都道府县的日语名称
)

def get_country_states(request):
    country_code = request.GET.get('code')
    if country_code == 'ja':
        states = dict(JP_PREFECTURES_JA)
    # ...
    return JsonResponse({'states': states})

配置检查

确保settings.py中多语言配置正确:

USE_I18N = True
LANGUAGES = [
    ('en', 'English'),
    ('ja', 'Japanese'),
]
LOCALE_PATHS = [
    BASE_DIR / 'locale',
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 07:58:28