我正在构建一个Django应用程序,该应用程序使用Django的翻译功能来提供多种语言的本地化。但我也使用Django的翻译功能,根据当前登录用户的设置,将某些术语翻译成不同的行业。
例如,对于在学习评估行业工作的英语用户,我想要以下行为:
对于页面的给定请求:
“learning-assessment-de”.po文件只会翻译项目中所有字符串的子集,因为它仅用于翻译某些行业特定的术语。
这就是问题:
当缺少字符串时,我希望Django回归德语(在上面的步骤#1中确定)而不是英语(我在settings.py中的默认语言)。
我的默认英语/德语.po文件将假设某个行业。
这可能吗?
答案 0 :(得分:1)
我认为这是可能的,并且最快的方法之一(即使测试它是否有效)将是修补Django翻译模块以添加这样的后备语言支持(未经测试):
from django.utils.translation import trans_real
... # Import other things
# Added `fallback_language` parameter
def do_translate(message, translation_function, fallback_language=None):
"""
Translates 'message' using the given 'translation_function' name -- which
will be either gettext or ugettext. It uses the current thread to find the
translation object to use. If no current translation is activated, the
message will be run through the default translation object.
"""
global _default
# str() is allowing a bytestring message to remain bytestring on Python 2
eol_message = message.replace(str('\r\n'), str('\n')).replace(str('\r'), str('\n'))
t = getattr(_active, "value", None)
if t is not None:
result = getattr(t, translation_function)(eol_message)
else:
# Use other language as fallback.
if fallback_language is not None:
fallback = translation(fallback_language)
result = getattr(_default, translation_function)(eol_message)
else:
if _default is None:
from django.conf import settings
_default = translation(settings.LANGUAGE_CODE)
result = getattr(_default, translation_function)(eol_message)
if isinstance(message, SafeData):
return mark_safe(result)
return result
# Added `fallback_language` parameter
def do_ntranslate(singular, plural, number, translation_function, fallback_language=None):
global _default
t = getattr(_active, "value", None)
if t is not None:
return getattr(t, translation_function)(singular, plural, number)
# Use other language as fallback.
if fallback_language is not None:
fallback = translation(fallback_language)
return getattr(fallback, translation_function)(singular, plural, number)
if _default is None:
from django.conf import settings
_default = translation(settings.LANGUAGE_CODE)
return getattr(_default, translation_function)(singular, plural, number)
# Override Django functions with custom ones.
trans_real.do_translate = do_translate
trans_real.do_ntranslate = do_ntranslate
以上两个函数取自django.utils.translation.trans_real
模块。刚为这些功能添加了几行。您还需要修改其他功能(例如gettext
,ngettext
,pgettext
)以接受fallback_language
参数并将其传递给上述两个参数。请尝试此代码是否有效。
请注意,猴子修补程序是项目范围的 - 它也会影响整个应用程序和第三方应用程序。或者,您可以将django.utils.translation.trans_real
模块的源代码作为基础,以创建仅在应用程序中的少数位置使用的自定义翻译函数。