在Django中无需重启为所有进程/线程重新加载.m0文件

7 投票
2 回答
2672 浏览
提问于 2025-04-15 14:09

我们正在为翻译人员开发一个 .po 文件编辑器。翻译人员需要在实时网站上看到他们所做的更改。

我们已经成功地为当前的进程或线程重新加载了 .mo 文件,但还不能为每个进程或线程都做到这一点。

有没有可能在不影响性能的情况下实现这个功能呢?

2 个回答

2

我查看了django-rosetta,果然如我所想,他们依赖于mod_wsgi的自动重载机制。这正是我会建议的做法。想了解更多细节,可以阅读重载源代码

6

我们也遇到了同样的问题。用户必须直接在网站上写翻译。我找到了一种适用于django 1.1的中间件,它可以清除翻译缓存,并尝试在django 1.4的视图中使用。

  1. 用户提交带翻译的表单
  2. 方法解析表单数据并修改*.po文件
  3. -subprocess.Popen(["python", "manage.py", "compilemessages"], stderr=PIPE, stdout=PIPE)(用于编译修改后的*.po文件)
  4. 下面的函数用于清除缓存

    from django.utils import translation
    from django.utils.translation import trans_real, get_language
    from django.conf import settings
    import gettext
    
    if settings.USE_I18N:
    
        try:
    
            # Reset gettext.GNUTranslation cache.
            gettext._translations = {}
    
            # Reset Django by-language translation cache.
           trans_real._translations = {}
    
        # Delete Django current language translation cache.
        trans_real._default = None
    
        # Delete translation cache for the current thread,
        # and re-activate the currently selected language (if any)
        translation.activate(get_language())
    except AttributeError:
        pass
    

撰写回答