Djangoソースコードの基礎8-Djangoにおけるシステムレベルの国際化ローカライズを深く学ぶ
6608 ワード
具体的な使用手順と分析http://www.ibm.com/developerworks/cn/web/1101_jinjh_djangoi18n/
本編は主にシステムレベルの方法を分析する.カスタムには関係ありません
コードが多すぎて、逆方向の部分のソースコード法を採用して分析を学びます
main.pyソース
時間セクション
settings.py中
get_へformatで、ファイルの提供方法を表示します
次のすべてはget_に呼び出されます.format取得.だから入る
get_format関数
サポートされ、言語が提供されている場合
言語生存キャッシュキーワードの取得
キャッシュを取得して戻る
例外後に国際言語モジュールをロードして新しく取得し、キャッシュに記録します.
そのため、取得言語とモジュール抽出部分を重点的に分析します.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
フォーマットモジュール部分の取得list遍歴生成部分に重点を置く
言語がサポートされているかどうかを確認
言語モジュールのフォーマット
≪ロード|Load|emdw≫
言語モジュールがサポートされているかどうかを分析し、utilsのtranslationの下trans_に最終的に位置決めします.real.pyファイル内
ローカライズされたパスをたどって、多言語の符号化モジュールがサポートされているかどうかを判断します.
ローカライズパスセクションへ
このコードは面白いです.ファイルのロード部分です.
グローバルなコードはdjangoを得る.core.义齿
ローカライズパスはsettingsでなければならない.LOCALE_PATHS変数で設定します.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
言語セクションの取得
現在アクティブ化されている言語を取得します.そうしないと、
settings.LANGUAGE_コード言語
ローカライズ言語の経路を見ています.
ここは前のローカライズ内容と同じです.
他の関数は分析して見ることができる.
trans_real.pyはpythonのローカライズ方法をパッケージしています.httpセクションの強化
format.pyファイルはシステムレベルをフォーマットするいくつかの多言語関数を提供します
後でapp内で使う原理を分析する時間があります~
本編は主にシステムレベルの方法を分析する.カスタムには関係ありません
コードが多すぎて、逆方向の部分のソースコード法を採用して分析を学びます
main.pyソース
import os
from django.utils.formats import *
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.settings')
print get_format('DATETIME_INPUT_FORMATS')
時間セクション
ISO_INPUT_FORMATS = {
'DATE_INPUT_FORMATS': ('%Y-%m-%d',),
'TIME_INPUT_FORMATS': ('%H:%M:%S', '%H:%M'),
'DATETIME_INPUT_FORMATS': (
'%Y-%m-%d %H:%M:%S',
'%Y-%m-%d %H:%M:%S.%f',
'%Y-%m-%d %H:%M',
'%Y-%m-%d'
),
}
settings.py中
__author__ = 'watsy'
TIME_ZONE = 'Asia/Shanghai'
LANGUAGE_CODE = 'en-us'
USE_I18N = True
USE_L10N = True
USE_TZ = True
LANGUAGE_CODE = 'zh-cn'
SECRET_KEY = 'm&vr890n*%65ed4!alhj!-d=24cz+#)0%5@dq_8bgc&0p'
get_へformatで、ファイルの提供方法を表示します
_format_cache
_format_modules_cache
ISO_INPUT_FORMATS
reset_format_cache()
iter_format_modules()
iter_format_modules(lang)
get_format_modules(lange=None,reverse=False)
get_format(format_type,lang=None,use_l10n=None)
get_format_lazy
date_format(value,format=None,use_l10n=None)
time_format(value,format=None,use_l10n=None)
....
localize(value,use_l10n=None)
...
次のすべてはget_に呼び出されます.format取得.だから入る
get_format関数
def get_format(format_type, lang=None, use_l10n=None):
format_type = force_str(format_type)
if use_l10n or (use_l10n is None and settings.USE_L10N):
if lang is None:
lang = get_language()
cache_key = (format_type, lang)
try:
cached = _format_cache[cache_key]
if cached is not None:
return cached
else:
# Return the general setting by default
return getattr(settings, format_type)
except KeyError:
for module in get_format_modules(lang):
try:
val = getattr(module, format_type)
for iso_input in ISO_INPUT_FORMATS.get(format_type, ()):
if iso_input not in val:
if isinstance(val, tuple):
val = list(val)
val.append(iso_input)
_format_cache[cache_key] = val
return val
except AttributeError:
pass
_format_cache[cache_key] = None
return getattr(settings, format_type)
まず国際化をサポートするかどうかを判断するサポートされ、言語が提供されている場合
言語生存キャッシュキーワードの取得
キャッシュを取得して戻る
例外後に国際言語モジュールをロードして新しく取得し、キャッシュに記録します.
そのため、取得言語とモジュール抽出部分を重点的に分析します.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
def get_format_modules(lang=None, reverse=False):
"""
Returns a list of the format modules found
"""
if lang is None:
lang = get_language()
modules = _format_modules_cache.setdefault(lang, list(iter_format_modules(lang)))
if reverse:
return list(reversed(modules))
return modules
フォーマットモジュール部分の取得list遍歴生成部分に重点を置く
def iter_format_modules(lang):
"""
Does the heavy lifting of finding format modules.
"""
if check_for_language(lang):
format_locations = ['django.conf.locale.%s']
if settings.FORMAT_MODULE_PATH:
format_locations.append(settings.FORMAT_MODULE_PATH + '.%s')
format_locations.reverse()
locale = to_locale(lang)
locales = [locale]
if '_' in locale:
locales.append(locale.split('_')[0])
for location in format_locations:
for loc in locales:
try:
yield import_module('.formats', location % loc)
except ImportError:
pass
言語がサポートされているかどうかを確認
言語モジュールのフォーマット
≪ロード|Load|emdw≫
def import_module(name, package=None):
if name.startswith('.'):
if not package:
raise TypeError("relative imports require the 'package' argument")
level = 0
for character in name:
if character != '.':
break
level += 1
name = _resolve_name(name[level:], package, level)
__import__(name)
return sys.modules[name]
言語モジュールがサポートされているかどうかを分析し、utilsのtranslationの下trans_に最終的に位置決めします.real.pyファイル内
def check_for_language(lang_code):
for path in all_locale_paths():
if gettext_module.find('django', path, [to_locale(lang_code)]) is not None:
return True
return False
ローカライズされたパスをたどって、多言語の符号化モジュールがサポートされているかどうかを判断します.
ローカライズパスセクションへ
def all_locale_paths():
from django.conf import settings
globalpath = os.path.join(
os.path.dirname(upath(sys.modules[settings.__module__].__file__)), 'locale')
return [globalpath] + list(settings.LOCALE_PATHS)
このコードは面白いです.ファイルのロード部分です.
グローバルなコードはdjangoを得る.core.义齿
ローカライズパスはsettingsでなければならない.LOCALE_PATHS変数で設定します.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
言語セクションの取得
def get_language():
t = getattr(_active, "value", None)
if t is not None:
try:
return t.to_language()
except AttributeError:
pass
from django.conf import settings
return settings.LANGUAGE_CODE
現在アクティブ化されている言語を取得します.そうしないと、
settings.LANGUAGE_コード言語
ローカライズ言語の経路を見ています.
ここは前のローカライズ内容と同じです.
他の関数は分析して見ることができる.
trans_real.pyはpythonのローカライズ方法をパッケージしています.httpセクションの強化
format.pyファイルはシステムレベルをフォーマットするいくつかの多言語関数を提供します
後でapp内で使う原理を分析する時間があります~