如何让Django调用localflavor时正确遵循区域语言设置?
解决Django Ajax请求中localflavor地区名称翻译不生效的问题
核心问题
- 多语言配置完成后,Ajax视图返回
django-localflavor的JP_PREFECTURES数据时,无法根据会话语言输出日语翻译,始终返回英文 - 直接返回
__proxy__类型的延迟翻译对象会触发Object of type __proxy__ is not JSON serializable错误 - 使用
translation.override()尝试切换语言无效
问题根源
django-localflavor中的地区名称用gettext_lazy包装,属于延迟翻译对象,必须在正确的语言上下文内解析才能生成对应语言的字符串- 未正确编译翻译文件,导致目标语言的翻译资源无法被加载
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
相关产品推荐
相关产品推荐

