Django rest api 自定义改造国际化源码解读注意事项

 参考大江狗国际化文档

引用大江狗博客:(如有版权问题,请联系删除)

Django国际化 | 大江狗的博客icon-default.png?t=M3K6https://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" 应该有点含义,后补,暂时用不到

注意

  1. 你完全可以自行补充剩余的 key 和 value,并一定使用这个命令

  2. 这个命令会自动地将 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 _ 

综上国际化自由化改造问题解决

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值