如何让Django自定义翻译在JavaScript中生效?已配置仍无效
问题排查与解决
以下是几个常见的原因和对应的修复步骤:
1. JavaScriptCatalog路由未指定自定义应用
默认情况下,JavaScriptCatalog视图只会收集Django核心模块的翻译,自定义应用的翻译不会自动纳入。你需要在路由配置里显式指定packages参数,把你的应用添加进去:
# urls.py from django.views.i18n import JavaScriptCatalog urlpatterns = [ # 自定义JS翻译路由,替换为你的实际应用名 path('ja/jsi18n/', JavaScriptCatalog.as_view(packages=['app1', 'app2']), name='javascript-catalog'), # 若要让admin的jsi18n包含自定义翻译,需重写默认路由 path('admin/jsi18n/', JavaScriptCatalog.as_view(packages=['django.contrib.admin', 'app1']), name='admin:jsi18n'), ]
2. 缺失JS专用翻译文件的生成与编译
如果自定义翻译写在JS文件里,仅生成django.po是不够的,必须单独处理JS翻译:
- 运行命令生成JS专用的
djangojs.po:django-admin makemessages -l ja -d djangojs - 编译成
djangojs.mo:django-admin compilemessages
只有这样,JS中用django.gettext('需要翻译的文本')标记的内容才会被收集进JS目录。
另外,Python代码中要在JS里使用的翻译,必须用gettext()(或_())标记,确保这些文本被提取到django.po中,且msgstr字段有正确的日语翻译、没有# fuzzy注释。
3. 翻译文件路径或编译状态异常
- 检查每个应用的
locale/ja/LC_MESSAGES/目录下,是否同时存在django.mo和djangojs.mo(如果有JS翻译需求),缺失的话重新运行compilemessages。 - 确认
django.po和djangojs.po中的目标翻译条目已完成(msgstr不为空),未翻译的内容不会被加载。
4. 缓存导致旧内容未更新
Django和浏览器都会缓存翻译内容,可尝试:
- 重启Django开发服务器
- 清除浏览器缓存(快捷键Ctrl+Shift+R)
- 若使用了Django缓存框架,运行
python manage.py clearcache清空缓存
5. 语言代码不匹配
确保请求的语言代码是ja,和你的locale目录名称完全一致(大小写敏感,不能是JA或jp),否则系统无法匹配到对应的翻译文件。
内容的提问来源于stack exchange,提问作者Cerin
相关产品推荐
相关产品推荐

