参考大江狗国际化文档
引用大江狗博客:(如有版权问题,请联系删除)
Django国际化 | 大江狗的博客https://pythondjango.cn/django/advanced/15-internationalization/
自动生成话语句解释
# 虚拟环境下 有加-i venv 意思是按照环境里的模板开始创建
# 访问时都得是中划线 使用时是下划线 中划线转下划线规则见下面继续讲解
django-admin makemessages -l zh_Hans -i venv
# 创建po文件并不是实际使用的文件,实际使用的是mo文件,po只是临时的人眼识别用的
# 所以还要再执行编译 生成mo文件 才能使用
django-admin compilemessages
中划线转下划线逻辑
def to_locale(language):
"""Turn a language name (en-us) into a locale name (en_US)."""
language, _, country = language.lower().partition('-')
if not country:
return language
# A language with > 2 characters after the dash only has its first
# character after the dash capitalized; e.g. sr-latn becomes sr_Latn.
# A language with 2 characters after the dash has both characters
# capitalized; e.g. en-us becomes en_US.
country, _, tail = country.partition('-')
country = country.title() if len(country) > 2 else country.upper()
if tail:
country += '-' + tail
return language + '_' + country
改写中间件以支持 post 传参的方式修改语言
def process_request(self, request):
urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF)
i18n_patterns_used, prefixed_default_language = is_language_prefix_patterns_used(urlconf)
language = translation.get_language_from_request(request, check_path=i18n_patterns_used)
language_from_path = translation.get_language_from_path(request.path_info)
if not language_from_path and i18n_patterns_used and not prefixed_default_language:
language = settings.LANGUAGE_CODE
# 下面这个是重点 激活语言
translation.activate(language)
request.LANGUAGE_CODE = translation.get_language()
每个 app 根目录有个 locale 文件夹就可以支持多语言了?
这是 django 内部机制,在 install app 时,在使用到该 app _("xxx") 函数时,会去找该 app 根目录的 locale 文件夹
def all_locale_paths():
"""
Return a list of paths to user-provides languages files.
"""
globalpath = os.path.join(
os.path.dirname(sys.modules[settings.__module__].__file__), 'locale')
app_paths = []
for app_config in apps.get_app_configs():
locale_path = os.path.join(app_config.path, 'locale')
if os.path.exists(locale_path):
app_paths.append(locale_path)
return [globalpath, *settings.LOCALE_PATHS, *app_paths]
这个语句你用不用都行,这个语句就是帮你节省一下时间,它会生成一个.po文件
但.po 文件生成 .mo 过程不能省略
对照vue i18n
msgid 就像于 key,msgstr 就相当于 value,其中 key 为"%(msg)s" 应该有点含义,后补,暂时用不到
注意
-
你完全可以自行补充剩余的 key 和 value,并一定使用这个命令
-
这个命令会自动地将 model,url,setting,views,template 中的 _("Welcome to China") 提取出来放在 po 文件中,避免遗失,这个其实也挺好的
重点的引入类
# 这个如果是在views控制器里作为变量使用时是不行的
# 因为lazy只在response时才渲染
from django.utils.translation import ugettext_lazy as _
# 想立即使用 用同步函数
from django.utils.translation import ugettext as _
综上国际化自由化改造问题解决