¸ÅÀÀ
¹ú¼Ê»¯µÄÄ¿±êÊÇÔÊÐíµ¥¶ÀµÄWeb³ÌÐòÒÔ¶àÖÖÓïÑÔÌṩÄÚÈݺ͹¦ÄÜ
Ä㣬Django¿ª·¢ÈËÔ±£¬¿ÉÒÔͨ¹ýÌí¼ÓÉÙÁ¿µÄ¹³×Óµ½ÄãµÄPython´úÂëºÍÄ£°åÖÐÀ´´ïµ½´ËÄ¿µÄ£¬ÕâЩ¹³×Ó³ÆÎª·Òë×Ö·û´®£¬ËüÃÇ
¸æËßDjango:"Èç¹û´ËÎı¾¿ÉÒÔÓÃÄÇÖÖÓïÑÔ·ÒëµÃµ½£¬ÕâЩÎı¾Ó¦¸Ã±»·Òë³É×îÖÕÓû§µÄÓïÑÔ"
Django¸ù¾ÝÓû§µÄÓïÑÔÑ¡Ôñ²ÉÓÃÕâЩ¹³×ÓÀ´·ÒëWeb apps
±¾ÖÊÉÏ£¬Django×öÁ½¼þÊÂÇé:
1£¬ËüÈÿª·¢ÕߺÍÄ£°å×÷ÕßÖ¸¶¨ËûÃÇappsµÄÄIJ¿·ÖÓ¦¸Ã±»·Òë
2£¬ËüʹÓÃÕâЩ¹³×ÓÀ´¸ù¾ÝÓû§µÄÓïÑÔÑ¡ÔñÎªÌØ±ðµÄÓû§·ÒëWeb apps
ÔõÑù¹ú¼Ê»¯ÄãµÄapp:·ÖÈý²½
1£¬ÔÚÄãPython´úÂëºÍÄ£°åÖÐǶÈë·Òë×Ö·û´®
2£¬ÓÃÄãÏëÖ§³ÖµÄÓïÑԵõ½ÄÇЩ×Ö·û´®µÄ·Òë
3£¬ÔÚÄãµÄDjangoÉèÖÃÖ줻îλÖÃÖмä¼þ
ÔÚÄ»ºó£¬DjangoµÄ·Òë»úÆ÷ʹÓñê×¼µÄPython×Ô´øµÄgettextÄ£¿é
Èç¹ûÄã²»ÐèÒª¹ú¼Ê»¯
DjangoµÄ¹ú¼Ê»¯¹³×ÓĬÈÏ´ò¿ª£¬ÕâÒâζ×ÅÔÚ¿ò¼ÜµÄijЩµØ·½ÓÐһЩi18nÏà¹ØµÄ¹ý¶È£¬Èç¹ûÄ㲻ʹÓùú¼Ê»¯£¬ÄãÓ¦¸Ã»¨Á½ÃëÖÓ
À´ÔÚÄãµÄsettingsÎļþÖÓÉèÖÃUSE_I18N = False£¬Èç¹ûUSE_I18NÉèÖÃΪFalse£¬ÔòDjango½«×öһЩÓÅ»¯¶ø²»ÊÇÔØÈë¹ú¼Ê»¯»úÆ÷
Äã¿ÉÄܽ«Ò²Ïë´ÓÄãµÄTEMPLATE_CONTEXT_PROCESSORSÉèÖÃÖÐɾ³ý'django.core.context_processors.i18n'
ÔõÑùÖ¸¶¨·Òë×Ö·û´®
·Òë×Ö·û´®Ö¸¶¨ÁË"¸ÃÎı¾Ó¦¸Ã±»·Òë"£¬ÕâЩ×Ö·û´®¿ÉÒÔÔÚÄãµÄPython´úÂëºÍÄ£°åÖгöÏÖ£¬±ê¼Ç·Òë×Ö·û´®ÊÇÄãµÄÔðÈΣ¬Ïµ
ͳֻÄÜ·ÒëËüÖªµÀµÄ×Ö·û´®
ÓÃPython´úÂë
±ê×¼·Òë
ͨ¹ýʹÓ÷½·¨_()Ö¸¶¨·Òë×Ö·û´®(Êǵ쬷½·¨ÃûÊÇÏ»®Ïß×Ö·û)£¬¸Ã·½·¨¿ÉÒÔÔÚÈκÎPythonÄ£¿éÈ«¾ÖµÃµ½£¬Äã²»ÐèÒªimportËü
ÔÚÕâ¸öÀý×ÓÖУ¬Îı¾"Welcome to my site."±ê¼ÇΪ·Òë×Ö·û´®:
- def my_view(request):
- output = _("Welcome to my site.")
- return HttpResponse(output)
·½·¨django.utils.translation.gettext()µÈͬÓÚ_()£¬Õâ¸öÀý×ÓºÍÇ°ÃæµÄÒ»Ñù:
- from django.utils.translation import gettext
- def my_view(request):
- output = gettext("Welcome to my site.")
- return HttpResponse(output)
·Òë¿ÉÒÔÔÚ¼ÆËãºóµÄÖµÉϹ¤×÷£¬Õâ¸öÀý×ÓºÍÇ°ÃæµÄÁ½¸öÒ»Ñù:
- def my_view(request):
- words = ['Welcome', 'to', 'my', 'site.']
- output = _(' '.join(words))
- return HttpResponse(output)
·Òë¿ÉÒÔÔÚ±äÁ¿ÉϹ¤×÷£¬ÕâÀïµÄÀý×ÓºÍÉÏÃæµÄÒ²Ò»Ñù:
- def my_view(request):
- sentence = 'Welcome to my site.'
- output = _(sentence)
- return HttpResponse(output)
(ÉÏÃæÁ½¸öÀý×ÓÖÐʹÓñäÁ¿»ò¼ÆËãÖµµÄ¾¯¸æÊÇDjangoµÄ·Òë-×Ö·û´®-¼ì²â¹¤¾ßmake-messages.py²»ÄÜÕÒµ½ÕâЩ×Ö·û´®£¬µÈ»á½é
ÉÜmake-messages¸ü¶àµÄÄÚÈÝ)
Äã´«µÝ¸ø_()»ògettext()µÄ×Ö·û´®¿ÉÒÔͨ¹ýPython±ê×¼ÃüÃû×Ö·û´®²å²¹Óï·¨Ö¸¶¨À´²ÉÓÃplaceholders£¬ÀýÈç:
- def my_view(request, n):
- output = _('%(name)s is my name.') % {'name': n}
- return HttpResponse(output)
¸Ã¼¼ÊõÈÃÓïÑÔרÓеķÒë¶ÔplaceholderÎı¾ÖØÐÂÅÅÐò£¬ÀýÈ磬һ¸öÓ¢Óï·Òë¿ÉÄÜΪ"Adrian is my name."£¬¶øÎ÷°àÑÀ·Òë¿É
ÄÜΪ"Me llamo Adrian."--ÔÚ·ÒëÎı¾ºóÃæ·ÅÖÃplaceholder(Ãû×Ö)¶ø²»ÊÇÔÚËü֮ǰ
³öÓÚÕâ¸öÔÒò£¬ÄãÓ¦¸ÃʹÓÃÃüÃû×Ö·û´®²å²¹(ÀýÈç%(name)s) ¶ø²»ÊÇλÖò岹(ÀýÈç%s»òÕß%d)£¬Èç¹ûÄãʹÓÃλÖò岹£¬·Ò뽫
²»ÄÜÖØÅÅplaceholderÎı¾
±ê¼Ç×Ö·û´®Îª²»²Ù×÷
ʹÓÃdjango.utils.translation.gettext_noop()·½·¨À´±ê¼Ç×Ö·û´®Îª·Òë×Ö·û´®¶ø²»·ÒëËü£¬×Ö·û´®ÔÚºóÃæ´ÓÒ»¸ö±äÁ¿·Òë
Èç¹ûÄãÓг£Á¿×Ö·û´®²¢ÇÒÓ¦¸Ã½«ÆäÓÃÔ´ÓïÑÔ´æ´¢ÒòΪËûÃÇÔÚϵͳ»òÓû§ÉϽ»»»µÄ»°ÔòʹÓÃËü--ÀýÈçÊý¾Ý¿âÖеÄ×Ö·û´®--µ«ÊÇ
Ó¦¸ÃÔÚ×îºóµÄ¿ÉÄܵ㱻¼°Ê±·Ò룬ÀýÈçµ±×Ö·û´®ÏÔʾ¸øÓû§Ê±
³Ù·Òë
ʹÓÃdjango.utils.translation.gettext_lazy()·½·¨À´³Ù·Òë×Ö·û´®--µ±Öµ±»·ÃÎʶø²»Êǵ±gettext_lazy()·½·¨±»µ÷ÓÃʱ
ÀýÈ磬ΪÁË·ÒëÄ£Ð͵Ähelp_text£¬×öÏÂÃæµÄÊÂÇé:
- from django.utils.translation import gettext_lazy
- class MyThing(models.Model):
- name = models.CharField(help_text=gettext_lazy('This is the help text'))
Õâ¸öÀý×ÓÖУ¬gettext_lazy()´æ´¢Á˸Ã×Ö·û´®µÄ³ÙÒýÓÃ--¶ø²»ÊÇÕæÊµµÄ·Ò룬·Òë±¾Éí½«µ±×Ö·û´®ÓÃÓÚ×Ö·û´®contextʱÍê³É
ÀýÈçÄ£°åÔÚDjangoµÄadminÕ¾µãäÖȾʱ
Èç¹ûÄ㲻ϲ»¶Èß³¤µÄÃû×Ögettext_lazy£¬Äã¿ÉÒÔÏñÕâÑù¸øËü±ðÃûΪ_(Ï»®Ïß):
- from django.utils.translation import gettext_lazy as _
- class MyThing(models.Model):
- name = models.CharField(help_text=_('This is the help text'))
ÔÚDjangoÄ£ÐÍÖÐһֱʹÓóٷÒ룬ΪÓòÃûºÍ±íÃûÌí¼Ó·ÒëÒ²ÊǸöºÃÖ÷Ò⣬ÕâÒâζ×ÅÔÚMetaÀàÖÐÏÔʽµÄдverbose_nameºÍverbo
se_name_pluralÑ¡Ïͨ¹ý:
- from django.utils.translation import gettext_lazy as _
- class MyThing(models.Model):
- name = models.CharField(_('name'), help_text=_('This is the help text'))
- class Meta:
- verbose_name = _('my thing')
- verbose_name_plural = _('mythings')
¸´ÊýÐÎʽ
ʹÓÃdjango.utils.translation.ngettext()·½·¨À´Ö¸¶¨¸´ÊýµÄÏûÏ¢£¬ÀýÈç:
- from django.utils.translation import ngettext
- def hello_world(request, count):
- page = ngettext('there is %(count)d object', 'there are %(count)d objects', count) % {
- 'count': count,
- }
- return HttpResponse(page)
ngettextʹÓÃÈý¸ö²ÎÊý:µ¥Ò»µÄ·Òë×Ö·û´®£¬¸´ÊýÐÎʽµÄ·Òë×Ö·û´®ºÍ¶ÔÏóµÄÊýÁ¿(Ëü×÷Ϊcount±äÁ¿±»´«µÝ¸ø·ÒëÓïÑÔ)
ÓÃÄ£°å´úÂë
ÔÚDjangoÄ£°åÖÐʹÓ÷ÒëʹÓÃÁ½¸öÄ£°å±êÇ©ºÍÒ»¸öÓëPython´úÂëÖÐÉÔ΢²»Í¬µÄÓï·¨£¬ÎªÁËÈÃÄãµÄÄ£°å·ÃÎÊÕâЩ±êÇ©£¬°Ñ
{% load i18n %}·ÅÖÃÔÚÄãµÄÄ£°åµÄ¶¥¶Ë
{% trans %}Ä£°å±êÇ©·Òë³£Á¿×Ö·û´®»òÕß±äÁ¿ÄÚÈÝ:
- <title>{% trans "This is the title." %}</title>
Èç¹ûÄãÖ»ÏëΪ·Òë±ê¼ÇÒ»¸öÖµ£¬µ«ÊÇÉÔºó´ÓÒ»¸ö±äÁ¿·ÒëËü£¬¿ÉÒÔʹÓÃnoopÑ¡Ïî:
- <title>{% trans "value" noop %}</title>
ÔÚ{% trans %}ÖÐʹÓÃÄ£°å±äÁ¿Ê½²»¿ÉÒ»µÄ--Ö»Óе¥ÒýºÅ»òË«ÒýºÅµÄ³£Á¿×Ö·û´®ÊÇÔÊÐíµÄ£¬Èç¹ûÄãµÄ·ÒëÐèÒª±äÁ¿(placehold
ers)£¬Ê¹ÓÃ{% blocktrans %}£¬ÀýÈç:
- {% blocktrans %}This will have {{ value }} inside. {% endblocktrans %}
ΪÁË·ÒëÄ£°å±í´ïʽ--±ÈÈçʹÓÃÄ£°å¹ýÂËÆ÷--ÄãÐèÒªÔÚ·Òë¿éÖа󶨱í´ïʽµ½±¾µØ±äÁ¿À´Ê¹ÓÃ:
- {% blocktrans with value|filter as myvar %}
- This will have {{ myvar }} inside.
- {% endblocktrans %}
Èç¹ûÄãÐèÒªÔÚÒ»¸öblocktrans±êÇ©Àï°ó¶¨¶àÓÚÒ»¸ö±í´ïʽ£¬ÓÃand·Ö¸ô:
- {% blocktrans with book|title as book_t and author|title as author_t %}
- This is {{ book_t }} by {{ author_t }}
- {% endblocktrans %}
¶ÔÓÚ¸´Êý£¬ÓÃ{% plural %}±êǩָ¶¨µ¥ÊýºÍ¸´ÊýÐÎʽ²¢ÔÚ{% blocktrans %}ºÍ{% endblocktrans %}ÖÐÏÔʾ£¬ÀýÈç:
- {% blocktrans count list|count as counter %}
- There is only one {{ name }} object.
- {% plural %}
- There are {{ counter }} {{ name }} objects.
- {% endblocktrans %}
ÄÚ²¿ËùÓеĿéºÍÄÚǶ·ÒëʹÓúÏÊʵÄgettext/ngettextµ÷ÓÃ
ÿ¸öRequestContext¿ÉÒÔ·ÃÎÊÁ½¸ö·ÒëרÓеıäÁ¿:
1£¬LANGUAGESÊÇÔª×éµÄÁÐ±í£¬ÆäÖеÚÒ»¸öÔªËØÎªÓïÑÔ´úÂ룬µÚ¶þ¸öÔªËØÎªÓïÑÔÃû(ÓøÃÓïÑÔ)
2£¬LANGUAGE_CODEÊǵ±Ç°Óû§Ñ¡ÔñµÄÓïÑÔ£¬×÷Ϊ×Ö·û´®£¬ÀýÈç:en-us(²Î¿¼ÏÂÃæµÄ"ÔõÑù·¢ÏÖÓïÑÔÑ¡Ôñ")
3£¬LANGUAGE_BIDIÊǵ±Ç°ÓïÑԵķ½Ïò£¬Èç¹ûΪTrue£¬ËüΪ´ÓÓÒµ½×óµÄÓïÑÔ£¬ÀýÈçÏ£²®À´ºÍ°¢À²®ÓÈç¹ûΪFalseÔòËüÊÇ´Ó×ó
µ½ÓÒµÄÓïÑÔ£¬ÀýÈçÓ¢Ó·¨ÓµÂÓïµÈµÈ
Èç¹ûÄ㲻ʹÓÃRequestContexÀ©Õ¹£¬Äã¿ÉÒÔÓÃÈý¸ö±êÇ©µÃµ½ÕâЩֵ:
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_current_language_bidi as LANGUAGE_BIDI %}
ÕâЩ±êǩҲÐèÒª{% load i18n %}
·Òë¹³×ÓÒ²¿ÉÒÔÔÚÈκνÓÊܳ£Á¿×Ö·û´®µÄÄ£°å¿é±êÇ©Öеõ½£¬ÕâÖÖÇé¿öÏ£¬Ö»ÐèʹÓÃ_()Óï·¨À´Ö¸¶¨·Òë×Ö·û´®£¬ÀýÈç:
- {% some_special_tag _("Page not found") value|yesno:_("yes,no") %}
ÕâÖÖÇé¿öÏ£¬±êÇ©ºÍ¹ýÂËÆ÷½«¿´µ½ÒѾ·ÒëµÄ×Ö·û´®£¬ËùÒÔËüÃDz»ÐèÒªÖªµÀ·Òë
ÔõÑù´´½¨ÓïÑÔÎļþ
Ò»µ©Äã±ê¼ÇÄãµÄ×Ö·û´®À´ÉÔºó·Ò룬ÄãÐèҪд(»òÕß»ñµÃ)ÓïÑÔ·Òë±¾Éí£¬ÕâÀï½âÊÍÁËËüÔõÑù¹¤×÷
ÏûÏ¢Îļþ
µÚÒ»²½ÊÇΪһ¸öÐÂÓïÑÔ´´½¨Ò»¸öÏûÏ¢Îļþ£¬ÏûÏ¢ÎļþÊÇÆÕͨÎı¾Îļþ£¬Ëü±íʾһ¸öµ¥¶ÀµÄÓïÑÔ£¬±£»¤ËùÓпɵõ½µÄ·Òë×Ö·û
´®ÒÔ¼°ËüÃÇÓ¦¸ÃÔõÑùÓøø¶¨ÓïÑÔ³ÊÏÖ£¬ÏûÏ¢ÎļþÓÐÒ»¸ö.poÎļþÀ©Õ¹Ãû
Django×Ô´øÒ»¸ö¹¤¾ßbin/make-messages.py£¬Ëü×Ô¶¯´´½¨ºÍά»¤ÕâЩÎļþ
ΪÁË´´½¨»ò¸üÐÂÏûÏ¢Îļþ£¬ÔËÐÐÕâ¸öÃüÁî:
bin/make-messages.py -l de
ÕâÀïµÄdeÊǶÔÓÚÏûÏ¢ÎļþÄãÏë´´½¨µÄÓïÑÔ´úÂ룬ÕâÀïµÄÓïÑÔ´úÂëΪλÖøñʽ£¬ÀýÈ磬¶Ô°ÍÎ÷Ϊpt_BR¶Ô°ÂµØÀûµÂ¹úÔòΪde_AT
¸Ã½Å²½Ó¦¸ÃÔËÐÐÓÚÏÂÃæÈý¸öµØ·½ÖеÄÒ»¸ö:
1£¬django¸ùĿ¼(²»ÊÇSubversion¼ì³ö£¬µ«ÊÇͨ¹ý$PYTHONPATHÁ´½ÓµÄ»òÕßλÓڸ÷¾¶ÆäËûλÖõĵط½)
2£¬ÄãµÄDjangoÏîÄ¿µÄ¸ùĿ¼
3£¬ÄãµÄDjango appµÄ¸ùĿ¼
¸Ã½Å²½ÔËÐÐÓÚÕû¸öDjangoÔ´´úÂëÊ÷²¢³é³öËùÓбê¼ÇΪ·ÒëµÄ×Ö·û´®£¬ËüÔÚĿ¼conf/locale´´½¨(»ò¸üÐÂ)ÏûÏ¢Îļþ£¬ÔÚdeÀý×Ó
ÖУ¬ÎļþÔòΪconf/locale/de/LC_MESSAGES/django.po
ËüÔËÐÐÓÚÄãµÄÏîĿԴ´úÂëÊ÷»òÄãµÄ³ÌÐòÔ´´úÂëÊ÷£¬Ëü½«×öͬÑùµÄÊÂÇ飬µ«ÊÇλÖÃĿ¼µÄλÖÃΪlocale/LANG/LC_MESSAGES(×¢
ÒâȱÉÙconfǰ׺)
ûÓÐgettext?
Èç¹ûÄãûÓа²×°gettext¹¤¾ß£¬make-messages.py½«´´½¨¿ÕÎļþ£¬Èç¹ûÊÇÕâÖÖÇé¿ö£¬°²×°gettext¹¤¾ß»òÕßÖ»ÊǸ´ÖÆÓ¢ÓïÏûÏ¢
Îļþ(conf/locale/en/LC_MESSAGES/django.po)²¢Ê¹ÓÃËü×÷Ϊ¿ªÊ¼µã£¬ËüÖ»ÊÇÒ»¸ö¿ÕµÄ·ÒëÎļþ
.poÎļþ¸ñʽÊÇÖ±½ÓµÄ£¬Ã¿¸ö.poÎļþ±£»¤Ò»Ð©ÔªËپݣ¬ÀýÈç·Òëά»¤ÕßµÄÁªÏµÐÅÏ¢£¬µ«ÊÇÎļþµÄ´ó²¿·ÖÄÚÈÝÊÇÏûÏ¢Áбí--¼ò
µ¥µÄ·Òë×Ö·û´®ºÍÌØÊâÓïÑÔµÄÕæÊµµÄ·ÒëÎı¾Ó³Éä
ÀýÈ磬Èç¹ûÄãµÄDjango app°üº¬Îı¾"Welcome to my site."µÄ·Òë×Ö·û´®£¬ÏñÕâÑù:
- _("Welcome to my site.")
È»ºómake-messages.py½«´´½¨Ò»¸ö°üº¬ÏÂÃæÏûϢƬ¶ÏµÄ.poÎļþ:
- #: path/to/python/module.py:23
- msgid "Welcome to my site."
- msgstr ""
Ò»¸ö¿ìËٵĽâÊÍ:
1£¬msgidÊÇ·Òë×Ö·û´®£¬ËüÒÔÔ´ÏÔʾ£¬²»Òª¸ü¸ÄËü
2£¬msgstrÄã·ÅÖÃÓïÑÔרÓеķÒ룬ËüÒÔ¿Õ¿ªÊ¼£¬ËùÒÔ¸ü¸ÄËüÊÇÄãµÄÔðÈΣ¬È·ÈÏÄãÔÚÄãµÄ·ÒëÖб£³ÖÒýºÅ
3£¬·½±ãÆð¼û£¬Ã¿¸öÏûÏ¢°üº¬·Òë×Ö·û´®ÊÕ¼¯µÄÎļþÃûºÍÐкÅ
³¤ÏûÏ¢ÊÇÌØÊâÇé¿ö£¬ÕâÀïmsgstr(»òmsgid)ºóÃæµÄµÚÒ»¸ö×Ö·û´®ÊÇ¿Õ×Ö·û´®£¬ÄÚÈݱ¾ÉíÔòÔÚϼ¸ÐÐÒÔÿÐÐÒ»¸ö×Ö·û´®À´Ð´£¬Õâ
Щ×Ö·û´®Ö±½ÓÁ¬½Ó£¬²»ÒªÍüÁË×Ö·û´®ÖнáβµÄ¿Õ¸ñ£¬·ñÔò£¬ËüÃÇ»áûÓпոñÁ¬ÔÚÒ»Æð
×¢ÒâÄãµÄ×Ö·û¼¯
µ±ÓÃÄã×îϲ»¶µÄÎı¾±à¼Æ÷´´½¨.poÎļþʱ£¬Ê×Ïȱà¼×Ö·û¼¯ÐÐ(ËÑË÷"CHARSET")²¢ÉèÖÃËüΪÄ㽫ʹÓÃÀ´±à¼ÄÚÈݵÄ×Ö·û¼¯
ͨ³£utf-8Ó¦¸ÃΪ´ó²¿·ÖÓïÑÔ¹¤×÷£¬µ«ÊÇgettextÓ¦¸Ã´¦ÀíÈκÎÄã¸øËüµÄ×Ö·û¼¯
ÔËÐÐÏÂÃæµÄÃüÁîÀ´ÎªÐµķÒë×Ö·û´®ÖØÐ¼ì²éËùÓÐÔ´´úÂëºÍÄ£°å²¢ÎªËùÓÐÓïÑÔ¸üÐÂËùÓеÄÏûÏ¢Îļþ:
make-messages.py -a
±àÒëÏûÏ¢Îļþ
ÔÚÄã´´½¨ÄãµÄÏûÏ¢ÎļþÖ®ºó--²¢ÇÒÿ´ÎÄã¸ü¸ÄËüʱ--Ä㽫ÐèÒª±àÒëËü³É¸üÓÐЧµÄÐÎʽ£¬Í¨¹ýgettextʹÓã¬Í¨¹ýbin/compile
-messages.py¹¤¾ßÍê³ÉÕâ¸ö
¸Ã¹¤¾ß¶ÔËùÓпɵõ½µÄ.poÎļþÔËÐв¢´´½¨.moÎļþ£¬.moÎļþÊÇÓÅ»¯µÄ¶þ½øÖÆÎļþÀ´ÈÃgettextʹÓã¬ÔÚͬһĿ¼Äã¿ÉÒÔÔËÐÐ
make-messages.py£¬ÏñÕâÑùÔËÐÐcompile-messages.py:
bin/compile-messages.py
¾ÍÕâÑù£¬ÄãµÄ·ÒëÒѾ¿ÉÒÔʹÓÃ
DjangoÔõÑù·¢ÏÖÓïÑÔÑ¡Ôñ
Ò»µ©Äã×¼±¸ÁËÄãµÄ·Òë--»òÕߣ¬Èç¹ûÄãÖ»ÏëʹÓÃDjango×Ô´øµÄ·Òë--Ä㽫ֻÐèҪΪÄãµÄapp¼¤»î·Òë
ÔÚÄ»ºó£¬DjangoÓÐÒ»¸ö·Ç³£Áé»îµÄÄ£ÐÍÀ´¾ö¶¨ÄĸöÓïÑÔÓ¦¸ÃʹÓÃ--°²×°¿í¶È£¬ÎªÌØÊâµÄÓû§£¬»òÕßÁ½Õß
ΪÁËÉèÖð²×°¿í¶ÈµÄÓïÑÔÑ¡Ôñ£¬ÔÚÄãµÄsettingsÎļþÉèÖÃLANGUAGE_CODE£¬DjangoʹÓøÃÓïÑÔ×÷ΪĬÈÏ·Òë--Èç¹ûûÓÐÆäËû
·ÒëÕßÕÒµ½·ÒëÔò×÷¸Ã×îÖÕ³¢ÊÔ
Èç¹ûËùÓÐÄãÏë×öµÄÖ»ÊÇÓÃÄãµÄ±¾µØÓïÑÔÔËÐÐDjango£¬²¢ÇÒÒ»¸öÓïÑÔÎļþ¶ÔÄãµÄÓïÑԿɵõ½£¬ËùÓÐÄãÐèÒª×öµÄÖ»ÊÇÉèÖÃLANGUA
GE_CODE
Èç¹ûÄãÏëÈÃÿ¸öµ¥¶ÀµÄÓû§Ö¸¶¨ÄĸöÓïÑÔËûÏëÑ¡Ôñ£¬Ê¹ÓÃLocaleMiddleware£¬LocaleMiddlewareÔÊÐí»ùÓÚ´ÓÇëÇóµÄÊý¾Ý×öÓï
ÑÔÑ¡Ôñ£¬ËüΪÿ¸öÓû§×Ô¶¨ÒåÄÚÈÝ
ΪÁËʹÓÃLocaleMiddleware£¬Ìí¼Ó'django.middleware.locale.LocaleMddleware'µ½ÄãµÄMIDDLEWARE_CLASSESÉèÖã¬ÒòΪÖÐ
¼ä¼þµÄ˳ÐòÓйØÏµ£¬ÄãÓ¦¸Ã×ñÑÏÂÁÐָʾ:
1£¬È·ÈÏËüÊÇÊ×ÏȰ²×°µÄÖмä¼þÖеÄÒ»¸ö
2£¬ËüÓ¦¸ÃÔÚSessionMiddlewareºóÃæ£¬ÒòΪLocaleMiddlewareʹÓÃsessionÊý¾Ý
3£¬Èç¹ûÄãʹÓÃCacheMiddleware£¬°ÑLocaleMiddleware·ÅÔÚËüºóÃæ
ÀýÈ磬ÄãµÄMIDDLEWARE_CLASSES¿ÉÄÜ¿´ÆðÀ´ÏñÕâÑù:
- MIDDLEWARE_CLASSES = (
- 'django.contrib.sessions.middleware.SessionMiddleware',
- 'django.middleware.locale.LocaleMiddleware',
- 'django.middleware.common.CommonMiddleware',
- )
LocaleMiddlewareͨ¹ý¸ÃËã·¨³¢ÊÔ¾ö¶¨Óû§µÄÓïÑÔÑ¡Ôñ:
1£¬Ê×ÏÈ£¬ËüÔÚµ±Ç°Óû§µÄsessionÖÐѰÕÒdjango_language¼ü
2£¬Ê§°ÜµÄ»°£¬ËüѰÕÒ½Ðdjango_languageµÄcookie
3£¬Ê§°ÜµÄ»°£¬ËüѰÕÒAccept-Language HTTPÍ·²¿£¬¸ÃÍ·²¿Í¨¹ýÄãµÄä¯ÀÀÆ÷·¢ËͲ¢ÇÒ¸æËß·þÎñÆ÷ÄãÑ¡ÔñÄĸöÓïÑÔ£¬Í¨¹ýÓÅÏȼ¶
ÅÅÐò£¬Django³¢ÊÔÍ·²¿ÖеÄÿ¸öÓïÑÔÖ±µ½ËüÕÒµ½Ò»¸ö¿ÉÒԵõ½·ÒëµÄÓïÑÔ
4£¬Ê§°ÜµÄ»°£¬ËüʹÓÃÈ«¾ÖµÄLANGUAGE_CODEÉèÖÃ
×¢Òâ:
1£¬ÔÚÕâЩµØ·½ÖеÄÿһ¸ö£¬ÓïÑÔÑ¡Ôñ±»ÆÚÍûΪ±ê×¼ÓïÑÔ¸ñʽ£¬×÷Ϊһ¸ö×Ö·û²Á£¬ÀýÈ磬°ÍÎ÷Ϊpt-br
2£¬Èç¹û»ù±¾ÓïÑÔ¿ÉÒԵõ½µ«ÊÇÖ¸¶¨µÄ×ÓÓïÑÔ²»ÄÜ£¬DjangoʹÓûù±¾ÓïÑÔ£¬ÀýÈ磬Óû§Ö¸¶¨de-at(°ÂµØÀûµÂ¹ú)µ«ÊÇDjangoÖ»
ÓÐde¿ÉµÃµ½£¬ÔòDjangoʹÓÃde
3£¬Ö»ÓÐÔÚLANGUAGESÉèÖÃÖÐÁгöµÄÓïÑÔ¿ÉÒÔ±»Ñ¡Ôñ£¬Èç¹ûÄãÏëÏÞÖÆÓïÑÔÑ¡ÔñΪÌṩµÄÓïÑÔµÄ×Ó¼¯(ÒòΪÄãµÄ³ÌÐò²»ÌṩËùÓÐÕâ
ЩÓïÑÔ)£¬ÉèÖÃLANGUAGSΪһ¸öÓïÑÔÁÐ±í£¬ÀýÈç:
- LANGUAGES = (
- ('de', _('German')),
- ('en', _('English')),
- )
Õâ¸öÀý×ÓÏÞÖÆ¿ÉµÃµ½ÓïÑÔΪѡÔñµÂÓïºÍÓ¢Óï(ÒѾÈκÎ×ÓÓïÑÔ£¬Èçde-ch»òen-us)
4£¬Èç¹ûÄ㶨ÒåÒ»¸ö×Ô¶¨ÒåLANGUAGESÉèÖ㬺ÍÇ°Ãæ½âÊ͵ÄÒ»Ñù£¬±ê¼ÇÓïÑÔΪ·Òë×Ö·û´®ÊÇ¿ÉÒÔµÄ--µ«ÊÇʹÓÃ"¼ÙµÄ"gettext()
·½·¨£¬¶ø²»ÊÇdjango.utils.translationÖеģ¬ÄãÓ¦¸Ã´Ó²»ÔÚÄãµÄsettingsÎļþÖÐimport django.utils.translation£¬ÒòΪ
¸ÃÄ£¿é±¾ÉíÒÀÀµÓÚsettings£¬²¢ÇÒËü²»»áµ¼ÖÂÑ»·import
½â¾ö·½°¸ÊÇʹÓÃ"¼ÙµÄ"gettext()·½·¨£¬ÕâÀïÊÇÒ»¸ösettingsÎļþµÄÀý×Ó:
- gettext = lambda s: s
- LANGUAGES = (
- ('de', gettext('German')),
- ('en', gettext('English')),
- )
ʹÓøÃÅÅÁУ¬make-messages.py½«ÈÔȻΪ·ÒëѰÕҺͱê¼ÇÕâЩ×Ö·û´®£¬µ«ÊÇ·Òë²»»áÔÚÔËÐÐʱ·¢Éú--ËùÒÔÄ㽫ÐèÒª¼ÇסÔÚÕæ
ʵµÄgettext()ÖÐÔÚÔËÐÐʱÓÃʹÓÃLANGUAGESµÄ´úÂë°ü×°ÓïÑÔ
5£¬LocaleMiddlewareÖ»ÄÜÑ¡ÔñÓÐDjangoÌṩµÄ»ù±¾·ÒëµÄÓïÑÔ£¬Èç¹ûÄãÏëΪÄãµÄûÓÐDjangoµÄÔ´´úÂëÊ÷ÖеķÒ뼯µÄ³ÌÐò
Ìṩ·Ò룬Ä㽫ÏëÖÁÉÙÌṩ¸ÃÓïÑԵĻù±¾µÄ·Ò룬ÀýÈ磬DjangoʹÓü¼ÊõÉϵÄÏûÏ¢IDsÀ´·ÒëÈÕÆÚºÍʱ¼ä¸ñʽ--ËùÒÔÄ㽫ÖÁÉÙ
ÐèÒªÄÇЩÈÃϵͳÕýÈ·¹¤×÷µÄ·Òë
Ò»¸öºÃµÄ¿ªÊ¼µãÊǸ´ÖÆÓ¢ÓïµÄ.poÎļþ²¢ÖÁÉÙ·Òë¼¼ÊõÏûÏ¢--¿ÉÄÜÒ²ÓÐÑéÖ¤ÏûÏ¢
¼¼ÊõÏûÏ¢IDsºÜÈÝÒ×ʶ±ð£¬ËüÃǶ¼ÊÇ´óдµÄ£¬Äã²»ÏñÆäËûÏûÏ¢Ò»Ñù·ÒëÏûÏ¢ID£¬Äã¶ÔÌṩµÄÓ¢ÓïÖµÌṩÕýÈ·µÄ±¾µØ±äÁ¿£¬ÀýÈç
ʹÓÃDATETIME_FORMAT(»òÕßDATE_FORMAT»òÕßTIME_FORMAT)£¬Ëü½«ÎªÄãÏëÓÃÄãµÄÓïÑÔʹÓõĸñʽ×Ö·û´®£¬¸ñʽµÈͬÓÚnowÄ£°å
±êǩʹÓõĸñʽ×Ö·û´®
Ò»µ©LocaleMiddleware¾ö¶¨ÁËÓû§µÄÑ¡Ôñ£¬Ëüʹ¸ÃÑ¡Ôñ¿ÉÒÔΪÿ¸öÇëÇó¶ÔÏó×÷Ϊrequest.LANGUAGE_CODEµÃµ½£¬ÔÚÄãµÄÊÓͼ
´úÂëÖÐÃâ·Ñ¶ÈÈ´¸ÃÖµ£¬ÕâÀïÊÇÒ»¸ö¼òµ¥µÄÀý×Ó:
- def hello_world(request, count):
- if request.LANGUAGE_CODE == 'de-at':
- return HttpResponse("You prefer to read Austrian German.")
- else:
- return HttpResponse("You prefer to read another language.")
×¢Ò⣬¶ÔÓÚ¾²Ì¬(ÎÞÖмä¼þ)·Ò룬ÓïÑÔλÓÚsettings.LANGUAGE_CODE£¬¶ÔÓÚ¶¯Ì¬(Öмä¼þ)·ÒëËüλÓÚrequest.LANGUAGE_CODE
set_languageÖØ¶¨ÏòÊÓͼ
·½±ãÆð¼û£¬Django×Ô´øÒ»¸öÊÓͼdjango.views.i18n.set_language£¬ËüÉèÖÃÓû§µÄÓïÑÔÑ¡Ôñ²¢Öض¨Ïò»Øµ½Ç°Ò»Ò³Ãæ
ͨ¹ýÌí¼ÓÏÂÁÐÐе½ÄãµÄURLÅäÖÃÀ´¼¤»î¸ÃÊÓͼ:
- (r'^i18n/', include('django.conf.urls.i18n')),
(×¢Òâ¸ÃÀý×ÓʹÊÓͼ¿ÉÒÔÔÚ/i18n/setlang/µÃµ½)
¸ÃÊÓͼÆÚÍûͨ¹ýGET·½·¨µÃµ½£¬²¢ÓÐÒ»¸ölanguage²ÎÊýÉèÖÃÔÚ²éѯ×Ö·û´®ÀÈç¹ûsessionÖ§³ÖÊÇÔÊÐíµÄ£¬¸ÃÊÓͼÔÚÓû§µÄses
sionÖб£´æÓïÑÔÑ¡Ôñ£¬·ñÔò£¬ËüÔÚdjango_language cookieÀï±£´æÓïÑÔÑ¡Ôñ
ÔÚÉèÖÃÁËÓïÑÔÑ¡ÔñÖ®ºó£¬Django°´ÏÂÃæµÄËã·¨ÖØ¶¨ÏòÓû§:
1£¬DjangoÔÚ²éѯ×Ö·û´®Àï²éÕÒnext²ÎÊý
2£¬Èç¹ûËü²»´æÔÚ£¬»òÕßΪ¿Õ£¬Django³¢ÊÔRefererÍ·²¿ÖеÄURL
3£¬Èç¹ûËüΪ¿Õ--±È·½ËµÈç¹ûÓû§ä¯ÀÀÆ÷½ûÖ¹Á˸ÃÍ·²¿--È»ºóÓû§½«±»Öض¨Ïòµ½/(Õ¾µãµÄ¸ù)×÷ΪÍË·
ÕâÀïÊÇHTMLÄ£°å´úÂëµÄÀý×Ó:
- <form action="/i18n/setlang/" method="get">
- <input name="next" type="hidden" value="/next/page/" />
- <select name="language">
- {% for lang in LANGUAGES %}
- <option value="{{ lang.0 }}">{{ lang.1 }}</option>
- {% endfor %}
- </select>
- <input type="submit" value="Go" />
- </form>
ÔÚÄã×Ô¼ºµÄÏîÄ¿ÖÐʹÓ÷Òë
Django°´ÏÂÃæµÄËã·¨²éÕÒ·Òë:
1£¬Ê×ÏÈ£¬ËüÔÚ±»µ÷ÓõÄÊÓͼµÄ³ÌÐòĿ¼²éÕÒlocaleĿ¼£¬Èç¹ûËüÕÒµ½Ñ¡ÔñÓïÑԵķÒ룬Ôò·Ò뽫±»°²×°
2£¬È»ºó£¬ËüÔÚÏîĿĿ¼²éÕÒlocaleĿ¼£¬ÈçËüÕÒµ½Ò»¸ö·Ò룬Ôò¸Ã·Ò뽫±»°²×°
3£¬×îºó£¬ËüÔÚdjango/conf/locale¼ì²é»ù±¾µÄ·Òë
ÕâÖÖ·½Ê½Ï£¬Äã¿ÉÒÔд°üº¬×Ô¼ºµÄ·ÒëµÄ³ÌÐò£¬²¢ÇÒÄã¿ÉÒÔÔÚÄãµÄÏîĿ·¾¶Öи²¸Ç»ù±¾·Ò룬»òÕßÄã¿ÉÒÔ¹¹½¨Ò»¸ö°üº¬Ò»Ð©
appsµÄ´óÐÍÏîÄ¿²¢°ÑËùÓеķÒë·ÅÖÃÓÚÒ»¸ö¾Þ´óµÄÏîÄ¿ÏûÏ¢Îļþ£¬Ñ¡ÔñȨÔÚÄãÊÖÖÐ
×¢Òâ
Èç¹ûÄãÔÚʹÓÃÊÖ¶¯ÅäÖõÄsettings£¬ÓÉÓÚDjangoʧȥ¼ÆËãÏîĿĿ¼λÖõÄÄÜÁ¦£¬ÏîĿĿ¼ÖеÄlocaleĿ¼½«²»±»¼ì²â(Django
ͨ³£Ê¹ÓÃsettingsÎļþµÄλÖÃÀ´¾ö¶¨Õâµã£¬Èç¹ûÄãÊÖ¶¯ÅäÖÃÄãµÄsettingsÔòsettingsÎļþ²»´æÔÚ)
ËùÓеÄÏûÏ¢Îļþ²Ö¿âÒÔͬÑùµÄ·½Ê½×éÖ¯£¬ËüÃÇÊÇ:
1£¬$APPPATH/locale/(language)/LC_MESSAGES/django.(po|mo)
2£¬$PROJECTPATH/locale/(language)/LC_MESSAGES/django.(po|mo)
3£¬ÔÚÄãµÄsettingsÎļþÖÐËùÓеÄÔÚLOCALE_PATHSÖÐÁгöµÄ·¾¶ÒÔ¸Ã˳ÐòËÑË÷(language)/LC_MESSAGES/django.(po|mo)
4£¬$PYTHONPATH/django/conf/locale/(language)/LC_MESSAGES/django.(po|mo)
ΪÁË´´½¨ÏûÏ¢Îļþ£¬ÄãºÍDjangoÏûÏ¢ÎļþʹÓÃÏàͬµÄmake-messages.py¹¤¾ß£¬ÄãÖ»ÐèÔÚÕýÈ·µÄµØ·½--ÔÚconf/locale(Ô´´úÂë
Ê÷µÄÇé¿öÏÂ)»òÕßlocale/(appÏûÏ¢»òÏîÄ¿ÏûÏ¢Çé¿öÏÂ)Ŀ¼ËùÔÚµÄλÖã¬ÄãʹÓÃÏàͬµÄcompile-messages.pyÀ´Éú³Égettext
ʹÓõĶþ½øÖÆdjango.moÎļþ
³ÌÐòÏûÏ¢ÎļþÓÐЩÄÑÒÔ·¢ÏÖ--ËüÃÇÐèÒªLocaleMiddleware£¬Èç¹ûÄ㲻ʹÓøÃÖмä¼þ£¬ÔòÖ»ÓÐDjangoÏûÏ¢ÎļþºÍÏîÄ¿ÏûÏ¢Îļþ
½«±»´¦Àí
×îºó£¬ÄãÓ¦¸Ã˼¿¼Ò»ÏÂÄãµÄ·ÒëÎļþµÄ½á¹¹£¬Èç¹ûÄãµÄ³ÌÐòÐèÒªµÝË͸øÆäËûÓû§²¢ÇÒ½«ÔÚÆäËûÏîÄ¿ÀïʹÓã¬Äã¿ÉÄÜÏñʹÓÃapp
רÓеķÒ룬µ«ÊÇʹÓÃappרÓеķÒëºÍÏîÄ¿·Òë¿ÉÄܲúÉú¹ÖÒìµÄmake-messagesÎÊÌâ:make-messages½«´©Ô½µ±Ç°Â·¾¶ÏÂËùÓÐ
µÄĿ¼ÕâÑù¿ÉÄܰÑÏûÏ¢IDs·ÅÖõ½ÒѾÔÚ³ÌÐòÏûÏ¢ÎļþµÄÏîÄ¿ÏûÏ¢ÎļþÖÐ
×î¼òµ¥µÄ·½Ê½ÊǰѲ»ÊÇÏîÄ¿µÄÒ»²¿·ÖµÄ³ÌÐò´æ´¢ÔÚÏîÄ¿Ê÷ÍâÃæ(ÕâÑùÔòЯ´øËüÃÇ×Ô¼ºµÄ·Òë)£¬ÕâÖÖ·½Ê½Ï£¬ÏîÄ¿¼¶±ðµÄmake-
messages½«Ö»·ÒëÁ¬½Óµ½ÄãµÄÍâÔÚÏîÄ¿µÄ×Ö·û´®¶ø²»Êǵ¥¶À·¢²¼µÄ×Ö·û´®
·ÒëºÍJavaScript
Ìí¼Ó·Òëµ½JavaScript²úÉúһЩÎÊÌâ:
1£¬JavaScript´úÂë²»ÄÜ·ÃÎÊgettextʵÏÖ
2£¬JavaScript´úÂë²»ÄÜ·ÃÎÊ.po»òÕß.moÎļþ£¬ËüÃÇÐèҪͨ¹ý·þÎñÆ÷µÝËÍ
3£¬JavaScriptµÄ·ÒëĿ¼Ӧ¸Ã¾¡¿ÉÄÜС
DjangoÌṩÕâЩÎÊÌâµÄÒ»¸ö¼¯³É·½°¸:Ëü´«µÝ·Òë¸øJavaScript£¬ËùÒÔÄã¿ÉÒÔÔÚJavaScriptÀïµ÷ÓÃgettextµÈµÈ
javascript_catalogÊÓͼ
ÕâЩÎÊÌâµÄÖ÷Òª½â¾ö·½°¸ÊÇjavascript_catalogÊÓͼ£¬ËüʹÓÃÄ£·Âgettext½Ó¿ÚµÄ·½Ê½·¢ËÍJavaScript´úÂë¿â£¬¼ÓÉÏÒ»¸ö·Òë
×Ö·û´®Êý×飬ÕâЩ·Òë×Ö·û´®À´×ÔÓÚ³ÌÐò£¬ÏîÄ¿»òÕßDjango´úÂ룬¸ù¾ÝÄãÔÚinfo_dict»òURLÀïÖ¸¶¨µÄ¶«Î÷
ÄãÏñÕâÑùÀ´Ê¹ÓÃËü:
- js_info_dict = {
- 'packages': ('your.app.package',),
- }
- urlpatterns = patterns('',
- (r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict),
- )
ÔÚpackagesÀïµÄÿ¸ö×Ö·û´®Ó¦¸ÃΪPythonСÊýµã°üÓï·¨(ºÍÔÚINSTALLED_APPSÀïµÄ×Ö·û´®¸ñʽһÑù)²¢ÇÒÓ¦¸ÃÒýÓðüº¬locale
Ŀ¼µÄ°ü£¬Èç¹ûÄãÖ¸¶¨¶à¸ö°ü£¬ËùÓÐÕâЩĿ¼ºÏ²¢ÎªÒ»¸öĿ¼£¬Èç¹ûÄãÓÐʹÓò»Í¬³ÌÐòµÄ×Ö·û´®µÄJavaScriptµÄ»°ÕâºÜÓÐÓÃ
Äã¿ÉÒÔͨ¹ý°Ñ°ü·ÅÔÚURLģʽÀïÀ´ÈøÃÊÓͼ±äµÃ¶¯Ì¬:
- urlpatterns = patterns('',
- (r'^jsi18n/(?P<packages>\S+?)/$, 'django.views.i18n.javascript_catalog'),
- )
ͨ¹ýÕâ¸ö£¬ÄãÔÚURLÀïÖ¸¶¨ÁËͨ¹ý'+'ºÅ·Ö¸ôµÄ°üÃûÁÐ±í£¬Èç¹ûÄãµÄÒ³ÃæÊ¹ÓÃÀ´×ÔÓÚ²»Í¬appsµÄ´úÂë²¢ÇÒËü¾³£¸Ä±ä²¢ÇÒÄã²»
Ï뽫Æä·ÅÔÚÒ»¸ö´óµÄĿ¼ÎļþÀïµÄ»°Õâ·Ç³£ÓÐÓ㬳öÓÚ°²È«¿¼ÂÇ£¬ÕâЩֵֻÄÜΪdjango.conf»òÕßINSTALLED_APPSÉèÖÃÖеÄ
°ü
ʹÓÃJavaScript·ÒëĿ¼
ΪÁËʹÓøÃĿ¼£¬Ö»ÐèÏñÕâÑù³éÈ¡¶¯Ì¬Éú³ÉµÄ½Å±¾:
- <script type="text/javascript" src="/path/to/jsi18n/"></script>
Õâ½âÊÍÁËadminÔõÑùµÃµ½´Ó·þÎñÆ÷µÃµ½·ÒëĿ¼£¬µ±Ä¿Â¼ÔØÈëʱ£¬ÄãµÄJavaScript´úÂë¿ÉÒÔʹÓñê×¼µÄgettext½Ó¿ÚÀ´·ÃÎÊËü
- document.write(gettext('this is to be translated'));
ÉõÖÁÓÐÒ»¸öngettext½Ó¿ÚºÍÒ»¸ö×Ö·û´®²å²¹·½·¨:
- d = {
- count: 10
- };
- s = interpolate(ngettext('this is %(count)s object', 'this are %(count)s objects', d.count), d);
¸Ãinterpolate·½·¨Ö§³ÖλÖò岹ºÍÃüÃû²å²¹£¬ËùÒÔÉÏÃæµÄÄÚÈÝ¿ÉÒÔÕâÑùд:
- s = interpolate(ngettext('this is %s object', 'this are %s objects', 11), [11]);
²å²¹Óï·¨½èÖúÓÚPython£¬Äã²»Ó¦¸Ã×ÜʹÓÃ×Ö·û´®²å²¹:ËüÈÔÈ»ÊÇJavaScript£¬ËùÒÔ´úÂ뽫²»µÃ²»×öÖØ¸´µÄÕýÔò±í´ïÊ½Ìæ»»£¬Õâ
²»ÏñÔÚPythonÖÐ×ö×Ö·û´®²å²¹ÄÇô¿ì£¬ËùÒÔµ±ÄãÕæÕýÐèÒªËüʱ²ÅʹÓÃËü(ÀýÈ磬Óëngettext¹¤×÷À´Éú³ÉÕýÈ·µÄ¸´ÊýÐÎʽ)
´´½¨JavaScript·ÒëĿ¼
ÄãʹÓÃÆäËûDjango·ÒëĿ¼ͬÑùµÄ·½Ê½À´´´½¨ºÍ¸üзÒëĿ¼--ʹÓÃmake-messages.py¹¤¾ß£¬Î¨Ò»µÄÇø±ðÊÇÄãÐèÒªÏñÕâÑùÌá
¹©Ò»¸ö-d djangojs²ÎÊý:
- make-messages.py -d djangojs -l de
Õ⽫ΪµÂÓïµÄJavaScript´´½¨»ò¸üзÒëĿ¼£¬ÔÚ¸üзÒëĿ¼֮ºó£¬ÏñÆÕͨDjango·ÒëĿ¼һÑùÔËÐÐcompile-messages.py
ÊìϤgettextµÄÓû§×¢Òâ
Èç¹ûÄãÁ˽âgettext£¬Äã¿ÉÄÜ×¢Òâµ½Django×ö·ÒëµÄÕâÐ©ÌØÐÔ:
1£¬×Ö·û´®ÁìÓòΪdjango»òÕßdjangojs£¬×Ö·û´®ÁìÓòÓÃÀ´Çø·Ö²»Í¬µÄ´æ´¢Êý¾ÝÓÚͨÓÃÏûÏ¢Îļþ¿â(ͨ³£ÔÚ/usr/share/locale/)
µÄ³ÌÐò£¬djangoÁìÓò±»pythonºÍÄ£°å·Òë×Ö·û´®Ê¹Óò¢ÇÒÔØÈ뵽ȫ¾Ö·ÒëĿ¼£¬djangojsÁìÓòÖ»±»JavaScript·ÒëĿ¼ÓÃÀ´
È·ÈÏËüÃǾ¡¿ÉÄÜС
2£¬DjangoֻʹÓÃgettextºÍgettext_noop£¬ÕâÊÇÒòΪDjangoÄÚ²¿Ò»Ö±Ê¹ÓÃDEFAULT_CHARSET×Ö·û´®£¬¶ÔugettextûÓкܶàʹÓÃ
ÒòΪÄãÒ»Ö±ÐèÒªÉú³Éutf-8
3£¬Django²»µ¥¶ÀʹÓÃxgettext£¬ËüʹÓÃxgettextºÍmsgfmtµÄPython°ü×°Æ÷£¬ÕâÖ÷ÒªÊÇΪÁË·½±ã
°²»ÕлªµçÄÔѧУרҵְҵ¹æ»®Ê¦ÎªÄãÌṩ¸ü¶à°ïÖú¡¾ÔÚÏß×Éѯ¡¿