• Django国际化和本地化


    把django的这篇文档看了一遍,基本弄懂了,讲的也挺详细的 https://docs.djangoproject.com/en/1.6/topics/i18n/

    首先是国际化和本地化概念:

    1,国际化

    这是程序员做的工作,在代码中,模板中,做好相应的准备

    1.1代码中

    使用,  ugettext或者ugettext_lazy

    from django.utils.translation import ugettext  as _

    在代码中对需要进行翻译的字符串,通常是英文,使用这个函数

    result.error = _(u'Invalid Captcha')

    然后这个字符串就会被翻译为我们需要的语言, 翻译后的结果还是一个普通的字符串,没什么区别

    只是在这里, _(u'Invalid Captcha') 已经不是原来的字符串了,这个函数返回了一个对象.  Trans()类对象,具体去看django.utils.translation模块源代码吧

    1.2模板中

    要注意,代码中翻译的字符串,可能是用来填充模板的,也可能是比如Ajax接口的返回结果.

    如果我们要直接翻译模板中的字符串,那么使用django template的这两个tags :  trans 和 blocktrans

    比如

    <title>{% trans 'This is the title' %}</title>

    那blocktrans用于, 混合了字符串和变量的翻译.

    [注意]在模板中使用了 trans 或 blocktrans时

    要在开头加 

    {% load i18n %}

    不然会报错

    2,  本地化

    本地化是翻译做的工作,把原语言的目标翻译写出来

    那首先我们要使用一个工具,在app的根目录或整个工程的根目录,运行

    django-admin.py  makemessages -l zh_CN

    会生成如下的一个文件目录

    locale/
    ├── zh_CN
    │   └── LC_MESSAGES
    │       ├── django.mo
    │       └── django.po

    zh_CN指简体中文, 每种语言都有自己的目录,在django中,每个语言都有自己的LANGUAGE_CODE

    这时候打开django.po, 内容格式如下

    #: views.py:169
    msgid "Invalid CAPTCHA"
    msgstr ""
    
    #: templates/login.html: 15
    msgid "This is the title"
    msgstr ""

    把msgstr填上我们的翻译

    然后运行另一个命令

    django-admin.py  compilemessages

    就生成了编译好的django.mo,是个二进制文件,然后就OK了,最终出现的页面就是我们要的中文了

    如果我们在代码或模板中增加或删除了相关的国际化代码,需要从新运行

    makemessages  和  compilemessages

    如果只是改了django.po中的翻译,当然只需 compile 就行了.

    重启服务

    完成以上之后,需要重启一下django服务 

    和国际化有关的setting

    1,USE_I18N = True/False

    有关的代码是这样的,在django.utils.translation的__init__.py中

    1 class Trans(object);
    2      def __getattr__(self, real_name):
    3          from django.conf import settings
    4          if settings.USE_I18N:
    5              from django.utils.translation import trans_real as trans
    6          else:
    7              from django.utils.translation import trans_null as trans
    8          setattr(self, real_name, getattr(trans, real_name))
    9          return getattr(trans, real_name)

    而trans_null其实就没做什么事 

    2,LANGUAGE_CODE

    比如中文是

    LANGUAGE_CODE = 'zh_cn'

    .po 文件中的 fuzzy str translation

    有时候, 用makemessages生成的.po文件中有些msgid会被标记为 fuzzy

    比如

    #: models.py:35
    #, fuzzy
    msgid "hdapp_leader"
    msgstr "领队"

    这是因为对于 "hdapp_leader",  msgmerge工具认为这个和之前的一个msgid很相似,这个翻译可能不靠谱,于是标记fuzzy; msgfmt就会把这个msgid给略过,也就是这个翻译不会生效,当然如果我们确认是对的, 就手动删掉那行fuzzy,重新compilemessages就好.

    ------------

    下一篇

    探讨ugettext和ugettext_lazy的区别

    blocktrans

  • 相关阅读:
    Elasticsearch崩溃解决办法
    阿里云服务器ubuntu14.04安装Redis
    error: command ‘x86_64-linux-gnu-gcc’ failed with exit status 1
    本机访问阿里云服务器上的Elasticsearch
    阿里云服务器配置ElasticSearch
    ElasticSearch-RTF的安装
    【已解决】neo4j-import使用过程中遇到的问题(there's a field starting with a quote and whereas it ends that quote there seems to be characters in that field /Executor has been shut down in panic)
    OutOfMemoryError和StackOverflowError
    线程的终止
    scala基础
  • 原文地址:https://www.cnblogs.com/livingintruth/p/3568557.html
Copyright © 2020-2023  润新知