PK>`P55EGG-INFO/dependency_links.txthttp://www.turbogears.org/1.0/downloads/1.0.10/index PK>pX^EGG-INFO/entry_points.txt [console_scripts] tg-admin = turbogears.command:main [distutils.commands] docs = turbogears.docgen:GenSite [paste.paster_create_template] tgbase = turbogears.command.quickstart:BaseTemplate turbogears = turbogears.command.quickstart:TurbogearsTemplate tgbig = turbogears.command.quickstart:TGBig tgwidget = turbogears.command.quickstart:TGWidgetTemplate [turbogears.command] quickstart = turbogears.command.quickstart:quickstart sql = turbogears.command.base:SQL shell = turbogears.command.base:Shell toolbox = turbogears.command.base:ToolboxCommand update = turbogears.command.quickstart:update i18n = turbogears.command.i18n:InternationalizationTool info = turbogears.command.info:InfoCommand [turbogears.identity.provider] sqlobject = turbogears.identity.soprovider:SqlObjectIdentityProvider sqlalchemy= turbogears.identity.saprovider:SqlAlchemyIdentityProvider [turbogears.extensions] identity = turbogears.identity.visitor visit = turbogears.visit [turbogears.visit.manager] sqlobject = turbogears.visit.sovisit:SqlObjectVisitManager sqlalchemy = turbogears.visit.savisit:SqlAlchemyVisitManager [turbogears.toolboxcommand] widgets = turbogears.toolbox.base:WidgetBrowser shell = turbogears.toolbox.shell:WebConsole admi18n = turbogears.toolbox.admi18n:Internationalization designer = turbogears.toolbox.designer:Designer info = turbogears.toolbox.base:Info catwalk = turbogears.toolbox.catwalk:CatWalk PK뛎>EGG-INFO/not-zip-safe PK>{nEGG-INFO/PKG-INFOMetadata-Version: 1.0 Name: TurboGears Version: 1.0.10 Summary: Front-to-back, open-source, rapid web development framework Home-page: http://www.turbogears.org/ Author: TurboGears Release Team Author-email: turbogears@googlegroups.com License: MIT Download-URL: http://www.turbogears.org/1.0/downloads/1.0.10/index Description: Front-to-back rapid web development =================================== TurboGears brings together four major pieces to create an easy to install, easy to use web mega-framework. It covers everything from front end (MochiKit JavaScript for the browser, Genshi / Kid / Mako / Cheetah for templates in Python) to the controllers (CherryPy) to the back end (SQLAlchemy or SQLObject). The TurboGears project is focused on providing documentation and integration with these tools without losing touch with the communities that already exist around those tools. TurboGears is easy to use for a wide range of web applications. The latest development version is available in the `TurboGears subversion repository`_. Our `mailing list`_ is lively and helpful, don't hesitate to send your questions there, we will try to help you find out a solution to your problem. .. _mailing list: http://groups.google.com/group/turbogears .. _TurboGears subversion repository: http://svn.turbogears.org/trunk#egg=turbogears-dev Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Console Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Topic :: Software Development :: Libraries :: Python Modules PK>N@EGG-INFO/requires.txtCherryPy >= 2.3.0, < 3.0dev ConfigObj >= 4.3.2 DecoratorTools >= 1.4 FormEncode >= 0.7.1, < 1.3dev PasteScript >= 1.6.2 RuleDispatch >= 0.5a0.dev-r2303 setuptools >= 0.6c2 simplejson >= 1.3, < 2.1dev TurboCheetah >= 1.0 TurboJson >= 1.1.4, < 1.2 TurboKid >= 1.0.5 [sqlobject] SQLObject >= 0.10.1, < 0.11dev [sqlalchemy] SQLAlchemy >= 0.3.10, < 0.5dev [testtools] nose >= 0.9.3 pysqlite < 2.6dev [future] Elixir >= 0.4.0 Genshi >= 0.4.4, < 0.5dev [exp] TGFastData [develop] CherryPy >= 2.3.0, < 3.0dev ConfigObj >= 4.3.2 DecoratorTools >= 1.4 FormEncode >= 0.7.1, < 1.3dev PasteScript >= 1.6.2 RuleDispatch >= 0.5a0.dev-r2303 setuptools >= 0.6c2 simplejson >= 1.3, < 2.1dev TurboCheetah >= 1.0 TurboJson >= 1.1.4, < 1.2 TurboKid >= 1.0.5 Elixir >= 0.4.0 Genshi >= 0.4.4, < 0.5dev nose >= 0.9.3 pysqlite < 2.6dev SQLAlchemy >= 0.3.10, < 0.5dev SQLObject >= 0.10.1, < 0.11dev [tgtesttools] nose >= 0.9.3 pysqlite < 2.6devPK><$]]EGG-INFO/SOURCES.txtCHANGELOG.txt CONTRIBUTORS.txt LICENSE.txt MANIFEST.in README.txt ez_setup.py setup.cfg setup.py test.cfg TurboGears.egg-info/PKG-INFO TurboGears.egg-info/SOURCES.txt TurboGears.egg-info/dependency_links.txt TurboGears.egg-info/entry_points.txt TurboGears.egg-info/not-zip-safe TurboGears.egg-info/requires.txt TurboGears.egg-info/top_level.txt doc/README.txt doc/build_api_docs.sh doc/doc.ini tools/codename.py tools/tgsetup.py tools/toolbox-start.py turbogears/__init__.py turbogears/config.py turbogears/controllers.py turbogears/database.py turbogears/decorator.py turbogears/docgen.py turbogears/errorhandling.py turbogears/finddata.py turbogears/genericfunctions.py turbogears/paginate.py turbogears/release.py turbogears/scheduler.py turbogears/startup.py turbogears/testutil.py turbogears/util.py turbogears/validators.py turbogears/command/__init__.py turbogears/command/base.py turbogears/command/i18n.py turbogears/command/info.py turbogears/command/quickstart.py turbogears/command/sacommand.py turbogears/feed/__init__.py turbogears/feed/atom0_3.kid turbogears/feed/atom1_0.kid turbogears/feed/feed.py turbogears/feed/rss2_0.kid turbogears/i18n/__init__.py turbogears/i18n/format.py turbogears/i18n/kidutils.py turbogears/i18n/tg_gettext.py turbogears/i18n/utils.py turbogears/i18n/data/TurboGears.pot turbogears/i18n/data/__init__.py turbogears/i18n/data/af.py turbogears/i18n/data/af_ZA.py turbogears/i18n/data/am.py turbogears/i18n/data/am_ET.py turbogears/i18n/data/ar.py turbogears/i18n/data/ar_AE.py turbogears/i18n/data/ar_BH.py turbogears/i18n/data/ar_DZ.py turbogears/i18n/data/ar_EG.py turbogears/i18n/data/ar_IN.py turbogears/i18n/data/ar_IQ.py turbogears/i18n/data/ar_JO.py turbogears/i18n/data/ar_KW.py turbogears/i18n/data/ar_LB.py turbogears/i18n/data/ar_LY.py turbogears/i18n/data/ar_MA.py turbogears/i18n/data/ar_OM.py turbogears/i18n/data/ar_QA.py turbogears/i18n/data/ar_SA.py turbogears/i18n/data/ar_SD.py turbogears/i18n/data/ar_SY.py turbogears/i18n/data/ar_TN.py turbogears/i18n/data/ar_YE.py turbogears/i18n/data/be.py turbogears/i18n/data/be_BY.py turbogears/i18n/data/bg.py turbogears/i18n/data/bg_BG.py turbogears/i18n/data/bn.py turbogears/i18n/data/bn_IN.py turbogears/i18n/data/ca.py turbogears/i18n/data/ca_ES.py turbogears/i18n/data/cs.py turbogears/i18n/data/cs_CZ.py turbogears/i18n/data/da.py turbogears/i18n/data/da_DK.py turbogears/i18n/data/de.py turbogears/i18n/data/de_AT.py turbogears/i18n/data/de_BE.py turbogears/i18n/data/de_CH.py turbogears/i18n/data/de_DE.py turbogears/i18n/data/de_LU.py turbogears/i18n/data/el.py turbogears/i18n/data/el_GR.py turbogears/i18n/data/en.py turbogears/i18n/data/en_AU.py turbogears/i18n/data/en_BE.py turbogears/i18n/data/en_BW.py turbogears/i18n/data/en_CA.py turbogears/i18n/data/en_GB.py turbogears/i18n/data/en_HK.py turbogears/i18n/data/en_IE.py turbogears/i18n/data/en_IN.py turbogears/i18n/data/en_MT.py turbogears/i18n/data/en_NZ.py turbogears/i18n/data/en_PH.py turbogears/i18n/data/en_SG.py turbogears/i18n/data/en_US.py turbogears/i18n/data/en_US_POSIX.py turbogears/i18n/data/en_VI.py turbogears/i18n/data/en_ZA.py turbogears/i18n/data/en_ZW.py turbogears/i18n/data/eo.py turbogears/i18n/data/es.py turbogears/i18n/data/es_AR.py turbogears/i18n/data/es_BO.py turbogears/i18n/data/es_CL.py turbogears/i18n/data/es_CO.py turbogears/i18n/data/es_CR.py turbogears/i18n/data/es_DO.py turbogears/i18n/data/es_EC.py turbogears/i18n/data/es_ES.py turbogears/i18n/data/es_GT.py turbogears/i18n/data/es_HN.py turbogears/i18n/data/es_MX.py turbogears/i18n/data/es_NI.py turbogears/i18n/data/es_PA.py turbogears/i18n/data/es_PE.py turbogears/i18n/data/es_PR.py turbogears/i18n/data/es_PY.py turbogears/i18n/data/es_SV.py turbogears/i18n/data/es_US.py turbogears/i18n/data/es_UY.py turbogears/i18n/data/es_VE.py turbogears/i18n/data/et.py turbogears/i18n/data/et_EE.py turbogears/i18n/data/eu.py turbogears/i18n/data/eu_ES.py turbogears/i18n/data/fa.py turbogears/i18n/data/fa_AF.py turbogears/i18n/data/fa_IR.py turbogears/i18n/data/fi.py turbogears/i18n/data/fi_FI.py turbogears/i18n/data/fo.py turbogears/i18n/data/fo_FO.py turbogears/i18n/data/fr.py turbogears/i18n/data/fr_BE.py turbogears/i18n/data/fr_CA.py turbogears/i18n/data/fr_CH.py turbogears/i18n/data/fr_FR.py turbogears/i18n/data/fr_LU.py turbogears/i18n/data/ga.py turbogears/i18n/data/ga_IE.py turbogears/i18n/data/gl.py turbogears/i18n/data/gl_ES.py turbogears/i18n/data/gu.py turbogears/i18n/data/gu_IN.py turbogears/i18n/data/gv.py turbogears/i18n/data/gv_GB.py turbogears/i18n/data/he.py turbogears/i18n/data/he_IL.py turbogears/i18n/data/hi.py turbogears/i18n/data/hi_IN.py turbogears/i18n/data/hr.py turbogears/i18n/data/hr_HR.py turbogears/i18n/data/hu.py turbogears/i18n/data/hu_HU.py turbogears/i18n/data/hy.py turbogears/i18n/data/hy_AM.py turbogears/i18n/data/hy_AM_REVISED.py turbogears/i18n/data/id.py turbogears/i18n/data/id_ID.py turbogears/i18n/data/is.py turbogears/i18n/data/is_IS.py turbogears/i18n/data/it.py turbogears/i18n/data/it_CH.py turbogears/i18n/data/it_IT.py turbogears/i18n/data/ja.py turbogears/i18n/data/ja_JP.py turbogears/i18n/data/kk.py turbogears/i18n/data/kk_KZ.py turbogears/i18n/data/kl.py turbogears/i18n/data/kl_GL.py turbogears/i18n/data/kn.py turbogears/i18n/data/kn_IN.py turbogears/i18n/data/ko.py turbogears/i18n/data/ko_KR.py turbogears/i18n/data/kok.py turbogears/i18n/data/kok_IN.py turbogears/i18n/data/kw.py turbogears/i18n/data/kw_GB.py turbogears/i18n/data/lt.py turbogears/i18n/data/lt_LT.py turbogears/i18n/data/lv.py turbogears/i18n/data/lv_LV.py turbogears/i18n/data/mk.py turbogears/i18n/data/mk_MK.py turbogears/i18n/data/mr.py turbogears/i18n/data/mr_IN.py turbogears/i18n/data/ms.py turbogears/i18n/data/ms_BN.py turbogears/i18n/data/ms_MY.py turbogears/i18n/data/mt.py turbogears/i18n/data/mt_MT.py turbogears/i18n/data/nb.py turbogears/i18n/data/nb_NO.py turbogears/i18n/data/nl.py turbogears/i18n/data/nl_BE.py turbogears/i18n/data/nl_NL.py turbogears/i18n/data/nn.py turbogears/i18n/data/nn_NO.py turbogears/i18n/data/no.py turbogears/i18n/data/no_NO.py turbogears/i18n/data/om.py turbogears/i18n/data/om_ET.py turbogears/i18n/data/om_KE.py turbogears/i18n/data/pa.py turbogears/i18n/data/pa_IN.py turbogears/i18n/data/pl.py turbogears/i18n/data/pl_PL.py turbogears/i18n/data/ps.py turbogears/i18n/data/ps_AF.py turbogears/i18n/data/pt.py turbogears/i18n/data/pt_BR.py turbogears/i18n/data/pt_PT.py turbogears/i18n/data/ro.py turbogears/i18n/data/ro_RO.py turbogears/i18n/data/ru.py turbogears/i18n/data/ru_RU.py turbogears/i18n/data/ru_UA.py turbogears/i18n/data/sh.py turbogears/i18n/data/sh_YU.py turbogears/i18n/data/sk.py turbogears/i18n/data/sk_SK.py turbogears/i18n/data/sl.py turbogears/i18n/data/sl_SI.py turbogears/i18n/data/so.py turbogears/i18n/data/so_DJ.py turbogears/i18n/data/so_ET.py turbogears/i18n/data/so_KE.py turbogears/i18n/data/so_SO.py turbogears/i18n/data/sq.py turbogears/i18n/data/sq_AL.py turbogears/i18n/data/sr.py turbogears/i18n/data/sr_YU.py turbogears/i18n/data/sv.py turbogears/i18n/data/sv_FI.py turbogears/i18n/data/sv_SE.py turbogears/i18n/data/sw.py turbogears/i18n/data/sw_KE.py turbogears/i18n/data/sw_TZ.py turbogears/i18n/data/ta.py turbogears/i18n/data/ta_IN.py turbogears/i18n/data/te.py turbogears/i18n/data/te_IN.py turbogears/i18n/data/th.py turbogears/i18n/data/th_TH.py turbogears/i18n/data/ti.py turbogears/i18n/data/ti_ER.py turbogears/i18n/data/ti_ET.py turbogears/i18n/data/tr.py turbogears/i18n/data/tr_TR.py turbogears/i18n/data/uk.py turbogears/i18n/data/uk_UA.py turbogears/i18n/data/vi.py turbogears/i18n/data/vi_VN.py turbogears/i18n/data/zh.py turbogears/i18n/data/zh_CN.py turbogears/i18n/data/zh_HK.py turbogears/i18n/data/zh_MO.py turbogears/i18n/data/zh_SG.py turbogears/i18n/data/zh_TW.py turbogears/i18n/data/de/LC_MESSAGES/TurboGears.mo turbogears/i18n/data/de/LC_MESSAGES/TurboGears.po turbogears/i18n/data/sl/LC_MESSAGES/TurboGears.mo turbogears/i18n/data/sl/LC_MESSAGES/TurboGears.po turbogears/i18n/sogettext/__init__.py turbogears/i18n/sogettext/model.py turbogears/i18n/tests/__init__.py turbogears/i18n/tests/test_format.py turbogears/i18n/tests/test_kidutils.py turbogears/i18n/tests/test_so_gettext.py turbogears/i18n/tests/test_tg_gettext.py turbogears/i18n/tests/test_toolboxadmi18n.py turbogears/i18n/tests/test_utils.py turbogears/identity/__init__.py turbogears/identity/conditions.py turbogears/identity/exceptions.py turbogears/identity/saprovider.py turbogears/identity/soprovider.py turbogears/identity/visitor.py turbogears/identity/tests/__init__.py turbogears/identity/tests/test_identity.py turbogears/identity/tests/test_visit.py turbogears/qstemplates/__init__.py turbogears/qstemplates/qsbase/MANIFEST.in_tmpl turbogears/qstemplates/qsbase/+einame+.egg-info/PKG-INFO turbogears/qstemplates/qsbase/+einame+.egg-info/paster_plugins.txt turbogears/qstemplates/qsbase/+einame+.egg-info/sqlobject.txt_tmpl turbogears/qstemplates/qsbase/+package+/__init__.py turbogears/qstemplates/qsbase/+package+/release.py_tmpl turbogears/qstemplates/qsbase/+package+/static/css/empty_tmpl turbogears/qstemplates/qsbase/+package+/static/images/favicon.ico turbogears/qstemplates/qsbase/+package+/static/images/tg_under_the_hood.png turbogears/qstemplates/qsbase/+package+/static/images/under_the_hood_blue.png turbogears/qstemplates/qsbase/+package+/static/javascript/empty_tmpl turbogears/qstemplates/qsbase/+package+/templates/__init__.py turbogears/qstemplates/quickstart/README.txt_tmpl turbogears/qstemplates/quickstart/dev.cfg_tmpl turbogears/qstemplates/quickstart/sample-prod.cfg_tmpl turbogears/qstemplates/quickstart/setup.py_tmpl turbogears/qstemplates/quickstart/start-+package+.py_tmpl turbogears/qstemplates/quickstart/test.cfg_tmpl turbogears/qstemplates/quickstart/+package+/commands.py_tmpl turbogears/qstemplates/quickstart/+package+/controllers.py_tmpl turbogears/qstemplates/quickstart/+package+/json.py_tmpl turbogears/qstemplates/quickstart/+package+/model.py_tmpl turbogears/qstemplates/quickstart/+package+/config/__init__.py turbogears/qstemplates/quickstart/+package+/config/app.cfg_tmpl turbogears/qstemplates/quickstart/+package+/config/log.cfg_tmpl turbogears/qstemplates/quickstart/+package+/static/css/style.css turbogears/qstemplates/quickstart/+package+/static/images/header_inner.png turbogears/qstemplates/quickstart/+package+/static/images/info.png turbogears/qstemplates/quickstart/+package+/static/images/ok.png turbogears/qstemplates/quickstart/+package+/templates/login.kid turbogears/qstemplates/quickstart/+package+/templates/master.kid turbogears/qstemplates/quickstart/+package+/templates/welcome.kid turbogears/qstemplates/quickstart/+package+/tests/__init__.py turbogears/qstemplates/quickstart/+package+/tests/test_controllers.py_tmpl turbogears/qstemplates/quickstart/+package+/tests/test_model.py_tmpl turbogears/qstemplates/quickstartbig/+package+/controllers/__init__.py_tmpl turbogears/qstemplates/quickstartbig/+package+/controllers/root.py_tmpl turbogears/qstemplates/widget/README.txt_tmpl turbogears/qstemplates/widget/setup.py_tmpl turbogears/qstemplates/widget/+package+/widgets.py_tmpl turbogears/static/__init__.py turbogears/static/css/__init__.py turbogears/static/css/interpreter.css turbogears/static/css/toolbox.css turbogears/static/css/widget.css turbogears/static/images/__init__.py turbogears/static/images/add.png turbogears/static/images/admi18n.png turbogears/static/images/arrow_down.png turbogears/static/images/arrow_down_small.png turbogears/static/images/arrow_left.png turbogears/static/images/arrow_right.png turbogears/static/images/arrow_up.png turbogears/static/images/arrow_up_small.png turbogears/static/images/catwalk.png turbogears/static/images/catwalk_logo.png turbogears/static/images/catwalk_logo_bg.png turbogears/static/images/column_chooser.png turbogears/static/images/designer.png turbogears/static/images/discard.png turbogears/static/images/edit.png turbogears/static/images/file.png turbogears/static/images/folder.png turbogears/static/images/identity.png turbogears/static/images/info.png turbogears/static/images/play.png turbogears/static/images/remove.png turbogears/static/images/save.png turbogears/static/images/shell.png turbogears/static/images/small_gear.png turbogears/static/images/stop.png turbogears/static/images/table.gif turbogears/static/images/tg_power.png turbogears/static/images/tg_under_the_hood.png turbogears/static/images/tg_under_the_hood_sans_gear.png turbogears/static/images/toolbox_logo.png turbogears/static/images/toolbox_top_baggrund.png turbogears/static/images/toolbox_top_vertical_line.png turbogears/static/images/top.png turbogears/static/images/top_bg.png turbogears/static/images/transp.png turbogears/static/images/trash.png turbogears/static/images/widgets.png turbogears/static/js/MochiKit_1_3.js turbogears/static/js/MochiKit_1_4.js turbogears/static/js/__init__.py turbogears/static/js/i18n_base.js turbogears/static/js/interpreter.js turbogears/static/js/widget.js turbogears/static/js/tool-man/cookies.js turbogears/static/js/tool-man/coordinates.js turbogears/static/js/tool-man/core.js turbogears/static/js/tool-man/css.js turbogears/static/js/tool-man/drag.js turbogears/static/js/tool-man/dragsort.js turbogears/static/js/tool-man/events.js turbogears/tests/__init__.py turbogears/tests/config.cfg turbogears/tests/configfile.cfg turbogears/tests/form.kid turbogears/tests/othertemplate.kid turbogears/tests/paginate.kid turbogears/tests/simple.kid turbogears/tests/simplecheetah.tmpl turbogears/tests/test_catwalk.py turbogears/tests/test_command_i18n.py turbogears/tests/test_config.py turbogears/tests/test_controllers.py turbogears/tests/test_decorator.py turbogears/tests/test_errorhandling.py turbogears/tests/test_expose.py turbogears/tests/test_form_controllers.py turbogears/tests/test_genericfunctions.py turbogears/tests/test_paginate.py turbogears/tests/test_sqlalchemy.py turbogears/tests/test_sqlobject.py turbogears/tests/test_testutil.py turbogears/tests/test_util.py turbogears/tests/test_validators.py turbogears/tests/test_view.py turbogears/tests/textfmt.tmpl turbogears/tests/util.py turbogears/tests/catwalk_models/__init__.py turbogears/tests/catwalk_models/browse.py turbogears/tests/catwalk_models/model_list.py turbogears/tests/catwalk_models/model_structure.py turbogears/tests/catwalk_models/single_join.py turbogears/tests/catwalk_models/catwalk-session/session.pkl turbogears/tests/locale/en/LC_MESSAGES/messages.mo turbogears/tests/locale/en/LC_MESSAGES/messages.po turbogears/tests/locale/fi/LC_MESSAGES/messages.mo turbogears/tests/locale/fi/LC_MESSAGES/messages.po turbogears/toolbox/__init__.py turbogears/toolbox/base.py turbogears/toolbox/console.kid turbogears/toolbox/info.kid turbogears/toolbox/main.kid turbogears/toolbox/master.kid turbogears/toolbox/shell.py turbogears/toolbox/widgets.kid turbogears/toolbox/admi18n/__init__.py turbogears/toolbox/admi18n/catalog.py turbogears/toolbox/admi18n/internationalization.kid turbogears/toolbox/admi18n/language.kid turbogears/toolbox/admi18n/languageManagement.kid turbogears/toolbox/admi18n/msgfmt.py turbogears/toolbox/admi18n/po_view.kid turbogears/toolbox/admi18n/pygettext.py turbogears/toolbox/admi18n/stringCollection.kid turbogears/toolbox/catwalk/__init__.py turbogears/toolbox/catwalk/browse.py turbogears/toolbox/catwalk/browse_grid.kid turbogears/toolbox/catwalk/catwalk.kid turbogears/toolbox/catwalk/columns.kid turbogears/toolbox/catwalk/static/css/catwalk.css turbogears/toolbox/catwalk/static/javascript/browse.js turbogears/toolbox/catwalk/static/javascript/catwalk.js turbogears/toolbox/catwalk/static/javascript/greybox/AmiJS.js turbogears/toolbox/catwalk/static/javascript/greybox/blank.gif turbogears/toolbox/catwalk/static/javascript/greybox/close.gif turbogears/toolbox/catwalk/static/javascript/greybox/greybox.css turbogears/toolbox/catwalk/static/javascript/greybox/greybox.js turbogears/toolbox/catwalk/static/javascript/greybox/greybox__.js turbogears/toolbox/catwalk/static/javascript/greybox/greybox_inline.js turbogears/toolbox/catwalk/static/javascript/greybox/logo.png turbogears/toolbox/catwalk/static/javascript/greybox/overlay.png turbogears/toolbox/designer/__init__.py turbogears/toolbox/designer/modelDesigner.kid turbogears/toolbox/designer/static/css/style.css turbogears/toolbox/designer/static/diagram/index.html turbogears/toolbox/designer/static/diagram/images/back.gif turbogears/toolbox/designer/static/diagram/images/shadow.png turbogears/toolbox/designer/static/diagram/images/shadow_bottom.png turbogears/toolbox/designer/static/diagram/images/shadow_corner.png turbogears/toolbox/designer/static/diagram/images/shadow_right.png turbogears/toolbox/designer/static/diagram/js/ajax.js turbogears/toolbox/designer/static/diagram/js/animator.js turbogears/toolbox/designer/static/diagram/js/generic.js turbogears/toolbox/designer/static/diagram/js/io.js turbogears/toolbox/designer/static/diagram/js/main.js turbogears/toolbox/designer/static/diagram/js/objects.js turbogears/toolbox/designer/static/diagram/js/settings.js turbogears/toolbox/designer/static/diagram/js/sql_types.js turbogears/toolbox/designer/static/diagram/styles/bar.css turbogears/toolbox/designer/static/diagram/styles/style.css turbogears/toolbox/designer/static/diagram/styles/style.js turbogears/toolbox/designer/static/images/info.png turbogears/toolbox/designer/static/javascript/modelDesigner.js turbogears/toolbox/designer/static/sessions/Survey.js turbogears/toolbox/designer/static/sessions/TurboTunes.js turbogears/toolbox/designer/static/sessions/WebShop.js turbogears/view/__init__.py turbogears/view/base.py turbogears/view/templates/__init__.py turbogears/view/templates/sitetemplate.kid turbogears/visit/__init__.py turbogears/visit/api.py turbogears/visit/savisit.py turbogears/visit/sovisit.py turbogears/widgets/__init__.py turbogears/widgets/base.py turbogears/widgets/big_widgets.py turbogears/widgets/datagrid.py turbogears/widgets/forms.py turbogears/widgets/i18n.py turbogears/widgets/links.py turbogears/widgets/meta.py turbogears/widgets/rpc.py turbogears/widgets/static/ajax.js turbogears/widgets/static/ajaxgrid.js turbogears/widgets/static/autocompletefield.css turbogears/widgets/static/autocompletefield.js turbogears/widgets/static/grid.css turbogears/widgets/static/img.gif turbogears/widgets/static/spinner.gif turbogears/widgets/static/spinnerstopped.png turbogears/widgets/static/calendar/calendar-blue.css turbogears/widgets/static/calendar/calendar-blue2.css turbogears/widgets/static/calendar/calendar-brown.css turbogears/widgets/static/calendar/calendar-green.css turbogears/widgets/static/calendar/calendar-setup.js turbogears/widgets/static/calendar/calendar-system.css turbogears/widgets/static/calendar/calendar-tas.css turbogears/widgets/static/calendar/calendar-win2k-1.css turbogears/widgets/static/calendar/calendar-win2k-2.css turbogears/widgets/static/calendar/calendar-win2k-cold-1.css turbogears/widgets/static/calendar/calendar-win2k-cold-2.css turbogears/widgets/static/calendar/calendar.js turbogears/widgets/static/calendar/menuarrow.gif turbogears/widgets/static/calendar/menuarrow2.gif turbogears/widgets/static/calendar/lang/calendar-af.js turbogears/widgets/static/calendar/lang/calendar-bg-cp1251.js turbogears/widgets/static/calendar/lang/calendar-bg.js turbogears/widgets/static/calendar/lang/calendar-ca.js turbogears/widgets/static/calendar/lang/calendar-cs-cp1250.js turbogears/widgets/static/calendar/lang/calendar-cs.js turbogears/widgets/static/calendar/lang/calendar-da.js turbogears/widgets/static/calendar/lang/calendar-de.js turbogears/widgets/static/calendar/lang/calendar-de_at.js turbogears/widgets/static/calendar/lang/calendar-de_de.js turbogears/widgets/static/calendar/lang/calendar-el.js turbogears/widgets/static/calendar/lang/calendar-en.js turbogears/widgets/static/calendar/lang/calendar-es.js turbogears/widgets/static/calendar/lang/calendar-fi.js turbogears/widgets/static/calendar/lang/calendar-fr.js turbogears/widgets/static/calendar/lang/calendar-he.js turbogears/widgets/static/calendar/lang/calendar-hr.js turbogears/widgets/static/calendar/lang/calendar-hu-cp1252.js turbogears/widgets/static/calendar/lang/calendar-hu.js turbogears/widgets/static/calendar/lang/calendar-it.js turbogears/widgets/static/calendar/lang/calendar-ja.js turbogears/widgets/static/calendar/lang/calendar-ko-euc_kr.js turbogears/widgets/static/calendar/lang/calendar-ko.js turbogears/widgets/static/calendar/lang/calendar-lt.js turbogears/widgets/static/calendar/lang/calendar-lv-cp1252.js turbogears/widgets/static/calendar/lang/calendar-lv.js turbogears/widgets/static/calendar/lang/calendar-nl.js turbogears/widgets/static/calendar/lang/calendar-no.js turbogears/widgets/static/calendar/lang/calendar-pl.js turbogears/widgets/static/calendar/lang/calendar-pt_br.js turbogears/widgets/static/calendar/lang/calendar-ro-cp1250.js turbogears/widgets/static/calendar/lang/calendar-ro.js turbogears/widgets/static/calendar/lang/calendar-ru-cp1251.js turbogears/widgets/static/calendar/lang/calendar-ru-koi8_r.js turbogears/widgets/static/calendar/lang/calendar-ru.js turbogears/widgets/static/calendar/lang/calendar-sk.js turbogears/widgets/static/calendar/lang/calendar-sl.js turbogears/widgets/static/calendar/lang/calendar-sq.js turbogears/widgets/static/calendar/lang/calendar-sv.js turbogears/widgets/static/calendar/lang/calendar-tr-cp1254.js turbogears/widgets/static/calendar/lang/calendar-tr.js turbogears/widgets/static/calendar/lang/calendar-uk-cp1251.js turbogears/widgets/static/calendar/lang/calendar-uk-koi8_u.js turbogears/widgets/static/calendar/lang/calendar-uk.js turbogears/widgets/static/calendar/lang/calendar-zh.js turbogears/widgets/static/calendar/lang/calendar-zh_cn-gbk.js turbogears/widgets/static/calendar/lang/calendar-zh_cn.js turbogears/widgets/static/calendar/lang/calendar-zh_tw-big5.js turbogears/widgets/static/calendar/lang/calendar-zh_tw.js turbogears/widgets/static/calendar/skins/aqua/active-bg.gif turbogears/widgets/static/calendar/skins/aqua/dark-bg.gif turbogears/widgets/static/calendar/skins/aqua/hover-bg.gif turbogears/widgets/static/calendar/skins/aqua/menuarrow.gif turbogears/widgets/static/calendar/skins/aqua/normal-bg.gif turbogears/widgets/static/calendar/skins/aqua/rowhover-bg.gif turbogears/widgets/static/calendar/skins/aqua/status-bg.gif turbogears/widgets/static/calendar/skins/aqua/theme.css turbogears/widgets/static/calendar/skins/aqua/title-bg.gif turbogears/widgets/static/calendar/skins/aqua/today-bg.gif turbogears/widgets/static/sh/SyntaxHighlighter.css turbogears/widgets/static/sh/shBrushCSharp.js turbogears/widgets/static/sh/shBrushCss.js turbogears/widgets/static/sh/shBrushDelphi.js turbogears/widgets/static/sh/shBrushJScript.js turbogears/widgets/static/sh/shBrushJava.js turbogears/widgets/static/sh/shBrushPhp.js turbogears/widgets/static/sh/shBrushPython.js turbogears/widgets/static/sh/shBrushRuby.js turbogears/widgets/static/sh/shBrushSql.js turbogears/widgets/static/sh/shBrushVb.js turbogears/widgets/static/sh/shBrushXml.js turbogears/widgets/static/sh/shCore.js turbogears/widgets/static/tabber/tabber-minimized.js turbogears/widgets/static/tabber/tabber.css turbogears/widgets/static/tabber/tabber.js turbogears/widgets/static/tabber/tabber_cookie.js turbogears/widgets/templates/__init__.py turbogears/widgets/templates/datagrid.kid turbogears/widgets/templates/paginate_datagrid.kid turbogears/widgets/tests/__init__.py turbogears/widgets/tests/form.kid turbogears/widgets/tests/test_datagrid.py turbogears/widgets/tests/test_forms.py turbogears/widgets/tests/test_link_inclusion.py turbogears/widgets/tests/test_nested_form_controllers.py turbogears/widgets/tests/test_nested_widgets.py turbogears/widgets/tests/test_new_validation.py turbogears/widgets/tests/test_request_related_features.py turbogears/widgets/tests/test_widgets.py turbogears/widgets/tests/two_forms.kid turbogears/widgets/tests/widget.kidPK>trp EGG-INFO/top_level.txtturbogears PKzz>oOOturbogears/config.pyimport os, glob, re from cherrypy import config from configobj import ConfigObj import pkg_resources import logging import logging.handlers __all__ = ["update_config", "get", "update"] try: set except NameError: # Python 2.3 from sets import Set as set class ConfigError(Exception): pass def _get_formatters(formatters): for key, formatter in formatters.items(): kw = {} fmt = formatter.get("format", None) if fmt: fmt = fmt.replace("*(", "%(") kw["fmt"] = fmt datefmt = formatter.get("datefmt", None) if datefmt: kw["datefmt"] = datefmt formatter = logging.Formatter(**kw) formatters[key] = formatter def _get_handlers(handlers, formatters): for key, handler in handlers.items(): kw = {} try: cls = handler.get("class") args = handler.get("args", tuple()) level = handler.get("level", None) try: cls = eval(cls, logging.__dict__) except NameError: try: cls = eval(cls, logging.handlers.__dict__) except NameError, err: raise ConfigError("Specified class in handler " "%s is not a recognizable logger name" % key) try: handler_obj = cls(*eval(args, logging.__dict__)) except IOError,err: raise ConfigError("Missing or wrong argument to " "%s in handler %s -> %s " % (cls.__name__,key,err)) except TypeError,err: raise ConfigError("Wrong format for arguments " "to %s in handler %s -> %s" % (cls.__name__,key,err)) if level: level = eval(level, logging.__dict__) handler_obj.setLevel(level) except KeyError: raise ConfigError("No class specified for logging " "handler %s" % key) formatter = handler.get("formatter", None) if formatter: try: formatter = formatters[formatter] except KeyError: raise ConfigError("Handler %s references unknown " "formatter %s" % (key, formatter)) handler_obj.setFormatter(formatter) handlers[key] = handler_obj def _get_loggers(loggers, handlers): for key, logger in loggers.items(): qualname = logger.get("qualname", None) if qualname: log = logging.getLogger(qualname) else: log = logging.getLogger() level = logger.get("level", None) if level: level = eval(level, logging.__dict__) else: level = logging.NOTSET log.setLevel(level) propagate = logger.get("propagate", None) if propagate is not None: log.propagate = propagate cfghandlers = logger.get("handlers", None) if cfghandlers: if isinstance(cfghandlers, basestring): cfghandlers = [cfghandlers] for handler in cfghandlers: try: handler = handlers[handler] except KeyError: raise ConfigError("Logger %s references unknown " "handler %s" % (key, handler)) log.addHandler(handler) def configure_loggers(config): """Configures the Python logging module, using options that are very similar to the ones listed in the Python documentation. This also removes the logging configuration from the configuration dictionary because CherryPy doesn't like it there. Here are some of the Python examples converted to the format used here: [logging] [[loggers]] [[[parser]]] [logger_parser] level="DEBUG" handlers="hand01" propagate=1 qualname="compiler.parser" [[handlers]] [[[hand01]]] class="StreamHandler" level="NOTSET" formatter="form01" args="(sys.stdout,)" [[formatters]] [[[form01]]] format="F1 *(asctime)s *(levelname)s *(message)s" datefmt= One notable format difference is that *() is used in the formatter instead of %() because %() is already used for config file interpolation. """ if not config.has_key("logging"): config["global"]["tg.new_style_logging"] = False return logcfg = config["logging"] formatters = logcfg.get("formatters", {}) _get_formatters(formatters) handlers = logcfg.get("handlers", {}) _get_handlers(handlers, formatters) loggers = logcfg.get("loggers", {}) _get_loggers(loggers, handlers) del config["logging"] config["global"]["tg.new_style_logging"] = True def config_defaults(): current_dir_uri = os.path.abspath(os.getcwd()) if not current_dir_uri.startswith('/'): current_dir_uri = '/' + current_dir_uri defaults = {'current_dir_uri' : current_dir_uri} return defaults def config_obj(configfile = None, modulename = None): defaults = config_defaults() if modulename: firstdot = modulename.find('.') if firstdot < 0: raise ConfigError('Config file package not specified') lastdot = modulename.rfind('.') top_level_package = modulename[:firstdot] packagename = modulename[:lastdot] modname = modulename[lastdot+1:] modfile = pkg_resources.resource_filename(packagename, modname + '.cfg') if not os.path.exists(modfile): modfile = pkg_resources.resource_filename(packagename, modname) if os.path.isdir(modfile): configfiles = glob.glob(os.path.join(modfile, '*.cfg')) else: configfiles = [modfile] configdata = ConfigObj(unrepr=True) top_level_dir = os.path.normpath(pkg_resources.resource_filename( top_level_package, '')) package_dir = os.path.normpath(pkg_resources.resource_filename( packagename, '')) defaults.update(dict(top_level_dir=top_level_dir, package_dir=package_dir)) configdata.merge(dict(DEFAULT=defaults)) for file in configfiles: configdata2 = ConfigObj(file, unrepr=True) configdata2.merge(dict(DEFAULT=defaults)) configdata.merge(configdata2) if configfile: if modulename: configdata2 = ConfigObj(configfile, unrepr=True) configdata2.merge(dict(DEFAULT=defaults)) configdata.merge(configdata2) else: configdata = ConfigObj(configfile, unrepr=True) return configdata def update_config(configfile=None, modulename=None): """Updates the system configuration either from a ConfigObj (INI-style) config file, a module name specified in dotted notation or both (the module name is assumed to have a ".cfg" extension). If both are specified, the module is called first, followed by the config file. This means that the config file's options override the options in the module file.""" configdict = config_obj(configfile, modulename).dict() configure_loggers(configdict) config.update(configdict) def get(key, default_value=None, return_section=False, path=None): """Retrieves a config value""" value = config.get(key, default_value, return_section, path) if value and key == 'sqlobject.dburi' and os.name == 'nt': value = re.sub('///(\w):', '///\\1|', value) return value def update(configvalues): """Updates the configuration with the values from the dictionary.""" return config.update(configvalues) PK>~X&##turbogears/config.pyc; PMc@s dkZdkZdkZdklZdklZdkZdkZdk ZdddgZ ye Wn e j odk lZ nXdefdYZd Zd Zd Zd Zd ZeedZeedZeeedZdZdS(N(sconfig(s ConfigObjs update_configsgetsupdate(sSets ConfigErrorcBstZRS(N(s__name__s __module__(((s*build\bdist.win32\egg\turbogears\config.pys ConfigErrorscCsx|iD]\}}h}|idt}|o |idd}||d %s s4Wrong format for arguments to %s in handler %s -> %ss)No class specified for logging handler %ss formatters*Handler %s references unknown formatter %s(shandlerssitemsskeyshandlerskwsgetsclsstuplesargssNoneslevelsevalsloggings__dict__s NameErrorserrs ConfigErrors handler_objsIOErrors__name__s TypeErrorssetLevelsKeyErrors formatters formatterss setFormatter( shandlerss formattersserrsargss handler_objshandlerskws formatterskeyslevelscls((s*build\bdist.win32\egg\turbogears\config.pys _get_handlers sB  !c Cs\xU|iD]G\}}|idt} | oti| }n ti}|idt}|ot |ti }n ti }|i||idt}|tj o ||_n|idt}|oyt|to |g}nxY|D]M}y||}Wn)tj otd||fnX|i|qWq q WdS(Nsqualnameslevels propagateshandlerss'Logger %s references unknown handler %s(sloggerssitemsskeysloggersgetsNonesqualnamesloggings getLoggerslogslevelsevals__dict__sNOTSETssetLevels propagates cfghandlerss isinstances basestringshandlershandlerssKeyErrors ConfigErrors addHandler( sloggersshandlerss cfghandlersslogslevelshandlers propagateskeysloggersqualname((s*build\bdist.win32\egg\turbogears\config.pys _get_loggersGs2       cCs|id ot|ddUpdates the configuration with the values from the dictionary.N(sconfigsupdates configvalues(s configvalues((s*build\bdist.win32\egg\turbogears\config.pysupdates(sossglobsrescherrypysconfigs configobjs ConfigObjs pkg_resourcessloggingslogging.handlerss__all__ssets NameErrorssetssSets Exceptions ConfigErrors_get_formatterss _get_handlerss _get_loggerssconfigure_loggerssconfig_defaultssNones config_objs update_configsFalsesgetsupdate(ssets config_objs__all__sres _get_loggerss update_configsconfigs_get_formatterss ConfigObjsgetsglobsupdates ConfigErrors _get_handlerssloggingsconfigure_loggerss pkg_resourcessconfig_defaultssos((s*build\bdist.win32\egg\turbogears\config.pys?s(      '  1 * PKzz>4Auz^z^turbogears/controllers.py"""Classes and methods for TurboGears controllers.""" import logging import re import urllib import urlparse import types from itertools import izip from dispatch import generic, strategy, functions from inspect import isclass import cherrypy from cherrypy import request, response import turbogears.util as tg_util from turbogears import view, database, errorhandling, config from turbogears.decorator import weak_signature_decorator from turbogears.validators import Invalid from turbogears.errorhandling import error_handler, exception_handler log = logging.getLogger("turbogears.controllers") if config.get("session_filter.on", None): if config.get("session_filter.storage_type", None) == "PostgreSQL": import psycopg2 config.update( {'session_filter.get_db': psycopg2.connect( psycopg2.get('sessions.postgres.dsn')) }) # support for mysql/sqlite/etc here def _process_output(output, template, format, content_type, mapping, fragment=False): """Produce final output form from data returned from a controller method. See the expose() arguments for more info since they are the same. """ if isinstance(output, dict): from turbogears.widgets import js_location css = tg_util.setlike() js = dict(izip(js_location, iter(tg_util.setlike, None))) include_widgets = {} include_widgets_lst = config.get("tg.include_widgets", []) if config.get("tg.mochikit_all", False): include_widgets_lst.insert(0, 'turbogears.mochikit') for i in include_widgets_lst: widget = tg_util.load_class(i) if isclass(widget): widget = widget() include_widgets["tg_%s" % i.split(".")[-1]] = widget for script in widget.retrieve_javascript(): if hasattr(script, "location"): js[script.location].add(script) else: js[js_location.head].add(script) css.add_all(widget.retrieve_css()) for value in output.itervalues(): if hasattr(value, "retrieve_css"): retrieve = getattr(value, "retrieve_css") if callable(retrieve): css.add_all(value.retrieve_css()) if hasattr(value, "retrieve_javascript"): retrieve = getattr(value, "retrieve_javascript") if callable(retrieve): for script in value.retrieve_javascript(): if hasattr(script, "location"): js[script.location].add(script) else: js[js_location.head].add(script) output.update(include_widgets) output["tg_css"] = css for location in iter(js_location): output["tg_js_%s" % str(location)] = js[location] tg_flash = _get_flash() if tg_flash: output["tg_flash"] = tg_flash headers = {'Content-Type': content_type} output = view.render(output, template=template, format=format, mapping=mapping, headers=headers, fragment=fragment) content_type = headers['Content-Type'] if content_type: response.headers["Content-Type"] = content_type else: content_type = response.headers.get("Content-Type", 'text/plain') if content_type.startswith("text/"): if isinstance(output, unicode): output = output.encode(tg_util.get_template_encoding_default()) return output class BadFormatError(Exception): """Output-format exception.""" def validate(form=None, validators=None, failsafe_schema=errorhandling.FailsafeSchema.none, failsafe_values=None, state_factory=None): """Validate input. @param form: a form instance that must be passed throught the validation process... you must give a the same form instance as the one that will be used to post data on the controller you are putting the validate decorator on. @type form: a form instance @param validators: individual validators to use for parameters. If you use a schema for validation then the schema instance must be the sole argument. If you use simple validators, then you must pass a dictionary with each value name to validate as a key of the dictionary and the validator instance (eg: tg.validators.Int() for integer) as the value. @type validators: dictionary or schema instance @param failsafe_schema: a schema for handling failsafe values. The default is 'none', but you can also use 'values', 'map_errors', or 'defaults' to map erroneous inputs to values, corresponding exceptions or method defaults. @type failsafe_schema: errorhandling.FailsafeSchema @param failsafe_values: replacements for erroneous inputs. You can either define replacements for every parameter, or a single replacement value for all parameters. This is only used when failsafe_schema is 'values'. @type failsafe_values: a dictionary or a single value @param state_factory: If this is None, the initial state for validation is set to None, otherwise this must be a callable that returns the initial state to be used for validation. @type state_factory: callable or None """ def entangle(func): if callable(form) and not hasattr(form, "validate"): init_form = lambda self: form(self) else: init_form = lambda self: form def validate(func, *args, **kw): # do not validate a second time if already validated if hasattr(request, 'validation_state'): return func(*args, **kw) form = init_form(args and args[0] or kw["self"]) args, kw = tg_util.to_kw(func, args, kw) errors = {} if state_factory is not None: state = state_factory() else: state = None if form: value = kw.copy() try: kw.update(form.validate(value, state)) except Invalid, e: errors = e.unpack_errors() request.validation_exception = e request.validated_form = form if validators: if isinstance(validators, dict): for field, validator in validators.iteritems(): try: kw[field] = validator.to_python( kw.get(field, None), state) except Invalid, error: errors[field] = error else: try: value = kw.copy() kw.update(validators.to_python(value, state)) except Invalid, e: errors = e.unpack_errors() request.validation_exception = e request.validation_errors = errors request.input_values = kw.copy() request.validation_state = state if errors: kw = errorhandling.dispatch_failsafe(failsafe_schema, failsafe_values, errors, func, kw) args, kw = tg_util.from_kw(func, args, kw) return errorhandling.run_with_errors(errors, func, *args, **kw) return validate return weak_signature_decorator(entangle) class CustomDispatch(functions.GenericFunction): def combine(self, cases): strict = [strategy.ordered_signatures, strategy.safe_methods] cases = strategy.separate_qualifiers( cases, primary = strict, ) primary = strategy.method_chain(cases.get('primary', [])) if type(primary) != types.FunctionType: for i in primary: for y in i: return y[1] return primary def _add_rule(_expose, found_default, as_format, accept_format, template, rulefunc): if as_format == "default": if found_default: colon = template.find(":") if colon == -1: as_format = template else: as_format = template[:colon] else: found_default = True ruleparts = ['kw.get("tg_format", "default") == "%s"' % as_format] if accept_format: ruleparts.append('(accept == "%s" and kw.get("tg_format"' ', "default") == "default")' % accept_format) rule = " or ".join(ruleparts) log.debug("Generated rule %s", rule) _expose.when(rule)(rulefunc) return found_default def _build_rules(func): [generic(CustomDispatch)] def _expose(func, accept, allow_json, *args, **kw): pass if func._allow_json: log.debug("Adding allow_json rule: " 'allow_json and (kw.get("tg_format", None) == "json"' ' or accept in ("application/json", "text/javascript"))') _expose.when('allow_json and (kw.get("tg_format", None) == "json"' ' or accept in ("application/json", "text/javascript"))')( lambda _func, accept, allow_json, *args, **kw: _execute_func(_func, "json", "json", "application/json", None, False, args, kw)) found_default = False for ruleinfo in func._ruleinfo: found_default = _add_rule(_expose, found_default, **ruleinfo) func._expose = _expose def expose(template=None, validators=None, allow_json=None, html=None, format=None, content_type=None, inputform=None, fragment=False, as_format="default", mapping=None, accept_format=None): """Exposes a method to the web. By putting the expose decorator on a method, you tell TurboGears that the method should be accessible via URL traversal. Additionally, expose handles the output processing (turning a dictionary into finished output) and is also responsible for ensuring that the request is wrapped in a database transaction. You can apply multiple expose decorators to a method, if you'd like to support multiple output formats. The decorator that's listed first in your code without as_format or accept_format is the default that is chosen when no format is specifically asked for. Any other expose calls that are missing as_format and accept_format will have as_format implicitly set to the whatever comes before the ":" in the template name (or the whole template name if there is no ":". For example, expose("json"), if it's not the default expose, will have as_format set to "json". When as_format is set, passing the same value in the tg_format parameter in a request will choose the options for that expose decorator. Similarly, accept_format will watch for matching Accept headers. You can also use both. expose("json", as_format="json", accept_format="application/json") will choose JSON output for either case: tg_format=json as a parameter or Accept: application/json as a request header. Passing allow_json=True to an expose decorator is equivalent to adding the decorator just mentioned. Each expose decorator has its own set of options, and each one can choose a different template or even template engine (you can use Kid for HTML output and Cheetah for plain text, for example). See the other expose parameters below to learn about the options you can pass to the template engine. Take a look at the test_expose.py suite for more examples. @param template "templateengine:dotted.reference" reference along the Python path for the template and the template engine. For example, "kid:foo.bar" will have Kid render the bar template in the foo package. @keyparam format format for the template engine to output (if the template engine can render different formats. Kid, for example, can render "html", "xml" or "xhtml") @keyparam content_type sets the content-type http header @keyparam allow_json allow the function to be exposed as json @keyparam fragment for template engines (like Kid) that generate DOCTYPE declarations and the like, this is a signal to just generate the immediate template fragment. Use this if you're building up a page from multiple templates or going to put something onto a page with .innerHTML. @keyparam mapping mapping with options that are sent to the template engine @keyparam as_format designates which value of tg_format will choose this expose. @keyparam accept_format which value of an Accept: header will choose this expose. @keyparam html deprecated in favor of template @keyparam validators deprecated. Maps argument names to validator applied to that arg @keyparam inputform deprecated. A form object that generates the input to this method """ if html: template = html if not template: template = format if format == "json" or (format is None and template is None): template = "json" allow_json = True if content_type is None: content_type = config.get("tg.content_type", None) if config.get("tg.session.automatic_lock", None): cherrypy.session.acquire_lock() def entangle(func): log.debug("Exposing %s", func) log.debug("template: %s, format: %s, allow_json: %s, " "content-type: %s", template, format, allow_json, content_type) if not getattr(func, "exposed", False): def expose(func, *args, **kw): accept = request.headers.get('Accept', "").lower() accept = tg_util.simplify_http_accept_header(accept) if not hasattr(func, "_expose"): _build_rules(func) if hasattr(request, "in_transaction"): output = func._expose(func, accept, func._allow_json, *args, **kw) else: request.in_transaction = True output = database.run_with_transaction( func._expose, func, accept, func._allow_json, *args, **kw) return output func.exposed = True func._ruleinfo = [] allow_json_from_config = config.get("tg.allow_json", False) func._allow_json = allow_json_from_config or template == 'json' else: expose = lambda func, *args, **kw: func(*args, **kw) func._ruleinfo.insert(0, dict(as_format=as_format, accept_format=accept_format, template=template, rulefunc = lambda _func, accept, allow_json, *args, **kw: _execute_func(_func, template, format, content_type, mapping, fragment, args, kw))) if allow_json: func._allow_json = True if inputform or validators: import warnings warnings.warn( "Use a separate decorator validate() rather than passing " "arguments validators and/or inputform to decorator " "expose().", DeprecationWarning, 2) func = validate(form=inputform, validators=validators)(func) return expose return weak_signature_decorator(entangle) def _execute_func(func, template, format, content_type, mapping, fragment, args, kw): """Call controller method and process it's output.""" if config.get("tg.strict_parameters", False): tg_util.remove_keys(kw, ["tg_random", "tg_format"] + config.get("tg.ignore_parameters", [])) else: # get special parameters used by upstream decorators like paginate try: tg_kw = dict([(k, v) for k, v in kw.items() if k in func._tg_args]) except AttributeError: tg_kw = {} # remove excessive parameters args, kw = tg_util.adapt_call(func, args, kw) # add special parameters again kw.update(tg_kw) if config.get('server.environment', 'development') == 'development': # Only output this in development mode: If it's a field storage object, # this means big memory usage, and we don't want that in production log.debug("Calling %s with *(%s), **(%s)", func, args, kw) output = errorhandling.try_call(func, *args, **kw) assert isinstance(output, (basestring, dict, list, types.GeneratorType)), \ "Method %s.%s() returned unexpected output. Output should " \ "be of type basestring, dict, list or generator." % ( args[0].__class__.__name__, func.__name__) if isinstance(output, dict): template = output.pop("tg_template", template) format = output.pop("tg_format", format) if template and template.startswith("."): template = func.__module__[:func.__module__.rfind('.')]+template return _process_output(output, template, format, content_type, mapping, fragment) def flash(message): """Set a message to be displayed in the browser on next page display.""" message = tg_util.quote_cookie(tg_util.to_utf8(message)) response.simple_cookie['tg_flash'] = message response.simple_cookie['tg_flash']['path'] = '/' def _get_flash(): """Retrieve the flash message (if one is set), clearing the message.""" request_cookie = request.simple_cookie response_cookie = response.simple_cookie def clearcookie(): response_cookie["tg_flash"] = "" response_cookie["tg_flash"]['expires'] = 0 response_cookie['tg_flash']['path'] = '/' if response_cookie.has_key("tg_flash"): message = response_cookie["tg_flash"].value response_cookie.pop("tg_flash") if request_cookie.has_key("tg_flash"): # New flash overrided old one sitting in cookie. Clear that old cookie. clearcookie() elif request_cookie.has_key("tg_flash"): message = request_cookie["tg_flash"].value if not response_cookie.has_key("tg_flash"): clearcookie() else: message = None if message: message = unicode(tg_util.unquote_cookie(message), 'utf-8') return message class Controller(object): """Base class for a web application's controller. Currently, this provides positional parameters functionality via a standard default method. """ class RootController(Controller): """Base class for the root of a web application. Your web application should have one of these. The root of your application is used to compute URLs used by your app. """ is_app_root = True msglog = logging.getLogger('cherrypy.msg') msglogfunc = {0: msglog.info, 1: msglog.warning, 2: msglog.error} def _cp_log_message(self, msg, context = 'nocontext', severity = 0): log = self.msglogfunc[severity] text = ''.join((context, ': ', msg)) log(text) accesslog = logging.getLogger("turbogears.access") def _cp_log_access(self): tmpl = '%(h)s %(l)s %(u)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"' try: username = request.user_name if username: if isinstance(username, unicode): # might get concatenated to non-ascii byte strings username = username.encode('utf-8') else: username = "-" except AttributeError: username = "-" s = tmpl % {'h': request.remote_host, 'l': '-', 'u': username, 'r': request.requestLine, 's': response.status.split(" ", 1)[0], 'b': response.headers.get('Content-Length', '') or "-", 'f': request.headers.get('referer', ''), 'a': request.headers.get('user-agent', ''), } self.accesslog.info(s) Root = RootController def url(tgpath, tgparams=None, **kw): """Computes URLs. tgpath can be a list or a string. If the path is absolute (starts with a "/"), the server.webpath, SCRIPT_NAME and the approot of the application are prepended to the path. In order for the approot to be detected properly, the root object should extend controllers.RootController. Query parameters for the URL can be passed in as a dictionary in the second argument *or* as keyword parameters. Values which are a list or a tuple are used to create multiple key-value pairs. """ if not isinstance(tgpath, basestring): tgpath = '/'.join(list(tgpath)) if tgpath.startswith('/'): webpath = (config.get('server.webpath') or '').rstrip('/') if tg_util.request_available(): check_app_root() tgpath = request.app_root + tgpath try: webpath += request.wsgi_environ['SCRIPT_NAME'].rstrip('/') except (AttributeError, KeyError): pass tgpath = webpath + tgpath if tgparams is None: tgparams = kw else: try: tgparams = tgparams.copy() tgparams.update(kw) except AttributeError: raise TypeError('url() expects a dictionary for query parameters') args = [] for key, value in tgparams.iteritems(): if value is None: continue if isinstance(value, (list, tuple)): pairs = [(key, v) for v in value] else: pairs = [(key, value)] for k, v in pairs: if v is None: continue if isinstance(v, unicode): v = v.encode('utf8') args.append((k, str(v))) if args: query_string = urllib.urlencode(args, True) if '?' in tgpath: tgpath += '&' + query_string else: tgpath += '?' + query_string return tgpath def check_app_root(): """Sets request.app_root if needed.""" if hasattr(request, 'app_root'): return found_root = False trail = request.object_trail top = len(trail) - 1 # compute the app_root by stepping back through the object # trail and collecting up the path elements after the first # root we find # we can eliminate this if we find a way to use # CherryPy's mounting mechanism whenever a new root # is hit. rootlist = [] for i in xrange(len(trail) - 1, -1, -1): path, obj = trail[i] if not found_root and isinstance(obj, RootController): if i == top: break found_root = True if found_root and i > 0: rootlist.insert(0, path) app_root = '/'.join(rootlist) if not app_root.startswith('/'): app_root = '/' + app_root if app_root.endswith('/'): app_root = app_root[:-1] request.app_root = app_root def redirect(redirect_path, redirect_params=None, **kw): """Redirect (via cherrypy.HTTPRedirect). Raises the exception instead of returning it, this to allow users to both call it as a function or to raise it as an exception. """ if not isinstance(redirect_path, basestring): redirect_path = '/'.join(list(redirect_path)) if not redirect_path.startswith('/'): path = request.path_info check_app_root() if path.startswith(request.app_root): path = path[len(request.app_root):] redirect_path = urlparse.urljoin(path, redirect_path) raise cherrypy.HTTPRedirect(url(tgpath=redirect_path, tgparams=redirect_params, **kw)) __all__ = [ "Controller", "error_handler", "exception_handler", "expose", "flash", "redirect", "Root", "RootController", "url", "validate", ] PK>🾁ooturbogears/controllers.pyc; PMc @sydZdkZdkZdkZdkZdkZdklZdkl Z l Z l Z dk l Z dkZdklZlZdkiZdklZlZlZlZdklZdklZd klZlZei d Z!ei"d e#oRei"d e#d jo5dk$Z$ei%hde$i&e$i"d<qNne'dZ(de)fdYZ*e#e#ei+i,e#e#dZ-de i.fdYZ/dZ0dZ1e#e#e#e#e#e#e#e'de#e#d Z2dZ3dZ4dZ5de6fdYZ7de7fd YZ8e8Z9e#d!Z:d"Z;e#d#Z<dd$d%d&d'd(d)dd*d+g Z=dS(,s/Classes and methods for TurboGears controllers.N(sizip(sgenericsstrategys functions(sisclass(srequestsresponse(sviewsdatabases errorhandlingsconfig(sweak_signature_decorator(sInvalid(s error_handlersexception_handlersturbogears.controllersssession_filter.onssession_filter.storage_types PostgreSQLssession_filter.get_dbssessions.postgres.dsnc CsIt|todkl} ti}tt| t tit }h} t idg} t idto| iddnx| D]}ti|}t|o |}n|| d|iddscsS(N(sform(sself(sform(s/build\bdist.win32\egg\turbogears\controllers.pyssc sDttdo|||Sn|o|dp|d}ti|||\}}h}t j o }nt }|oc|i }y|i|i||Wn*tj o}|i}|t_nX|t_nottoixiD]T\}} y&| i|i|t |||s( sgenericsCustomDispatchs_exposesfuncs _allow_jsonslogsdebugswhensFalses found_defaults _ruleinfosruleinfos _add_rule(sfuncs found_defaultsruleinfos_expose((s/build\bdist.win32\egg\turbogears\controllers.pys _build_ruless     sdefaultc s|o |n o ndjptjo tjodtntjotidtntidtot i i n d} t | SdS(sR Exposes a method to the web. By putting the expose decorator on a method, you tell TurboGears that the method should be accessible via URL traversal. Additionally, expose handles the output processing (turning a dictionary into finished output) and is also responsible for ensuring that the request is wrapped in a database transaction. You can apply multiple expose decorators to a method, if you'd like to support multiple output formats. The decorator that's listed first in your code without as_format or accept_format is the default that is chosen when no format is specifically asked for. Any other expose calls that are missing as_format and accept_format will have as_format implicitly set to the whatever comes before the ":" in the template name (or the whole template name if there is no ":". For example, expose("json"), if it's not the default expose, will have as_format set to "json". When as_format is set, passing the same value in the tg_format parameter in a request will choose the options for that expose decorator. Similarly, accept_format will watch for matching Accept headers. You can also use both. expose("json", as_format="json", accept_format="application/json") will choose JSON output for either case: tg_format=json as a parameter or Accept: application/json as a request header. Passing allow_json=True to an expose decorator is equivalent to adding the decorator just mentioned. Each expose decorator has its own set of options, and each one can choose a different template or even template engine (you can use Kid for HTML output and Cheetah for plain text, for example). See the other expose parameters below to learn about the options you can pass to the template engine. Take a look at the test_expose.py suite for more examples. @param template "templateengine:dotted.reference" reference along the Python path for the template and the template engine. For example, "kid:foo.bar" will have Kid render the bar template in the foo package. @keyparam format format for the template engine to output (if the template engine can render different formats. Kid, for example, can render "html", "xml" or "xhtml") @keyparam content_type sets the content-type http header @keyparam allow_json allow the function to be exposed as json @keyparam fragment for template engines (like Kid) that generate DOCTYPE declarations and the like, this is a signal to just generate the immediate template fragment. Use this if you're building up a page from multiple templates or going to put something onto a page with .innerHTML. @keyparam mapping mapping with options that are sent to the template engine @keyparam as_format designates which value of tg_format will choose this expose. @keyparam accept_format which value of an Accept: header will choose this expose. @keyparam html deprecated in favor of template @keyparam validators deprecated. Maps argument names to validator applied to that arg @keyparam inputform deprecated. A form object that generates the input to this method sjsonstg.content_typestg.session.automatic_lockcs2tid|tid t|dt oGd}t |_ g|_ t idt}|p dj|_n d}|i idtd d d d d  o t |_npo;dk}|idtdtdd|}n|SdS(Ns Exposing %ss:template: %s, format: %s, allow_json: %s, content-type: %ssexposedcOstiiddi}ti|}t|d ot |nttdo"|i |||i ||}n.tt_ti|i |||i ||}|SdS(NsAcceptss_exposesin_transaction(srequestsheaderssgetslowersacceptstg_utilssimplify_http_accept_headershasattrsfuncs _build_ruless_exposes _allow_jsonsargsskwsoutputsTruesin_transactionsdatabasesrun_with_transaction(sfuncsargsskwsacceptsoutput((s/build\bdist.win32\egg\turbogears\controllers.pysexpose\s" $s tg.allow_jsonsjsoncOs |||S(N(sfuncsargsskw(sfuncsargsskw((s/build\bdist.win32\egg\turbogears\controllers.pysosis as_formats accept_formatstemplatesrulefuncc st|||S(N( s _execute_funcs_funcstemplatesformats content_typesmappingsfragmentsargsskw(s_funcsaccepts allow_jsonsargsskw(s content_typesformatsmappingsfragmentstemplate(s/build\bdist.win32\egg\turbogears\controllers.pysssstUse a separate decorator validate() rather than passing arguments validators and/or inputform to decorator expose().isforms validators(slogsdebugsfuncstemplatesformats allow_jsons content_typesgetattrsFalsesexposesTruesexposeds _ruleinfosconfigsgetsallow_json_from_configs _allow_jsonsinsertsdicts as_formats accept_formats inputforms validatorsswarningsswarnsDeprecationWarningsvalidate(sfuncswarningssexposesallow_json_from_config( s content_types validatorsstemplates as_formatsformatsfragmentsmappings inputforms accept_formats allow_json(s/build\bdist.win32\egg\turbogears\controllers.pysentangleWs*          N(shtmlstemplatesformatsNonesTrues allow_jsons content_typesconfigsgetscherrypyssessions acquire_locksentanglesweak_signature_decorator( stemplates validatorss allow_jsonshtmlsformats content_types inputformsfragments as_formatsmappings accept_formatsentangle(( stemplates validatorss allow_jsonsformats content_types inputformsfragments as_formatsmappings accept_formats/build\bdist.win32\egg\turbogears\controllers.pysexposesD  '  '-c Cstidto*ti|ddgtidgnyWtgi} |i D]0\} } | |i jo| | | fqWqW~ }Wntj o h}nXti|||\}}|i|tidddjotid|||nti|||} t| ttttifp!td|d ii|ift| to(| i d |}| i d|}n|o |i#d o!|i$|i$i%d  |}nt&| |||||Sd S( s/Call controller method and process it's output.stg.strict_parameterss tg_randoms tg_formatstg.ignore_parameterssserver.environments developmentsCalling %s with *(%s), **(%s)shMethod %s.%s() returned unexpected output. Output should be of type basestring, dict, list or generator.is tg_templates.N(*sconfigsgetsFalsestg_utils remove_keysskwsdictsappends_[1]sitemssksvsfuncs_tg_argsstg_kwsAttributeErrors adapt_callsargssupdateslogsdebugs errorhandlingstry_callsoutputs isinstances basestringsliststypess GeneratorTypesAssertionErrors __class__s__name__spopstemplatesformats startswiths __module__srfinds_process_outputs content_typesmappingsfragment( sfuncstemplatesformats content_typesmappingsfragmentsargsskwstg_kwsks_[1]svsoutput((s/build\bdist.win32\egg\turbogears\controllers.pys _execute_funcs&*W  @!cCs:titi|}|tids__doc__sloggingsresurllibsurlparsestypess itertoolssizipsdispatchsgenericsstrategys functionssinspectsisclassscherrypysrequestsresponsesturbogears.utilsutilstg_utils turbogearssviewsdatabases errorhandlingsconfigsturbogears.decoratorsweak_signature_decoratorsturbogears.validatorssInvalidsturbogears.errorhandlings error_handlersexception_handlers getLoggerslogsgetsNonespsycopg2supdatesconnectsFalses_process_outputs ExceptionsBadFormatErrorsFailsafeSchemasnonesvalidatesGenericFunctionsCustomDispatchs _add_rules _build_rulessexposes _execute_funcsflashs _get_flashsobjects ControllersRootControllersRootsurlscheck_app_rootsredirects__all__()s _get_flashscherrypysexception_handlersizipsInvalidsBadFormatErrors error_handlers _build_rulessredirects functionsslogs__all__sgenericspsycopg2sflashs _add_rulesurllibsstrategysres Controllersconfigstg_utils errorhandlingsisclasssexposesRootControllerscheck_app_rootsvalidatesRootsresponsestypessweak_signature_decoratorsloggingsCustomDispatchsdatabasesurlsrequestsurlparses_process_outputs _execute_funcsview((s/build\bdist.win32\egg\turbogears\controllers.pys?sJ            0 F^  *   ) ;  PKzz>dJJturbogears/database.py"""Convenient access to an SQLObject or SQLAlchemy managed database.""" import sys import time import logging import cherrypy from cherrypy import request from cherrypy.filters.basefilter import BaseFilter try: import sqlalchemy from sqlalchemy.orm import create_session as orm_create_session except ImportError: sqlalchemy = None try: import sqlobject from sqlobject.dbconnection import ConnectionHub, Transaction, TheURIOpener from sqlobject.util.threadinglocal import local as threading_local except ImportError: sqlobject = None import dispatch from turbogears import config from turbogears.util import remove_keys from turbogears.genericfunctions import MultiorderGenericFunction log = logging.getLogger("turbogears.database") _engine = None # Provide support for SQLAlchemy if sqlalchemy: def get_engine(): """Retrieve the engine based on the current configuration.""" global _engine if not _engine: alch_args = dict() for k, v in config.config.configMap["global"].items(): if "sqlalchemy" in k: alch_args[k.split(".")[-1]] = v dburi = alch_args.pop('dburi') if not dburi: raise KeyError("No sqlalchemy database config found!") _engine = sqlalchemy.create_engine(dburi, **alch_args) if not metadata.is_bound(): metadata.bind = _engine return _engine def create_session(): """Create a session that uses the engine from thread-local metadata.""" if not metadata.is_bound(): get_engine() return orm_create_session() metadata = sqlalchemy.MetaData() try: from sqlalchemy.orm import scoped_session # Create session with autoflush=False # and autocommit=True (transactional=False) session = scoped_session(create_session) mapper = session.mapper # use session-aware mapper except ImportError: # SQLAlchemy < 0.4 from sqlalchemy.ext.sessioncontext import SessionContext class Objectstore(object): def __init__(self): self.context = SessionContext(create_session) def __getattr__(self, name): return getattr(self.context.registry(), name) session = property(lambda s: s.context.registry()) session = Objectstore() context = session.context Query = sqlalchemy.Query from sqlalchemy.orm import mapper as orm_mapper def mapper(cls, *args, **kwargs): validate = kwargs.pop('validate', False) if not hasattr(getattr(cls, '__init__'), 'im_func'): def __init__(self, **kwargs): for key, value in kwargs.items(): if validate and key not in self.mapper.props: raise KeyError( "Property does not exist: '%s'" % key) setattr(self, key, value) cls.__init__ = __init__ m = orm_mapper(cls, extension=context.mapper_extension, *args, **kwargs) class query_property(object): def __get__(self, instance, cls): return Query(cls, session=context.current) cls.query = query_property() return m try: from sqlalchemy.ext import activemapper activemapper.metadata, activemapper.objectstore = metadata, session except ImportError: pass try: import elixir elixir.metadata, elixir.session = metadata, session except ImportError: pass else: def get_engine(): pass def create_session(): pass metadata = session = mapper = None bind_meta_data = bind_metadata = get_engine # alias names try: set except NameError: # Python 2.3 from sets import Set as set hub_registry = set() _hubs = dict() # stores the AutoConnectHubs used for each connection URI # Provide support for SQLObject if sqlobject: def _mysql_timestamp_converter(raw): """Convert a MySQL TIMESTAMP to a floating point number representing the seconds since the Un*x Epoch. It uses custom code the input seems to be the new (MySQL 4.1+) timestamp format, otherwise code from the MySQLdb module is used.""" if raw[4] == '-': return time.mktime(time.strptime(raw, '%Y-%m-%d %H:%M:%S')) else: import MySQLdb.converters return MySQLdb.converters.mysql_timestamp_converter(raw) class AutoConnectHub(ConnectionHub): """Connects to the database once per thread. The AutoConnectHub also provides convenient methods for managing transactions.""" uri = None params = {} def __init__(self, uri=None, supports_transactions=True): if not uri: uri = config.get("sqlobject.dburi") self.uri = uri self.supports_transactions = supports_transactions hub_registry.add(self) ConnectionHub.__init__(self) def _is_interesting_version(self): """Return True only if version of MySQLdb <= 1.0.""" import MySQLdb module_version = MySQLdb.version_info[0:2] major = module_version[0] minor = module_version[1] # we can't use Decimal here because it is only available for Python 2.4 return (major < 1 or (major == 1 and minor < 2)) def _enable_timestamp_workaround(self, connection): """Enable a workaround for an incompatible timestamp format change in MySQL 4.1 when using an old version of MySQLdb. See trac ticket #1235 - http://trac.turbogears.org/ticket/1235 for details.""" # precondition: connection is a MySQLConnection import MySQLdb import MySQLdb.converters if self._is_interesting_version(): conversions = MySQLdb.converters.conversions.copy() conversions[MySQLdb.constants.FIELD_TYPE.TIMESTAMP] = \ _mysql_timestamp_converter # There is no method to use custom keywords when using # "connectionForURI" in sqlobject so we have to insert the # conversions afterwards. connection.kw["conv"] = conversions def getConnection(self): try: conn = self.threadingLocal.connection return self.begin(conn) except AttributeError: if self.uri: conn = sqlobject.connectionForURI(self.uri) # the following line effectively turns off the DBAPI connection # cache. We're already holding on to a connection per thread, # and the cache causes problems with sqlite. if self.uri.startswith("sqlite"): TheURIOpener.cachedURIs = {} elif self.uri.startswith("mysql") and \ config.get("turbogears.enable_mysql41_timestamp_workaround", False): self._enable_timestamp_workaround(conn) self.threadingLocal.connection = conn return self.begin(conn) raise AttributeError( "No connection has been defined for this thread " "or process") def reset(self): """Used for testing purposes. This drops all of the connections that are being held.""" self.threadingLocal = threading_local() def begin(self, conn=None): """Start a transaction.""" if not self.supports_transactions: return conn if not conn: conn = self.getConnection() if isinstance(conn, Transaction): if conn._obsolete: conn.begin() return conn self.threadingLocal.old_conn = conn trans = conn.transaction() self.threadingLocal.connection = trans return trans def commit(self): """Commit the current transaction.""" if not self.supports_transactions: return try: conn = self.threadingLocal.connection except AttributeError: return if isinstance(conn, Transaction): self.threadingLocal.connection.commit() def rollback(self): """Rollback the current transaction.""" if not self.supports_transactions: return try: conn = self.threadingLocal.connection except AttributeError: return if isinstance(conn, Transaction) and not conn._obsolete: self.threadingLocal.connection.rollback() def end(self): """End the transaction, returning to a standard connection.""" if not self.supports_transactions: return try: conn = self.threadingLocal.connection except AttributeError: return if not isinstance(conn, Transaction): return if not conn._obsolete: conn.rollback() self.threadingLocal.connection = self.threadingLocal.old_conn del self.threadingLocal.old_conn self.threadingLocal.connection.cache.clear() class PackageHub(object): """Transparently proxies to an AutoConnectHub for the URI that is appropriate for this package. A package URI is configured via "packagename.dburi" in the global CherryPy settings. If there is no package DB URI configured, the default (provided by "sqlobject.dburi") is used. The hub is not instantiated until an attempt is made to use the database. """ def __init__(self, packagename): self.packagename = packagename self.hub = None def __get__(self, obj, type): if self.hub: return self.hub.__get__(obj, type) else: return self def __set__(self, obj, type): if not self.hub: self.set_hub() return self.hub.__set__(obj, type) def __getattr__(self, name): if not self.hub: self.set_hub() try: return getattr(self.hub, name) except AttributeError: return getattr(self.hub.getConnection(), name) def set_hub(self): dburi = config.get("%s.dburi" % self.packagename, None) if not dburi: dburi = config.get("sqlobject.dburi", None) if not dburi: raise KeyError, "No database configuration found!" if dburi.startswith("notrans_"): dburi = dburi[8:] trans = False else: trans = True hub = _hubs.get(dburi, None) if not hub: hub = AutoConnectHub(dburi, supports_transactions=trans) _hubs[dburi] = hub self.hub = hub else: class AutoConnectHub(object): pass class PackageHub(object): pass def set_db_uri(dburi, package=None): """Sets the database URI to use either globally or for a specific package. Note that once the database is accessed, calling setDBUri will have no effect. @param dburi: database URI to use @param package: package name this applies to, or None to set the default. """ if package: config.update({'global': {"%s.dburi" % package : dburi} }) else: config.update({'global': {"sqlobject.dburi" : dburi} }) def commit_all(): """Commits the transactions in all registered hubs (for this thread).""" for hub in hub_registry: hub.commit() def rollback_all(): """Rollback the transactions in all registered hubs (for this thread).""" for hub in hub_registry: hub.rollback() def end_all(): """End the transactions in all registered hubs (for this thread).""" for hub in hub_registry: hub.end() [dispatch.generic(MultiorderGenericFunction)] def run_with_transaction(func, *args, **kw): pass [dispatch.generic(MultiorderGenericFunction)] def restart_transaction(args): pass def _use_sa(args=None): # check to see if sqlalchemy has been imported and configured return _engine is not None # include "args" to avoid call being pre-cached [run_with_transaction.when("not _use_sa(args)")] def so_rwt(func, *args, **kw): log.debug("Starting SQLObject transaction") try: try: retval = func(*args, **kw) commit_all() return retval except cherrypy.HTTPRedirect: commit_all() raise except cherrypy.InternalRedirect: commit_all() raise except: # No need to "rollback" the sqlalchemy unit of work, # because nothing has hit the db yet. rollback_all() raise finally: end_all() # include "args" to avoid call being pre-cached [restart_transaction.when("not _use_sa(args)")] def so_restart_transaction(args): #log.debug("ReStarting SQLObject transaction") # Disable for now for compatibility pass def dispatch_exception(exception, args, kw): # errorhandling import here to avoid circular imports from turbogears.errorhandling import dispatch_error # Keep in mind func is not the real func but _expose real_func, accept, allow_json, controller = args[:4] args = args[4:] exc_type, exc_value, exc_trace = sys.exc_info() remove_keys(kw, ("tg_source", "tg_errors", "tg_exceptions")) try: output = dispatch_error( controller, real_func, None, exception, *args, **kw) except dispatch.NoApplicableMethods: raise exc_type, exc_value, exc_trace else: del exc_trace return output # include "args" to avoid call being pre-cached [run_with_transaction.when("_use_sa(args)")] def sa_rwt(func, *args, **kw): log.debug("Starting SA transaction") request.sa_transaction = make_sa_transaction(session) try: try: retval = func(*args, **kw) except (cherrypy.HTTPRedirect, cherrypy.InternalRedirect): # If a redirect happens, commit and proceed with redirect if sa_transaction_active(): log.debug('Redirect in active transaction - will commit now') if hasattr(session, 'commit'): session.commit() else: # SA < 0.4 request.sa_transaction.commit() else: log.debug('Redirect in inactive transaction') raise except: # If any other exception happens, rollback and re-raise error if sa_transaction_active(): log.debug('Error in active transaction - will rollback now') if hasattr(session, 'rollback'): session.rollback() else: # SA < 0.4 request.sa_transaction.rollback() else: log.debug('Error in inactive transaction') raise # If the call was successful, commit and proceed if sa_transaction_active(): log.debug('Transaction is still active - will commit now') try: session.commit() except AttributeError: # SA < 0.4 request.sa_transaction.commit() else: log.debug('Transaction is already inactive') finally: log.debug('Ending SA transaction') session.close() return retval # include "args" to avoid call being pre-cached [restart_transaction.when("_use_sa(args)")] def sa_restart_transaction(args): log.debug("Restarting SA transaction") if sa_transaction_active(): log.debug('Transaction is still active - will rollback now') try: session.rollback() except AttributeError: # SA < 0.4 request.sa_transaction.rollback() else: log.debug('Transaction is already inactive') session.close() request.sa_transaction = make_sa_transaction(session) def make_sa_transaction(session): """Create a new transaction in an SA session.""" try: return session.begin() except AttributeError: # SA < 0.4 return session.create_transaction() def sa_transaction_active(): """Check whether SA transaction is still active.""" try: return session.is_active except AttributeError: # SA < 0.4.9 try: return session().is_active except (TypeError, AttributeError): # SA < 0.4.7 try: transaction = request.sa_transaction except AttributeError: return False try: return transaction and transaction.is_active except AttributeError: # SA < 0.4.3 return transaction.session.transaction def so_to_dict(sqlobj): """Convert SQLObject to a dictionary based on columns.""" d = {} if sqlobj is None: return d # stops recursion for name in sqlobj.sqlmeta.columns.keys(): d[name] = getattr(sqlobj, name) d['id'] = sqlobj.id # id must be added explicitly if sqlobj._inheritable: d.update(so_to_dict(sqlobj._parent)) d.pop('childName') return d def so_columns(sqlclass, columns=None): """Return a dict with all columns from a SQLObject. This includes the columns from InheritableSO's bases. """ if columns is None: columns = {} columns.update(filter(lambda i: i[0] != 'childName', sqlclass.sqlmeta.columns.items())) if sqlclass._inheritable: so_columns(sqlclass.__base__, columns) return columns def so_joins(sqlclass, joins=None): """Return a list with all joins from a SQLObject. The list includes the columns from InheritableSO's bases. """ if joins is None: joins = [] joins.extend(sqlclass.sqlmeta.joins) if sqlclass._inheritable: so_joins(sqlclass.__base__, joins) return joins class EndTransactionsFilter(BaseFilter): def on_end_resource(self): if _use_sa(): try: session.expunge_all() except AttributeError: # SQLAlchemy < 0.5.1 session.clear() end_all() __all__ = ["get_engine", "metadata", "session", "mapper", "PackageHub", "AutoConnectHub", "set_db_uri", "commit_all", "rollback_all", "end_all", "so_to_dict", "so_columns", "so_joins", "EndTransactionsFilter"] PK>_e[<`<`turbogears/database.pyc; PMc@scdZdkZdkZdkZdkZdklZdklZydkZdk l Z Wne j o e ZnXy3dkZdklZlZlZdklZWne j o e ZnXdkZdklZdklZd klZeid Ze aeo,d Z d Z ei!Z"y&d k l#Z#e#e Z$e$i%Z%Wnge j o[dk&l'Z'de(fdYZ)e)Z$e$i*Z*ei+Z+dk l%Z,dZ%nXy)dk-l.Z.e"e$f\e._"e._/Wne j onXy%dk0Z0e"e$f\e0_"e0_$Wqae j oqaXn!dZ dZ e Z"Z$Z%e Z1Z2ye3Wn e4j odk5l6Z3nXe3Z7e8Z9eo9dZ:defdYZ;de(fdYZ<n-de(fdYZ;de(fdYZ<e dZ=dZ>d Z?d!Z@eiAegd"ZBeiAegd#ZCe d$ZDeBiEd%gd&ZFeCiEd%gd'ZGd(ZHeBiEd)gd*ZIeCiEd)gd+ZJd,ZKd-ZLd.ZMe d/ZNe d0ZOd1efd2YZPd3d4d5d6ddd7d8d9d:d;d<d=d1gZQdS(>sAConvenient access to an SQLObject or SQLAlchemy managed database.N(srequest(s BaseFilter(screate_session(s ConnectionHubs Transactions TheURIOpener(slocal(sconfig(s remove_keys(sMultiorderGenericFunctionsturbogears.databasecCst ot}xLtiidiD]4\}}d|jo|||iddGs(s__name__s __module__s__init__s __getattr__spropertyssession(((s,build\bdist.win32\egg\turbogears\database.pys ObjectstoreBs  (smappercs|idttt|dd od}||_nt|dt i ||}dt fdY}||_|SdS(Nsvalidates__init__sim_funcc s_xX|iD]J\}}o||iijotd|nt |||q WdS(NsProperty does not exist: '%s'( skwargssitemsskeysvaluesvalidatesselfsmapperspropssKeyErrorssetattr(sselfskwargssvalueskey(svalidate(s,build\bdist.win32\egg\turbogears\database.pys__init__Os  s extensionsquery_propertycBstZdZRS(NcCst|dtiSdS(Nssession(sQuerysclsscontextscurrent(sselfsinstancescls((s,build\bdist.win32\egg\turbogears\database.pys__get__Ys(s__name__s __module__s__get__(((s,build\bdist.win32\egg\turbogears\database.pysquery_propertyXs(skwargsspopsFalsesvalidateshasattrsgetattrsclss__init__s orm_mapperscontextsmapper_extensionsargssmsobjectsquery_propertysquery(sclssargsskwargssquery_propertysms__init__svalidate((svalidates,build\bdist.win32\egg\turbogears\database.pysmapperLs   (s activemappercCsdS(N((((s,build\bdist.win32\egg\turbogears\database.pys get_enginejscCsdS(N((((s,build\bdist.win32\egg\turbogears\database.pyscreate_sessionms(sSetcCsK|ddjotiti|dSndk}|ii|SdS(sConvert a MySQL TIMESTAMP to a floating point number representing the seconds since the Un*x Epoch. It uses custom code the input seems to be the new (MySQL 4.1+) timestamp format, otherwise code from the MySQLdb module is used.is-s%Y-%m-%d %H:%M:%SN(srawstimesmktimesstrptimesMySQLdb.converterssMySQLdbs converterssmysql_timestamp_converter(srawsMySQLdb((s,build\bdist.win32\egg\turbogears\database.pys_mysql_timestamp_converters  sAutoConnectHubcBsttZdZeZhZeedZdZdZ dZ dZ edZ dZ dZd ZRS( sConnects to the database once per thread. The AutoConnectHub also provides convenient methods for managing transactions.cCsK| otid}n||_||_ti|ti|dS(Nssqlobject.dburi( surisconfigsgetsselfssupports_transactionss hub_registrysadds ConnectionHubs__init__(sselfsurissupports_transactions((s,build\bdist.win32\egg\turbogears\database.pys__init__s    cCsUdk}|idd!}|d}|d}|djp|djo |djSdS(s.Return True only if version of MySQLdb <= 1.0.Niii(sMySQLdbs version_infosmodule_versionsmajorsminor(sselfsmodule_versionsMySQLdbsmajorsminor((s,build\bdist.win32\egg\turbogears\database.pys_is_interesting_versions    cCsYdk}dk}|io6|iii}t||ii i <||i dEnd the transactions in all registered hubs (for this thread).N(s hub_registryshubsend(shub((s,build\bdist.win32\egg\turbogears\database.pysend_allTscOsdS(N((sfuncsargsskw((s,build\bdist.win32\egg\turbogears\database.pysrun_with_transactionZscCsdS(N((sargs((s,build\bdist.win32\egg\turbogears\database.pysrestart_transaction^scCsttj SdS(N(s_enginesNone(sargs((s,build\bdist.win32\egg\turbogears\database.pys_use_saassnot _use_sa(args)cOstidzty|||}t|SWnOtij otn1ti j otnt nXWdt XdS(NsStarting SQLObject transaction( slogsdebugsfuncsargsskwsretvals commit_allscherrypys HTTPRedirectsInternalRedirects rollback_allsend_all(sfuncsargsskwsretval((s,build\bdist.win32\egg\turbogears\database.pysso_rwtgs"  cCsdS(N((sargs((s,build\bdist.win32\egg\turbogears\database.pysso_restart_transaction~sc Csdkl}|d \}}} }|d}ti\} }}t |dddfy|||t|||} Wn"tij o| ||n X~| SdS(N(sdispatch_erroris tg_sources tg_errorss tg_exceptions(sturbogears.errorhandlingsdispatch_errorsargss real_funcsaccepts allow_jsons controllerssyssexc_infosexc_types exc_values exc_traces remove_keysskwsNones exceptionsoutputsdispatchsNoApplicableMethods( s exceptionsargsskws exc_traces real_funcsaccepts exc_values controllersdispatch_errorsoutputsexc_types allow_json((s,build\bdist.win32\egg\turbogears\database.pysdispatch_exceptions  s _use_sa(args)cOstidttt_zDy|||}Wnt i t i fj o]t o<tidttdotiqtiintidn^t o<tidttdotiqtiintidnXt oBtidytiWq_tj otiiq_Xntid Wdtid tiX|SdS( NsStarting SA transactions0Redirect in active transaction - will commit nowscommits Redirect in inactive transactions/Error in active transaction - will rollback nowsrollbacksError in inactive transactions-Transaction is still active - will commit nowsTransaction is already inactivesEnding SA transaction(slogsdebugsmake_sa_transactionssessionsrequestssa_transactionsfuncsargsskwsretvalscherrypys HTTPRedirectsInternalRedirectssa_transaction_activeshasattrscommitsrollbacksAttributeErrorsclose(sfuncsargsskwsretval((s,build\bdist.win32\egg\turbogears\database.pyssa_rwts@           cCstidtoBtidytiWqftj otiiqfXntidtit tt_dS(NsRestarting SA transactions/Transaction is still active - will rollback nowsTransaction is already inactive( slogsdebugssa_transaction_activessessionsrollbacksAttributeErrorsrequestssa_transactionsclosesmake_sa_transaction(sargs((s,build\bdist.win32\egg\turbogears\database.pyssa_restart_transactions     cCs2y|iSWntj o|iSnXdS(s*Create a new transaction in an SA session.N(ssessionsbeginsAttributeErrorscreate_transaction(ssession((s,build\bdist.win32\egg\turbogears\database.pysmake_sa_transactions cCsy tiSWntj oytiSWqttfj o`y ti}Wntj o tSnXy|o|iSWqtj o|iiSqXqXnXdS(s-Check whether SA transaction is still active.N(ssessions is_activesAttributeErrors TypeErrorsrequestssa_transactions transactionsFalse(s transaction((s,build\bdist.win32\egg\turbogears\database.pyssa_transaction_actives   cCsh}|tjo|Snx-|iiiD]}t||||sN( scolumnssNonesupdatesfilterssqlclassssqlmetasitemss _inheritables so_columnss__base__(ssqlclassscolumns((s,build\bdist.win32\egg\turbogears\database.pys so_columnss   cCsP|tjo g}n|i|ii|iot|i|n|SdS(ssReturn a list with all joins from a SQLObject. The list includes the columns from InheritableSO's bases. N(sjoinssNonesextendssqlclassssqlmetas _inheritablesso_joinss__base__(ssqlclasssjoins((s,build\bdist.win32\egg\turbogears\database.pysso_joinss   sEndTransactionsFiltercBstZdZRS(NcCsGto2ytiWq<tj otiq<XntdS(N(s_use_sassessions expunge_allsAttributeErrorsclearsend_all(sself((s,build\bdist.win32\egg\turbogears\database.pyson_end_resources  (s__name__s __module__son_end_resource(((s,build\bdist.win32\egg\turbogears\database.pysEndTransactionsFilterss get_enginesmetadatassessionsmappers set_db_uris commit_alls rollback_allsend_alls so_to_dicts so_columnssso_joins(Rs__doc__ssysstimesloggingscherrypysrequestscherrypy.filters.basefilters BaseFilters sqlalchemyssqlalchemy.ormscreate_sessionsorm_create_sessions ImportErrorsNones sqlobjectssqlobject.dbconnections ConnectionHubs Transactions TheURIOpenerssqlobject.util.threadinglocalslocalsthreading_localsdispatchs turbogearssconfigsturbogears.utils remove_keyssturbogears.genericfunctionssMultiorderGenericFunctions getLoggerslogs_engines get_enginesMetaDatasmetadatasscoped_sessionssessionsmapperssqlalchemy.ext.sessioncontextsSessionContextsobjects ObjectstorescontextsQuerys orm_mapperssqlalchemy.exts activemappers objectstoreselixirsbind_meta_datas bind_metadatassets NameErrorssetssSets hub_registrysdicts_hubss_mysql_timestamp_convertersAutoConnectHubs PackageHubs set_db_uris commit_alls rollback_allsend_allsgenericsrun_with_transactionsrestart_transactions_use_saswhensso_rwtsso_restart_transactionsdispatch_exceptionssa_rwtssa_restart_transactionsmake_sa_transactionssa_transaction_actives so_to_dicts so_columnssso_joinssEndTransactionsFilters__all__(:ssetscherrypys_mysql_timestamp_converters Objectstoresbind_meta_datasdispatchsrestart_transactionsso_restart_transactions Transactionsorm_create_sessions so_columnss TheURIOpeners_hubsssa_restart_transactionssa_rwtslogs__all__s BaseFiltersAutoConnectHubs ConnectionHubs so_to_dictsend_alls rollback_allsconfigsmetadatasmake_sa_transactions hub_registrys sqlalchemyselixirs activemappers get_enginestimes commit_allsrun_with_transactionssyss_use_sas bind_metadatasQuerysso_rwtsscoped_sessionscreate_sessions sqlobjectsmappers orm_mappersloggingssa_transaction_activesso_joinssrequests PackageHubs set_db_urisdispatch_exceptionssessions remove_keysscontextsthreading_localsMultiorderGenericFunctionsEndTransactionsFiltersSessionContext((s,build\bdist.win32\egg\turbogears\database.pys?s                                  v2           +     PKzz>@4 ``turbogears/decorator.pyimport itertools from copy import copy from inspect import getargspec, formatargspec from peak.util.decorators import decorate_assignment # Inspired by Michele Simionato's decorator library # http://www.phyast.pitt.edu/~micheles/python/documentation.html def decorate(func, caller, signature=None): """Decorate func with caller.""" if signature is not None: argnames, varargs, kwargs, defaults = signature else: argnames, varargs, kwargs, defaults = getargspec(func) if defaults is None: defaults = () parameters = formatargspec(argnames, varargs, kwargs, defaults)[1:-1] defval = itertools.count(len(argnames)-len(defaults)) args = formatargspec(argnames, varargs, kwargs, defaults, formatvalue=lambda value:"=%s" % ( argnames[defval.next()]))[1:-1] func_str = """ def %s(%s): return caller(func, %s) """ % (func.__name__, parameters, args) exec_dict = dict(func=func, caller=caller) exec func_str in exec_dict newfunc = exec_dict[func.__name__] newfunc.__doc__ = func.__doc__ newfunc.__dict__ = func.__dict__.copy() newfunc.__module__ = func.__module__ if hasattr(func, "__composition__"): newfunc.__composition__ = copy(func.__composition__) else: newfunc.__composition__ = [func] newfunc.__composition__.append(newfunc) return newfunc def decorator(entangler, signature=None): """Decorate function with entangler. Use signature as signature or preserve original signature if signature is None. Enables alternative decorator syntax for Python 2.3 as seen in PEAK: [my_decorator(foo)] def baz(): pass Mind, the decorator needs to be a closure for this syntax to work. """ def callback(frame, k, v, old_locals): return decorate(v, entangler(v), signature) return decorate_assignment(callback, 3) def weak_signature_decorator(entangler): """Decorate function with entangler and change signature to accept arbitrary additional arguments. Enables alternative decorator syntax for Python 2.3 as seen in PEAK: [my_decorator(foo)] def baz(): pass Mind, the decorator needs to be a closure for this syntax to work. """ def callback(frame, k, v, old_locals): return decorate(v, entangler(v), make_weak_signature(v)) return decorate_assignment(callback, 3) def simple_decorator(caller, signature=None): """Decorate function with caller.""" def entangle(func): return decorate(func, caller, signature) return entangle def simple_weak_signature_decorator(caller): """Decorate function with caller and change signature to accept arbitrary additional arguments.""" def entangle(func): return decorate(func, caller, make_weak_signature(func)) return entangle def make_weak_signature(func): """Change signature to accept arbitrary additional arguments.""" argnames, varargs, kwargs, defaults = getargspec(func) if kwargs is None: kwargs = "_decorator__kwargs" if varargs is None: varargs = "_decorator__varargs" return argnames, varargs, kwargs, defaults def compose(*decorators): """Compose decorators.""" return lambda func: reduce(lambda f, g: g(f), decorators, func) def func_composition(func): """Return composition (decorator wise) of function.""" return getattr(func, "__composition__", [func]) def func_original(func): """Return original (undecorated) function.""" return func_composition(func)[0] def func_id(func): """Return identity of function. Identity is invariant under decorator application (if decorator is created with decorator() or weak_signature_decorator()). """ return id(func_original(func)) def func_eq(f, g): """Check if functions are identical.""" return func_id(f) == func_id(g) __all__ = ["decorator", "compose", "func_id", "func_eq", "func_original", "func_composition", "weak_signature_decorator", "decorate", "make_weak_signature", "simple_decorator", "simple_weak_signature_decorator",] PK>똶Pturbogears/decorator.pyc; PMc @sdkZdklZdklZlZdklZedZedZ dZ edZ dZ d Z d Zd Zd Zd ZdZdddddddddddg ZdS(N(scopy(s getargspecs formatargspec(sdecorate_assignmentc sl|ej o|\} }}ne|\} }}|ejo f}ne| ||dd!}e i e e |e| ||dddd!}d|i||f} ed|d|} | | U| |i}|i|_|ii|_|i|_e|doe|i|_n |g|_|ii||Sd S( sDecorate func with caller.iis formatvaluecsdiS(Ns=%s(sargnamessdefvalsnext(svalue(sdefvalsargnames(s-build\bdist.win32\egg\turbogears\decorator.pysss' def %s(%s): return caller(func, %s) sfuncscallers__composition__N(s signaturesNonesargnamessvarargsskwargssdefaultss getargspecsfuncs formatargspecs parameterss itertoolsscountslensdefvalsargss__name__sfunc_strsdictscallers exec_dictsnewfuncs__doc__s__dict__scopys __module__shasattrs__composition__sappend( sfuncscallers signaturesargssdefaultss parametersskwargssargnamessnewfuncsdefvalsvarargssfunc_strs exec_dict((sargnamessdefvals-build\bdist.win32\egg\turbogears\decorator.pysdecorate s,       cs d}t|dSdS(sRDecorate function with entangler. Use signature as signature or preserve original signature if signature is None. Enables alternative decorator syntax for Python 2.3 as seen in PEAK: [my_decorator(foo)] def baz(): pass Mind, the decorator needs to be a closure for this syntax to work. cst||SdS(N(sdecoratesvs entanglers signature(sframesksvs old_locals(s entanglers signature(s-build\bdist.win32\egg\turbogears\decorator.pyscallback9siN(scallbacksdecorate_assignment(s entanglers signaturescallback((s entanglers signatures-build\bdist.win32\egg\turbogears\decorator.pys decorator+s csd}t|dSdS(s;Decorate function with entangler and change signature to accept arbitrary additional arguments. Enables alternative decorator syntax for Python 2.3 as seen in PEAK: [my_decorator(foo)] def baz(): pass Mind, the decorator needs to be a closure for this syntax to work. cs t||t|SdS(N(sdecoratesvs entanglersmake_weak_signature(sframesksvs old_locals(s entangler(s-build\bdist.win32\egg\turbogears\decorator.pyscallbackIsiN(scallbacksdecorate_assignment(s entanglerscallback((s entanglers-build\bdist.win32\egg\turbogears\decorator.pysweak_signature_decorator=s  csd}|SdS(sDecorate function with caller.cst|SdS(N(sdecoratesfuncscallers signature(sfunc(scallers signature(s-build\bdist.win32\egg\turbogears\decorator.pysentangleOsN(sentangle(scallers signaturesentangle((scallers signatures-build\bdist.win32\egg\turbogears\decorator.pyssimple_decoratorMscsd}|SdS(s`Decorate function with caller and change signature to accept arbitrary additional arguments.cst|t|SdS(N(sdecoratesfuncscallersmake_weak_signature(sfunc(scaller(s-build\bdist.win32\egg\turbogears\decorator.pysentangleVsN(sentangle(scallersentangle((scallers-build\bdist.win32\egg\turbogears\decorator.pyssimple_weak_signature_decoratorSs cCsZt|\}}}}|tjo d}n|tjo d}n||||fSdS(s:Change signature to accept arbitrary additional arguments.s_decorator__kwargss_decorator__varargsN(s getargspecsfuncsargnamessvarargsskwargssdefaultssNone(sfuncsvarargssargnamessdefaultsskwargs((s-build\bdist.win32\egg\turbogears\decorator.pysmake_weak_signatureZs    csdSdS(sCompose decorators.cstd|S(NcCs ||S(N(sgsf(sfsg((s-build\bdist.win32\egg\turbogears\decorator.pyses(sreduces decoratorssfunc(sfunc(s decorators(s-build\bdist.win32\egg\turbogears\decorator.pysesN((s decorators((s decoratorss-build\bdist.win32\egg\turbogears\decorator.pyscomposecscCst|d|gSdS(s0Return composition (decorator wise) of function.s__composition__N(sgetattrsfunc(sfunc((s-build\bdist.win32\egg\turbogears\decorator.pysfunc_compositiongscCst|dSdS(s'Return original (undecorated) function.iN(sfunc_compositionsfunc(sfunc((s-build\bdist.win32\egg\turbogears\decorator.pys func_originalkscCstt|SdS(sReturn identity of function. Identity is invariant under decorator application (if decorator is created with decorator() or weak_signature_decorator()). N(sids func_originalsfunc(sfunc((s-build\bdist.win32\egg\turbogears\decorator.pysfunc_idoscCst|t|jSdS(s!Check if functions are identical.N(sfunc_idsfsg(sfsg((s-build\bdist.win32\egg\turbogears\decorator.pysfunc_eqwss decoratorscomposesfunc_idsfunc_eqs func_originalsfunc_compositionsweak_signature_decoratorsdecoratesmake_weak_signaturessimple_decoratorssimple_weak_signature_decorator(s itertoolsscopysinspects getargspecs formatargspecspeak.util.decoratorssdecorate_assignmentsNonesdecorates decoratorsweak_signature_decoratorssimple_decoratorssimple_weak_signature_decoratorsmake_weak_signaturescomposesfunc_compositions func_originalsfunc_idsfunc_eqs__all__(ssimple_decoratorsweak_signature_decoratorscopys__all__smake_weak_signaturesfunc_compositions formatargspecssimple_weak_signature_decorators itertoolsscomposesdecoratesfunc_eqsdecorate_assignments getargspecs func_originals decoratorsfunc_id((s-build\bdist.win32\egg\turbogears\decorator.pys?s            PKzz>J%--turbogears/docgen.pyimport os import time from glob import glob from setuptools import Command import pkg_resources pkg_resources.require("Kid >= 0.6.4") import kid import re from distutils import log class GenSite(Command): """setuptools command to generate the TurboGears website""" user_options = [ ("srcdirs=", "s", "directories containing the source files (default: docs)"), ("destdir=", "d", "destination output directory (default: dist/site)"), ("encoding=", "e", "encoding for output (default: utf8)"), ("force", "f", "regenerate all files"), ("ignoredirs=", "i", "directories to ignore (default: ['.svn', '.cvs'])"), ("ignorefiles=", "x", "files to ignore (default: ['.*\\.pyc', '.DS_Store'])"), ("nodelete=", "l", "directories to leave alone rather than delete"), ("templates=", "t", "mapping of templates to load (format: name=templatefile,name=templatefile)"), ("copydirs=", "c", "copy files from these directories without template proc. (destdir=srcdir,...)"), ("noprintable", "N", "don't make printable version of tutorials"), ("eggdir=", "g", "which directory has the eggs in it (default: '../thirdparty/eggs')") ] boolean_options = ["force"] srcdirs = None destdir = "dist/site" encoding = "utf8" force = False ignoredirs = None ignorefiles = None nodelete = None templates = None copydirs = None eggdir = "../thirdparty/eggs" noprintable = False def initialize_options(self): pass def finalize_options(self): if self.srcdirs is None: self.srcdirs = ["docs"] if self.srcdirs == "": self.srcdirs = [] self.ensure_string_list("srcdirs") self.ensure_string("destdir", "dist/site") self.ensure_string("encoding", "utf8") if self.ignoredirs is None: self.ignoredirs = [".svn", ".cvs"] self.ensure_string_list("ignoredirs") if self.ignorefiles is None: self.ignorefiles = ['.*\\.pyc', '.DS_Store'] if self.nodelete is None: self.nodelete = ["dist/site/preview"] self.ensure_string_list("nodelete") self.ensure_string_list("ignorefiles") regexes = [] for pat in self.ignorefiles: regexes.append(re.compile(pat)) self.ignorepatterns = regexes self.templates, self.templates_order = self._split_mapping(self.templates, True) self.copydirs = self._split_mapping(self.copydirs) def _split_mapping(self, valToSplit, preserve_order=False): mapping = {} order = [] if valToSplit and isinstance(valToSplit, basestring): pairs = re.split(",\s*", valToSplit) for pair in pairs: name, filename = re.split("\s*=\s*", pair) mapping[name] = os.path.abspath(filename) order.append(name) if preserve_order: return mapping, order return mapping def check_if_newer(self, src, dest): srcmtime = os.path.getmtime(src) if os.path.exists(dest): destmtime = os.path.getmtime(dest) else: destmtime = 0 return srcmtime > destmtime def copy_if_newer(self, src, dest): if self.force or self.check_if_newer(src, dest): d = os.path.dirname(dest) if not os.path.exists(d): os.makedirs(d) self.copy_file(src, dest) def render_template(self, src, dest, depth): if not self.force and not self.check_if_newer(src, dest): return if not self.dry_run: log.info("rendering %s" % dest) else: log.info("skipping rendering %s" % dest) return template = kid.load_template(src, cache=False) template.Template.serializer = self.serializer toroot = "../" * depth destfile = dest[len(self.destdir)+1:] updated = time.strftime("%b %d, %Y", time.localtime(os.path.getmtime(src))) output = template.serialize(encoding=self.encoding, root=toroot, updated=updated, destfile=destfile, eggs=self.eggs) output = output.replace("$$", "$") destfile = open(dest, "w") destfile.write(output) destfile.close() def update_site_files(self, srcdir, processTemplates = True, destroot=None): if not destroot: destroot = self.destdir for root, dirs, files in os.walk(srcdir): if root != srcdir: fromroot = root[len(srcdir)+1:] segments = fromroot.split(os.sep) if set(segments).intersection(self.ignoredirs): continue depth = len(segments) else: fromroot = "" depth = 0 destdir = os.path.join(destroot, fromroot) if not os.path.exists(destdir): if not self.dry_run: log.info("creating directory %s" % (destdir)) os.makedirs(destdir) else: log.info("skipping creating directory %s" % (destdir)) for file in files: ignore = False abs = os.path.abspath(file) for pat in self.ignorepatterns: if pat.match(file): ignore = True break if ignore: continue for tempfile in self.templates.values(): if tempfile == abs: ignore = True break if ignore: continue ext = os.path.splitext(file)[1] dest = os.path.join(destdir, file) self.currentfiles.add(dest) if not processTemplates or ext != ".html": self.copy_if_newer(os.path.join(root, file), dest) else: self.render_template(os.path.join(root, file), dest, depth) def delete_excess_files(self): for root, dirs, files in os.walk(self.destdir): leavealone = False for dirname in self.nodelete: if root.startswith(dirname): leavealone = True break if leavealone: continue for file in files: dest = os.path.join(root, file) if dest not in self.currentfiles: if not self.dry_run: log.info("deleting %s" % dest) os.unlink(dest) else: log.info("skipping deleting %s" % dest) def run(self): destdir = self.destdir log.info("generating website to %s" % destdir) if not os.path.exists(destdir): log.info("creating %s" % destdir) os.makedirs(destdir) for name in self.templates_order: filename = self.templates[name] log.info("template %s loaded as %s" % (filename, name)) kid.load_template(filename, name=name) if self.eggdir: if not self.eggdir.endswith("/"): self.eggdir += "/" choplen = len(self.eggdir) self.eggs = [fn[choplen:] for fn in glob(self.eggdir + "*")] self.eggs.sort() self.currentfiles = set() self.serializer = kid.HTMLSerializer(encoding=self.encoding) for d in self.srcdirs: self.update_site_files(d) for dest, src in self.copydirs.items(): if os.path.isdir(src): self.update_site_files(src, processTemplates=False, destroot=os.path.join(self.destdir, dest)) else: destfile = os.path.join(self.destdir, os.path.normpath(dest)) self.copy_if_newer(src, destfile) self.currentfiles.add(destfile) self.printable_tutorial() self.delete_excess_files() def printable_tutorial(self): if self.noprintable: return self._make_printable(os.path.join("docs", "tutorials", "wiki20"), 3) self._make_printable(os.path.join("docs", "wiki20")) def _make_printable(self, tutdir, up_to_root=2): endpath = tutdir tutdir = os.path.join(self.srcdirs[0], tutdir) try: from xml.etree import cElementTree as ElementTree except ImportError: # Py < 2.5 try: import cElementTree as ElementTree except ImportError: # no C implementation try: from xml.etree import ElementTree except ImportError: # Py < 2.5 try: from elementtree import ElementTree except ImportError: raise ImportError, "ElementTree not installed." masterdoc = """ TurboGears: 20 Minute Wiki Tutorial """ docs = os.listdir(tutdir) docs.sort() for doc in docs: if not doc.endswith(".html"): continue log.info("combining %s" % doc) tree = ElementTree.parse(os.path.join(tutdir, doc)) body = tree.find("{http://www.w3.org/1999/xhtml}body") map(body.remove, body.findall("{http://www.w3.org/1999/xhtml}script")) bodytext = ElementTree.tostring(body) bodytext = bodytext.replace("", "") bodytext = bodytext.replace('', "") masterdoc += bodytext masterdoc += """ """ masterdoc = masterdoc.replace("html:", "") template = kid.Template(source=masterdoc, root="../" * up_to_root) template.serializer = self.serializer destend = os.path.join(self.destdir, endpath) if not os.path.exists(destend): os.makedirs(destend) outfn = os.path.join(destend, "printable.html") print "combined output: %s" % outfn outfile = open(outfn, "w") masterdoc = template.serialize(encoding=self.encoding) masterdoc = masterdoc.replace("$${", "${") outfile.write(masterdoc) outfile.close() self.currentfiles.add(outfn) PK>Z=4=4turbogears/docgen.pyc; PMc@s{dkZdkZdklZdklZdkZeiddkZdkZdk l Z defdYZ dS(N(sglob(sCommands Kid >= 0.6.4(slogsGenSitec BsRtZdZdddfdddfddd fd d d fd ddfdddfdddfdddfdddfdddfdd d!fg Zd gZeZd"Zd#Ze Z eZ eZ eZ eZeZd$Ze Zd%Zd&Ze d'Zd(Zd)Zd*Zeed+Zd,Zd-Zd.Zd/d0ZRS(1s5setuptools command to generate the TurboGears websitessrcdirs=sss7directories containing the source files (default: docs)sdestdir=sds1destination output directory (default: dist/site)s encoding=ses#encoding for output (default: utf8)sforcesfsregenerate all filess ignoredirs=sis1directories to ignore (default: ['.svn', '.cvs'])s ignorefiles=sxs3files to ignore (default: ['.*\.pyc', '.DS_Store'])s nodelete=sls-directories to leave alone rather than deletes templates=stsJmapping of templates to load (format: name=templatefile,name=templatefile)s copydirs=scsMcopy files from these directories without template proc. (destdir=srcdir,...)s noprintablesNs)don't make printable version of tutorialsseggdir=sgsBwhich directory has the eggs in it (default: '../thirdparty/eggs')s dist/sitesutf8s../thirdparty/eggscCsdS(N((sself((s*build\bdist.win32\egg\turbogears\docgen.pysinitialize_options+scCsj|itjodg|_n|idjo g|_n|id|idd|idd|itjodd g|_n|id |itjod d g|_n|itjod g|_n|id|idg}x'|iD]}|i t i |qW||_ |i|it\|_|_|i|i|_dS(Nsdocssssrcdirssdestdirs dist/sitesencodingsutf8s.svns.cvss ignoredirss.*\.pycs .DS_Storesdist/site/previewsnodeletes ignorefiles(sselfssrcdirssNonesensure_string_lists ensure_strings ignoredirss ignorefilessnodeletesregexesspatsappendsrescompilesignorepatternss_split_mappings templatessTruestemplates_orderscopydirs(sselfspatsregexes((s*build\bdist.win32\egg\turbogears\docgen.pysfinalize_options.s.       !c Csh}g}|o t|tobtid|}xM|D]A}tid|\}}t i i |||<|i|q<Wn|o||fSn|SdS(Ns,\s*s\s*=\s*(smappingsorders valToSplits isinstances basestringsressplitspairsspairsnamesfilenamesosspathsabspathsappendspreserve_order( sselfs valToSplitspreserve_ordersnamesmappingsfilenamespairspairssorder((s*build\bdist.win32\egg\turbogears\docgen.pys_split_mappingHscCsOtii|}tii|otii|}nd}||jSdS(Ni(sosspathsgetmtimessrcssrcmtimesexistssdests destmtime(sselfssrcsdestssrcmtimes destmtime((s*build\bdist.win32\egg\turbogears\docgen.pyscheck_if_newerUs cCsl|ip|i||oKtii|}tii | oti |n|i ||ndS(N( sselfsforcescheck_if_newerssrcsdestsosspathsdirnamesdsexistssmakedirss copy_file(sselfssrcsdestsd((s*build\bdist.win32\egg\turbogears\docgen.pys copy_if_newer]s c Cs4|i o|i|| odSn|i otid|ntid|dSti |dt }|i |i _ d|}|t|id}tidtitii|}|id|id|d |d |d |i}|id d }t|d}|i ||i!dS(Ns rendering %ssskipping rendering %sscaches../is %b %d, %Ysencodingsrootsupdatedsdestfileseggss$$s$sw("sselfsforcescheck_if_newerssrcsdestsdry_runslogsinfoskids load_templatesFalsestemplates serializersTemplatesdepthstorootslensdestdirsdestfilestimesstrftimes localtimesosspathsgetmtimesupdateds serializesencodingseggssoutputsreplacesopenswritesclose( sselfssrcsdestsdepthsupdatedsdestfilestemplatesoutputstoroot((s*build\bdist.win32\egg\turbogears\docgen.pysrender_templateds"  ' cCsQ| o |i}nx5ti|D]$\}} }||joV|t |d}|i ti }t|i|ioq%nt |}n d}d}tii||}tii| oB|i o"tid|ti|qtid|nx8|D]0}t}tii|} x,|iD]!}|i |o t!}Pq=q=W|oqnx/|i"i#D]} | | jo t!}PqqW|oqntii%|d} tii||} |i(i)| | p | djo#|i+tii||| q|i,tii||| |qWq%WdS(Nisiscreating directory %ssskipping creating directory %ss.html(-sdestrootsselfsdestdirsosswalkssrcdirsrootsdirssfilesslensfromrootssplitssepssegmentsssets intersections ignoredirssdepthspathsjoinsexistssdry_runslogsinfosmakedirssfilesFalsesignoresabspathsabssignorepatternsspatsmatchsTrues templatessvaluesstempfilessplitextsextsdests currentfilessaddsprocessTemplatess copy_if_newersrender_template(sselfssrcdirsprocessTemplatessdestrootsfilessdestdirsfromrootsfilespatstempfilesextsabssdirssdestsrootsignoresdepthssegments((s*build\bdist.win32\egg\turbogears\docgen.pysupdate_site_filesysX        cCsxti|iD]\}}}t}x,|i D]!}|i |o t }Pq2q2W|oqnxu|D]m}tii||}||ijoB|i o"tid|ti|qtid|qlqlWqWdS(Ns deleting %ssskipping deleting %s(sosswalksselfsdestdirsrootsdirssfilessFalses leavealonesnodeletesdirnames startswithsTruesfilespathsjoinsdests currentfilessdry_runslogsinfosunlink(sselfsdirssfilessdests leavealonesfilesdirnamesroot((s*build\bdist.win32\egg\turbogears\docgen.pysdelete_excess_filess$   c Cs*|i}tid|tii| o"tid|ti|nxH|iD]=} |i | }tid|| ft i |d| qZW|io|iid o|id7_nt|i}gi}t|idD]} || |q~|_|iint|_t id|i|_x|iD]}|i|qUWx|i i!D]\}}tii$|o/|i|dt%d tii&|i|q|tii&|itii'|}|i)|||ii*|q|W|i+|i,dS( Nsgenerating website to %ss creating %sstemplate %s loaded as %ssnames/s*sencodingsprocessTemplatessdestroot(-sselfsdestdirslogsinfososspathsexistssmakedirsstemplates_ordersnames templatessfilenameskids load_templateseggdirsendswithslenschoplensappends_[1]sglobsfnseggsssortssets currentfilessHTMLSerializersencodings serializerssrcdirssdsupdate_site_filesscopydirssitemssdestssrcsisdirsFalsesjoinsnormpathsdestfiles copy_if_newersaddsprintable_tutorialsdelete_excess_files( sselfssrcsdestsdestdirsfilenames_[1]sdsdestfileschoplensfnsname((s*build\bdist.win32\egg\turbogears\docgen.pysruns>    ;    $ cCsT|iodSn|itiidddd|itiidddS(Nsdocss tutorialsswiki20i(sselfs noprintables_make_printablesosspathsjoin(sself((s*build\bdist.win32\egg\turbogears\docgen.pysprintable_tutorials "icCs|} tii|id|}ydkl} Wnt j oy dk} Wqt j o^ydkl } Wqt j o7ydk l } Wqt j ot dqXqXqXnXd}ti |}|ix|D]} | id oqntid| | itii|| }|id}t|i|id | i|} | id d } | id d } || 7}qW|d 7}|idd }tid|dd|} |i"| _"tii|i#| }tii%| oti&|ntii|d}d|GHt(|d}| i*d|i+}|idd}|i,||i-|i.i/|dS(Ni(s cElementTree(s ElementTreesElementTree not installed.sz TurboGears: 20 Minute Wiki Tutorial s.htmls combining %ss"{http://www.w3.org/1999/xhtml}bodys${http://www.w3.org/1999/xhtml}scripts ss5s shtml:ssourcesroots../sprintable.htmlscombined output: %sswsencodings$${s${(0stutdirsendpathsosspathsjoinsselfssrcdirss xml.etrees cElementTrees ElementTrees ImportErrors elementtrees masterdocslistdirsdocsssortsdocsendswithslogsinfosparsestreesfindsbodysmapsremovesfindallstostringsbodytextsreplaceskidsTemplates up_to_rootstemplates serializersdestdirsdestendsexistssmakedirssoutfnsopensoutfiles serializesencodingswritescloses currentfilessadd(sselfstutdirs up_to_rootsbodys masterdocsdestendsdocsstreesoutfilesbodytextsendpathstemplatesdocs ElementTreesoutfn((s*build\bdist.win32\egg\turbogears\docgen.pys_make_printablesZ        (s__name__s __module__s__doc__s user_optionssboolean_optionssNonessrcdirssdestdirsencodingsFalsesforces ignoredirss ignorefilessnodeletes templatesscopydirsseggdirs noprintablesinitialize_optionssfinalize_optionss_split_mappingscheck_if_newers copy_if_newersrender_templatesTruesupdate_site_filessdelete_excess_filessrunsprintable_tutorials_make_printable(((s*build\bdist.win32\egg\turbogears\docgen.pysGenSite s2       0  % ( sosstimesglobs setuptoolssCommands pkg_resourcessrequireskidsres distutilsslogsGenSite( sGenSiteslogsglobs pkg_resourcessresCommandstimesosskid((s*build\bdist.win32\egg\turbogears\docgen.pys?s         PKzz>turbogears/errorhandling.pyimport sys from itertools import izip, islice from inspect import getargspec import cherrypy from dispatch import generic, NoApplicableMethods, strategy from turbogears.util import inject_args, adapt_call, call_on_stack, has_arg, \ remove_keys, Enum, combine_contexts from turbogears.decorator import func_eq from turbogears.genericfunctions import MultiorderGenericFunction default = strategy.default [generic(MultiorderGenericFunction)] def dispatch_error(controller, tg_source, tg_errors, tg_exceptions, *args, **kw): """Dispatch error. Error handler is a function registered via register_handler or if no such decorator was applied, the method triggering the error. """ [dispatch_error.when( "(tg_errors and has_arg(tg_source, 'tg_errors'))", order=3)] def _register_implicit_errh(controller, tg_source, tg_errors, tg_exceptions, *args, **kw): """Register implicitly declared error handler and re-dispatch. Any method declaring tg_errors parameter is considered an implicitly declared error handler. """ error_handler(tg_source)(tg_source) return dispatch_error(controller, tg_source, tg_errors, tg_exceptions, *args, **kw) [dispatch_error.when( "(tg_exceptions and has_arg(tg_source, 'tg_exceptions'))", order=3)] def _register_implicit_exch(controller, tg_source, tg_errors, tg_exceptions, *args, **kw): """Register implicitly declared exception handler and re-dispatch. Any method declaring tg_exceptions parameter is considered an implicitly declared exception handler. """ exception_handler(tg_source)(tg_source) return dispatch_error(controller, tg_source, tg_errors, tg_exceptions, *args, **kw) def dispatch_error_adaptor(func): """Construct a signature isomorphic to dispatch_error. The actual handler will receive only arguments explicitly declared, and a possible tg_format parameter. """ def adaptor(controller, tg_source, tg_errors, tg_exceptions, *args, **kw): tg_format = kw.pop('tg_format', None) args, kw = inject_args(func, {"tg_source": tg_source, "tg_errors": tg_errors, "tg_exceptions": tg_exceptions}, args, kw, 1) args, kw = adapt_call(func, args, kw, 1) if tg_format is not None: kw['tg_format'] = tg_format return func(controller, *args, **kw) return adaptor def try_call(func, self, *args, **kw): """Call function, catch and dispatch any resulting exception.""" # turbogears.database import here to avoid circular imports from turbogears.database import restart_transaction try: return func(self, *args, **kw) except Exception, e: if isinstance(e, cherrypy.HTTPRedirect) or \ call_on_stack("dispatch_error", {"tg_source": func, "tg_exception": e}, 4): raise else: exc_type, exc_value, exc_trace = sys.exc_info() remove_keys(kw, ("tg_source", "tg_errors", "tg_exceptions")) if 'tg_format' in cherrypy.request.params: kw['tg_format'] = 'json' if getattr(cherrypy.request, "in_transaction", None): restart_transaction(1) try: output = dispatch_error(self, func, None, e, *args, **kw) except NoApplicableMethods: raise exc_type, exc_value, exc_trace else: del exc_trace return output def run_with_errors(errors, func, self, *args, **kw): """Branch execution depending on presence of errors.""" if errors: if hasattr(self, "validation_error"): import warnings warnings.warn( "Use decorator error_handler() on per-method base " "rather than defining a validation_error() method.", DeprecationWarning, 2) return self.validation_error(func.__name__, kw, errors) else: remove_keys(kw, ("tg_source", "tg_errors", "tg_exceptions")) if 'tg_format' in cherrypy.request.params: kw['tg_format'] = 'json' try: return dispatch_error(self, func, errors, None, *args, **kw) except NoApplicableMethods: raise NotImplementedError("Method %s.%s() has no applicable " "error handler." % (self.__class__.__name__, func.__name__)) else: return func(self, *args, **kw) def register_handler(handler=None, rules=None): """Register handler as an error handler for decorated method. If handler is not given, method is considered it's own error handler. rules can be a string containing an arbitrary logical Python expression to be used as dispatch rule allowing multiple error handlers for a single method. register_handler decorator is an invariant. """ def register(func): when = "func_eq(tg_source, func)" if rules: when += " and (%s)" % rules dispatch_error.when(dispatch_error.parse(when, *combine_contexts( depth=[0, 1])), order=1)(dispatch_error_adaptor(handler or func)) return func return register def bind_rules(pre_rules): """Prepend rules to error handler specialisation.""" def registrant(handler=None, rules=None): when = pre_rules if rules: when += " and (%s)" % rules return register_handler(handler, when) return registrant error_handler = bind_rules("tg_errors") exception_handler = bind_rules("tg_exceptions") FailsafeSchema = Enum("none", "values", "map_errors", "defaults") [generic()] def dispatch_failsafe(schema, values, errors, source, kw): """Dispatch fail-safe mechanism for failed inputs.""" [dispatch_failsafe.when(strategy.default)] def _failsafe_none(schema, values, errors, source, kw): """No fail-safe values.""" return kw [dispatch_failsafe.when( "schema is FailsafeSchema.values and isinstance(values, dict) and " "isinstance(errors, dict)")] def _failsafe_values_dict(schema, values, errors, source, kw): """Map erroneous inputs to values.""" for key in errors: if key in values: kw[key] = values[key] return kw [dispatch_failsafe.when( "schema is FailsafeSchema.values and isinstance(errors, dict)")] def _failsafe_values_atom(schema, values, errors, source, kw): """Map all erroneous inputs to a single value.""" for key in errors: kw[key] = values return kw [dispatch_failsafe.when( "schema is FailsafeSchema.map_errors and isinstance(errors, dict)")] def _failsafe_map_errors(schema, values, errors, source, kw): """Map erroneous inputs to corresponding exceptions.""" kw.update(errors) return kw [dispatch_failsafe.when( "schema is FailsafeSchema.defaults and isinstance(errors, dict)")] def _failsafe_defaults(schema, values, errors, source, kw): """Map erroneous inputs to method defaults.""" argnames, defaultvals = getargspec(source)[::3] defaults = dict(izip(islice(argnames, len(argnames) - len(defaultvals), None), defaultvals)) for key in errors: if key in defaults: kw[key] = defaults[key] return kw __all__ = ["dispatch_error", "dispatch_error_adaptor", "try_call", "run_with_errors", "default", "register_handler", "FailsafeSchema", "dispatch_failsafe", "error_handler", "exception_handler"] PK>S,,turbogears/errorhandling.pyc; PMc @sdkZdklZlZdklZdkZdklZl Z l Z dk l Z l Z lZlZlZlZlZdklZdklZe iZeegdZeidd d gd Zeid d d gd ZdZdZdZeedZ dZ!e!dZ"e!dZ#eddddZ$egdZ%e%ie igdZ&e%idgdZ'e%idgdZ(e%idgd Z)e%id!gd"Z*d#d$d%d&d'd(d)d*d+d,g Z+dS(-N(sizipsislice(s getargspec(sgenericsNoApplicableMethodssstrategy(s inject_argss adapt_calls call_on_stackshas_args remove_keyssEnumscombine_contexts(sfunc_eq(sMultiorderGenericFunctioncOsdS(sDispatch error. Error handler is a function registered via register_handler or if no such decorator was applied, the method triggering the error. N((s controllers tg_sources tg_errorss tg_exceptionssargsskw((s1build\bdist.win32\egg\turbogears\errorhandling.pysdispatch_errorss/(tg_errors and has_arg(tg_source, 'tg_errors'))sordericOs-t||t||||||SdS(sRegister implicitly declared error handler and re-dispatch. Any method declaring tg_errors parameter is considered an implicitly declared error handler. N(s error_handlers tg_sourcesdispatch_errors controllers tg_errorss tg_exceptionssargsskw(s controllers tg_sources tg_errorss tg_exceptionssargsskw((s1build\bdist.win32\egg\turbogears\errorhandling.pys_register_implicit_errhss7(tg_exceptions and has_arg(tg_source, 'tg_exceptions'))cOs-t||t||||||SdS(sRegister implicitly declared exception handler and re-dispatch. Any method declaring tg_exceptions parameter is considered an implicitly declared exception handler. N(sexception_handlers tg_sourcesdispatch_errors controllers tg_errorss tg_exceptionssargsskw(s controllers tg_sources tg_errorss tg_exceptionssargsskw((s1build\bdist.win32\egg\turbogears\errorhandling.pys_register_implicit_exch)scsd}|SdS(sConstruct a signature isomorphic to dispatch_error. The actual handler will receive only arguments explicitly declared, and a possible tg_format parameter. cs|idt}thd|<d|<d|<||d\}}t ||d\}}|tj o||dschema is FailsafeSchema.defaults and isinstance(errors, dict)c Cst|ddd\}}ttt|t|t|t|}x-|D]%}||jo||||,,turbogears/finddata.py# Note: you may want to copy this into your setup.py file verbatim, as # you can't import this from another package, when you don't know if # that package is installed yet. import os import sys from fnmatch import fnmatchcase from distutils.util import convert_path # Provided as an attribute, so you can append to these instead # of replicating them: standard_exclude = ('*.py', '*.pyc', '*~', '.*', '*.bak', '*.swp*') standard_exclude_directories = ('.*', 'CVS', '_darcs', './build', './dist', 'EGG-INFO', '*.egg-info') def find_package_data( where='.', package='', exclude=standard_exclude, exclude_directories=standard_exclude_directories, only_in_packages=True, show_ignored=False): """ Return a dictionary suitable for use in ``package_data`` in a distutils ``setup.py`` file. The dictionary looks like:: {'package': [files]} Where ``files`` is a list of all the files in that package that don't match anything in ``exclude``. If ``only_in_packages`` is true, then top-level directories that are not packages won't be included (but directories under packages will). Directories matching any pattern in ``exclude_directories`` will be ignored; by default directories with leading ``.``, ``CVS``, and ``_darcs`` will be ignored. If ``show_ignored`` is true, then all the files that aren't included in package data are shown on stderr (for debugging purposes). Note patterns use wildcards, or can be exact paths (including leading ``./``), and all searching is case-insensitive. """ out = {} stack = [(convert_path(where), '', package, only_in_packages)] while stack: where, prefix, package, only_in_packages = stack.pop(0) for name in os.listdir(where): fn = os.path.join(where, name) if os.path.isdir(fn): bad_name = False for pattern in exclude_directories: if (fnmatchcase(name, pattern) or fn.lower() == pattern.lower()): bad_name = True if show_ignored: print >> sys.stderr, ( "Directory %s ignored by pattern %s" % (fn, pattern)) break if bad_name: continue if os.path.isfile(os.path.join(fn, '__init__.py')): if not package: new_package = name else: new_package = package + '.' + name stack.append((fn, '', new_package, False)) else: stack.append((fn, prefix + name + '/', package, only_in_packages)) elif package or not only_in_packages: # is a file bad_name = False for pattern in exclude: if (fnmatchcase(name, pattern) or fn.lower() == pattern.lower()): bad_name = True if show_ignored: print >> sys.stderr, ( "File %s ignored by pattern %s" % (fn, pattern)) break if bad_name: continue out.setdefault(package, []).append(prefix+name) return out if __name__ == '__main__': import pprint pprint.pprint( find_package_data(show_ignored=True)) PK>[uUY Y turbogears/finddata.pyc; PMc@sdkZdkZdklZdklZddddddfZdd d d d d dfZddeeee dZ e djo#dk Z e i e dendS(N(s fnmatchcase(s convert_paths*.pys*.pycs*~s.*s*.baks*.swp*sCVSs_darcss./builds./distsEGG-INFOs *.egg-infos.sc Cs?h} t|d||fg} x| o | id\}} }}xti |D]}ti i ||} ti i| ot}xd|D]\} t|| p| i| ijo-t}|otid| | fIJnPqqW|oqVnti iti i | do=| o |}n|d|}| i| d|tfq.| i| | |d||fqV|p| ot}xd|D]\} t|| p| i| ijo-t}|otid| | fIJnPqqW|oqVn| i|gi| |qVqVWq$W| SdS( sj Return a dictionary suitable for use in ``package_data`` in a distutils ``setup.py`` file. The dictionary looks like:: {'package': [files]} Where ``files`` is a list of all the files in that package that don't match anything in ``exclude``. If ``only_in_packages`` is true, then top-level directories that are not packages won't be included (but directories under packages will). Directories matching any pattern in ``exclude_directories`` will be ignored; by default directories with leading ``.``, ``CVS``, and ``_darcs`` will be ignored. If ``show_ignored`` is true, then all the files that aren't included in package data are shown on stderr (for debugging purposes). Note patterns use wildcards, or can be exact paths (including leading ``./``), and all searching is case-insensitive. sis"Directory %s ignored by pattern %ss __init__.pys.s/sFile %s ignored by pattern %sN(souts convert_pathswherespackagesonly_in_packagessstackspopsprefixsosslistdirsnamespathsjoinsfnsisdirsFalsesbad_namesexclude_directoriesspatterns fnmatchcaseslowersTrues show_ignoredssyssstderrsisfiles new_packagesappendsexcludes setdefault(swherespackagesexcludesexclude_directoriessonly_in_packagess show_ignoredsnames new_packagesbad_namesprefixspatternsstacksfnsout((s,build\bdist.win32\egg\turbogears\finddata.pysfind_package_datasN) " %) *s__main__s show_ignored( sosssyssfnmatchs fnmatchcasesdistutils.utils convert_pathsstandard_excludesstandard_exclude_directoriessTruesFalsesfind_package_datas__name__spprint(s convert_paths fnmatchcasespprintssyssstandard_exclude_directoriessstandard_excludesfind_package_datasos((s,build\bdist.win32\egg\turbogears\finddata.pys?s    M  PKzz>}D turbogears/genericfunctions.pyimport sys from itertools import izip, repeat, chain as ichain from dispatch import strategy, functions class MultiorderGenericFunction(functions.GenericFunction): """Generic function allowing a priori method ordering.""" def __init__(self, func): functions.GenericFunction.__init__(self, func) self.order_when = [] self.order_around = [] def when(self, cond, order=0): if order not in self.order_when: self.order_when.append(order) self.order_when.sort() return self._decorate(cond, "primary%d" % order) def around(self, cond, order=0): if order not in self.order_around: self.order_around.append(order) self.order_around.sort() return self._decorate(cond, "around%d" % order) # Based on dispatch.functions.GenericFunction.combine def combine(self, cases): strict = [strategy.ordered_signatures,strategy.safe_methods] loose = [strategy.ordered_signatures,strategy.all_methods] primary_names = ['primary%d' % order for order in self.order_when] around_names = ['around%d' % order for order in self.order_around] cases = strategy.separate_qualifiers( cases, before = loose, after =loose, **dict(izip(ichain(primary_names, around_names), repeat(strict))) ) primary = strategy.method_chain(ichain( *[cases.get(primary, []) for primary in primary_names])) if cases.get('after') or cases.get('before'): befores = strategy.method_list(cases.get('before',[])) afters = strategy.method_list(list(cases.get('after',[]))[::-1]) def chain(*args,**kw): for tmp in befores(*args,**kw): pass # toss return values result = primary(*args,**kw) for tmp in afters(*args,**kw): pass # toss return values return result else: chain = primary if (self.order_around): chain = strategy.method_chain(ichain(*([cases.get(around, []) for around in around_names] + [[chain]]))) return chain def getter(var): """Create an accessor for given variable.""" frame = sys._getframe(1) return lambda: var in frame.f_locals and frame.f_locals[var] or \ frame.f_globals[var] __all__ = ["MultiorderGenericFunction", "getter", ] PK>\turbogears/genericfunctions.pyc; PMc@sgdkZdklZlZlZdklZlZdei fdYZ dZ ddgZ dS(N(sizipsrepeatschain(sstrategys functionssMultiorderGenericFunctioncBs8tZdZdZddZddZdZRS(s3Generic function allowing a priori method ordering.cCs)tii||g|_g|_dS(N(s functionssGenericFunctions__init__sselfsfuncs order_whens order_around(sselfsfunc((s4build\bdist.win32\egg\turbogears\genericfunctions.pys__init__ s icCsI||ijo!|ii||iin|i|d|SdS(Ns primary%d(sordersselfs order_whensappendssorts _decoratescond(sselfscondsorder((s4build\bdist.win32\egg\turbogears\genericfunctions.pyswhenscCsI||ijo!|ii||iin|i|d|SdS(Nsaround%d(sordersselfs order_aroundsappendssorts _decoratescond(sselfscondsorder((s4build\bdist.win32\egg\turbogears\genericfunctions.pysaroundsc stitig}titig}gi}|i D]} |d| q5~} gi}|i D]} |d| qc~}ti|d|d|ttt| |t|}titgi}| D]||igq~|idp |ido_ti|idgtit|idgdddd}n}|i oPtitgi}|D]}||i|gq~|gg}n|SdS(Ns primary%dsaround%dsbeforesaftericsKx||D]}qW||}x||D]}q9W|SdS(N(sbeforessargsskwstmpsprimarysresultsafters(sargsskwstmpsresult(sprimarysafterssbefores(s4build\bdist.win32\egg\turbogears\genericfunctions.pyschain2s(sstrategysordered_signaturess safe_methodssstricts all_methodssloosesappends_[1]sselfs order_whensorders primary_namess order_arounds around_namessseparate_qualifiersscasessdictsizipsichainsrepeats method_chainsprimarysgets method_listsbeforesslistsaftersschainsaround( sselfscasess around_namesschainsloosesprimarysarounds_[1]sstricts primary_namessafterssordersbefores((sprimarysafterssbeforess4build\bdist.win32\egg\turbogears\genericfunctions.pyscombines.. 3B . P(s__name__s __module__s__doc__s__init__swhensaroundscombine(((s4build\bdist.win32\egg\turbogears\genericfunctions.pysMultiorderGenericFunctions    cs tiddSdS(s&Create an accessor for given variable.ics)ijo ip iS(N(svarsframesf_localss f_globals((svarsframe(s4build\bdist.win32\egg\turbogears\genericfunctions.pysEsN(ssyss _getframesframe(svarsframe((svarsframes4build\bdist.win32\egg\turbogears\genericfunctions.pysgetterBssgetter( ssyss itertoolssizipsrepeatschainsichainsdispatchsstrategys functionssGenericFunctionsMultiorderGenericFunctionsgetters__all__( s functionssrepeats__all__sizipsstrategyssyssgettersichainsMultiorderGenericFunction((s4build\bdist.win32\egg\turbogears\genericfunctions.pys?s ; PKzz>xVxVturbogears/paginate.py import types from math import ceil import logging import warnings try: set except NameError: # Python 2.3 from sets import Set as set import cherrypy try: import sqlobject except ImportError: sqlobject = None try: import sqlalchemy except ImportError: sqlalchemy = None import turbogears from turbogears.controllers import redirect from turbogears.decorator import weak_signature_decorator from turbogears.view import variable_providers from formencode.variabledecode import variable_encode from turbogears.widgets import PaginateDataGrid from turbogears.util import add_tg_args log = logging.getLogger("turbogears.paginate") # lists of databases that lack support for OFFSET # this will need to be updated periodically as modules change _so_no_offset = 'mssql maxdb sybase'.split() _sa_no_offset = 'mssql maxdb access'.split() # this is a global that is set the first time paginate() is called _simulate_offset = None # these are helper classes for getting data that has no table column class attrwrapper: """Helper class for accessing objec attributes.""" def __init__(self, name): self.name = name def __call__(self, obj): for name in self.name.split('.'): obj = getattr(obj, name) return obj class itemwrapper: """Helper class for dicitionary access.""" def __init__(self, name): self.name = name def __call__(self, obj): return obj[self.name] def paginate(var_name, default_order='', default_reversed=None, limit=10, max_limit=0, allow_limit_override=None, max_pages=5, max_sort=1000, dynamic_limit=None): """The famous TurboGears paginate decorator. @param var_name: The variable name that the paginate decorator will try to control. This key must be present in the dictionnary returned from your controller in order for the paginate decorator to be able to handle it. @type var_name: string @param default_order: The column name(s) that will be used to orde pagination results. Due to the way pagination is implemented specifying a default_order will override any result ordering performed in the controller. @type default_order: string or a list of strings. Any string starting with "-" (minus sign) indicates a reverse order for that field/column. @param default_reversed: Deprecated, use default_order with minus sign. @type default_reversed: Boolean @param limit: The hard-coded limit that the paginate decorator will impose on the number of "var_name" to display at the same time. This value can be overridden by the use of the dynamic_limit keyword argument. @type limit: integer @param max_limit: The maximum number to which the imposed limit can be increased using the "var_name"_tgp_limit keyword argument in the URL. If this is set to 0, no dynamic change at all will be allowed; if it is set to None, any change will be allowed. @type max_limit: int @param allow_limit_override: Deprecated, use max_limit. @type allow_limit_override: Boolean @param max_pages: Used to generate the tg.paginate.pages variable. If the page count is larger than max_pages, tg.paginate.pages will only contain the page numbers surrounding the current page at a distance of max_pages/2. A zero value means that all pages will be shown, no matter how much. @type max_pages: integer @param max_sort: The maximum number of records that will be sorted in memory if the data cannot be sorted using SQL. If set to 0, sorting in memory will never be performed; if set to None, no limit will be imposed. @type max_sort: integer @param dynamic_limit: If specified, this parameter must be the name of a key present in the dictionary returned by your decorated controller. The value found for this key will be used as the limit for our pagination and will override the other settings, the hard-coded one declared in the decorator itself AND the URL parameter one. This enables the programmer to store a limit settings inside the application preferences and then let the user manage it. @type dynamic_limit: string """ if default_reversed is not None: warnings.warn("default_reversed is deprecated." " Use default_order='-field' to indicate" " default reversed order, or" " default_order=['field1', '-field2, 'field3']" " for multiple fields.", DeprecationWarning, 2) if allow_limit_override is not None: warnings.warn("allow_limit_override is deprecated." " Use max_limit to specify an upper bound for limit.", DeprecationWarning, 2) def entangle(func): get = turbogears.config.get def decorated(func, *args, **kw): def kwpop(name, default=None): return kw.pop(var_name + '_tgp_' + name, kw.pop('tg_paginate_' + name, default)) page = kwpop('no') if page is None: page = 1 elif page == 'last': page = None else: try: page = int(page) if page < 1: raise ValueError except (TypeError, ValueError): page = 1 if get('paginate.redirect_on_out_of_range'): cherrypy.request.params[var_name + '_tgp_no'] = page redirect(cherrypy.request.path_info, cherrypy.request.params) try: limit_ = int(kwpop('limit')) if max_limit is not None and not ( allow_limit_override and max_limit == 0): if max_limit <= 0: raise ValueError limit_ = min(limit_, max_limit) except (TypeError, ValueError): limit_ = limit order = kwpop('order') ordering = kwpop('ordering') log.debug("paginate params: page=%s, limit=%s, order=%s", page, limit_, order) # get the output from the decorated function output = func(*args, **kw) if not isinstance(output, dict): return output try: var_data = output[var_name] except KeyError: raise KeyError("paginate: var_name" " (%s) not found in output dict" % var_name) if not hasattr(var_data, '__getitem__') and callable(var_data): # e.g. SQLAlchemy query class var_data = var_data() if not hasattr(var_data, '__getitem__'): raise TypeError('Paginate variable is not a sequence') if dynamic_limit: try: dyn_limit = output[dynamic_limit] except KeyError: raise KeyError("paginate: dynamic_limit" " (%s) not found in output dict" % dynamic_limit) limit_ = dyn_limit if ordering: ordering = str(ordering).split(',') else: ordering = default_order or [] if isinstance(ordering, basestring): # adapt old style default_order to new style if default_reversed: ordering = "-" + ordering ordering = [ordering] elif default_reversed: raise ValueError("paginate: default_reversed (deprecated)" " only allowed when default_order is a basestring") if order: order = str(order) log.debug('paginate: ordering was %s, sort is %s', ordering, order) sort_ordering(ordering, order) log.debug('paginate: ordering is %s', ordering) try: row_count = len(var_data) except TypeError: try: # SQL query row_count = var_data.count() or 0 except AttributeError: # other iterator var_data = list(var_data) row_count = len(var_data) if ordering: var_data = sort_data(var_data, ordering, max_sort is None or 0 < row_count <= max_sort) # If limit is zero then return all our rows if not limit_: limit_ = row_count or 1 page_count = int(ceil(float(row_count)/limit_)) if page is None: page = max(page_count, 1) if get('paginate.redirect_on_last_page'): cherrypy.request.params[var_name + '_tgp_no'] = page redirect(cherrypy.request.path_info, cherrypy.request.params) elif page > page_count: page = max(page_count, 1) if get('paginate.redirect_on_out_of_range'): cherrypy.request.params[var_name + '_tgp_no'] = page redirect(cherrypy.request.path_info, cherrypy.request.params) offset = (page-1) * limit_ pages_to_show = _select_pages_to_show(page, page_count, max_pages) # remove pagination parameters from request input_values = variable_encode(cherrypy.request.params.copy()) input_values.pop('self', None) for input_key in input_values.keys(): if (input_key.startswith(var_name + '_tgp_') or input_key.startswith('tg_paginate_')): del input_values[input_key] paginate_instance = Paginate( current_page=page, limit=limit_, pages=pages_to_show, page_count=page_count, input_values=input_values, order=order, ordering=ordering, row_count=row_count, var_name=var_name) cherrypy.request.paginate = paginate_instance if not hasattr(cherrypy.request, 'paginates'): cherrypy.request.paginates = dict() cherrypy.request.paginates[var_name] = paginate_instance # we replace the var with the sliced one endpoint = offset + limit_ log.debug("paginate: slicing data between %d and %d", offset, endpoint) global _simulate_offset if _simulate_offset is None: _simulate_offset = get('paginate.simulate_offset', None) if _simulate_offset is None: _simulate_offset = False so_db = get('sqlobject.dburi', 'NOMATCH:').split(':', 1)[0] sa_db = get('sqlalchemy.dburi', 'NOMATCH:').split(':', 1)[0] if so_db in _so_no_offset or sa_db in _sa_no_offset: _simulate_offset = True log.warning("paginate: simulating OFFSET," " paginate may be slow" " (disable with paginate.simulate_offset=False)") if _simulate_offset: var_data = iter(var_data[:endpoint]) # skip over the number of records specified by offset for i in xrange(offset): var_data.next() # return the records that remain output[var_name] = list(var_data) else: try: output[var_name] = var_data[offset:endpoint] except TypeError: for i in xrange(offset): var_data.next() output[var_name] = [var_data.next() for i in xrange(offset, endpoint)] return output if not get('tg.strict_parameters', False): # add hint that paginate parameters shall be left intact args = set() for arg in 'no', 'limit', 'order', 'ordering': args.add(var_name + '_tgp_' + arg) args.add('tg_paginate_' + arg) add_tg_args(func, args) return decorated return weak_signature_decorator(entangle) def _paginate_var_provider(d): """Auxiliary function for providing the paginate variable.""" paginate = getattr(cherrypy.request, 'paginate', None) if paginate: d.update(dict(paginate=paginate)) paginates = getattr(cherrypy.request, 'paginates', None) if paginates: d.update(dict(paginates=paginates)) variable_providers.append(_paginate_var_provider) class Paginate: """Class for paginate variable provider.""" def __init__(self, current_page, pages, page_count, input_values, limit, order, ordering, row_count, var_name): self.var_name = var_name self.pages = pages self.limit = limit self.page_count = page_count self.current_page = current_page self.input_values = input_values self.order = order self.ordering = ordering self.row_count = row_count self.first_item = page_count and ((current_page - 1) * limit + 1) or 0 self.last_item = min(current_page * limit, row_count) self.reversed = ordering and ordering[0][0] == '-' # If ordering is empty, don't add it. input_values = {var_name + '_tgp_limit': limit} if ordering: input_values[var_name + '_tgp_ordering'] = ','.join(ordering) self.input_values.update(input_values) if current_page < page_count: self.input_values.update({ var_name + '_tgp_no': current_page + 1, var_name + '_tgp_limit': limit }) self.href_next = turbogears.url( cherrypy.request.path_info, self.input_values) self.input_values.update({ var_name + '_tgp_no': 'last', var_name + '_tgp_limit': limit }) self.href_last = turbogears.url( cherrypy.request.path_info, self.input_values) else: self.href_next = None self.href_last = None if current_page > 1: self.input_values.update({ var_name + '_tgp_no': current_page - 1, var_name + '_tgp_limit': limit }) self.href_prev = turbogears.url( cherrypy.request.path_info, self.input_values) self.input_values.update({ var_name + '_tgp_no': 1, var_name + '_tgp_limit': limit }) self.href_first = turbogears.url( cherrypy.request.path_info, self.input_values) else: self.href_prev = None self.href_first = None def get_href(self, page, order=None, reverse_order=None): # Note that reverse_order is not used. It should be cleaned up here # and in the template. I'm not removing it now because I don't want # to break the API. order = order or None input_values = self.input_values.copy() input_values[self.var_name + '_tgp_no'] = page if order: input_values[ self.var_name + '_tgp_order'] = order return turbogears.url('', input_values) def _select_pages_to_show(current_page, page_count, max_pages=None): """Auxiliary function for getting the range of pages to show.""" if max_pages is not None and max_pages > 0: start = current_page - (max_pages // 2) - (max_pages % 2) + 1 end = start + max_pages - 1 if start < 1: start, end = 1, min(page_count, max_pages) elif end > page_count: start, end = max(1, page_count - max_pages + 1), page_count else: start, end = 1, page_count return xrange(start, end + 1) # Auxiliary functions for dealing with columns and SQL def sort_ordering(ordering, sort_name): """Rearrange ordering based on sort_name.""" try: index = ordering.index(sort_name) except ValueError: try: index = ordering.index('-' + sort_name) except ValueError: ordering.insert(0, sort_name) else: del ordering[index] ordering.insert(0, (index and '-' or '') + sort_name) else: del ordering[index] ordering.insert(0, (not index and '-' or '') + sort_name) def sqlalchemy_get_column(colname, var_data): """Return a column from sqlalchemy var_data based on colname.""" try: mapper = var_data.mapper except AttributeError: # SQLAlchemy >= 0.5 try: mapper = var_data._mapper_zero() except AttributeError: # SQLAlchemy <= 0.4 and SelectResullts mapper = var_data._query.mapper propnames = colname.split('.') colname = propnames.pop() for propname in propnames: prop = mapper.get_property( propname, resolve_synonyms=True, raiseerr=False) if not prop: break mapper = prop.mapper if mapper.column_prefix: # for SQLAlchemy <= 0.4.0 we may need to remove the column_prefix return getattr(mapper.c, colname, getattr(mapper.c, colname[len(mapper.column_prefix):], None)) else: return getattr(mapper.c, colname, None) def sqlobject_get_column(colname, var_data): """Return a column from sqlobject var_data based on colname.""" return getattr(var_data.sourceClass.q, colname, None) def sql_get_column(colname, var_data): """Return a column from var_data based on colname.""" if sqlalchemy: try: return sqlalchemy_get_column(colname, var_data) except AttributeError: pass if sqlobject: try: return sqlobject_get_column(colname, var_data) except AttributeError: pass raise TypeError('Cannot find columns of paginate variable') def sqlalchemy_order_col(col, descending=False): """Return an sqlalchemy ordered column for col.""" if descending: return sqlalchemy.sql.desc(col) else: return sqlalchemy.sql.asc(col) def sqlobject_order_col(col, descending=False): """Return an sqlobject ordered column for col.""" if descending: return sqlobject.DESC(col) else: return col def sql_order_col(col, ascending=True): """Return an ordered column for col.""" if sqlalchemy and isinstance(col, sqlalchemy.sql.ColumnElement): return sqlalchemy_order_col(col, ascending) elif sqlobject and isinstance(col, types.InstanceType): # Sadly, there is no better way to check for sqlobject col type return sqlobject_order_col(col, ascending) raise TypeError("Expected Column, but got %s" % type(col)) def sort_data(data, ordering, in_memory=True): """Sort data based on ordering. Tries to sort the data using SQL whenever possible, otherwise sorts the data as list in memory unless in_memory is false. """ try: order_by = data.order_by # SQLAlchemy get_column, order_col = sqlalchemy_get_column, sqlalchemy_order_col except AttributeError: try: order_by = data.orderBy # SQLObject get_column, order_col = sqlobject_get_column, sqlobject_order_col except AttributeError: order_by = None order_cols = [] key_cols = [] num_ascending = num_descending = 0 for order in ordering: if order[0] == '-': order = order[1:] descending = True else: descending = False if order_by: col = get_column(order, data) if col is not None: order_cols.append(order_col(col, descending)) continue if not order_cols: key_cols.append((order, descending)) if descending: num_descending += 1 else: num_ascending += 1 if order_by and order_cols: data = order_by(order_cols) if key_cols: if in_memory: data = list(data) if not data: return data wrapper = isinstance(data[0], dict) and itemwrapper or attrwrapper keys = [(wrapper(col[0]), col[1]) for col in key_cols] if num_ascending == 0 or num_descending == 0: reverse = num_ascending == 0 keys = [key[0] for key in keys] if len(key_cols) == 1: key = keys[0] else: key = lambda row: [key(row) for key in keys] else: reverse = num_descending > num_ascending def reverse_key(key, descending): if reverse == descending: return key else: keys = map(key, data) try: keys = list(set(keys)) except TypeError: # unhashable keys.sort() return lambda row: -keys.index(key(row)) else: keys.sort() keys = dict([(k, -n) for n, k in enumerate(keys)]) return lambda row: keys[key(row)] keys = [reverse_key(*key) for key in keys] key = lambda row: [key(row) for key in keys] try: data.sort(key=key, reverse=reverse) except TypeError: # Python 2.3 if reverse: cmpkey = lambda row1, row2: cmp(key(row2), key(row1)) else: cmpkey = lambda row1, row2: cmp(key(row1), key(row2)) data.sort(cmpkey) else: log.debug("paginate: sorting in memory not allowed") return data PK>&UHZHZturbogears/paginate.pyc; PMc @sdkZdklZdkZdkZyeWn ej odklZnXdk Z y dk Z Wne j o e Z nXy dk Z Wne j o e Z nXdkZdklZdklZdklZdklZdklZdklZeid Zd iZd iZe a d fd YZ!dfdYZ"de dde dde dZ#dZ$ei%e$dfdYZ&e dZ'dZ(dZ)dZ*dZ+e,dZ-e,dZ.e/d Z0e/d!Z1dS("N(sceil(sSet(sredirect(sweak_signature_decorator(svariable_providers(svariable_encode(sPaginateDataGrid(s add_tg_argssturbogears.paginatesmssql maxdb sybasesmssql maxdb accesss attrwrappercBs tZdZdZdZRS(s,Helper class for accessing objec attributes.cCs ||_dS(N(snamesself(sselfsname((s,build\bdist.win32\egg\turbogears\paginate.pys__init__-scCs4x)|iidD]}t||}qW|SdS(Ns.(sselfsnamessplitsgetattrsobj(sselfsobjsname((s,build\bdist.win32\egg\turbogears\paginate.pys__call__/s(s__name__s __module__s__doc__s__init__s__call__(((s,build\bdist.win32\egg\turbogears\paginate.pys attrwrapper+s  s itemwrappercBs tZdZdZdZRS(s$Helper class for dicitionary access.cCs ||_dS(N(snamesself(sselfsname((s,build\bdist.win32\egg\turbogears\paginate.pys__init__6scCs||iSdS(N(sobjsselfsname(sselfsobj((s,build\bdist.win32\egg\turbogears\paginate.pys__call__8s(s__name__s __module__s__doc__s__init__s__call__(((s,build\bdist.win32\egg\turbogears\paginate.pys itemwrapper4s  si iiic sztj otidtdntj otidtdnd} t| SdS(s The famous TurboGears paginate decorator. @param var_name: The variable name that the paginate decorator will try to control. This key must be present in the dictionnary returned from your controller in order for the paginate decorator to be able to handle it. @type var_name: string @param default_order: The column name(s) that will be used to orde pagination results. Due to the way pagination is implemented specifying a default_order will override any result ordering performed in the controller. @type default_order: string or a list of strings. Any string starting with "-" (minus sign) indicates a reverse order for that field/column. @param default_reversed: Deprecated, use default_order with minus sign. @type default_reversed: Boolean @param limit: The hard-coded limit that the paginate decorator will impose on the number of "var_name" to display at the same time. This value can be overridden by the use of the dynamic_limit keyword argument. @type limit: integer @param max_limit: The maximum number to which the imposed limit can be increased using the "var_name"_tgp_limit keyword argument in the URL. If this is set to 0, no dynamic change at all will be allowed; if it is set to None, any change will be allowed. @type max_limit: int @param allow_limit_override: Deprecated, use max_limit. @type allow_limit_override: Boolean @param max_pages: Used to generate the tg.paginate.pages variable. If the page count is larger than max_pages, tg.paginate.pages will only contain the page numbers surrounding the current page at a distance of max_pages/2. A zero value means that all pages will be shown, no matter how much. @type max_pages: integer @param max_sort: The maximum number of records that will be sorted in memory if the data cannot be sorted using SQL. If set to 0, sorting in memory will never be performed; if set to None, no limit will be imposed. @type max_sort: integer @param dynamic_limit: If specified, this parameter must be the name of a key present in the dictionary returned by your decorated controller. The value found for this key will be used as the limit for our pagination and will override the other settings, the hard-coded one declared in the decorator itself AND the URL parameter one. This enables the programmer to store a limit settings inside the application preferences and then let the user manage it. @type dynamic_limit: string sdefault_reversed is deprecated. Use default_order='-field' to indicate default reversed order, or default_order=['field1', '-field2, 'field3'] for multiple fields.isVallow_limit_override is deprecated. Use max_limit to specify an upper bound for limit.cstii d}dt o]t}x@ddddfD],}|id||id|q`Wt ||n|SdS( Ncsytd} | d}|tjo d}n|djo t}ny't|}|djo tnWn]ttfj oKd}do1|tii dy| }Wn#tj otd nX|}n|ot"|i#d}nW pg}t|t%o"od|}n|g}notdn|o0t"|}tid||t'||ntid|yt(| } WnXtj oLy| i*pd} Wqt+j ot,| } t(| } qXnX|o:t-| |tjpd| jo jn} n| o| pd}ntt/t0| |}|tjoQt2|d}do1|tii dd|d|d| d|d|d |d |d| d } | ti_@ttid otti_An| tiiA<||}tid ||tCtjod!taCtCtjoytDaCd"d#i#d$dd}d%d#i#d$dd}|tGjp |tHjotIaCtiJd&qqntCoEtK| | } xtL|D]}| iNqWt,| |$scs|joSntyttWn*tj oi dSnYXi t gi }t D]\}}||| fq~dSdS(Ncsi| S(N(skeyssindexskeysrow(srow(skeysskey(s,build\bdist.win32\egg\turbogears\paginate.pys0scs|S(N(skeysskeysrow(srow(skeysskey(s,build\bdist.win32\egg\turbogears\paginate.pys4s(sreverses descendingskeysmapsdataskeysslistssets TypeErrorssortsdictsappends_[1]s enumeratesnsk(skeys descendingskeyssksns_[1](sreversesdata(skeyskeyss,build\bdist.win32\egg\turbogears\paginate.pys reverse_key's   @skeysreversecst||S(N(scmpskeysrow2srow1(srow1srow2(skey(s,build\bdist.win32\egg\turbogears\paginate.pys;scst||S(N(scmpskeysrow1srow2(srow1srow2(skey(s,build\bdist.win32\egg\turbogears\paginate.pys=ss'paginate: sorting in memory not allowedN((sdatasorder_byssqlalchemy_get_columnssqlalchemy_order_cols get_columns order_colsAttributeErrorsorderByssqlobject_get_columnssqlobject_order_colsNones order_colsskey_colss num_ascendingsnum_descendingsorderingsordersTrues descendingsFalsescolsappends in_memoryslists isinstancesdicts itemwrappers attrwrapperswrappers_[1]skeyssreverseskeyslens reverse_keyssorts TypeErrorscmpkeyslogsdebug(sdatasorderings in_memoryscmpkeys get_columnsorder_bys order_colsswrapperskeyss order_cols descendingskeys reverse_keyskey_colssreversesorders_[1]scols num_ascendingsnum_descending((sdataskeyssreverseskeys,build\bdist.win32\egg\turbogears\paginate.pys sort_datasr        !; + -  (2stypessmathsceilsloggingswarningsssets NameErrorssetssSetscherrypys sqlobjects ImportErrorsNones sqlalchemys turbogearssturbogears.controllerssredirectsturbogears.decoratorsweak_signature_decoratorsturbogears.viewsvariable_providerssformencode.variabledecodesvariable_encodesturbogears.widgetssPaginateDataGridsturbogears.utils add_tg_argss getLoggerslogssplits _so_no_offsets _sa_no_offsets_simulate_offsets attrwrappers itemwrapperspaginates_paginate_var_providersappendsPaginates_select_pages_to_shows sort_orderingssqlalchemy_get_columnssqlobject_get_columnssql_get_columnsFalsessqlalchemy_order_colssqlobject_order_colsTrues sql_order_cols sort_data( ssets turbogearsspaginates_paginate_var_providerssqlobject_order_colssqlalchemy_get_columnsredirectscherrypys sort_datasPaginateDataGrids sort_orderings _sa_no_offsets sqlalchemyswarningssceilssql_get_columnssqlobject_get_columns itemwrappers_select_pages_to_showstypesslogs sqlobjectsweak_signature_decoratorsloggingsvariable_providersssqlalchemy_order_cols sql_order_colsvariable_encodesPaginates add_tg_argss _so_no_offsets attrwrapper((s,build\bdist.win32\egg\turbogears\paginate.pys?sV                   !  H        PK|>S((turbogears/release.py"""\ Front-to-back rapid web development =================================== TurboGears brings together four major pieces to create an easy to install, easy to use web mega-framework. It covers everything from front end (MochiKit JavaScript for the browser, Genshi / Kid / Mako / Cheetah for templates in Python) to the controllers (CherryPy) to the back end (SQLAlchemy or SQLObject). The TurboGears project is focused on providing documentation and integration with these tools without losing touch with the communities that already exist around those tools. TurboGears is easy to use for a wide range of web applications. The latest development version is available in the `TurboGears subversion repository`_. Our `mailing list`_ is lively and helpful, don't hesitate to send your questions there, we will try to help you find out a solution to your problem. .. _mailing list: http://groups.google.com/group/turbogears .. _TurboGears subversion repository: http://svn.turbogears.org/trunk#egg=turbogears-dev """ version = "1.0.10" description = "Front-to-back, open-source, rapid web development framework" long_description = __doc__ author = "Kevin Dangoor" email = "dangoor+turbogears@gmail.com" maintainer = "TurboGears Release Team" maintainer_email = "turbogears@googlegroups.com" url = "http://www.turbogears.org/" download_url = "http://www.turbogears.org/%s/downloads/%s/index" % ( '.'.join(version.split('.', 2)[:2]), version) dependency_links = [download_url] copyright = "Copyright 2005 - 2011 Kevin Dangoor and contributors" license = "MIT" PK>.Zturbogears/release.pyc; Mc@sxdZdZdZeZdZdZdZdZdZdd i ei d d d efZ e gZ d Z d Zd S(sFront-to-back rapid web development =================================== TurboGears brings together four major pieces to create an easy to install, easy to use web mega-framework. It covers everything from front end (MochiKit JavaScript for the browser, Genshi / Kid / Mako / Cheetah for templates in Python) to the controllers (CherryPy) to the back end (SQLAlchemy or SQLObject). The TurboGears project is focused on providing documentation and integration with these tools without losing touch with the communities that already exist around those tools. TurboGears is easy to use for a wide range of web applications. The latest development version is available in the `TurboGears subversion repository`_. Our `mailing list`_ is lively and helpful, don't hesitate to send your questions there, we will try to help you find out a solution to your problem. .. _mailing list: http://groups.google.com/group/turbogears .. _TurboGears subversion repository: http://svn.turbogears.org/trunk#egg=turbogears-dev s1.0.10s;Front-to-back, open-source, rapid web development frameworks Kevin Dangoorsdangoor+turbogears@gmail.comsTurboGears Release Teamsturbogears@googlegroups.comshttp://www.turbogears.org/s/http://www.turbogears.org/%s/downloads/%s/indexs.is4Copyright 2005 - 2011 Kevin Dangoor and contributorssMITN(s__doc__sversions descriptionslong_descriptionsauthorsemails maintainersmaintainer_emailsurlsjoinssplits download_urlsdependency_linkss copyrightslicense( sdependency_linksslicenses maintainers descriptions copyrightsauthorsurlslong_descriptions download_urlsversionsmaintainer_emailsemail((s+build\bdist.win32\egg\turbogears\release.pys?s) PKzz>_uyYFYFturbogears/scheduler.py"""Module that provides a cron-like task scheduler. This task scheduler is designed to be used from inside your own program. You can schedule Python functions to be called at specific intervals or days. It uses the standard 'sched' module for the actual task scheduling, but provides much more: - repeated tasks (at intervals, or on specific days) - error handling (exceptions in tasks don't kill the scheduler) - optional to run scheduler in its own thread or separate process - optional to run a task in its own thread or separate process If the threading module is available, you can use the various Threaded variants of the scheduler and associated tasks. If threading is not available, you could still use the forked variants. If fork is also not available, all processing is done in a single process, sequentially. There are three Scheduler classes: Scheduler ThreadedScheduler ForkedScheduler You usually add new tasks to a scheduler using the add_interval_task or add_daytime_task methods, with the appropriate processmethod argument to select sequential, threaded or forked processing. NOTE: it is impossible to add new tasks to a ForkedScheduler, after the scheduler has been started! For more control you could use one of the following Task classes and use schedule_task or schedule_task_abs: IntervalTask ThreadedIntervalTask ForkedIntervalTask WeekdayTask ThreadedWeekdayTask ForkedWeekdayTask MonthdayTask ThreadedMonthdayTask ForkedMonthdayTask Kronos is the Greek God of Time. This module is based on Kronos by Irmen de Jong, but has been modified to better fit within TurboGears. Additionally, this module appeared to no longer be supported/in development. """ # # $Id: kronos.py,v 1.5 2004/10/06 22:43:49 irmen Exp $ # # (c) Irmen de Jong. # This is open-source software, released under the MIT Software License: # http://www.opensource.org/licenses/mit-license.php # import os, sys import sched, time import traceback import weakref from turbogears.util import Enum method = Enum("sequential", "forked", "threaded") class Scheduler: """The Scheduler itself.""" def __init__(self): self.running = True self.sched = sched.scheduler(time.time, self.__delayfunc) def __delayfunc(self, delay): # This delay function is basically a time.sleep() that is # divided up, so that we can check the self.running flag while delaying. # there is an additional check in here to ensure that the top item of # the queue hasn't changed if delay < 10: time.sleep(delay) else: toptime = self.sched.queue[0][0] endtime = time.time() + delay period = 5 stoptime = endtime - period while self.running and stoptime > time.time() and \ self.sched.queue[0][0] == toptime: time.sleep(period) if not self.running or self.sched.queue[0][0] != toptime: return now = time.time() if endtime > now: time.sleep(endtime - now) def _acquire_lock(self): pass def _release_lock(self): pass def add_interval_task(self, action, taskname, initialdelay, interval, processmethod, args, kw): """Add a new Interval Task to the schedule. A very short initialdelay or one of zero cannot be honored, you will see a slight delay before the task is first executed. This is because the scheduler needs to pick it up in its loop.""" if initialdelay < 0 or interval < 1: raise ValueError("delay or interval must be >0") # Select the correct IntervalTask class. Not all types may be available! if processmethod == method.sequential: TaskClass=IntervalTask elif processmethod == method.threaded: TaskClass = ThreadedIntervalTask elif processmethod == method.forked: TaskClass = ForkedIntervalTask else: raise ValueError("invalid processmethod") if not args: args = [] if not kw: kw = {} task = TaskClass(taskname, interval, action, args, kw) self.schedule_task(task, initialdelay) return task def add_daytime_task(self, action, taskname, weekdays, monthdays, timeonday, processmethod, args, kw): """Add a new Day Task (Weekday or Monthday) to the schedule.""" if weekdays and monthdays: raise ValueError("you can only specify weekdays or monthdays, not both") if not args: args = [] if not kw: kw = {} if weekdays: # Select the correct WeekdayTask class. Not all types may be available! if processmethod == method.sequential: TaskClass = WeekdayTask elif processmethod == method.threaded: TaskClass = ThreadedWeekdayTask elif processmethod == method.forked: TaskClass = ForkedWeekdayTask else: raise ValueError("invalid processmethod") task = TaskClass(taskname, weekdays, timeonday, action, args, kw) if monthdays: # Select the correct MonthdayTask class. Not all types may be available! if processmethod == method.sequential: TaskClass = MonthdayTask elif processmethod == method.threaded: TaskClass = ThreadedMonthdayTask elif processmethod == method.forked: TaskClass = ForkedMonthdayTask else: raise ValueError("invalid processmethod") task = TaskClass(taskname, monthdays, timeonday, action, args, kw) firsttime = task.get_schedule_time(True) self.schedule_task_abs(task, firsttime) return task def schedule_task(self, task, delay): """Low-level method to add a new task to the scheduler with the given delay (seconds).""" if self.running: self._acquire_lock() # lock the sched queue, if needed try: task.event = self.sched.enter(delay, 0, task, (weakref.ref(self),) ) finally: self._release_lock() else: task.event = self.sched.enter(delay, 0, task, (weakref.ref(self),) ) def schedule_task_abs(self, task, abstime): """Low-level method to add a new task to the scheduler for the given absolute time value.""" if self.running: self._acquire_lock() # lock the sched queue, if needed try: task.event = self.sched.enterabs(abstime, 0, task, (weakref.ref(self),) ) finally: self._release_lock() else: task.event = self.sched.enterabs(abstime, 0, task, (weakref.ref(self),) ) def start(self): """Start the scheduler.""" self._run() def stop(self): """Remove all pending tasks and stop the Scheduler.""" self.running = False self.sched.queue[:] = [] def cancel(self, task): self.sched.cancel(task.event) def _run(self): # Low-level run method to do the actual scheduling loop. while self.running: try: self.sched.run() except Exception, e: print >> sys.stderr, "ERROR DURING SCHEDULER EXECUTION", e print >> sys.stderr, "".join(traceback.format_exception(*sys.exc_info())) print >> sys.stderr, "-"*20 # queue is empty; sleep a short while before checking again if self.running: time.sleep(5) class Task: """Abstract base class of all scheduler tasks""" def __init__(self, name, action, args, kw): """This is an abstract class!""" self.name = name self.action = action self.args = args self.kw = kw def __call__(self, schedulerref): """Execute the task action in the scheduler's thread.""" try: self.execute() except Exception, e: self.handle_exception(e) self.reschedule(schedulerref()) def reschedule(self, scheduler): """This is an abstract class, this method is defined in one of the sub classes!""" raise NotImplementedError("you're using the abstract base class 'Task', use a concrete class instead") def execute(self): """Execute the actual task.""" self.action(*self.args, **self.kw) def handle_exception(self, exc): """Handle any exception that occured during task execution.""" print >> sys.stderr, "ERROR DURING TASK EXECUTION", exc print >> sys.stderr, "".join(traceback.format_exception(*sys.exc_info())) print >> sys.stderr, "-"*20 class IntervalTask(Task): """A repeated task that occurs at certain intervals (in seconds).""" def __init__(self, name, interval, action, args=None, kw=None): Task.__init__(self, name, action, args, kw) self.interval = interval def reschedule(self, scheduler): # reschedule this task according to its interval (in seconds). if scheduler.running: scheduler.schedule_task(self, self.interval) class DayTaskRescheduler: """A mixin class that contains the reschedule logic for the DayTasks.""" def __init__(self, timeonday): self.timeonday = timeonday def get_schedule_time(self, today): """Calculate the time value at which this task is to be scheduled.""" now = list(time.localtime()) if today: # schedule for today. let's see if that is still possible if (now[3], now[4]) >= self.timeonday: now[2] += 1 # too bad, it will be tomorrow else: now[2] += 1 # tomorrow now[3], now[4] = self.timeonday # set new time on day (hour,minute) now[5] = 0 # seconds return time.mktime(now) def reschedule(self, scheduler): # Reschedule this task according to the daytime for the task. # The task is scheduled for tomorrow, for the given daytime. # (The execute method in the concrete Task classes will check # if the current day is a day on which the task must run). if scheduler.running: abstime = self.get_schedule_time(False) scheduler.schedule_task_abs(self, abstime) class WeekdayTask(DayTaskRescheduler, Task): """A task that is called at specific days in a week (1-7), at a fixed time on the day.""" def __init__(self, name, weekdays, timeonday, action, args=None, kw=None): if type(timeonday) not in (list, tuple) or len(timeonday) != 2: raise TypeError("timeonday must be a 2-tuple (hour,minute)") if type(weekdays) not in (list, tuple): raise TypeError("weekdays must be a sequence of weekday numbers 1-7 (1 is Monday)") DayTaskRescheduler.__init__(self, timeonday) Task.__init__(self, name, action, args, kw) self.days = weekdays def execute(self): # This is called every day, at the correct time. We only need to # check if we should run this task today (this day of the week). weekday = time.localtime().tm_wday + 1 if weekday in self.days: self.action(*self.args, **self.kw) class MonthdayTask(DayTaskRescheduler, Task): """A task that is called at specific days in a month (1-31), at a fixed time on the day.""" def __init__(self, name, monthdays, timeonday, action, args=None, kw=None): if type(timeonday) not in (list, tuple) or len(timeonday) != 2: raise TypeError("timeonday must be a 2-tuple (hour,minute)") if type(monthdays) not in (list, tuple): raise TypeError("monthdays must be a sequence of monthdays numbers 1-31") DayTaskRescheduler.__init__(self, timeonday) Task.__init__(self, name, action, args, kw) self.days = monthdays def execute(self): # This is called every day, at the correct time. We only need to # check if we should run this task today (this day of the month). if time.localtime().tm_mday in self.days: self.action(*self.args, **self.kw) try: import threading class ThreadedScheduler(Scheduler): """A Scheduler that runs in its own thread.""" def __init__(self): Scheduler.__init__(self) self._lock = threading.Lock() # we require a lock around the task queue def start(self): # Start method that splices of a thread in which the scheduler will run. self.thread = threading.Thread(target=self._run) self.thread.setDaemon(True) self.thread.start() def stop(self): # Stop method that stops the scheduler and waits for the thread to finish. Scheduler.stop(self) try: self.thread.join() except AttributeError: pass def _acquire_lock(self): self._lock.acquire() # lock the thread's task queue def _release_lock(self): self._lock.release() # release the thread's task queue class ThreadedTaskMixin: """A mixin class to make a Task execute in a separate thread.""" def __call__(self, schedulerref): # execute the task action in its own thread. threading.Thread(target=self.threadedcall).start() self.reschedule(schedulerref()) def threadedcall(self): # This method is run within its own thread, so we have to # do the execute() call and exception handling here. try: self.execute() except Exception, e: self.handle_exception(e) class ThreadedIntervalTask(ThreadedTaskMixin, IntervalTask): """Interval Task that executes in its own thread.""" pass class ThreadedWeekdayTask(ThreadedTaskMixin, WeekdayTask): """Weekday Task that executes in its own thread.""" pass class ThreadedMonthdayTask(ThreadedTaskMixin, MonthdayTask): """Monthday Task that executes in its own thread.""" pass except ImportError: # threading is not available pass if hasattr(os,"fork"): import signal class ForkedScheduler(Scheduler): """A Scheduler that runs in its own forked process.""" def __del__(self): if hasattr(self, "childpid"): os.kill(self.childpid, signal.SIGKILL) def start(self): # Start method that forks of a new process in which the scheduler will run. pid = os.fork() if pid == 0: # we are the child signal.signal(signal.SIGUSR1, self.signalhandler) self._run() os._exit(0) else: # we are the parent self.childpid = pid del self.sched # can no longer insert in the scheduler queue def stop(self): # Stop method that stops the scheduler and waits for the process to finish. os.kill(self.childpid, signal.SIGUSR1) os.waitpid(self.childpid, 0) def signalhandler(self, sig, stack): Scheduler.stop(self) class ForkedTaskMixin: """A mixin class to make a Task execute in a separate process.""" def __call__(self, schedulerref): # execute the task action in its own process. pid = os.fork() if pid == 0: # we are the child try: self.execute() except Exception, e: self.handle_exception(e) os._exit(0) else: # we are the parent self.reschedule(schedulerref()) class ForkedIntervalTask(ForkedTaskMixin, IntervalTask): """Interval Task that executes in its own process.""" pass class ForkedWeekdayTask(ForkedTaskMixin, WeekdayTask): """Weekday Task that executes in its own process.""" pass class ForkedMonthdayTask(ForkedTaskMixin, MonthdayTask): """Monthday Task that executes in its own process.""" pass _scheduler_instance = None def _get_scheduler(): global _scheduler_instance si = _scheduler_instance if not si: si = ThreadedScheduler() _scheduler_instance = si return si def _start_scheduler(): si = _get_scheduler() si.start() def _stop_scheduler(): if not _scheduler_instance: return si = _get_scheduler() si.stop() def add_interval_task(action, interval, args=None, kw=None, initialdelay=0, processmethod=method.threaded, taskname=None): si = _get_scheduler() return si.add_interval_task(action=action, interval=interval, args=args, kw=kw, initialdelay=initialdelay, processmethod=processmethod, taskname=taskname) def add_weekday_task(action, weekdays, timeonday, args=None, kw=None, processmethod=method.threaded, taskname=None): si = _get_scheduler() return si.add_daytime_task(action=action, taskname=taskname, weekdays=weekdays, monthdays=None, timeonday=timeonday, processmethod=processmethod, args=args, kw=kw) def add_monthday_task(action, monthdays, timeonday, args=None, kw=None, processmethod=method.threaded, taskname=None): si = _get_scheduler() return si.add_daytime_task(action=action, taskname=taskname, weekdays=None, monthdays=monthdays, timeonday=timeonday, processmethod=processmethod, args=args, kw=kw) def cancel(task): si = _get_scheduler() si.cancel(task) PK>*ccturbogears/scheduler.pyc; PMc@s}dZdkZdkZdkZdkZdkZdkZdklZedddZ dfdYZ dfd YZ d e fd YZ d fd YZ de e fdYZde e fdYZydkZde fdYZdfdYZdee fdYZdeefdYZdeefdYZWnej onXeedodkZde fdYZdfd YZd!ee fd"YZd#eefd$YZd%eefd&YZnead'Z d(Z!d)Z"eed*e i#ed+Z$eee i#ed,Z%eee i#ed-Z&d.Z'dS(/sModule that provides a cron-like task scheduler. This task scheduler is designed to be used from inside your own program. You can schedule Python functions to be called at specific intervals or days. It uses the standard 'sched' module for the actual task scheduling, but provides much more: - repeated tasks (at intervals, or on specific days) - error handling (exceptions in tasks don't kill the scheduler) - optional to run scheduler in its own thread or separate process - optional to run a task in its own thread or separate process If the threading module is available, you can use the various Threaded variants of the scheduler and associated tasks. If threading is not available, you could still use the forked variants. If fork is also not available, all processing is done in a single process, sequentially. There are three Scheduler classes: Scheduler ThreadedScheduler ForkedScheduler You usually add new tasks to a scheduler using the add_interval_task or add_daytime_task methods, with the appropriate processmethod argument to select sequential, threaded or forked processing. NOTE: it is impossible to add new tasks to a ForkedScheduler, after the scheduler has been started! For more control you could use one of the following Task classes and use schedule_task or schedule_task_abs: IntervalTask ThreadedIntervalTask ForkedIntervalTask WeekdayTask ThreadedWeekdayTask ForkedWeekdayTask MonthdayTask ThreadedMonthdayTask ForkedMonthdayTask Kronos is the Greek God of Time. This module is based on Kronos by Irmen de Jong, but has been modified to better fit within TurboGears. Additionally, this module appeared to no longer be supported/in development. N(sEnums sequentialsforkedsthreadeds SchedulercBsztZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d ZRS( sThe Scheduler itself.cCs(t|_titi|i|_dS(N(sTruesselfsrunningsscheds schedulerstimes_Scheduler__delayfunc(sself((s-build\bdist.win32\egg\turbogears\scheduler.pys__init__9s cCs|djoti|n|iidd}ti|}d}||}xJ|i o+|tijo|iidd|joti|qUW|i p|iidd|jodSnti}||joti||ndS(Ni ii( sdelaystimessleepsselfsschedsqueuestoptimesendtimesperiodsstoptimesrunningsnow(sselfsdelaystoptimesnowsperiodsstoptimesendtime((s-build\bdist.win32\egg\turbogears\scheduler.pys __delayfunc=s  8&  cCsdS(N((sself((s-build\bdist.win32\egg\turbogears\scheduler.pys _acquire_lockRscCsdS(N((sself((s-build\bdist.win32\egg\turbogears\scheduler.pys _release_lockUsc Cs|djp |djotdn|tijo t}nA|tijo t }n'|ti jo t }n td| o g}n| o h}n||||||} |i| || SdS(sAdd a new Interval Task to the schedule. A very short initialdelay or one of zero cannot be honored, you will see a slight delay before the task is first executed. This is because the scheduler needs to pick it up in its loop.iisdelay or interval must be >0sinvalid processmethodN(s initialdelaysintervals ValueErrors processmethodsmethods sequentials IntervalTasks TaskClasssthreadedsThreadedIntervalTasksforkedsForkedIntervalTasksargsskwstasknamesactionstasksselfs schedule_task( sselfsactionstasknames initialdelaysintervals processmethodsargsskws TaskClassstask((s-build\bdist.win32\egg\turbogears\scheduler.pysadd_interval_taskXs"      c Csi|o|otdn| o g}n| o h}n|oy|tijo t} nA|ti jo t } n'|ti jo t } n td| ||||||} n|oy|tijo t} nA|ti jo t} n'|ti jo t} n td| ||||||} n| it} |i| | | SdS(s9Add a new Day Task (Weekday or Monthday) to the schedule.s4you can only specify weekdays or monthdays, not bothsinvalid processmethodN(sweekdayss monthdayss ValueErrorsargsskws processmethodsmethods sequentials WeekdayTasks TaskClasssthreadedsThreadedWeekdayTasksforkedsForkedWeekdayTaskstasknames timeondaysactionstasks MonthdayTasksThreadedMonthdayTasksForkedMonthdayTasksget_schedule_timesTrues firsttimesselfsschedule_task_abs( sselfsactionstasknamesweekdayss monthdayss timeondays processmethodsargsskwstasks TaskClasss firsttime((s-build\bdist.win32\egg\turbogears\scheduler.pysadd_daytime_taskos8          cCs|ioJ|iz.|ii|d|ti|f|_ Wd|i Xn+|ii|d|ti|f|_ dS(sSLow-level method to add a new task to the scheduler with the given delay (seconds).iN( sselfsrunnings _acquire_locksschedsentersdelaystasksweakrefsrefsevents _release_lock(sselfstasksdelay((s-build\bdist.win32\egg\turbogears\scheduler.pys schedule_tasks  cCs|ioJ|iz.|ii|d|ti|f|_ Wd|i Xn+|ii|d|ti|f|_ dS(sVLow-level method to add a new task to the scheduler for the given absolute time value.iN( sselfsrunnings _acquire_locksschedsenterabssabstimestasksweakrefsrefsevents _release_lock(sselfstasksabstime((s-build\bdist.win32\egg\turbogears\scheduler.pysschedule_task_abss  cCs|idS(sStart the scheduler.N(sselfs_run(sself((s-build\bdist.win32\egg\turbogears\scheduler.pysstartscCst|_g|ii(dS(s0Remove all pending tasks and stop the Scheduler.N(sFalsesselfsrunningsschedsqueue(sself((s-build\bdist.win32\egg\turbogears\scheduler.pysstops cCs|ii|idS(N(sselfsschedscancelstasksevent(sselfstask((s-build\bdist.win32\egg\turbogears\scheduler.pyscancelscCsx|ioy|iiWn^tj oR}tidI|IJtidit i ti IJtiddIJnX|iot i dqqWdS(Ns ERROR DURING SCHEDULER EXECUTIONss-ii(sselfsrunningsschedsruns Exceptionsessyssstderrsjoins tracebacksformat_exceptionsexc_infostimessleep(sselfse((s-build\bdist.win32\egg\turbogears\scheduler.pys_runs % (s__name__s __module__s__doc__s__init__s_Scheduler__delayfuncs _acquire_locks _release_locksadd_interval_tasksadd_daytime_tasks schedule_tasksschedule_task_abssstartsstopscancels_run(((s-build\bdist.win32\egg\turbogears\scheduler.pys Scheduler6s       "    sTaskcBs;tZdZdZdZdZdZdZRS(s*Abstract base class of all scheduler taskscCs(||_||_||_||_dS(sThis is an abstract class!N(snamesselfsactionsargsskw(sselfsnamesactionsargsskw((s-build\bdist.win32\egg\turbogears\scheduler.pys__init__s    cCsGy|iWn"tj o}|i|nX|i|dS(s2Execute the task action in the scheduler's thread.N(sselfsexecutes Exceptionseshandle_exceptions reschedules schedulerref(sselfs schedulerrefse((s-build\bdist.win32\egg\turbogears\scheduler.pys__call__s cCstddS(sLThis is an abstract class, this method is defined in one of the sub classes!sIyou're using the abstract base class 'Task', use a concrete class insteadN(sNotImplementedError(sselfs scheduler((s-build\bdist.win32\egg\turbogears\scheduler.pys reschedulescCs|i|i|idS(sExecute the actual task.N(sselfsactionsargsskw(sself((s-build\bdist.win32\egg\turbogears\scheduler.pysexecutescCsMtidI|IJtidititiIJtiddIJdS(s8Handle any exception that occured during task execution.sERROR DURING TASK EXECUTIONss-iN(ssyssstderrsexcsjoins tracebacksformat_exceptionsexc_info(sselfsexc((s-build\bdist.win32\egg\turbogears\scheduler.pyshandle_exceptions%(s__name__s __module__s__doc__s__init__s__call__s reschedulesexecuteshandle_exception(((s-build\bdist.win32\egg\turbogears\scheduler.pysTasks     s IntervalTaskcBs&tZdZeedZdZRS(s>A repeated task that occurs at certain intervals (in seconds).cCs&ti|||||||_dS(N(sTasks__init__sselfsnamesactionsargsskwsinterval(sselfsnamesintervalsactionsargsskw((s-build\bdist.win32\egg\turbogears\scheduler.pys__init__scCs%|io|i||indS(N(s schedulersrunnings schedule_tasksselfsinterval(sselfs scheduler((s-build\bdist.win32\egg\turbogears\scheduler.pys reschedules (s__name__s __module__s__doc__sNones__init__s reschedule(((s-build\bdist.win32\egg\turbogears\scheduler.pys IntervalTasks sDayTaskReschedulercBs)tZdZdZdZdZRS(sBA mixin class that contains the reschedule logic for the DayTasks.cCs ||_dS(N(s timeondaysself(sselfs timeonday((s-build\bdist.win32\egg\turbogears\scheduler.pys__init__scCstti}|o6|d|df|ijo|dcd7]00turbogears/startup.py"Things to do when TurboGears is imported." import os import errno import logging import sys import time import atexit import signal import pkg_resources import cherrypy from cherrypy import _cputil, request, server from formencode.variabledecode import NestedVariables from cherrypy._cpwsgi import wsgiApp, CPHTTPRequest from cherrypy._cpwsgiserver import CherryPyWSGIServer from turbogears import config, scheduler, database from turbogears import view from turbogears.database import hub_registry, EndTransactionsFilter log = logging.getLogger("turbogears.startup") pkg_resources.require("TurboGears") def reloader_thread(freq): """Monkeypatch for the reloader provided by CherryPy. This reloader is designed to reload a single package. This is more efficient and, more important, compatible with zipped libraries that may not provide access to the individual files.""" def archive_selector(module): if hasattr(module, '__loader__'): if hasattr(module.__loader__, 'archive'): return module.__loader__.archive return module mtimes = {} package = config.get("autoreload.package", None) if package is None: print \ """TurboGears requires autoreload.package to be set. It can be an empty value, which will use CherryPy's default behavior which is to check every module. Setting an actual package makes the check much faster.""" return while cherrypy.lib.autoreload.RUN_RELOADER: if package: modnames = filter(lambda modname: modname.startswith(package), sys.modules.keys()) modlist = [sys.modules[modname] for modname in modnames] else: modlist = map(archive_selector, sys.modules.values()) for filename in filter(lambda v: v, map(lambda m: getattr(m, "__file__", None), modlist)): if filename.endswith(".kid") or filename == "": continue orig_filename = filename if filename.endswith(".pyc"): filename = filename[:-1] try: mtime = os.stat(filename).st_mtime except OSError, e: if orig_filename.endswith('.pyc') and e[0] == errno.ENOENT: # This prevents us from endlessly restarting # if there is an old .pyc lying around # after a .py file has been deleted try: os.unlink(orig_filename) except: pass sys.exit(3) # force reload if filename not in mtimes: mtimes[filename] = mtime continue if mtime > mtimes[filename]: sys.exit(3) # force reload time.sleep(freq) cherrypy.lib.autoreload.reloader_thread = reloader_thread webpath = '' DNS_SD_PID = None def start_bonjour(package=None): global DNS_SD_PID if DNS_SD_PID: return if not getattr(cherrypy, 'root', None): return if not package: package = cherrypy.root.__module__ package = package[:package.find(".")] host = config.get('server.socket_host', '') port = str(config.get('server.socket_port')) env = config.get('server.environment') name = package + ": " + env type = "_http._tcp" cmds = [['/usr/bin/avahi-publish-service', ["-H", host, name, type, port]], ['/usr/bin/dns-sd', ['-R', name, type, "."+host, port, "path=/"]]] for cmd, args in cmds: # TODO:. This check is flawed. If one has both services installed and # avahi isn't the one running, then this won't work. We should either # try registering with both or checking what service is running and use # that. Program availability on the filesystem was never enough... if os.path.exists(cmd): DNS_SD_PID = os.spawnv(os.P_NOWAIT, cmd, [cmd]+args) atexit.register(stop_bonjour) break def stop_bonjour(): if not DNS_SD_PID: return try: os.kill(DNS_SD_PID, signal.SIGTERM) except OSError: pass class VirtualPathFilter(object): """Filter that makes CherryPy ignorant of a URL root path. That is, you can mount your app so the URI "/users/~rdel/myapp/" maps to the root object "/". """ def __init__(self, webpath=''): webpath = webpath.rstrip('/') if webpath and not webpath.startswith('/'): webpath = '/' + webpath self.webpath = webpath def before_request_body(self): """Determine the relevant path info by stripping of prefixes. Strips webpath and SCRIPT_NAME from request.object_path and sets request.path_info (since CherryPy 2 does not set it). """ webpath = self.webpath try: webpath += request.wsgi_environ['SCRIPT_NAME'].rstrip('/') except (AttributeError, KeyError): pass if webpath: if request.object_path.startswith(webpath): request.object_path = request.object_path[len(webpath):] or '/' if request.path.startswith(webpath): request.path_info = request.path[len(webpath):] or '/' else: request.path_info = request.path # check for webpath only if not forwarded try: if not request.wsgi_environ['HTTP_X_FORWARDED_SERVER']: raise KeyError except (AttributeError, KeyError): raise cherrypy.NotFound(request.path) else: request.path_info = request.path class NestedVariablesFilter(object): def before_main(self): if hasattr(request, 'params'): request.params = NestedVariables.to_python(request.params or {}) def startTurboGears(): """Handles TurboGears tasks when the CherryPy server starts. This adds the "tg_js" configuration to make MochiKit accessible. It also turns on stdlib logging when in development mode. """ # Set up old-style logging cherrypy.config.environments['development'][ 'log_debug_info_filter.on'] = False if not config.get('tg.new_style_logging'): if config.get('server.log_to_screen'): setuplog = logging.getLogger() setuplog.setLevel(logging.DEBUG) fmt = logging.Formatter( "%(asctime)s %(name)s %(levelname)s %(message)s") handler = logging.StreamHandler(sys.stdout) handler.setLevel(logging.DEBUG) handler.setFormatter(fmt) setuplog.addHandler(handler) logfile = config.get('server.log_file') if logfile: setuplog = logging.getLogger('turbogears.access') setuplog.propagate = 0 fmt = logging.Formatter("%(message)s") handler = logging.FileHandler(logfile) handler.setLevel(logging.INFO) handler.setFormatter(fmt) setuplog.addHandler(handler) # Add static filters resource_filename = pkg_resources.resource_filename config.update({'/tg_static': { 'static_filter.on': True, 'static_filter.dir': os.path.abspath(resource_filename(__name__, 'static')), 'log_debug_info_filter.on': False, }}) config.update({'/tg_js': { 'static_filter.on': True, 'static_filter.dir': os.path.abspath(resource_filename(__name__, 'static/js')), 'log_debug_info_filter.on': False, }}) mochikit_version = config.get( 'tg.mochikit_version', config.get('tg_mochikit.version', '1.3')) mochikit_suffix = '_'.join(mochikit_version.split('.', 2)[:2]) mochikit_file = os.path.abspath(resource_filename( __name__, 'static/js/MochiKit_%s.js' % mochikit_suffix)) if os.path.exists(mochikit_file): for path in ('/tg_static/js/MochiKit.js', '/tg_js/MochiKit.js', '/tg_widgets/turbogears/js/MochiKit.js'): config.update({path: { 'static_filter.on': True, 'static_filter.file': mochikit_file, }}) else: log.warning("MochiKit version %s not available" % mochikit_version) # Add decoding filter if config.get('decoding_filter.on', path='/') is None: config.update({'/': { 'decoding_filter.on': True, 'decoding_filter.encoding': config.get('kid.encoding', 'utf8') }}) # Initialize template engines and load base templates view.load_engines() view.loadBaseTemplates() # Add request filters global webpath webpath = config.get('server.webpath') or '' if getattr(cherrypy, 'root', None): if not hasattr(cherrypy.root, '_cp_filters'): cherrypy.root._cp_filters = [] cherrypy.root._cp_filters.extend([VirtualPathFilter(webpath), EndTransactionsFilter(), NestedVariablesFilter()]) webpath = webpath.lstrip('/') if webpath and not webpath.endswith('/'): webpath += '/' # Register server with Bonjour framework bonjoursetting = config.get('tg.bonjour', None) if bonjoursetting or config.get('server.environment') == 'development': start_bonjour(bonjoursetting) # Bind metadata for SQLAlchemy if config.get("sqlalchemy.dburi"): database.get_engine() # Start all TurboGears extensions extensions = pkg_resources.iter_entry_points('turbogears.extensions') for entrypoint in extensions: ext = entrypoint.load() if hasattr(ext, 'start_extension'): ext.start_extension() # Call registered startup functions for item in call_on_startup: item() # Start the scheduler if config.get('tg.scheduler', False): scheduler._start_scheduler() log.info('Scheduler started') def stopTurboGears(): # end all transactions and clear out the hubs to # help ensure proper reloading in autoreload situations for hub in hub_registry: hub.end() hub_registry.clear() stop_bonjour() # Shut down all TurboGears extensions extensions= pkg_resources.iter_entry_points( "turbogears.extensions" ) for entrypoint in extensions: ext= entrypoint.load() if hasattr(ext, "shutdown_extension"): ext.shutdown_extension() for item in call_on_shutdown: item() if config.get("tg.scheduler", False): scheduler._stop_scheduler() log.info("Scheduler stopped") old_object_trail = _cputil.get_object_trail # hang on to object trail to use it to find an app root if need be def get_object_trail(object_path=None): trail = old_object_trail(object_path) try: request.object_trail = trail except AttributeError: pass return trail _cputil.get_object_trail = get_object_trail class SimpleWSGIServer(CherryPyWSGIServer): """A WSGI server that accepts a WSGI application as a parameter.""" RequestHandlerClass = CPHTTPRequest def __init__(self): conf = cherrypy.config.get wsgi_app = wsgiApp if conf('server.environment') == 'development': try: from paste.evalexception.middleware import EvalException except ImportError: pass else: wsgi_app = EvalException(wsgi_app, global_conf={}) cherrypy.config.update({'server.throw_errors':True}) bind_addr = (conf('server.socket_host'), conf('server.socket_port')) CherryPyWSGIServer.__init__(self, bind_addr, wsgi_app, conf("server.thread_pool"), conf("server.socket_host"), request_queue_size = conf("server.socket_queue_size")) def start_server(root): cherrypy.root = root if config.get('tg.fancy_exception', False): server.start(server=SimpleWSGIServer()) else: server.start() if startTurboGears not in server.on_start_server_list: server.on_start_server_list.append(startTurboGears) if stopTurboGears not in server.on_stop_server_list: server.on_stop_server_list.append(stopTurboGears) call_on_startup = [] call_on_shutdown = [] PK>ZvA9A9turbogears/startup.pyc; PMc@sdZdkZdkZdkZdkZdkZdkZdkZdkZdk Z dk l Z l Z l Z dk lZdklZlZdklZdklZlZlZdklZdklZlZeid Zeid d Zee i i!_d a"e#a$e#d Z%dZ&de'fdYZ(de'fdYZ)dZ*dZ+e i,Z-e#dZ,e,e _,defdYZ.dZ/e*e i0joe i0i1e*ne+e i2joe i2i1e+ngZ3gZ4dS(s)Things to do when TurboGears is imported.N(s_cputilsrequestsserver(sNestedVariables(swsgiApps CPHTTPRequest(sCherryPyWSGIServer(sconfigs schedulersdatabase(sview(s hub_registrysEndTransactionsFiltersturbogears.startups TurboGearsc sd} h}tidttjo dGHdSnxtiii ooPt dt i i }gi}|D]}|t i |q~}nt| t i i}x,t dtd|D] }|idp |d joqn|}|id o|d }nyti|i}Wnetj oY} |id o| d tijoyti |WqqXnt i!d nX||jo|||WdS(sMonkeypatch for the reloader provided by CherryPy. This reloader is designed to reload a single package. This is more efficient and, more important, compatible with zipped libraries that may not provide access to the individual files.cCs=t|do%t|ido|iiSq5n|SdS(Ns __loader__sarchive(shasattrsmodules __loader__sarchive(smodule((s+build\bdist.win32\egg\turbogears\startup.pysarchive_selector"ssautoreload.packagesTurboGears requires autoreload.package to be set. It can be an empty value, which will use CherryPy's default behavior which is to check every module. Setting an actual package makes the check much faster.Ncs |iS(N(smodnames startswithspackage(smodname(spackage(s+build\bdist.win32\egg\turbogears\startup.pys2scCs|S(N(sv(sv((s+build\bdist.win32\egg\turbogears\startup.pys7scCst|dtS(Ns__file__(sgetattrsmsNone(sm((s+build\bdist.win32\egg\turbogears\startup.pys8ss.kidss.pyciii(%sarchive_selectorsmtimessconfigsgetsNonespackagescherrypyslibs autoreloads RUN_RELOADERsfilterssyssmodulesskeyssmodnamessappends_[1]smodnamesmodlistsmapsvaluessfilenamesendswiths orig_filenamesossstatsst_mtimesmtimesOSErrorseserrnosENOENTsunlinksexitstimessleepsfreq( sfreqsmodnamessmtimes_[1]sfilenames orig_filenamesmtimessmodnamesmodlistsesarchive_selectorspackage((spackages+build\bdist.win32\egg\turbogears\startup.pysreloader_threadsJ   2 $  sc Cs<todSnttdt odSn| o#tii}||id }nti dd}t ti d}ti d}|d|}d}d d ||||ggd d ||d||d ggg}xX|D]P\}}tii|o1titi||g|atitPqqWdS(Nsroots.sserver.socket_hostssserver.socket_portsserver.environments: s _http._tcps/usr/bin/avahi-publish-services-Hs/usr/bin/dns-sds-Rspath=/(s DNS_SD_PIDsgetattrscherrypysNonespackagesroots __module__sfindsconfigsgetshostsstrsportsenvsnamestypescmdsscmdsargssosspathsexistssspawnvsP_NOWAITsatexitsregisters stop_bonjour( spackagesargssenvstypescmdshostsportscmdssname((s+build\bdist.win32\egg\turbogears\startup.pys start_bonjourVs( =  cCsAt odSnytittiWntj onXdS(N(s DNS_SD_PIDsosskillssignalsSIGTERMsOSError(((s+build\bdist.win32\egg\turbogears\startup.pys stop_bonjourts sVirtualPathFiltercBs#tZdZddZdZRS(sFilter that makes CherryPy ignorant of a URL root path. That is, you can mount your app so the URI "/users/~rdel/myapp/" maps to the root object "/". scCsB|id}|o|id od|}n||_dS(Ns/(swebpathsrstrips startswithsself(sselfswebpath((s+build\bdist.win32\egg\turbogears\startup.pys__init__scCs|i}y|tidid7}Wnttfj onX|otii|o!tit |pdt_nti i|o!ti t |pdt_ qti t_ ytid o tnWqttfj ot i ti qXn ti t_ dS(sDetermine the relevant path info by stripping of prefixes. Strips webpath and SCRIPT_NAME from request.object_path and sets request.path_info (since CherryPy 2 does not set it). s SCRIPT_NAMEs/sHTTP_X_FORWARDED_SERVERN(sselfswebpathsrequests wsgi_environsrstripsAttributeErrorsKeyErrors object_paths startswithslenspaths path_infoscherrypysNotFound(sselfswebpath((s+build\bdist.win32\egg\turbogears\startup.pysbefore_request_bodys$ !! (s__name__s __module__s__doc__s__init__sbefore_request_body(((s+build\bdist.win32\egg\turbogears\startup.pysVirtualPathFilter}s  sNestedVariablesFiltercBstZdZRS(NcCs4ttdo titipht_ndS(Nsparams(shasattrsrequestsNestedVariabless to_pythonsparams(sself((s+build\bdist.win32\egg\turbogears\startup.pys before_mains(s__name__s __module__s before_main(((s+build\bdist.win32\egg\turbogears\startup.pysNestedVariablesFiltersc Cs~ttiiddqqWxt?D] } | q;Wtid+totAiBt$iCd,nd-S(.sHandles TurboGears tasks when the CherryPy server starts. This adds the "tg_js" configuration to make MochiKit accessible. It also turns on stdlib logging when in development mode. s developmentslog_debug_info_filter.onstg.new_style_loggingsserver.log_to_screens.%(asctime)s %(name)s %(levelname)s %(message)ssserver.log_filesturbogears.accessis %(message)ss /tg_staticsstatic_filter.onsstatic_filter.dirsstatics/tg_jss static/jsstg.mochikit_versionstg_mochikit.versions1.3s_s.isstatic/js/MochiKit_%s.jss/tg_static/js/MochiKit.jss/tg_js/MochiKit.jss%/tg_widgets/turbogears/js/MochiKit.jssstatic_filter.files!MochiKit version %s not availablesdecoding_filter.onspaths/sdecoding_filter.encodings kid.encodingsutf8sserver.webpathssroots _cp_filterss tg.bonjoursserver.environmentssqlalchemy.dburisturbogears.extensionssstart_extensions tg.schedulersScheduler startedN(DsFalsescherrypysconfigs environmentssgetsloggings getLoggerssetuplogssetLevelsDEBUGs Formattersfmts StreamHandlerssyssstdoutshandlers setFormatters addHandlerslogfiles propagates FileHandlersINFOs pkg_resourcessresource_filenamesupdatesTruesosspathsabspaths__name__smochikit_versionsjoinssplitsmochikit_suffixs mochikit_filesexistsslogswarningsNonesviews load_enginessloadBaseTemplatesswebpathsgetattrshasattrsroots _cp_filterssextendsVirtualPathFiltersEndTransactionsFiltersNestedVariablesFilterslstripsendswithsbonjoursettings start_bonjoursdatabases get_enginesiter_entry_pointss extensionss entrypointsloadsextsstart_extensionscall_on_startupsitems schedulers_start_schedulersinfo(sresource_filenamespaths mochikit_filesfmtshandlers entrypointsmochikit_suffixssetuplogsbonjoursettingslogfilesmochikit_versionsitemsexts extensions((s+build\bdist.win32\egg\turbogears\startup.pysstartTurboGearssz     FF08  ,   cCsxtD]}|iqWtittid}x8|D]0}|i }t |do|i qBqBWxt D] }|q}WtidtotitidndS(Nsturbogears.extensionssshutdown_extensions tg.schedulersScheduler stopped(s hub_registryshubsendsclears stop_bonjours pkg_resourcessiter_entry_pointss extensionss entrypointsloadsextshasattrsshutdown_extensionscall_on_shutdownsitemsconfigsgetsFalses schedulers_stop_schedulerslogsinfo(shubsitemsexts entrypoints extensions((s+build\bdist.win32\egg\turbogears\startup.pysstopTurboGearss"    cCs7t|}y |t_Wntj onX|SdS(N(sold_object_trails object_pathstrailsrequests object_trailsAttributeError(s object_pathstrail((s+build\bdist.win32\egg\turbogears\startup.pysget_object_trail9s   sSimpleWSGIServercBstZdZeZdZRS(s=A WSGI server that accepts a WSGI application as a parameter.c Cstii}t}|ddjoVydkl}Wntj oq{X||dh}tii hdt <n|d|df}t i ||||d|dd |d dS( Nsserver.environments development(s EvalExceptions global_confsserver.throw_errorssserver.socket_hostsserver.socket_portsserver.thread_poolsrequest_queue_sizesserver.socket_queue_size(scherrypysconfigsgetsconfswsgiAppswsgi_appspaste.evalexception.middlewares EvalExceptions ImportErrorsupdatesTrues bind_addrsCherryPyWSGIServers__init__sself(sselfs EvalExceptions bind_addrsconfswsgi_app((s+build\bdist.win32\egg\turbogears\startup.pys__init__Hs (s__name__s __module__s__doc__s CPHTTPRequestsRequestHandlerClasss__init__(((s+build\bdist.win32\egg\turbogears\startup.pysSimpleWSGIServerDs cCsA|t_tidtotidtn tidS(Nstg.fancy_exceptionsserver(srootscherrypysconfigsgetsFalsesserversstartsSimpleWSGIServer(sroot((s+build\bdist.win32\egg\turbogears\startup.pys start_serverYs (5s__doc__sosserrnosloggingssysstimesatexitssignals pkg_resourcesscherrypys_cputilsrequestsserversformencode.variabledecodesNestedVariablesscherrypy._cpwsgiswsgiApps CPHTTPRequestscherrypy._cpwsgiserversCherryPyWSGIServers turbogearssconfigs schedulersdatabasesviewsturbogears.databases hub_registrysEndTransactionsFilters getLoggerslogsrequiresreloader_threadslibs autoreloadswebpathsNones DNS_SD_PIDs start_bonjours stop_bonjoursobjectsVirtualPathFiltersNestedVariablesFiltersstartTurboGearssstopTurboGearssget_object_trailsold_object_trailsSimpleWSGIServers start_serverson_start_server_listsappendson_stop_server_listscall_on_startupscall_on_shutdown($sSimpleWSGIServerscherrypyswsgiAppsreloader_threadsatexitsEndTransactionsFilters stop_bonjourslogserrnosNestedVariablessstartTurboGearss start_bonjoursconfigs hub_registryscall_on_startups_cputilsstopTurboGearsssyss schedulersget_object_trails CPHTTPRequestsCherryPyWSGIServersloggings start_serversold_object_trailsdatabasescall_on_shutdownssignalsVirtualPathFiltersrequests pkg_resourcessserverstimesNestedVariablesFiltersossview((s+build\bdist.win32\egg\turbogears\startup.pys?sN              4  + o     PKzz>p[))turbogears/testutil.pyimport Cookie import cStringIO as StringIO import logging import os import string import types import unittest import cherrypy from cherrypy import _cphttptools try: import sqlobject from sqlobject.inheritance import InheritableSQLObject except ImportError: sqlobject = None try: import sqlalchemy except ImportError: sqlalchemy = None from turbogears import startup, config, update_config, \ controllers, database, validators from turbogears.identity import current_provider from turbogears.util import get_model # For clean tests, remove all compiled Kid templates for w in os.walk('.'): if not os.sep + '.' in w[0]: for f in w[2]: if f.endswith('.kid'): f = os.path.join(w[0], f[:-3] + 'pyc') if os.path.exists(f): os.remove(f) # Load test configuration if os.path.exists('test.cfg'): # Look for a 'config' package for dirpath, dirs, dummy2 in os.walk('.'): basename = os.path.basename(dirpath) dirname = os.path.basename(os.path.dirname(dirpath)) init_py = os.path.join(dirpath, '__init__.py') if basename == 'config' and dirname[0] in string.ascii_letters + '_' \ and os.path.exists(init_py): modulename = "%s.app" % dirpath[2:].replace(os.sep, ".") break else: modulename = None # XXX This is a temporary workaround, the code above to find the config # package should really be improved and moved elsewhere. # See http://trac.turbogears.org/ticket/2043 try: update_config(configfile="test.cfg", modulename=modulename) except ImportError, exc: import warnings warnings.warn("Could not import configuration from module: %s" % exc, RuntimeWarning) update_config(configfile="test.cfg", modulename=None) else: database.set_db_uri("sqlite:///:memory:") config.update({'global': {'autoreload.on': False, 'tg.new_style_logging': True}}) def start_cp(): if not config.get("cherrypy_started", False): cherrypy.server.start(serverClass=None, initOnly=True) config.update({"cherrypy_started" : True}) test_user = None def set_identity_user(user): """Setup a user for configuring request's identity.""" global test_user test_user = user def attach_identity(req): if config.get("identity.on", False): req.identity = (test_user and current_provider.authenticated_identity(test_user) or current_provider.anonymous_identity()) def create_request(request, method="GET", protocol="HTTP/1.1", headers={}, rfile=None, clientAddress="127.0.0.1", remoteHost="localhost", scheme="http"): start_cp() if not rfile: rfile = StringIO.StringIO("") if type(headers) != dict: headerList = headers else: headerList = [(key, value) for key, value in headers.items()] headerList.append(("Host", "localhost")) if not hasattr(cherrypy.root, "started"): startup.startTurboGears() cherrypy.root.started = True req = _cphttptools.Request(clientAddress, 80, remoteHost, scheme) cherrypy.serving.request = req attach_identity(req) cherrypy.serving.response = _cphttptools.Response() req.run(" ".join((method, request, protocol)), headerList, rfile) createRequest = create_request # deprecated class BrowsingSession(object): def __init__(self): self.visit = None self.response, self.status = None, None self.cookie = Cookie.SimpleCookie() def goto(self, *args, **kwargs): if self.cookie: headers = kwargs.setdefault('headers', {}) headers['Cookie'] = self.cookie.output() create_request(*args, **kwargs) # If we were given an encoding in the content type we should use it to # decode the response: ctype_parts = cherrypy.response.headers['Content-Type'].split(';') for parameter in ctype_parts[1:]: attribute, value = parameter.strip().split('=') try: self.unicode_response = cherrypy.response.body[0].decode(value) break except: # If the named encoding doesn't work then it doesn't work. We # just won't create the unicode_response field. pass self.response = cherrypy.response.body[0] self.status = cherrypy.response.status if cherrypy.response.simple_cookie: self.cookie.update(cherrypy.response.simple_cookie) def _return_directly(output, *args): return output class DummySession: session_storage = dict to_be_loaded = None class DummyRequest(_cphttptools.Request): """A very simple dummy request.""" remote_host = "127.0.0.1" def __init__(self, method='GET', path='/', headers=None): super(DummyRequest, self).__init__("127.0.0.1", "4711", "127.0.0.1") self.headers = headers or {} self.method = method self.path = path self.path_info = '' self.query_string = '' self.base = '' self.params = {} self.object_trail = [] self._session = DummySession() def purge__(self): pass def call(method, *args, **kw): start_cp() output, response = call_with_request(method, DummyRequest(), *args, **kw) return output def call_with_request(method, request, *args, **kw): """More fine-grained version of call method. This allows using request/response. """ orig_proc_output = controllers._process_output controllers._process_output = _return_directly cherrypy.serving.response = _cphttptools.Response() cherrypy.serving.response.version = "1.1" cherrypy.serving.request = request if not hasattr(request, "identity"): attach_identity(request) output = None try: output = method(*args, **kw) finally: del cherrypy.serving.request controllers._process_output = orig_proc_output response = cherrypy.serving.response return output, response class DBTest(unittest.TestCase): model = None def _get_soClasses(self): try: return [self.model.__dict__[x] for x in self.model.soClasses] except AttributeError: return self.model.__dict__.values() def setUp(self): if not self.model: self.model = get_model() if not self.model: raise "Unable to run database tests without a model" # list of constraints we will collect constraints = list() for item in self._get_soClasses(): if isinstance(item, types.TypeType) and issubclass(item, sqlobject.SQLObject) and item != sqlobject.SQLObject \ and item != InheritableSQLObject: # create table without applying constraints, collect # all the constaints for later creation. # see http://sqlobject.org/FAQ.html#mutually-referencing-tables # for more info collected_constraints = item.createTable(ifNotExists=True, applyConstraints=False) if collected_constraints: constraints.extend(collected_constraints) # now that all tables are created, add the constaints we collected for postponed_constraint in constraints: # item is the last processed item and we borrow its connection item._connection.query(postponed_constraint) def tearDown(self): database.rollback_all() for item in self._get_soClasses()[::-1]: if isinstance(item, types.TypeType) and issubclass(item, sqlobject.SQLObject) and item != sqlobject.SQLObject \ and item != InheritableSQLObject: item.dropTable(ifExists=True) def reset_cp(): cherrypy.root = None def catch_validation_errors(widget, value): """Catch and unpack validation errors (for testing purposes).""" try: value = widget.validate(value) except validators.Invalid, errors: try: errors = errors.unpack_errors() except AttributeError: pass else: errors = {} return value, errors class MemoryListHandler(logging.Handler): def __init__(self): logging.Handler.__init__(self, level=logging.DEBUG) self.log = [] def emit(self, record): print "Got record: %s" % record print "formatted as: %s" % self.format(record) self.log.append(self.format(record)) def print_log(self): print "\n".join(self.log) self.log = [] def get_log(self): log = self.log self.log = [] return log _memhandler = MemoryListHandler() _currentcat = None def capture_log(category): """Capture log for one category. The category can either be a single category (a string like 'foo.bar') or a list of them. You *must* call print_log() to reset when you're done. """ global _currentcat assert not _currentcat if not isinstance(category, list) and not isinstance(category, tuple): category = [category] _currentcat = category for cat in category: log = logging.getLogger(cat) log.setLevel(logging.DEBUG) log.addHandler(_memhandler) def _reset_logging(): """Manage the resetting of the loggers.""" global _currentcat if not _currentcat: return for cat in _currentcat: log = logging.getLogger(cat) log.removeHandler(_memhandler) _currentcat = None def print_log(): """Print the log captured by capture_log to stdout. Resets that log and resets the temporarily added handlers. """ _reset_logging() _memhandler.print_log() def get_log(): """Return the list of log messages captured by capture_log. Resets that log and resets the temporarily added handlers. """ _reset_logging() return _memhandler.get_log() def sqlalchemy_cleanup(): database.metadata.clear() try: database.metadata.dispose() except AttributeError: # not threadlocal if database.metadata.bind: database.metadata.bind.dispose() database._engine = None if database.mapper == database.session.mapper: # the following does not work for SA < 0.4 sqlalchemy.orm.clear_mappers() __all__ = ["call", "create_request", "createRequest", "DBTest", "attach_identity", "set_identity_user", "capture_log", "print_log", "get_log", "sqlalchemy_cleanup"] PK>yy=y=turbogears/testutil.pyc; PMc @s[dkZdkZdkZdkZdkZdkZdkZdkZdkl Z ydk Z dk l Z Wne j o eZ nXy dkZWne j o eZnXdklZlZlZlZlZlZdklZdklZxeidD]Zeidedj orxoedD]_Zeid oIei i!eded d Zei i"eoei#eqq3q3Wq q Wei i"d o+xeidD]\Z$Z%Z&ei i'e$Z'ei i'ei i(e$Z(ei i!e$d Z)e'djo(e(dei*djoei i"e)o"de$di+eidZ,PqqWeZ,yedd de,Wqe j o9Z-dk.Z.e.i/de-e0edd deqXnei1dei2hdhde3<de4<<dZ5ea6dZ7dZ8ddhedddd Z9e9Z:d!e;fd"YZ<d#Z=d$fd%YZ>d&e i?fd'YZ@d(ZAd)ZBd*eiCfd+YZDd,ZEd-ZFd.eiGfd/YZHeHZIeaJd0ZKd1ZLd2ZMd3ZNd4ZOd5d6d7d*d8d9d:d;d<d=g ZPdS(>N(s _cphttptools(sInheritableSQLObject(sstartupsconfigs update_configs controllerssdatabases validators(scurrent_provider(s get_models.iis.kidispycstest.cfgs __init__.pysconfigs_s%s.apps configfiles modulenames.Could not import configuration from module: %sssqlite:///:memory:sglobals autoreload.onstg.new_style_loggingcCsKtidt o3tiidtdttihdt<ndS(Nscherrypy_starteds serverClasssinitOnly( sconfigsgetsFalsescherrypysserversstartsNonesTruesupdate(((s,build\bdist.win32\egg\turbogears\testutil.pysstart_cpBscCs |adS(s0Setup a user for configuring request's identity.N(susers test_user(suser((s,build\bdist.win32\egg\turbogears\testutil.pysset_identity_userJscCsAtidto*to titp ti|_ndS(Ns identity.on( sconfigsgetsFalses test_userscurrent_providersauthenticated_identitysanonymous_identitysreqsidentity(sreq((s,build\bdist.win32\egg\turbogears\testutil.pysattach_identityPssGETsHTTP/1.1s 127.0.0.1s localhostshttpc Cs"t| otid}nt|tjo |} n:gi} |i D]\} } | | | fqS~ } | iddft t id otitt i_nti|d||}|t i_t|tit i_|idi|||f| |dS(NssHosts localhostsstartediPs ("sstart_cpsrfilesStringIOstypesheaderssdicts headerListsappends_[1]sitemsskeysvalueshasattrscherrypysrootsstartupsstartTurboGearssTruesstarteds _cphttptoolssRequests clientAddresss remoteHostsschemesreqsservingsrequestsattach_identitysResponsesresponsesrunsjoinsmethodsprotocol( srequestsmethodsprotocolsheaderssrfiles clientAddresss remoteHostsschemesreqs headerListskeysvalues_[1]((s,build\bdist.win32\egg\turbogears\testutil.pyscreate_requestWs 9   sBrowsingSessioncBstZdZdZRS(NcCs4t|_ttf\|_|_ti|_dS(N(sNonesselfsvisitsresponsesstatussCookies SimpleCookiescookie(sself((s,build\bdist.win32\egg\turbogears\testutil.pys__init__ps cOs|io)|idh}|ii|dtij o/}y|i}WqZtj oqZXnXh}||fSdS(s:Catch and unpack validation errors (for testing purposes).N(swidgetsvalidatesvalues validatorssInvalidserrorss unpack_errorssAttributeError(swidgetsvalueserrors((s,build\bdist.win32\egg\turbogears\testutil.pyscatch_validation_errorss sMemoryListHandlercBs,tZdZdZdZdZRS(NcCs&tii|dtig|_dS(Nslevel(sloggingsHandlers__init__sselfsDEBUGslog(sself((s,build\bdist.win32\egg\turbogears\testutil.pys__init__ scCs8d|GHd|i|GH|ii|i|dS(NsGot record: %ssformatted as: %s(srecordsselfsformatslogsappend(sselfsrecord((s,build\bdist.win32\egg\turbogears\testutil.pysemits cCsdi|iGHg|_dS(Ns (sjoinsselfslog(sself((s,build\bdist.win32\egg\turbogears\testutil.pys print_logscCs|i}g|_|SdS(N(sselfslog(sselfslog((s,build\bdist.win32\egg\turbogears\testutil.pysget_logs  (s__name__s __module__s__init__semits print_logsget_log(((s,build\bdist.win32\egg\turbogears\testutil.pysMemoryListHandler s   cCst ptt|t ot|t o |g}n|ax:|D]2}ti|}|i ti |i t qKWdS(sCapture log for one category. The category can either be a single category (a string like 'foo.bar') or a list of them. You *must* call print_log() to reset when you're done. N(s _currentcatsAssertionErrors isinstancescategorysliststuplescatsloggings getLoggerslogssetLevelsDEBUGs addHandlers _memhandler(scategoryslogscat((s,build\bdist.win32\egg\turbogears\testutil.pys capture_log$s" cCsGt odSnx*tD]"}ti|}|itqWtadS(s$Manage the resetting of the loggers.N(s _currentcatscatsloggings getLoggerslogs removeHandlers _memhandlersNone(slogscat((s,build\bdist.win32\egg\turbogears\testutil.pys_reset_logging6scCsttidS(svPrint the log captured by capture_log to stdout. Resets that log and resets the temporarily added handlers. N(s_reset_loggings _memhandlers print_log(((s,build\bdist.win32\egg\turbogears\testutil.pys print_logAscCsttiSdS(s~Return the list of log messages captured by capture_log. Resets that log and resets the temporarily added handlers. N(s_reset_loggings _memhandlersget_log(((s,build\bdist.win32\egg\turbogears\testutil.pysget_logKscCstiiytiiWn4tj o(tiiotiiiqUnXtt_titi ijot i i ndS(N( sdatabasesmetadatasclearsdisposesAttributeErrorsbindsNones_enginesmapperssessions sqlalchemysorms clear_mappers(((s,build\bdist.win32\egg\turbogears\testutil.pyssqlalchemy_cleanupUs   scallscreate_requests createRequestsattach_identitysset_identity_users capture_logs print_logsget_logssqlalchemy_cleanup(QsCookies cStringIOsStringIOsloggingsossstringstypessunittestscherrypys _cphttptoolss sqlobjectssqlobject.inheritancesInheritableSQLObjects ImportErrorsNones sqlalchemys turbogearssstartupsconfigs update_configs controllerssdatabases validatorssturbogears.identityscurrent_providersturbogears.utils get_modelswalkswssepsfsendswithspathsjoinsexistssremovesdirpathsdirssdummy2sbasenamesdirnamesinit_pys ascii_letterssreplaces modulenamesexcswarningsswarnsRuntimeWarnings set_db_urisupdatesFalsesTruesstart_cps test_usersset_identity_usersattach_identityscreate_requests createRequestsobjectsBrowsingSessions_return_directlys DummySessionsRequests DummyRequestscallscall_with_requestsTestCasesDBTestsreset_cpscatch_validation_errorssHandlersMemoryListHandlers _memhandlers _currentcats capture_logs_reset_loggings print_logsget_logssqlalchemy_cleanups__all__(5sinit_pyscherrypyscurrent_providersunittestsdirpathsstartupscatch_validation_errorss capture_logs modulenames_reset_loggings validatorssdummy2sdirnamesMemoryListHandlers DummySessions__all__sBrowsingSessionscreate_requests update_configsCookiestypess _memhandlersDBTestscallsconfigsbasenamesdirss sqlalchemysstringsstart_cpswarningsscall_with_requestsattach_identitysset_identity_users _cphttptoolssget_logs_return_directlys DummyRequestsInheritableSQLObjects sqlobjectsreset_cpsfsloggingsexcsStringIOs print_logsdatabasessqlalchemy_cleanups controllerss createRequests get_modelswsos((s,build\bdist.win32\egg\turbogears\testutil.pys?s             +   !!8    (      1     PKzz>@RRturbogears/util.py"""The TurboGears utility module.""" import os import sys import re import logging import warnings import htmlentitydefs from inspect import getargspec, getargvalues from itertools import izip, islice, chain from operator import isSequenceType from urllib import quote, unquote try: set except NameError: # Python 2.3 from sets import Set as set import pkg_resources from cherrypy import request from turbogears.decorator import decorator from turbogears import config def deprecated(message=None): """Decorator which can be used to mark functions as deprecated. It will result in a warning being emmitted when the function is used. Inspired by http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/391367 """ def decorate(func): if not decorate.message: decorate.message = \ "Call to deprecated function %s." % func.__name__ def newFunc(*args, **kwargs): warnings.warn(decorate.message, category=DeprecationWarning, stacklevel = 2) return func(*args, **kwargs) try: newFunc.__name__ = func.__name__ except TypeError: # not writable in Python 2.3 pass newFunc.__doc__ = func.__doc__ newFunc.__dict__.update(func.__dict__) return newFunc decorate.message = message return decorate class Bunch(dict): """Simple but handy collector of a bunch of named stuff.""" def __repr__(self): keys = self.keys() keys.sort() args = ', '.join(['%s=%r' % (key, self[key]) for key in keys]) return '%s(%s)' % (self.__class__.__name__, args) def __getattr__(self, name): try: return self[name] except KeyError: raise AttributeError(name) __setattr__ = dict.__setitem__ def __delattr__(self, name): try: del self[name] except KeyError: raise AttributeError(name) class DictObj(Bunch): def __init__(self, *args, **kw): super(DictObj, self).__init__(*args, **kw) __init__ = deprecated( "Use Bunch instead of DictObj and DictWrapper.")(__init__) DictWrapper = DictObj def Enum(*names): """True immutable symbolic enumeration with qualified value access. Written by Zoran Isailovski: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/413486 """ # Uncomment the following line if you don't like empty enums. # assert names, "Empty enums are not supported" class EnumClass(object): __slots__ = names def __iter__(self): return iter(constants) def __len__(self): return len(constants) def __getitem__(self, i): return constants[i] def __repr__(self): return 'Enum' + str(names) def __str__(self): return 'enum ' + str(constants) enumType = EnumClass() class EnumValue(object): __slots__ = ('__value') def __init__(self, value): self.__value = value Value = property(lambda self: self.__value) EnumType = property(lambda self: enumType) def __hash__(self): return hash(self.__value) def __cmp__(self, other): # C fans might want to remove the following assertion # to make all enums comparable by ordinal value {;)) assert self.EnumType is other.EnumType, \ "Only values from the same enum are comparable" return cmp(self.__value, other.__value) def __invert__(self): return constants[maximum - self.__value] def __nonzero__(self): return bool(self.__value) def __repr__(self): return str(names[self.__value]) maximum = len(names) - 1 constants = [None] * len(names) for i, each in enumerate(names): val = EnumValue(i) setattr(EnumClass, each, val) constants[i] = val constants = tuple(constants) return enumType class setlike(list): """Set preserving item order.""" def add(self, item): if item not in self: self.append(item) def add_all(self, iterable): for item in iterable: self.add(item) def get_project_meta(name): """Get egg-info file with that name in the current project.""" for dirname in os.listdir("./"): if dirname.lower().endswith("egg-info"): fname = os.path.join(dirname, name) return fname def get_project_config(): """Try to select appropriate project configuration file.""" return os.path.exists('setup.py') and 'dev.cfg' or 'prod.cfg' def load_project_config(configfile=None): """Try to update the project settings from the config file specified. If configfile is C{None}, uses L{get_project_config} to locate one. """ if configfile is None: configfile = get_project_config() if not os.path.isfile(configfile): print 'Config file %s not found or is not a file.' % ( os.path.abspath(configfile),) sys.exit() package = get_package_name() config.update_config(configfile=configfile, modulename = package + ".config") def get_package_name(): """Try to find out the package name of the current directory.""" package = config.get("package") if package: return package if hasattr(sys, 'argv') and "--egg" in sys.argv: projectname = sys.argv[sys.argv.index("--egg")+1] egg = pkg_resources.get_distribution(projectname) top_level = egg._get_metadata("top_level.txt") else: fname = get_project_meta('top_level.txt') top_level = fname and open(fname) or [] for package in top_level: package = package.rstrip() if package and package != 'locales': return package def get_project_name(): pkg_info = get_project_meta('PKG-INFO') if pkg_info: name = list(open(pkg_info))[1][6:-1] return name.strip() def get_model(): package_name = get_package_name() if not package_name: return None package = __import__(package_name, {}, {}, ["model"]) if hasattr(package, "model"): return package.model def ensure_sequence(obj): """Construct a sequence from object.""" if obj is None: return [] elif isSequenceType(obj): return obj else: return [obj] def to_kw(func, args, kw, start=0): """Convert all applicable arguments to keyword arguments.""" argnames, defaults = getargspec(func)[::3] defaults = ensure_sequence(defaults) kv_pairs = izip( islice(argnames, start, len(argnames) - len(defaults)), args) for k, v in kv_pairs: kw[k] = v return args[len(argnames)-len(defaults)-start:], kw def from_kw(func, args, kw, start=0): """Extract named positional arguments from keyword arguments.""" argnames, defaults = getargspec(func)[::3] defaults = ensure_sequence(defaults) newargs = [kw.pop(name) for name in islice(argnames, start, len(argnames) - len(defaults)) if name in kw] newargs.extend(args) return newargs, kw def adapt_call(func, args, kw, start=0): """Remove excess arguments.""" argnames, varargs, kwargs = getargspec(func)[:3] del argnames[:start] if kwargs in (None, "_decorator__kwargs"): remove_keys(kw, [key for key in kw if key not in argnames]) if varargs in (None, "_decorator__varargs"): args = args[:len(argnames)] for n, key in enumerate(argnames): if key in kw: args = args[:n] break return args, kw def call_on_stack(func_name, kw, start=0): """Check if a call to function matching pattern is on stack.""" try: frame = sys._getframe(start+1) except ValueError: return False while frame.f_back: frame = frame.f_back if frame.f_code.co_name == func_name: args = getargvalues(frame)[3] for key in kw.iterkeys(): try: if kw[key] != args[key]: break except (KeyError, TypeError): break else: return True return False def remove_keys(dict_, seq): """Gracefully remove keys from dict.""" for key in seq: dict_.pop(key, None) return dict_ def has_arg(func, argname): """Check whether function has argument.""" return argname in getargspec(func)[0] def arg_index(func, argname): """Find index of argument as declared for given function.""" argnames = getargspec(func)[0] if has_arg(func, argname): return argnames.index(argname) else: return None def inject_arg(func, argname, argval, args, kw, start=0): """Insert argument into call.""" argnames, defaults = getargspec(func)[::3] defaults = ensure_sequence(defaults) pos = arg_index(func, argname) if pos is None or pos > len(argnames) - len(defaults) - 1: kw[argname] = argval else: pos -= start args = tuple(chain(islice(args, pos), (argval,), islice(args, pos, None))) return args, kw def inject_args(func, injections, args, kw, start=0): """Insert arguments into call.""" for argname, argval in injections.iteritems(): args, kw = inject_arg(func, argname, argval, args, kw, start) return args, kw def inject_call(func, injections, *args, **kw): """Insert arguments and call.""" args, kw = inject_args(func, injections, args, kw) return func(*args, **kw) def add_tg_args(func, args): """Add hint for special arguments that shall not be removed.""" try: tg_args = func._tg_args except AttributeError: tg_args = set() tg_args.update(args) func._tg_args = tg_args def bind_args(**add): """Call with arguments set to a predefined value.""" def entagle(func): return lambda func, *args, **kw: inject_call(func, add, *args, **kw) def make_decorator(func): argnames, varargs, kwargs, defaults = getargspec(func) defaults = list(ensure_sequence(defaults)) defaults = [d for d in defaults if argnames[-len(defaults) + defaults.index(d)] not in add] argnames = [arg for arg in argnames if arg not in add] return decorator(entagle, (argnames, varargs, kwargs, defaults))(func) return make_decorator def recursive_update(to_dict, from_dict): """Recursively update all dicts in to_dict with values from from_dict.""" # probably slow as hell :( should be optimized somehow... for k, v in from_dict.iteritems(): if isinstance(v, dict) and isinstance(to_dict[k], dict): recursive_update(to_dict[k], v) else: to_dict[k] = v return to_dict def combine_contexts(frames=None, depth=None): """Combine contexts (globals, locals) of frames.""" locals_ = {} globals_ = {} if frames is None: frames = [] if depth is not None: frames.extend([sys._getframe(d+1) for d in depth]) for frame in frames: locals_.update(frame.f_locals) globals_.update(frame.f_globals) return locals_, globals_ def request_available(): """Check if cherrypy.request is available.""" try: setattr(request, "tg_dumb_attribute", True) return True except AttributeError: return False def flatten_sequence(seq): """Flatten sequence.""" for item in seq: if isSequenceType(item) and not isinstance(item, basestring): for item in flatten_sequence(item): yield item else: yield item def load_class(dottedpath): """Load a class from a module in dotted-path notation. E.g.: load_class("package.module.class"). Based on recipe 16.3 from Python Cookbook, 2ed., by Alex Martelli, Anna Martelli Ravenscroft, and David Ascher (O'Reilly Media, 2005) """ assert dottedpath is not None, "dottedpath must not be None" splitted_path = dottedpath.split('.') modulename = '.'.join(splitted_path[:-1]) classname = splitted_path[-1] try: try: module = __import__(modulename, globals(), locals(), [classname]) except ValueError: # Py < 2.5 if not modulename: module = __import__(__name__.split('.')[0], globals(), locals(), [classname]) except ImportError: # properly log the exception information and return None # to tell caller we did not succeed logging.exception('tg.utils: Could not import %s' ' because exception occurred', dottedpath) return None return getattr(module, classname) def parse_http_accept_header(accept): """Parse an HTTP Accept header (RFC 2616) into a sorted list. The quality factors in the header determine the sort order. The values can include possible media-range parameters. This function can also be used for the Accept-Charset, Accept-Encoding and Accept-Language headers. """ if accept is None: return [] items = [] for item in accept.split(','): params = item.split(';') for i, param in enumerate(params[1:]): param = param.split('=', 1) if param[0].strip() == 'q': try: q = float(param[1]) if not 0 < q <= 1: raise ValueError except (IndexError, ValueError): q = 0 else: item = ';'.join(params[:i+1]) break else: q = 1 if q: item = item.strip() if item: items.append((item, q)) items.sort(lambda i1, i2: cmp(i2[1], i1[1])) return [item[0] for item in items] def simplify_http_accept_header(accept): """Parse an HTTP Accept header (RFC 2616) into a preferred value. The quality factors in the header determine the preference. Possible media-range parameters are allowed, but will be ignored. This function can also be used for the Accept-Charset, Accept-Encoding and Accept-Language headers. This is similar to parse_http_accept_header(accept)[0], but faster. """ if accept is None: return None best_item = accept best_q = 0 for item in accept.split(','): params = item.split(';') item = params.pop(0) for param in params: param = param.split('=', 1) if param[0].strip() == 'q': try: q = float(param[1]) if not 0 < q <= 1: raise ValueError except (IndexError, ValueError): q = 0 break else: q = 1 if q > best_q: item = item.strip() if item: best_item = item if q == 1: break best_q = q return best_item def to_unicode(value): """Convert encoded string to unicode string. Uses get_template_encoding_default() to guess source string encoding. Handles turbogears.i18n.lazystring correctly. """ if isinstance(value, str): # try to make sure we won't get UnicodeDecodeError from the template # by converting all encoded strings to Unicode strings try: value = unicode(value) except UnicodeDecodeError: try: value = unicode(value, get_template_encoding_default()) except UnicodeDecodeError: # fail early raise ValueError("Non-unicode string: %r" % value) return value def to_utf8(value): """Convert a unicode string to utf-8 encoded plain string. Handles turbogears.i18n.lazystring correctly. Does nothing to already encoded string. """ if isinstance(value, str): pass elif hasattr(value, '__unicode__'): value = unicode(value) if isinstance(value, unicode): value = value.encode('utf-8') return value _safe_for_cookie = ''.join(filter(lambda c: c != quote(c) and c not in "$,; \t\f\n\r\v", map(chr, xrange(256)))) def quote_cookie(value): """Escape chars in value that should not be put directly in a cookie.""" return quote(value, _safe_for_cookie) def unquote_cookie(value): """Unescape chars in a cookie value, the reverse of quote_cookie(value).""" return unquote(value) def get_template_encoding_default(engine_name=None): """Return default encoding for template files (Kid, Genshi, etc.).""" if engine_name is None: engine_name = config.get('tg.defaultview', 'kid') return config.get('%s.encoding' % engine_name, config.get('%s.default_encoding' % engine_name, 'utf-8')) _format_mime_types = dict( plain='text/plain', text='text/plain', html='text/html', xhtml = 'text/html', # see note below xml='text/xml', json='application/json') def get_mime_type_for_format(format): """Return default MIME media type for a template format. Note: By default we are serving xhtml as "text/html" instead of the more correct "application/xhtml+xml", since many browsers, particularly MSIE, do not support this. We are assuming that xhtml means XHTML 1.0 here, where this approach is possible. It would be possible to use some kind of content negotiation to deliver a customized content type, but we avoid this because it causes more harm (e.g. with proxies involved) than good. If you want to serve the proper content type (e.g. for XHTML 1.1), set tg.format_mime_types= {'xhtml': 'application/xhtml+xml'}. You can also set a particular content type per controller using the content_type parameter of the expose decorator. For detailed information about this issues, see here: http://www.smackthemouse.com/xhtmlxml, http://schneegans.de/web/xhtml/. """ mime_type = config.get('tg.format_mime_types', {}).get(format) if not mime_type: mime_type = _format_mime_types.get(format, 'text/html') return mime_type def mime_type_has_charset(mime_type): """Return whether the MIME media type supports a charset parameter. Note: According to RFC4627, we do not output a charset parameter for "application/json" (this type always uses a UTF encoding). """ if not mime_type: return False if mime_type.startswith('text/'): return True if mime_type.startswith('application/'): if mime_type.endswith('/xml') or mime_type.endswith('+xml'): return True if mime_type.endswith('/javascript'): return True return False def find_precision(value): """Find precision of some arbitrary value. The main intention for this function is to use it together with turbogears.i18n.format.format_decimal() where one has to inform the precision wanted. So, use it like this: format_decimal(some_number, find_precision(some_number)) """ decimals = '' try: decimals = str(value).split('.', 1)[1] except IndexError: pass return len(decimals) def copy_if_mutable(value, feedback=False): """Make a copy of the value if it is mutable. Returns the value. If feedback is set to true, also returns whether value was mutable as the second element of a tuple. """ if isinstance(value, dict): mutable = True value = value.copy() elif isinstance(value, list): mutable = True value = value[:] else: mutable = False if feedback: return value, mutable else: return value def fixentities(htmltext): """Replace HTML character entities with numerical references. Note: This won't handle CDATA sections properly. """ def repl(matchobj): entity = htmlentitydefs.entitydefs.get(matchobj.group(1).lower()) if not entity: return matchobj.group(0) elif len(entity) == 1: if entity in "&<>'\"": return matchobj.group(0) return "&#%d;" % ord(entity) else: return entity return re.sub("&(\w+);?", repl, htmltext) __all__ = ["Bunch", "DictObj", "DictWrapper", "Enum", "setlike", "get_package_name", "get_model", "load_project_config", "ensure_sequence", "has_arg", "to_kw", "from_kw", "adapt_call", "call_on_stack", "remove_keys", "arg_index", "inject_arg", "inject_args", "add_tg_args", "bind_args", "recursive_update", "combine_contexts", "request_available", "flatten_sequence", "load_class", "parse_http_accept_header", "simplify_http_accept_header", "to_unicode", "to_utf8", "quote_cookie", "unquote_cookie", "get_template_encoding_default", "get_mime_type_for_format", "mime_type_has_charset", "find_precision", "copy_if_mutable", "deprecated"] PK> vturbogears/util.pyc; PMc%@sudZdkZdkZdkZdkZdkZdkZdklZl Z dk l Z l Z l Z dklZdklZlZyeWn ej odklZnXdkZdklZdklZd klZed Zd e fd YZ!d e!fdYZ"e"Z#dZ$de%fdYZ&dZ'dZ(edZ)dZ*dZ+dZ,dZ-ddZ.ddZ/ddZ0ddZ1dZ2dZ3d Z4dd!Z5dd"Z6d#Z7d$Z8d%Z9d&Z:eed'Z;d(Z<d)Z=d*Z>d+Z?d,Z@d-ZAd.ZBd/iCeDd0eEeFeGd1ZHd2ZId3ZJed4ZKe d5d6d7d6d8d9d:d9d;d<d=d>ZLd?ZMd@ZNdAZOePdBZQdCZRd d dDdEddFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddeg%ZSdS(fsThe TurboGears utility module.N(s getargspecs getargvalues(sizipsisliceschain(sisSequenceType(squotesunquote(sSet(srequest(s decorator(sconfigcsd|_SdS(sDecorator which can be used to mark functions as deprecated. It will result in a warning being emmitted when the function is used. Inspired by http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/391367 cs{i odi_nd}yi|_Wntj onXi|_|iii|SdS(NsCall to deprecated function %s.cs-tiidtdd||SdS(Nscategorys stackleveli(swarningsswarnsdecoratesmessagesDeprecationWarningsfuncsargsskwargs(sargsskwargs(sdecoratesfunc(s(build\bdist.win32\egg\turbogears\util.pysnewFunc's ( sdecoratesmessagesfuncs__name__snewFuncs TypeErrors__doc__s__dict__supdate(sfuncsnewFunc(sdecorate(sfuncs(build\bdist.win32\egg\turbogears\util.pysdecorate#s  N(sdecoratesmessage(smessagesdecorate((sdecorates(build\bdist.win32\egg\turbogears\util.pys deprecateds  sBunchcBs2tZdZdZdZeiZdZRS(s5Simple but handy collector of a bunch of named stuff.cCsl|i}|idigi}|D]}|d|||fq*~}d|ii |fSdS(Ns, s%s=%rs%s(%s)( sselfskeysssortsjoinsappends_[1]skeysargss __class__s__name__(sselfskeyss_[1]sargsskey((s(build\bdist.win32\egg\turbogears\util.pys__repr__9s  >cCs2y ||SWntj ot|nXdS(N(sselfsnamesKeyErrorsAttributeError(sselfsname((s(build\bdist.win32\egg\turbogears\util.pys __getattr__?s cCs1y ||=Wntj ot|nXdS(N(sselfsnamesKeyErrorsAttributeError(sselfsname((s(build\bdist.win32\egg\turbogears\util.pys __delattr__Gs ( s__name__s __module__s__doc__s__repr__s __getattr__sdicts __setitem__s __setattr__s __delattr__(((s(build\bdist.win32\egg\turbogears\util.pysBunch6s    sDictObjcBs#tZdZedeZRS(NcOstt|i||dS(N(ssupersDictObjsselfs__init__sargsskw(sselfsargsskw((s(build\bdist.win32\egg\turbogears\util.pys__init__Pss-Use Bunch instead of DictObj and DictWrapper.(s__name__s __module__s__init__s deprecated(((s(build\bdist.win32\egg\turbogears\util.pysDictObjNs c sdtfdY}|dtfdY}tdtgtx@t D]2\}}||}t |||||vscsS(N(senumType(sself(senumType(s(build\bdist.win32\egg\turbogears\util.pyswscCst|iSdS(N(shashsselfs_EnumValue__value(sself((s(build\bdist.win32\egg\turbogears\util.pys__hash__xscCs4|i|ijp tdt|i|iSdS(Ns-Only values from the same enum are comparable(sselfsEnumTypesothersAssertionErrorscmps_EnumValue__value(sselfsother((s(build\bdist.win32\egg\turbogears\util.pys__cmp__zscs|iSdS(N(s constantssmaximumsselfs_EnumValue__value(sself(smaximums constants(s(build\bdist.win32\egg\turbogears\util.pys __invert__scCst|iSdS(N(sboolsselfs_EnumValue__value(sself((s(build\bdist.win32\egg\turbogears\util.pys __nonzero__scst|iSdS(N(sstrsnamessselfs_EnumValue__value(sself(snames(s(build\bdist.win32\egg\turbogears\util.pys__repr__s( s__name__s __module__s __slots__s__init__spropertysValuesEnumTypes__hash__s__cmp__s __invert__s __nonzero__s__repr__((snamessenumTypesmaximums constants(s(build\bdist.win32\egg\turbogears\util.pys EnumValuers    iN(sobjects EnumClasssenumTypes EnumValueslensnamessmaximumsNones constantss enumeratesiseachsvalssetattrstuple( snamess EnumClasssvalsismaximums EnumValueseachs constantssenumType((snamessenumTypesmaximums constantss(build\bdist.win32\egg\turbogears\util.pysEnumXs "   ssetlikecBs tZdZdZdZRS(sSet preserving item order.cCs"||jo|i|ndS(N(sitemsselfsappend(sselfsitem((s(build\bdist.win32\egg\turbogears\util.pysadds cCs"x|D]}|i|qWdS(N(siterablesitemsselfsadd(sselfsiterablesitem((s(build\bdist.win32\egg\turbogears\util.pysadd_alls(s__name__s __module__s__doc__saddsadd_all(((s(build\bdist.win32\egg\turbogears\util.pyssetlikes  cCsQxJtidD]9}|iidotii||}|SqqWdS(s8Get egg-info file with that name in the current project.s./segg-infoN( sosslistdirsdirnameslowersendswithspathsjoinsnamesfname(snamesdirnamesfname((s(build\bdist.win32\egg\turbogears\util.pysget_project_metas cCs"tiidodpdSdS(s5Try to select appropriate project configuration file.ssetup.pysdev.cfgsprod.cfgN(sosspathsexists(((s(build\bdist.win32\egg\turbogears\util.pysget_project_configscCs{|tjo t}ntii| o&dtii|fGHtint }t i d|d|ddS(sTry to update the project settings from the config file specified. If configfile is C{None}, uses L{get_project_config} to locate one. s*Config file %s not found or is not a file.s configfiles modulenames.configN( s configfilesNonesget_project_configsosspathsisfilesabspathssyssexitsget_package_namespackagesconfigs update_config(s configfilespackage((s(build\bdist.win32\egg\turbogears\util.pysload_project_configs    cCstid}|o|Snttdo dtijo?titiidd}ti |}|i d}n't d}|o t|pg}x6|D].}|i}|o |djo|SqqWdS(s:Try to find out the package name of the current directory.spackagesargvs--eggis top_level.txtslocalesN(sconfigsgetspackageshasattrssyssargvsindexs projectnames pkg_resourcessget_distributionseggs _get_metadatas top_levelsget_project_metasfnamesopensrstrip(spackages projectnames top_levelsfnamesegg((s(build\bdist.win32\egg\turbogears\util.pysget_package_names   cCsBtd}|o+tt|ddd!}|iSndS(NsPKG-INFOiii(sget_project_metaspkg_infoslistsopensnamesstrip(spkg_infosname((s(build\bdist.win32\egg\turbogears\util.pysget_project_names cCsPt}| otSnt|hhdg}t|do |iSndS(Nsmodel(sget_package_names package_namesNones __import__spackageshasattrsmodel(s package_namespackage((s(build\bdist.win32\egg\turbogears\util.pys get_models  cCs5|tjogSnt|o|Sn|gSdS(s!Construct a sequence from object.N(sobjsNonesisSequenceType(sobj((s(build\bdist.win32\egg\turbogears\util.pysensure_sequences   ic Cst|ddd\}}t|}tt||t|t||}x|D]\}}|||]s((sfunc(sadd(s(build\bdist.win32\egg\turbogears\util.pysentagle\scst|\}}}}tt|}gi}|D]9}|t | |i |jo||q8q8~}gi}|D]!}|jo||qq~}t||||f|SdS(N(s getargspecsfuncsargnamessvarargsskwargssdefaultsslistsensure_sequencesappends_[1]sdslensindexsaddsargs decoratorsentagle(sfuncsvarargssargnamess_[1]sdefaultsskwargssargsd(sentaglesadd(s(build\bdist.win32\egg\turbogears\util.pysmake_decorator_s P8N(sentaglesmake_decorator(saddsentaglesmake_decorator((saddsentagles(build\bdist.win32\egg\turbogears\util.pys bind_argsZs cCshx]|iD]O\}}t|tot||tot|||q |||| o/tt iddt t |g}qnXWn'tj otid|tSnXt||SdS(sLoad a class from a module in dotted-path notation. E.g.: load_class("package.module.class"). Based on recipe 16.3 from Python Cookbook, 2ed., by Alex Martelli, Anna Martelli Ravenscroft, and David Ascher (O'Reilly Media, 2005) sdottedpath must not be Nones.iis8tg.utils: Could not import %s because exception occurredN(s dottedpathsNonesAssertionErrorssplits splitted_pathsjoins modulenames classnames __import__sglobalsslocalssmodules ValueErrors__name__s ImportErrorsloggings exceptionsgetattr(s dottedpaths modulenamesmodules classnames splitted_path((s(build\bdist.win32\egg\turbogears\util.pys load_classs" "%  cCs|tjogSng}x&|idD]}|id}xt|dD]\}}|idd}|di djo{y=t |d}d|jo djn o t nWnt t fj o d}nXdi||d }PqQqQWd}|o.|i }|o|i||fq@q+q+W|idgi}|D]}||dqb~SdS( s)Parse an HTTP Accept header (RFC 2616) into a sorted list. The quality factors in the header determine the sort order. The values can include possible media-range parameters. This function can also be used for the Accept-Charset, Accept-Encoding and Accept-Language headers. s,s;is=isqcCst|d|dS(Ni(scmpsi2si1(si1si2((s(build\bdist.win32\egg\turbogears\util.pyssN(sacceptsNonesitemsssplitsitemsparamss enumeratesisparamsstripsfloatsqs ValueErrors IndexErrorsjoinsappendssorts_[1](saccepts_[1]sisitemssqsitemsparamssparam((s(build\bdist.win32\egg\turbogears\util.pysparse_http_accept_headers4     cCsK|tjotSn|}d}x|idD]}|id}|id}x|D]}|idd}|di djody=t |d}d|jo djn o t nWnt t fj o d}nXPq\q\Wd}||jo9|i }|o"|}|djoPn|}q?q1q1W|SdS(sParse an HTTP Accept header (RFC 2616) into a preferred value. The quality factors in the header determine the preference. Possible media-range parameters are allowed, but will be ignored. This function can also be used for the Accept-Charset, Accept-Encoding and Accept-Language headers. This is similar to parse_http_accept_header(accept)[0], but faster. is,s;s=isqN(sacceptsNones best_itemsbest_qssplitsitemsparamsspopsparamsstripsfloatsqs ValueErrors IndexError(sacceptsbest_qs best_itemsqsitemsparamssparam((s(build\bdist.win32\egg\turbogears\util.pyssimplify_http_accept_headers:       cCs~t|tofyt|}Wqvtj oCyt|t}Wqrtj otd|qrXqvXn|SdS(sConvert encoded string to unicode string. Uses get_template_encoding_default() to guess source string encoding. Handles turbogears.i18n.lazystring correctly. sNon-unicode string: %rN(s isinstancesvaluesstrsunicodesUnicodeDecodeErrorsget_template_encoding_defaults ValueError(svalue((s(build\bdist.win32\egg\turbogears\util.pys to_unicodescCs_t|ton!t|dot|}nt|to|id}n|SdS(sConvert a unicode string to utf-8 encoded plain string. Handles turbogears.i18n.lazystring correctly. Does nothing to already encoded string. s __unicode__sutf-8N(s isinstancesvaluesstrshasattrsunicodesencode(svalue((s(build\bdist.win32\egg\turbogears\util.pysto_utf8sscCs|t|jo |djS(Ns $,; (scsquote(sc((s(build\bdist.win32\egg\turbogears\util.pys%sicCst|tSdS(sBEscape chars in value that should not be put directly in a cookie.N(squotesvalues_safe_for_cookie(svalue((s(build\bdist.win32\egg\turbogears\util.pys quote_cookie(scCst|SdS(sEUnescape chars in a cookie value, the reverse of quote_cookie(value).N(sunquotesvalue(svalue((s(build\bdist.win32\egg\turbogears\util.pysunquote_cookie-scCsK|tjotidd}ntid|tid|dSdS(s?Return default encoding for template files (Kid, Genshi, etc.).stg.defaultviewskids %s.encodings%s.default_encodingsutf-8N(s engine_namesNonesconfigsget(s engine_name((s(build\bdist.win32\egg\turbogears\util.pysget_template_encoding_default2s   splains text/plainstextshtmls text/htmlsxhtmlsxmlstext/xmlsjsonsapplication/jsoncCsAtidhi|}| oti|d}n|SdS(sReturn default MIME media type for a template format. Note: By default we are serving xhtml as "text/html" instead of the more correct "application/xhtml+xml", since many browsers, particularly MSIE, do not support this. We are assuming that xhtml means XHTML 1.0 here, where this approach is possible. It would be possible to use some kind of content negotiation to deliver a customized content type, but we avoid this because it causes more harm (e.g. with proxies involved) than good. If you want to serve the proper content type (e.g. for XHTML 1.1), set tg.format_mime_types= {'xhtml': 'application/xhtml+xml'}. You can also set a particular content type per controller using the content_type parameter of the expose decorator. For detailed information about this issues, see here: http://www.smackthemouse.com/xhtmlxml, http://schneegans.de/web/xhtml/. stg.format_mime_typess text/htmlN(sconfigsgetsformats mime_types_format_mime_types(sformats mime_type((s(build\bdist.win32\egg\turbogears\util.pysget_mime_type_for_format?s cCs| otSn|idotSn|idoD|idp |idotSn|idotSq|ntSdS(sReturn whether the MIME media type supports a charset parameter. Note: According to RFC4627, we do not output a charset parameter for "application/json" (this type always uses a UTF encoding). stext/s application/s/xmls+xmls /javascriptN(s mime_typesFalses startswithsTruesendswith(s mime_type((s(build\bdist.win32\egg\turbogears\util.pysmime_type_has_charsetXs  cCsJd}y t|iddd}Wntj onXt|SdS(s$Find precision of some arbitrary value. The main intention for this function is to use it together with turbogears.i18n.format.format_decimal() where one has to inform the precision wanted. So, use it like this: format_decimal(some_number, find_precision(some_number)) ss.iN(sdecimalssstrsvaluessplits IndexErrorslen(svaluesdecimals((s(build\bdist.win32\egg\turbogears\util.pysfind_precisionks  cCsjt|tot}|i}n(t|tot}|}nt}|o||fSn|SdS(sMake a copy of the value if it is mutable. Returns the value. If feedback is set to true, also returns whether value was mutable as the second element of a tuple. N( s isinstancesvaluesdictsTruesmutablescopyslistsFalsesfeedback(svaluesfeedbacksmutable((s(build\bdist.win32\egg\turbogears\util.pyscopy_if_mutable}s cCs d}tid||SdS(svReplace HTML character entities with numerical references. Note: This won't handle CDATA sections properly. cCstii|idi}| o|idSnHt|djo0|djo|idSndt|Sn|SdS(Niis&<>'"s&#%d;( shtmlentitydefss entitydefssgetsmatchobjsgroupslowersentityslensord(smatchobjsentity((s(build\bdist.win32\egg\turbogears\util.pysrepls! s&(\w+);?N(sreplsressubshtmltext(shtmltextsrepl((s(build\bdist.win32\egg\turbogears\util.pys fixentitiess s DictWrappersEnumsget_package_names get_modelsload_project_configsensure_sequenceshas_argsto_kwsfrom_kws adapt_calls call_on_stacks remove_keyss arg_indexs inject_args inject_argss add_tg_argss bind_argssrecursive_updatescombine_contextssrequest_availablesflatten_sequences load_classsparse_http_accept_headerssimplify_http_accept_headers to_unicodesto_utf8s quote_cookiesunquote_cookiesget_template_encoding_defaultsget_mime_type_for_formatsmime_type_has_charsetsfind_precisionscopy_if_mutables deprecated(Ts__doc__sosssyssresloggingswarningsshtmlentitydefssinspects getargspecs getargvaluess itertoolssizipsisliceschainsoperatorsisSequenceTypesurllibsquotesunquotessets NameErrorssetssSets pkg_resourcesscherrypysrequeststurbogears.decorators decorators turbogearssconfigsNones deprecatedsdictsBunchsDictObjs DictWrappersEnumslistssetlikesget_project_metasget_project_configsload_project_configsget_package_namesget_project_names get_modelsensure_sequencesto_kwsfrom_kws adapt_calls call_on_stacks remove_keysshas_args arg_indexs inject_args inject_argss inject_calls add_tg_argss bind_argssrecursive_updatescombine_contextssrequest_availablesflatten_sequences load_classsparse_http_accept_headerssimplify_http_accept_headers to_unicodesto_utf8sjoinsfiltersmapschrsxranges_safe_for_cookies quote_cookiesunquote_cookiesget_template_encoding_defaults_format_mime_typessget_mime_type_for_formatsmime_type_has_charsetsfind_precisionsFalsescopy_if_mutables fixentitiess__all__(@sunquotes adapt_callssets arg_indexschainsizipsmime_type_has_charsetsto_utf8sensure_sequencesget_template_encoding_defaultsfind_precisionsto_kwscombine_contextss to_unicodesDictObjscopy_if_mutablesget_project_names__all__sisSequenceTypes call_on_stacks inject_argsEnumsget_project_metasresfrom_kwsget_project_configs getargvaluess inject_callsparse_http_accept_headers remove_keyss getargspecsconfigs_safe_for_cookies fixentitiess_format_mime_typesswarningssquotes inject_argss load_classshtmlentitydefss bind_argsssyss DictWrapperssimplify_http_accept_headersislicesget_package_nameshas_args quote_cookies decoratorsrequest_availablesloggingsunquote_cookiessetlikesrecursive_updates deprecatedsrequests pkg_resourcessget_mime_type_for_formats get_modelsload_project_configs add_tg_argssflatten_sequencesossBunch((s(build\bdist.win32\egg\turbogears\util.pys?s             9                $ (           PKzz> ""turbogears/validators.py"""Convenient validators and converters for data coming in from the web. This module also imports everything from formencode.validators, so all common validation routines are available here.""" import time import re from datetime import datetime import warnings import simplejson from formencode import ForEach from formencode import validators # to disambiguate the Number validator... from formencode.validators import * from formencode.compound import * from formencode.api import Invalid, NoDefault from formencode.schema import Schema from turbojson import jsonify from turbogears import util from turbogears.i18n import format def _(s): return s # dummy # FormEncode should call TG's gettext function with domain = "FormEncode" Validator.gettextargs['domain'] = 'FormEncode' # Validators handling country names and/or languages try: from formencode import national except ImportError: # formencode version < 1.1 national = util.Bunch(USStateProvince=StateProvince, USPhoneNumber=PhoneNumber, USPostalCode=PostalCode) try: national.update(dict( InternationalPhoneNumber=IPhoneNumberValidator)) except NameError: # formencode version < 0.9 pass else: StateProvince = national.USStateProvince PhoneNumber = national.USPhoneNumber PostalCode = national.USPostalCode IPhoneNumberValidator = national.InternationalPhoneNumber class TgFancyValidator(FancyValidator): gettextargs = {'domain': 'TurboGears'} class Money(TgFancyValidator): """Validate a monetary value with currency.""" messages = { 'badFormat': _('Invalid number format'), 'empty': _('Empty values not allowed'), } def __init__(self, allow_empty=None, *args, **kw): if allow_empty is not None: warnings.warn("Use not_empty instead of allow_empty", DeprecationWarning, 2) not_empty = not allow_empty kw["not_empty"] = not_empty super(Money, self).__init__(*args, **kw) def _to_python(self, value, state): """Parse a string and return a float or integer.""" try: return format.parse_decimal(value) except ValueError: raise Invalid(self.message('badFormat', state), value, state) def _from_python(self, value, state): """Return a string using the correct grouping.""" return format.format_currency(value) class Number(TgFancyValidator): """Validate a decimal number.""" def _to_python(self, value, state): """Parse a string and return a float or integer.""" if isinstance(value, basestring): try: value = format.parse_decimal(value) except ValueError: pass return validators.Number.to_python(value, state) def _from_python(self, value, state): """Return a string using the correct grouping.""" dec_places = util.find_precision(value) if dec_places > 0: return format.format_decimal(value, dec_places) else: return format.format_number(value) class DateTimeConverter(TgFancyValidator): """Convert between Python datetime objects and strings.""" messages = { 'badFormat': _('Invalid datetime format'), 'empty': _('Empty values not allowed'), } def __init__(self, format="%Y/%m/%d %H:%M", allow_empty=None, *args, **kwargs): if allow_empty is not None: warnings.warn("Use not_empty instead of allow_empty", DeprecationWarning, 2) not_empty = not allow_empty kwargs["not_empty"] = not_empty super(DateTimeConverter, self).__init__(*args, **kwargs) self.format = format def _to_python(self, value, state): """Parse a string and return a datetime object.""" if value and isinstance(value, datetime): return value else: try: format = self.format if callable(format): format = format() tpl = time.strptime(value, format) except ValueError: raise Invalid(self.message('badFormat', state), value, state) # shoudn't use time.mktime() because it can give OverflowError, # depending on the date (e.g. pre 1970) and underlying C library return datetime(year=tpl.tm_year, month=tpl.tm_mon, day=tpl.tm_mday, hour=tpl.tm_hour, minute=tpl.tm_min, second=tpl.tm_sec) def _from_python(self, value, state): """Return a string representation of a datetime object.""" if not value: return None elif isinstance(value, datetime): # Python stdlib can only handle dates with year greater than 1900 format = self.format if callable(format): format = format() if format is None: format = "%Y-%m-%d" if value.year <= 1900: return strftime_before1900(value, format) else: return value.strftime(format) else: return value # Improved FieldStorageUploadConverter heeding not_empty=False # (see TurboGears ticket #1705, FormEncode bug #1905250) class FieldStorageUploadConverter(TgFancyValidator): messages = { 'notEmpty': _("Filename must not be empty"), } def _to_python(self, value, state=None): try: filename = value.filename except AttributeError: filename = None if not filename and self.not_empty: raise Invalid(self.message('notEmpty', state), value, state) return value # For translated messages that are not wrapped in a Validator.messages # dictionary, we need to reinstate the Turbogears gettext function under # the name "_", with the "TurboGears" domain, so that the TurboGears.mo # file is selected. import turbogears.i18n _ = lambda s: turbogears.i18n.gettext(s, domain='TurboGears') class MultipleSelection(ForEach): """A default validator for SelectionFields with multiple selection.""" if_missing = NoDefault if_empty = [] def to_python(self, value, state=None): try: return super(MultipleSelection, self).to_python(value, state) except Invalid: raise Invalid(_("Please select at least a value"), value, state) class Schema(Schema): """Modified Schema validator for TurboGears. A schema validates a dictionary of values, applying different validators (by key) to the different values. This modified Schema allows fields that do not appear in the fields parameter of your schema, but filters them out from the value dictionary. You might want to set filter_extra_fields to True when you're building a dynamic form with unpredictable keys and need these values. """ filter_extra_fields = True allow_extra_fields = True if_key_missing = None def from_python(self, value, state=None): # The Schema shouldn't do any from_python conversion because # adjust_value already takes care of that for all childs. return value class JSONValidator(TgFancyValidator): """A validator for JSON format.""" def _from_python(self, value, state): return jsonify.encode(value) def _to_python(self, value, state): return simplejson.loads(value) # Auxiliary functions def _findall(text, substr): # Also finds overlaps sites = [] i = 0 while 1: j = text.find(substr, i) if j == -1: break sites.append(j) i = j+1 return sites _illegal_s = re.compile(r"((^|[^%])(%%)*%s)") def strftime_before1900(dt, fmt): """strftime implementation supporting proleptic Gregorian dates before 1900. @see: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/306860 """ if _illegal_s.search(fmt): raise TypeError("This strftime implementation does not handle %s") if dt.year > 1900: return dt.strftime(fmt) year = dt.year # For every non-leap year century, advance by # 6 years to get into the 28-year repeat cycle delta = 2000 - year off = 6*(delta // 100 + delta // 400) year += off # Move to around the year 2000 year = year + ((2000 - year)//28)*28 timetuple = dt.timetuple() s1 = time.strftime(fmt, (year,) + timetuple[1:]) sites1 = _findall(s1, str(year)) s2 = time.strftime(fmt, (year+28,) + timetuple[1:]) sites2 = _findall(s2, str(year+28)) sites = [] for site in sites1: if site in sites2: sites.append(site) s = s1 syear = "%4d" % (dt.year,) for site in sites: s = s[:site] + syear + s[site+4:] return s PK>~c11turbogears/validators.pyc; PMc@s<dZdkZdkZdklZdkZdkZdklZdklZdk Tdk Tdk l Z l Z dklZdklZd klZd klZd Zd eid ssMultipleSelectioncBs&tZdZeZgZedZRS(s@A default validator for SelectionFields with multiple selection.cCsOytt|i||SWn+tj ottd||nXdS(NsPlease select at least a value(ssupersMultipleSelectionsselfs to_pythonsvaluesstatesInvalids_(sselfsvaluesstate((s.build\bdist.win32\egg\turbogears\validators.pys to_pythons(s__name__s __module__s__doc__s NoDefaults if_missingsif_emptysNones to_python(((s.build\bdist.win32\egg\turbogears\validators.pysMultipleSelections sSchemacBs,tZdZeZeZeZedZRS(sModified Schema validator for TurboGears. A schema validates a dictionary of values, applying different validators (by key) to the different values. This modified Schema allows fields that do not appear in the fields parameter of your schema, but filters them out from the value dictionary. You might want to set filter_extra_fields to True when you're building a dynamic form with unpredictable keys and need these values. cCs|SdS(N(svalue(sselfsvaluesstate((s.build\bdist.win32\egg\turbogears\validators.pys from_pythons( s__name__s __module__s__doc__sTruesfilter_extra_fieldssallow_extra_fieldssNonesif_key_missings from_python(((s.build\bdist.win32\egg\turbogears\validators.pysSchemas s JSONValidatorcBs tZdZdZdZRS(sA validator for JSON format.cCsti|SdS(N(sjsonifysencodesvalue(sselfsvaluesstate((s.build\bdist.win32\egg\turbogears\validators.pys _from_pythonscCsti|SdS(N(s simplejsonsloadssvalue(sselfsvaluesstate((s.build\bdist.win32\egg\turbogears\validators.pys _to_pythons(s__name__s __module__s__doc__s _from_pythons _to_python(((s.build\bdist.win32\egg\turbogears\validators.pys JSONValidators  cCs^g}d}xGno?|i||}|djoPn|i||d}qW|SdS(Niii(ssitessistextsfindssubstrsjsappend(stextssubstrsisjssites((s.build\bdist.win32\egg\turbogears\validators.pys_findalls  s((^|[^%])(%%)*%s)cCsti|otdn|idjo|i|Sn|i}d|} d| d| d}||7}|d|dd}|i } t i||f| d} t | t |}t i||df| d}t |t |d}g}x,|D]$} | |jo|i| qqW| } d |if}x(|D] } | | || | d } qTW| Sd S( sstrftime implementation supporting proleptic Gregorian dates before 1900. @see: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/306860 s/This strftime implementation does not handle %siliiidiiis%4diN(s _illegal_sssearchsfmts TypeErrorsdtsyearsstrftimesdeltasoffs timetuplestimess1s_findallsstrssites1ss2ssites2ssitesssitesappendssssyear(sdtsfmtssyearsoffss2syearssitesssites1ssites2sss timetuplesdeltassitess1((s.build\bdist.win32\egg\turbogears\validators.pysstrftime_before1900s4    ! (3s__doc__stimesresdatetimeswarningss simplejsons formencodesForEachs validatorssformencode.validatorssformencode.compoundsformencode.apisInvalids NoDefaultsformencode.schemasSchemas turbojsonsjsonifys turbogearssutilsturbogears.i18nsformats_s Validators gettextargssnationals ImportErrorsBunchs StateProvinces PhoneNumbers PostalCodesupdatesdictsIPhoneNumberValidators NameErrorsUSStateProvinces USPhoneNumbers USPostalCodesInternationalPhoneNumbersFancyValidatorsTgFancyValidatorsMoneysNumbersDateTimeConvertersFieldStorageUploadConvertersMultipleSelections JSONValidators_findallscompiles _illegal_ssstrftime_before1900(s_findalls turbogearssnationalsInvalidsdatetimes validatorssTgFancyValidatorsSchemasFieldStorageUploadConvertersformatsres _illegal_ssDateTimeConverters NoDefaultsIPhoneNumberValidators simplejsonswarningssstrftime_before1900s StateProvincesMultipleSelectionsutils PhoneNumbers PostalCodes_s JSONValidatorsMoneysjsonifysNumbersForEachstime((s.build\bdist.win32\egg\turbogears\validators.pys?sV                    9    PKzz>6$5llturbogears/__init__.py"TurboGears Front-to-Back Web Framework" import warnings import pkg_resources from turbogears import config from turbogears.controllers import expose, flash, validate, redirect, \ error_handler, exception_handler, url from turbogears import controllers, view, database, validators, command, \ i18n, widgets, startup, scheduler from turbogears.release import version as __version__, author as __author__, \ email as __email__, license as __license__, \ copyright as __copyright__ from turbogears.widgets import mochikit from turbogears.widgets import jsi18nwidget from turbogears.config import update_config from turbogears.paginate import paginate from turbogears.startup import start_server # load global symbols for TG extensions (currently only used by tgfastdata) extensions = pkg_resources.iter_entry_points("turbogears.extensions") for entrypoint in extensions: try: extension = entrypoint.load() if hasattr(extension, "tgsymbols"): globals().update(extension.tgsymbols()) except Exception, exception: warnings.warn("Could not load extension %s from %s: %s" % (entrypoint, entrypoint.dist, exception), stacklevel=2) i18n.install() # adds _ (gettext) to builtins namespace __all__ = ["url", "expose", "redirect", "validate", "flash", "error_handler", "exception_handler", "view", "controllers", "update_config", "database", "command", "validators", "mochikit", "widgets", "config", "start_server", "scheduler"] PK>:s turbogears/__init__.pyc; PMc@sdZdkZdkZdklZdklZlZlZl Z l Z l Z l Z dkl Z lZlZlZlZlZlZlZlZdklZlZlZlZlZ dk!l"Z"dk!l#Z#dk$l%Z%d k&l'Z'd k(l)Z)ei*d Z+xe+D]{Z,y:e,i-Z.e/e.d oe0i1e.i2nWqe3j o,Z4ei5d e,e,i6e4fddqXqWei7ddddddddddddddddd d!gZ8dS("s&TurboGears Front-to-Back Web FrameworkN(sconfig(sexposesflashsvalidatesredirects error_handlersexception_handlersurl( s controllerssviewsdatabases validatorsscommandsi18nswidgetssstartups scheduler(sversionsauthorsemailslicenses copyright(smochikit(s jsi18nwidget(s update_config(spaginate(s start_serversturbogears.extensionss tgsymbolss'Could not load extension %s from %s: %ss stacklevelisurlsexposesredirectsvalidatesflashs error_handlersexception_handlersviews controllerss update_configsdatabasescommands validatorssmochikitswidgetssconfigs start_servers scheduler(9s__doc__swarningss pkg_resourcess turbogearssconfigsturbogears.controllerssexposesflashsvalidatesredirects error_handlersexception_handlersurls controllerssviewsdatabases validatorsscommandsi18nswidgetssstartups schedulersturbogears.releasesversions __version__sauthors __author__semails __email__slicenses __license__s copyrights __copyright__sturbogears.widgetssmochikits jsi18nwidgetsturbogears.configs update_configsturbogears.paginatespaginatesturbogears.startups start_serversiter_entry_pointss extensionss entrypointsloads extensionshasattrsglobalssupdates tgsymbolss Exceptions exceptionswarnsdistsinstalls__all__("sexception_handlerspaginatesstartups __email__s error_handlers validatorssredirects__all__sflashs update_configs entrypointsmochikitswidgetss extensionss __version__sconfigs __license__swarningssexposes exceptions __author__s jsi18nwidgets schedulersi18nsvalidates __copyright__s extensions start_serversdatabasesurls pkg_resourcess controllersscommandsview((s,build\bdist.win32\egg\turbogears\__init__.pys?s.   1=%       PKzz>2i!55turbogears/command/base.py"""Commands for the TurboGears command line tool.""" import optparse import sys import os import os.path import glob import pkg_resources import dispatch import configobj import turbogears from turbogears.util import get_model, load_project_config, \ get_project_config, get_package_name from turbogears.identity import SecureObject, from_any_host from turbogears import config, database from sacommand import sacommand sys.path.insert(0, os.getcwd()) no_connection_param = ["help", "list"] no_model_param = ["help"] def silent_os_remove(fname): """Try to remove file 'fname' but mute any error that may happen. Returns True if file was actually removed and False otherwise. """ try: os.remove(fname) return True except os.error: pass return False class CommandWithDB(object): """Base class for commands that need to use the database""" config = None def __init__(self, version): pass def find_config(self): """Chooses the config file, trying to guess whether this is a development or installed project.""" load_project_config(self.config) self.dburi = config.get("sqlobject.dburi", None) if self.dburi and self.dburi.startswith("notrans_"): self.dburi = self.dburi[8:] class SQL(CommandWithDB): """Wrapper command for sqlobject-admin, and some sqlalchemy support. This automatically supplies sqlobject-admin with the database that is found in the config file. Will also supply the model module as appropriate. """ desc = "Run the database provider manager" need_project = True def __init__(self, version): if len(sys.argv) == 1 or sys.argv[1][0] == "-": parser = optparse.OptionParser( usage="%prog sql [command]\n\n" \ "hint: '%prog sql help' will list the sqlobject " \ "commands", version="%prog " + version) parser.add_option("-c", "--config", help="config file", dest="config") options, args = parser.parse_args(sys.argv[1:3]) if not options.config: parser.error("Please provide a valid option or command.") self.config = options.config # get rid of our config option if args: del sys.argv[1] else: del sys.argv[1:3] self.find_config() def run(self): """Executes the sqlobject-admin code.""" if not "--egg" in sys.argv and not turbogears.util.get_project_name(): print "This don't look like a TurboGears project." return else: command = sys.argv[1] if config.get("sqlalchemy.dburi"): try: sacommand(command, sys.argv) except dispatch.interfaces.NoApplicableMethods: sacommand("help", []) return try: from sqlobject.manager import command as socommand except ImportError: print "Error: SQLObject not installed." return if command not in no_connection_param: if self.dburi: print "Using database URI %s" % self.dburi sys.argv.insert(2, self.dburi) sys.argv.insert(2, "-c") else: print ("Database URI not specified in the config file" " (%s).\nPlease be sure it's on the command line." % (self.config or get_project_config())) if command not in no_model_param: if not "--egg" in sys.argv: eggname = glob.glob("*.egg-info") if not eggname or not os.path.exists( os.path.join(eggname[0], "sqlobject.txt")): eggname = self.fix_egginfo(eggname) eggname = eggname[0].replace(".egg-info", "") if not "." in sys.path: sys.path.append(".") pkg_resources.working_set.add_entry(".") sys.argv.insert(2, eggname) sys.argv.insert(2, "--egg") socommand.the_runner.run(sys.argv) def fix_egginfo(self, eggname): """Add egg-info directory if necessary.""" print """ This project seems incomplete. In order to use the sqlobject commands without manually specifying a model, there needs to be an egg-info directory with an appropriate sqlobject.txt file. I can fix this automatically. Would you like me to? """ dofix = raw_input("Enter [y] or n: ") if not dofix or dofix.lower()[0] == 'y': oldargs = sys.argv sys.argv = ["setup.py", "egg_info"] import imp imp.load_module("setup", *imp.find_module("setup", ["."])) sys.argv = oldargs import setuptools package = setuptools.find_packages()[0] eggname = glob.glob("*.egg-info") sqlobjectmeta = open(os.path.join(eggname[0], "sqlobject.txt"), "w") sqlobjectmeta.write("""db_module=%(package)s.model history_dir=$base/%(package)s/sqlobject-history """ % dict(package=package)) else: sys.exit(0) return eggname class Shell(CommandWithDB): """Convenient version of the Python interactive shell. This shell attempts to locate your configuration file and model module so that it can import everything from your model and make it available in the Python shell namespace. """ desc = "Start a Python prompt with your database available" need_project = True def run(self): """Run the shell""" self.find_config() mod = get_model() if mod: locals = mod.__dict__ else: locals = dict(__name__="tg-admin") if config.get("sqlalchemy.dburi"): using_sqlalchemy = True database.get_engine() locals.update(dict(session=database.session, metadata=database.metadata)) else: using_sqlalchemy = False try: # try to use IPython if possible import IPython class CustomIPShell(IPython.iplib.InteractiveShell): def raw_input(self, *args, **kw): try: return IPython.iplib.InteractiveShell.raw_input(self, *args, **kw) # needs decoding (see below)? except EOFError: r = raw_input("Do you wish to commit your " "database changes? [yes]") if not r.lower().startswith("n"): if using_sqlalchemy: self.push("session.flush()") else: self.push("hub.commit()") raise EOFError shell = IPython.Shell.IPShell(user_ns=locals, shell_class=CustomIPShell) shell.mainloop() except ImportError: import code class CustomShell(code.InteractiveConsole): def raw_input(self, *args, **kw): try: import readline except ImportError: pass try: r = code.InteractiveConsole.raw_input(self, *args, **kw) for encoding in (getattr(sys.stdin, 'encoding', None), sys.getdefaultencoding(), 'utf-8', 'latin-1'): if encoding: try: return r.decode(encoding) except UnicodeError: pass return r except EOFError: r = raw_input("Do you wish to commit your " "database changes? [yes]") if not r.lower().startswith("n"): if using_sqlalchemy: self.push("session.flush()") else: self.push("hub.commit()") raise EOFError shell = CustomShell(locals=locals) shell.interact() class ToolboxCommand(CommandWithDB): desc = "Launch the TurboGears Toolbox" def __init__(self, version): self.hostlist = ['127.0.0.1', '::1', '::ffff:127.0.0.1'] parser = optparse.OptionParser( usage="%prog toolbox [options]", version="%prog " + version) parser.add_option("-n", "--no-open", help="don't open browser automatically", dest="noopen", action="store_true", default=False) parser.add_option("-c", "--add-client", help="allow client ip address specified to connect to toolbox" " (can be specified more than once)", dest="host", action="append", default=None) parser.add_option("-p", "--port", help="port to run the Toolbox on", dest="port", default=7654) parser.add_option("--config", help="config file", dest="config", default=self.config or get_project_config()) options, args = parser.parse_args(sys.argv[1:]) self.port = int(options.port) self.noopen = options.noopen self.config = options.config if options.host: self.hostlist = self.hostlist + options.host turbogears.widgets.load_widgets() def openbrowser(self): import webbrowser webbrowser.open("http://localhost:%d" % self.port) def run(self): import cherrypy from turbogears import toolbox # Make sure we have full configuration with every option # in it so other plugins or whatever find what they need # when starting even inside the toolblox conf = get_package_name() conf = conf and "%s.config" % conf or None conf = config.config_obj(configfile=self.config, modulename=conf) if 'global' in conf: config.update({'global': conf['global']}) root = SecureObject(toolbox.Toolbox(), from_any_host(self.hostlist), exclude=['noaccess']) cherrypy.tree.mount(root, "/") # amend some parameters since we are running from the command # line in order to change port, log methods... config.update({'global': { 'server.socket_port': self.port, 'server.webpath': '/', 'server.environment': 'development', 'server.log_to_screen': True, 'autoreload.on': False, 'server.package': 'turbogears.toolbox', 'log_debug_info_filter.on': False, 'identity.failure_url': '/noaccess', 'identity.force_external_redirect': False, 'tg.defaultview': 'kid', 'tg.strict_parameters': False, 'kid.outputformat': 'html default', 'kid.encoding': 'utf-8' }}) if not self.noopen: cherrypy.server.start_with_callback(self.openbrowser) else: cherrypy.server.start() commands = None def main(): """Main command runner. Manages the primary command line arguments.""" # add commands defined by entrypoints commands = {} for entrypoint in pkg_resources.iter_entry_points("turbogears.command"): command = entrypoint.load() commands[entrypoint.name] = (command.desc, entrypoint) def _help(): """Custom help text for tg-admin.""" print """ TurboGears %s command line interface Usage: %s [options] Options: -c CONFIG --config=CONFIG Config file to use -e EGG_SPEC --egg=EGG_SPEC Run command on given Egg Commands:""" % (turbogears.__version__, sys.argv[0]) longest = max([len(key) for key in commands.keys()]) format = "%" + str(longest) + "s %s" commandlist = commands.keys() commandlist.sort() for key in commandlist: print format % (key, commands[key][0]) parser = optparse.OptionParser() parser.allow_interspersed_args = False parser.add_option("-c", "--config", dest="config") parser.add_option("-e", "--egg", dest="egg") parser.print_help = _help options, args = parser.parse_args(sys.argv[1:]) # if command is not found display help if not args or not commands.has_key(args[0]): _help() sys.exit() commandname = args[0] # strip command and any global options from the sys.argv sys.argv = [sys.argv[0]] + args[1:] command = commands[commandname][1] command = command.load() if options.egg: egg = pkg_resources.get_distribution(options.egg) os.chdir(egg.location) if hasattr(command,"need_project"): if not turbogears.util.get_project_name(): print "This command needs to be run from inside a project directory" return elif not options.config and not os.path.isfile(get_project_config()): print """No default config file was found. If it has been renamed use: tg-admin --config= %s""" % commandname return command.config = options.config command = command(turbogears.__version__) command.run() __all__ = ["main"] PK>}wAwAturbogears/command/base.pyc; PMc@sTdZdkZdkZdkZdkZdkZdkZdkZdkZdk Z dk l Z l Z l Z lZdklZlZdk lZlZdklZeiideiddgZdgZd Zd efd YZd efd YZdefdYZdefdYZe Z!dZ"dgZ#dS(s.Commands for the TurboGears command line tool.N(s get_modelsload_project_configsget_project_configsget_package_name(s SecureObjects from_any_host(sconfigsdatabase(s sacommandishelpslistcCs6yti|tSWntij onXtSdS(sTry to remove file 'fname' but mute any error that may happen. Returns True if file was actually removed and False otherwise. N(sossremovesfnamesTrueserrorsFalse(sfname((s0build\bdist.win32\egg\turbogears\command\base.pyssilent_os_removes s CommandWithDBcBs&tZdZeZdZdZRS(s5Base class for commands that need to use the databasecCsdS(N((sselfsversion((s0build\bdist.win32\egg\turbogears\command\base.pys__init__.scCsWt|itidt|_|io|iido|id|_ndS(sdChooses the config file, trying to guess whether this is a development or installed project.ssqlobject.dburisnotrans_iN(sload_project_configsselfsconfigsgetsNonesdburis startswith(sself((s0build\bdist.win32\egg\turbogears\command\base.pys find_config1s  (s__name__s __module__s__doc__sNonesconfigs__init__s find_config(((s0build\bdist.win32\egg\turbogears\command\base.pys CommandWithDB)s  sSQLcBs5tZdZdZeZdZdZdZRS(sWrapper command for sqlobject-admin, and some sqlalchemy support. This automatically supplies sqlobject-admin with the database that is found in the config file. Will also supply the model module as appropriate. s!Run the database provider managercCsttidjptidddjotidddd|}|idd d d d d |itidd!\}}|i o|i dn|i |_ |otid=qtidd5n|idS(Niis-susagesL%prog sql [command] hint: '%prog sql help' will list the sqlobject commandssversions%prog s-cs--configshelps config filesdestsconfigis)Please provide a valid option or command.(slenssyssargvsoptparses OptionParsersversionsparsers add_options parse_argssoptionssargssconfigserrorsselfs find_config(sselfsversionsargssparsersoptions((s0build\bdist.win32\egg\turbogears\command\base.pys__init__Gs.    cCs*dtij otii o dGHdSntid}tidoEyt|tiWn&t i i j otdgnXdSnydk l}Wntj odGHdSnX|tjo]|io9d |iGHtiid |itiid d q+d |iptGHn|tjodtij otid }| p$tiitii|dd o|i|}n|didd}dtij o$tiidtii dntiid |tiid dqn|i!i"tidS(s"Executes the sqlobject-admin code.s--eggs*This don't look like a TurboGears project.Nissqlalchemy.dburishelp(scommandsError: SQLObject not installed.sUsing database URI %sis-cs\Database URI not specified in the config file (%s). Please be sure it's on the command line.s *.egg-infois sqlobject.txts .egg-infoss.(#ssyssargvs turbogearssutilsget_project_namescommandsconfigsgets sacommandsdispatchs interfacessNoApplicableMethodsssqlobject.managers socommands ImportErrorsno_connection_paramsselfsdburisinsertsget_project_configsno_model_paramsglobseggnamesosspathsexistssjoins fix_egginfosreplacesappends pkg_resourcess working_sets add_entrys the_runnersrun(sselfseggnamescommands socommand((s0build\bdist.win32\egg\turbogears\command\base.pysrun]sD"      /cCsdGHtd}| p|iddjoti}ddgt_dk}|id|idd g|t_dk }|i d}t i d }ttii|dd d }|id td|ntid|SdS(s$Add egg-info directory if necessary.s This project seems incomplete. In order to use the sqlobject commands without manually specifying a model, there needs to be an egg-info directory with an appropriate sqlobject.txt file. I can fix this automatically. Would you like me to? sEnter [y] or n: isyssetup.pysegg_infoNssetups.s *.egg-infos sqlobject.txtswsLdb_module=%(package)s.model history_dir=$base/%(package)s/sqlobject-history spackage(s raw_inputsdofixslowerssyssargvsoldargssimps load_modules find_modules setuptoolss find_packagesspackagesglobseggnamesopensosspathsjoins sqlobjectmetaswritesdictsexit(sselfseggnamesimpspackages sqlobjectmetasdofixsoldargss setuptools((s0build\bdist.win32\egg\turbogears\command\base.pys fix_egginfos      " ( s__name__s __module__s__doc__sdescsTrues need_projects__init__sruns fix_egginfo(((s0build\bdist.win32\egg\turbogears\command\base.pysSQL:s   .sShellcBs#tZdZdZeZdZRS(sConvenient version of the Python interactive shell. This shell attempts to locate your configuration file and model module so that it can import everything from your model and make it available in the Python shell namespace. s2Start a Python prompt with your database availablec s1|it}|o |i}ntdd}tido6t t i |i tdt idt intyTdkdiifdY}iid |d |}|iWnTtj oHdkd ifd Y}|d |}|inXdS(s Run the shells__name__stg-adminssqlalchemy.dburissessionsmetadataNs CustomIPShellcstZdZRS(Ncsyiii|||SWnetj oYtd}|i i d o)o|i dqz|i dntnXdS(Ns2Do you wish to commit your database changes? [yes]snssession.flush()s hub.commit()( sIPythonsiplibsInteractiveShells raw_inputsselfsargsskwsEOFErrorsrslowers startswithsusing_sqlalchemyspush(sselfsargsskwsr(susing_sqlalchemysIPython(s0build\bdist.win32\egg\turbogears\command\base.pys raw_inputs (s__name__s __module__s raw_input((sIPythonsusing_sqlalchemy(s0build\bdist.win32\egg\turbogears\command\base.pys CustomIPShellssuser_nss shell_classs CustomShellcstZdZRS(Ncsy dk}Wntj onXyii|||}xat t i dt t i ddfD]8}|o+y|i|SWqtj oqXqfqfW|SWnetj oYtd}|iid o)o|idq|idntnXdS(Nsencodingsutf-8slatin-1s2Do you wish to commit your database changes? [yes]snssession.flush()s hub.commit()(sreadlines ImportErrorscodesInteractiveConsoles raw_inputsselfsargsskwsrsgetattrssyssstdinsNonesgetdefaultencodingsencodingsdecodes UnicodeErrorsEOFErrorslowers startswithsusing_sqlalchemyspush(sselfsargsskwsencodingsrsreadline(scodesusing_sqlalchemy(s0build\bdist.win32\egg\turbogears\command\base.pys raw_inputs* (  (s__name__s __module__s raw_input((scodesusing_sqlalchemy(s0build\bdist.win32\egg\turbogears\command\base.pys CustomShellsslocals(sselfs find_configs get_modelsmods__dict__slocalssdictsconfigsgetsTruesusing_sqlalchemysdatabases get_enginesupdatessessionsmetadatasFalsesIPythonsiplibsInteractiveShells CustomIPShellsShellsIPShellsshellsmainloops ImportErrorscodesInteractiveConsoles CustomShellsinteract( sselfscodes CustomIPShellsshellsusing_sqlalchemys CustomShellsIPythonslocalssmod((scodesusing_sqlalchemysIPythons0build\bdist.win32\egg\turbogears\command\base.pysruns.     "  (s__name__s __module__s__doc__sdescsTrues need_projectsrun(((s0build\bdist.win32\egg\turbogears\command\base.pysShells sToolboxCommandcBs)tZdZdZdZdZRS(NsLaunch the TurboGears Toolboxc CsDdddg|_tidddd|}|idd d d d d dddt|iddd dd ddddt|iddd dd ddd|idd dd dd|i pt |i t i d\}}t|i|_|i|_|i |_ |io|i|i|_ntiidS(Ns 127.0.0.1s::1s::ffff:127.0.0.1susages%prog toolbox [options]sversions%prog s-ns --no-openshelps don't open browser automaticallysdestsnoopensactions store_truesdefaults-cs --add-clientsYallow client ip address specified to connect to toolbox (can be specified more than once)shostsappends-ps--portsport to run the Toolbox onsportis--configs config filesconfigi(sselfshostlistsoptparses OptionParsersversionsparsers add_optionsFalsesNonesconfigsget_project_configs parse_argsssyssargvsoptionssargssintsportsnoopenshosts turbogearsswidgetss load_widgets(sselfsversionsargssparsersoptions((s0build\bdist.win32\egg\turbogears\command\base.pys__init__s,         cCs!dk}|id|idS(Nshttp://localhost:%d(s webbrowsersopensselfsport(sselfs webbrowser((s0build\bdist.win32\egg\turbogears\command\base.pys openbrowser s cCsxdk}dkl}t}|od|pt}tid|id|}d|joti hd|d<nt |i t |i ddg}|ii|dti hdhd |i<d d<d d <d t<dt<dd<dt<dd<dt<dd<dt<dd<dd<<|i o|ii|in|iidS(N(stoolboxs %s.configs configfiles modulenamesglobalsexcludesnoaccesss/sserver.socket_portsserver.webpathsserver.environments developmentsserver.log_to_screens autoreload.onsserver.packagesturbogears.toolboxslog_debug_info_filter.onsidentity.failure_urls /noaccesss identity.force_external_redirectstg.defaultviewskidstg.strict_parametersskid.outputformats html defaults kid.encodingsutf-8(scherrypys turbogearsstoolboxsget_package_namesconfsNonesconfigs config_objsselfsupdates SecureObjectsToolboxs from_any_hostshostlistsrootstreesmountsportsTruesFalsesnoopensserversstart_with_callbacks openbrowsersstart(sselfscherrypysrootsconfstoolbox((s0build\bdist.win32\egg\turbogears\command\base.pysrun$s     (s__name__s __module__sdescs__init__s openbrowsersrun(((s0build\bdist.win32\egg\turbogears\command\base.pysToolboxCommands  c shx9tidD](}|i}|i|f|i Options: -c CONFIG --config=CONFIG Config file to use -e EGG_SPEC --egg=EGG_SPEC Run command on given Egg Commands:is%ss %sN(s turbogearss __version__ssyssargvsmaxsappends_[1]scommandsskeysskeyslenslongestsstrsformats commandlistssort(s_[1]sformats commandlistslongestskey(scommands(s0build\bdist.win32\egg\turbogears\command\base.pys_helpYs 9  s-cs--configsdestsconfigs-es--eggseggiis need_projects<This command needs to be run from inside a project directoryNsYNo default config file was found. If it has been renamed use: tg-admin --config= %s('scommandss pkg_resourcessiter_entry_pointss entrypointsloadscommandsdescsnames_helpsoptparses OptionParsersparsersFalsesallow_interspersed_argss add_options print_helps parse_argsssyssargvsoptionssargsshas_keysexits commandnameseggsget_distributionsosschdirslocationshasattrs turbogearssutilsget_project_namesconfigspathsisfilesget_project_configs __version__srun( scommandssargssparsers commandnames_helpscommands entrypointseggsoptions((scommandss0build\bdist.win32\egg\turbogears\command\base.pysmainQsB        "   smain($s__doc__soptparsessyssossos.pathsglobs pkg_resourcessdispatchs configobjs turbogearssturbogears.utils get_modelsload_project_configsget_project_configsget_package_namesturbogears.identitys SecureObjects from_any_hostsconfigsdatabases sacommandspathsinsertsgetcwdsno_connection_paramsno_model_paramssilent_os_removesobjects CommandWithDBsSQLsShellsToolboxCommandsNonescommandssmains__all__(s configobjsToolboxCommands turbogearssdispatchsno_model_params CommandWithDBs__all__s sacommandssilent_os_removesget_project_configsmainsconfigsno_connection_paramsoptparsesglobssyssShells from_any_hostsget_package_names SecureObjectscommandssdatabases pkg_resourcess get_modelsload_project_configsSQLsos((s0build\bdist.win32\egg\turbogears\command\base.pys?s0             nVQ APK>sNUEUEturbogears/command/i18n.py# test-file: test_command_i18n.py """Command-line user interface for i18n administration.""" import re import glob import os import os.path import atexit import optparse import tempfile from pkg_resources import resource_filename import formencode import kid import turbogears import turbogears.i18n from turbogears import config from turbogears.toolbox.admi18n import pygettext, msgfmt, catalog from turbogears.toolbox.admi18n.catalog import normalize from turbogears.command.base import silent_os_remove from turbogears.util import load_project_config, get_package_name class ProgramError(StandardError): """Signals about a general application error.""" def copy_file(src, dest): if os.path.exists(dest): os.remove(dest) fh = open(src, 'rb') data = fh.read() fh.close() fh = open(dest, 'wb') fh.write(data) fh.close() _str_literal = r"""(?:'((?:[^']|\\')*)'|"((?:[^"]|\\")*)")""" _py_i18n_re = re.compile(r"\b_\s*\(\s*[uU]?[rR]?%s\s*\)" % _str_literal) _js_i18n_re = re.compile(r"\b_\s*\(\s*%s\s*\)" % _str_literal) class InternationalizationTool(object): """Manages i18n data via command-line interface. Contributed to TurboGears by Max Ischenko (http://maxischenko.in.ua). """ desc = "Manage i18n data" need_project = True config = None load_config = True locale_dir = 'locales' domain = 'messages' name = None package = None def __init__(self, version): parser = optparse.OptionParser(usage=""" %prog [options] Available commands: add Creates a message catalog for specified locale collect Scan source files to gather translatable strings in a .pot file merge Sync message catalog in different languages with .pot file compile Compile message catalog (.po -> .mo) create_js_messages Create message catalogs for JS usage clean Delete backups and compiled files """, version="%prog " + version) parser.add_option("-f", "--force", default=False, action="store_true", dest="force_ops", help="Force potentially damaging actions") parser.add_option("-a", "--ascii", default=False, action="store_true", dest="ascii_output", help="Escape non-ascii characters (.py files only)") parser.add_option("-K", "--no-kid-support", default=True, action="store_false", dest="kid_support", help="Do not extract messages from Kid templates") parser.add_option("", "--src-dir", default=None, action="store", dest="source_dir", help="Directory that contains source files") parser.add_option("", "--no-js-support", default=True, action="store_false", dest="js_support", help="Extract messages from js-files.") parser.add_option("", "--js-base-dir", action="store", dest="js_base_dir", default="static/javascript", help="Base directory of javascript files" " for generated message-files.") parser.add_option("-e", "--js-encoding", dest="js_encoding", default="utf-8", metavar="ENCODING", help="Encoding of JavaScript source files (default: UTF-8)") parser.set_defaults(js_support=True) self.parser = parser def load_project_config(self): """Choose the config file. Try to guess whether this is a development or installed project. """ # check whether user specified custom settings if self.load_config: load_project_config(self.config) if config.get("i18n.locale_dir"): self.locale_dir = config.get("i18n.locale_dir") print 'Use %s as a locale directory' % self.locale_dir if config.get('i18n.domain'): self.domain = config.get("i18n.domain") print 'Use %s as a message domain' % self.domain if os.path.exists(self.locale_dir) and \ not os.path.isdir(self.locale_dir): raise ProgramError, ( '%s is not a directory' % self.locale_dir) if not os.path.exists(self.locale_dir): os.makedirs(self.locale_dir) def parse_args(self): return self.parser.parse_args() def run(self): self.load_project_config() options, args = self.parse_args() if not args: self.parser.error("No command specified") self.options = options command, args = args[0], args[1:] if 'collect' == command: self.scan_source_files() elif 'add' == command: self.add_languages(args) elif 'compile' == command: self.compile_message_catalogs() elif 'merge' == command: self.merge_message_catalogs() elif 'clean' == command: self.clean_generated_files() elif 'create_js_messages' == command: self.create_js_messages() else: self.parser.error("Command not recognized") def create_js_messages(self): self.load_project_config() languages = [] # we assume the the structure of messages is always # //LC_MESSAGES ... # to extract the languages known to the app locale_dir_prefix = self.locale_dir.split(os.sep) for fname in self.list_message_catalogs(): languages.append(fname.split(os.sep)[len(locale_dir_prefix):][0]) import turbogears.i18n.utils as utils srcdir = self.options.source_dir or get_package_name().split('.', 1)[0] def list_js_files(): for root, dirs, files in os.walk(srcdir): if os.path.basename(root).lower() in ('cvs', '.svn'): continue for fname in files: name, ext = os.path.splitext(fname) srcfile = os.path.join(root, fname) if ext == '.js': yield srcfile def escape(arg): if "'" in arg: return '"%s"' % arg return "'%s'" % arg for locale in languages: def gl(): return locale utils._get_locale = gl messages = [] for filename in list_js_files(): for key in self.get_strings_in_js(os.path.join(filename))[0]: key = unicode(key) msg = unicode(_(key, locale)) messages.append((key, msg)) # for a final return header = """ if (typeof(MESSAGES) == "undefined") { MESSAGES = {}; } LANG = '%s'; _messages = [ """ % locale footer = """ ]; for(var i in _messages) { MESSAGES[_messages[i][0]] = _messages[i][1]; } """ message_block = u",\n".join(["[%s , %s]" % (escape(msgid), escape(msgstr)) for msgid, msgstr in messages]).encode("utf-8") message_block = message_block + "\n" outfilename = os.path.join(srcdir, self.options.js_base_dir, 'messages-%s.js' % locale) print "Creating message file <%s>." % outfilename mf = open(outfilename, "w") mf.write(header) mf.write(message_block) mf.write(footer) mf.close() def clean_generated_files(self): potfile = self.get_potfile_path() silent_os_remove(potfile.replace('.pot', '.bak')) for fname in self.list_message_catalogs(): silent_os_remove(fname.replace('.po', '.mo')) silent_os_remove(fname.replace('.po', '.back')) def merge_message_catalogs(self): potfile = self.get_potfile_path() catalogs = self.list_message_catalogs() catalog.merge(potfile, catalogs) def compile_message_catalogs(self): for fname in self.list_message_catalogs(): dest = fname.replace('.po','.mo') msgfmt.make(fname, dest) if os.path.exists(dest): print 'Compiled %s OK' % fname else: print 'Compilation of %s failed!' % fname def _copy_file_withcheck(self, sourcefile, targetfile): if not (os.path.exists(targetfile) and not self.options.force_ops): copy_file(sourcefile, targetfile) print 'Copy', sourcefile, 'to', targetfile else: print "File %s exists, use --force to override" % targetfile def _copy_moduletranslation(self, sourcefile, targetdir, language): modulefilename = os.path.basename(sourcefile) if os.path.exists(sourcefile): targetfile = os.path.join(targetdir, modulefilename) self._copy_file_withcheck(sourcefile, targetfile) else: print ("%s translation for language '%s' does not exist" " (file searched '%s').\nPlease consider to contribute" " a translation." % (modulefilename, language, sourcefile)) def add_languages(self, codes): potfile = self.get_potfile_path() if not os.path.isfile(potfile): print "Run 'collect' first to create", potfile return for code in codes: catalog_file = self.get_locale_catalog(code) langdir = os.path.dirname(catalog_file) if not os.path.exists(langdir): os.makedirs(langdir) sourcefile_fe = os.path.join(formencode.api.get_localedir(), code, \ "LC_MESSAGES","FormEncode.mo") self._copy_moduletranslation(sourcefile_fe, langdir, code) basedir_i18n_tg = resource_filename("turbogears.i18n", "data") sourcefile_tg = os.path.join(basedir_i18n_tg, code, \ "LC_MESSAGES", "TurboGears.mo") self._copy_moduletranslation(sourcefile_tg, langdir, code) self._copy_file_withcheck(potfile, catalog_file) def scan_source_files(self): source_files = [] kid_files = [] js_files = [] srcdir = self.options.source_dir or get_package_name().split('.', 1)[0] print 'Scanning source directory', srcdir for root, dirs, files in os.walk(srcdir): if os.path.basename(root).lower() in ('cvs', '.svn'): continue for fname in files: name, ext = os.path.splitext(fname) srcfile = os.path.join(root, fname) if ext == '.py': source_files.append(srcfile) elif ext == '.kid': kid_files.append(srcfile) elif ext == '.js': js_files.append(srcfile) else: pass # do nothing tmp_handle, tmp_potfile = tempfile.mkstemp( '.pot', 'tmp', self.locale_dir) os.close(tmp_handle) potbasename = os.path.basename(tmp_potfile)[:-4] pygettext_options = ['-v', '-d', potbasename, \ '-p', os.path.dirname(tmp_potfile)] if self.options.ascii_output: pygettext_options.insert(0, '-E') pygettext.sys.argv = [''] + pygettext_options + source_files pygettext.main() if not os.path.exists(tmp_potfile): raise ProgramError, 'pygettext failed' atexit.register(silent_os_remove, tmp_potfile) if kid_files and self.options.kid_support: self.scan_kid_files(tmp_potfile, kid_files) if js_files and self.options.js_support: self.scan_js_files(tmp_potfile, js_files) potfile = self.get_potfile_path() if os.path.isfile(potfile): bakfile = potfile.replace('.pot', '.bak') silent_os_remove(bakfile) os.rename(potfile, bakfile) print 'Backup existing file to', bakfile os.rename(tmp_potfile, potfile) print 'Message templates written to', potfile def scan_kid_files(self, potfile, files): messages = [] tags_to_ignore = ['script', 'style'] keys = [] def process_text(is_attribute, k, tag): key = None s = _py_i18n_re.search(k) if s: key = (s.group(1) or s.group(2) or '').strip() elif not is_attribute: # we don't have a kid expression in there, so it is # "just" a text entry - which we want to be translated! import kid.codewriter as cw parts = cw.interpolate(k) if isinstance(parts, list) and len(parts) > 1: print "Warning: Mixed content in tag <%s>: %s" % (tag, k) elif isinstance(parts, basestring): key = k.strip() if key and key not in keys and tag not in tags_to_ignore: messages.append((tag, fname, key)) keys.append(key) for fname in files: print 'Working on', fname tree = None fh = open(fname) try: tree = kid.document(fh) except Exception, e: fh.close() print 'Skip %s: %s' % (fname, e) continue sentinel = None tag = None for ev, el in tree: if ev == kid.parser.START: if not isinstance(el.tag, unicode): # skip comments, processing instructions etc. continue if el.get('lang', None) is not None: # if we have a lang-attribute, ignore this # node AND all it's descendants. sentinel = el continue # set the tag from the current one. tag = re.sub('({[^}]+})?(\w+)', '\\2', el.tag) if tag in ('script', 'style'): # skip JavaScript, CSS etc. sentinel = el continue # process the attribute texts for attrib_text in el.attrib.values(): process_text(True, attrib_text, tag) elif ev == kid.parser.END: if el is sentinel: sentinel = None elif ev == kid.parser.TEXT: if sentinel is None and el.strip(): process_text(False, el, tag) fh.close() fd = open(potfile, 'at+') for tag, fname, text in messages: text = normalize(text.encode('utf-8')) print >> fd, '#: %s:%s' % (fname, tag) print >> fd, 'msgid %s' % text print >> fd, 'msgstr ""' print >> fd, '' fd.close() def get_strings_in_js(self, fname): messages = [] keys = [] fh = open(fname) for i, line in enumerate(fh): s = _js_i18n_re.search(line.decode(self.options.js_encoding)) while s: key = s.group(1) or s.group(2) pos = s.end() if key and key not in keys: messages.append((i + 1, fname, key)) keys.append(key) s = _js_i18n_re.search(line, pos) fh.close() return keys, messages def scan_js_files(self, potfile, files): messages = [] keys = [] for fname in files: print 'Working on', fname k, m = self.get_strings_in_js(fname) keys.extend(k) messages.extend(m) self._write_potfile_entries(potfile, messages) def _write_potfile_entries(self, potfile, messages): if messages: fd = open(potfile, 'at+') for linenumber, fname, text in messages: if text == '': continue text = catalog.normalize(text.encode('utf-8')) fd.write('#: %s:%s\n' % (fname, linenumber)) fd.write('msgid %s\n' % text) fd.write('msgstr ""\n\n') fd.close() def get_potfile_path(self): return os.path.join(self.locale_dir, '%s.pot' % self.domain) def get_locale_catalog(self, code): return os.path.join(self.locale_dir, code, 'LC_MESSAGES', '%s.po' % self.domain) def list_message_catalogs(self): files = [] for name in glob.glob(self.locale_dir + '/*'): if os.path.isdir(name): fname = os.path.join(name, 'LC_MESSAGES', '%s.po' % self.domain) if os.path.isfile(fname): files.append(fname) return files def fix_tzinfo(self, potfile): """Fix tzinfo. In certain enviroments, tzinfo as formatted by strftime() is not utf-8, e.g. Windows XP with Russian MUL. This leads to later error when a program trying to read catalog. """ fh = open(potfile, 'rb') data = fh.read() fh.close() def repl(m): """Remove tzinfo if it breaks encoding.""" tzinfo = m.group(2) try: tzinfo.decode('utf-8') except UnicodeDecodeError: return m.group(1) # cut tz info return m.group(0) # leave unchanged data = re.sub( "(POT-Creation-Date: [\d-]+ [0-9:]+)\+([^\\\\]+)", repl, data) fh = open(potfile, 'wb') fh.write(data) fh.close() def main(): tool = InternationalizationTool() tool.run() if __name__ == '__main__': main() PK>QcVVturbogears/command/i18n.pyc; LMc@sOdZdkZdkZdkZdkZdkZdkZdkZdkl Z dk Z dk Z dk Z dk Z dk lZdklZlZlZdklZdklZdklZlZdefd YZd Zd Zeid eZeid eZ de!fdYZ"dZ#e$djo e#ndS(s4Command-line user interface for i18n administration.N(sresource_filename(sconfig(s pygettextsmsgfmtscatalog(s normalize(ssilent_os_remove(sload_project_configsget_package_names ProgramErrorcBstZdZRS(s*Signals about a general application error.(s__name__s __module__s__doc__(((s0build\bdist.win32\egg\turbogears\command\i18n.pys ProgramErrors cCsstii|oti|nt|d}|i}|i t|d}|i ||i dS(Nsrbswb( sosspathsexistssdestsremovesopenssrcsfhsreadsdatascloseswrite(ssrcsdestsdatasfh((s0build\bdist.win32\egg\turbogears\command\i18n.pys copy_files   s'(?:'((?:[^']|\\')*)'|"((?:[^"]|\\")*)")s\b_\s*\(\s*[uU]?[rR]?%s\s*\)s\b_\s*\(\s*%s\s*\)sInternationalizationToolcBstZdZdZeZeZeZdZ dZ eZ eZ dZ dZdZdZdZd Zd Zd Zd Zd ZdZdZdZdZdZdZdZdZdZdZ RS(s~Manages i18n data via command-line interface. Contributed to TurboGears by Max Ischenko (http://maxischenko.in.ua). sManage i18n dataslocalessmessagesc CsQtidddd|}|idddtdd d d d d |idddtdd d dd d|idddtddd dd d|idddtddd dd d|idddtddd dd d|iddddd d dd!d d"|id#d$d d%dd&d'd(d d)|idt||_dS(*Nsusages %prog [options] Available commands: add Creates a message catalog for specified locale collect Scan source files to gather translatable strings in a .pot file merge Sync message catalog in different languages with .pot file compile Compile message catalog (.po -> .mo) create_js_messages Create message catalogs for JS usage clean Delete backups and compiled files sversions%prog s-fs--forcesdefaultsactions store_truesdests force_opsshelps"Force potentially damaging actionss-as--asciis ascii_outputs,Escape non-ascii characters (.py files only)s-Ks--no-kid-supports store_falses kid_supports*Do not extract messages from Kid templatesss --src-dirsstores source_dirs$Directory that contains source filess--no-js-supports js_supportsExtract messages from js-files.s --js-base-dirs js_base_dirsstatic/javascripts?Base directory of javascript files for generated message-files.s-es --js-encodings js_encodingsutf-8smetavarsENCODINGs4Encoding of JavaScript source files (default: UTF-8)( soptparses OptionParsersversionsparsers add_optionsFalsesTruesNones set_defaultssself(sselfsversionsparser((s0build\bdist.win32\egg\turbogears\command\i18n.pys__init__>s4                cCs|iot|intido"tid|_d|iGHntido"tid|_d|iGHntii |iotii |i ot d|intii |i oti |indS(skChoose the config file. Try to guess whether this is a development or installed project. si18n.locale_dirsUse %s as a locale directorys i18n.domainsUse %s as a message domains%s is not a directoryN( sselfs load_configsload_project_configsconfigsgets locale_dirsdomainsosspathsexistssisdirs ProgramErrorsmakedirs(sself((s0build\bdist.win32\egg\turbogears\command\i18n.pysload_project_configds -cCs|iiSdS(N(sselfsparsers parse_args(sself((s0build\bdist.win32\egg\turbogears\command\i18n.pys parse_args~scCs|i|i\}}| o|iidn||_|d|df\}}d|jo|ind|jo|i |n}d|jo|i nbd|jo|i nGd|jo|i n,d |jo|i n|iid dS( NsNo command specifiediiscollectsaddscompilesmergescleanscreate_js_messagessCommand not recognized(sselfsload_project_configs parse_argssoptionssargssparserserrorscommandsscan_source_filess add_languagesscompile_message_catalogssmerge_message_catalogssclean_generated_filesscreate_js_messages(sselfsargsscommandsoptions((s0build\bdist.win32\egg\turbogears\command\i18n.pysruns&        c s)|ig} |iiti}x;|iD]-} | i | itit |dq2Wdk i i}|iiptidddd}d}xu| D]md}||_g}xo|D]d} x[|itii| dD]:}t|}tt|} |i || fqWqWd}d}d igi }|D],\} }|d || ||fqk~i&d }|d }tii|ii(d }d|GHt*|d}|i,||i,||i,||i-qWdS(Nis.ic#sxtiD]\}}}tii|iddfjoqnxP|D]H}tii |\}}tii ||}|djo|VqRqRWqWdS(Nscvss.svns.js(sosswalkssrcdirsrootsdirssfilesspathsbasenameslowersfnamessplitextsnamesextsjoinssrcfile(sdirssfilessnamessrcfilesextsfnamesroot(ssrcdir(s0build\bdist.win32\egg\turbogears\command\i18n.pys list_js_filess% cCs%d|jo d|Snd|SdS(Ns's"%s"s'%s'(sarg(sarg((s0build\bdist.win32\egg\turbogears\command\i18n.pysescapes  csSdS(N(slocale((slocale(s0build\bdist.win32\egg\turbogears\command\i18n.pysglssY if (typeof(MESSAGES) == "undefined") { MESSAGES = {}; } LANG = '%s'; _messages = [ s^ ]; for(var i in _messages) { MESSAGES[_messages[i][0]] = _messages[i][1]; } u, s [%s , %s]sutf-8s smessages-%s.jssCreating message file <%s>.sw(.sselfsload_project_configs languagess locale_dirssplitsosssepslocale_dir_prefixslist_message_catalogssfnamesappendslensturbogears.i18n.utilssi18nsutilssoptionss source_dirsget_package_namessrcdirs list_js_filessescapeslocalesgls _get_localesmessagessfilenamesget_strings_in_jsspathsjoinskeysunicodes_smsgsheadersfooters_[1]smsgidsmsgstrsencodes message_blocks js_base_dirs outfilenamesopensmfswritesclose(sselfslocalesutilss list_js_filessheadersescapesglsmsgstrs outfilenamesmsgidsfilenames languagessfnamesmsgssrcdirslocale_dir_prefixskeysmfsfootersmessagess message_blocks_[1]((slocalessrcdirs0build\bdist.win32\egg\turbogears\command\i18n.pyscreate_js_messagessD  +&       U      cCsi|i}t|iddx@|iD]2}t|iddt|iddq/WdS(Ns.pots.baks.pos.mos.back(sselfsget_potfile_pathspotfilessilent_os_removesreplaceslist_message_catalogssfname(sselfspotfilesfname((s0build\bdist.win32\egg\turbogears\command\i18n.pysclean_generated_filess   cCs,|i}|i}ti||dS(N(sselfsget_potfile_pathspotfileslist_message_catalogsscatalogsscatalogsmerge(sselfspotfilescatalogs((s0build\bdist.win32\egg\turbogears\command\i18n.pysmerge_message_catalogss  cCsfx_|iD]Q}|idd}ti||tii |o d|GHq d|GHq WdS(Ns.pos.mosCompiled %s OKsCompilation of %s failed!( sselfslist_message_catalogssfnamesreplacesdestsmsgfmtsmakesosspathsexists(sselfsdestsfname((s0build\bdist.win32\egg\turbogears\command\i18n.pyscompile_message_catalogss  cCsQtii|o |ii o"t||dG|GdG|GHn d|GHdS(NsCopystos'File %s exists, use --force to override( sosspathsexistss targetfilesselfsoptionss force_opss copy_files sourcefile(sselfs sourcefiles targetfile((s0build\bdist.win32\egg\turbogears\command\i18n.pys_copy_file_withchecks" cCsdtii|}tii|o)tii||}|i ||nd|||fGHdS(Nsr%s translation for language '%s' does not exist (file searched '%s'). Please consider to contribute a translation.( sosspathsbasenames sourcefilesmodulefilenamesexistssjoins targetdirs targetfilesselfs_copy_file_withcheckslanguage(sselfs sourcefiles targetdirslanguagesmodulefilenames targetfile((s0build\bdist.win32\egg\turbogears\command\i18n.pys_copy_moduletranslations c Cs|i}tii| odG|GHdSnx|D]}|i|}tii |}tii | oti |ntiitii|dd}|i|||tdd}tii||dd}|i||||i||q8WdS(NsRun 'collect' first to creates LC_MESSAGESs FormEncode.mosturbogears.i18nsdatas TurboGears.mo(sselfsget_potfile_pathspotfilesosspathsisfilescodesscodesget_locale_catalogs catalog_filesdirnameslangdirsexistssmakedirssjoins formencodesapis get_localedirs sourcefile_fes_copy_moduletranslationsresource_filenamesbasedir_i18n_tgs sourcefile_tgs_copy_file_withcheck( sselfscodesspotfileslangdirs sourcefile_tgscodes sourcefile_fesbasedir_i18n_tgs catalog_file((s0build\bdist.win32\egg\turbogears\command\i18n.pys add_languagess$    cCsg} g} g}|iiptiddd} dG| GHxt i | D]\}} }t ii|iddfjoqQnx|D]}t ii|\} }t ii||}|djo| i|q|djo| i|q|d jo|i|qqWqQWtid d |i\}}t i|t ii|d }d d|dt ii|g}|ii!o|i"ddndg|| t#i$_%t#i&t ii'| o t(dnt)i*t+|| o |ii,o|i-|| n|o |ii.o|i/||n|i0}t ii2|o9|i3d d}t+|t i5||dG|GHnt i5||dG|GHdS(Ns.iisScanning source directoryscvss.svns.pys.kids.jss.potstmpis-vs-ds-ps-Esspygettext faileds.baksBackup existing file tosMessage templates written to(6s source_filess kid_filessjs_filessselfsoptionss source_dirsget_package_namessplitssrcdirsosswalksrootsdirssfilesspathsbasenameslowersfnamessplitextsnamesextsjoinssrcfilesappendstempfilesmkstemps locale_dirs tmp_handles tmp_potfilescloses potbasenamesdirnamespygettext_optionss ascii_outputsinserts pygettextssyssargvsmainsexistss ProgramErrorsatexitsregisterssilent_os_removes kid_supportsscan_kid_filess js_supports scan_js_filessget_potfile_pathspotfilesisfilesreplacesbakfilesrename(sselfsfilessroots tmp_handlespotfilessrcfilespygettext_optionssextsfnames source_filesssrcdirs kid_filessdirssnames tmp_potfilesjs_filess potbasenamesbakfile((s0build\bdist.win32\egg\turbogears\command\i18n.pysscan_source_filessV& %    !      c s|gddggd}x|D]dGGHt}t} yt i | }Wn1t j o%} | id| fGHq4nXt}t}xA|D]9\}}|t iijot|it oqn|idttj o |}qntidd|i}|ddfjo |}qnx|iiD]}|t||qWWq|t iijo||jo t}qq|t iijo2|tjo |i o|t!||qqqW| iq4Wt|d } xbD]Z\}} t%| i&d } | d |fIJ| d | IJ| d IJ| dIJqW| idS(Nsscriptsstylecst}ti|}|o0|idp|idpdi}n~| oudk i }|i |}t|tot|djod||fGHqt|to|i}qn|o|jo |jo'i||fi|ndS(Niiss&Warning: Mixed content in tag <%s>: %s(sNoneskeys _py_i18n_ressearchsksssgroupsstrips is_attributeskid.codewriters codewriterscws interpolatespartss isinstanceslistslenstags basestringskeysstags_to_ignoresmessagessappendsfname(s is_attributeskstagspartsssskeyscw(stags_to_ignoresmessagesskeyssfname(s0build\bdist.win32\egg\turbogears\command\i18n.pys process_textDs0 #!s Working ons Skip %s: %sslangs({[^}]+})?(\w+)s\2sat+sutf-8s#: %s:%ssmsgid %ss msgstr ""s('smessagesstags_to_ignoreskeyss process_textsfilessfnamesNonestreesopensfhskidsdocuments ExceptionsesclosessentinelstagsevselsparsersSTARTs isinstancesunicodesgetsressubsattribsvaluess attrib_textsTruesENDsTEXTsstripsFalsespotfilesfdstexts normalizesencode(sselfspotfilesfilesselsmessagesstagssentinelsevsfnamestextskeyssfdsfhses process_textstreestags_to_ignores attrib_text((smessagessfnameskeysstags_to_ignores0build\bdist.win32\egg\turbogears\command\i18n.pysscan_kid_files?s`       c Csg}g}t|}xt|D]\}} ti | i |i i }x|o|idp |id}|i}|o ||jo+|i|d||f|i|nti | |}qRWq%W|i||fSdS(Nii(smessagesskeyssopensfnamesfhs enumeratesislines _js_i18n_ressearchsdecodesselfsoptionss js_encodingsssgroupskeysendspossappendsclose( sselfsfnameskeyskeyssmessagesspossisssfhsline((s0build\bdist.win32\egg\turbogears\command\i18n.pysget_strings_in_jss     cCsig}g}xF|D]>}dG|GH|i|\}}|i||i|qW|i ||dS(Ns Working on( smessagesskeyssfilessfnamesselfsget_strings_in_jssksmsextends_write_potfile_entriesspotfile(sselfspotfilesfilesskeyssmsmessagessfnamesk((s0build\bdist.win32\egg\turbogears\command\i18n.pys scan_js_filess  cCs|ot|d}xx|D]p\}}}|djoqnti|i d}|i d||f|i d||i dqW|i ndS(Nsat+ssutf-8s #: %s:%s s msgid %s s msgstr "" ( smessagessopenspotfilesfds linenumbersfnamestextscatalogs normalizesencodeswritesclose(sselfspotfilesmessagesstextsfdsfnames linenumber((s0build\bdist.win32\egg\turbogears\command\i18n.pys_write_potfile_entriess cCs!tii|id|iSdS(Ns%s.pot(sosspathsjoinsselfs locale_dirsdomain(sself((s0build\bdist.win32\egg\turbogears\command\i18n.pysget_potfile_pathscCs'tii|i|dd|iSdS(Ns LC_MESSAGESs%s.po(sosspathsjoinsselfs locale_dirscodesdomain(sselfscode((s0build\bdist.win32\egg\turbogears\command\i18n.pysget_locale_catalogscCsg}xxti|idD]`}tii|oGtii|dd|i }tii |o|i |q}qqW|SdS(Ns/*s LC_MESSAGESs%s.po( sfilessglobsselfs locale_dirsnamesosspathsisdirsjoinsdomainsfnamesisfilesappend(sselfsfilessnamesfname((s0build\bdist.win32\egg\turbogears\command\i18n.pyslist_message_catalogsscCsmt|d}|i}|id}tid||}t|d}|i ||idS(sFix tzinfo. In certain enviroments, tzinfo as formatted by strftime() is not utf-8, e.g. Windows XP with Russian MUL. This leads to later error when a program trying to read catalog. srbcCsT|id}y|idWn tj o|idSnX|idSdS(s$Remove tzinfo if it breaks encoding.isutf-8iiN(smsgroupstzinfosdecodesUnicodeDecodeError(smstzinfo((s0build\bdist.win32\egg\turbogears\command\i18n.pysreplss-(POT-Creation-Date: [\d-]+ [0-9:]+)\+([^\\]+)swbN( sopenspotfilesfhsreadsdatasclosesreplsressubswrite(sselfspotfilesdatasreplsfh((s0build\bdist.win32\egg\turbogears\command\i18n.pys fix_tzinfos    (!s__name__s __module__s__doc__sdescsTrues need_projectsNonesconfigs load_configs locale_dirsdomainsnamespackages__init__sload_project_configs parse_argssrunscreate_js_messagessclean_generated_filessmerge_message_catalogsscompile_message_catalogss_copy_file_withchecks_copy_moduletranslations add_languagessscan_source_filessscan_kid_filessget_strings_in_jss scan_js_filess_write_potfile_entriessget_potfile_pathsget_locale_catalogslist_message_catalogss fix_tzinfo(((s0build\bdist.win32\egg\turbogears\command\i18n.pysInternationalizationTool-s:  &    >     . F    cCst}|idS(N(sInternationalizationToolstoolsrun(stool((s0build\bdist.win32\egg\turbogears\command\i18n.pysmains s__main__(%s__doc__sresglobsossos.pathsatexitsoptparsestempfiles pkg_resourcessresource_filenames formencodeskids turbogearssturbogears.i18nsconfigsturbogears.toolbox.admi18ns pygettextsmsgfmtscatalogs"turbogears.toolbox.admi18n.catalogs normalizesturbogears.command.basessilent_os_removesturbogears.utilsload_project_configsget_package_names StandardErrors ProgramErrors copy_files _str_literalscompiles _py_i18n_res _js_i18n_resobjectsInternationalizationToolsmains__name__(s turbogearssresource_filenames _py_i18n_resatexits _js_i18n_res normalizes formencodestempfilesressilent_os_removesmainsconfigsmsgfmts _str_literalsoptparses copy_filesglobscatalogsget_package_nameskidsInternationalizationTools pygettexts ProgramErrorsload_project_configsos((s0build\bdist.win32\egg\turbogears\command\i18n.pys?s6                  PKzz>i-2 2 turbogears/command/info.py"""Commands for listing TurboGears default and extension packages info""" try: from email.parser import Parser except ImportError: # Python < 2.5 from email.Parser import Parser import pkg_resources entrypoints = {"tg-admin Commands" : "turbogears.command", "Template Engines" : "python.templating.engines", "Widget Packages" : "turbogears.widgets", "TurboGears Extensions" : "turbogears.extensions", "Identity Providers" : "turbogears.identity.provider", "Visit Managers" : "turbogears.visit.manager", "Toolbox Gadgets" : "turbogears.toolboxcommand"} parsestr = Parser().parsestr def retrieve_pkg_info(distribution): """Retrieve parsed package info from distribution.""" return parsestr(distribution.get_metadata('PKG-INFO')) def retrieve_url(distribution): """Retrieve URL from distribution.""" try: info = retrieve_pkg_info(distribution) except Exception: url = None else: url = info['Home-page'] or info['Url'] or info['Download-Url'] return url def add_link(distribution): """Add link to distribution.""" info = str(distribution) url = retrieve_url(distribution) if url: info = str(info).split(None, 1) info[0] = '%s' % (url, info[0]) info = ' '.join(info) return info def retrieve_info(with_links=False): """Retrieve default and extension packages info.""" format = with_links and add_link or str # get default packages packages = [format(pkg) for pkg in pkg_resources.require("Turbogears")] # get extension packages plugins = {} for name, pointname in entrypoints.items(): plugins[name] = ["%s (%s)" % (entrypoint.name, format(entrypoint.dist)) for entrypoint in pkg_resources.iter_entry_points(pointname)] return packages, plugins class InfoCommand: """Shows version info for debugging.""" desc = "Show version info" def __init__(self,*args, **kwargs): pass def run(self): print """TurboGears Complete Version Information TurboGears requires: """ packages, plugins = retrieve_info() for p in packages: print '*', p for name, pluginlist in plugins.items(): print "\n", name, "\n" for plugin in pluginlist: print '*', plugin PK>turbogears/command/info.pyc; PMc@sdZydklZWn ej odklZnXdkZhdd<dd<dd<d d <d d <d d<dd%sis N(sstrs distributionsinfos retrieve_urlsurlssplitsNonesjoin(s distributionsinfosurl((s0build\bdist.win32\egg\turbogears\command\info.pysadd_link$s  c Cs|otpt}gi}tidD]}|||q+~}h}xdt i D]V\}}gi}ti|D]&}|d|i ||ifq~||TurboGears Complete Version Information TurboGears requires: s*s (s retrieve_infospackagesspluginsspsitemssnames pluginlistsplugin(sselfs pluginlistsnamespluginspspluginsspackages((s0build\bdist.win32\egg\turbogears\command\info.pysrunDs   (s__name__s __module__s__doc__sdescs__init__srun(((s0build\bdist.win32\egg\turbogears\command\info.pys InfoCommand<s  (s__doc__s email.parsersParsers ImportErrors email.Parsers pkg_resourcess entrypointssparsestrsretrieve_pkg_infos retrieve_urlsadd_linksFalses retrieve_infos InfoCommand( s entrypointssparsestrsParsers InfoCommands pkg_resourcessretrieve_pkg_infosadd_links retrieve_urls retrieve_info((s0build\bdist.win32\egg\turbogears\command\info.pys?s E   PKzz>m{;{; turbogears/command/quickstart.py"""Quickstart command to generate a new project. Quickstart takes the files from turbogears.quickstart and processes them to produce a new, ready-to-run project. """ import pkg_resources import re import os import os.path import shutil import stat import optparse import sys import turbogears from paste.script import templates, create_distro try: set except NameError: # Python 2.3 from sets import Set as set beginning_letter = re.compile(r"^[^a-z]*") valid_only = re.compile(r"[^a-z0-9_]") class TGTemplate(templates.Template): def run(self, command, output_dirs, vars): vars.setdefault('einame', vars['project'].replace('-', '_')) vars.setdefault('turbogearsversion', pkg_resources.get_distribution('turbogears').version) vars.setdefault('sys_executable', os.path.normpath(sys.executable)) # define version-compatible decorator syntax if sys.version_info >= (2, 4): vars['b'] = '@' vars['e'] = '' else: vars['b'] = '[' vars['e'] = ']' super(TGTemplate, self).run(command, output_dirs, vars) class BaseTemplate(TGTemplate): egg_plugins = ["TurboGears"] _template_dir = pkg_resources.resource_filename( "turbogears.qstemplates", "qsbase" ) summary = "tg base template" use_cheetah = True class TurbogearsTemplate(TGTemplate): required_templates = ["tgbase"] _template_dir = pkg_resources.resource_filename( "turbogears.qstemplates", "quickstart") summary = "web framework" use_cheetah = True class TGBig(TGTemplate): required_templates = ["turbogears"] _template_dir = pkg_resources.resource_filename( "turbogears.qstemplates", "quickstartbig") summary = "For more complex projects" use_cheetah = True def post(self, command, output_dir, vars): packagedir = os.path.join(output_dir, vars["package"]) controllersdir = os.path.join(packagedir, "controllers") controllersfile = os.path.join(packagedir, "controllers.py") rootfile = os.path.join(controllersdir, "root.py") if os.path.exists(controllersdir) and \ os.path.exists(controllersfile): controllerstext = open(controllersfile).read() roottext = open(rootfile).read() from paste.script.copydir import query_interactive thesame = controllerstext == roottext if not thesame: print "\nYou seem to be upgrading from a smaller quickstart." print "There is currently a controllers package and a" print "controllers module, which would get confusing." if not command.simulate and (controllerstext == roottext or query_interactive(controllersfile, rootfile, controllerstext, roottext, False)): shutil.copyfile(controllersfile, rootfile) try: if not os.path.exists(os.path.join(os.path.dirname( os.path.abspath(controllersfile)), '.svn')): raise OSError command.run_command('svn', 'revert', controllersfile) command.run_command('svn', 'delete', controllersfile) except OSError: os.unlink(controllersfile) controllerspyc = controllersfile + "c" if os.path.exists(controllerspyc): os.unlink(controllerspyc) class TGWidgetTemplate(TGTemplate): required_templates = ["tgbase"] _template_dir = pkg_resources.resource_filename( "turbogears.qstemplates", "widget") summary = "TurboGears widget projects" def get_requirement(name, pkg=None): dist = pkg_resources.get_distribution("TurboGears") for r in set(dist.requires((name,))) - set(dist.requires()): if r.project_name.lower() == (pkg or name): return r raise ValueError("Did not find matching %s requirement" " in the TurboGears setup.py:extras_require." % name) class quickstart: "Implementation of quickstart." desc = "Create a new TurboGears project" name = None package = None templates = "turbogears" svn_repository = None sqlalchemy = False sqlobject = False elixir = False identity = False def __init__(self, version): parser = optparse.OptionParser( usage="%prog quickstart [options] [project name]", version="%prog " + version) parser.add_option("-s", "--sqlalchemy", help="use SQLAlchemy instead of SQLObject", action="store_true", dest="sqlalchemy", default = False) parser.add_option("-e", "--elixir", help="use SQLAlchemy Elixir instead of SQLObject", action="store_true", dest="elixir", default = False) parser.add_option("-o", "--sqlobject", help="use SQLObject instead of SQLAlchemy", action="store_true", dest="sqlobject", default = False) parser.add_option("-i", "--identity", help="provide Identity support", action="store_true", dest="identity", default = False) parser.add_option("-p", "--package", help="package name for the code", dest="package") parser.add_option("-t", "--templates", help="user specific templates", dest="templates", default = self.templates) parser.add_option("-r", "--svn-repository", metavar="REPOS", help="create project in given SVN repository", dest="svn_repository", default = self.svn_repository) parser.add_option("--dry-run", help="dry run (don't actually do anything)", action="store_true", dest="dry_run") options, args = parser.parse_args() self.__dict__.update(options.__dict__) if not True in [self.elixir, self.sqlalchemy, self.sqlobject]: self.sqlobject = True if self.elixir: self.sqlalchemy = True if args: self.name = args[0] self.turbogearsversion = version def run(self): "Quickstarts the new project." while not self.name: self.name = raw_input("Enter project name: ") while not self.package: package = self.name.lower() package = beginning_letter.sub("", package) package = valid_only.sub("", package) self.package = raw_input("Enter package name [%s]: " % package) if not self.package: self.package = package doidentity = self.identity while not doidentity: doidentity = raw_input("Do you need Identity " "(usernames/passwords) in this project? [no] ") doidentity = doidentity.lower() if not doidentity or doidentity.startswith('n'): self.identity="none" break if doidentity.startswith("y"): doidentity = True break print "Please enter y(es) or n(o)." doidentity = None if doidentity is True: if self.sqlalchemy or self.elixir: self.identity = "sqlalchemy" else: self.identity = "sqlobject" self.name = pkg_resources.safe_name(self.name) env = pkg_resources.Environment() if self.name.lower() in env: print 'The name "%s" is already in use by' % self.name, for dist in env[self.name]: print dist return import imp try: if imp.find_module(self.package): print 'The package name "%s" is already in use' % self.package return except ImportError: pass if os.path.exists(self.name): print 'A directory called "%s" already exists. Exiting.' % self.name return command = create_distro.CreateDistroCommand("quickstart") cmd_args = [] for template in self.templates.split(" "): cmd_args.append("--template=%s" % template) if self.svn_repository: cmd_args.append("--svn-repository=%s" % self.svn_repository) if self.dry_run: cmd_args.append("--simulate") cmd_args.append("-q") cmd_args.append(self.name) cmd_args.append("sqlalchemy=%s" % self.sqlalchemy) cmd_args.append("elixir=%s" % self.elixir) cmd_args.append("sqlobject=%s" % self.sqlobject) cmd_args.append("identity=%s" % self.identity) cmd_args.append("package=%s" % self.package) # set the exact ORM-version for the proper requirements # it's extracted from our own requirements, so looking # them up must be in sync (there must be the extras_require named sqlobject/sqlalchemy) if self.sqlobject: sqlobjectversion = str(get_requirement('sqlobject')) cmd_args.append("sqlobjectversion=%s" % sqlobjectversion) if self.sqlalchemy: sqlalchemyversion = str(get_requirement('sqlalchemy')) cmd_args.append("sqlalchemyversion=%s" % sqlalchemyversion) if self.elixir: elixirversion = str(get_requirement('future', 'elixir')) cmd_args.append("elixirversion=%s" % elixirversion) command.run(cmd_args) if not self.dry_run: os.chdir(self.name) if self.sqlobject: # Create the SQLObject history directory only when needed. # With paste.script it's only possible to skip files, but # not directories. So we are handling this manually. sodir = '%s/sqlobject-history' % self.package if not os.path.exists(sodir): os.mkdir(sodir) try: if not os.path.exists(os.path.join(os.path.dirname( os.path.abspath(sodir)), '.svn')): raise OSError command.run_command('svn', 'add', sodir) except OSError: pass startscript = "start-%s.py" % self.package if os.path.exists(startscript): oldmode = os.stat(startscript).st_mode os.chmod(startscript, oldmode | stat.S_IXUSR) sys.argv = ["setup.py", "egg_info"] import imp imp.load_module("setup", *imp.find_module("setup", ["."])) # dirty hack to allow "empty" dirs for base, path, files in os.walk("./"): for file in files: if file == "empty": os.remove(os.path.join(base, file)) class update: "Implementation of update" desc = "Update an existing turbogears project" need_project = True name = None templates = "turbogears" identity = False sqlalchemy = False sqlobject = True elixir = False def __init__(self, version): parser = optparse.OptionParser(usage="%prog update [options]", version="%prog " + version) parser.add_option("-s", "--sqlalchemy", help="use SQLAlchemy instead of SQLObject", action="store_true", dest="sqlalchemy", default = False) parser.add_option("-e", "--elixir", help="use SQLAlchemy Elixir instead of SQLObject", action="store_true", dest="elixir", default = False) parser.add_option("-o", "--sqlobject", help="use SQLObject instead of SQLAlchemy", action="store_true", dest="sqlobject", default = True) parser.add_option("-i", "--identity", help="provide Identity support", action="store_true", dest="identity", default = False) parser.add_option("-t", "--templates", help="user specific templates", dest="templates", default=self.templates) options, args = parser.parse_args() self.__dict__.update(options.__dict__) def run(self): "Updates an existing project" self.name = turbogears.util.get_project_name() self.package = turbogears.util.get_package_name() turbogears.command.base.load_project_config() if not self.sqlalchemy: if turbogears.config.get('sqlalchemy.dburi'): self.sqlalchemy = True if self.elixir: self.sqlalchemy = True self.sqlobject = False elif self.sqlalchemy: self.sqlobject = False else: self.sqlobject = True if not self.identity: if turbogears.config.get('identity.on'): self.identity = True if self.identity: if self.sqlalchemy: self.identity = 'sqlalchemy' else: self.identity = 'sqlobject' else: self.identity = 'none' currentdir = os.path.basename(os.getcwd()) if not currentdir == self.name: print 'It looks like your project dir "%s" is named wrongly.' % currentdir print 'Please rename it to "%s".' % self.name return command = create_distro.CreateDistroCommand("update") cmd_args = [] cmd_args.append("-o../") for template in self.templates.split(" "): cmd_args.append("--template=%s" % template) cmd_args.append(self.name) cmd_args.append("sqlalchemy=%s" % self.sqlalchemy) cmd_args.append("elixir=%s" % self.elixir) cmd_args.append("sqlobject=%s" % self.sqlobject) cmd_args.append("identity=%s" % self.identity) cmd_args.append("package=%s" % self.package) # set the exact ORM-version for the proper requirements # it's extracted from our own requirements, so looking # them up must be in sync (there must be the extras_require named sqlobject/sqlalchemy) if self.sqlobject: sqlobjectversion = str(get_requirement('sqlobject')) cmd_args.append("sqlobjectversion=%s" % sqlobjectversion) if self.sqlalchemy: sqlalchemyversion = str(get_requirement('sqlalchemy')) cmd_args.append("sqlalchemyversion=%s" % sqlalchemyversion) command.run(cmd_args) startscript = "start-%s.py" % self.package if os.path.exists(startscript): oldmode = os.stat(startscript).st_mode os.chmod(startscript, oldmode | stat.S_IXUSR) sys.argv = ["setup.py", "egg_info"] import imp imp.load_module("setup", *imp.find_module("setup", ["."])) # dirty hack to allow "empty" dirs for base, path, files in os.walk("./"): for file in files: if file == "empty": os.remove(os.path.join(base, file)) PK>ܾ쁪>>!turbogears/command/quickstart.pyc; PMc@sZdZdkZdkZdkZdkZdkZdkZdkZdkZdk Z dk l Z l Z ye Wn ej odklZ nXeidZeidZde ifdYZdefd YZd efd YZd efd YZdefdYZedZdfdYZdfdYZdS(sQuickstart command to generate a new project. Quickstart takes the files from turbogears.quickstart and processes them to produce a new, ready-to-run project. N(s templatess create_distro(sSets^[^a-z]*s [^a-z0-9_]s TGTemplatecBstZdZRS(NcCs|id|didd|idtidi|idtiit i t i dd fjod |d 4``turbogears/command/sacommand.pyimport dispatch from turbogears import config from turbogears.util import get_model try: from sqlalchemy import MetaData, exceptions, Table, String, Unicode from turbogears.database import metadata, get_engine except ImportError: # if not available, complain only at run-time get_engine = None else: try: from sqlalchemy import Text, UnicodeText except ImportError: # SQLAlchemy < 0.4.3 Text, UnicodeText = String, Unicode [dispatch.generic()] def sacommand(command, args): pass [sacommand.around("command and command != 'help' and not get_engine")] def no_engine(command, args): print "Error: SQLAlchemy not installed." [sacommand.when("command == 'help'")] def help(command, args): print """TurboGears SQLAlchemy Helper tg-admin sql command [options] Available commands: create Create tables execute Execute SQL statements help Show help list List tables that appear in the model status Show differences between model and database """ [sacommand.when("command == 'create'")] def create(command, args): print "Creating tables at %s" % (config.get("sqlalchemy.dburi")) get_engine() get_model() metadata.create_all() [sacommand.when("command == 'list'")] def list_(command, args): get_model() for tbl in metadata.tables.values(): print tbl.fullname [sacommand.when("command == 'execute'")] def execute(command, args): eng = get_engine() for cmd in args[2:]: ret = eng.execute(cmd) try: print list(ret) except: # Proceed silently if the command produced no results pass [sacommand.when("command == 'status'")] def status(command, args): get_engine() get_model() ret = compare_metadata(metadata, MetaData(metadata.bind)) for l in ret: print l if not ret: print "Database matches model" def indent(ls): return [' ' + l for l in ls] def compare_metadata(pym, dbm): rc = [] for pyt in pym.tables.values(): try: dbt = Table(pyt.name, dbm, autoload=True, schema=pyt.schema) except exceptions.NoSuchTableError: rc.extend(("Create table " + pyt.fullname, '')) else: ret = compare_table(pyt, dbt) if ret: rc.append("Change table " + pyt.fullname) rc.extend(indent(ret) + ['']) return rc def compare_table(pyt, dbt): rc = [] dbcols = dict([(s.lower(), s) for s in dbt.columns.keys()]) any_pkey = bool([1 for c in dbt.columns if c.primary_key]) for pyc in pyt.columns: name = pyc.name.lower() if dbcols.has_key(name): ret = compare_column(pyc, dbt.columns[dbcols[name]], any_pkey) if ret: rc.append("Change column " + pyc.name) rc.extend(indent(ret)) dbcols.pop(name) else: rc.append("Add column " + pyc.name) for dbcol in dbcols: rc.append("Remove column " + dbcol) return rc def compare_column(pyc, dbc, any_pkey): rc = [] pyt, dbt = pyc.type, dbc.type # Table reflection cannot recognize Unicode, so check only for String if isinstance(pyt, Unicode): pyt = String(pyt.length) elif isinstance(pyt, UnicodeText): pyt = Text(pyt.length) # Check type if not isinstance(dbt, pyt.__class__): rc.append('Change type to ' + pyt.__class__.__name__) # Check length (for strings) else: if isinstance(pyt, String): if pyt.length != dbt.length: rc.append('Change length to ' + str(pyt.length)) # Check primary key if any_pkey and dbc.primary_key != pyc.primary_key: rc.append(pyc.primary_key and 'Make primary key' or 'Remove primary key') # TODO: Check foreign keys # Check default if (dbc.default is not None and pyc.default is not None and dbc.default != pyc.default): rc.append('Change default to ' + str(pyc.default.arg)) # Check index if dbc.index is not None and dbc.index != pyc.index: rc.append(pyc.index and 'Add index' or 'Remove index') return rc PK>i[ turbogears/command/sacommand.pyc; PMc@sdkZdklZdklZy<dklZlZlZl Z l Z dk l Z l Z Wnej o eZ nAXydklZlZWn%ej oe e f\ZZnXeigdZeidgdZeid gd Zeid gd Zeid gdZeidgdZeidgdZdZdZdZdZdS(N(sconfig(s get_model(sMetaDatas exceptionssTablesStringsUnicode(smetadatas get_engine(sTexts UnicodeTextcCsdS(N((scommandsargs((s5build\bdist.win32\egg\turbogears\command\sacommand.pys sacommandss0command and command != 'help' and not get_enginecCs dGHdS(Ns Error: SQLAlchemy not installed.((scommandsargs((s5build\bdist.win32\egg\turbogears\command\sacommand.pys no_enginesscommand == 'help'cCs dGHdS(NsTurboGears SQLAlchemy Helper tg-admin sql command [options] Available commands: create Create tables execute Execute SQL statements help Show help list List tables that appear in the model status Show differences between model and database ((scommandsargs((s5build\bdist.win32\egg\turbogears\command\sacommand.pyshelpsscommand == 'create'cCs.dtidGHtttidS(NsCreating tables at %sssqlalchemy.dburi(sconfigsgets get_engines get_modelsmetadatas create_all(scommandsargs((s5build\bdist.win32\egg\turbogears\command\sacommand.pyscreate&sscommand == 'list'cCs-txtiiD]}|iGHqWdS(N(s get_modelsmetadatastablessvaluesstblsfullname(scommandsargsstbl((s5build\bdist.win32\egg\turbogears\command\sacommand.pyslist_-sscommand == 'execute'cCsJt}x:|dD].}|i|}yt|GHWqqXqWdS(Ni(s get_enginesengsargsscmdsexecutesretslist(scommandsargssengscmdsret((s5build\bdist.win32\egg\turbogears\command\sacommand.pysexecute3s  scommand == 'status'cCsQtttttti}x|D] }|GHq-W| o dGHndS(NsDatabase matches model(s get_engines get_modelscompare_metadatasmetadatasMetaDatasbindsretsl(scommandsargsslsret((s5build\bdist.win32\egg\turbogears\command\sacommand.pysstatus>s cCs-gi}|D]}|d|q~SdS(Ns (sappends_[1]slssl(slss_[1]sl((s5build\bdist.win32\egg\turbogears\command\sacommand.pysindentGscCsg}x|iiD]}y%t|i|dtd|i }Wn0t i j o!|i d|idfqXt||}|o2|id|i|i t|dgqqW|SdS(Nsautoloadsschemas Create table ss Change table (srcspymstablessvaluesspytsTablesnamesdbmsTruesschemasdbts exceptionssNoSuchTableErrorsextendsfullnames compare_tablesretsappendsindent(spymsdbmspytsretsrcsdbt((s5build\bdist.win32\egg\turbogears\command\sacommand.pyscompare_metadataJs%"c CsWg} tgi}|iiD]}||i|fq ~}t gi}|iD]}|i o|dq\q\~}x|iD]} | ii} |i| o`t| |i|| |}|o+| id| i| it|n|i| q| id| iqWx|D]}| id|q4W| SdS(NisChange column s Add column sRemove column (srcsdictsappends_[1]sdbtscolumnsskeysssslowersdbcolssboolscs primary_keysany_pkeyspytspycsnameshas_keyscompare_columnsretsextendsindentspopsdbcol( spytsdbtscsany_pkeysdbcolssdbcolsrets_[1]sssrcspycsname((s5build\bdist.win32\egg\turbogears\command\sacommand.pys compare_tableXs"B> cCsg}|i|if\}}t|tot|i }n$t|t ot |i }nt||i  o|i d|i inFt|to5|i |i jo|i dt|i qn|o|i|ijo"|i |iodpdn|itj o |itj o|i|ijo!|i dt|iin|itj o|i|ijo"|i |iodpdn|SdS(NsChange type to sChange length to sMake primary keysRemove primary keysChange default to s Add indexs Remove index(srcspycstypesdbcspytsdbts isinstancesUnicodesStringslengths UnicodeTextsTexts __class__sappends__name__sstrsany_pkeys primary_keysdefaultsNonesargsindex(spycsdbcsany_pkeyspytsrcsdbt((s5build\bdist.win32\egg\turbogears\command\sacommand.pyscompare_columnjs$""3!#"( sdispatchs turbogearssconfigsturbogears.utils get_models sqlalchemysMetaDatas exceptionssTablesStringsUnicodesturbogears.databasesmetadatas get_engines ImportErrorsNonesTexts UnicodeTextsgenerics sacommandsarounds no_engineswhenshelpscreateslist_sexecutesstatussindentscompare_metadatas compare_tablescompare_column(shelps UnicodeTextsdispatchscompare_metadatasStringscreates sacommandsconfigsmetadatasstatuss get_enginesexecutescompare_columns compare_tableslist_sindentsTexts get_modelsUnicodes exceptionssTablesMetaDatas no_engine((s5build\bdist.win32\egg\turbogears\command\sacommand.pys?s:   %           PKzz>NNturbogears/command/__init__.py"""TurboGears command line tools""" from turbogears.command.base import main PK>turbogears/command/__init__.pyc; PMc@sdZdklZdS(sTurboGears command line tools(smainN(s__doc__sturbogears.command.basesmain(smain((s4build\bdist.win32\egg\turbogears\command\__init__.pys?sPKzz>8turbogears/feed/atom0_3.kid id myfeed modified name email uri copyright tagline title id modified issued name email uri content summary copyright PKzz>turbogears/feed/atom1_0.kid id myfeed updated name email uri icon logo rights subtitle title id updated published name email uri content summary rights PKzz>b'M turbogears/feed/feed.pyimport time import cherrypy import turbogears from warnings import warn class FeedController(turbogears.controllers.Controller): """ Object for generating feeds in multiple formats """ def __init__(self, default="atom1.0"): self.default = default self.formats = ["atom1.0", "atom0.3", "rss2.0"] def date_to_3339(self, date): date = date.strftime("%Y-%m-%dT%H:%M:%SZ") return date def date_to_822(self, date): date = date.strftime("%a, %d %b %Y %H:%M:%S GMT") return date def depr_entrys(self, feed): if "entrys" in feed: warn("You should use 'entries' instead of 'entrys'", DeprecationWarning, 3) feed['entries'] = feed['entrys'] del feed['entrys'] def format_dates(self, feed, format): if format == 822: convert_date = self.date_to_822 else: convert_date = self.date_to_3339 if feed.has_key('updated'): feed["updated"] = convert_date(feed["updated"]) self.depr_entrys(feed) for entry in feed['entries']: if entry.has_key('updated'): entry["updated"] = convert_date(entry["updated"]) if entry.has_key('published'): entry["published"] = convert_date(entry["published"]) return feed def index(self, **kwargs): turbogears.redirect("%s" % self.default, kwargs) index = turbogears.expose()(index) def atom1_0(self, **kwargs): feed = self.get_feed_data(**kwargs) self.format_dates(feed, 3339) feed["href"] = turbogears.url("/") + "atom1.0" self.depr_entrys(feed) return feed atom1_0 = turbogears.expose(template="turbogears.feed.atom1_0", format="xml", content_type="application/atom+xml")(atom1_0) def atom0_3(self, **kwargs): feed = self.get_feed_data(**kwargs) self.format_dates(feed, 3339) feed["href"] = turbogears.url("/") + "atom0.3" self.depr_entrys(feed) return feed atom0_3 = turbogears.expose(template="turbogears.feed.atom0_3", format="xml", content_type="application/atom+xml")(atom0_3) def rss2_0(self, **kwargs): feed = self.get_feed_data(**kwargs) self.format_dates(feed, 822) self.depr_entrys(feed) return feed rss2_0 = turbogears.expose(template="turbogears.feed.rss2_0", format="xml", content_type="application/rss+xml")(rss2_0) PK>E%turbogears/feed/feed.pyc; IMc@sHdkZdkZdkZdklZdeiifdYZdS(N(swarnsFeedControllercBstZdZddZdZdZdZdZdZe i eZdZ e i d d d d d de Z dZ e i d dd d d de Z dZ e i d dd d d de Z RS(s1 Object for generating feeds in multiple formats satom1.0cCs||_dddg|_dS(Nsatom1.0satom0.3srss2.0(sdefaultsselfsformats(sselfsdefault((s-build\bdist.win32\egg\turbogears\feed\feed.pys__init__ s cCs|id}|SdS(Ns%Y-%m-%dT%H:%M:%SZ(sdatesstrftime(sselfsdate((s-build\bdist.win32\egg\turbogears\feed\feed.pys date_to_3339scCs|id}|SdS(Ns%a, %d %b %Y %H:%M:%S GMT(sdatesstrftime(sselfsdate((s-build\bdist.win32\egg\turbogears\feed\feed.pys date_to_822scCs:d|jo)tdtd|d|d<|d=ndS(Nsentryss,You should use 'entries' instead of 'entrys'isentries(sfeedswarnsDeprecationWarning(sselfsfeed((s-build\bdist.win32\egg\turbogears\feed\feed.pys depr_entryss   cCs|djo |i}n |i}|ido||d|d?v0ccturbogears/feed/rss2_0.kid myfeed link description lastBuildDate lang generated title guid link pubDate description PKzz>QFFturbogears/feed/__init__.pyfrom turbogears.feed import feed FeedController = feed.FeedController PK>Q@turbogears/feed/__init__.pyc; IMc@sdklZeiZdS((sfeedN(sturbogears.feedsfeedsFeedController(sfeedsFeedController((s1build\bdist.win32\egg\turbogears\feed\__init__.pys?s PKzz>turbogears/i18n/format.py"""Localized formatting functions. These functions extract localization data from config files located in the data/directory. """ from turbogears.i18n.utils import get_locale import pkg_resources import os import re def is_locale_format(locale): """Check if locale is supported.""" py_filename = pkg_resources.resource_filename( "turbogears.i18n.data", "%s.py" % locale) if os.path.exists(py_filename): return True pyc_filename = pkg_resources.resource_filename( "turbogears.i18n.data", "%s.pyc" % locale) if os.path.exists(pyc_filename): return True return False def get_locale_module(locale): """Get i18n module supporting the locale.""" try: # check if locale is supported. If not, check again with # first part of locale for example, "fi_FI" > "fi". if not is_locale_format(locale): locale = locale[:2] name = "turbogears.i18n.data.%s" % locale mod = __import__(name) parts = name.split(".")[1:] for p in parts: mod = getattr(mod, p) return mod except (ImportError, AttributeError): return None def get(locale, name, default=None): """Get an attribute value for the locale.""" locale = get_locale(locale) mod = get_locale_module(locale) return getattr(mod, name, default) def get_countries(locale=None): """Get all supported countries. Returns a list of tuples, consisting of international country code and localized name, e.g. ('AU', 'Australia'). """ countries = get(locale, "countries", {}).items() countries.sort(lambda x, y: cmp(x[1], y[1])) return countries def get_country(key, locale=None): """Get localized name of country based on international country code.""" return get(locale, "countries", {})[key] def get_languages(locale=None): """Get all supported languages. Returns a list of tuples, with language code and localized name, e.g. ('en', 'English'). """ languages = get(locale, "languages", {}).items() languages.sort(lambda x, y: cmp(x[1], y[1])) return languages def get_language(key, locale=None): """Get localized name of language based on language code.""" return get(locale, "languages", {})[key] def get_month_names(locale=None): """Get list of full month names, starting with January.""" return get(locale, "months", []) def get_abbr_month_names(locale=None): """Get list of abbreviated month names, starting with Jan.""" return get(locale, "abbrMonths", []) def get_weekday_names(locale=None): """Get list of full weekday names.""" return get(locale, "days", []) def get_abbr_weekday_names(locale=None): """Get list of abbreviated weekday names.""" return get(locale, "abbrDays", get_weekday_names(locale)) def get_decimal_format(locale=None): """Get decimal point for the locale.""" return get(locale, "numericSymbols", {}).get("decimal", ".") def get_group_format(locale=None): """Get digit group separator for thousands for the locale.""" return get(locale, "numericSymbols", {}).get("group", ",") def format_number(value, locale=None): """Get number formatted with grouping for thousands. E.g. 5000000 will be formatted as 5,000,000. """ gf = get_group_format(locale) thou = re.compile(r"([0-9])([0-9][0-9][0-9]([%s]|$))" % gf).search v = str(value) mo = thou(v) while mo is not None: i = mo.start(0) v = v[:i+1] + gf + v[i+1:] mo = thou(v) return unicode(v) def format_decimal(value, num_places, locale=None): """Get number formatted with grouping for thousands and decimal places. E.g. 5000000.898 will be formatted as 5,000,000.898. """ v = ("%%.%df" % num_places) % value if num_places == 0: return format_number(v, locale=locale) num, decimals = v.split(".", 1) return format_number(num, locale) + unicode( get_decimal_format(locale) + decimals) def format_currency(value, locale=None): """Get formatted currency value.""" return format_decimal(value, 2, locale) def parse_number(value, locale=None): """Take localized number string and return a long integer. Throws ValueError if bad format. """ return long(value.replace(get_group_format(locale), "")) def parse_decimal(value, locale=None): """Take localized decimal string and return a float. Throws ValueError if bad format. """ value = value.replace(get_group_format(locale), "") value = value.replace(get_decimal_format(locale), ".") return float(value) def get_date_format(format, locale=None): """Get localized date format.""" formats = get(locale, "dateFormats", {}) return formats.get(format, None) def format_date(dt, format="medium", locale=None, time_format="", date_format=""): """Get formatted date value. format can be "full", "long", "medium" or "short". To have complete control over formatting, use time_format and date_format parameters. @param dt: datetime @type dt: datetime.datetime @param format: format("full", "long", "medium", "short") @type format: string @param locale: the locale @type locale: string @param time_format: standard time formatting string, e.g. %H:%M @type time_format:s tring @param time_format: date formatting template string. Template variables include standard date formatting string like %d or %Y plus a few locale-specific names: %%(abbrmonthname)s, %%(dayname)s, %%(abbrmonthname)s and %%(monthname)s. @type time_format: string """ pattern = date_format or get_date_format(format, locale) if not pattern: return str(dt) month = dt.month - 1 weekday = dt.weekday() # becasue strftime() accepts str only but not unicode, # we encode string to utf-8 and then decode back date_str = dt.strftime(pattern.encode('utf8') + time_format) return date_str.decode('utf8') % dict( monthname=get_month_names(locale)[month], abbrmonthname=get_abbr_month_names(locale)[month], dayname=get_weekday_names(locale)[weekday], abbrdayname=get_abbr_weekday_names(locale)[weekday]) PK>#((turbogears/i18n/format.pyc; ;Mc@s%dZdklZdkZdkZdkZdZdZedZ edZ edZ edZ ed Z ed Zed Zed Zed ZedZedZedZedZedZedZedZedZdedddZdS(s}Localized formatting functions. These functions extract localization data from config files located in the data/directory. (s get_localeNcCsjtidd|}tii|otSntidd|}tii|otSnt SdS(sCheck if locale is supported.sturbogears.i18n.datas%s.pys%s.pycN( s pkg_resourcessresource_filenameslocales py_filenamesosspathsexistssTrues pyc_filenamesFalse(slocales py_filenames pyc_filename((s/build\bdist.win32\egg\turbogears\i18n\format.pysis_locale_formatscCsymt| o|d }nd|}t|}|idd}x|D]}t||}qOW|SWnt t fj o t SnXdS(s&Get i18n module supporting the locale.isturbogears.i18n.data.%ss.iN( sis_locale_formatslocalesnames __import__smodssplitspartsspsgetattrs ImportErrorsAttributeErrorsNone(slocalesnamespspartssmod((s/build\bdist.win32\egg\turbogears\i18n\format.pysget_locale_modules  cCs,t|}t|}t|||SdS(s&Get an attribute value for the locale.N(s get_localeslocalesget_locale_modulesmodsgetattrsnamesdefault(slocalesnamesdefaultsmod((s/build\bdist.win32\egg\turbogears\i18n\format.pysget,s  cCs0t|dhi}|id|SdS(sGet all supported countries. Returns a list of tuples, consisting of international country code and localized name, e.g. ('AU', 'Australia'). s countriescCst|d|dS(Ni(scmpsxsy(sxsy((s/build\bdist.win32\egg\turbogears\i18n\format.pys;sN(sgetslocalesitemss countriesssort(slocales countries((s/build\bdist.win32\egg\turbogears\i18n\format.pys get_countries3scCst|dh|SdS(sBGet localized name of country based on international country code.s countriesN(sgetslocaleskey(skeyslocale((s/build\bdist.win32\egg\turbogears\i18n\format.pys get_country?scCs0t|dhi}|id|SdS(sGet all supported languages. Returns a list of tuples, with language code and localized name, e.g. ('en', 'English'). s languagescCst|d|dS(Ni(scmpsxsy(sxsy((s/build\bdist.win32\egg\turbogears\i18n\format.pysLsN(sgetslocalesitemss languagesssort(slocales languages((s/build\bdist.win32\egg\turbogears\i18n\format.pys get_languagesDscCst|dh|SdS(s6Get localized name of language based on language code.s languagesN(sgetslocaleskey(skeyslocale((s/build\bdist.win32\egg\turbogears\i18n\format.pys get_languagePscCst|dgSdS(s4Get list of full month names, starting with January.smonthsN(sgetslocale(slocale((s/build\bdist.win32\egg\turbogears\i18n\format.pysget_month_namesUscCst|dgSdS(s7Get list of abbreviated month names, starting with Jan.s abbrMonthsN(sgetslocale(slocale((s/build\bdist.win32\egg\turbogears\i18n\format.pysget_abbr_month_namesZscCst|dgSdS(sGet list of full weekday names.sdaysN(sgetslocale(slocale((s/build\bdist.win32\egg\turbogears\i18n\format.pysget_weekday_names_scCst|dt|SdS(s&Get list of abbreviated weekday names.sabbrDaysN(sgetslocalesget_weekday_names(slocale((s/build\bdist.win32\egg\turbogears\i18n\format.pysget_abbr_weekday_namesdscCs t|dhiddSdS(s!Get decimal point for the locale.snumericSymbolssdecimals.N(sgetslocale(slocale((s/build\bdist.win32\egg\turbogears\i18n\format.pysget_decimal_formatiscCs t|dhiddSdS(s7Get digit group separator for thousands for the locale.snumericSymbolssgroups,N(sgetslocale(slocale((s/build\bdist.win32\egg\turbogears\i18n\format.pysget_group_formatnscCst|}tid|i}t|}||}xK|t j o=|i d}||d |||d}||}q=Wt|SdS(siGet number formatted with grouping for thousands. E.g. 5000000 will be formatted as 5,000,000. s ([0-9])([0-9][0-9][0-9]([%s]|$))iiN(sget_group_formatslocalesgfsrescompilessearchsthousstrsvaluesvsmosNonesstartsisunicode(svalueslocalesismosgfsvsthou((s/build\bdist.win32\egg\turbogears\i18n\format.pys format_numberss    cCsld||}|djot|d|Sn|idd\}}t||tt ||SdS(sGet number formatted with grouping for thousands and decimal places. E.g. 5000000.898 will be formatted as 5,000,000.898. s%%.%dfislocales.iN( s num_placessvaluesvs format_numberslocalessplitsnumsdecimalssunicodesget_decimal_format(svalues num_placesslocalesnumsvsdecimals((s/build\bdist.win32\egg\turbogears\i18n\format.pysformat_decimals  cCst|d|SdS(sGet formatted currency value.iN(sformat_decimalsvalueslocale(svalueslocale((s/build\bdist.win32\egg\turbogears\i18n\format.pysformat_currencyscCs t|it|dSdS(scTake localized number string and return a long integer. Throws ValueError if bad format. sN(slongsvaluesreplacesget_group_formatslocale(svalueslocale((s/build\bdist.win32\egg\turbogears\i18n\format.pys parse_numberscCs>|it|d}|it|d}t|SdS(s]Take localized decimal string and return a float. Throws ValueError if bad format. ss.N(svaluesreplacesget_group_formatslocalesget_decimal_formatsfloat(svalueslocale((s/build\bdist.win32\egg\turbogears\i18n\format.pys parse_decimalscCs&t|dh}|i|tSdS(sGet localized date format.s dateFormatsN(sgetslocalesformatssformatsNone(sformatslocalesformats((s/build\bdist.win32\egg\turbogears\i18n\format.pysget_date_formatssmediumsc Cs|p t||}| ot|Sn|id}|i}|i |i d|}|i dtdt||dt||dt||dt||SdS(sGet formatted date value. format can be "full", "long", "medium" or "short". To have complete control over formatting, use time_format and date_format parameters. @param dt: datetime @type dt: datetime.datetime @param format: format("full", "long", "medium", "short") @type format: string @param locale: the locale @type locale: string @param time_format: standard time formatting string, e.g. %H:%M @type time_format:s tring @param time_format: date formatting template string. Template variables include standard date formatting string like %d or %Y plus a few locale-specific names: %%(abbrmonthname)s, %%(dayname)s, %%(abbrmonthname)s and %%(monthname)s. @type time_format: string isutf8s monthnames abbrmonthnamesdaynames abbrdaynameN(s date_formatsget_date_formatsformatslocalespatternsstrsdtsmonthsweekdaysstrftimesencodes time_formatsdate_strsdecodesdictsget_month_namessget_abbr_month_namessget_weekday_namessget_abbr_weekday_names( sdtsformatslocales time_formats date_formatspatternsmonthsweekdaysdate_str((s/build\bdist.win32\egg\turbogears\i18n\format.pys format_dates  (s__doc__sturbogears.i18n.utilss get_locales pkg_resourcessossresis_locale_formatsget_locale_modulesNonesgets get_countriess get_countrys get_languagess get_languagesget_month_namessget_abbr_month_namessget_weekday_namessget_abbr_weekday_namessget_decimal_formatsget_group_formats format_numbersformat_decimalsformat_currencys parse_numbers parse_decimalsget_date_formats format_date(s parse_decimals get_languagesget_month_namess pkg_resourcessget_weekday_namessget_group_formats get_countriess parse_numbersformat_currencysres get_localesget_decimal_formatsgetsget_abbr_month_namess format_numbersformat_decimals get_countrysis_locale_formats format_dates get_languagessget_date_formatsget_locale_modulesget_abbr_weekday_namessos((s/build\bdist.win32\egg\turbogears\i18n\format.pys?s0                   PKzz>Vx turbogears/i18n/kidutils.py""" Functions for use with Kid template """ from kid.parser import START, TEXT, END import turbogears # use plain_gettext because Kid template's strings always evaluated immediately from turbogears.i18n.tg_gettext import plain_gettext as gettext from turbogears.i18n.utils import google_translate def translate(item, attr=None): """Translates the text of element plus the text of all child elements. If attr is present this is used to provide the locale name; if not then value provided by get_locale is used. For example:
this is a test testing
The string 'this is a test' is rendered by the locale provided by get_locale, the string 'testing' by the German locale. Possible use in Kid template:

Welcome!

@param item: element to be translated @type item: ElementTree element @param attr: attribute name used to store locale, if any """ if attr is None:attr = turbogears.config.get("i18n.templateLocaleAttribute", "lang") translate_all(item, item.get(attr), attr) return item def __translate_text(text, lang): prefix = '' postfix = '' if len(text) > 0 and text[0].isspace(): prefix = text[0] if len(text) > 1 and text[-1].isspace(): postfix = text[-1] return prefix + gettext(text.strip(), lang) + postfix def translate_all(tree, lang, attr, inroot=True): """Recursive function to translate all text in child elements @param tree: parent ElementTree element @param lang: language setting @param attr: attribute name used to store locale """ if tree.text: tree.text = __translate_text(tree.text, lang) if tree.tail and not inroot: # Don't translate tail of root. It is beyond the scope of the lang attr tree.tail = __translate_text(tree.tail, lang) for element in tree: # check overriding lang attribute if element.get(attr):lang = element.get(attr) translate_all(element, lang, attr, False) def i18n_filter(stream, template, locale=None): """Kid template filter which calls translates all elements matching language attribute(set in configuration as i18n.templateLocaleAttribute, default 'lang') """ lang_attr = turbogears.config.get("i18n.templateLocaleAttribute", "lang") locales=[locale] for ev, item in stream: if ev==START: l = item.get(lang_attr) if l: locale = l locales.append(l) elif ev==TEXT: prefix = '' postfix = '' if len(item) > 0 and item[0] == ' ': prefix =' ' if len(item) > 1 and item[-1] == ' ': postfix =' ' text = item.strip() if text: item = gettext(text, locale) item = prefix + item + postfix elif ev==END: if item.get(lang_attr): locales.pop() locale = locales[-1] yield (ev, item) PK>Є;;turbogears/i18n/kidutils.pyc; ;Mc@ssdZdklZlZlZdkZdklZdk l Z e dZ dZ edZe dZdS( s% Functions for use with Kid template (sSTARTsTEXTsENDN(s plain_gettext(sgoogle_translatecCsG|tjotiidd}nt||i|||SdS(s)Translates the text of element plus the text of all child elements. If attr is present this is used to provide the locale name; if not then value provided by get_locale is used. For example:
this is a test testing
The string 'this is a test' is rendered by the locale provided by get_locale, the string 'testing' by the German locale. Possible use in Kid template:

Welcome!

@param item: element to be translated @type item: ElementTree element @param attr: attribute name used to store locale, if any si18n.templateLocaleAttributeslangN(sattrsNones turbogearssconfigsgets translate_allsitem(sitemsattr((s1build\bdist.win32\egg\turbogears\i18n\kidutils.pys translate s  cCsd}d}t|djo|dio|d}nt|djo|dio|d}n|t|i||SdS(Nsiii(sprefixspostfixslenstextsisspacesgettextsstripslang(stextslangspostfixsprefix((s1build\bdist.win32\egg\turbogears\i18n\kidutils.pys__translate_text's$$cCs|iot|i||_n|io| ot|i||_nxD|D]<}|i|o|i|}nt |||t qUWdS(sRecursive function to translate all text in child elements @param tree: parent ElementTree element @param lang: language setting @param attr: attribute name used to store locale N( streestexts__translate_textslangstailsinrootselementsgetsattrs translate_allsFalse(streeslangsattrsinrootselement((s1build\bdist.win32\egg\turbogears\i18n\kidutils.pys translate_all.s c csgtiidd}|g} xB|D]:\}}|t jo1|i|}|o|}| i |qUn|t jod}d} t|djo|ddjo d}nt|djo|ddjo d} n|i}|o!t||}||| }qUn:|tjo,|i|o| i| d}qUn||fVq%WdS( sKid template filter which calls translates all elements matching language attribute(set in configuration as i18n.templateLocaleAttribute, default 'lang') si18n.templateLocaleAttributeslangsis iiN(s turbogearssconfigsgets lang_attrslocaleslocalessstreamsevsitemsSTARTslsappendsTEXTsprefixspostfixslensstripstextsgettextsENDspop( sstreamstemplateslocalesevslsitemsprefixstexts lang_attrspostfixslocales((s1build\bdist.win32\egg\turbogears\i18n\kidutils.pys i18n_filter?s4    $ $    (s__doc__s kid.parsersSTARTsTEXTsENDs turbogearssturbogears.i18n.tg_gettexts plain_gettextsgettextsturbogears.i18n.utilssgoogle_translatesNones translates__translate_textsTrues translate_alls i18n_filter( sENDs turbogearss translate_allsTEXTs i18n_filtersgettextsSTARTsgoogle_translates__translate_texts translate((s1build\bdist.win32\egg\turbogears\i18n\kidutils.pys?s      PKzz>LpAAturbogears/i18n/tg_gettext.pyimport os import sys from gettext import translation from turbogears import config from turbogears.util import get_package_name, request_available from turbogears.i18n.utils import get_locale from turbojson.jsonify import jsonify _catalogs = {} def get_locale_dir(): localedir = config.get("i18n.locale_dir") if not localedir: package = get_package_name() if package: localedir = os.path.join(os.path.dirname( sys.modules[package].__path__[0]), "locales") return localedir def is_locale_supported(locale, domain=None): """Check if [domain].mo file exists for this language.""" if not domain: domain = config.get("i18n.domain", "messages") localedir = get_locale_dir() return localedir and os.path.exists(os.path.join( localedir, locale, "LC_MESSAGES", "%s.mo" % domain)) def get_catalog(locale, domain = None): """Return translations for given locale.""" if not domain: domain = config.get("i18n.domain", "messages") catalog = _catalogs.get(domain) if not catalog: catalog = _catalogs[domain] = {} messages = catalog.get(locale) if not messages: localedir = get_locale_dir() messages = catalog[locale] = translation(domain=domain, localedir=localedir, languages=[locale]) return messages def plain_gettext(key, locale=None, domain=None): """Get the gettext value for key. Added to builtins as '_'. Returns Unicode string. @param key: text to be translated @param locale: locale code to be used. If locale is None, gets the value provided by get_locale. """ gettext_func = config.get("i18n.gettext", tg_gettext) return gettext_func(key, locale, domain) def tg_gettext(key, locale=None, domain=None): """Get the gettext value for key. Added to builtins as '_'. Returns Unicode string. @param key: text to be translated @param locale: locale code to be used. If locale is None, gets the value provided by get_locale. """ if locale is None: locale = get_locale() if not is_locale_supported(locale): locale = locale[:2] if key == '': return '' # special case try: return get_catalog(locale, domain).ugettext(key) except KeyError: return key except IOError: return key def plain_ngettext(key1, key2, num, locale=None): """Translate two possible texts based on whether num is greater than 1. @param key1: text if num==1 @param key2: text if num!=1 @param num: a number @type num: integer @locale: locale code to be used. If locale is None, gets the value provided by get_locale. """ if num==1: return plain_gettext(key1, locale) else: return plain_gettext(key2, locale) class lazystring(object): """Has a number of lazily evaluated functions replicating a string. Just override the eval() method to produce the actual value. """ def __init__(self, func, *args, **kw): self.func = func self.args = args self.kw = kw def eval(self): return self.func(*self.args, **self.kw) def __unicode__(self): return unicode(self.eval()) def __str__(self): return str(self.eval()) def __mod__(self, other): return self.eval() % other def __cmp__(self, other): return cmp(self.eval(), other) def __eq__(self, other): return self.eval() == other def __deepcopy__(self, memo): return self def lazify(func): def newfunc(*args, **kw): lazystr = lazystring(func, *args, **kw) return lazystr return newfunc [jsonify.when("isinstance(obj, lazystring)")] def jsonify_lazystring(obj): return unicode(obj) lazy_gettext = lazify(plain_gettext) lazy_ngettext = lazify(plain_ngettext) def gettext(key, locale=None, domain=None): """Get the gettext value for key. Added to builtins as '_'. Returns Unicode string. @param key: text to be translated @param locale: locale code to be used. If locale is None, gets the value provided by get_locale. """ if request_available(): return plain_gettext(key, locale, domain) else: return lazy_gettext(key, locale, domain) def ngettext(key1, key2, num, locale=None): """Translate two possible texts based on whether num is greater than 1. @param key1: text if num==1 @param key2: text if num!=1 @param num: a number @type num: integer @param locale: locale code to be used. If locale is None, gets the value provided by get_locale. """ if request_available(): return plain_ngettext(key1, key2, num, locale) else: return lazy_ngettext(key1, key2, num, locale) def install(): """Add the gettext function to __builtins__ as '_'.""" __builtins__["_"] = gettext PK>mbg""turbogears/i18n/tg_gettext.pyc; ;Mc@s"dkZdkZdklZdklZdklZlZdk l Z dk l Z hZ dZedZedZeed Zeed Zed Zd efd YZdZe idgdZeeZeeZeedZedZdZdS(N(s translation(sconfig(sget_package_namesrequest_available(s get_locale(sjsonifycCsftid}| oGt}|o3tiitiit i |i dd}q^n|SdS(Nsi18n.locale_dirislocales( sconfigsgets localedirsget_package_namespackagesosspathsjoinsdirnamessyssmoduless__path__(spackages localedir((s3build\bdist.win32\egg\turbogears\i18n\tg_gettext.pysget_locale_dir s &cCs[| otidd}nt}|o)tiitii||dd|SdS(s3Check if [domain].mo file exists for this language.s i18n.domainsmessagess LC_MESSAGESs%s.moN( sdomainsconfigsgetsget_locale_dirs localedirsosspathsexistssjoinslocale(slocalesdomains localedir((s3build\bdist.win32\egg\turbogears\i18n\tg_gettext.pysis_locale_supporteds  cCs| otidd}nti|}| oh}t||turbogears/i18n/utils.py""" General i18n utility functions. """ import urllib import simplejson import cherrypy from turbogears import config from turbogears.release import version as tg_version from turbogears.util import parse_http_accept_header, request_available class TGURLopener(urllib.FancyURLopener): version = "TurboGears/%s" % tg_version def google_translate(from_lang, to_lang, text): """Translate text via the translate.google.com service. The source language is given by 'from_lang' and the target language as 'to_lang'. 'text' must be a unicode or UTF-8 encoded string. """ if isinstance(text, unicode): has_nbsp = u'\xa0' in text text = text.encode('utf-8') else: has_nbsp = False params = urllib.urlencode(dict(v='1.0', langpair='%s|%s' % (from_lang, to_lang), q=text)) try: result = TGURLopener().open('http://ajax.googleapis.com' '/ajax/services/language/translate', params).read() except IOError: text = None else: try: result = simplejson.loads(result) except ValueError: text = None else: try: text = result['responseData']['translatedText'] except (KeyError, TypeError): text = None else: if text and not has_nbsp: text = text.replace(u'\xa0', ' ') return text def lang_in_gettext_format(lang): if len(lang) > 2: country = lang[3:].upper() lang = lang[:2] + "_" + country return lang def get_accept_languages(accept): """Returns a list of languages, by order of preference, based on an HTTP Accept-Language string.See W3C RFC 2616 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html) for specification. """ langs = parse_http_accept_header(accept) for index, lang in enumerate(langs): langs[index] = lang_in_gettext_format(lang) return langs def get_locale(locale=None): """ Returns user locale, using _get_locale or app-specific locale lookup function. """ if not locale: get_locale_f = config.get("i18n.get_locale", _get_locale) locale = get_locale_f() return locale def _get_locale(): """Default function for returning locale. First looks in session for locale key, then checks the HTTP Accept-Language header, and finally checks the config default locale setting. This can be replaced by your own function by setting cherrypy config setting i18n.get_locale to your function name. """ if not request_available(): return config.get("i18n.default_locale", "en") if config.get("session_filter.on", False): locale_key = config.get("i18n.session_key", "locale") locale = cherrypy.session.get(locale_key) if locale: return locale browser_accept_lang = _get_locale_from_accept_header() return browser_accept_lang or config.get("i18n.default_locale", "en") def _get_locale_from_accept_header(): """ Checks HTTP Accept-Language header to find preferred language if any. """ try: header = cherrypy.request.headers.get("Accept-Language") if header: accept_languages = get_accept_languages(header) if accept_languages: return accept_languages[0] except AttributeError: pass def set_session_locale(locale): """ Sets the i18n session locale. Raises an error if session support is not enabled. """ cherrypy.session[config.get("i18n.session_key", "locale")] = locale PK>-Vturbogears/i18n/utils.pyc; ;Mc@sdZdkZdkZdkZdklZdklZdk l Z l Z dei fdYZ dZdZd Zed Zd Zd Zd ZdS(s! General i18n utility functions. N(sconfig(sversion(sparse_http_accept_headersrequest_availables TGURLopenercBstZdeZRS(Ns TurboGears/%s(s__name__s __module__s tg_versionsversion(((s.build\bdist.win32\egg\turbogears\i18n\utils.pys TGURLopenerscCs.t|tod|j}|id}nt}titdddd||fd|}yt i d|i}Wntj o t}nXyti|}Wntj o t}n[Xy|d d }Wnttfj o t}n'X|o| o|idd }n|Sd S( sTranslate text via the translate.google.com service. The source language is given by 'from_lang' and the target language as 'to_lang'. 'text' must be a unicode or UTF-8 encoded string. u sutf-8svs1.0slangpairs%s|%ssqs;http://ajax.googleapis.com/ajax/services/language/translates responseDatastranslatedTexts N(s isinstancestextsunicodeshas_nbspsencodesFalsesurllibs urlencodesdicts from_langsto_langsparamss TGURLopenersopensreadsresultsIOErrorsNones simplejsonsloadss ValueErrorsKeyErrors TypeErrorsreplace(s from_langsto_langstextshas_nbspsparamssresult((s.build\bdist.win32\egg\turbogears\i18n\utils.pysgoogle_translates.     cCsAt|djo&|di}|d d|}n|SdS(Niis_(slenslangsupperscountry(slangscountry((s.build\bdist.win32\egg\turbogears\i18n\utils.pyslang_in_gettext_format3scCsAt|}x*t|D]\}}t|||_@{a}}turbogears/i18n/__init__.py""" TurboGears internationalization/localization module. """ from turbogears.i18n.tg_gettext import gettext, ngettext, install, \ is_locale_supported, lazy_gettext, lazy_ngettext, plain_gettext from turbogears.i18n.utils import get_locale, get_accept_languages, \ set_session_locale, google_translate from turbogears.i18n.format import get_countries, get_country, \ get_month_names, get_abbr_month_names, get_weekday_names, \ get_abbr_weekday_names, get_languages, format_date, format_number, \ format_decimal, format_currency, parse_number, parse_decimal from turbogears.i18n.kidutils import translate, i18n_filter PK>vturbogears/i18n/__init__.pyc; ;Mc@sdZdklZlZlZlZlZlZlZdk l Z l Z l Z l Z dklZlZlZlZlZlZlZlZlZlZlZlZlZdklZlZdS(s6 TurboGears internationalization/localization module. (sgettextsngettextsinstallsis_locale_supporteds lazy_gettexts lazy_ngettexts plain_gettext(s get_localesget_accept_languagessset_session_localesgoogle_translate( s get_countriess get_countrysget_month_namessget_abbr_month_namessget_weekday_namessget_abbr_weekday_namess get_languagess format_dates format_numbersformat_decimalsformat_currencys parse_numbers parse_decimal(s translates i18n_filterN(s__doc__sturbogears.i18n.tg_gettextsgettextsngettextsinstallsis_locale_supporteds lazy_gettexts lazy_ngettexts plain_gettextsturbogears.i18n.utilss get_localesget_accept_languagessset_session_localesgoogle_translatesturbogears.i18n.formats get_countriess get_countrysget_month_namessget_abbr_month_namessget_weekday_namessget_abbr_weekday_namess get_languagess format_dates format_numbersformat_decimalsformat_currencys parse_numbers parse_decimalsturbogears.i18n.kidutilss translates i18n_filter(s parse_decimalsget_month_namessget_weekday_namessget_accept_languagess get_countriess get_languagessformat_currencysgettexts plain_gettextsgoogle_translates translates lazy_gettexts get_locales lazy_ngettextsget_abbr_month_namess format_numbersset_session_localesngettexts get_countrysis_locale_supporteds format_dates parse_numbers i18n_filtersget_abbr_weekday_namessinstallsformat_decimal((s1build\bdist.win32\egg\turbogears\i18n\__init__.pys?s1UPKzz>,mmturbogears/i18n/data/af.py# Formatting configuration for locale af languages={'af': 'Afrikaanse'} countries={'ZA': 'Suid-Afrika'} months=['Januarie', 'Februarie', 'Maart', 'April', 'Mei', 'Junie', 'Julie', 'Augustus', 'September', 'Oktober', 'November', 'Desember'] abbrMonths=['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'] days=['Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag', 'Sondag'] abbrDays=['Ma', 'Di', 'Wo', 'Do', 'Vr', 'Sa', 'So'] dateFormats={'medium': '%Y %%(abbrmonthname)s %d ', 'full': '%%(dayname)s, %Y %%(monthname)s %d ', 'long': '%Y %%(monthname)s %d ', 'short': '%y/%m/%d'} numericSymbols={'group': ',', 'nativeZeroDigit': '0', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': '.', 'percentSign': '%', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>lturbogears/i18n/data/af.pyc; :Mc @sHhdd<d?d@<dAdB<dCdD<dEdF<dGdH-Mllturbogears/i18n/data/af_ZA.py# Formatting configuration for locale af_ZA languages={'af': 'Afrikaanse'} countries={'ZA': 'Suid-Afrika'} months=['Januarie', 'Februarie', 'Maart', 'April', 'Mei', 'Junie', 'Julie', 'Augustus', 'September', 'Oktober', 'November', 'Desember'] abbrMonths=['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'] days=['Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag', 'Sondag'] abbrDays=['Ma', 'Di', 'Wo', 'Do', 'Vr', 'Sa', 'So'] dateFormats={'medium': '%d %%(abbrmonthname)s %Y', 'full': '%%(dayname)s %d %%(monthname)s %Y', 'long': '%d %%(monthname)s %Y', 'short': '%Y/%m/%d'} numericSymbols={'group': ',', 'nativeZeroDigit': '0', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': '.', 'percentSign': '%', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>Yuturbogears/i18n/data/af_ZA.pyc; :Mc @sHhdd<d?d@<dAdB<dCdD<dEdF<dGdH}p00turbogears/i18n/data/am.py# Formatting configuration for locale am languages={'gu': u'\u1309\u1303\u122d\u1272\u129b', 'gd': u'\u12a5\u1235\u12ae\u1275\u1235 \u130c\u120d\u12ad\u129b', 'ga': u'\u12a0\u12ed\u122a\u123d', 'gn': u'\u1313\u122b\u1292\u129b', 'gl': u'\u130b\u1208\u130b\u129b', 'la': u'\u120b\u1272\u1295\u129b', 'ln': u'\u120a\u1295\u130b\u120b\u129b', 'lo': u'\u120b\u12cd\u1235\u129b', 'tt': u'\u1273\u1273\u122d\u129b', 'tr': u'\u1271\u122d\u12ad\u129b', 'ts': u'\u133e\u1295\u130b\u129b', 'lv': u'\u120b\u1275\u126a\u12eb\u1295', 'to': u'\u1276\u1295\u130b', 'lt': u'\u120a\u1271\u12a0\u1292\u12eb\u1295', 'tk': u'\u1271\u122d\u12ad\u1218\u1295\u129b', 'th': u'\u1273\u12ed\u129b', 'ti': u'\u1275\u130d\u122d\u129b', 'tg': u'\u1273\u1302\u12aa\u129b', 'te': u'\u1270\u1209\u1309\u129b', 'ta': u'\u1273\u121a\u120d\u129b', 'yi': u'\u12ed\u12f2\u123b\u12ca\u129b', 'yo': u'\u12ee\u1229\u1263\u12ca\u129b', 'gez': u'\u130d\u12d5\u12dd\u129b', 'de': u'\u1300\u122d\u1218\u1295', 'da': u'\u12f4\u1292\u123d', 'dz': u'\u12f5\u12de\u1295\u130d\u12bb\u129b', 'st': u'\u1236\u12de\u129b', 'qu': u'\u12b5\u127f\u129b', 'el': u'\u130d\u122a\u12ad\u129b', 'eo': u'\u12a4\u1235\u1350\u122b\u1295\u1276', 'en': u'\u12a5\u1295\u130d\u120a\u12dd\u129b', 'zh': u'\u127b\u12ed\u1295\u129b', 'za': u'\u12e1\u12cb\u1295\u130d\u129b', 'uk': u'\u12e9\u12ad\u1228\u1292\u129b', 'eu': u'\u1263\u1235\u12ad\u129b', 'et': u'\u12a4\u1235\u1276\u1292\u12a0\u1295', 'es': u'\u1235\u1353\u1292\u123d', 'ru': u'\u122b\u123d\u129b', 'rw': u'\u12aa\u1295\u12eb\u122d\u12cb\u1295\u12f5\u129b', 'rm': u'\u122e\u121b\u1295\u1235', 'rn': u'\u1229\u1295\u12f2\u129b', 'ro': u'\u122e\u121b\u1292\u12eb\u1295', 'bn': u'\u1260\u1295\u130b\u120a\u129b', 'be': u'\u1264\u120b\u122b\u123b\u129b', 'bg': u'\u1261\u120d\u130b\u122a\u129b', 'ba': u'\u1263\u1235\u12aa\u122d\u129b', 'ps': u'\u1351\u123d\u1276\u129b', 'wo': u'\u12ce\u120e\u134d\u129b', 'jv': u'\u1303\u126b\u1295\u129b', 'bo': u'\u1275\u1260\u1275\u1295\u129b', 'bh': u'\u1262\u1203\u122a', 'bi': u'\u1262\u1235\u120b\u121d\u129b', 'br': u'\u1265\u122c\u1276\u1295\u129b', 'ja': u'\u1303\u1353\u1295\u129b', 'om': u'\u12a6\u122e\u121d\u129b', 'oc': u'\u12a6\u12aa\u1273\u1295\u129b', 'tw': u'\u1275\u12ca\u129b', 'or': u'\u12a6\u122a\u12eb\u129b', 'xh': u'\u12de\u1233\u129b', 'co': u'\u12ae\u122d\u1232\u12ab\u129b', 'ca': u'\u12ab\u1273\u120b\u1295\u129b', 'cy': u'\u12c8\u120d\u123d', 'cs': u'\u127c\u12ad\u129b', 'byn': u'\u1265\u120a\u1295', 'pt': u'\u1356\u122d\u1271\u130b\u120a\u129b', 'tl': u'\u1273\u130b\u120e\u1308\u129b', 'pa': u'\u1353\u1295\u1303\u1262\u129b', 'vi': u'\u126a\u1275\u1293\u121d\u129b', 'pl': u'\u1356\u120a\u123d', 'hy': u'\u12a0\u122d\u1218\u1293\u12ca', 'hr': u'\u12ad\u122e\u123d\u12eb\u1295\u129b', 'iu': u'\u12a5\u1291\u12ad\u1272\u1271\u1275\u129b', 'hu': u'\u1200\u1295\u130b\u122a\u129b', 'hi': u'\u1210\u1295\u12f5\u129b', 'ha': u'\u1203\u12cd\u1233\u129b', 'he': u'\u12d5\u1265\u122b\u1235\u1325', 'mg': u'\u121b\u120b\u130b\u1235\u129b', 'uz': u'\u12a1\u12dd\u1260\u12ad\u129b', 'ml': u'\u121b\u120b\u12eb\u120b\u121d\u129b', 'mo': u'\u121e\u120d\u12f3\u126b\u12ca\u1293', 'mn': u'\u121e\u1295\u130e\u120b\u12ca\u129b', 'mi': u'\u121b\u12ee\u122a\u129b', 'ik': u'\u12a5\u1291\u1352\u12eb\u1245\u129b', 'mk': u'\u121b\u12a8\u12f6\u1292\u129b', 'ur': u'\u12a1\u122d\u12f1\u129b', 'mt': u'\u121b\u120d\u1272\u1235\u129b', 'ms': u'\u121b\u120b\u12ed\u129b', 'mr': u'\u121b\u122b\u12da\u129b', 'ug': u'\u12a1\u12ca\u130d\u1201\u122d\u129b', 'my': u'\u1261\u122d\u121b\u129b', 'aa': u'\u12a0\u134b\u122d\u129b', 'ab': u'\u12a0\u1265\u1210\u12da\u129b', 'ss': u'\u1235\u12cb\u1272\u129b', 'af': u'\u12a0\u134d\u122a\u1243\u1295\u1235\u129b', 'tn': u'\u133d\u12cb\u1293\u12ca\u129b', 'sw': u'\u1235\u12cb\u1202\u120a\u129b', 'is': u'\u12a0\u12ed\u1235\u120b\u1295\u12f5\u129b', 'am': u'\u12a0\u121b\u122d\u129b', 'it': u'\u1323\u120a\u12eb\u1295\u129b', 'sv': u'\u1235\u12ca\u12f5\u1295\u129b', 'ia': u'\u12a2\u1295\u1274\u122d\u120a\u1295\u1313', 'as': u'\u12a0\u1233\u121c\u12db\u12ca', 'ar': u'\u12d0\u122d\u1262\u129b', 'su': u'\u1231\u12f3\u1295\u129b', 'zu': u'\u12d9\u1209\u129b', 'ay': u'\u12a0\u12eb\u121b\u122d\u129b', 'az': u'\u12a0\u12dc\u122d\u1263\u12ed\u1303\u1295\u129b', 'ie': u'\u12a5\u1295\u1270\u122d\u120a\u1295\u130d\u12c8', 'id': u'\u12a5\u1295\u12f6\u1292\u1232\u129b', 'sk': u'\u1235\u120e\u126b\u12ad\u129b', 'nl': u'\u12f0\u127d', 'no': u'\u1296\u122d\u12cc\u1302\u12eb\u1295', 'na': u'\u1293\u12a1\u1229', 'ne': u'\u1294\u1353\u120a\u129b', 'vo': u'\u126e\u120b\u1351\u12ad\u129b', 'sid': u'\u1232\u12f3\u121d\u129b', 'tig': u'\u1275\u130d\u1228', 'fr': u'\u1348\u1228\u1295\u1233\u12ed\u129b', 'sm': u'\u1233\u121e\u12a0\u129b', 'fy': u'\u134d\u122a\u1235\u129b', 'fa': u'\u1350\u122d\u1232\u12eb\u129b', 'fi': u'\u134a\u1292\u123d', 'fj': u'\u134a\u1302\u129b', 'sa': u'\u1233\u1295\u1235\u12ad\u122a\u1275\u129b', 'fo': u'\u134b\u122e\u129b', 'ka': u'\u130a\u12ee\u122d\u130a\u12eb\u1295', 'kk': u'\u12ab\u12db\u12ad\u129b', 'sr': u'\u1230\u122d\u1262\u129b', 'sq': u'\u120d\u1264\u1292\u129b', 'ko': u'\u12ae\u122a\u12eb\u129b', 'kn': u'\u12ab\u1293\u12f3\u129b', 'km': u'\u12ad\u1218\u122d\u129b', 'kl': u'\u12ab\u120b\u120a\u1231\u1275\u129b', 'ks': u'\u12ab\u123d\u121a\u122d\u129b', 'si': u'\u1235\u1295\u1203\u120d\u129b', 'so': u'\u1231\u121b\u120d\u129b', 'sn': u'\u123e\u1293\u129b', 'ku': u'\u12a9\u122d\u12f5\u123d\u129b', 'sl': u'\u1235\u120e\u126a\u129b', 'ky': u'\u12aa\u122d\u130a\u12dd\u129b', 'sg': u'\u1233\u1295\u130e\u129b', 'sd': u'\u1232\u1295\u12f5\u1202\u129b'} countries={'BE': u'\u1264\u120d\u1304\u121d', 'BG': u'\u1261\u120d\u130c\u122a\u12eb', 'BA': u'\u1266\u1235\u1292\u12eb \u12a5\u1293 \u1204\u122d\u12de\u130e\u126a\u1292\u12eb', 'BB': u'\u1263\u122d\u1264\u12f6\u1235', 'BM': u'\u1264\u122d\u1219\u12f3', 'BO': u'\u1266\u120a\u126a\u12eb', 'BH': u'\u1263\u1205\u122c\u1295', 'BT': u'\u1261\u1205\u1273\u1295', 'JM': u'\u1303\u121b\u12ed\u12ab', 'JO': u'\u1306\u122d\u12f3\u1295', 'BR': u'\u1265\u122b\u12da\u120d', 'BY': u'\u1264\u120b\u1229\u1235', 'BZ': u'\u1264\u120a\u12d8', 'RU': u'\u122b\u123a\u12eb', 'TL': u'\u121d\u1235\u122b\u1245 \u1272\u121e\u122d', 'RO': u'\u122e\u121c\u1292\u12eb', 'GW': u'\u1262\u1233\u12ce', 'GR': u'\u130d\u122a\u12ad', 'GQ': u'\u12a2\u12b3\u1276\u122a\u12eb\u120d \u130a\u1292', 'JP': u'\u1303\u1353\u1295', 'GY': u'\u1309\u12eb\u1293', 'GF': u'\u12e8\u1348\u1228\u1295\u1233\u12ed \u1309\u12ca\u12a0\u1293', 'GE': u'\u1306\u122d\u1302\u12eb', 'GB': u'\u12a5\u1295\u130d\u120a\u12dd', 'GN': u'\u130a\u1292', 'GM': u'\u130b\u121d\u1262\u12eb', 'TN': u'\u1271\u1292\u12da\u12eb', 'SP': u'\u1230\u122d\u1262\u12eb', 'HR': u'\u12ad\u122e\u12a4\u123d\u12eb', 'HT': u'\u1200\u12ed\u1272', 'HU': u'\u1200\u1295\u130b\u122a', 'HK': u'\u1206\u1295\u130d \u12ae\u1295\u130d', 'VE': u'\u126c\u1295\u12d9\u12cc\u120b', 'PR': u'\u1356\u122d\u1273 \u122a\u12ae', 'PF': u'\u12e8\u1348\u1228\u1295\u1233\u12ed \u1356\u120a\u1294\u12e2\u12eb', 'PG': u'\u1353\u1351\u12cb \u1292\u12cd \u130a\u1292', 'PE': u'\u1354\u1229', 'SO': u'\u1231\u121b\u120c', 'PL': u'\u1356\u120b\u1295\u12f5', 'ZM': u'\u12db\u121d\u1262\u12eb', 'EH': u'\u121d\u12d5\u122b\u1263\u12ca \u1233\u1205\u122b', 'EE': u'\u12a4\u1235\u1276\u1292\u12eb', 'EG': u'\u130d\u1265\u133d', 'ZA': u'\u12f0\u1261\u1265 \u12a0\u134d\u122a\u12ab', 'EC': u'\u12a2\u12b3\u12f6\u122d', 'IT': u'\u1323\u120a\u12eb\u1295', 'ET': u'\u12a2\u1275\u12ee\u1335\u12eb', 'ES': u'\u1235\u1354\u1295', 'ER': u'\u12a4\u122d\u1275\u122b', 'MD': u'\u121e\u120d\u12f6\u126b', 'MA': u'\u121e\u122e\u12ae', 'UZ': u'\u12e9\u12dd\u1260\u12aa\u1235\u1273\u1295', 'MO': u'\u121b\u12ab\u12ce', 'MN': u'\u121e\u1295\u130e\u120a\u12eb', 'MK': u'\u121b\u12a8\u12f6\u1292\u12eb', 'MU': u'\u121b\u1229\u1238\u1235', 'MT': u'\u121b\u120d\u1273', 'MR': u'\u121e\u122a\u1274\u1292\u12eb', 'UG': u'\u12e9\u130b\u1295\u12f3', 'MY': u'\u121b\u120c\u12e2\u12eb', 'MX': u'\u121c\u12ad\u1232\u12ae', 'IL': u'\u12a5\u1235\u122b\u12a4\u120d', 'FI': u'\u134a\u1295\u120b\u1295\u12f5', 'FJ': u'\u134a\u1302', 'FM': u'\u121a\u12ad\u122e\u1294\u12e2\u12eb', 'NL': u'\u1294\u12d8\u122d\u120b\u1295\u12f5', 'NO': u'\u1296\u122d\u12cc', 'NA': u'\u1293\u121a\u1262\u12eb', 'NC': u'\u1292\u12cd \u12ab\u120c\u12f6\u1292\u12eb', 'NG': u'\u1293\u12ed\u1304\u122a\u12eb', 'NZ': u'\u1292\u12cd \u12da\u120b\u1295\u12f5', 'NP': u'\u1294\u1353\u120d', 'CH': u'\u1235\u12ca\u12d8\u122d\u120b\u1295\u12f5', 'CO': u'\u12ae\u120e\u121d\u1262\u12eb', 'CN': u'\u127b\u12ed\u1293', 'CM': u'\u12ab\u121c\u1229\u1295', 'CL': u'\u127a\u120a', 'CF': u'\u12e8\u1218\u12ab\u12a8\u1208\u129b\u12cd \u12a0\u134d\u122a\u12ab \u122a\u1350\u1265\u120a\u12ad', 'CD': u'\u12ae\u1295\u130e', 'CZ': u'\u127c\u12ad \u122a\u1351\u1265\u120a\u12ad', 'CY': u'\u1233\u12ed\u1355\u1228\u1235', 'CV': u'\u12ac\u1355 \u126c\u122d\u12f4', 'SY': u'\u1232\u122a\u12eb', 'KH': u'\u12ab\u121d\u1266\u12f2\u12eb', 'KM': u'\u12ae\u121e\u122e\u1235', 'SK': u'\u1235\u120e\u126b\u12aa\u12eb', 'KR': u'\u1230\u121c\u1295 \u12ae\u122a\u12eb', 'SI': u'\u1235\u120e\u126c\u1292\u12eb', 'KP': u'\u12f0\u1261\u1265 \u12ae\u122a\u12eb', 'KW': u'\u12ad\u12cc\u1275', 'SN': u'\u1234\u1294\u130b\u120d', 'SA': u'\u1233\u12cd\u12f5\u12a0\u1228\u1262\u12eb', 'SG': u'\u1232\u1295\u130b\u1356\u122d', 'SE': u'\u1235\u12ca\u12f5\u1295', 'SD': u'\u1231\u12f3\u1295', 'DO': u'\u12f6\u121a\u1292\u12ad \u122a\u1351\u1265\u120a\u12ad', 'DM': u'\u12f6\u121a\u1292\u12ab', 'DK': u'\u12f4\u1295\u121b\u122d\u12ad', 'DE': u'\u1300\u122d\u1218\u1295', 'YE': u'\u12e8\u1218\u1295', 'DZ': u'\u12a0\u120d\u1304\u122a\u12eb', 'US': u'\u12a0\u121c\u122a\u12ab', 'YU': u'\u12e9\u130e\u12dd\u120b\u126a\u12eb', 'LB': u'\u120a\u1263\u1296\u1235', 'TT': u'\u1275\u122a\u1292\u12f3\u12f5 \u12a5\u1293 \u1276\u1263\u130e', 'TR': u'\u1271\u122d\u12ad', 'LV': u'\u120b\u1275\u126a\u12eb', 'LT': u'\u120a\u1271\u12cc\u1292\u12eb', 'TJ': u'\u1273\u1303\u12aa\u1235\u1273\u1295', 'TH': u'\u1273\u12ed\u120b\u1295\u12f5', 'TF': u'\u12e8\u1348\u1228\u1295\u1233\u12ed \u12f0\u1261\u1263\u12ca \u130d\u12db\u1276\u127d', 'TD': u'\u127b\u12f5', 'LY': u'\u120a\u1262\u12eb', 'AE': u'\u12e8\u1270\u1263\u1260\u1229\u1275 \u12a0\u1228\u1265 \u12a4\u121d\u122c\u1275\u1235', 'AD': u'\u12a0\u1295\u12f6\u122b', 'VG': u'\u12e8\u12a5\u1295\u130d\u120a\u12dd \u12f5\u1295\u130d\u120d \u12f0\u1234\u1276\u127d', 'IQ': u'\u12a2\u122b\u1245', 'VI': u'\u12e8\u12a0\u121c\u122a\u12ab \u1268\u122d\u1302\u1295 \u12f0\u1234\u1276\u127d', 'IS': u'\u12a0\u12ed\u1235\u120b\u1295\u12f5', 'AM': u'\u12a0\u122d\u121c\u1292\u12eb', 'AL': u'\u12a0\u120d\u1263\u1292\u12eb', 'AN': u'\u1294\u12d8\u122d\u120b\u1295\u12f5\u1235 \u12a0\u1295\u1272\u120d\u1235', 'AR': u'\u12a0\u122d\u1300\u1295\u1272\u1293', 'AU': u'\u12a0\u12cd\u1235\u1275\u122c\u120a\u12eb', 'AT': u'\u12a6\u1235\u1275\u122a\u12eb', 'IN': u'\u1205\u1295\u12f5', 'TZ': u'\u1273\u1295\u12db\u1292\u12eb', 'AZ': u'\u12a0\u12d8\u122d\u1263\u1303\u1295', 'IE': u'\u12a0\u12e8\u122d\u120b\u1295\u12f5', 'ID': u'\u12a2\u1295\u12f6\u1294\u12e2\u12eb'} months=[u'\u1303\u1295\u12e9\u12c8\u122a', u'\u134c\u1265\u1229\u12c8\u122a', u'\u121b\u122d\u127d', u'\u12a4\u1355\u1228\u120d', u'\u121c\u12ed', u'\u1301\u1295', u'\u1301\u120b\u12ed', u'\u12a6\u1308\u1235\u1275', u'\u1234\u1355\u1274\u121d\u1260\u122d', u'\u12a6\u12ad\u1270\u12cd\u1260\u122d', u'\u1296\u126c\u121d\u1260\u122d', u'\u12f2\u1234\u121d\u1260\u122d'] abbrMonths=[u'\u1303\u1295\u12e9', u'\u134c\u1265\u1229', u'\u121b\u122d\u127d', u'\u12a4\u1355\u1228', u'\u121c\u12ed', u'\u1301\u1295', u'\u1301\u120b\u12ed', u'\u12a6\u1308\u1235', u'\u1234\u1355\u1274', u'\u12a6\u12ad\u1270', u'\u1296\u126c\u121d', u'\u12f2\u1234\u121d'] days=[u'\u1230\u129e', u'\u121b\u12ad\u1230\u129e', u'\u1228\u1261\u12d5', u'\u1210\u1219\u1235', u'\u12d3\u122d\u1265', u'\u1245\u12f3\u121c', u'\u12a5\u1211\u12f5'] abbrDays=[u'\u1230\u129e', u'\u121b\u12ad\u1230', u'\u1228\u1261\u12d5', u'\u1210\u1219\u1235', u'\u12d3\u122d\u1265', u'\u1245\u12f3\u121c', u'\u12a5\u1211\u12f5'] dateFormats={'medium': '%Y %%(abbrmonthname)s %d ', 'full': '%%(dayname)s, %Y %%(monthname)s %d ', 'long': '%Y %%(monthname)s %d ', 'short': '%y/%m/%d'} numericSymbols={'group': ',', 'nativeZeroDigit': '0', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': '.', 'percentSign': '%', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>h Ѻ++turbogears/i18n/data/am.pyc; :Mc @s hdd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<ddd?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd/<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<d d <d d <d d<dd<dd<dd<dd<dd<dd<dd<dd<d?d@<dAdBIb@00turbogears/i18n/data/am_ET.py# Formatting configuration for locale am_ET languages={'gu': u'\u1309\u1303\u122d\u1272\u129b', 'gd': u'\u12a5\u1235\u12ae\u1275\u1235 \u130c\u120d\u12ad\u129b', 'ga': u'\u12a0\u12ed\u122a\u123d', 'gn': u'\u1313\u122b\u1292\u129b', 'gl': u'\u130b\u1208\u130b\u129b', 'la': u'\u120b\u1272\u1295\u129b', 'ln': u'\u120a\u1295\u130b\u120b\u129b', 'lo': u'\u120b\u12cd\u1235\u129b', 'tt': u'\u1273\u1273\u122d\u129b', 'tr': u'\u1271\u122d\u12ad\u129b', 'ts': u'\u133e\u1295\u130b\u129b', 'lv': u'\u120b\u1275\u126a\u12eb\u1295', 'to': u'\u1276\u1295\u130b', 'lt': u'\u120a\u1271\u12a0\u1292\u12eb\u1295', 'tk': u'\u1271\u122d\u12ad\u1218\u1295\u129b', 'th': u'\u1273\u12ed\u129b', 'ti': u'\u1275\u130d\u122d\u129b', 'tg': u'\u1273\u1302\u12aa\u129b', 'te': u'\u1270\u1209\u1309\u129b', 'ta': u'\u1273\u121a\u120d\u129b', 'yi': u'\u12ed\u12f2\u123b\u12ca\u129b', 'yo': u'\u12ee\u1229\u1263\u12ca\u129b', 'gez': u'\u130d\u12d5\u12dd\u129b', 'de': u'\u1300\u122d\u1218\u1295', 'da': u'\u12f4\u1292\u123d', 'dz': u'\u12f5\u12de\u1295\u130d\u12bb\u129b', 'st': u'\u1236\u12de\u129b', 'qu': u'\u12b5\u127f\u129b', 'el': u'\u130d\u122a\u12ad\u129b', 'eo': u'\u12a4\u1235\u1350\u122b\u1295\u1276', 'en': u'\u12a5\u1295\u130d\u120a\u12dd\u129b', 'zh': u'\u127b\u12ed\u1295\u129b', 'za': u'\u12e1\u12cb\u1295\u130d\u129b', 'uk': u'\u12e9\u12ad\u1228\u1292\u129b', 'eu': u'\u1263\u1235\u12ad\u129b', 'et': u'\u12a4\u1235\u1276\u1292\u12a0\u1295', 'es': u'\u1235\u1353\u1292\u123d', 'ru': u'\u122b\u123d\u129b', 'rw': u'\u12aa\u1295\u12eb\u122d\u12cb\u1295\u12f5\u129b', 'rm': u'\u122e\u121b\u1295\u1235', 'rn': u'\u1229\u1295\u12f2\u129b', 'ro': u'\u122e\u121b\u1292\u12eb\u1295', 'bn': u'\u1260\u1295\u130b\u120a\u129b', 'be': u'\u1264\u120b\u122b\u123b\u129b', 'bg': u'\u1261\u120d\u130b\u122a\u129b', 'ba': u'\u1263\u1235\u12aa\u122d\u129b', 'ps': u'\u1351\u123d\u1276\u129b', 'wo': u'\u12ce\u120e\u134d\u129b', 'jv': u'\u1303\u126b\u1295\u129b', 'bo': u'\u1275\u1260\u1275\u1295\u129b', 'bh': u'\u1262\u1203\u122a', 'bi': u'\u1262\u1235\u120b\u121d\u129b', 'br': u'\u1265\u122c\u1276\u1295\u129b', 'ja': u'\u1303\u1353\u1295\u129b', 'om': u'\u12a6\u122e\u121d\u129b', 'oc': u'\u12a6\u12aa\u1273\u1295\u129b', 'tw': u'\u1275\u12ca\u129b', 'or': u'\u12a6\u122a\u12eb\u129b', 'xh': u'\u12de\u1233\u129b', 'co': u'\u12ae\u122d\u1232\u12ab\u129b', 'ca': u'\u12ab\u1273\u120b\u1295\u129b', 'cy': u'\u12c8\u120d\u123d', 'cs': u'\u127c\u12ad\u129b', 'byn': u'\u1265\u120a\u1295', 'pt': u'\u1356\u122d\u1271\u130b\u120a\u129b', 'tl': u'\u1273\u130b\u120e\u1308\u129b', 'pa': u'\u1353\u1295\u1303\u1262\u129b', 'vi': u'\u126a\u1275\u1293\u121d\u129b', 'pl': u'\u1356\u120a\u123d', 'hy': u'\u12a0\u122d\u1218\u1293\u12ca', 'hr': u'\u12ad\u122e\u123d\u12eb\u1295\u129b', 'iu': u'\u12a5\u1291\u12ad\u1272\u1271\u1275\u129b', 'hu': u'\u1200\u1295\u130b\u122a\u129b', 'hi': u'\u1210\u1295\u12f5\u129b', 'ha': u'\u1203\u12cd\u1233\u129b', 'he': u'\u12d5\u1265\u122b\u1235\u1325', 'mg': u'\u121b\u120b\u130b\u1235\u129b', 'uz': u'\u12a1\u12dd\u1260\u12ad\u129b', 'ml': u'\u121b\u120b\u12eb\u120b\u121d\u129b', 'mo': u'\u121e\u120d\u12f3\u126b\u12ca\u1293', 'mn': u'\u121e\u1295\u130e\u120b\u12ca\u129b', 'mi': u'\u121b\u12ee\u122a\u129b', 'ik': u'\u12a5\u1291\u1352\u12eb\u1245\u129b', 'mk': u'\u121b\u12a8\u12f6\u1292\u129b', 'ur': u'\u12a1\u122d\u12f1\u129b', 'mt': u'\u121b\u120d\u1272\u1235\u129b', 'ms': u'\u121b\u120b\u12ed\u129b', 'mr': u'\u121b\u122b\u12da\u129b', 'ug': u'\u12a1\u12ca\u130d\u1201\u122d\u129b', 'my': u'\u1261\u122d\u121b\u129b', 'aa': u'\u12a0\u134b\u122d\u129b', 'ab': u'\u12a0\u1265\u1210\u12da\u129b', 'ss': u'\u1235\u12cb\u1272\u129b', 'af': u'\u12a0\u134d\u122a\u1243\u1295\u1235\u129b', 'tn': u'\u133d\u12cb\u1293\u12ca\u129b', 'sw': u'\u1235\u12cb\u1202\u120a\u129b', 'is': u'\u12a0\u12ed\u1235\u120b\u1295\u12f5\u129b', 'am': u'\u12a0\u121b\u122d\u129b', 'it': u'\u1323\u120a\u12eb\u1295\u129b', 'sv': u'\u1235\u12ca\u12f5\u1295\u129b', 'ia': u'\u12a2\u1295\u1274\u122d\u120a\u1295\u1313', 'as': u'\u12a0\u1233\u121c\u12db\u12ca', 'ar': u'\u12d0\u122d\u1262\u129b', 'su': u'\u1231\u12f3\u1295\u129b', 'zu': u'\u12d9\u1209\u129b', 'ay': u'\u12a0\u12eb\u121b\u122d\u129b', 'az': u'\u12a0\u12dc\u122d\u1263\u12ed\u1303\u1295\u129b', 'ie': u'\u12a5\u1295\u1270\u122d\u120a\u1295\u130d\u12c8', 'id': u'\u12a5\u1295\u12f6\u1292\u1232\u129b', 'sk': u'\u1235\u120e\u126b\u12ad\u129b', 'nl': u'\u12f0\u127d', 'no': u'\u1296\u122d\u12cc\u1302\u12eb\u1295', 'na': u'\u1293\u12a1\u1229', 'ne': u'\u1294\u1353\u120a\u129b', 'vo': u'\u126e\u120b\u1351\u12ad\u129b', 'sid': u'\u1232\u12f3\u121d\u129b', 'tig': u'\u1275\u130d\u1228', 'fr': u'\u1348\u1228\u1295\u1233\u12ed\u129b', 'sm': u'\u1233\u121e\u12a0\u129b', 'fy': u'\u134d\u122a\u1235\u129b', 'fa': u'\u1350\u122d\u1232\u12eb\u129b', 'fi': u'\u134a\u1292\u123d', 'fj': u'\u134a\u1302\u129b', 'sa': u'\u1233\u1295\u1235\u12ad\u122a\u1275\u129b', 'fo': u'\u134b\u122e\u129b', 'ka': u'\u130a\u12ee\u122d\u130a\u12eb\u1295', 'kk': u'\u12ab\u12db\u12ad\u129b', 'sr': u'\u1230\u122d\u1262\u129b', 'sq': u'\u120d\u1264\u1292\u129b', 'ko': u'\u12ae\u122a\u12eb\u129b', 'kn': u'\u12ab\u1293\u12f3\u129b', 'km': u'\u12ad\u1218\u122d\u129b', 'kl': u'\u12ab\u120b\u120a\u1231\u1275\u129b', 'ks': u'\u12ab\u123d\u121a\u122d\u129b', 'si': u'\u1235\u1295\u1203\u120d\u129b', 'so': u'\u1231\u121b\u120d\u129b', 'sn': u'\u123e\u1293\u129b', 'ku': u'\u12a9\u122d\u12f5\u123d\u129b', 'sl': u'\u1235\u120e\u126a\u129b', 'ky': u'\u12aa\u122d\u130a\u12dd\u129b', 'sg': u'\u1233\u1295\u130e\u129b', 'sd': u'\u1232\u1295\u12f5\u1202\u129b'} countries={'BE': u'\u1264\u120d\u1304\u121d', 'BG': u'\u1261\u120d\u130c\u122a\u12eb', 'BA': u'\u1266\u1235\u1292\u12eb \u12a5\u1293 \u1204\u122d\u12de\u130e\u126a\u1292\u12eb', 'BB': u'\u1263\u122d\u1264\u12f6\u1235', 'BM': u'\u1264\u122d\u1219\u12f3', 'BO': u'\u1266\u120a\u126a\u12eb', 'BH': u'\u1263\u1205\u122c\u1295', 'BT': u'\u1261\u1205\u1273\u1295', 'JM': u'\u1303\u121b\u12ed\u12ab', 'JO': u'\u1306\u122d\u12f3\u1295', 'BR': u'\u1265\u122b\u12da\u120d', 'BY': u'\u1264\u120b\u1229\u1235', 'BZ': u'\u1264\u120a\u12d8', 'RU': u'\u122b\u123a\u12eb', 'TL': u'\u121d\u1235\u122b\u1245 \u1272\u121e\u122d', 'RO': u'\u122e\u121c\u1292\u12eb', 'GW': u'\u1262\u1233\u12ce', 'GR': u'\u130d\u122a\u12ad', 'GQ': u'\u12a2\u12b3\u1276\u122a\u12eb\u120d \u130a\u1292', 'JP': u'\u1303\u1353\u1295', 'GY': u'\u1309\u12eb\u1293', 'GF': u'\u12e8\u1348\u1228\u1295\u1233\u12ed \u1309\u12ca\u12a0\u1293', 'GE': u'\u1306\u122d\u1302\u12eb', 'GB': u'\u12a5\u1295\u130d\u120a\u12dd', 'GN': u'\u130a\u1292', 'GM': u'\u130b\u121d\u1262\u12eb', 'TN': u'\u1271\u1292\u12da\u12eb', 'SP': u'\u1230\u122d\u1262\u12eb', 'HR': u'\u12ad\u122e\u12a4\u123d\u12eb', 'HT': u'\u1200\u12ed\u1272', 'HU': u'\u1200\u1295\u130b\u122a', 'HK': u'\u1206\u1295\u130d \u12ae\u1295\u130d', 'VE': u'\u126c\u1295\u12d9\u12cc\u120b', 'PR': u'\u1356\u122d\u1273 \u122a\u12ae', 'PF': u'\u12e8\u1348\u1228\u1295\u1233\u12ed \u1356\u120a\u1294\u12e2\u12eb', 'PG': u'\u1353\u1351\u12cb \u1292\u12cd \u130a\u1292', 'PE': u'\u1354\u1229', 'SO': u'\u1231\u121b\u120c', 'PL': u'\u1356\u120b\u1295\u12f5', 'ZM': u'\u12db\u121d\u1262\u12eb', 'EH': u'\u121d\u12d5\u122b\u1263\u12ca \u1233\u1205\u122b', 'EE': u'\u12a4\u1235\u1276\u1292\u12eb', 'EG': u'\u130d\u1265\u133d', 'ZA': u'\u12f0\u1261\u1265 \u12a0\u134d\u122a\u12ab', 'EC': u'\u12a2\u12b3\u12f6\u122d', 'IT': u'\u1323\u120a\u12eb\u1295', 'ET': u'\u12a2\u1275\u12ee\u1335\u12eb', 'ES': u'\u1235\u1354\u1295', 'ER': u'\u12a4\u122d\u1275\u122b', 'MD': u'\u121e\u120d\u12f6\u126b', 'MA': u'\u121e\u122e\u12ae', 'UZ': u'\u12e9\u12dd\u1260\u12aa\u1235\u1273\u1295', 'MO': u'\u121b\u12ab\u12ce', 'MN': u'\u121e\u1295\u130e\u120a\u12eb', 'MK': u'\u121b\u12a8\u12f6\u1292\u12eb', 'MU': u'\u121b\u1229\u1238\u1235', 'MT': u'\u121b\u120d\u1273', 'MR': u'\u121e\u122a\u1274\u1292\u12eb', 'UG': u'\u12e9\u130b\u1295\u12f3', 'MY': u'\u121b\u120c\u12e2\u12eb', 'MX': u'\u121c\u12ad\u1232\u12ae', 'IL': u'\u12a5\u1235\u122b\u12a4\u120d', 'FI': u'\u134a\u1295\u120b\u1295\u12f5', 'FJ': u'\u134a\u1302', 'FM': u'\u121a\u12ad\u122e\u1294\u12e2\u12eb', 'NL': u'\u1294\u12d8\u122d\u120b\u1295\u12f5', 'NO': u'\u1296\u122d\u12cc', 'NA': u'\u1293\u121a\u1262\u12eb', 'NC': u'\u1292\u12cd \u12ab\u120c\u12f6\u1292\u12eb', 'NG': u'\u1293\u12ed\u1304\u122a\u12eb', 'NZ': u'\u1292\u12cd \u12da\u120b\u1295\u12f5', 'NP': u'\u1294\u1353\u120d', 'CH': u'\u1235\u12ca\u12d8\u122d\u120b\u1295\u12f5', 'CO': u'\u12ae\u120e\u121d\u1262\u12eb', 'CN': u'\u127b\u12ed\u1293', 'CM': u'\u12ab\u121c\u1229\u1295', 'CL': u'\u127a\u120a', 'CF': u'\u12e8\u1218\u12ab\u12a8\u1208\u129b\u12cd \u12a0\u134d\u122a\u12ab \u122a\u1350\u1265\u120a\u12ad', 'CD': u'\u12ae\u1295\u130e', 'CZ': u'\u127c\u12ad \u122a\u1351\u1265\u120a\u12ad', 'CY': u'\u1233\u12ed\u1355\u1228\u1235', 'CV': u'\u12ac\u1355 \u126c\u122d\u12f4', 'SY': u'\u1232\u122a\u12eb', 'KH': u'\u12ab\u121d\u1266\u12f2\u12eb', 'KM': u'\u12ae\u121e\u122e\u1235', 'SK': u'\u1235\u120e\u126b\u12aa\u12eb', 'KR': u'\u1230\u121c\u1295 \u12ae\u122a\u12eb', 'SI': u'\u1235\u120e\u126c\u1292\u12eb', 'KP': u'\u12f0\u1261\u1265 \u12ae\u122a\u12eb', 'KW': u'\u12ad\u12cc\u1275', 'SN': u'\u1234\u1294\u130b\u120d', 'SA': u'\u1233\u12cd\u12f5\u12a0\u1228\u1262\u12eb', 'SG': u'\u1232\u1295\u130b\u1356\u122d', 'SE': u'\u1235\u12ca\u12f5\u1295', 'SD': u'\u1231\u12f3\u1295', 'DO': u'\u12f6\u121a\u1292\u12ad \u122a\u1351\u1265\u120a\u12ad', 'DM': u'\u12f6\u121a\u1292\u12ab', 'DK': u'\u12f4\u1295\u121b\u122d\u12ad', 'DE': u'\u1300\u122d\u1218\u1295', 'YE': u'\u12e8\u1218\u1295', 'DZ': u'\u12a0\u120d\u1304\u122a\u12eb', 'US': u'\u12a0\u121c\u122a\u12ab', 'YU': u'\u12e9\u130e\u12dd\u120b\u126a\u12eb', 'LB': u'\u120a\u1263\u1296\u1235', 'TT': u'\u1275\u122a\u1292\u12f3\u12f5 \u12a5\u1293 \u1276\u1263\u130e', 'TR': u'\u1271\u122d\u12ad', 'LV': u'\u120b\u1275\u126a\u12eb', 'LT': u'\u120a\u1271\u12cc\u1292\u12eb', 'TJ': u'\u1273\u1303\u12aa\u1235\u1273\u1295', 'TH': u'\u1273\u12ed\u120b\u1295\u12f5', 'TF': u'\u12e8\u1348\u1228\u1295\u1233\u12ed \u12f0\u1261\u1263\u12ca \u130d\u12db\u1276\u127d', 'TD': u'\u127b\u12f5', 'LY': u'\u120a\u1262\u12eb', 'AE': u'\u12e8\u1270\u1263\u1260\u1229\u1275 \u12a0\u1228\u1265 \u12a4\u121d\u122c\u1275\u1235', 'AD': u'\u12a0\u1295\u12f6\u122b', 'VG': u'\u12e8\u12a5\u1295\u130d\u120a\u12dd \u12f5\u1295\u130d\u120d \u12f0\u1234\u1276\u127d', 'IQ': u'\u12a2\u122b\u1245', 'VI': u'\u12e8\u12a0\u121c\u122a\u12ab \u1268\u122d\u1302\u1295 \u12f0\u1234\u1276\u127d', 'IS': u'\u12a0\u12ed\u1235\u120b\u1295\u12f5', 'AM': u'\u12a0\u122d\u121c\u1292\u12eb', 'AL': u'\u12a0\u120d\u1263\u1292\u12eb', 'AN': u'\u1294\u12d8\u122d\u120b\u1295\u12f5\u1235 \u12a0\u1295\u1272\u120d\u1235', 'AR': u'\u12a0\u122d\u1300\u1295\u1272\u1293', 'AU': u'\u12a0\u12cd\u1235\u1275\u122c\u120a\u12eb', 'AT': u'\u12a6\u1235\u1275\u122a\u12eb', 'IN': u'\u1205\u1295\u12f5', 'TZ': u'\u1273\u1295\u12db\u1292\u12eb', 'AZ': u'\u12a0\u12d8\u122d\u1263\u1303\u1295', 'IE': u'\u12a0\u12e8\u122d\u120b\u1295\u12f5', 'ID': u'\u12a2\u1295\u12f6\u1294\u12e2\u12eb'} months=[u'\u1303\u1295\u12e9\u12c8\u122a', u'\u134c\u1265\u1229\u12c8\u122a', u'\u121b\u122d\u127d', u'\u12a4\u1355\u1228\u120d', u'\u121c\u12ed', u'\u1301\u1295', u'\u1301\u120b\u12ed', u'\u12a6\u1308\u1235\u1275', u'\u1234\u1355\u1274\u121d\u1260\u122d', u'\u12a6\u12ad\u1270\u12cd\u1260\u122d', u'\u1296\u126c\u121d\u1260\u122d', u'\u12f2\u1234\u121d\u1260\u122d'] abbrMonths=[u'\u1303\u1295\u12e9', u'\u134c\u1265\u1229', u'\u121b\u122d\u127d', u'\u12a4\u1355\u1228', u'\u121c\u12ed', u'\u1301\u1295', u'\u1301\u120b\u12ed', u'\u12a6\u1308\u1235', u'\u1234\u1355\u1274', u'\u12a6\u12ad\u1270', u'\u1296\u126c\u121d', u'\u12f2\u1234\u121d'] days=[u'\u1230\u129e', u'\u121b\u12ad\u1230\u129e', u'\u1228\u1261\u12d5', u'\u1210\u1219\u1235', u'\u12d3\u122d\u1265', u'\u1245\u12f3\u121c', u'\u12a5\u1211\u12f5'] abbrDays=[u'\u1230\u129e', u'\u121b\u12ad\u1230', u'\u1228\u1261\u12d5', u'\u1210\u1219\u1235', u'\u12d3\u122d\u1265', u'\u1245\u12f3\u121c', u'\u12a5\u1211\u12f5'] dateFormats={'medium': '%d-%%(abbrmonthname)s-%y', 'full': u'%%(dayname)s\u1363 %d %%(monthname)s \u1240\u1295 %Y G', 'long': '%d %%(monthname)s %Y', 'short': '%d/%m/%y'} numericSymbols={'group': ',', 'nativeZeroDigit': '0', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': '.', 'percentSign': '%', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>zC++turbogears/i18n/data/am_ET.pyc; :Mc @s hdd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<ddd?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd/<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<d d <d d <d d<dd<dd<dd<dd<dd<dd<dd<dd<d?d@<dAdBCC=C=turbogears/i18n/data/ar.py# Formatting configuration for locale ar languages={'el': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646\u064a\u0629', 'gu': u'\u0627\u0644\u063a\u0648\u062c\u0627\u0631\u0627\u062a\u064a\u0629', 'en': u'\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629', 'zh': u'\u0627\u0644\u0635\u064a\u0646\u064a\u0629', 'sw': u'\u0627\u0644\u0633\u0648\u0627\u062d\u0644\u064a\u0629', 'ca': u'\u0627\u0644\u0643\u0627\u062a\u0627\u0644\u0648\u064a\u0646\u064a\u0629', 'it': u'\u0627\u0644\u0627\u064a\u0637\u0627\u0644\u064a\u0629', 'ar': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629', 'id': u'\u0627\u0644\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0629', 'es': u'\u0627\u0644\u0627\u0633\u0628\u0627\u0646\u064a\u0629', 'ru': u'\u0627\u0644\u0631\u0648\u0633\u064a\u0629', 'nl': u'\u0627\u0644\u0647\u0648\u0644\u0646\u062f\u064a\u0629', 'pt': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644\u064a\u0629', 'tr': u'\u0627\u0644\u062a\u0631\u0643\u064a\u0629', 'ne': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629', 'lt': u'\u0627\u0644\u0644\u062a\u0648\u0627\u0646\u064a\u0629', 'pa': u'\u0627\u0644\u0628\u0646\u062c\u0627\u0628\u064a\u0629', 'th': u'\u0627\u0644\u062a\u0627\u064a\u0644\u0627\u0646\u062f\u064a\u0629', 'vi': u'\u0627\u0644\u0641\u064a\u062a\u0646\u0627\u0645\u064a\u0629', 'ro': u'\u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064a\u0629', 'be': u'\u0627\u0644\u0628\u064a\u0644\u0648\u0631\u0648\u0633\u064a\u0629', 'fr': u'\u0627\u0644\u0641\u0631\u0646\u0633\u064a\u0629', 'bg': u'\u0627\u0644\u0628\u0644\u063a\u0627\u0631\u064a\u0629', 'uk': u'\u0627\u0644\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0629', 'hr': u'\u0627\u0644\u0643\u0631\u0648\u0627\u062a\u064a\u0629', 'bn': u'\u0627\u0644\u0628\u0646\u063a\u0627\u0644\u064a\u0629', 'bo': u'\u0627\u0644\u062a\u0628\u062a\u064a\u0629', 'da': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a\u0629', 'fa': u'\u0627\u0644\u0641\u0627\u0631\u0633\u064a\u0629', 'hi': u'\u0627\u0644\u0647\u0646\u062f\u064a\u0629', 'dz': u'\u0627\u0644\u0632\u0648\u0646\u062e\u0627\u064a\u0629', 'dv': u'\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629', 'fi': u'\u0627\u0644\u0641\u0646\u0644\u0646\u062f\u064a\u0629', 'ja': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a\u0629', 'he': u'\u0627\u0644\u0639\u0628\u0631\u064a\u0629', 'tl': u'\u0627\u0644\u062a\u0627\u063a\u0627\u0644\u0648\u063a\u064a\u0629', 'sr': u'\u0627\u0644\u0635\u0631\u0628\u064a\u0629', 'sq': u'\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629', 'mn': u'\u0627\u0644\u0645\u0646\u063a\u0648\u0644\u064a\u0629', 'ko': u'\u0627\u0644\u0643\u0648\u0631\u064a\u0629', 'km': u'\u0627\u0644\u062e\u0645\u064a\u0631\u064a\u0629', 'ur': u'\u0627\u0644\u0627\u0631\u062f\u064a\u0629', 'de': u'\u0627\u0644\u0627\u0644\u0645\u0627\u0646\u064a\u0629', 'ms': u'\u0644\u063a\u0629 \u0627\u0644\u0645\u0644\u0627\u064a\u0648', 'ug': u'\u0627\u0644\u0627\u063a\u0648\u0631\u064a\u0629', 'my': u'\u0627\u0644\u0628\u0648\u0631\u0645\u064a\u0629'} countries={'BD': u'\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634', 'BE': u'\u0628\u0644\u062c\u064a\u0643\u0627', 'BF': u'\u0628\u0648\u0631\u0643\u064a\u0646\u0627 \u0641\u0627\u0633\u0648', 'BG': u'\u0628\u0644\u063a\u0627\u0631\u064a\u0627', 'BA': u'\u0627\u0644\u0628\u0648\u0633\u0646\u0629 \u0648\u0627\u0644\u0647\u0631\u0633\u0643', 'BB': u'\u0628\u0631\u0628\u0627\u062f\u0648\u0633', 'BN': u'\u0628\u0631\u0648\u0646\u0627\u064a', 'BO': u'\u0628\u0648\u0644\u064a\u0641\u064a\u0627', 'BH': u'\u0627\u0644\u0628\u062d\u0631\u064a\u0646', 'BI': u'\u0628\u0648\u0631\u0648\u0646\u062f\u064a', 'BJ': u'\u0628\u0646\u064a\u0646', 'BT': u'\u0628\u0648\u062a\u0627\u0646', 'JM': u'\u062c\u0627\u0645\u0627\u064a\u0643\u0627', 'BW': u'\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627', 'WS': u'\u0633\u0627\u0645\u0648\u0627', 'BR': u'\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644', 'BS': u'\u0627\u0644\u0628\u0647\u0627\u0645\u0627', 'BY': u'\u0631\u0648\u0633\u064a\u0627 \u0627\u0644\u0628\u064a\u0636\u0627\u0621', 'BZ': u'\u0628\u0644\u064a\u0632', 'RU': u'\u0631\u0648\u0633\u064a\u0627', 'RW': u'\u0631\u0648\u0627\u0646\u062f\u0627', 'TM': u'\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646', 'TJ': u'\u062a\u0627\u062c\u064a\u0643\u0633\u062a\u0627\u0646', 'RO': u'\u0631\u0648\u0645\u0627\u0646\u064a\u0627', 'GW': u'\u063a\u064a\u0646\u064a\u0627 \u0628\u064a\u0633\u0627\u0648', 'GT': u'\u063a\u0648\u0627\u062a\u064a\u0645\u0627\u0644\u0627', 'GR': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646', 'GQ': u'\u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u0627\u0633\u062a\u0648\u0627\u0626\u064a\u0629', 'JP': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646', 'GY': u'\u063a\u0648\u0627\u064a\u0627\u0646\u0627', 'GE': u'\u062c\u0648\u0631\u062c\u064a\u0627', 'GD': u'\u063a\u0631\u064a\u0646\u0627\u062f\u0627', 'GB': u'\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'GA': u'\u063a\u0627\u0628\u0648\u0646', 'SV': u'\u0627\u0644\u0633\u0644\u0641\u0627\u062f\u0648\u0631', 'GN': u'\u063a\u064a\u0646\u064a\u0627', 'GM': u'\u063a\u0627\u0645\u0628\u064a\u0627', 'GH': u'\u063a\u0627\u0646\u0627', 'OM': u'\u0639\u0645\u0627\u0646', 'TN': u'\u062a\u0648\u0646\u0633', 'JO': u'\u0627\u0644\u0627\u0631\u062f\u0646', 'HR': u'\u0643\u0631\u0648\u0627\u062a\u064a\u0627', 'HT': u'\u0647\u0627\u064a\u062a\u064a', 'HU': u'\u0647\u0646\u063a\u0627\u0631\u064a\u0627', 'HN': u'\u0647\u0646\u062f\u0648\u0631\u0627\u0633', 'VE': u'\u0641\u0646\u0632\u0648\u064a\u0644\u0627', 'PW': u'\u0628\u0627\u0644\u0627\u0648', 'PT': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644', 'PY': u'\u0628\u0627\u0631\u0627\u063a\u0648\u0627\u064a', 'IQ': u'\u0627\u0644\u0639\u0631\u0627\u0642', 'PA': u'\u0628\u0646\u0645\u0627', 'PG': u'\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'PE': u'\u0628\u064a\u0631\u0648', 'PK': u'\u0627\u0644\u0628\u0627\u0643\u0633\u062a\u0627\u0646', 'PH': u'\u0627\u0644\u0641\u064a\u0644\u0628\u064a\u0646', 'PL': u'\u0628\u0648\u0644\u0646\u062f\u0627', 'ZM': u'\u0632\u0627\u0645\u0628\u064a\u0627', 'EH': u'\u0627\u0644\u0635\u062d\u0631\u0627\u0621 \u0627\u0644\u063a\u0631\u0628\u064a\u0629', 'EE': u'\u0627\u0633\u062a\u0648\u0646\u064a\u0627', 'EG': u'\u0645\u0635\u0631', 'ZA': u'\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u064a\u0642\u064a\u0627', 'EC': u'\u0627\u0643\u0648\u0627\u062f\u0648\u0631', 'VN': u'\u0641\u064a\u062a\u0646\u0627\u0645', 'SB': u'\u062c\u0632\u0631 \u0633\u0644\u064a\u0645\u0627\u0646', 'ET': u'\u0627\u062b\u064a\u0648\u0628\u064a\u0627', 'SO': u'\u0627\u0644\u0635\u0648\u0645\u0627\u0644', 'ZW': u'\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a', 'ES': u'\u0627\u0633\u0628\u0627\u0646\u064a\u0627', 'ER': u'\u0627\u0631\u062a\u064a\u0631\u064a\u0627', 'MD': u'\u0645\u0648\u0644\u062f\u0648\u0641\u0627', 'MG': u'\u0645\u062f\u063a\u0634\u0642\u0631', 'MA': u'\u0627\u0644\u0645\u063a\u0631\u0628', 'MC': u'\u0645\u0648\u0646\u0627\u0643\u0648', 'UZ': u'\u0627\u0632\u0628\u0643\u0633\u062a\u0627\u0646', 'MM': u'\u0645\u064a\u0627\u0646\u0645\u0627\u0631', 'ML': u'\u0645\u0627\u0644\u064a', 'MN': u'\u0645\u0646\u063a\u0648\u0644\u064a\u0627', 'MH': u'\u062c\u0632\u0631 \u0627\u0644\u0645\u0627\u0631\u0634\u0627\u0644', 'MK': u'\u0645\u0642\u062f\u0648\u0646\u064a\u0627', 'MU': u'\u0645\u0648\u0631\u064a\u0634\u0648\u0633', 'MT': u'\u0645\u0627\u0644\u0637\u0629', 'MW': u'\u0645\u0644\u0627\u0648\u064a', 'MV': u'\u0645\u0627\u0644\u062f\u064a\u0641', 'MR': u'\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627', 'UG': u'\u0627\u0648\u063a\u0646\u062f\u0627', 'MY': u'\u0645\u0627\u0644\u064a\u0632\u064a\u0627', 'MX': u'\u0627\u0644\u0645\u0643\u0633\u064a\u0643', 'IL': u'\u0627\u0633\u0631\u0627\u0626\u064a\u0644', 'FR': u'\u0641\u0631\u0646\u0633\u0627', 'FI': u'\u0641\u0646\u0644\u0646\u062f\u0627', 'FJ': u'\u0641\u064a\u062c\u064a', 'FM': u'\u0645\u064a\u0643\u0631\u0648\u0646\u064a\u0632\u064a\u0627', 'NI': u'\u0646\u064a\u0643\u0627\u0631\u0627\u063a\u0648\u0627', 'NL': u'\u0647\u0648\u0644\u0646\u062f\u0627', 'NO': u'\u0627\u0644\u0646\u0631\u0648\u064a\u062c', 'NA': u'\u0646\u0627\u0645\u064a\u0628\u064a\u0627', 'VU': u'\u0641\u0627\u0646\u0648\u0622\u062a\u0648', 'NE': u'\u0627\u0644\u0646\u064a\u062c\u0631', 'NG': u'\u0646\u064a\u062c\u064a\u0631\u064a\u0627', 'NZ': u'\u0632\u064a\u0644\u0646\u062f\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'NP': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644', 'NR': u'\u0646\u0627\u0648\u0631\u0648', 'CH': u'\u0633\u0648\u064a\u0633\u0631\u0627', 'CO': u'\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627', 'CN': u'\u0627\u0644\u0635\u064a\u0646', 'CM': u'\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0648\u0646', 'CL': u'\u062a\u0634\u064a\u0644\u064a', 'CA': u'\u0643\u0646\u062f\u0627', 'CG': u'\u0627\u0644\u0643\u0648\u0646\u063a\u0648', 'CF': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0641\u0631\u064a\u0642\u064a\u0627 \u0627\u0644\u0648\u0633\u0637\u0649', 'CZ': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062a\u0634\u064a\u0643', 'CY': u'\u0642\u0628\u0631\u0635', 'CR': u'\u0643\u0648\u0633\u062a\u0627\u0631\u064a\u0643\u0627', 'CV': u'\u0627\u0644\u0631\u0623\u0633 \u0627\u0644\u0627\u062e\u0636\u0631', 'CU': u'\u0643\u0648\u0628\u0627', 'SZ': u'\u0633\u0648\u0627\u0632\u064a\u0644\u0627\u0646\u062f', 'SY': u'\u0633\u0648\u0631\u064a\u0629', 'KG': u'\u0642\u064a\u0631\u063a\u064a\u0632\u0633\u062a\u0627\u0646', 'KE': u'\u0643\u064a\u0646\u064a\u0627', 'SR': u'\u0633\u0648\u0631\u064a\u0646\u0627\u0645', 'KI': u'\u0643\u064a\u0631\u064a\u0628\u0627\u062a\u064a', 'KH': u'\u0643\u0645\u0628\u0648\u062f\u064a\u0627', 'KN': u'\u0633\u0627\u0646\u062a \u0643\u064a\u062a\u0633 \u0648\u0646\u064a\u0641\u064a\u0633', 'KM': u'\u062c\u0632\u0631 \u0627\u0644\u0642\u0645\u0631', 'ST': u'\u0633\u0627\u0646 \u062a\u0648\u0645\u064a \u0648\u0628\u0631\u064a\u0646\u0633\u064a\u0628\u064a', 'SK': u'\u0633\u0644\u0648\u0641\u0627\u0643\u064a\u0627', 'KR': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u062c\u0646\u0648\u0628\u064a\u0629', 'SI': u'\u0633\u0644\u0648\u0641\u064a\u0646\u064a\u0627', 'KP': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629', 'KW': u'\u0627\u0644\u0643\u0648\u064a\u062a', 'SN': u'\u0627\u0644\u0633\u0646\u063a\u0627\u0644', 'SM': u'\u0633\u0627\u0646 \u0645\u0627\u0631\u064a\u0646\u0648', 'SL': u'\u0633\u064a\u0631\u0627\u0644\u064a\u0648\u0646', 'SC': u'\u0633\u064a\u0634\u0644', 'KZ': u'\u0643\u0627\u0632\u0627\u062e\u0633\u062a\u0627\u0646', 'SA': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629', 'SG': u'\u0633\u0646\u063a\u0627\u0641\u0648\u0631\u0629', 'SE': u'\u0627\u0644\u0633\u0648\u064a\u062f', 'SD': u'\u0627\u0644\u0633\u0648\u062f\u0627\u0646', 'DO': u'\u0627\u0644\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u064a\u0629', 'DM': u'\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u0627', 'DJ': u'\u062c\u064a\u0628\u0648\u062a\u064a', 'DK': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0631\u0643', 'DE': u'\u0627\u0644\u0645\u0627\u0646\u064a\u0627', 'YE': u'\u0627\u0644\u064a\u0645\u0646', 'DZ': u'\u0627\u0644\u062c\u0632\u0627\u0626\u0631', 'US': u'\u0627\u0644\u0627\u0648\u0644\u0627\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u062d\u062f\u0629 \u0627\u0644\u0627\u0645\u0631\u064a\u0643\u064a\u0629', 'UY': u'\u0627\u0631\u0648\u063a\u0648\u0627\u064a', 'LB': u'\u0644\u0628\u0646\u0627\u0646', 'LC': u'\u0633\u0627\u0646\u062a \u0644\u0648\u0633\u064a\u0627', 'LA': u'\u0644\u0627\u0648\u0633', 'TV': u'\u062a\u0648\u0641\u0627\u0644\u0648', 'TW': u'\u062a\u0627\u064a\u0648\u0627\u0646', 'TT': u'\u062a\u0631\u064a\u0646\u064a\u062f\u0627\u062f \u0648\u062a\u0648\u0628\u0627\u063a\u0648', 'TR': u'\u062a\u0631\u0643\u064a\u0627', 'LK': u'\u0633\u0631\u064a \u0644\u0627\u0646\u0643\u0627', 'LI': u'\u0644\u064a\u062e\u062a\u0646\u0634\u062a\u0627\u064a\u0646', 'LV': u'\u0644\u0627\u062a\u0641\u064a\u0627', 'TO': u'\u062a\u0648\u0646\u063a\u0627', 'LT': u'\u0644\u064a\u062a\u0648\u0627\u0646\u064a\u0627', 'LU': u'\u0644\u0648\u0643\u0633\u0648\u0645\u0628\u0631\u063a', 'LR': u'\u0644\u064a\u0628\u064a\u0631\u064a\u0627', 'LS': u'\u0644\u064a\u0633\u0648\u062a\u0648', 'TH': u'\u062a\u0627\u064a\u0644\u0646\u062f', 'TG': u'\u062a\u0648\u063a\u0648', 'TD': u'\u062a\u0634\u0627\u062f', 'LY': u'\u0644\u064a\u0628\u064a\u0627', 'VA': u'\u0627\u0644\u0641\u0627\u062a\u064a\u0643\u0627\u0646', 'VC': u'\u0633\u0627\u0646\u062a \u0641\u0646\u0633\u0646\u062a \u0648\u062c\u0632\u0631 \u063a\u0631\u064a\u0646\u0627\u062f\u064a\u0646', 'AE': u'\u0627\u0644\u0627\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'AD': u'\u0627\u0646\u062f\u0648\u0631\u0627', 'AG': u'\u0627\u0646\u062a\u064a\u063a\u0648\u0627 \u0648\u0628\u0631\u0628\u0648\u062f\u0627', 'AF': u'\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646', 'AI': u'\u0627\u0644\u0628\u0627\u0646\u064a\u0627', 'IS': u'\u0627\u064a\u0633\u0644\u0646\u062f\u0627', 'IR': u'\u0627\u064a\u0631\u0627\u0646', 'AM': u'\u0627\u0631\u0645\u064a\u0646\u064a\u0627', 'IT': u'\u0627\u064a\u0637\u0627\u0644\u064a\u0627', 'AO': u'\u0627\u0646\u063a\u0648\u0644\u0627', 'AR': u'\u0627\u0644\u0627\u0631\u062c\u0646\u062a\u064a\u0646', 'AU': u'\u0627\u0633\u062a\u0631\u0627\u0644\u064a\u0627', 'AT': u'\u0627\u0644\u0646\u0645\u0633\u0627', 'IN': u'\u0627\u0644\u0647\u0646\u062f', 'TZ': u'\u062a\u0627\u0646\u0632\u0627\u0646\u064a\u0627', 'AZ': u'\u0622\u0630\u0631\u0628\u064a\u062c\u0627\u0646', 'IE': u'\u0627\u064a\u0631\u0644\u0646\u062f\u0627', 'ID': u'\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0627', 'UA': u'\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0627', 'QA': u'\u0642\u0637\u0631', 'MZ': u'\u0645\u0648\u0632\u0645\u0628\u064a\u0642'} months=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] abbrMonths=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] days=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] abbrDays=[u'\u0646', u'\u062b', u'\u0631', u'\u062e', u'\u062c', u'\u0633', u'\u062d'] dateFormats={'medium': '%d/%m/%Y', 'full': '%%(dayname)s, %d %%(monthname)s, %Y', 'long': '%d %%(monthname)s, %Y', 'short': '%d/%m/%Y'} numericSymbols={'group': u'\u066c', 'nativeZeroDigit': u'\u0660', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': u'\u066b', 'percentSign': u'\u066a', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>;''turbogears/i18n/data/ar.pyc; :Mc @s hdd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd۩+iF=F=turbogears/i18n/data/ar_AE.py# Formatting configuration for locale ar_AE languages={'el': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646\u064a\u0629', 'gu': u'\u0627\u0644\u063a\u0648\u062c\u0627\u0631\u0627\u062a\u064a\u0629', 'en': u'\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629', 'zh': u'\u0627\u0644\u0635\u064a\u0646\u064a\u0629', 'sw': u'\u0627\u0644\u0633\u0648\u0627\u062d\u0644\u064a\u0629', 'ca': u'\u0627\u0644\u0643\u0627\u062a\u0627\u0644\u0648\u064a\u0646\u064a\u0629', 'it': u'\u0627\u0644\u0627\u064a\u0637\u0627\u0644\u064a\u0629', 'ar': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629', 'id': u'\u0627\u0644\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0629', 'es': u'\u0627\u0644\u0627\u0633\u0628\u0627\u0646\u064a\u0629', 'ru': u'\u0627\u0644\u0631\u0648\u0633\u064a\u0629', 'nl': u'\u0627\u0644\u0647\u0648\u0644\u0646\u062f\u064a\u0629', 'pt': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644\u064a\u0629', 'tr': u'\u0627\u0644\u062a\u0631\u0643\u064a\u0629', 'ne': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629', 'lt': u'\u0627\u0644\u0644\u062a\u0648\u0627\u0646\u064a\u0629', 'pa': u'\u0627\u0644\u0628\u0646\u062c\u0627\u0628\u064a\u0629', 'th': u'\u0627\u0644\u062a\u0627\u064a\u0644\u0627\u0646\u062f\u064a\u0629', 'vi': u'\u0627\u0644\u0641\u064a\u062a\u0646\u0627\u0645\u064a\u0629', 'ro': u'\u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064a\u0629', 'be': u'\u0627\u0644\u0628\u064a\u0644\u0648\u0631\u0648\u0633\u064a\u0629', 'fr': u'\u0627\u0644\u0641\u0631\u0646\u0633\u064a\u0629', 'bg': u'\u0627\u0644\u0628\u0644\u063a\u0627\u0631\u064a\u0629', 'uk': u'\u0627\u0644\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0629', 'hr': u'\u0627\u0644\u0643\u0631\u0648\u0627\u062a\u064a\u0629', 'bn': u'\u0627\u0644\u0628\u0646\u063a\u0627\u0644\u064a\u0629', 'bo': u'\u0627\u0644\u062a\u0628\u062a\u064a\u0629', 'da': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a\u0629', 'fa': u'\u0627\u0644\u0641\u0627\u0631\u0633\u064a\u0629', 'hi': u'\u0627\u0644\u0647\u0646\u062f\u064a\u0629', 'dz': u'\u0627\u0644\u0632\u0648\u0646\u062e\u0627\u064a\u0629', 'dv': u'\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629', 'fi': u'\u0627\u0644\u0641\u0646\u0644\u0646\u062f\u064a\u0629', 'ja': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a\u0629', 'he': u'\u0627\u0644\u0639\u0628\u0631\u064a\u0629', 'tl': u'\u0627\u0644\u062a\u0627\u063a\u0627\u0644\u0648\u063a\u064a\u0629', 'sr': u'\u0627\u0644\u0635\u0631\u0628\u064a\u0629', 'sq': u'\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629', 'mn': u'\u0627\u0644\u0645\u0646\u063a\u0648\u0644\u064a\u0629', 'ko': u'\u0627\u0644\u0643\u0648\u0631\u064a\u0629', 'km': u'\u0627\u0644\u062e\u0645\u064a\u0631\u064a\u0629', 'ur': u'\u0627\u0644\u0627\u0631\u062f\u064a\u0629', 'de': u'\u0627\u0644\u0627\u0644\u0645\u0627\u0646\u064a\u0629', 'ms': u'\u0644\u063a\u0629 \u0627\u0644\u0645\u0644\u0627\u064a\u0648', 'ug': u'\u0627\u0644\u0627\u063a\u0648\u0631\u064a\u0629', 'my': u'\u0627\u0644\u0628\u0648\u0631\u0645\u064a\u0629'} countries={'BD': u'\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634', 'BE': u'\u0628\u0644\u062c\u064a\u0643\u0627', 'BF': u'\u0628\u0648\u0631\u0643\u064a\u0646\u0627 \u0641\u0627\u0633\u0648', 'BG': u'\u0628\u0644\u063a\u0627\u0631\u064a\u0627', 'BA': u'\u0627\u0644\u0628\u0648\u0633\u0646\u0629 \u0648\u0627\u0644\u0647\u0631\u0633\u0643', 'BB': u'\u0628\u0631\u0628\u0627\u062f\u0648\u0633', 'BN': u'\u0628\u0631\u0648\u0646\u0627\u064a', 'BO': u'\u0628\u0648\u0644\u064a\u0641\u064a\u0627', 'BH': u'\u0627\u0644\u0628\u062d\u0631\u064a\u0646', 'BI': u'\u0628\u0648\u0631\u0648\u0646\u062f\u064a', 'BJ': u'\u0628\u0646\u064a\u0646', 'BT': u'\u0628\u0648\u062a\u0627\u0646', 'JM': u'\u062c\u0627\u0645\u0627\u064a\u0643\u0627', 'BW': u'\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627', 'WS': u'\u0633\u0627\u0645\u0648\u0627', 'BR': u'\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644', 'BS': u'\u0627\u0644\u0628\u0647\u0627\u0645\u0627', 'BY': u'\u0631\u0648\u0633\u064a\u0627 \u0627\u0644\u0628\u064a\u0636\u0627\u0621', 'BZ': u'\u0628\u0644\u064a\u0632', 'RU': u'\u0631\u0648\u0633\u064a\u0627', 'RW': u'\u0631\u0648\u0627\u0646\u062f\u0627', 'TM': u'\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646', 'TJ': u'\u062a\u0627\u062c\u064a\u0643\u0633\u062a\u0627\u0646', 'RO': u'\u0631\u0648\u0645\u0627\u0646\u064a\u0627', 'GW': u'\u063a\u064a\u0646\u064a\u0627 \u0628\u064a\u0633\u0627\u0648', 'GT': u'\u063a\u0648\u0627\u062a\u064a\u0645\u0627\u0644\u0627', 'GR': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646', 'GQ': u'\u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u0627\u0633\u062a\u0648\u0627\u0626\u064a\u0629', 'JP': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646', 'GY': u'\u063a\u0648\u0627\u064a\u0627\u0646\u0627', 'GE': u'\u062c\u0648\u0631\u062c\u064a\u0627', 'GD': u'\u063a\u0631\u064a\u0646\u0627\u062f\u0627', 'GB': u'\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'GA': u'\u063a\u0627\u0628\u0648\u0646', 'SV': u'\u0627\u0644\u0633\u0644\u0641\u0627\u062f\u0648\u0631', 'GN': u'\u063a\u064a\u0646\u064a\u0627', 'GM': u'\u063a\u0627\u0645\u0628\u064a\u0627', 'GH': u'\u063a\u0627\u0646\u0627', 'OM': u'\u0639\u0645\u0627\u0646', 'TN': u'\u062a\u0648\u0646\u0633', 'JO': u'\u0627\u0644\u0627\u0631\u062f\u0646', 'HR': u'\u0643\u0631\u0648\u0627\u062a\u064a\u0627', 'HT': u'\u0647\u0627\u064a\u062a\u064a', 'HU': u'\u0647\u0646\u063a\u0627\u0631\u064a\u0627', 'HN': u'\u0647\u0646\u062f\u0648\u0631\u0627\u0633', 'VE': u'\u0641\u0646\u0632\u0648\u064a\u0644\u0627', 'PW': u'\u0628\u0627\u0644\u0627\u0648', 'PT': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644', 'PY': u'\u0628\u0627\u0631\u0627\u063a\u0648\u0627\u064a', 'IQ': u'\u0627\u0644\u0639\u0631\u0627\u0642', 'PA': u'\u0628\u0646\u0645\u0627', 'PG': u'\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'PE': u'\u0628\u064a\u0631\u0648', 'PK': u'\u0627\u0644\u0628\u0627\u0643\u0633\u062a\u0627\u0646', 'PH': u'\u0627\u0644\u0641\u064a\u0644\u0628\u064a\u0646', 'PL': u'\u0628\u0648\u0644\u0646\u062f\u0627', 'ZM': u'\u0632\u0627\u0645\u0628\u064a\u0627', 'EH': u'\u0627\u0644\u0635\u062d\u0631\u0627\u0621 \u0627\u0644\u063a\u0631\u0628\u064a\u0629', 'EE': u'\u0627\u0633\u062a\u0648\u0646\u064a\u0627', 'EG': u'\u0645\u0635\u0631', 'ZA': u'\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u064a\u0642\u064a\u0627', 'EC': u'\u0627\u0643\u0648\u0627\u062f\u0648\u0631', 'VN': u'\u0641\u064a\u062a\u0646\u0627\u0645', 'SB': u'\u062c\u0632\u0631 \u0633\u0644\u064a\u0645\u0627\u0646', 'ET': u'\u0627\u062b\u064a\u0648\u0628\u064a\u0627', 'SO': u'\u0627\u0644\u0635\u0648\u0645\u0627\u0644', 'ZW': u'\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a', 'ES': u'\u0627\u0633\u0628\u0627\u0646\u064a\u0627', 'ER': u'\u0627\u0631\u062a\u064a\u0631\u064a\u0627', 'MD': u'\u0645\u0648\u0644\u062f\u0648\u0641\u0627', 'MG': u'\u0645\u062f\u063a\u0634\u0642\u0631', 'MA': u'\u0627\u0644\u0645\u063a\u0631\u0628', 'MC': u'\u0645\u0648\u0646\u0627\u0643\u0648', 'UZ': u'\u0627\u0632\u0628\u0643\u0633\u062a\u0627\u0646', 'MM': u'\u0645\u064a\u0627\u0646\u0645\u0627\u0631', 'ML': u'\u0645\u0627\u0644\u064a', 'MN': u'\u0645\u0646\u063a\u0648\u0644\u064a\u0627', 'MH': u'\u062c\u0632\u0631 \u0627\u0644\u0645\u0627\u0631\u0634\u0627\u0644', 'MK': u'\u0645\u0642\u062f\u0648\u0646\u064a\u0627', 'MU': u'\u0645\u0648\u0631\u064a\u0634\u0648\u0633', 'MT': u'\u0645\u0627\u0644\u0637\u0629', 'MW': u'\u0645\u0644\u0627\u0648\u064a', 'MV': u'\u0645\u0627\u0644\u062f\u064a\u0641', 'MR': u'\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627', 'UG': u'\u0627\u0648\u063a\u0646\u062f\u0627', 'MY': u'\u0645\u0627\u0644\u064a\u0632\u064a\u0627', 'MX': u'\u0627\u0644\u0645\u0643\u0633\u064a\u0643', 'IL': u'\u0627\u0633\u0631\u0627\u0626\u064a\u0644', 'FR': u'\u0641\u0631\u0646\u0633\u0627', 'FI': u'\u0641\u0646\u0644\u0646\u062f\u0627', 'FJ': u'\u0641\u064a\u062c\u064a', 'FM': u'\u0645\u064a\u0643\u0631\u0648\u0646\u064a\u0632\u064a\u0627', 'NI': u'\u0646\u064a\u0643\u0627\u0631\u0627\u063a\u0648\u0627', 'NL': u'\u0647\u0648\u0644\u0646\u062f\u0627', 'NO': u'\u0627\u0644\u0646\u0631\u0648\u064a\u062c', 'NA': u'\u0646\u0627\u0645\u064a\u0628\u064a\u0627', 'VU': u'\u0641\u0627\u0646\u0648\u0622\u062a\u0648', 'NE': u'\u0627\u0644\u0646\u064a\u062c\u0631', 'NG': u'\u0646\u064a\u062c\u064a\u0631\u064a\u0627', 'NZ': u'\u0632\u064a\u0644\u0646\u062f\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'NP': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644', 'NR': u'\u0646\u0627\u0648\u0631\u0648', 'CH': u'\u0633\u0648\u064a\u0633\u0631\u0627', 'CO': u'\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627', 'CN': u'\u0627\u0644\u0635\u064a\u0646', 'CM': u'\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0648\u0646', 'CL': u'\u062a\u0634\u064a\u0644\u064a', 'CA': u'\u0643\u0646\u062f\u0627', 'CG': u'\u0627\u0644\u0643\u0648\u0646\u063a\u0648', 'CF': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0641\u0631\u064a\u0642\u064a\u0627 \u0627\u0644\u0648\u0633\u0637\u0649', 'CZ': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062a\u0634\u064a\u0643', 'CY': u'\u0642\u0628\u0631\u0635', 'CR': u'\u0643\u0648\u0633\u062a\u0627\u0631\u064a\u0643\u0627', 'CV': u'\u0627\u0644\u0631\u0623\u0633 \u0627\u0644\u0627\u062e\u0636\u0631', 'CU': u'\u0643\u0648\u0628\u0627', 'SZ': u'\u0633\u0648\u0627\u0632\u064a\u0644\u0627\u0646\u062f', 'SY': u'\u0633\u0648\u0631\u064a\u0629', 'KG': u'\u0642\u064a\u0631\u063a\u064a\u0632\u0633\u062a\u0627\u0646', 'KE': u'\u0643\u064a\u0646\u064a\u0627', 'SR': u'\u0633\u0648\u0631\u064a\u0646\u0627\u0645', 'KI': u'\u0643\u064a\u0631\u064a\u0628\u0627\u062a\u064a', 'KH': u'\u0643\u0645\u0628\u0648\u062f\u064a\u0627', 'KN': u'\u0633\u0627\u0646\u062a \u0643\u064a\u062a\u0633 \u0648\u0646\u064a\u0641\u064a\u0633', 'KM': u'\u062c\u0632\u0631 \u0627\u0644\u0642\u0645\u0631', 'ST': u'\u0633\u0627\u0646 \u062a\u0648\u0645\u064a \u0648\u0628\u0631\u064a\u0646\u0633\u064a\u0628\u064a', 'SK': u'\u0633\u0644\u0648\u0641\u0627\u0643\u064a\u0627', 'KR': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u062c\u0646\u0648\u0628\u064a\u0629', 'SI': u'\u0633\u0644\u0648\u0641\u064a\u0646\u064a\u0627', 'KP': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629', 'KW': u'\u0627\u0644\u0643\u0648\u064a\u062a', 'SN': u'\u0627\u0644\u0633\u0646\u063a\u0627\u0644', 'SM': u'\u0633\u0627\u0646 \u0645\u0627\u0631\u064a\u0646\u0648', 'SL': u'\u0633\u064a\u0631\u0627\u0644\u064a\u0648\u0646', 'SC': u'\u0633\u064a\u0634\u0644', 'KZ': u'\u0643\u0627\u0632\u0627\u062e\u0633\u062a\u0627\u0646', 'SA': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629', 'SG': u'\u0633\u0646\u063a\u0627\u0641\u0648\u0631\u0629', 'SE': u'\u0627\u0644\u0633\u0648\u064a\u062f', 'SD': u'\u0627\u0644\u0633\u0648\u062f\u0627\u0646', 'DO': u'\u0627\u0644\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u064a\u0629', 'DM': u'\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u0627', 'DJ': u'\u062c\u064a\u0628\u0648\u062a\u064a', 'DK': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0631\u0643', 'DE': u'\u0627\u0644\u0645\u0627\u0646\u064a\u0627', 'YE': u'\u0627\u0644\u064a\u0645\u0646', 'DZ': u'\u0627\u0644\u062c\u0632\u0627\u0626\u0631', 'US': u'\u0627\u0644\u0627\u0648\u0644\u0627\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u062d\u062f\u0629 \u0627\u0644\u0627\u0645\u0631\u064a\u0643\u064a\u0629', 'UY': u'\u0627\u0631\u0648\u063a\u0648\u0627\u064a', 'LB': u'\u0644\u0628\u0646\u0627\u0646', 'LC': u'\u0633\u0627\u0646\u062a \u0644\u0648\u0633\u064a\u0627', 'LA': u'\u0644\u0627\u0648\u0633', 'TV': u'\u062a\u0648\u0641\u0627\u0644\u0648', 'TW': u'\u062a\u0627\u064a\u0648\u0627\u0646', 'TT': u'\u062a\u0631\u064a\u0646\u064a\u062f\u0627\u062f \u0648\u062a\u0648\u0628\u0627\u063a\u0648', 'TR': u'\u062a\u0631\u0643\u064a\u0627', 'LK': u'\u0633\u0631\u064a \u0644\u0627\u0646\u0643\u0627', 'LI': u'\u0644\u064a\u062e\u062a\u0646\u0634\u062a\u0627\u064a\u0646', 'LV': u'\u0644\u0627\u062a\u0641\u064a\u0627', 'TO': u'\u062a\u0648\u0646\u063a\u0627', 'LT': u'\u0644\u064a\u062a\u0648\u0627\u0646\u064a\u0627', 'LU': u'\u0644\u0648\u0643\u0633\u0648\u0645\u0628\u0631\u063a', 'LR': u'\u0644\u064a\u0628\u064a\u0631\u064a\u0627', 'LS': u'\u0644\u064a\u0633\u0648\u062a\u0648', 'TH': u'\u062a\u0627\u064a\u0644\u0646\u062f', 'TG': u'\u062a\u0648\u063a\u0648', 'TD': u'\u062a\u0634\u0627\u062f', 'LY': u'\u0644\u064a\u0628\u064a\u0627', 'VA': u'\u0627\u0644\u0641\u0627\u062a\u064a\u0643\u0627\u0646', 'VC': u'\u0633\u0627\u0646\u062a \u0641\u0646\u0633\u0646\u062a \u0648\u062c\u0632\u0631 \u063a\u0631\u064a\u0646\u0627\u062f\u064a\u0646', 'AE': u'\u0627\u0644\u0627\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'AD': u'\u0627\u0646\u062f\u0648\u0631\u0627', 'AG': u'\u0627\u0646\u062a\u064a\u063a\u0648\u0627 \u0648\u0628\u0631\u0628\u0648\u062f\u0627', 'AF': u'\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646', 'AI': u'\u0627\u0644\u0628\u0627\u0646\u064a\u0627', 'IS': u'\u0627\u064a\u0633\u0644\u0646\u062f\u0627', 'IR': u'\u0627\u064a\u0631\u0627\u0646', 'AM': u'\u0627\u0631\u0645\u064a\u0646\u064a\u0627', 'IT': u'\u0627\u064a\u0637\u0627\u0644\u064a\u0627', 'AO': u'\u0627\u0646\u063a\u0648\u0644\u0627', 'AR': u'\u0627\u0644\u0627\u0631\u062c\u0646\u062a\u064a\u0646', 'AU': u'\u0627\u0633\u062a\u0631\u0627\u0644\u064a\u0627', 'AT': u'\u0627\u0644\u0646\u0645\u0633\u0627', 'IN': u'\u0627\u0644\u0647\u0646\u062f', 'TZ': u'\u062a\u0627\u0646\u0632\u0627\u0646\u064a\u0627', 'AZ': u'\u0622\u0630\u0631\u0628\u064a\u062c\u0627\u0646', 'IE': u'\u0627\u064a\u0631\u0644\u0646\u062f\u0627', 'ID': u'\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0627', 'UA': u'\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0627', 'QA': u'\u0642\u0637\u0631', 'MZ': u'\u0645\u0648\u0632\u0645\u0628\u064a\u0642'} months=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] abbrMonths=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] days=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] abbrDays=[u'\u0646', u'\u062b', u'\u0631', u'\u062e', u'\u062c', u'\u0633', u'\u062d'] dateFormats={'medium': '%d/%m/%Y', 'full': '%%(dayname)s, %d %%(monthname)s, %Y', 'long': '%d %%(monthname)s, %Y', 'short': '%d/%m/%Y'} numericSymbols={'group': u'\u066c', 'nativeZeroDigit': u'\u0660', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': u'\u066b', 'percentSign': u'\u066a', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>d''turbogears/i18n/data/ar_AE.pyc; :Mc @s hdd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<ddAnF=F=turbogears/i18n/data/ar_BH.py# Formatting configuration for locale ar_BH languages={'el': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646\u064a\u0629', 'gu': u'\u0627\u0644\u063a\u0648\u062c\u0627\u0631\u0627\u062a\u064a\u0629', 'en': u'\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629', 'zh': u'\u0627\u0644\u0635\u064a\u0646\u064a\u0629', 'sw': u'\u0627\u0644\u0633\u0648\u0627\u062d\u0644\u064a\u0629', 'ca': u'\u0627\u0644\u0643\u0627\u062a\u0627\u0644\u0648\u064a\u0646\u064a\u0629', 'it': u'\u0627\u0644\u0627\u064a\u0637\u0627\u0644\u064a\u0629', 'ar': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629', 'id': u'\u0627\u0644\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0629', 'es': u'\u0627\u0644\u0627\u0633\u0628\u0627\u0646\u064a\u0629', 'ru': u'\u0627\u0644\u0631\u0648\u0633\u064a\u0629', 'nl': u'\u0627\u0644\u0647\u0648\u0644\u0646\u062f\u064a\u0629', 'pt': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644\u064a\u0629', 'tr': u'\u0627\u0644\u062a\u0631\u0643\u064a\u0629', 'ne': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629', 'lt': u'\u0627\u0644\u0644\u062a\u0648\u0627\u0646\u064a\u0629', 'pa': u'\u0627\u0644\u0628\u0646\u062c\u0627\u0628\u064a\u0629', 'th': u'\u0627\u0644\u062a\u0627\u064a\u0644\u0627\u0646\u062f\u064a\u0629', 'vi': u'\u0627\u0644\u0641\u064a\u062a\u0646\u0627\u0645\u064a\u0629', 'ro': u'\u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064a\u0629', 'be': u'\u0627\u0644\u0628\u064a\u0644\u0648\u0631\u0648\u0633\u064a\u0629', 'fr': u'\u0627\u0644\u0641\u0631\u0646\u0633\u064a\u0629', 'bg': u'\u0627\u0644\u0628\u0644\u063a\u0627\u0631\u064a\u0629', 'uk': u'\u0627\u0644\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0629', 'hr': u'\u0627\u0644\u0643\u0631\u0648\u0627\u062a\u064a\u0629', 'bn': u'\u0627\u0644\u0628\u0646\u063a\u0627\u0644\u064a\u0629', 'bo': u'\u0627\u0644\u062a\u0628\u062a\u064a\u0629', 'da': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a\u0629', 'fa': u'\u0627\u0644\u0641\u0627\u0631\u0633\u064a\u0629', 'hi': u'\u0627\u0644\u0647\u0646\u062f\u064a\u0629', 'dz': u'\u0627\u0644\u0632\u0648\u0646\u062e\u0627\u064a\u0629', 'dv': u'\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629', 'fi': u'\u0627\u0644\u0641\u0646\u0644\u0646\u062f\u064a\u0629', 'ja': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a\u0629', 'he': u'\u0627\u0644\u0639\u0628\u0631\u064a\u0629', 'tl': u'\u0627\u0644\u062a\u0627\u063a\u0627\u0644\u0648\u063a\u064a\u0629', 'sr': u'\u0627\u0644\u0635\u0631\u0628\u064a\u0629', 'sq': u'\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629', 'mn': u'\u0627\u0644\u0645\u0646\u063a\u0648\u0644\u064a\u0629', 'ko': u'\u0627\u0644\u0643\u0648\u0631\u064a\u0629', 'km': u'\u0627\u0644\u062e\u0645\u064a\u0631\u064a\u0629', 'ur': u'\u0627\u0644\u0627\u0631\u062f\u064a\u0629', 'de': u'\u0627\u0644\u0627\u0644\u0645\u0627\u0646\u064a\u0629', 'ms': u'\u0644\u063a\u0629 \u0627\u0644\u0645\u0644\u0627\u064a\u0648', 'ug': u'\u0627\u0644\u0627\u063a\u0648\u0631\u064a\u0629', 'my': u'\u0627\u0644\u0628\u0648\u0631\u0645\u064a\u0629'} countries={'BD': u'\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634', 'BE': u'\u0628\u0644\u062c\u064a\u0643\u0627', 'BF': u'\u0628\u0648\u0631\u0643\u064a\u0646\u0627 \u0641\u0627\u0633\u0648', 'BG': u'\u0628\u0644\u063a\u0627\u0631\u064a\u0627', 'BA': u'\u0627\u0644\u0628\u0648\u0633\u0646\u0629 \u0648\u0627\u0644\u0647\u0631\u0633\u0643', 'BB': u'\u0628\u0631\u0628\u0627\u062f\u0648\u0633', 'BN': u'\u0628\u0631\u0648\u0646\u0627\u064a', 'BO': u'\u0628\u0648\u0644\u064a\u0641\u064a\u0627', 'BH': u'\u0627\u0644\u0628\u062d\u0631\u064a\u0646', 'BI': u'\u0628\u0648\u0631\u0648\u0646\u062f\u064a', 'BJ': u'\u0628\u0646\u064a\u0646', 'BT': u'\u0628\u0648\u062a\u0627\u0646', 'JM': u'\u062c\u0627\u0645\u0627\u064a\u0643\u0627', 'BW': u'\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627', 'WS': u'\u0633\u0627\u0645\u0648\u0627', 'BR': u'\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644', 'BS': u'\u0627\u0644\u0628\u0647\u0627\u0645\u0627', 'BY': u'\u0631\u0648\u0633\u064a\u0627 \u0627\u0644\u0628\u064a\u0636\u0627\u0621', 'BZ': u'\u0628\u0644\u064a\u0632', 'RU': u'\u0631\u0648\u0633\u064a\u0627', 'RW': u'\u0631\u0648\u0627\u0646\u062f\u0627', 'TM': u'\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646', 'TJ': u'\u062a\u0627\u062c\u064a\u0643\u0633\u062a\u0627\u0646', 'RO': u'\u0631\u0648\u0645\u0627\u0646\u064a\u0627', 'GW': u'\u063a\u064a\u0646\u064a\u0627 \u0628\u064a\u0633\u0627\u0648', 'GT': u'\u063a\u0648\u0627\u062a\u064a\u0645\u0627\u0644\u0627', 'GR': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646', 'GQ': u'\u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u0627\u0633\u062a\u0648\u0627\u0626\u064a\u0629', 'JP': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646', 'GY': u'\u063a\u0648\u0627\u064a\u0627\u0646\u0627', 'GE': u'\u062c\u0648\u0631\u062c\u064a\u0627', 'GD': u'\u063a\u0631\u064a\u0646\u0627\u062f\u0627', 'GB': u'\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'GA': u'\u063a\u0627\u0628\u0648\u0646', 'SV': u'\u0627\u0644\u0633\u0644\u0641\u0627\u062f\u0648\u0631', 'GN': u'\u063a\u064a\u0646\u064a\u0627', 'GM': u'\u063a\u0627\u0645\u0628\u064a\u0627', 'GH': u'\u063a\u0627\u0646\u0627', 'OM': u'\u0639\u0645\u0627\u0646', 'TN': u'\u062a\u0648\u0646\u0633', 'JO': u'\u0627\u0644\u0627\u0631\u062f\u0646', 'HR': u'\u0643\u0631\u0648\u0627\u062a\u064a\u0627', 'HT': u'\u0647\u0627\u064a\u062a\u064a', 'HU': u'\u0647\u0646\u063a\u0627\u0631\u064a\u0627', 'HN': u'\u0647\u0646\u062f\u0648\u0631\u0627\u0633', 'VE': u'\u0641\u0646\u0632\u0648\u064a\u0644\u0627', 'PW': u'\u0628\u0627\u0644\u0627\u0648', 'PT': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644', 'PY': u'\u0628\u0627\u0631\u0627\u063a\u0648\u0627\u064a', 'IQ': u'\u0627\u0644\u0639\u0631\u0627\u0642', 'PA': u'\u0628\u0646\u0645\u0627', 'PG': u'\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'PE': u'\u0628\u064a\u0631\u0648', 'PK': u'\u0627\u0644\u0628\u0627\u0643\u0633\u062a\u0627\u0646', 'PH': u'\u0627\u0644\u0641\u064a\u0644\u0628\u064a\u0646', 'PL': u'\u0628\u0648\u0644\u0646\u062f\u0627', 'ZM': u'\u0632\u0627\u0645\u0628\u064a\u0627', 'EH': u'\u0627\u0644\u0635\u062d\u0631\u0627\u0621 \u0627\u0644\u063a\u0631\u0628\u064a\u0629', 'EE': u'\u0627\u0633\u062a\u0648\u0646\u064a\u0627', 'EG': u'\u0645\u0635\u0631', 'ZA': u'\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u064a\u0642\u064a\u0627', 'EC': u'\u0627\u0643\u0648\u0627\u062f\u0648\u0631', 'VN': u'\u0641\u064a\u062a\u0646\u0627\u0645', 'SB': u'\u062c\u0632\u0631 \u0633\u0644\u064a\u0645\u0627\u0646', 'ET': u'\u0627\u062b\u064a\u0648\u0628\u064a\u0627', 'SO': u'\u0627\u0644\u0635\u0648\u0645\u0627\u0644', 'ZW': u'\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a', 'ES': u'\u0627\u0633\u0628\u0627\u0646\u064a\u0627', 'ER': u'\u0627\u0631\u062a\u064a\u0631\u064a\u0627', 'MD': u'\u0645\u0648\u0644\u062f\u0648\u0641\u0627', 'MG': u'\u0645\u062f\u063a\u0634\u0642\u0631', 'MA': u'\u0627\u0644\u0645\u063a\u0631\u0628', 'MC': u'\u0645\u0648\u0646\u0627\u0643\u0648', 'UZ': u'\u0627\u0632\u0628\u0643\u0633\u062a\u0627\u0646', 'MM': u'\u0645\u064a\u0627\u0646\u0645\u0627\u0631', 'ML': u'\u0645\u0627\u0644\u064a', 'MN': u'\u0645\u0646\u063a\u0648\u0644\u064a\u0627', 'MH': u'\u062c\u0632\u0631 \u0627\u0644\u0645\u0627\u0631\u0634\u0627\u0644', 'MK': u'\u0645\u0642\u062f\u0648\u0646\u064a\u0627', 'MU': u'\u0645\u0648\u0631\u064a\u0634\u0648\u0633', 'MT': u'\u0645\u0627\u0644\u0637\u0629', 'MW': u'\u0645\u0644\u0627\u0648\u064a', 'MV': u'\u0645\u0627\u0644\u062f\u064a\u0641', 'MR': u'\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627', 'UG': u'\u0627\u0648\u063a\u0646\u062f\u0627', 'MY': u'\u0645\u0627\u0644\u064a\u0632\u064a\u0627', 'MX': u'\u0627\u0644\u0645\u0643\u0633\u064a\u0643', 'IL': u'\u0627\u0633\u0631\u0627\u0626\u064a\u0644', 'FR': u'\u0641\u0631\u0646\u0633\u0627', 'FI': u'\u0641\u0646\u0644\u0646\u062f\u0627', 'FJ': u'\u0641\u064a\u062c\u064a', 'FM': u'\u0645\u064a\u0643\u0631\u0648\u0646\u064a\u0632\u064a\u0627', 'NI': u'\u0646\u064a\u0643\u0627\u0631\u0627\u063a\u0648\u0627', 'NL': u'\u0647\u0648\u0644\u0646\u062f\u0627', 'NO': u'\u0627\u0644\u0646\u0631\u0648\u064a\u062c', 'NA': u'\u0646\u0627\u0645\u064a\u0628\u064a\u0627', 'VU': u'\u0641\u0627\u0646\u0648\u0622\u062a\u0648', 'NE': u'\u0627\u0644\u0646\u064a\u062c\u0631', 'NG': u'\u0646\u064a\u062c\u064a\u0631\u064a\u0627', 'NZ': u'\u0632\u064a\u0644\u0646\u062f\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'NP': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644', 'NR': u'\u0646\u0627\u0648\u0631\u0648', 'CH': u'\u0633\u0648\u064a\u0633\u0631\u0627', 'CO': u'\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627', 'CN': u'\u0627\u0644\u0635\u064a\u0646', 'CM': u'\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0648\u0646', 'CL': u'\u062a\u0634\u064a\u0644\u064a', 'CA': u'\u0643\u0646\u062f\u0627', 'CG': u'\u0627\u0644\u0643\u0648\u0646\u063a\u0648', 'CF': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0641\u0631\u064a\u0642\u064a\u0627 \u0627\u0644\u0648\u0633\u0637\u0649', 'CZ': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062a\u0634\u064a\u0643', 'CY': u'\u0642\u0628\u0631\u0635', 'CR': u'\u0643\u0648\u0633\u062a\u0627\u0631\u064a\u0643\u0627', 'CV': u'\u0627\u0644\u0631\u0623\u0633 \u0627\u0644\u0627\u062e\u0636\u0631', 'CU': u'\u0643\u0648\u0628\u0627', 'SZ': u'\u0633\u0648\u0627\u0632\u064a\u0644\u0627\u0646\u062f', 'SY': u'\u0633\u0648\u0631\u064a\u0629', 'KG': u'\u0642\u064a\u0631\u063a\u064a\u0632\u0633\u062a\u0627\u0646', 'KE': u'\u0643\u064a\u0646\u064a\u0627', 'SR': u'\u0633\u0648\u0631\u064a\u0646\u0627\u0645', 'KI': u'\u0643\u064a\u0631\u064a\u0628\u0627\u062a\u064a', 'KH': u'\u0643\u0645\u0628\u0648\u062f\u064a\u0627', 'KN': u'\u0633\u0627\u0646\u062a \u0643\u064a\u062a\u0633 \u0648\u0646\u064a\u0641\u064a\u0633', 'KM': u'\u062c\u0632\u0631 \u0627\u0644\u0642\u0645\u0631', 'ST': u'\u0633\u0627\u0646 \u062a\u0648\u0645\u064a \u0648\u0628\u0631\u064a\u0646\u0633\u064a\u0628\u064a', 'SK': u'\u0633\u0644\u0648\u0641\u0627\u0643\u064a\u0627', 'KR': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u062c\u0646\u0648\u0628\u064a\u0629', 'SI': u'\u0633\u0644\u0648\u0641\u064a\u0646\u064a\u0627', 'KP': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629', 'KW': u'\u0627\u0644\u0643\u0648\u064a\u062a', 'SN': u'\u0627\u0644\u0633\u0646\u063a\u0627\u0644', 'SM': u'\u0633\u0627\u0646 \u0645\u0627\u0631\u064a\u0646\u0648', 'SL': u'\u0633\u064a\u0631\u0627\u0644\u064a\u0648\u0646', 'SC': u'\u0633\u064a\u0634\u0644', 'KZ': u'\u0643\u0627\u0632\u0627\u062e\u0633\u062a\u0627\u0646', 'SA': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629', 'SG': u'\u0633\u0646\u063a\u0627\u0641\u0648\u0631\u0629', 'SE': u'\u0627\u0644\u0633\u0648\u064a\u062f', 'SD': u'\u0627\u0644\u0633\u0648\u062f\u0627\u0646', 'DO': u'\u0627\u0644\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u064a\u0629', 'DM': u'\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u0627', 'DJ': u'\u062c\u064a\u0628\u0648\u062a\u064a', 'DK': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0631\u0643', 'DE': u'\u0627\u0644\u0645\u0627\u0646\u064a\u0627', 'YE': u'\u0627\u0644\u064a\u0645\u0646', 'DZ': u'\u0627\u0644\u062c\u0632\u0627\u0626\u0631', 'US': u'\u0627\u0644\u0627\u0648\u0644\u0627\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u062d\u062f\u0629 \u0627\u0644\u0627\u0645\u0631\u064a\u0643\u064a\u0629', 'UY': u'\u0627\u0631\u0648\u063a\u0648\u0627\u064a', 'LB': u'\u0644\u0628\u0646\u0627\u0646', 'LC': u'\u0633\u0627\u0646\u062a \u0644\u0648\u0633\u064a\u0627', 'LA': u'\u0644\u0627\u0648\u0633', 'TV': u'\u062a\u0648\u0641\u0627\u0644\u0648', 'TW': u'\u062a\u0627\u064a\u0648\u0627\u0646', 'TT': u'\u062a\u0631\u064a\u0646\u064a\u062f\u0627\u062f \u0648\u062a\u0648\u0628\u0627\u063a\u0648', 'TR': u'\u062a\u0631\u0643\u064a\u0627', 'LK': u'\u0633\u0631\u064a \u0644\u0627\u0646\u0643\u0627', 'LI': u'\u0644\u064a\u062e\u062a\u0646\u0634\u062a\u0627\u064a\u0646', 'LV': u'\u0644\u0627\u062a\u0641\u064a\u0627', 'TO': u'\u062a\u0648\u0646\u063a\u0627', 'LT': u'\u0644\u064a\u062a\u0648\u0627\u0646\u064a\u0627', 'LU': u'\u0644\u0648\u0643\u0633\u0648\u0645\u0628\u0631\u063a', 'LR': u'\u0644\u064a\u0628\u064a\u0631\u064a\u0627', 'LS': u'\u0644\u064a\u0633\u0648\u062a\u0648', 'TH': u'\u062a\u0627\u064a\u0644\u0646\u062f', 'TG': u'\u062a\u0648\u063a\u0648', 'TD': u'\u062a\u0634\u0627\u062f', 'LY': u'\u0644\u064a\u0628\u064a\u0627', 'VA': u'\u0627\u0644\u0641\u0627\u062a\u064a\u0643\u0627\u0646', 'VC': u'\u0633\u0627\u0646\u062a \u0641\u0646\u0633\u0646\u062a \u0648\u062c\u0632\u0631 \u063a\u0631\u064a\u0646\u0627\u062f\u064a\u0646', 'AE': u'\u0627\u0644\u0627\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'AD': u'\u0627\u0646\u062f\u0648\u0631\u0627', 'AG': u'\u0627\u0646\u062a\u064a\u063a\u0648\u0627 \u0648\u0628\u0631\u0628\u0648\u062f\u0627', 'AF': u'\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646', 'AI': u'\u0627\u0644\u0628\u0627\u0646\u064a\u0627', 'IS': u'\u0627\u064a\u0633\u0644\u0646\u062f\u0627', 'IR': u'\u0627\u064a\u0631\u0627\u0646', 'AM': u'\u0627\u0631\u0645\u064a\u0646\u064a\u0627', 'IT': u'\u0627\u064a\u0637\u0627\u0644\u064a\u0627', 'AO': u'\u0627\u0646\u063a\u0648\u0644\u0627', 'AR': u'\u0627\u0644\u0627\u0631\u062c\u0646\u062a\u064a\u0646', 'AU': u'\u0627\u0633\u062a\u0631\u0627\u0644\u064a\u0627', 'AT': u'\u0627\u0644\u0646\u0645\u0633\u0627', 'IN': u'\u0627\u0644\u0647\u0646\u062f', 'TZ': u'\u062a\u0627\u0646\u0632\u0627\u0646\u064a\u0627', 'AZ': u'\u0622\u0630\u0631\u0628\u064a\u062c\u0627\u0646', 'IE': u'\u0627\u064a\u0631\u0644\u0646\u062f\u0627', 'ID': u'\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0627', 'UA': u'\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0627', 'QA': u'\u0642\u0637\u0631', 'MZ': u'\u0645\u0648\u0632\u0645\u0628\u064a\u0642'} months=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] abbrMonths=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] days=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] abbrDays=[u'\u0646', u'\u062b', u'\u0631', u'\u062e', u'\u062c', u'\u0633', u'\u062d'] dateFormats={'medium': '%d/%m/%Y', 'full': '%%(dayname)s, %d %%(monthname)s, %Y', 'long': '%d %%(monthname)s, %Y', 'short': '%d/%m/%Y'} numericSymbols={'group': u'\u066c', 'nativeZeroDigit': u'\u0660', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': u'\u066b', 'percentSign': u'\u066a', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>ɝ''turbogears/i18n/data/ar_BH.pyc; :Mc @s hdd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd|@=@=turbogears/i18n/data/ar_DZ.py# Formatting configuration for locale ar_DZ languages={'el': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646\u064a\u0629', 'gu': u'\u0627\u0644\u063a\u0648\u062c\u0627\u0631\u0627\u062a\u064a\u0629', 'en': u'\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629', 'zh': u'\u0627\u0644\u0635\u064a\u0646\u064a\u0629', 'sw': u'\u0627\u0644\u0633\u0648\u0627\u062d\u0644\u064a\u0629', 'ca': u'\u0627\u0644\u0643\u0627\u062a\u0627\u0644\u0648\u064a\u0646\u064a\u0629', 'it': u'\u0627\u0644\u0627\u064a\u0637\u0627\u0644\u064a\u0629', 'ar': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629', 'id': u'\u0627\u0644\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0629', 'es': u'\u0627\u0644\u0627\u0633\u0628\u0627\u0646\u064a\u0629', 'ru': u'\u0627\u0644\u0631\u0648\u0633\u064a\u0629', 'nl': u'\u0627\u0644\u0647\u0648\u0644\u0646\u062f\u064a\u0629', 'pt': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644\u064a\u0629', 'tr': u'\u0627\u0644\u062a\u0631\u0643\u064a\u0629', 'ne': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629', 'lt': u'\u0627\u0644\u0644\u062a\u0648\u0627\u0646\u064a\u0629', 'pa': u'\u0627\u0644\u0628\u0646\u062c\u0627\u0628\u064a\u0629', 'th': u'\u0627\u0644\u062a\u0627\u064a\u0644\u0627\u0646\u062f\u064a\u0629', 'vi': u'\u0627\u0644\u0641\u064a\u062a\u0646\u0627\u0645\u064a\u0629', 'ro': u'\u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064a\u0629', 'be': u'\u0627\u0644\u0628\u064a\u0644\u0648\u0631\u0648\u0633\u064a\u0629', 'fr': u'\u0627\u0644\u0641\u0631\u0646\u0633\u064a\u0629', 'bg': u'\u0627\u0644\u0628\u0644\u063a\u0627\u0631\u064a\u0629', 'uk': u'\u0627\u0644\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0629', 'hr': u'\u0627\u0644\u0643\u0631\u0648\u0627\u062a\u064a\u0629', 'bn': u'\u0627\u0644\u0628\u0646\u063a\u0627\u0644\u064a\u0629', 'bo': u'\u0627\u0644\u062a\u0628\u062a\u064a\u0629', 'da': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a\u0629', 'fa': u'\u0627\u0644\u0641\u0627\u0631\u0633\u064a\u0629', 'hi': u'\u0627\u0644\u0647\u0646\u062f\u064a\u0629', 'dz': u'\u0627\u0644\u0632\u0648\u0646\u062e\u0627\u064a\u0629', 'dv': u'\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629', 'fi': u'\u0627\u0644\u0641\u0646\u0644\u0646\u062f\u064a\u0629', 'ja': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a\u0629', 'he': u'\u0627\u0644\u0639\u0628\u0631\u064a\u0629', 'tl': u'\u0627\u0644\u062a\u0627\u063a\u0627\u0644\u0648\u063a\u064a\u0629', 'sr': u'\u0627\u0644\u0635\u0631\u0628\u064a\u0629', 'sq': u'\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629', 'mn': u'\u0627\u0644\u0645\u0646\u063a\u0648\u0644\u064a\u0629', 'ko': u'\u0627\u0644\u0643\u0648\u0631\u064a\u0629', 'km': u'\u0627\u0644\u062e\u0645\u064a\u0631\u064a\u0629', 'ur': u'\u0627\u0644\u0627\u0631\u062f\u064a\u0629', 'de': u'\u0627\u0644\u0627\u0644\u0645\u0627\u0646\u064a\u0629', 'ms': u'\u0644\u063a\u0629 \u0627\u0644\u0645\u0644\u0627\u064a\u0648', 'ug': u'\u0627\u0644\u0627\u063a\u0648\u0631\u064a\u0629', 'my': u'\u0627\u0644\u0628\u0648\u0631\u0645\u064a\u0629'} countries={'BD': u'\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634', 'BE': u'\u0628\u0644\u062c\u064a\u0643\u0627', 'BF': u'\u0628\u0648\u0631\u0643\u064a\u0646\u0627 \u0641\u0627\u0633\u0648', 'BG': u'\u0628\u0644\u063a\u0627\u0631\u064a\u0627', 'BA': u'\u0627\u0644\u0628\u0648\u0633\u0646\u0629 \u0648\u0627\u0644\u0647\u0631\u0633\u0643', 'BB': u'\u0628\u0631\u0628\u0627\u062f\u0648\u0633', 'BN': u'\u0628\u0631\u0648\u0646\u0627\u064a', 'BO': u'\u0628\u0648\u0644\u064a\u0641\u064a\u0627', 'BH': u'\u0627\u0644\u0628\u062d\u0631\u064a\u0646', 'BI': u'\u0628\u0648\u0631\u0648\u0646\u062f\u064a', 'BJ': u'\u0628\u0646\u064a\u0646', 'BT': u'\u0628\u0648\u062a\u0627\u0646', 'JM': u'\u062c\u0627\u0645\u0627\u064a\u0643\u0627', 'BW': u'\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627', 'WS': u'\u0633\u0627\u0645\u0648\u0627', 'BR': u'\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644', 'BS': u'\u0627\u0644\u0628\u0647\u0627\u0645\u0627', 'BY': u'\u0631\u0648\u0633\u064a\u0627 \u0627\u0644\u0628\u064a\u0636\u0627\u0621', 'BZ': u'\u0628\u0644\u064a\u0632', 'RU': u'\u0631\u0648\u0633\u064a\u0627', 'RW': u'\u0631\u0648\u0627\u0646\u062f\u0627', 'TM': u'\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646', 'TJ': u'\u062a\u0627\u062c\u064a\u0643\u0633\u062a\u0627\u0646', 'RO': u'\u0631\u0648\u0645\u0627\u0646\u064a\u0627', 'GW': u'\u063a\u064a\u0646\u064a\u0627 \u0628\u064a\u0633\u0627\u0648', 'GT': u'\u063a\u0648\u0627\u062a\u064a\u0645\u0627\u0644\u0627', 'GR': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646', 'GQ': u'\u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u0627\u0633\u062a\u0648\u0627\u0626\u064a\u0629', 'JP': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646', 'GY': u'\u063a\u0648\u0627\u064a\u0627\u0646\u0627', 'GE': u'\u062c\u0648\u0631\u062c\u064a\u0627', 'GD': u'\u063a\u0631\u064a\u0646\u0627\u062f\u0627', 'GB': u'\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'GA': u'\u063a\u0627\u0628\u0648\u0646', 'SV': u'\u0627\u0644\u0633\u0644\u0641\u0627\u062f\u0648\u0631', 'GN': u'\u063a\u064a\u0646\u064a\u0627', 'GM': u'\u063a\u0627\u0645\u0628\u064a\u0627', 'GH': u'\u063a\u0627\u0646\u0627', 'OM': u'\u0639\u0645\u0627\u0646', 'TN': u'\u062a\u0648\u0646\u0633', 'JO': u'\u0627\u0644\u0627\u0631\u062f\u0646', 'HR': u'\u0643\u0631\u0648\u0627\u062a\u064a\u0627', 'HT': u'\u0647\u0627\u064a\u062a\u064a', 'HU': u'\u0647\u0646\u063a\u0627\u0631\u064a\u0627', 'HN': u'\u0647\u0646\u062f\u0648\u0631\u0627\u0633', 'VE': u'\u0641\u0646\u0632\u0648\u064a\u0644\u0627', 'PW': u'\u0628\u0627\u0644\u0627\u0648', 'PT': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644', 'PY': u'\u0628\u0627\u0631\u0627\u063a\u0648\u0627\u064a', 'IQ': u'\u0627\u0644\u0639\u0631\u0627\u0642', 'PA': u'\u0628\u0646\u0645\u0627', 'PG': u'\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'PE': u'\u0628\u064a\u0631\u0648', 'PK': u'\u0627\u0644\u0628\u0627\u0643\u0633\u062a\u0627\u0646', 'PH': u'\u0627\u0644\u0641\u064a\u0644\u0628\u064a\u0646', 'PL': u'\u0628\u0648\u0644\u0646\u062f\u0627', 'ZM': u'\u0632\u0627\u0645\u0628\u064a\u0627', 'EH': u'\u0627\u0644\u0635\u062d\u0631\u0627\u0621 \u0627\u0644\u063a\u0631\u0628\u064a\u0629', 'EE': u'\u0627\u0633\u062a\u0648\u0646\u064a\u0627', 'EG': u'\u0645\u0635\u0631', 'ZA': u'\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u064a\u0642\u064a\u0627', 'EC': u'\u0627\u0643\u0648\u0627\u062f\u0648\u0631', 'VN': u'\u0641\u064a\u062a\u0646\u0627\u0645', 'SB': u'\u062c\u0632\u0631 \u0633\u0644\u064a\u0645\u0627\u0646', 'ET': u'\u0627\u062b\u064a\u0648\u0628\u064a\u0627', 'SO': u'\u0627\u0644\u0635\u0648\u0645\u0627\u0644', 'ZW': u'\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a', 'ES': u'\u0627\u0633\u0628\u0627\u0646\u064a\u0627', 'ER': u'\u0627\u0631\u062a\u064a\u0631\u064a\u0627', 'MD': u'\u0645\u0648\u0644\u062f\u0648\u0641\u0627', 'MG': u'\u0645\u062f\u063a\u0634\u0642\u0631', 'MA': u'\u0627\u0644\u0645\u063a\u0631\u0628', 'MC': u'\u0645\u0648\u0646\u0627\u0643\u0648', 'UZ': u'\u0627\u0632\u0628\u0643\u0633\u062a\u0627\u0646', 'MM': u'\u0645\u064a\u0627\u0646\u0645\u0627\u0631', 'ML': u'\u0645\u0627\u0644\u064a', 'MN': u'\u0645\u0646\u063a\u0648\u0644\u064a\u0627', 'MH': u'\u062c\u0632\u0631 \u0627\u0644\u0645\u0627\u0631\u0634\u0627\u0644', 'MK': u'\u0645\u0642\u062f\u0648\u0646\u064a\u0627', 'MU': u'\u0645\u0648\u0631\u064a\u0634\u0648\u0633', 'MT': u'\u0645\u0627\u0644\u0637\u0629', 'MW': u'\u0645\u0644\u0627\u0648\u064a', 'MV': u'\u0645\u0627\u0644\u062f\u064a\u0641', 'MR': u'\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627', 'UG': u'\u0627\u0648\u063a\u0646\u062f\u0627', 'MY': u'\u0645\u0627\u0644\u064a\u0632\u064a\u0627', 'MX': u'\u0627\u0644\u0645\u0643\u0633\u064a\u0643', 'IL': u'\u0627\u0633\u0631\u0627\u0626\u064a\u0644', 'FR': u'\u0641\u0631\u0646\u0633\u0627', 'FI': u'\u0641\u0646\u0644\u0646\u062f\u0627', 'FJ': u'\u0641\u064a\u062c\u064a', 'FM': u'\u0645\u064a\u0643\u0631\u0648\u0646\u064a\u0632\u064a\u0627', 'NI': u'\u0646\u064a\u0643\u0627\u0631\u0627\u063a\u0648\u0627', 'NL': u'\u0647\u0648\u0644\u0646\u062f\u0627', 'NO': u'\u0627\u0644\u0646\u0631\u0648\u064a\u062c', 'NA': u'\u0646\u0627\u0645\u064a\u0628\u064a\u0627', 'VU': u'\u0641\u0627\u0646\u0648\u0622\u062a\u0648', 'NE': u'\u0627\u0644\u0646\u064a\u062c\u0631', 'NG': u'\u0646\u064a\u062c\u064a\u0631\u064a\u0627', 'NZ': u'\u0632\u064a\u0644\u0646\u062f\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'NP': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644', 'NR': u'\u0646\u0627\u0648\u0631\u0648', 'CH': u'\u0633\u0648\u064a\u0633\u0631\u0627', 'CO': u'\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627', 'CN': u'\u0627\u0644\u0635\u064a\u0646', 'CM': u'\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0648\u0646', 'CL': u'\u062a\u0634\u064a\u0644\u064a', 'CA': u'\u0643\u0646\u062f\u0627', 'CG': u'\u0627\u0644\u0643\u0648\u0646\u063a\u0648', 'CF': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0641\u0631\u064a\u0642\u064a\u0627 \u0627\u0644\u0648\u0633\u0637\u0649', 'CZ': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062a\u0634\u064a\u0643', 'CY': u'\u0642\u0628\u0631\u0635', 'CR': u'\u0643\u0648\u0633\u062a\u0627\u0631\u064a\u0643\u0627', 'CV': u'\u0627\u0644\u0631\u0623\u0633 \u0627\u0644\u0627\u062e\u0636\u0631', 'CU': u'\u0643\u0648\u0628\u0627', 'SZ': u'\u0633\u0648\u0627\u0632\u064a\u0644\u0627\u0646\u062f', 'SY': u'\u0633\u0648\u0631\u064a\u0629', 'KG': u'\u0642\u064a\u0631\u063a\u064a\u0632\u0633\u062a\u0627\u0646', 'KE': u'\u0643\u064a\u0646\u064a\u0627', 'SR': u'\u0633\u0648\u0631\u064a\u0646\u0627\u0645', 'KI': u'\u0643\u064a\u0631\u064a\u0628\u0627\u062a\u064a', 'KH': u'\u0643\u0645\u0628\u0648\u062f\u064a\u0627', 'KN': u'\u0633\u0627\u0646\u062a \u0643\u064a\u062a\u0633 \u0648\u0646\u064a\u0641\u064a\u0633', 'KM': u'\u062c\u0632\u0631 \u0627\u0644\u0642\u0645\u0631', 'ST': u'\u0633\u0627\u0646 \u062a\u0648\u0645\u064a \u0648\u0628\u0631\u064a\u0646\u0633\u064a\u0628\u064a', 'SK': u'\u0633\u0644\u0648\u0641\u0627\u0643\u064a\u0627', 'KR': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u062c\u0646\u0648\u0628\u064a\u0629', 'SI': u'\u0633\u0644\u0648\u0641\u064a\u0646\u064a\u0627', 'KP': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629', 'KW': u'\u0627\u0644\u0643\u0648\u064a\u062a', 'SN': u'\u0627\u0644\u0633\u0646\u063a\u0627\u0644', 'SM': u'\u0633\u0627\u0646 \u0645\u0627\u0631\u064a\u0646\u0648', 'SL': u'\u0633\u064a\u0631\u0627\u0644\u064a\u0648\u0646', 'SC': u'\u0633\u064a\u0634\u0644', 'KZ': u'\u0643\u0627\u0632\u0627\u062e\u0633\u062a\u0627\u0646', 'SA': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629', 'SG': u'\u0633\u0646\u063a\u0627\u0641\u0648\u0631\u0629', 'SE': u'\u0627\u0644\u0633\u0648\u064a\u062f', 'SD': u'\u0627\u0644\u0633\u0648\u062f\u0627\u0646', 'DO': u'\u0627\u0644\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u064a\u0629', 'DM': u'\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u0627', 'DJ': u'\u062c\u064a\u0628\u0648\u062a\u064a', 'DK': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0631\u0643', 'DE': u'\u0627\u0644\u0645\u0627\u0646\u064a\u0627', 'YE': u'\u0627\u0644\u064a\u0645\u0646', 'DZ': u'\u0627\u0644\u062c\u0632\u0627\u0626\u0631', 'US': u'\u0627\u0644\u0627\u0648\u0644\u0627\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u062d\u062f\u0629 \u0627\u0644\u0627\u0645\u0631\u064a\u0643\u064a\u0629', 'UY': u'\u0627\u0631\u0648\u063a\u0648\u0627\u064a', 'LB': u'\u0644\u0628\u0646\u0627\u0646', 'LC': u'\u0633\u0627\u0646\u062a \u0644\u0648\u0633\u064a\u0627', 'LA': u'\u0644\u0627\u0648\u0633', 'TV': u'\u062a\u0648\u0641\u0627\u0644\u0648', 'TW': u'\u062a\u0627\u064a\u0648\u0627\u0646', 'TT': u'\u062a\u0631\u064a\u0646\u064a\u062f\u0627\u062f \u0648\u062a\u0648\u0628\u0627\u063a\u0648', 'TR': u'\u062a\u0631\u0643\u064a\u0627', 'LK': u'\u0633\u0631\u064a \u0644\u0627\u0646\u0643\u0627', 'LI': u'\u0644\u064a\u062e\u062a\u0646\u0634\u062a\u0627\u064a\u0646', 'LV': u'\u0644\u0627\u062a\u0641\u064a\u0627', 'TO': u'\u062a\u0648\u0646\u063a\u0627', 'LT': u'\u0644\u064a\u062a\u0648\u0627\u0646\u064a\u0627', 'LU': u'\u0644\u0648\u0643\u0633\u0648\u0645\u0628\u0631\u063a', 'LR': u'\u0644\u064a\u0628\u064a\u0631\u064a\u0627', 'LS': u'\u0644\u064a\u0633\u0648\u062a\u0648', 'TH': u'\u062a\u0627\u064a\u0644\u0646\u062f', 'TG': u'\u062a\u0648\u063a\u0648', 'TD': u'\u062a\u0634\u0627\u062f', 'LY': u'\u0644\u064a\u0628\u064a\u0627', 'VA': u'\u0627\u0644\u0641\u0627\u062a\u064a\u0643\u0627\u0646', 'VC': u'\u0633\u0627\u0646\u062a \u0641\u0646\u0633\u0646\u062a \u0648\u062c\u0632\u0631 \u063a\u0631\u064a\u0646\u0627\u062f\u064a\u0646', 'AE': u'\u0627\u0644\u0627\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'AD': u'\u0627\u0646\u062f\u0648\u0631\u0627', 'AG': u'\u0627\u0646\u062a\u064a\u063a\u0648\u0627 \u0648\u0628\u0631\u0628\u0648\u062f\u0627', 'AF': u'\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646', 'AI': u'\u0627\u0644\u0628\u0627\u0646\u064a\u0627', 'IS': u'\u0627\u064a\u0633\u0644\u0646\u062f\u0627', 'IR': u'\u0627\u064a\u0631\u0627\u0646', 'AM': u'\u0627\u0631\u0645\u064a\u0646\u064a\u0627', 'IT': u'\u0627\u064a\u0637\u0627\u0644\u064a\u0627', 'AO': u'\u0627\u0646\u063a\u0648\u0644\u0627', 'AR': u'\u0627\u0644\u0627\u0631\u062c\u0646\u062a\u064a\u0646', 'AU': u'\u0627\u0633\u062a\u0631\u0627\u0644\u064a\u0627', 'AT': u'\u0627\u0644\u0646\u0645\u0633\u0627', 'IN': u'\u0627\u0644\u0647\u0646\u062f', 'TZ': u'\u062a\u0627\u0646\u0632\u0627\u0646\u064a\u0627', 'AZ': u'\u0622\u0630\u0631\u0628\u064a\u062c\u0627\u0646', 'IE': u'\u0627\u064a\u0631\u0644\u0646\u062f\u0627', 'ID': u'\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0627', 'UA': u'\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0627', 'QA': u'\u0642\u0637\u0631', 'MZ': u'\u0645\u0648\u0632\u0645\u0628\u064a\u0642'} months=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] abbrMonths=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] days=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] abbrDays=[u'\u0646', u'\u062b', u'\u0631', u'\u062e', u'\u062c', u'\u0633', u'\u062d'] dateFormats={'medium': '%d/%m/%Y', 'full': '%%(dayname)s, %d %%(monthname)s, %Y', 'long': '%d %%(monthname)s, %Y', 'short': '%d/%m/%Y'} numericSymbols={'group': u'\u066c', 'nativeZeroDigit': '0', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': u'\u066b', 'percentSign': u'\u066a', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>WLV''turbogears/i18n/data/ar_DZ.pyc; ;Mc @s hdd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<ddn~F=F=turbogears/i18n/data/ar_EG.py# Formatting configuration for locale ar_EG languages={'el': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646\u064a\u0629', 'gu': u'\u0627\u0644\u063a\u0648\u062c\u0627\u0631\u0627\u062a\u064a\u0629', 'en': u'\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629', 'zh': u'\u0627\u0644\u0635\u064a\u0646\u064a\u0629', 'sw': u'\u0627\u0644\u0633\u0648\u0627\u062d\u0644\u064a\u0629', 'ca': u'\u0627\u0644\u0643\u0627\u062a\u0627\u0644\u0648\u064a\u0646\u064a\u0629', 'it': u'\u0627\u0644\u0627\u064a\u0637\u0627\u0644\u064a\u0629', 'ar': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629', 'id': u'\u0627\u0644\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0629', 'es': u'\u0627\u0644\u0627\u0633\u0628\u0627\u0646\u064a\u0629', 'ru': u'\u0627\u0644\u0631\u0648\u0633\u064a\u0629', 'nl': u'\u0627\u0644\u0647\u0648\u0644\u0646\u062f\u064a\u0629', 'pt': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644\u064a\u0629', 'tr': u'\u0627\u0644\u062a\u0631\u0643\u064a\u0629', 'ne': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629', 'lt': u'\u0627\u0644\u0644\u062a\u0648\u0627\u0646\u064a\u0629', 'pa': u'\u0627\u0644\u0628\u0646\u062c\u0627\u0628\u064a\u0629', 'th': u'\u0627\u0644\u062a\u0627\u064a\u0644\u0627\u0646\u062f\u064a\u0629', 'vi': u'\u0627\u0644\u0641\u064a\u062a\u0646\u0627\u0645\u064a\u0629', 'ro': u'\u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064a\u0629', 'be': u'\u0627\u0644\u0628\u064a\u0644\u0648\u0631\u0648\u0633\u064a\u0629', 'fr': u'\u0627\u0644\u0641\u0631\u0646\u0633\u064a\u0629', 'bg': u'\u0627\u0644\u0628\u0644\u063a\u0627\u0631\u064a\u0629', 'uk': u'\u0627\u0644\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0629', 'hr': u'\u0627\u0644\u0643\u0631\u0648\u0627\u062a\u064a\u0629', 'bn': u'\u0627\u0644\u0628\u0646\u063a\u0627\u0644\u064a\u0629', 'bo': u'\u0627\u0644\u062a\u0628\u062a\u064a\u0629', 'da': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a\u0629', 'fa': u'\u0627\u0644\u0641\u0627\u0631\u0633\u064a\u0629', 'hi': u'\u0627\u0644\u0647\u0646\u062f\u064a\u0629', 'dz': u'\u0627\u0644\u0632\u0648\u0646\u062e\u0627\u064a\u0629', 'dv': u'\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629', 'fi': u'\u0627\u0644\u0641\u0646\u0644\u0646\u062f\u064a\u0629', 'ja': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a\u0629', 'he': u'\u0627\u0644\u0639\u0628\u0631\u064a\u0629', 'tl': u'\u0627\u0644\u062a\u0627\u063a\u0627\u0644\u0648\u063a\u064a\u0629', 'sr': u'\u0627\u0644\u0635\u0631\u0628\u064a\u0629', 'sq': u'\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629', 'mn': u'\u0627\u0644\u0645\u0646\u063a\u0648\u0644\u064a\u0629', 'ko': u'\u0627\u0644\u0643\u0648\u0631\u064a\u0629', 'km': u'\u0627\u0644\u062e\u0645\u064a\u0631\u064a\u0629', 'ur': u'\u0627\u0644\u0627\u0631\u062f\u064a\u0629', 'de': u'\u0627\u0644\u0627\u0644\u0645\u0627\u0646\u064a\u0629', 'ms': u'\u0644\u063a\u0629 \u0627\u0644\u0645\u0644\u0627\u064a\u0648', 'ug': u'\u0627\u0644\u0627\u063a\u0648\u0631\u064a\u0629', 'my': u'\u0627\u0644\u0628\u0648\u0631\u0645\u064a\u0629'} countries={'BD': u'\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634', 'BE': u'\u0628\u0644\u062c\u064a\u0643\u0627', 'BF': u'\u0628\u0648\u0631\u0643\u064a\u0646\u0627 \u0641\u0627\u0633\u0648', 'BG': u'\u0628\u0644\u063a\u0627\u0631\u064a\u0627', 'BA': u'\u0627\u0644\u0628\u0648\u0633\u0646\u0629 \u0648\u0627\u0644\u0647\u0631\u0633\u0643', 'BB': u'\u0628\u0631\u0628\u0627\u062f\u0648\u0633', 'BN': u'\u0628\u0631\u0648\u0646\u0627\u064a', 'BO': u'\u0628\u0648\u0644\u064a\u0641\u064a\u0627', 'BH': u'\u0627\u0644\u0628\u062d\u0631\u064a\u0646', 'BI': u'\u0628\u0648\u0631\u0648\u0646\u062f\u064a', 'BJ': u'\u0628\u0646\u064a\u0646', 'BT': u'\u0628\u0648\u062a\u0627\u0646', 'JM': u'\u062c\u0627\u0645\u0627\u064a\u0643\u0627', 'BW': u'\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627', 'WS': u'\u0633\u0627\u0645\u0648\u0627', 'BR': u'\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644', 'BS': u'\u0627\u0644\u0628\u0647\u0627\u0645\u0627', 'BY': u'\u0631\u0648\u0633\u064a\u0627 \u0627\u0644\u0628\u064a\u0636\u0627\u0621', 'BZ': u'\u0628\u0644\u064a\u0632', 'RU': u'\u0631\u0648\u0633\u064a\u0627', 'RW': u'\u0631\u0648\u0627\u0646\u062f\u0627', 'TM': u'\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646', 'TJ': u'\u062a\u0627\u062c\u064a\u0643\u0633\u062a\u0627\u0646', 'RO': u'\u0631\u0648\u0645\u0627\u0646\u064a\u0627', 'GW': u'\u063a\u064a\u0646\u064a\u0627 \u0628\u064a\u0633\u0627\u0648', 'GT': u'\u063a\u0648\u0627\u062a\u064a\u0645\u0627\u0644\u0627', 'GR': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646', 'GQ': u'\u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u0627\u0633\u062a\u0648\u0627\u0626\u064a\u0629', 'JP': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646', 'GY': u'\u063a\u0648\u0627\u064a\u0627\u0646\u0627', 'GE': u'\u062c\u0648\u0631\u062c\u064a\u0627', 'GD': u'\u063a\u0631\u064a\u0646\u0627\u062f\u0627', 'GB': u'\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'GA': u'\u063a\u0627\u0628\u0648\u0646', 'SV': u'\u0627\u0644\u0633\u0644\u0641\u0627\u062f\u0648\u0631', 'GN': u'\u063a\u064a\u0646\u064a\u0627', 'GM': u'\u063a\u0627\u0645\u0628\u064a\u0627', 'GH': u'\u063a\u0627\u0646\u0627', 'OM': u'\u0639\u0645\u0627\u0646', 'TN': u'\u062a\u0648\u0646\u0633', 'JO': u'\u0627\u0644\u0627\u0631\u062f\u0646', 'HR': u'\u0643\u0631\u0648\u0627\u062a\u064a\u0627', 'HT': u'\u0647\u0627\u064a\u062a\u064a', 'HU': u'\u0647\u0646\u063a\u0627\u0631\u064a\u0627', 'HN': u'\u0647\u0646\u062f\u0648\u0631\u0627\u0633', 'VE': u'\u0641\u0646\u0632\u0648\u064a\u0644\u0627', 'PW': u'\u0628\u0627\u0644\u0627\u0648', 'PT': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644', 'PY': u'\u0628\u0627\u0631\u0627\u063a\u0648\u0627\u064a', 'IQ': u'\u0627\u0644\u0639\u0631\u0627\u0642', 'PA': u'\u0628\u0646\u0645\u0627', 'PG': u'\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'PE': u'\u0628\u064a\u0631\u0648', 'PK': u'\u0627\u0644\u0628\u0627\u0643\u0633\u062a\u0627\u0646', 'PH': u'\u0627\u0644\u0641\u064a\u0644\u0628\u064a\u0646', 'PL': u'\u0628\u0648\u0644\u0646\u062f\u0627', 'ZM': u'\u0632\u0627\u0645\u0628\u064a\u0627', 'EH': u'\u0627\u0644\u0635\u062d\u0631\u0627\u0621 \u0627\u0644\u063a\u0631\u0628\u064a\u0629', 'EE': u'\u0627\u0633\u062a\u0648\u0646\u064a\u0627', 'EG': u'\u0645\u0635\u0631', 'ZA': u'\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u064a\u0642\u064a\u0627', 'EC': u'\u0627\u0643\u0648\u0627\u062f\u0648\u0631', 'VN': u'\u0641\u064a\u062a\u0646\u0627\u0645', 'SB': u'\u062c\u0632\u0631 \u0633\u0644\u064a\u0645\u0627\u0646', 'ET': u'\u0627\u062b\u064a\u0648\u0628\u064a\u0627', 'SO': u'\u0627\u0644\u0635\u0648\u0645\u0627\u0644', 'ZW': u'\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a', 'ES': u'\u0627\u0633\u0628\u0627\u0646\u064a\u0627', 'ER': u'\u0627\u0631\u062a\u064a\u0631\u064a\u0627', 'MD': u'\u0645\u0648\u0644\u062f\u0648\u0641\u0627', 'MG': u'\u0645\u062f\u063a\u0634\u0642\u0631', 'MA': u'\u0627\u0644\u0645\u063a\u0631\u0628', 'MC': u'\u0645\u0648\u0646\u0627\u0643\u0648', 'UZ': u'\u0627\u0632\u0628\u0643\u0633\u062a\u0627\u0646', 'MM': u'\u0645\u064a\u0627\u0646\u0645\u0627\u0631', 'ML': u'\u0645\u0627\u0644\u064a', 'MN': u'\u0645\u0646\u063a\u0648\u0644\u064a\u0627', 'MH': u'\u062c\u0632\u0631 \u0627\u0644\u0645\u0627\u0631\u0634\u0627\u0644', 'MK': u'\u0645\u0642\u062f\u0648\u0646\u064a\u0627', 'MU': u'\u0645\u0648\u0631\u064a\u0634\u0648\u0633', 'MT': u'\u0645\u0627\u0644\u0637\u0629', 'MW': u'\u0645\u0644\u0627\u0648\u064a', 'MV': u'\u0645\u0627\u0644\u062f\u064a\u0641', 'MR': u'\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627', 'UG': u'\u0627\u0648\u063a\u0646\u062f\u0627', 'MY': u'\u0645\u0627\u0644\u064a\u0632\u064a\u0627', 'MX': u'\u0627\u0644\u0645\u0643\u0633\u064a\u0643', 'IL': u'\u0627\u0633\u0631\u0627\u0626\u064a\u0644', 'FR': u'\u0641\u0631\u0646\u0633\u0627', 'FI': u'\u0641\u0646\u0644\u0646\u062f\u0627', 'FJ': u'\u0641\u064a\u062c\u064a', 'FM': u'\u0645\u064a\u0643\u0631\u0648\u0646\u064a\u0632\u064a\u0627', 'NI': u'\u0646\u064a\u0643\u0627\u0631\u0627\u063a\u0648\u0627', 'NL': u'\u0647\u0648\u0644\u0646\u062f\u0627', 'NO': u'\u0627\u0644\u0646\u0631\u0648\u064a\u062c', 'NA': u'\u0646\u0627\u0645\u064a\u0628\u064a\u0627', 'VU': u'\u0641\u0627\u0646\u0648\u0622\u062a\u0648', 'NE': u'\u0627\u0644\u0646\u064a\u062c\u0631', 'NG': u'\u0646\u064a\u062c\u064a\u0631\u064a\u0627', 'NZ': u'\u0632\u064a\u0644\u0646\u062f\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'NP': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644', 'NR': u'\u0646\u0627\u0648\u0631\u0648', 'CH': u'\u0633\u0648\u064a\u0633\u0631\u0627', 'CO': u'\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627', 'CN': u'\u0627\u0644\u0635\u064a\u0646', 'CM': u'\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0648\u0646', 'CL': u'\u062a\u0634\u064a\u0644\u064a', 'CA': u'\u0643\u0646\u062f\u0627', 'CG': u'\u0627\u0644\u0643\u0648\u0646\u063a\u0648', 'CF': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0641\u0631\u064a\u0642\u064a\u0627 \u0627\u0644\u0648\u0633\u0637\u0649', 'CZ': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062a\u0634\u064a\u0643', 'CY': u'\u0642\u0628\u0631\u0635', 'CR': u'\u0643\u0648\u0633\u062a\u0627\u0631\u064a\u0643\u0627', 'CV': u'\u0627\u0644\u0631\u0623\u0633 \u0627\u0644\u0627\u062e\u0636\u0631', 'CU': u'\u0643\u0648\u0628\u0627', 'SZ': u'\u0633\u0648\u0627\u0632\u064a\u0644\u0627\u0646\u062f', 'SY': u'\u0633\u0648\u0631\u064a\u0629', 'KG': u'\u0642\u064a\u0631\u063a\u064a\u0632\u0633\u062a\u0627\u0646', 'KE': u'\u0643\u064a\u0646\u064a\u0627', 'SR': u'\u0633\u0648\u0631\u064a\u0646\u0627\u0645', 'KI': u'\u0643\u064a\u0631\u064a\u0628\u0627\u062a\u064a', 'KH': u'\u0643\u0645\u0628\u0648\u062f\u064a\u0627', 'KN': u'\u0633\u0627\u0646\u062a \u0643\u064a\u062a\u0633 \u0648\u0646\u064a\u0641\u064a\u0633', 'KM': u'\u062c\u0632\u0631 \u0627\u0644\u0642\u0645\u0631', 'ST': u'\u0633\u0627\u0646 \u062a\u0648\u0645\u064a \u0648\u0628\u0631\u064a\u0646\u0633\u064a\u0628\u064a', 'SK': u'\u0633\u0644\u0648\u0641\u0627\u0643\u064a\u0627', 'KR': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u062c\u0646\u0648\u0628\u064a\u0629', 'SI': u'\u0633\u0644\u0648\u0641\u064a\u0646\u064a\u0627', 'KP': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629', 'KW': u'\u0627\u0644\u0643\u0648\u064a\u062a', 'SN': u'\u0627\u0644\u0633\u0646\u063a\u0627\u0644', 'SM': u'\u0633\u0627\u0646 \u0645\u0627\u0631\u064a\u0646\u0648', 'SL': u'\u0633\u064a\u0631\u0627\u0644\u064a\u0648\u0646', 'SC': u'\u0633\u064a\u0634\u0644', 'KZ': u'\u0643\u0627\u0632\u0627\u062e\u0633\u062a\u0627\u0646', 'SA': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629', 'SG': u'\u0633\u0646\u063a\u0627\u0641\u0648\u0631\u0629', 'SE': u'\u0627\u0644\u0633\u0648\u064a\u062f', 'SD': u'\u0627\u0644\u0633\u0648\u062f\u0627\u0646', 'DO': u'\u0627\u0644\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u064a\u0629', 'DM': u'\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u0627', 'DJ': u'\u062c\u064a\u0628\u0648\u062a\u064a', 'DK': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0631\u0643', 'DE': u'\u0627\u0644\u0645\u0627\u0646\u064a\u0627', 'YE': u'\u0627\u0644\u064a\u0645\u0646', 'DZ': u'\u0627\u0644\u062c\u0632\u0627\u0626\u0631', 'US': u'\u0627\u0644\u0627\u0648\u0644\u0627\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u062d\u062f\u0629 \u0627\u0644\u0627\u0645\u0631\u064a\u0643\u064a\u0629', 'UY': u'\u0627\u0631\u0648\u063a\u0648\u0627\u064a', 'LB': u'\u0644\u0628\u0646\u0627\u0646', 'LC': u'\u0633\u0627\u0646\u062a \u0644\u0648\u0633\u064a\u0627', 'LA': u'\u0644\u0627\u0648\u0633', 'TV': u'\u062a\u0648\u0641\u0627\u0644\u0648', 'TW': u'\u062a\u0627\u064a\u0648\u0627\u0646', 'TT': u'\u062a\u0631\u064a\u0646\u064a\u062f\u0627\u062f \u0648\u062a\u0648\u0628\u0627\u063a\u0648', 'TR': u'\u062a\u0631\u0643\u064a\u0627', 'LK': u'\u0633\u0631\u064a \u0644\u0627\u0646\u0643\u0627', 'LI': u'\u0644\u064a\u062e\u062a\u0646\u0634\u062a\u0627\u064a\u0646', 'LV': u'\u0644\u0627\u062a\u0641\u064a\u0627', 'TO': u'\u062a\u0648\u0646\u063a\u0627', 'LT': u'\u0644\u064a\u062a\u0648\u0627\u0646\u064a\u0627', 'LU': u'\u0644\u0648\u0643\u0633\u0648\u0645\u0628\u0631\u063a', 'LR': u'\u0644\u064a\u0628\u064a\u0631\u064a\u0627', 'LS': u'\u0644\u064a\u0633\u0648\u062a\u0648', 'TH': u'\u062a\u0627\u064a\u0644\u0646\u062f', 'TG': u'\u062a\u0648\u063a\u0648', 'TD': u'\u062a\u0634\u0627\u062f', 'LY': u'\u0644\u064a\u0628\u064a\u0627', 'VA': u'\u0627\u0644\u0641\u0627\u062a\u064a\u0643\u0627\u0646', 'VC': u'\u0633\u0627\u0646\u062a \u0641\u0646\u0633\u0646\u062a \u0648\u062c\u0632\u0631 \u063a\u0631\u064a\u0646\u0627\u062f\u064a\u0646', 'AE': u'\u0627\u0644\u0627\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'AD': u'\u0627\u0646\u062f\u0648\u0631\u0627', 'AG': u'\u0627\u0646\u062a\u064a\u063a\u0648\u0627 \u0648\u0628\u0631\u0628\u0648\u062f\u0627', 'AF': u'\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646', 'AI': u'\u0627\u0644\u0628\u0627\u0646\u064a\u0627', 'IS': u'\u0627\u064a\u0633\u0644\u0646\u062f\u0627', 'IR': u'\u0627\u064a\u0631\u0627\u0646', 'AM': u'\u0627\u0631\u0645\u064a\u0646\u064a\u0627', 'IT': u'\u0627\u064a\u0637\u0627\u0644\u064a\u0627', 'AO': u'\u0627\u0646\u063a\u0648\u0644\u0627', 'AR': u'\u0627\u0644\u0627\u0631\u062c\u0646\u062a\u064a\u0646', 'AU': u'\u0627\u0633\u062a\u0631\u0627\u0644\u064a\u0627', 'AT': u'\u0627\u0644\u0646\u0645\u0633\u0627', 'IN': u'\u0627\u0644\u0647\u0646\u062f', 'TZ': u'\u062a\u0627\u0646\u0632\u0627\u0646\u064a\u0627', 'AZ': u'\u0622\u0630\u0631\u0628\u064a\u062c\u0627\u0646', 'IE': u'\u0627\u064a\u0631\u0644\u0646\u062f\u0627', 'ID': u'\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0627', 'UA': u'\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0627', 'QA': u'\u0642\u0637\u0631', 'MZ': u'\u0645\u0648\u0632\u0645\u0628\u064a\u0642'} months=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] abbrMonths=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] days=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] abbrDays=[u'\u0646', u'\u062b', u'\u0631', u'\u062e', u'\u062c', u'\u0633', u'\u062d'] dateFormats={'medium': '%d/%m/%Y', 'full': '%%(dayname)s, %d %%(monthname)s, %Y', 'long': '%d %%(monthname)s, %Y', 'short': '%d/%m/%Y'} numericSymbols={'group': u'\u066c', 'nativeZeroDigit': u'\u0660', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': u'\u066b', 'percentSign': u'\u066a', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>.''turbogears/i18n/data/ar_EG.pyc; :Mc @s hdd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<ddE%[C=C=turbogears/i18n/data/ar_IN.py# Formatting configuration for locale ar_IN languages={'el': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646\u064a\u0629', 'gu': u'\u0627\u0644\u063a\u0648\u062c\u0627\u0631\u0627\u062a\u064a\u0629', 'en': u'\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629', 'zh': u'\u0627\u0644\u0635\u064a\u0646\u064a\u0629', 'sw': u'\u0627\u0644\u0633\u0648\u0627\u062d\u0644\u064a\u0629', 'ca': u'\u0627\u0644\u0643\u0627\u062a\u0627\u0644\u0648\u064a\u0646\u064a\u0629', 'it': u'\u0627\u0644\u0627\u064a\u0637\u0627\u0644\u064a\u0629', 'ar': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629', 'id': u'\u0627\u0644\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0629', 'es': u'\u0627\u0644\u0627\u0633\u0628\u0627\u0646\u064a\u0629', 'ru': u'\u0627\u0644\u0631\u0648\u0633\u064a\u0629', 'nl': u'\u0627\u0644\u0647\u0648\u0644\u0646\u062f\u064a\u0629', 'pt': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644\u064a\u0629', 'tr': u'\u0627\u0644\u062a\u0631\u0643\u064a\u0629', 'ne': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629', 'lt': u'\u0627\u0644\u0644\u062a\u0648\u0627\u0646\u064a\u0629', 'pa': u'\u0627\u0644\u0628\u0646\u062c\u0627\u0628\u064a\u0629', 'th': u'\u0627\u0644\u062a\u0627\u064a\u0644\u0627\u0646\u062f\u064a\u0629', 'vi': u'\u0627\u0644\u0641\u064a\u062a\u0646\u0627\u0645\u064a\u0629', 'ro': u'\u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064a\u0629', 'be': u'\u0627\u0644\u0628\u064a\u0644\u0648\u0631\u0648\u0633\u064a\u0629', 'fr': u'\u0627\u0644\u0641\u0631\u0646\u0633\u064a\u0629', 'bg': u'\u0627\u0644\u0628\u0644\u063a\u0627\u0631\u064a\u0629', 'uk': u'\u0627\u0644\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0629', 'hr': u'\u0627\u0644\u0643\u0631\u0648\u0627\u062a\u064a\u0629', 'bn': u'\u0627\u0644\u0628\u0646\u063a\u0627\u0644\u064a\u0629', 'bo': u'\u0627\u0644\u062a\u0628\u062a\u064a\u0629', 'da': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a\u0629', 'fa': u'\u0627\u0644\u0641\u0627\u0631\u0633\u064a\u0629', 'hi': u'\u0627\u0644\u0647\u0646\u062f\u064a\u0629', 'dz': u'\u0627\u0644\u0632\u0648\u0646\u062e\u0627\u064a\u0629', 'dv': u'\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629', 'fi': u'\u0627\u0644\u0641\u0646\u0644\u0646\u062f\u064a\u0629', 'ja': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a\u0629', 'he': u'\u0627\u0644\u0639\u0628\u0631\u064a\u0629', 'tl': u'\u0627\u0644\u062a\u0627\u063a\u0627\u0644\u0648\u063a\u064a\u0629', 'sr': u'\u0627\u0644\u0635\u0631\u0628\u064a\u0629', 'sq': u'\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629', 'mn': u'\u0627\u0644\u0645\u0646\u063a\u0648\u0644\u064a\u0629', 'ko': u'\u0627\u0644\u0643\u0648\u0631\u064a\u0629', 'km': u'\u0627\u0644\u062e\u0645\u064a\u0631\u064a\u0629', 'ur': u'\u0627\u0644\u0627\u0631\u062f\u064a\u0629', 'de': u'\u0627\u0644\u0627\u0644\u0645\u0627\u0646\u064a\u0629', 'ms': u'\u0644\u063a\u0629 \u0627\u0644\u0645\u0644\u0627\u064a\u0648', 'ug': u'\u0627\u0644\u0627\u063a\u0648\u0631\u064a\u0629', 'my': u'\u0627\u0644\u0628\u0648\u0631\u0645\u064a\u0629'} countries={'BD': u'\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634', 'BE': u'\u0628\u0644\u062c\u064a\u0643\u0627', 'BF': u'\u0628\u0648\u0631\u0643\u064a\u0646\u0627 \u0641\u0627\u0633\u0648', 'BG': u'\u0628\u0644\u063a\u0627\u0631\u064a\u0627', 'BA': u'\u0627\u0644\u0628\u0648\u0633\u0646\u0629 \u0648\u0627\u0644\u0647\u0631\u0633\u0643', 'BB': u'\u0628\u0631\u0628\u0627\u062f\u0648\u0633', 'BN': u'\u0628\u0631\u0648\u0646\u0627\u064a', 'BO': u'\u0628\u0648\u0644\u064a\u0641\u064a\u0627', 'BH': u'\u0627\u0644\u0628\u062d\u0631\u064a\u0646', 'BI': u'\u0628\u0648\u0631\u0648\u0646\u062f\u064a', 'BJ': u'\u0628\u0646\u064a\u0646', 'BT': u'\u0628\u0648\u062a\u0627\u0646', 'JM': u'\u062c\u0627\u0645\u0627\u064a\u0643\u0627', 'BW': u'\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627', 'WS': u'\u0633\u0627\u0645\u0648\u0627', 'BR': u'\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644', 'BS': u'\u0627\u0644\u0628\u0647\u0627\u0645\u0627', 'BY': u'\u0631\u0648\u0633\u064a\u0627 \u0627\u0644\u0628\u064a\u0636\u0627\u0621', 'BZ': u'\u0628\u0644\u064a\u0632', 'RU': u'\u0631\u0648\u0633\u064a\u0627', 'RW': u'\u0631\u0648\u0627\u0646\u062f\u0627', 'TM': u'\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646', 'TJ': u'\u062a\u0627\u062c\u064a\u0643\u0633\u062a\u0627\u0646', 'RO': u'\u0631\u0648\u0645\u0627\u0646\u064a\u0627', 'GW': u'\u063a\u064a\u0646\u064a\u0627 \u0628\u064a\u0633\u0627\u0648', 'GT': u'\u063a\u0648\u0627\u062a\u064a\u0645\u0627\u0644\u0627', 'GR': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646', 'GQ': u'\u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u0627\u0633\u062a\u0648\u0627\u0626\u064a\u0629', 'JP': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646', 'GY': u'\u063a\u0648\u0627\u064a\u0627\u0646\u0627', 'GE': u'\u062c\u0648\u0631\u062c\u064a\u0627', 'GD': u'\u063a\u0631\u064a\u0646\u0627\u062f\u0627', 'GB': u'\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'GA': u'\u063a\u0627\u0628\u0648\u0646', 'SV': u'\u0627\u0644\u0633\u0644\u0641\u0627\u062f\u0648\u0631', 'GN': u'\u063a\u064a\u0646\u064a\u0627', 'GM': u'\u063a\u0627\u0645\u0628\u064a\u0627', 'GH': u'\u063a\u0627\u0646\u0627', 'OM': u'\u0639\u0645\u0627\u0646', 'TN': u'\u062a\u0648\u0646\u0633', 'JO': u'\u0627\u0644\u0627\u0631\u062f\u0646', 'HR': u'\u0643\u0631\u0648\u0627\u062a\u064a\u0627', 'HT': u'\u0647\u0627\u064a\u062a\u064a', 'HU': u'\u0647\u0646\u063a\u0627\u0631\u064a\u0627', 'HN': u'\u0647\u0646\u062f\u0648\u0631\u0627\u0633', 'VE': u'\u0641\u0646\u0632\u0648\u064a\u0644\u0627', 'PW': u'\u0628\u0627\u0644\u0627\u0648', 'PT': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644', 'PY': u'\u0628\u0627\u0631\u0627\u063a\u0648\u0627\u064a', 'IQ': u'\u0627\u0644\u0639\u0631\u0627\u0642', 'PA': u'\u0628\u0646\u0645\u0627', 'PG': u'\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'PE': u'\u0628\u064a\u0631\u0648', 'PK': u'\u0627\u0644\u0628\u0627\u0643\u0633\u062a\u0627\u0646', 'PH': u'\u0627\u0644\u0641\u064a\u0644\u0628\u064a\u0646', 'PL': u'\u0628\u0648\u0644\u0646\u062f\u0627', 'ZM': u'\u0632\u0627\u0645\u0628\u064a\u0627', 'EH': u'\u0627\u0644\u0635\u062d\u0631\u0627\u0621 \u0627\u0644\u063a\u0631\u0628\u064a\u0629', 'EE': u'\u0627\u0633\u062a\u0648\u0646\u064a\u0627', 'EG': u'\u0645\u0635\u0631', 'ZA': u'\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u064a\u0642\u064a\u0627', 'EC': u'\u0627\u0643\u0648\u0627\u062f\u0648\u0631', 'VN': u'\u0641\u064a\u062a\u0646\u0627\u0645', 'SB': u'\u062c\u0632\u0631 \u0633\u0644\u064a\u0645\u0627\u0646', 'ET': u'\u0627\u062b\u064a\u0648\u0628\u064a\u0627', 'SO': u'\u0627\u0644\u0635\u0648\u0645\u0627\u0644', 'ZW': u'\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a', 'ES': u'\u0627\u0633\u0628\u0627\u0646\u064a\u0627', 'ER': u'\u0627\u0631\u062a\u064a\u0631\u064a\u0627', 'MD': u'\u0645\u0648\u0644\u062f\u0648\u0641\u0627', 'MG': u'\u0645\u062f\u063a\u0634\u0642\u0631', 'MA': u'\u0627\u0644\u0645\u063a\u0631\u0628', 'MC': u'\u0645\u0648\u0646\u0627\u0643\u0648', 'UZ': u'\u0627\u0632\u0628\u0643\u0633\u062a\u0627\u0646', 'MM': u'\u0645\u064a\u0627\u0646\u0645\u0627\u0631', 'ML': u'\u0645\u0627\u0644\u064a', 'MN': u'\u0645\u0646\u063a\u0648\u0644\u064a\u0627', 'MH': u'\u062c\u0632\u0631 \u0627\u0644\u0645\u0627\u0631\u0634\u0627\u0644', 'MK': u'\u0645\u0642\u062f\u0648\u0646\u064a\u0627', 'MU': u'\u0645\u0648\u0631\u064a\u0634\u0648\u0633', 'MT': u'\u0645\u0627\u0644\u0637\u0629', 'MW': u'\u0645\u0644\u0627\u0648\u064a', 'MV': u'\u0645\u0627\u0644\u062f\u064a\u0641', 'MR': u'\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627', 'UG': u'\u0627\u0648\u063a\u0646\u062f\u0627', 'MY': u'\u0645\u0627\u0644\u064a\u0632\u064a\u0627', 'MX': u'\u0627\u0644\u0645\u0643\u0633\u064a\u0643', 'IL': u'\u0627\u0633\u0631\u0627\u0626\u064a\u0644', 'FR': u'\u0641\u0631\u0646\u0633\u0627', 'FI': u'\u0641\u0646\u0644\u0646\u062f\u0627', 'FJ': u'\u0641\u064a\u062c\u064a', 'FM': u'\u0645\u064a\u0643\u0631\u0648\u0646\u064a\u0632\u064a\u0627', 'NI': u'\u0646\u064a\u0643\u0627\u0631\u0627\u063a\u0648\u0627', 'NL': u'\u0647\u0648\u0644\u0646\u062f\u0627', 'NO': u'\u0627\u0644\u0646\u0631\u0648\u064a\u062c', 'NA': u'\u0646\u0627\u0645\u064a\u0628\u064a\u0627', 'VU': u'\u0641\u0627\u0646\u0648\u0622\u062a\u0648', 'NE': u'\u0627\u0644\u0646\u064a\u062c\u0631', 'NG': u'\u0646\u064a\u062c\u064a\u0631\u064a\u0627', 'NZ': u'\u0632\u064a\u0644\u0646\u062f\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'NP': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644', 'NR': u'\u0646\u0627\u0648\u0631\u0648', 'CH': u'\u0633\u0648\u064a\u0633\u0631\u0627', 'CO': u'\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627', 'CN': u'\u0627\u0644\u0635\u064a\u0646', 'CM': u'\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0648\u0646', 'CL': u'\u062a\u0634\u064a\u0644\u064a', 'CA': u'\u0643\u0646\u062f\u0627', 'CG': u'\u0627\u0644\u0643\u0648\u0646\u063a\u0648', 'CF': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0641\u0631\u064a\u0642\u064a\u0627 \u0627\u0644\u0648\u0633\u0637\u0649', 'CZ': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062a\u0634\u064a\u0643', 'CY': u'\u0642\u0628\u0631\u0635', 'CR': u'\u0643\u0648\u0633\u062a\u0627\u0631\u064a\u0643\u0627', 'CV': u'\u0627\u0644\u0631\u0623\u0633 \u0627\u0644\u0627\u062e\u0636\u0631', 'CU': u'\u0643\u0648\u0628\u0627', 'SZ': u'\u0633\u0648\u0627\u0632\u064a\u0644\u0627\u0646\u062f', 'SY': u'\u0633\u0648\u0631\u064a\u0629', 'KG': u'\u0642\u064a\u0631\u063a\u064a\u0632\u0633\u062a\u0627\u0646', 'KE': u'\u0643\u064a\u0646\u064a\u0627', 'SR': u'\u0633\u0648\u0631\u064a\u0646\u0627\u0645', 'KI': u'\u0643\u064a\u0631\u064a\u0628\u0627\u062a\u064a', 'KH': u'\u0643\u0645\u0628\u0648\u062f\u064a\u0627', 'KN': u'\u0633\u0627\u0646\u062a \u0643\u064a\u062a\u0633 \u0648\u0646\u064a\u0641\u064a\u0633', 'KM': u'\u062c\u0632\u0631 \u0627\u0644\u0642\u0645\u0631', 'ST': u'\u0633\u0627\u0646 \u062a\u0648\u0645\u064a \u0648\u0628\u0631\u064a\u0646\u0633\u064a\u0628\u064a', 'SK': u'\u0633\u0644\u0648\u0641\u0627\u0643\u064a\u0627', 'KR': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u062c\u0646\u0648\u0628\u064a\u0629', 'SI': u'\u0633\u0644\u0648\u0641\u064a\u0646\u064a\u0627', 'KP': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629', 'KW': u'\u0627\u0644\u0643\u0648\u064a\u062a', 'SN': u'\u0627\u0644\u0633\u0646\u063a\u0627\u0644', 'SM': u'\u0633\u0627\u0646 \u0645\u0627\u0631\u064a\u0646\u0648', 'SL': u'\u0633\u064a\u0631\u0627\u0644\u064a\u0648\u0646', 'SC': u'\u0633\u064a\u0634\u0644', 'KZ': u'\u0643\u0627\u0632\u0627\u062e\u0633\u062a\u0627\u0646', 'SA': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629', 'SG': u'\u0633\u0646\u063a\u0627\u0641\u0648\u0631\u0629', 'SE': u'\u0627\u0644\u0633\u0648\u064a\u062f', 'SD': u'\u0627\u0644\u0633\u0648\u062f\u0627\u0646', 'DO': u'\u0627\u0644\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u064a\u0629', 'DM': u'\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u0627', 'DJ': u'\u062c\u064a\u0628\u0648\u062a\u064a', 'DK': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0631\u0643', 'DE': u'\u0627\u0644\u0645\u0627\u0646\u064a\u0627', 'YE': u'\u0627\u0644\u064a\u0645\u0646', 'DZ': u'\u0627\u0644\u062c\u0632\u0627\u0626\u0631', 'US': u'\u0627\u0644\u0627\u0648\u0644\u0627\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u062d\u062f\u0629 \u0627\u0644\u0627\u0645\u0631\u064a\u0643\u064a\u0629', 'UY': u'\u0627\u0631\u0648\u063a\u0648\u0627\u064a', 'LB': u'\u0644\u0628\u0646\u0627\u0646', 'LC': u'\u0633\u0627\u0646\u062a \u0644\u0648\u0633\u064a\u0627', 'LA': u'\u0644\u0627\u0648\u0633', 'TV': u'\u062a\u0648\u0641\u0627\u0644\u0648', 'TW': u'\u062a\u0627\u064a\u0648\u0627\u0646', 'TT': u'\u062a\u0631\u064a\u0646\u064a\u062f\u0627\u062f \u0648\u062a\u0648\u0628\u0627\u063a\u0648', 'TR': u'\u062a\u0631\u0643\u064a\u0627', 'LK': u'\u0633\u0631\u064a \u0644\u0627\u0646\u0643\u0627', 'LI': u'\u0644\u064a\u062e\u062a\u0646\u0634\u062a\u0627\u064a\u0646', 'LV': u'\u0644\u0627\u062a\u0641\u064a\u0627', 'TO': u'\u062a\u0648\u0646\u063a\u0627', 'LT': u'\u0644\u064a\u062a\u0648\u0627\u0646\u064a\u0627', 'LU': u'\u0644\u0648\u0643\u0633\u0648\u0645\u0628\u0631\u063a', 'LR': u'\u0644\u064a\u0628\u064a\u0631\u064a\u0627', 'LS': u'\u0644\u064a\u0633\u0648\u062a\u0648', 'TH': u'\u062a\u0627\u064a\u0644\u0646\u062f', 'TG': u'\u062a\u0648\u063a\u0648', 'TD': u'\u062a\u0634\u0627\u062f', 'LY': u'\u0644\u064a\u0628\u064a\u0627', 'VA': u'\u0627\u0644\u0641\u0627\u062a\u064a\u0643\u0627\u0646', 'VC': u'\u0633\u0627\u0646\u062a \u0641\u0646\u0633\u0646\u062a \u0648\u062c\u0632\u0631 \u063a\u0631\u064a\u0646\u0627\u062f\u064a\u0646', 'AE': u'\u0627\u0644\u0627\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'AD': u'\u0627\u0646\u062f\u0648\u0631\u0627', 'AG': u'\u0627\u0646\u062a\u064a\u063a\u0648\u0627 \u0648\u0628\u0631\u0628\u0648\u062f\u0627', 'AF': u'\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646', 'AI': u'\u0627\u0644\u0628\u0627\u0646\u064a\u0627', 'IS': u'\u0627\u064a\u0633\u0644\u0646\u062f\u0627', 'IR': u'\u0627\u064a\u0631\u0627\u0646', 'AM': u'\u0627\u0631\u0645\u064a\u0646\u064a\u0627', 'IT': u'\u0627\u064a\u0637\u0627\u0644\u064a\u0627', 'AO': u'\u0627\u0646\u063a\u0648\u0644\u0627', 'AR': u'\u0627\u0644\u0627\u0631\u062c\u0646\u062a\u064a\u0646', 'AU': u'\u0627\u0633\u062a\u0631\u0627\u0644\u064a\u0627', 'AT': u'\u0627\u0644\u0646\u0645\u0633\u0627', 'IN': u'\u0627\u0644\u0647\u0646\u062f', 'TZ': u'\u062a\u0627\u0646\u0632\u0627\u0646\u064a\u0627', 'AZ': u'\u0622\u0630\u0631\u0628\u064a\u062c\u0627\u0646', 'IE': u'\u0627\u064a\u0631\u0644\u0646\u062f\u0627', 'ID': u'\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0627', 'UA': u'\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0627', 'QA': u'\u0642\u0637\u0631', 'MZ': u'\u0645\u0648\u0632\u0645\u0628\u064a\u0642'} months=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] abbrMonths=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] days=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] abbrDays=[u'\u0646', u'\u062b', u'\u0631', u'\u062e', u'\u062c', u'\u0633', u'\u062d'] dateFormats={'medium': '%d-%m-%Y', 'full': '%%(dayname)s %d %%(monthname)s %Y', 'long': '%d %%(monthname)s %Y', 'short': '%d-%m-%y'} numericSymbols={'group': u'\u066c', 'nativeZeroDigit': u'\u0660', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': u'\u066b', 'percentSign': u'\u066a', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>Hz''turbogears/i18n/data/ar_IN.pyc; ;Mc @s hdd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<ddF=F=turbogears/i18n/data/ar_IQ.py# Formatting configuration for locale ar_IQ languages={'el': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646\u064a\u0629', 'gu': u'\u0627\u0644\u063a\u0648\u062c\u0627\u0631\u0627\u062a\u064a\u0629', 'en': u'\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629', 'zh': u'\u0627\u0644\u0635\u064a\u0646\u064a\u0629', 'sw': u'\u0627\u0644\u0633\u0648\u0627\u062d\u0644\u064a\u0629', 'ca': u'\u0627\u0644\u0643\u0627\u062a\u0627\u0644\u0648\u064a\u0646\u064a\u0629', 'it': u'\u0627\u0644\u0627\u064a\u0637\u0627\u0644\u064a\u0629', 'ar': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629', 'id': u'\u0627\u0644\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0629', 'es': u'\u0627\u0644\u0627\u0633\u0628\u0627\u0646\u064a\u0629', 'ru': u'\u0627\u0644\u0631\u0648\u0633\u064a\u0629', 'nl': u'\u0627\u0644\u0647\u0648\u0644\u0646\u062f\u064a\u0629', 'pt': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644\u064a\u0629', 'tr': u'\u0627\u0644\u062a\u0631\u0643\u064a\u0629', 'ne': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629', 'lt': u'\u0627\u0644\u0644\u062a\u0648\u0627\u0646\u064a\u0629', 'pa': u'\u0627\u0644\u0628\u0646\u062c\u0627\u0628\u064a\u0629', 'th': u'\u0627\u0644\u062a\u0627\u064a\u0644\u0627\u0646\u062f\u064a\u0629', 'vi': u'\u0627\u0644\u0641\u064a\u062a\u0646\u0627\u0645\u064a\u0629', 'ro': u'\u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064a\u0629', 'be': u'\u0627\u0644\u0628\u064a\u0644\u0648\u0631\u0648\u0633\u064a\u0629', 'fr': u'\u0627\u0644\u0641\u0631\u0646\u0633\u064a\u0629', 'bg': u'\u0627\u0644\u0628\u0644\u063a\u0627\u0631\u064a\u0629', 'uk': u'\u0627\u0644\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0629', 'hr': u'\u0627\u0644\u0643\u0631\u0648\u0627\u062a\u064a\u0629', 'bn': u'\u0627\u0644\u0628\u0646\u063a\u0627\u0644\u064a\u0629', 'bo': u'\u0627\u0644\u062a\u0628\u062a\u064a\u0629', 'da': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a\u0629', 'fa': u'\u0627\u0644\u0641\u0627\u0631\u0633\u064a\u0629', 'hi': u'\u0627\u0644\u0647\u0646\u062f\u064a\u0629', 'dz': u'\u0627\u0644\u0632\u0648\u0646\u062e\u0627\u064a\u0629', 'dv': u'\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629', 'fi': u'\u0627\u0644\u0641\u0646\u0644\u0646\u062f\u064a\u0629', 'ja': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a\u0629', 'he': u'\u0627\u0644\u0639\u0628\u0631\u064a\u0629', 'tl': u'\u0627\u0644\u062a\u0627\u063a\u0627\u0644\u0648\u063a\u064a\u0629', 'sr': u'\u0627\u0644\u0635\u0631\u0628\u064a\u0629', 'sq': u'\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629', 'mn': u'\u0627\u0644\u0645\u0646\u063a\u0648\u0644\u064a\u0629', 'ko': u'\u0627\u0644\u0643\u0648\u0631\u064a\u0629', 'km': u'\u0627\u0644\u062e\u0645\u064a\u0631\u064a\u0629', 'ur': u'\u0627\u0644\u0627\u0631\u062f\u064a\u0629', 'de': u'\u0627\u0644\u0627\u0644\u0645\u0627\u0646\u064a\u0629', 'ms': u'\u0644\u063a\u0629 \u0627\u0644\u0645\u0644\u0627\u064a\u0648', 'ug': u'\u0627\u0644\u0627\u063a\u0648\u0631\u064a\u0629', 'my': u'\u0627\u0644\u0628\u0648\u0631\u0645\u064a\u0629'} countries={'BD': u'\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634', 'BE': u'\u0628\u0644\u062c\u064a\u0643\u0627', 'BF': u'\u0628\u0648\u0631\u0643\u064a\u0646\u0627 \u0641\u0627\u0633\u0648', 'BG': u'\u0628\u0644\u063a\u0627\u0631\u064a\u0627', 'BA': u'\u0627\u0644\u0628\u0648\u0633\u0646\u0629 \u0648\u0627\u0644\u0647\u0631\u0633\u0643', 'BB': u'\u0628\u0631\u0628\u0627\u062f\u0648\u0633', 'BN': u'\u0628\u0631\u0648\u0646\u0627\u064a', 'BO': u'\u0628\u0648\u0644\u064a\u0641\u064a\u0627', 'BH': u'\u0627\u0644\u0628\u062d\u0631\u064a\u0646', 'BI': u'\u0628\u0648\u0631\u0648\u0646\u062f\u064a', 'BJ': u'\u0628\u0646\u064a\u0646', 'BT': u'\u0628\u0648\u062a\u0627\u0646', 'JM': u'\u062c\u0627\u0645\u0627\u064a\u0643\u0627', 'BW': u'\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627', 'WS': u'\u0633\u0627\u0645\u0648\u0627', 'BR': u'\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644', 'BS': u'\u0627\u0644\u0628\u0647\u0627\u0645\u0627', 'BY': u'\u0631\u0648\u0633\u064a\u0627 \u0627\u0644\u0628\u064a\u0636\u0627\u0621', 'BZ': u'\u0628\u0644\u064a\u0632', 'RU': u'\u0631\u0648\u0633\u064a\u0627', 'RW': u'\u0631\u0648\u0627\u0646\u062f\u0627', 'TM': u'\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646', 'TJ': u'\u062a\u0627\u062c\u064a\u0643\u0633\u062a\u0627\u0646', 'RO': u'\u0631\u0648\u0645\u0627\u0646\u064a\u0627', 'GW': u'\u063a\u064a\u0646\u064a\u0627 \u0628\u064a\u0633\u0627\u0648', 'GT': u'\u063a\u0648\u0627\u062a\u064a\u0645\u0627\u0644\u0627', 'GR': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646', 'GQ': u'\u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u0627\u0633\u062a\u0648\u0627\u0626\u064a\u0629', 'JP': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646', 'GY': u'\u063a\u0648\u0627\u064a\u0627\u0646\u0627', 'GE': u'\u062c\u0648\u0631\u062c\u064a\u0627', 'GD': u'\u063a\u0631\u064a\u0646\u0627\u062f\u0627', 'GB': u'\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'GA': u'\u063a\u0627\u0628\u0648\u0646', 'SV': u'\u0627\u0644\u0633\u0644\u0641\u0627\u062f\u0648\u0631', 'GN': u'\u063a\u064a\u0646\u064a\u0627', 'GM': u'\u063a\u0627\u0645\u0628\u064a\u0627', 'GH': u'\u063a\u0627\u0646\u0627', 'OM': u'\u0639\u0645\u0627\u0646', 'TN': u'\u062a\u0648\u0646\u0633', 'JO': u'\u0627\u0644\u0627\u0631\u062f\u0646', 'HR': u'\u0643\u0631\u0648\u0627\u062a\u064a\u0627', 'HT': u'\u0647\u0627\u064a\u062a\u064a', 'HU': u'\u0647\u0646\u063a\u0627\u0631\u064a\u0627', 'HN': u'\u0647\u0646\u062f\u0648\u0631\u0627\u0633', 'VE': u'\u0641\u0646\u0632\u0648\u064a\u0644\u0627', 'PW': u'\u0628\u0627\u0644\u0627\u0648', 'PT': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644', 'PY': u'\u0628\u0627\u0631\u0627\u063a\u0648\u0627\u064a', 'IQ': u'\u0627\u0644\u0639\u0631\u0627\u0642', 'PA': u'\u0628\u0646\u0645\u0627', 'PG': u'\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'PE': u'\u0628\u064a\u0631\u0648', 'PK': u'\u0627\u0644\u0628\u0627\u0643\u0633\u062a\u0627\u0646', 'PH': u'\u0627\u0644\u0641\u064a\u0644\u0628\u064a\u0646', 'PL': u'\u0628\u0648\u0644\u0646\u062f\u0627', 'ZM': u'\u0632\u0627\u0645\u0628\u064a\u0627', 'EH': u'\u0627\u0644\u0635\u062d\u0631\u0627\u0621 \u0627\u0644\u063a\u0631\u0628\u064a\u0629', 'EE': u'\u0627\u0633\u062a\u0648\u0646\u064a\u0627', 'EG': u'\u0645\u0635\u0631', 'ZA': u'\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u064a\u0642\u064a\u0627', 'EC': u'\u0627\u0643\u0648\u0627\u062f\u0648\u0631', 'VN': u'\u0641\u064a\u062a\u0646\u0627\u0645', 'SB': u'\u062c\u0632\u0631 \u0633\u0644\u064a\u0645\u0627\u0646', 'ET': u'\u0627\u062b\u064a\u0648\u0628\u064a\u0627', 'SO': u'\u0627\u0644\u0635\u0648\u0645\u0627\u0644', 'ZW': u'\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a', 'ES': u'\u0627\u0633\u0628\u0627\u0646\u064a\u0627', 'ER': u'\u0627\u0631\u062a\u064a\u0631\u064a\u0627', 'MD': u'\u0645\u0648\u0644\u062f\u0648\u0641\u0627', 'MG': u'\u0645\u062f\u063a\u0634\u0642\u0631', 'MA': u'\u0627\u0644\u0645\u063a\u0631\u0628', 'MC': u'\u0645\u0648\u0646\u0627\u0643\u0648', 'UZ': u'\u0627\u0632\u0628\u0643\u0633\u062a\u0627\u0646', 'MM': u'\u0645\u064a\u0627\u0646\u0645\u0627\u0631', 'ML': u'\u0645\u0627\u0644\u064a', 'MN': u'\u0645\u0646\u063a\u0648\u0644\u064a\u0627', 'MH': u'\u062c\u0632\u0631 \u0627\u0644\u0645\u0627\u0631\u0634\u0627\u0644', 'MK': u'\u0645\u0642\u062f\u0648\u0646\u064a\u0627', 'MU': u'\u0645\u0648\u0631\u064a\u0634\u0648\u0633', 'MT': u'\u0645\u0627\u0644\u0637\u0629', 'MW': u'\u0645\u0644\u0627\u0648\u064a', 'MV': u'\u0645\u0627\u0644\u062f\u064a\u0641', 'MR': u'\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627', 'UG': u'\u0627\u0648\u063a\u0646\u062f\u0627', 'MY': u'\u0645\u0627\u0644\u064a\u0632\u064a\u0627', 'MX': u'\u0627\u0644\u0645\u0643\u0633\u064a\u0643', 'IL': u'\u0627\u0633\u0631\u0627\u0626\u064a\u0644', 'FR': u'\u0641\u0631\u0646\u0633\u0627', 'FI': u'\u0641\u0646\u0644\u0646\u062f\u0627', 'FJ': u'\u0641\u064a\u062c\u064a', 'FM': u'\u0645\u064a\u0643\u0631\u0648\u0646\u064a\u0632\u064a\u0627', 'NI': u'\u0646\u064a\u0643\u0627\u0631\u0627\u063a\u0648\u0627', 'NL': u'\u0647\u0648\u0644\u0646\u062f\u0627', 'NO': u'\u0627\u0644\u0646\u0631\u0648\u064a\u062c', 'NA': u'\u0646\u0627\u0645\u064a\u0628\u064a\u0627', 'VU': u'\u0641\u0627\u0646\u0648\u0622\u062a\u0648', 'NE': u'\u0627\u0644\u0646\u064a\u062c\u0631', 'NG': u'\u0646\u064a\u062c\u064a\u0631\u064a\u0627', 'NZ': u'\u0632\u064a\u0644\u0646\u062f\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'NP': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644', 'NR': u'\u0646\u0627\u0648\u0631\u0648', 'CH': u'\u0633\u0648\u064a\u0633\u0631\u0627', 'CO': u'\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627', 'CN': u'\u0627\u0644\u0635\u064a\u0646', 'CM': u'\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0648\u0646', 'CL': u'\u062a\u0634\u064a\u0644\u064a', 'CA': u'\u0643\u0646\u062f\u0627', 'CG': u'\u0627\u0644\u0643\u0648\u0646\u063a\u0648', 'CF': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0641\u0631\u064a\u0642\u064a\u0627 \u0627\u0644\u0648\u0633\u0637\u0649', 'CZ': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062a\u0634\u064a\u0643', 'CY': u'\u0642\u0628\u0631\u0635', 'CR': u'\u0643\u0648\u0633\u062a\u0627\u0631\u064a\u0643\u0627', 'CV': u'\u0627\u0644\u0631\u0623\u0633 \u0627\u0644\u0627\u062e\u0636\u0631', 'CU': u'\u0643\u0648\u0628\u0627', 'SZ': u'\u0633\u0648\u0627\u0632\u064a\u0644\u0627\u0646\u062f', 'SY': u'\u0633\u0648\u0631\u064a\u0629', 'KG': u'\u0642\u064a\u0631\u063a\u064a\u0632\u0633\u062a\u0627\u0646', 'KE': u'\u0643\u064a\u0646\u064a\u0627', 'SR': u'\u0633\u0648\u0631\u064a\u0646\u0627\u0645', 'KI': u'\u0643\u064a\u0631\u064a\u0628\u0627\u062a\u064a', 'KH': u'\u0643\u0645\u0628\u0648\u062f\u064a\u0627', 'KN': u'\u0633\u0627\u0646\u062a \u0643\u064a\u062a\u0633 \u0648\u0646\u064a\u0641\u064a\u0633', 'KM': u'\u062c\u0632\u0631 \u0627\u0644\u0642\u0645\u0631', 'ST': u'\u0633\u0627\u0646 \u062a\u0648\u0645\u064a \u0648\u0628\u0631\u064a\u0646\u0633\u064a\u0628\u064a', 'SK': u'\u0633\u0644\u0648\u0641\u0627\u0643\u064a\u0627', 'KR': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u062c\u0646\u0648\u0628\u064a\u0629', 'SI': u'\u0633\u0644\u0648\u0641\u064a\u0646\u064a\u0627', 'KP': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629', 'KW': u'\u0627\u0644\u0643\u0648\u064a\u062a', 'SN': u'\u0627\u0644\u0633\u0646\u063a\u0627\u0644', 'SM': u'\u0633\u0627\u0646 \u0645\u0627\u0631\u064a\u0646\u0648', 'SL': u'\u0633\u064a\u0631\u0627\u0644\u064a\u0648\u0646', 'SC': u'\u0633\u064a\u0634\u0644', 'KZ': u'\u0643\u0627\u0632\u0627\u062e\u0633\u062a\u0627\u0646', 'SA': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629', 'SG': u'\u0633\u0646\u063a\u0627\u0641\u0648\u0631\u0629', 'SE': u'\u0627\u0644\u0633\u0648\u064a\u062f', 'SD': u'\u0627\u0644\u0633\u0648\u062f\u0627\u0646', 'DO': u'\u0627\u0644\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u064a\u0629', 'DM': u'\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u0627', 'DJ': u'\u062c\u064a\u0628\u0648\u062a\u064a', 'DK': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0631\u0643', 'DE': u'\u0627\u0644\u0645\u0627\u0646\u064a\u0627', 'YE': u'\u0627\u0644\u064a\u0645\u0646', 'DZ': u'\u0627\u0644\u062c\u0632\u0627\u0626\u0631', 'US': u'\u0627\u0644\u0627\u0648\u0644\u0627\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u062d\u062f\u0629 \u0627\u0644\u0627\u0645\u0631\u064a\u0643\u064a\u0629', 'UY': u'\u0627\u0631\u0648\u063a\u0648\u0627\u064a', 'LB': u'\u0644\u0628\u0646\u0627\u0646', 'LC': u'\u0633\u0627\u0646\u062a \u0644\u0648\u0633\u064a\u0627', 'LA': u'\u0644\u0627\u0648\u0633', 'TV': u'\u062a\u0648\u0641\u0627\u0644\u0648', 'TW': u'\u062a\u0627\u064a\u0648\u0627\u0646', 'TT': u'\u062a\u0631\u064a\u0646\u064a\u062f\u0627\u062f \u0648\u062a\u0648\u0628\u0627\u063a\u0648', 'TR': u'\u062a\u0631\u0643\u064a\u0627', 'LK': u'\u0633\u0631\u064a \u0644\u0627\u0646\u0643\u0627', 'LI': u'\u0644\u064a\u062e\u062a\u0646\u0634\u062a\u0627\u064a\u0646', 'LV': u'\u0644\u0627\u062a\u0641\u064a\u0627', 'TO': u'\u062a\u0648\u0646\u063a\u0627', 'LT': u'\u0644\u064a\u062a\u0648\u0627\u0646\u064a\u0627', 'LU': u'\u0644\u0648\u0643\u0633\u0648\u0645\u0628\u0631\u063a', 'LR': u'\u0644\u064a\u0628\u064a\u0631\u064a\u0627', 'LS': u'\u0644\u064a\u0633\u0648\u062a\u0648', 'TH': u'\u062a\u0627\u064a\u0644\u0646\u062f', 'TG': u'\u062a\u0648\u063a\u0648', 'TD': u'\u062a\u0634\u0627\u062f', 'LY': u'\u0644\u064a\u0628\u064a\u0627', 'VA': u'\u0627\u0644\u0641\u0627\u062a\u064a\u0643\u0627\u0646', 'VC': u'\u0633\u0627\u0646\u062a \u0641\u0646\u0633\u0646\u062a \u0648\u062c\u0632\u0631 \u063a\u0631\u064a\u0646\u0627\u062f\u064a\u0646', 'AE': u'\u0627\u0644\u0627\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'AD': u'\u0627\u0646\u062f\u0648\u0631\u0627', 'AG': u'\u0627\u0646\u062a\u064a\u063a\u0648\u0627 \u0648\u0628\u0631\u0628\u0648\u062f\u0627', 'AF': u'\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646', 'AI': u'\u0627\u0644\u0628\u0627\u0646\u064a\u0627', 'IS': u'\u0627\u064a\u0633\u0644\u0646\u062f\u0627', 'IR': u'\u0627\u064a\u0631\u0627\u0646', 'AM': u'\u0627\u0631\u0645\u064a\u0646\u064a\u0627', 'IT': u'\u0627\u064a\u0637\u0627\u0644\u064a\u0627', 'AO': u'\u0627\u0646\u063a\u0648\u0644\u0627', 'AR': u'\u0627\u0644\u0627\u0631\u062c\u0646\u062a\u064a\u0646', 'AU': u'\u0627\u0633\u062a\u0631\u0627\u0644\u064a\u0627', 'AT': u'\u0627\u0644\u0646\u0645\u0633\u0627', 'IN': u'\u0627\u0644\u0647\u0646\u062f', 'TZ': u'\u062a\u0627\u0646\u0632\u0627\u0646\u064a\u0627', 'AZ': u'\u0622\u0630\u0631\u0628\u064a\u062c\u0627\u0646', 'IE': u'\u0627\u064a\u0631\u0644\u0646\u062f\u0627', 'ID': u'\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0627', 'UA': u'\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0627', 'QA': u'\u0642\u0637\u0631', 'MZ': u'\u0645\u0648\u0632\u0645\u0628\u064a\u0642'} months=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] abbrMonths=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] days=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] abbrDays=[u'\u0646', u'\u062b', u'\u0631', u'\u062e', u'\u062c', u'\u0633', u'\u062d'] dateFormats={'medium': '%d/%m/%Y', 'full': '%%(dayname)s, %d %%(monthname)s, %Y', 'long': '%d %%(monthname)s, %Y', 'short': '%d/%m/%Y'} numericSymbols={'group': u'\u066c', 'nativeZeroDigit': u'\u0660', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': u'\u066b', 'percentSign': u'\u066a', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>i׳''turbogears/i18n/data/ar_IQ.pyc; :Mc @s hdd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd >>turbogears/i18n/data/ar_JO.py# Formatting configuration for locale ar_JO languages={'el': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646\u064a\u0629', 'gu': u'\u0627\u0644\u063a\u0648\u062c\u0627\u0631\u0627\u062a\u064a\u0629', 'en': u'\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629', 'zh': u'\u0627\u0644\u0635\u064a\u0646\u064a\u0629', 'sw': u'\u0627\u0644\u0633\u0648\u0627\u062d\u0644\u064a\u0629', 'ca': u'\u0627\u0644\u0643\u0627\u062a\u0627\u0644\u0648\u064a\u0646\u064a\u0629', 'it': u'\u0627\u0644\u0627\u064a\u0637\u0627\u0644\u064a\u0629', 'ar': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629', 'id': u'\u0627\u0644\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0629', 'es': u'\u0627\u0644\u0627\u0633\u0628\u0627\u0646\u064a\u0629', 'ru': u'\u0627\u0644\u0631\u0648\u0633\u064a\u0629', 'nl': u'\u0627\u0644\u0647\u0648\u0644\u0646\u062f\u064a\u0629', 'pt': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644\u064a\u0629', 'tr': u'\u0627\u0644\u062a\u0631\u0643\u064a\u0629', 'ne': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629', 'lt': u'\u0627\u0644\u0644\u062a\u0648\u0627\u0646\u064a\u0629', 'pa': u'\u0627\u0644\u0628\u0646\u062c\u0627\u0628\u064a\u0629', 'th': u'\u0627\u0644\u062a\u0627\u064a\u0644\u0627\u0646\u062f\u064a\u0629', 'vi': u'\u0627\u0644\u0641\u064a\u062a\u0646\u0627\u0645\u064a\u0629', 'ro': u'\u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064a\u0629', 'be': u'\u0627\u0644\u0628\u064a\u0644\u0648\u0631\u0648\u0633\u064a\u0629', 'fr': u'\u0627\u0644\u0641\u0631\u0646\u0633\u064a\u0629', 'bg': u'\u0627\u0644\u0628\u0644\u063a\u0627\u0631\u064a\u0629', 'uk': u'\u0627\u0644\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0629', 'hr': u'\u0627\u0644\u0643\u0631\u0648\u0627\u062a\u064a\u0629', 'bn': u'\u0627\u0644\u0628\u0646\u063a\u0627\u0644\u064a\u0629', 'bo': u'\u0627\u0644\u062a\u0628\u062a\u064a\u0629', 'da': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a\u0629', 'fa': u'\u0627\u0644\u0641\u0627\u0631\u0633\u064a\u0629', 'hi': u'\u0627\u0644\u0647\u0646\u062f\u064a\u0629', 'dz': u'\u0627\u0644\u0632\u0648\u0646\u062e\u0627\u064a\u0629', 'dv': u'\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629', 'fi': u'\u0627\u0644\u0641\u0646\u0644\u0646\u062f\u064a\u0629', 'ja': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a\u0629', 'he': u'\u0627\u0644\u0639\u0628\u0631\u064a\u0629', 'tl': u'\u0627\u0644\u062a\u0627\u063a\u0627\u0644\u0648\u063a\u064a\u0629', 'sr': u'\u0627\u0644\u0635\u0631\u0628\u064a\u0629', 'sq': u'\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629', 'mn': u'\u0627\u0644\u0645\u0646\u063a\u0648\u0644\u064a\u0629', 'ko': u'\u0627\u0644\u0643\u0648\u0631\u064a\u0629', 'km': u'\u0627\u0644\u062e\u0645\u064a\u0631\u064a\u0629', 'ur': u'\u0627\u0644\u0627\u0631\u062f\u064a\u0629', 'de': u'\u0627\u0644\u0627\u0644\u0645\u0627\u0646\u064a\u0629', 'ms': u'\u0644\u063a\u0629 \u0627\u0644\u0645\u0644\u0627\u064a\u0648', 'ug': u'\u0627\u0644\u0627\u063a\u0648\u0631\u064a\u0629', 'my': u'\u0627\u0644\u0628\u0648\u0631\u0645\u064a\u0629'} countries={'BD': u'\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634', 'BE': u'\u0628\u0644\u062c\u064a\u0643\u0627', 'BF': u'\u0628\u0648\u0631\u0643\u064a\u0646\u0627 \u0641\u0627\u0633\u0648', 'BG': u'\u0628\u0644\u063a\u0627\u0631\u064a\u0627', 'BA': u'\u0627\u0644\u0628\u0648\u0633\u0646\u0629 \u0648\u0627\u0644\u0647\u0631\u0633\u0643', 'BB': u'\u0628\u0631\u0628\u0627\u062f\u0648\u0633', 'BN': u'\u0628\u0631\u0648\u0646\u0627\u064a', 'BO': u'\u0628\u0648\u0644\u064a\u0641\u064a\u0627', 'BH': u'\u0627\u0644\u0628\u062d\u0631\u064a\u0646', 'BI': u'\u0628\u0648\u0631\u0648\u0646\u062f\u064a', 'BJ': u'\u0628\u0646\u064a\u0646', 'BT': u'\u0628\u0648\u062a\u0627\u0646', 'JM': u'\u062c\u0627\u0645\u0627\u064a\u0643\u0627', 'BW': u'\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627', 'WS': u'\u0633\u0627\u0645\u0648\u0627', 'BR': u'\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644', 'BS': u'\u0627\u0644\u0628\u0647\u0627\u0645\u0627', 'BY': u'\u0631\u0648\u0633\u064a\u0627 \u0627\u0644\u0628\u064a\u0636\u0627\u0621', 'BZ': u'\u0628\u0644\u064a\u0632', 'RU': u'\u0631\u0648\u0633\u064a\u0627', 'RW': u'\u0631\u0648\u0627\u0646\u062f\u0627', 'TM': u'\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646', 'TJ': u'\u062a\u0627\u062c\u064a\u0643\u0633\u062a\u0627\u0646', 'RO': u'\u0631\u0648\u0645\u0627\u0646\u064a\u0627', 'GW': u'\u063a\u064a\u0646\u064a\u0627 \u0628\u064a\u0633\u0627\u0648', 'GT': u'\u063a\u0648\u0627\u062a\u064a\u0645\u0627\u0644\u0627', 'GR': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646', 'GQ': u'\u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u0627\u0633\u062a\u0648\u0627\u0626\u064a\u0629', 'JP': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646', 'GY': u'\u063a\u0648\u0627\u064a\u0627\u0646\u0627', 'GE': u'\u062c\u0648\u0631\u062c\u064a\u0627', 'GD': u'\u063a\u0631\u064a\u0646\u0627\u062f\u0627', 'GB': u'\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'GA': u'\u063a\u0627\u0628\u0648\u0646', 'SV': u'\u0627\u0644\u0633\u0644\u0641\u0627\u062f\u0648\u0631', 'GN': u'\u063a\u064a\u0646\u064a\u0627', 'GM': u'\u063a\u0627\u0645\u0628\u064a\u0627', 'GH': u'\u063a\u0627\u0646\u0627', 'OM': u'\u0639\u0645\u0627\u0646', 'TN': u'\u062a\u0648\u0646\u0633', 'JO': u'\u0627\u0644\u0627\u0631\u062f\u0646', 'HR': u'\u0643\u0631\u0648\u0627\u062a\u064a\u0627', 'HT': u'\u0647\u0627\u064a\u062a\u064a', 'HU': u'\u0647\u0646\u063a\u0627\u0631\u064a\u0627', 'HN': u'\u0647\u0646\u062f\u0648\u0631\u0627\u0633', 'VE': u'\u0641\u0646\u0632\u0648\u064a\u0644\u0627', 'PW': u'\u0628\u0627\u0644\u0627\u0648', 'PT': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644', 'PY': u'\u0628\u0627\u0631\u0627\u063a\u0648\u0627\u064a', 'IQ': u'\u0627\u0644\u0639\u0631\u0627\u0642', 'PA': u'\u0628\u0646\u0645\u0627', 'PG': u'\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'PE': u'\u0628\u064a\u0631\u0648', 'PK': u'\u0627\u0644\u0628\u0627\u0643\u0633\u062a\u0627\u0646', 'PH': u'\u0627\u0644\u0641\u064a\u0644\u0628\u064a\u0646', 'PL': u'\u0628\u0648\u0644\u0646\u062f\u0627', 'ZM': u'\u0632\u0627\u0645\u0628\u064a\u0627', 'EH': u'\u0627\u0644\u0635\u062d\u0631\u0627\u0621 \u0627\u0644\u063a\u0631\u0628\u064a\u0629', 'EE': u'\u0627\u0633\u062a\u0648\u0646\u064a\u0627', 'EG': u'\u0645\u0635\u0631', 'ZA': u'\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u064a\u0642\u064a\u0627', 'EC': u'\u0627\u0643\u0648\u0627\u062f\u0648\u0631', 'VN': u'\u0641\u064a\u062a\u0646\u0627\u0645', 'SB': u'\u062c\u0632\u0631 \u0633\u0644\u064a\u0645\u0627\u0646', 'ET': u'\u0627\u062b\u064a\u0648\u0628\u064a\u0627', 'SO': u'\u0627\u0644\u0635\u0648\u0645\u0627\u0644', 'ZW': u'\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a', 'ES': u'\u0627\u0633\u0628\u0627\u0646\u064a\u0627', 'ER': u'\u0627\u0631\u062a\u064a\u0631\u064a\u0627', 'MD': u'\u0645\u0648\u0644\u062f\u0648\u0641\u0627', 'MG': u'\u0645\u062f\u063a\u0634\u0642\u0631', 'MA': u'\u0627\u0644\u0645\u063a\u0631\u0628', 'MC': u'\u0645\u0648\u0646\u0627\u0643\u0648', 'UZ': u'\u0627\u0632\u0628\u0643\u0633\u062a\u0627\u0646', 'MM': u'\u0645\u064a\u0627\u0646\u0645\u0627\u0631', 'ML': u'\u0645\u0627\u0644\u064a', 'MN': u'\u0645\u0646\u063a\u0648\u0644\u064a\u0627', 'MH': u'\u062c\u0632\u0631 \u0627\u0644\u0645\u0627\u0631\u0634\u0627\u0644', 'MK': u'\u0645\u0642\u062f\u0648\u0646\u064a\u0627', 'MU': u'\u0645\u0648\u0631\u064a\u0634\u0648\u0633', 'MT': u'\u0645\u0627\u0644\u0637\u0629', 'MW': u'\u0645\u0644\u0627\u0648\u064a', 'MV': u'\u0645\u0627\u0644\u062f\u064a\u0641', 'MR': u'\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627', 'UG': u'\u0627\u0648\u063a\u0646\u062f\u0627', 'MY': u'\u0645\u0627\u0644\u064a\u0632\u064a\u0627', 'MX': u'\u0627\u0644\u0645\u0643\u0633\u064a\u0643', 'IL': u'\u0627\u0633\u0631\u0627\u0626\u064a\u0644', 'FR': u'\u0641\u0631\u0646\u0633\u0627', 'FI': u'\u0641\u0646\u0644\u0646\u062f\u0627', 'FJ': u'\u0641\u064a\u062c\u064a', 'FM': u'\u0645\u064a\u0643\u0631\u0648\u0646\u064a\u0632\u064a\u0627', 'NI': u'\u0646\u064a\u0643\u0627\u0631\u0627\u063a\u0648\u0627', 'NL': u'\u0647\u0648\u0644\u0646\u062f\u0627', 'NO': u'\u0627\u0644\u0646\u0631\u0648\u064a\u062c', 'NA': u'\u0646\u0627\u0645\u064a\u0628\u064a\u0627', 'VU': u'\u0641\u0627\u0646\u0648\u0622\u062a\u0648', 'NE': u'\u0627\u0644\u0646\u064a\u062c\u0631', 'NG': u'\u0646\u064a\u062c\u064a\u0631\u064a\u0627', 'NZ': u'\u0632\u064a\u0644\u0646\u062f\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'NP': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644', 'NR': u'\u0646\u0627\u0648\u0631\u0648', 'CH': u'\u0633\u0648\u064a\u0633\u0631\u0627', 'CO': u'\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627', 'CN': u'\u0627\u0644\u0635\u064a\u0646', 'CM': u'\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0648\u0646', 'CL': u'\u062a\u0634\u064a\u0644\u064a', 'CA': u'\u0643\u0646\u062f\u0627', 'CG': u'\u0627\u0644\u0643\u0648\u0646\u063a\u0648', 'CF': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0641\u0631\u064a\u0642\u064a\u0627 \u0627\u0644\u0648\u0633\u0637\u0649', 'CZ': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062a\u0634\u064a\u0643', 'CY': u'\u0642\u0628\u0631\u0635', 'CR': u'\u0643\u0648\u0633\u062a\u0627\u0631\u064a\u0643\u0627', 'CV': u'\u0627\u0644\u0631\u0623\u0633 \u0627\u0644\u0627\u062e\u0636\u0631', 'CU': u'\u0643\u0648\u0628\u0627', 'SZ': u'\u0633\u0648\u0627\u0632\u064a\u0644\u0627\u0646\u062f', 'SY': u'\u0633\u0648\u0631\u064a\u0629', 'KG': u'\u0642\u064a\u0631\u063a\u064a\u0632\u0633\u062a\u0627\u0646', 'KE': u'\u0643\u064a\u0646\u064a\u0627', 'SR': u'\u0633\u0648\u0631\u064a\u0646\u0627\u0645', 'KI': u'\u0643\u064a\u0631\u064a\u0628\u0627\u062a\u064a', 'KH': u'\u0643\u0645\u0628\u0648\u062f\u064a\u0627', 'KN': u'\u0633\u0627\u0646\u062a \u0643\u064a\u062a\u0633 \u0648\u0646\u064a\u0641\u064a\u0633', 'KM': u'\u062c\u0632\u0631 \u0627\u0644\u0642\u0645\u0631', 'ST': u'\u0633\u0627\u0646 \u062a\u0648\u0645\u064a \u0648\u0628\u0631\u064a\u0646\u0633\u064a\u0628\u064a', 'SK': u'\u0633\u0644\u0648\u0641\u0627\u0643\u064a\u0627', 'KR': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u062c\u0646\u0648\u0628\u064a\u0629', 'SI': u'\u0633\u0644\u0648\u0641\u064a\u0646\u064a\u0627', 'KP': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629', 'KW': u'\u0627\u0644\u0643\u0648\u064a\u062a', 'SN': u'\u0627\u0644\u0633\u0646\u063a\u0627\u0644', 'SM': u'\u0633\u0627\u0646 \u0645\u0627\u0631\u064a\u0646\u0648', 'SL': u'\u0633\u064a\u0631\u0627\u0644\u064a\u0648\u0646', 'SC': u'\u0633\u064a\u0634\u0644', 'KZ': u'\u0643\u0627\u0632\u0627\u062e\u0633\u062a\u0627\u0646', 'SA': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629', 'SG': u'\u0633\u0646\u063a\u0627\u0641\u0648\u0631\u0629', 'SE': u'\u0627\u0644\u0633\u0648\u064a\u062f', 'SD': u'\u0627\u0644\u0633\u0648\u062f\u0627\u0646', 'DO': u'\u0627\u0644\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u064a\u0629', 'DM': u'\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u0627', 'DJ': u'\u062c\u064a\u0628\u0648\u062a\u064a', 'DK': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0631\u0643', 'DE': u'\u0627\u0644\u0645\u0627\u0646\u064a\u0627', 'YE': u'\u0627\u0644\u064a\u0645\u0646', 'DZ': u'\u0627\u0644\u062c\u0632\u0627\u0626\u0631', 'US': u'\u0627\u0644\u0627\u0648\u0644\u0627\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u062d\u062f\u0629 \u0627\u0644\u0627\u0645\u0631\u064a\u0643\u064a\u0629', 'UY': u'\u0627\u0631\u0648\u063a\u0648\u0627\u064a', 'LB': u'\u0644\u0628\u0646\u0627\u0646', 'LC': u'\u0633\u0627\u0646\u062a \u0644\u0648\u0633\u064a\u0627', 'LA': u'\u0644\u0627\u0648\u0633', 'TV': u'\u062a\u0648\u0641\u0627\u0644\u0648', 'TW': u'\u062a\u0627\u064a\u0648\u0627\u0646', 'TT': u'\u062a\u0631\u064a\u0646\u064a\u062f\u0627\u062f \u0648\u062a\u0648\u0628\u0627\u063a\u0648', 'TR': u'\u062a\u0631\u0643\u064a\u0627', 'LK': u'\u0633\u0631\u064a \u0644\u0627\u0646\u0643\u0627', 'LI': u'\u0644\u064a\u062e\u062a\u0646\u0634\u062a\u0627\u064a\u0646', 'LV': u'\u0644\u0627\u062a\u0641\u064a\u0627', 'TO': u'\u062a\u0648\u0646\u063a\u0627', 'LT': u'\u0644\u064a\u062a\u0648\u0627\u0646\u064a\u0627', 'LU': u'\u0644\u0648\u0643\u0633\u0648\u0645\u0628\u0631\u063a', 'LR': u'\u0644\u064a\u0628\u064a\u0631\u064a\u0627', 'LS': u'\u0644\u064a\u0633\u0648\u062a\u0648', 'TH': u'\u062a\u0627\u064a\u0644\u0646\u062f', 'TG': u'\u062a\u0648\u063a\u0648', 'TD': u'\u062a\u0634\u0627\u062f', 'LY': u'\u0644\u064a\u0628\u064a\u0627', 'VA': u'\u0627\u0644\u0641\u0627\u062a\u064a\u0643\u0627\u0646', 'VC': u'\u0633\u0627\u0646\u062a \u0641\u0646\u0633\u0646\u062a \u0648\u062c\u0632\u0631 \u063a\u0631\u064a\u0646\u0627\u062f\u064a\u0646', 'AE': u'\u0627\u0644\u0627\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'AD': u'\u0627\u0646\u062f\u0648\u0631\u0627', 'AG': u'\u0627\u0646\u062a\u064a\u063a\u0648\u0627 \u0648\u0628\u0631\u0628\u0648\u062f\u0627', 'AF': u'\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646', 'AI': u'\u0627\u0644\u0628\u0627\u0646\u064a\u0627', 'IS': u'\u0627\u064a\u0633\u0644\u0646\u062f\u0627', 'IR': u'\u0627\u064a\u0631\u0627\u0646', 'AM': u'\u0627\u0631\u0645\u064a\u0646\u064a\u0627', 'IT': u'\u0627\u064a\u0637\u0627\u0644\u064a\u0627', 'AO': u'\u0627\u0646\u063a\u0648\u0644\u0627', 'AR': u'\u0627\u0644\u0627\u0631\u062c\u0646\u062a\u064a\u0646', 'AU': u'\u0627\u0633\u062a\u0631\u0627\u0644\u064a\u0627', 'AT': u'\u0627\u0644\u0646\u0645\u0633\u0627', 'IN': u'\u0627\u0644\u0647\u0646\u062f', 'TZ': u'\u062a\u0627\u0646\u0632\u0627\u0646\u064a\u0627', 'AZ': u'\u0622\u0630\u0631\u0628\u064a\u062c\u0627\u0646', 'IE': u'\u0627\u064a\u0631\u0644\u0646\u062f\u0627', 'ID': u'\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0627', 'UA': u'\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0627', 'QA': u'\u0642\u0637\u0631', 'MZ': u'\u0645\u0648\u0632\u0645\u0628\u064a\u0642'} months=[u'\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a', u'\u0634\u0628\u0627\u0637', u'\u0622\u0630\u0627\u0631', u'\u0646\u064a\u0633\u0627\u0646', u'\u0623\u064a\u0627\u0631', u'\u062d\u0632\u064a\u0631\u0627\u0646', u'\u062a\u0645\u0648\u0632', u'\u0622\u0628', u'\u0623\u064a\u0644\u0648\u0644', u'\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644', u'\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a', u'\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644'] abbrMonths=[u'\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a', u'\u0634\u0628\u0627\u0637', u'\u0622\u0630\u0627\u0631', u'\u0646\u064a\u0633\u0627\u0646', u'\u0623\u064a\u0627\u0631', u'\u062d\u0632\u064a\u0631\u0627\u0646', u'\u062a\u0645\u0648\u0632', u'\u0622\u0628', u'\u0623\u064a\u0644\u0648\u0644', u'\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644', u'\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a', u'\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644'] days=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] abbrDays=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] dateFormats={'medium': '%d/%m/%Y', 'full': '%%(dayname)s, %d %%(monthname)s, %Y', 'long': '%d %%(monthname)s, %Y', 'short': '%d/%m/%Y'} numericSymbols={'group': u'\u066c', 'nativeZeroDigit': u'\u0660', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': u'\u066b', 'percentSign': u'\u066a', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>I@~''turbogears/i18n/data/ar_JO.pyc; :Mc @s hdd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<ddܪaF=F=turbogears/i18n/data/ar_KW.py# Formatting configuration for locale ar_KW languages={'el': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646\u064a\u0629', 'gu': u'\u0627\u0644\u063a\u0648\u062c\u0627\u0631\u0627\u062a\u064a\u0629', 'en': u'\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629', 'zh': u'\u0627\u0644\u0635\u064a\u0646\u064a\u0629', 'sw': u'\u0627\u0644\u0633\u0648\u0627\u062d\u0644\u064a\u0629', 'ca': u'\u0627\u0644\u0643\u0627\u062a\u0627\u0644\u0648\u064a\u0646\u064a\u0629', 'it': u'\u0627\u0644\u0627\u064a\u0637\u0627\u0644\u064a\u0629', 'ar': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629', 'id': u'\u0627\u0644\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0629', 'es': u'\u0627\u0644\u0627\u0633\u0628\u0627\u0646\u064a\u0629', 'ru': u'\u0627\u0644\u0631\u0648\u0633\u064a\u0629', 'nl': u'\u0627\u0644\u0647\u0648\u0644\u0646\u062f\u064a\u0629', 'pt': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644\u064a\u0629', 'tr': u'\u0627\u0644\u062a\u0631\u0643\u064a\u0629', 'ne': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629', 'lt': u'\u0627\u0644\u0644\u062a\u0648\u0627\u0646\u064a\u0629', 'pa': u'\u0627\u0644\u0628\u0646\u062c\u0627\u0628\u064a\u0629', 'th': u'\u0627\u0644\u062a\u0627\u064a\u0644\u0627\u0646\u062f\u064a\u0629', 'vi': u'\u0627\u0644\u0641\u064a\u062a\u0646\u0627\u0645\u064a\u0629', 'ro': u'\u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064a\u0629', 'be': u'\u0627\u0644\u0628\u064a\u0644\u0648\u0631\u0648\u0633\u064a\u0629', 'fr': u'\u0627\u0644\u0641\u0631\u0646\u0633\u064a\u0629', 'bg': u'\u0627\u0644\u0628\u0644\u063a\u0627\u0631\u064a\u0629', 'uk': u'\u0627\u0644\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0629', 'hr': u'\u0627\u0644\u0643\u0631\u0648\u0627\u062a\u064a\u0629', 'bn': u'\u0627\u0644\u0628\u0646\u063a\u0627\u0644\u064a\u0629', 'bo': u'\u0627\u0644\u062a\u0628\u062a\u064a\u0629', 'da': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a\u0629', 'fa': u'\u0627\u0644\u0641\u0627\u0631\u0633\u064a\u0629', 'hi': u'\u0627\u0644\u0647\u0646\u062f\u064a\u0629', 'dz': u'\u0627\u0644\u0632\u0648\u0646\u062e\u0627\u064a\u0629', 'dv': u'\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629', 'fi': u'\u0627\u0644\u0641\u0646\u0644\u0646\u062f\u064a\u0629', 'ja': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a\u0629', 'he': u'\u0627\u0644\u0639\u0628\u0631\u064a\u0629', 'tl': u'\u0627\u0644\u062a\u0627\u063a\u0627\u0644\u0648\u063a\u064a\u0629', 'sr': u'\u0627\u0644\u0635\u0631\u0628\u064a\u0629', 'sq': u'\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629', 'mn': u'\u0627\u0644\u0645\u0646\u063a\u0648\u0644\u064a\u0629', 'ko': u'\u0627\u0644\u0643\u0648\u0631\u064a\u0629', 'km': u'\u0627\u0644\u062e\u0645\u064a\u0631\u064a\u0629', 'ur': u'\u0627\u0644\u0627\u0631\u062f\u064a\u0629', 'de': u'\u0627\u0644\u0627\u0644\u0645\u0627\u0646\u064a\u0629', 'ms': u'\u0644\u063a\u0629 \u0627\u0644\u0645\u0644\u0627\u064a\u0648', 'ug': u'\u0627\u0644\u0627\u063a\u0648\u0631\u064a\u0629', 'my': u'\u0627\u0644\u0628\u0648\u0631\u0645\u064a\u0629'} countries={'BD': u'\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634', 'BE': u'\u0628\u0644\u062c\u064a\u0643\u0627', 'BF': u'\u0628\u0648\u0631\u0643\u064a\u0646\u0627 \u0641\u0627\u0633\u0648', 'BG': u'\u0628\u0644\u063a\u0627\u0631\u064a\u0627', 'BA': u'\u0627\u0644\u0628\u0648\u0633\u0646\u0629 \u0648\u0627\u0644\u0647\u0631\u0633\u0643', 'BB': u'\u0628\u0631\u0628\u0627\u062f\u0648\u0633', 'BN': u'\u0628\u0631\u0648\u0646\u0627\u064a', 'BO': u'\u0628\u0648\u0644\u064a\u0641\u064a\u0627', 'BH': u'\u0627\u0644\u0628\u062d\u0631\u064a\u0646', 'BI': u'\u0628\u0648\u0631\u0648\u0646\u062f\u064a', 'BJ': u'\u0628\u0646\u064a\u0646', 'BT': u'\u0628\u0648\u062a\u0627\u0646', 'JM': u'\u062c\u0627\u0645\u0627\u064a\u0643\u0627', 'BW': u'\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627', 'WS': u'\u0633\u0627\u0645\u0648\u0627', 'BR': u'\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644', 'BS': u'\u0627\u0644\u0628\u0647\u0627\u0645\u0627', 'BY': u'\u0631\u0648\u0633\u064a\u0627 \u0627\u0644\u0628\u064a\u0636\u0627\u0621', 'BZ': u'\u0628\u0644\u064a\u0632', 'RU': u'\u0631\u0648\u0633\u064a\u0627', 'RW': u'\u0631\u0648\u0627\u0646\u062f\u0627', 'TM': u'\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646', 'TJ': u'\u062a\u0627\u062c\u064a\u0643\u0633\u062a\u0627\u0646', 'RO': u'\u0631\u0648\u0645\u0627\u0646\u064a\u0627', 'GW': u'\u063a\u064a\u0646\u064a\u0627 \u0628\u064a\u0633\u0627\u0648', 'GT': u'\u063a\u0648\u0627\u062a\u064a\u0645\u0627\u0644\u0627', 'GR': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646', 'GQ': u'\u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u0627\u0633\u062a\u0648\u0627\u0626\u064a\u0629', 'JP': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646', 'GY': u'\u063a\u0648\u0627\u064a\u0627\u0646\u0627', 'GE': u'\u062c\u0648\u0631\u062c\u064a\u0627', 'GD': u'\u063a\u0631\u064a\u0646\u0627\u062f\u0627', 'GB': u'\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'GA': u'\u063a\u0627\u0628\u0648\u0646', 'SV': u'\u0627\u0644\u0633\u0644\u0641\u0627\u062f\u0648\u0631', 'GN': u'\u063a\u064a\u0646\u064a\u0627', 'GM': u'\u063a\u0627\u0645\u0628\u064a\u0627', 'GH': u'\u063a\u0627\u0646\u0627', 'OM': u'\u0639\u0645\u0627\u0646', 'TN': u'\u062a\u0648\u0646\u0633', 'JO': u'\u0627\u0644\u0627\u0631\u062f\u0646', 'HR': u'\u0643\u0631\u0648\u0627\u062a\u064a\u0627', 'HT': u'\u0647\u0627\u064a\u062a\u064a', 'HU': u'\u0647\u0646\u063a\u0627\u0631\u064a\u0627', 'HN': u'\u0647\u0646\u062f\u0648\u0631\u0627\u0633', 'VE': u'\u0641\u0646\u0632\u0648\u064a\u0644\u0627', 'PW': u'\u0628\u0627\u0644\u0627\u0648', 'PT': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644', 'PY': u'\u0628\u0627\u0631\u0627\u063a\u0648\u0627\u064a', 'IQ': u'\u0627\u0644\u0639\u0631\u0627\u0642', 'PA': u'\u0628\u0646\u0645\u0627', 'PG': u'\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'PE': u'\u0628\u064a\u0631\u0648', 'PK': u'\u0627\u0644\u0628\u0627\u0643\u0633\u062a\u0627\u0646', 'PH': u'\u0627\u0644\u0641\u064a\u0644\u0628\u064a\u0646', 'PL': u'\u0628\u0648\u0644\u0646\u062f\u0627', 'ZM': u'\u0632\u0627\u0645\u0628\u064a\u0627', 'EH': u'\u0627\u0644\u0635\u062d\u0631\u0627\u0621 \u0627\u0644\u063a\u0631\u0628\u064a\u0629', 'EE': u'\u0627\u0633\u062a\u0648\u0646\u064a\u0627', 'EG': u'\u0645\u0635\u0631', 'ZA': u'\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u064a\u0642\u064a\u0627', 'EC': u'\u0627\u0643\u0648\u0627\u062f\u0648\u0631', 'VN': u'\u0641\u064a\u062a\u0646\u0627\u0645', 'SB': u'\u062c\u0632\u0631 \u0633\u0644\u064a\u0645\u0627\u0646', 'ET': u'\u0627\u062b\u064a\u0648\u0628\u064a\u0627', 'SO': u'\u0627\u0644\u0635\u0648\u0645\u0627\u0644', 'ZW': u'\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a', 'ES': u'\u0627\u0633\u0628\u0627\u0646\u064a\u0627', 'ER': u'\u0627\u0631\u062a\u064a\u0631\u064a\u0627', 'MD': u'\u0645\u0648\u0644\u062f\u0648\u0641\u0627', 'MG': u'\u0645\u062f\u063a\u0634\u0642\u0631', 'MA': u'\u0627\u0644\u0645\u063a\u0631\u0628', 'MC': u'\u0645\u0648\u0646\u0627\u0643\u0648', 'UZ': u'\u0627\u0632\u0628\u0643\u0633\u062a\u0627\u0646', 'MM': u'\u0645\u064a\u0627\u0646\u0645\u0627\u0631', 'ML': u'\u0645\u0627\u0644\u064a', 'MN': u'\u0645\u0646\u063a\u0648\u0644\u064a\u0627', 'MH': u'\u062c\u0632\u0631 \u0627\u0644\u0645\u0627\u0631\u0634\u0627\u0644', 'MK': u'\u0645\u0642\u062f\u0648\u0646\u064a\u0627', 'MU': u'\u0645\u0648\u0631\u064a\u0634\u0648\u0633', 'MT': u'\u0645\u0627\u0644\u0637\u0629', 'MW': u'\u0645\u0644\u0627\u0648\u064a', 'MV': u'\u0645\u0627\u0644\u062f\u064a\u0641', 'MR': u'\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627', 'UG': u'\u0627\u0648\u063a\u0646\u062f\u0627', 'MY': u'\u0645\u0627\u0644\u064a\u0632\u064a\u0627', 'MX': u'\u0627\u0644\u0645\u0643\u0633\u064a\u0643', 'IL': u'\u0627\u0633\u0631\u0627\u0626\u064a\u0644', 'FR': u'\u0641\u0631\u0646\u0633\u0627', 'FI': u'\u0641\u0646\u0644\u0646\u062f\u0627', 'FJ': u'\u0641\u064a\u062c\u064a', 'FM': u'\u0645\u064a\u0643\u0631\u0648\u0646\u064a\u0632\u064a\u0627', 'NI': u'\u0646\u064a\u0643\u0627\u0631\u0627\u063a\u0648\u0627', 'NL': u'\u0647\u0648\u0644\u0646\u062f\u0627', 'NO': u'\u0627\u0644\u0646\u0631\u0648\u064a\u062c', 'NA': u'\u0646\u0627\u0645\u064a\u0628\u064a\u0627', 'VU': u'\u0641\u0627\u0646\u0648\u0622\u062a\u0648', 'NE': u'\u0627\u0644\u0646\u064a\u062c\u0631', 'NG': u'\u0646\u064a\u062c\u064a\u0631\u064a\u0627', 'NZ': u'\u0632\u064a\u0644\u0646\u062f\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'NP': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644', 'NR': u'\u0646\u0627\u0648\u0631\u0648', 'CH': u'\u0633\u0648\u064a\u0633\u0631\u0627', 'CO': u'\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627', 'CN': u'\u0627\u0644\u0635\u064a\u0646', 'CM': u'\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0648\u0646', 'CL': u'\u062a\u0634\u064a\u0644\u064a', 'CA': u'\u0643\u0646\u062f\u0627', 'CG': u'\u0627\u0644\u0643\u0648\u0646\u063a\u0648', 'CF': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0641\u0631\u064a\u0642\u064a\u0627 \u0627\u0644\u0648\u0633\u0637\u0649', 'CZ': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062a\u0634\u064a\u0643', 'CY': u'\u0642\u0628\u0631\u0635', 'CR': u'\u0643\u0648\u0633\u062a\u0627\u0631\u064a\u0643\u0627', 'CV': u'\u0627\u0644\u0631\u0623\u0633 \u0627\u0644\u0627\u062e\u0636\u0631', 'CU': u'\u0643\u0648\u0628\u0627', 'SZ': u'\u0633\u0648\u0627\u0632\u064a\u0644\u0627\u0646\u062f', 'SY': u'\u0633\u0648\u0631\u064a\u0629', 'KG': u'\u0642\u064a\u0631\u063a\u064a\u0632\u0633\u062a\u0627\u0646', 'KE': u'\u0643\u064a\u0646\u064a\u0627', 'SR': u'\u0633\u0648\u0631\u064a\u0646\u0627\u0645', 'KI': u'\u0643\u064a\u0631\u064a\u0628\u0627\u062a\u064a', 'KH': u'\u0643\u0645\u0628\u0648\u062f\u064a\u0627', 'KN': u'\u0633\u0627\u0646\u062a \u0643\u064a\u062a\u0633 \u0648\u0646\u064a\u0641\u064a\u0633', 'KM': u'\u062c\u0632\u0631 \u0627\u0644\u0642\u0645\u0631', 'ST': u'\u0633\u0627\u0646 \u062a\u0648\u0645\u064a \u0648\u0628\u0631\u064a\u0646\u0633\u064a\u0628\u064a', 'SK': u'\u0633\u0644\u0648\u0641\u0627\u0643\u064a\u0627', 'KR': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u062c\u0646\u0648\u0628\u064a\u0629', 'SI': u'\u0633\u0644\u0648\u0641\u064a\u0646\u064a\u0627', 'KP': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629', 'KW': u'\u0627\u0644\u0643\u0648\u064a\u062a', 'SN': u'\u0627\u0644\u0633\u0646\u063a\u0627\u0644', 'SM': u'\u0633\u0627\u0646 \u0645\u0627\u0631\u064a\u0646\u0648', 'SL': u'\u0633\u064a\u0631\u0627\u0644\u064a\u0648\u0646', 'SC': u'\u0633\u064a\u0634\u0644', 'KZ': u'\u0643\u0627\u0632\u0627\u062e\u0633\u062a\u0627\u0646', 'SA': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629', 'SG': u'\u0633\u0646\u063a\u0627\u0641\u0648\u0631\u0629', 'SE': u'\u0627\u0644\u0633\u0648\u064a\u062f', 'SD': u'\u0627\u0644\u0633\u0648\u062f\u0627\u0646', 'DO': u'\u0627\u0644\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u064a\u0629', 'DM': u'\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u0627', 'DJ': u'\u062c\u064a\u0628\u0648\u062a\u064a', 'DK': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0631\u0643', 'DE': u'\u0627\u0644\u0645\u0627\u0646\u064a\u0627', 'YE': u'\u0627\u0644\u064a\u0645\u0646', 'DZ': u'\u0627\u0644\u062c\u0632\u0627\u0626\u0631', 'US': u'\u0627\u0644\u0627\u0648\u0644\u0627\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u062d\u062f\u0629 \u0627\u0644\u0627\u0645\u0631\u064a\u0643\u064a\u0629', 'UY': u'\u0627\u0631\u0648\u063a\u0648\u0627\u064a', 'LB': u'\u0644\u0628\u0646\u0627\u0646', 'LC': u'\u0633\u0627\u0646\u062a \u0644\u0648\u0633\u064a\u0627', 'LA': u'\u0644\u0627\u0648\u0633', 'TV': u'\u062a\u0648\u0641\u0627\u0644\u0648', 'TW': u'\u062a\u0627\u064a\u0648\u0627\u0646', 'TT': u'\u062a\u0631\u064a\u0646\u064a\u062f\u0627\u062f \u0648\u062a\u0648\u0628\u0627\u063a\u0648', 'TR': u'\u062a\u0631\u0643\u064a\u0627', 'LK': u'\u0633\u0631\u064a \u0644\u0627\u0646\u0643\u0627', 'LI': u'\u0644\u064a\u062e\u062a\u0646\u0634\u062a\u0627\u064a\u0646', 'LV': u'\u0644\u0627\u062a\u0641\u064a\u0627', 'TO': u'\u062a\u0648\u0646\u063a\u0627', 'LT': u'\u0644\u064a\u062a\u0648\u0627\u0646\u064a\u0627', 'LU': u'\u0644\u0648\u0643\u0633\u0648\u0645\u0628\u0631\u063a', 'LR': u'\u0644\u064a\u0628\u064a\u0631\u064a\u0627', 'LS': u'\u0644\u064a\u0633\u0648\u062a\u0648', 'TH': u'\u062a\u0627\u064a\u0644\u0646\u062f', 'TG': u'\u062a\u0648\u063a\u0648', 'TD': u'\u062a\u0634\u0627\u062f', 'LY': u'\u0644\u064a\u0628\u064a\u0627', 'VA': u'\u0627\u0644\u0641\u0627\u062a\u064a\u0643\u0627\u0646', 'VC': u'\u0633\u0627\u0646\u062a \u0641\u0646\u0633\u0646\u062a \u0648\u062c\u0632\u0631 \u063a\u0631\u064a\u0646\u0627\u062f\u064a\u0646', 'AE': u'\u0627\u0644\u0627\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'AD': u'\u0627\u0646\u062f\u0648\u0631\u0627', 'AG': u'\u0627\u0646\u062a\u064a\u063a\u0648\u0627 \u0648\u0628\u0631\u0628\u0648\u062f\u0627', 'AF': u'\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646', 'AI': u'\u0627\u0644\u0628\u0627\u0646\u064a\u0627', 'IS': u'\u0627\u064a\u0633\u0644\u0646\u062f\u0627', 'IR': u'\u0627\u064a\u0631\u0627\u0646', 'AM': u'\u0627\u0631\u0645\u064a\u0646\u064a\u0627', 'IT': u'\u0627\u064a\u0637\u0627\u0644\u064a\u0627', 'AO': u'\u0627\u0646\u063a\u0648\u0644\u0627', 'AR': u'\u0627\u0644\u0627\u0631\u062c\u0646\u062a\u064a\u0646', 'AU': u'\u0627\u0633\u062a\u0631\u0627\u0644\u064a\u0627', 'AT': u'\u0627\u0644\u0646\u0645\u0633\u0627', 'IN': u'\u0627\u0644\u0647\u0646\u062f', 'TZ': u'\u062a\u0627\u0646\u0632\u0627\u0646\u064a\u0627', 'AZ': u'\u0622\u0630\u0631\u0628\u064a\u062c\u0627\u0646', 'IE': u'\u0627\u064a\u0631\u0644\u0646\u062f\u0627', 'ID': u'\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0627', 'UA': u'\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0627', 'QA': u'\u0642\u0637\u0631', 'MZ': u'\u0645\u0648\u0632\u0645\u0628\u064a\u0642'} months=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] abbrMonths=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] days=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] abbrDays=[u'\u0646', u'\u062b', u'\u0631', u'\u062e', u'\u062c', u'\u0633', u'\u062d'] dateFormats={'medium': '%d/%m/%Y', 'full': '%%(dayname)s, %d %%(monthname)s, %Y', 'long': '%d %%(monthname)s, %Y', 'short': '%d/%m/%Y'} numericSymbols={'group': u'\u066c', 'nativeZeroDigit': u'\u0660', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': u'\u066b', 'percentSign': u'\u066a', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>''turbogears/i18n/data/ar_KW.pyc; :Mc @s hdd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<ddA}>>turbogears/i18n/data/ar_LB.py# Formatting configuration for locale ar_LB languages={'el': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646\u064a\u0629', 'gu': u'\u0627\u0644\u063a\u0648\u062c\u0627\u0631\u0627\u062a\u064a\u0629', 'en': u'\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629', 'zh': u'\u0627\u0644\u0635\u064a\u0646\u064a\u0629', 'sw': u'\u0627\u0644\u0633\u0648\u0627\u062d\u0644\u064a\u0629', 'ca': u'\u0627\u0644\u0643\u0627\u062a\u0627\u0644\u0648\u064a\u0646\u064a\u0629', 'it': u'\u0627\u0644\u0627\u064a\u0637\u0627\u0644\u064a\u0629', 'ar': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629', 'id': u'\u0627\u0644\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0629', 'es': u'\u0627\u0644\u0627\u0633\u0628\u0627\u0646\u064a\u0629', 'ru': u'\u0627\u0644\u0631\u0648\u0633\u064a\u0629', 'nl': u'\u0627\u0644\u0647\u0648\u0644\u0646\u062f\u064a\u0629', 'pt': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644\u064a\u0629', 'tr': u'\u0627\u0644\u062a\u0631\u0643\u064a\u0629', 'ne': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629', 'lt': u'\u0627\u0644\u0644\u062a\u0648\u0627\u0646\u064a\u0629', 'pa': u'\u0627\u0644\u0628\u0646\u062c\u0627\u0628\u064a\u0629', 'th': u'\u0627\u0644\u062a\u0627\u064a\u0644\u0627\u0646\u062f\u064a\u0629', 'vi': u'\u0627\u0644\u0641\u064a\u062a\u0646\u0627\u0645\u064a\u0629', 'ro': u'\u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064a\u0629', 'be': u'\u0627\u0644\u0628\u064a\u0644\u0648\u0631\u0648\u0633\u064a\u0629', 'fr': u'\u0627\u0644\u0641\u0631\u0646\u0633\u064a\u0629', 'bg': u'\u0627\u0644\u0628\u0644\u063a\u0627\u0631\u064a\u0629', 'uk': u'\u0627\u0644\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0629', 'hr': u'\u0627\u0644\u0643\u0631\u0648\u0627\u062a\u064a\u0629', 'bn': u'\u0627\u0644\u0628\u0646\u063a\u0627\u0644\u064a\u0629', 'bo': u'\u0627\u0644\u062a\u0628\u062a\u064a\u0629', 'da': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a\u0629', 'fa': u'\u0627\u0644\u0641\u0627\u0631\u0633\u064a\u0629', 'hi': u'\u0627\u0644\u0647\u0646\u062f\u064a\u0629', 'dz': u'\u0627\u0644\u0632\u0648\u0646\u062e\u0627\u064a\u0629', 'dv': u'\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629', 'fi': u'\u0627\u0644\u0641\u0646\u0644\u0646\u062f\u064a\u0629', 'ja': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a\u0629', 'he': u'\u0627\u0644\u0639\u0628\u0631\u064a\u0629', 'tl': u'\u0627\u0644\u062a\u0627\u063a\u0627\u0644\u0648\u063a\u064a\u0629', 'sr': u'\u0627\u0644\u0635\u0631\u0628\u064a\u0629', 'sq': u'\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629', 'mn': u'\u0627\u0644\u0645\u0646\u063a\u0648\u0644\u064a\u0629', 'ko': u'\u0627\u0644\u0643\u0648\u0631\u064a\u0629', 'km': u'\u0627\u0644\u062e\u0645\u064a\u0631\u064a\u0629', 'ur': u'\u0627\u0644\u0627\u0631\u062f\u064a\u0629', 'de': u'\u0627\u0644\u0627\u0644\u0645\u0627\u0646\u064a\u0629', 'ms': u'\u0644\u063a\u0629 \u0627\u0644\u0645\u0644\u0627\u064a\u0648', 'ug': u'\u0627\u0644\u0627\u063a\u0648\u0631\u064a\u0629', 'my': u'\u0627\u0644\u0628\u0648\u0631\u0645\u064a\u0629'} countries={'BD': u'\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634', 'BE': u'\u0628\u0644\u062c\u064a\u0643\u0627', 'BF': u'\u0628\u0648\u0631\u0643\u064a\u0646\u0627 \u0641\u0627\u0633\u0648', 'BG': u'\u0628\u0644\u063a\u0627\u0631\u064a\u0627', 'BA': u'\u0627\u0644\u0628\u0648\u0633\u0646\u0629 \u0648\u0627\u0644\u0647\u0631\u0633\u0643', 'BB': u'\u0628\u0631\u0628\u0627\u062f\u0648\u0633', 'BN': u'\u0628\u0631\u0648\u0646\u0627\u064a', 'BO': u'\u0628\u0648\u0644\u064a\u0641\u064a\u0627', 'BH': u'\u0627\u0644\u0628\u062d\u0631\u064a\u0646', 'BI': u'\u0628\u0648\u0631\u0648\u0646\u062f\u064a', 'BJ': u'\u0628\u0646\u064a\u0646', 'BT': u'\u0628\u0648\u062a\u0627\u0646', 'JM': u'\u062c\u0627\u0645\u0627\u064a\u0643\u0627', 'BW': u'\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627', 'WS': u'\u0633\u0627\u0645\u0648\u0627', 'BR': u'\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644', 'BS': u'\u0627\u0644\u0628\u0647\u0627\u0645\u0627', 'BY': u'\u0631\u0648\u0633\u064a\u0627 \u0627\u0644\u0628\u064a\u0636\u0627\u0621', 'BZ': u'\u0628\u0644\u064a\u0632', 'RU': u'\u0631\u0648\u0633\u064a\u0627', 'RW': u'\u0631\u0648\u0627\u0646\u062f\u0627', 'TM': u'\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646', 'TJ': u'\u062a\u0627\u062c\u064a\u0643\u0633\u062a\u0627\u0646', 'RO': u'\u0631\u0648\u0645\u0627\u0646\u064a\u0627', 'GW': u'\u063a\u064a\u0646\u064a\u0627 \u0628\u064a\u0633\u0627\u0648', 'GT': u'\u063a\u0648\u0627\u062a\u064a\u0645\u0627\u0644\u0627', 'GR': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646', 'GQ': u'\u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u0627\u0633\u062a\u0648\u0627\u0626\u064a\u0629', 'JP': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646', 'GY': u'\u063a\u0648\u0627\u064a\u0627\u0646\u0627', 'GE': u'\u062c\u0648\u0631\u062c\u064a\u0627', 'GD': u'\u063a\u0631\u064a\u0646\u0627\u062f\u0627', 'GB': u'\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'GA': u'\u063a\u0627\u0628\u0648\u0646', 'SV': u'\u0627\u0644\u0633\u0644\u0641\u0627\u062f\u0648\u0631', 'GN': u'\u063a\u064a\u0646\u064a\u0627', 'GM': u'\u063a\u0627\u0645\u0628\u064a\u0627', 'GH': u'\u063a\u0627\u0646\u0627', 'OM': u'\u0639\u0645\u0627\u0646', 'TN': u'\u062a\u0648\u0646\u0633', 'JO': u'\u0627\u0644\u0627\u0631\u062f\u0646', 'HR': u'\u0643\u0631\u0648\u0627\u062a\u064a\u0627', 'HT': u'\u0647\u0627\u064a\u062a\u064a', 'HU': u'\u0647\u0646\u063a\u0627\u0631\u064a\u0627', 'HN': u'\u0647\u0646\u062f\u0648\u0631\u0627\u0633', 'VE': u'\u0641\u0646\u0632\u0648\u064a\u0644\u0627', 'PW': u'\u0628\u0627\u0644\u0627\u0648', 'PT': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644', 'PY': u'\u0628\u0627\u0631\u0627\u063a\u0648\u0627\u064a', 'IQ': u'\u0627\u0644\u0639\u0631\u0627\u0642', 'PA': u'\u0628\u0646\u0645\u0627', 'PG': u'\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'PE': u'\u0628\u064a\u0631\u0648', 'PK': u'\u0627\u0644\u0628\u0627\u0643\u0633\u062a\u0627\u0646', 'PH': u'\u0627\u0644\u0641\u064a\u0644\u0628\u064a\u0646', 'PL': u'\u0628\u0648\u0644\u0646\u062f\u0627', 'ZM': u'\u0632\u0627\u0645\u0628\u064a\u0627', 'EH': u'\u0627\u0644\u0635\u062d\u0631\u0627\u0621 \u0627\u0644\u063a\u0631\u0628\u064a\u0629', 'EE': u'\u0627\u0633\u062a\u0648\u0646\u064a\u0627', 'EG': u'\u0645\u0635\u0631', 'ZA': u'\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u064a\u0642\u064a\u0627', 'EC': u'\u0627\u0643\u0648\u0627\u062f\u0648\u0631', 'VN': u'\u0641\u064a\u062a\u0646\u0627\u0645', 'SB': u'\u062c\u0632\u0631 \u0633\u0644\u064a\u0645\u0627\u0646', 'ET': u'\u0627\u062b\u064a\u0648\u0628\u064a\u0627', 'SO': u'\u0627\u0644\u0635\u0648\u0645\u0627\u0644', 'ZW': u'\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a', 'ES': u'\u0627\u0633\u0628\u0627\u0646\u064a\u0627', 'ER': u'\u0627\u0631\u062a\u064a\u0631\u064a\u0627', 'MD': u'\u0645\u0648\u0644\u062f\u0648\u0641\u0627', 'MG': u'\u0645\u062f\u063a\u0634\u0642\u0631', 'MA': u'\u0627\u0644\u0645\u063a\u0631\u0628', 'MC': u'\u0645\u0648\u0646\u0627\u0643\u0648', 'UZ': u'\u0627\u0632\u0628\u0643\u0633\u062a\u0627\u0646', 'MM': u'\u0645\u064a\u0627\u0646\u0645\u0627\u0631', 'ML': u'\u0645\u0627\u0644\u064a', 'MN': u'\u0645\u0646\u063a\u0648\u0644\u064a\u0627', 'MH': u'\u062c\u0632\u0631 \u0627\u0644\u0645\u0627\u0631\u0634\u0627\u0644', 'MK': u'\u0645\u0642\u062f\u0648\u0646\u064a\u0627', 'MU': u'\u0645\u0648\u0631\u064a\u0634\u0648\u0633', 'MT': u'\u0645\u0627\u0644\u0637\u0629', 'MW': u'\u0645\u0644\u0627\u0648\u064a', 'MV': u'\u0645\u0627\u0644\u062f\u064a\u0641', 'MR': u'\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627', 'UG': u'\u0627\u0648\u063a\u0646\u062f\u0627', 'MY': u'\u0645\u0627\u0644\u064a\u0632\u064a\u0627', 'MX': u'\u0627\u0644\u0645\u0643\u0633\u064a\u0643', 'IL': u'\u0627\u0633\u0631\u0627\u0626\u064a\u0644', 'FR': u'\u0641\u0631\u0646\u0633\u0627', 'FI': u'\u0641\u0646\u0644\u0646\u062f\u0627', 'FJ': u'\u0641\u064a\u062c\u064a', 'FM': u'\u0645\u064a\u0643\u0631\u0648\u0646\u064a\u0632\u064a\u0627', 'NI': u'\u0646\u064a\u0643\u0627\u0631\u0627\u063a\u0648\u0627', 'NL': u'\u0647\u0648\u0644\u0646\u062f\u0627', 'NO': u'\u0627\u0644\u0646\u0631\u0648\u064a\u062c', 'NA': u'\u0646\u0627\u0645\u064a\u0628\u064a\u0627', 'VU': u'\u0641\u0627\u0646\u0648\u0622\u062a\u0648', 'NE': u'\u0627\u0644\u0646\u064a\u062c\u0631', 'NG': u'\u0646\u064a\u062c\u064a\u0631\u064a\u0627', 'NZ': u'\u0632\u064a\u0644\u0646\u062f\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'NP': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644', 'NR': u'\u0646\u0627\u0648\u0631\u0648', 'CH': u'\u0633\u0648\u064a\u0633\u0631\u0627', 'CO': u'\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627', 'CN': u'\u0627\u0644\u0635\u064a\u0646', 'CM': u'\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0648\u0646', 'CL': u'\u062a\u0634\u064a\u0644\u064a', 'CA': u'\u0643\u0646\u062f\u0627', 'CG': u'\u0627\u0644\u0643\u0648\u0646\u063a\u0648', 'CF': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0641\u0631\u064a\u0642\u064a\u0627 \u0627\u0644\u0648\u0633\u0637\u0649', 'CZ': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062a\u0634\u064a\u0643', 'CY': u'\u0642\u0628\u0631\u0635', 'CR': u'\u0643\u0648\u0633\u062a\u0627\u0631\u064a\u0643\u0627', 'CV': u'\u0627\u0644\u0631\u0623\u0633 \u0627\u0644\u0627\u062e\u0636\u0631', 'CU': u'\u0643\u0648\u0628\u0627', 'SZ': u'\u0633\u0648\u0627\u0632\u064a\u0644\u0627\u0646\u062f', 'SY': u'\u0633\u0648\u0631\u064a\u0629', 'KG': u'\u0642\u064a\u0631\u063a\u064a\u0632\u0633\u062a\u0627\u0646', 'KE': u'\u0643\u064a\u0646\u064a\u0627', 'SR': u'\u0633\u0648\u0631\u064a\u0646\u0627\u0645', 'KI': u'\u0643\u064a\u0631\u064a\u0628\u0627\u062a\u064a', 'KH': u'\u0643\u0645\u0628\u0648\u062f\u064a\u0627', 'KN': u'\u0633\u0627\u0646\u062a \u0643\u064a\u062a\u0633 \u0648\u0646\u064a\u0641\u064a\u0633', 'KM': u'\u062c\u0632\u0631 \u0627\u0644\u0642\u0645\u0631', 'ST': u'\u0633\u0627\u0646 \u062a\u0648\u0645\u064a \u0648\u0628\u0631\u064a\u0646\u0633\u064a\u0628\u064a', 'SK': u'\u0633\u0644\u0648\u0641\u0627\u0643\u064a\u0627', 'KR': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u062c\u0646\u0648\u0628\u064a\u0629', 'SI': u'\u0633\u0644\u0648\u0641\u064a\u0646\u064a\u0627', 'KP': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629', 'KW': u'\u0627\u0644\u0643\u0648\u064a\u062a', 'SN': u'\u0627\u0644\u0633\u0646\u063a\u0627\u0644', 'SM': u'\u0633\u0627\u0646 \u0645\u0627\u0631\u064a\u0646\u0648', 'SL': u'\u0633\u064a\u0631\u0627\u0644\u064a\u0648\u0646', 'SC': u'\u0633\u064a\u0634\u0644', 'KZ': u'\u0643\u0627\u0632\u0627\u062e\u0633\u062a\u0627\u0646', 'SA': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629', 'SG': u'\u0633\u0646\u063a\u0627\u0641\u0648\u0631\u0629', 'SE': u'\u0627\u0644\u0633\u0648\u064a\u062f', 'SD': u'\u0627\u0644\u0633\u0648\u062f\u0627\u0646', 'DO': u'\u0627\u0644\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u064a\u0629', 'DM': u'\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u0627', 'DJ': u'\u062c\u064a\u0628\u0648\u062a\u064a', 'DK': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0631\u0643', 'DE': u'\u0627\u0644\u0645\u0627\u0646\u064a\u0627', 'YE': u'\u0627\u0644\u064a\u0645\u0646', 'DZ': u'\u0627\u0644\u062c\u0632\u0627\u0626\u0631', 'US': u'\u0627\u0644\u0627\u0648\u0644\u0627\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u062d\u062f\u0629 \u0627\u0644\u0627\u0645\u0631\u064a\u0643\u064a\u0629', 'UY': u'\u0627\u0631\u0648\u063a\u0648\u0627\u064a', 'LB': u'\u0644\u0628\u0646\u0627\u0646', 'LC': u'\u0633\u0627\u0646\u062a \u0644\u0648\u0633\u064a\u0627', 'LA': u'\u0644\u0627\u0648\u0633', 'TV': u'\u062a\u0648\u0641\u0627\u0644\u0648', 'TW': u'\u062a\u0627\u064a\u0648\u0627\u0646', 'TT': u'\u062a\u0631\u064a\u0646\u064a\u062f\u0627\u062f \u0648\u062a\u0648\u0628\u0627\u063a\u0648', 'TR': u'\u062a\u0631\u0643\u064a\u0627', 'LK': u'\u0633\u0631\u064a \u0644\u0627\u0646\u0643\u0627', 'LI': u'\u0644\u064a\u062e\u062a\u0646\u0634\u062a\u0627\u064a\u0646', 'LV': u'\u0644\u0627\u062a\u0641\u064a\u0627', 'TO': u'\u062a\u0648\u0646\u063a\u0627', 'LT': u'\u0644\u064a\u062a\u0648\u0627\u0646\u064a\u0627', 'LU': u'\u0644\u0648\u0643\u0633\u0648\u0645\u0628\u0631\u063a', 'LR': u'\u0644\u064a\u0628\u064a\u0631\u064a\u0627', 'LS': u'\u0644\u064a\u0633\u0648\u062a\u0648', 'TH': u'\u062a\u0627\u064a\u0644\u0646\u062f', 'TG': u'\u062a\u0648\u063a\u0648', 'TD': u'\u062a\u0634\u0627\u062f', 'LY': u'\u0644\u064a\u0628\u064a\u0627', 'VA': u'\u0627\u0644\u0641\u0627\u062a\u064a\u0643\u0627\u0646', 'VC': u'\u0633\u0627\u0646\u062a \u0641\u0646\u0633\u0646\u062a \u0648\u062c\u0632\u0631 \u063a\u0631\u064a\u0646\u0627\u062f\u064a\u0646', 'AE': u'\u0627\u0644\u0627\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'AD': u'\u0627\u0646\u062f\u0648\u0631\u0627', 'AG': u'\u0627\u0646\u062a\u064a\u063a\u0648\u0627 \u0648\u0628\u0631\u0628\u0648\u062f\u0627', 'AF': u'\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646', 'AI': u'\u0627\u0644\u0628\u0627\u0646\u064a\u0627', 'IS': u'\u0627\u064a\u0633\u0644\u0646\u062f\u0627', 'IR': u'\u0627\u064a\u0631\u0627\u0646', 'AM': u'\u0627\u0631\u0645\u064a\u0646\u064a\u0627', 'IT': u'\u0627\u064a\u0637\u0627\u0644\u064a\u0627', 'AO': u'\u0627\u0646\u063a\u0648\u0644\u0627', 'AR': u'\u0627\u0644\u0627\u0631\u062c\u0646\u062a\u064a\u0646', 'AU': u'\u0627\u0633\u062a\u0631\u0627\u0644\u064a\u0627', 'AT': u'\u0627\u0644\u0646\u0645\u0633\u0627', 'IN': u'\u0627\u0644\u0647\u0646\u062f', 'TZ': u'\u062a\u0627\u0646\u0632\u0627\u0646\u064a\u0627', 'AZ': u'\u0622\u0630\u0631\u0628\u064a\u062c\u0627\u0646', 'IE': u'\u0627\u064a\u0631\u0644\u0646\u062f\u0627', 'ID': u'\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0627', 'UA': u'\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0627', 'QA': u'\u0642\u0637\u0631', 'MZ': u'\u0645\u0648\u0632\u0645\u0628\u064a\u0642'} months=[u'\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a', u'\u0634\u0628\u0627\u0637', u'\u0622\u0630\u0627\u0631', u'\u0646\u064a\u0633\u0627\u0646', u'\u0646\u0648\u0627\u0631', u'\u062d\u0632\u064a\u0631\u0627\u0646', u'\u062a\u0645\u0648\u0632', u'\u0622\u0628', u'\u0623\u064a\u0644\u0648\u0644', u'\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644', u'\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a', u'\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644'] abbrMonths=[u'\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a', u'\u0634\u0628\u0627\u0637', u'\u0622\u0630\u0627\u0631', u'\u0646\u064a\u0633\u0627\u0646', u'\u0646\u0648\u0627\u0631', u'\u062d\u0632\u064a\u0631\u0627\u0646', u'\u062a\u0645\u0648\u0632', u'\u0622\u0628', u'\u0623\u064a\u0644\u0648\u0644', u'\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644', u'\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a', u'\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644'] days=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] abbrDays=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] dateFormats={'medium': '%d/%m/%Y', 'full': '%%(dayname)s, %d %%(monthname)s, %Y', 'long': '%d %%(monthname)s, %Y', 'short': '%d/%m/%Y'} numericSymbols={'group': u'\u066c', 'nativeZeroDigit': u'\u0660', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': u'\u066b', 'percentSign': u'\u066a', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>p''turbogears/i18n/data/ar_LB.pyc; :Mc @s hdd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<ddF=F=turbogears/i18n/data/ar_LY.py# Formatting configuration for locale ar_LY languages={'el': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646\u064a\u0629', 'gu': u'\u0627\u0644\u063a\u0648\u062c\u0627\u0631\u0627\u062a\u064a\u0629', 'en': u'\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629', 'zh': u'\u0627\u0644\u0635\u064a\u0646\u064a\u0629', 'sw': u'\u0627\u0644\u0633\u0648\u0627\u062d\u0644\u064a\u0629', 'ca': u'\u0627\u0644\u0643\u0627\u062a\u0627\u0644\u0648\u064a\u0646\u064a\u0629', 'it': u'\u0627\u0644\u0627\u064a\u0637\u0627\u0644\u064a\u0629', 'ar': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629', 'id': u'\u0627\u0644\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0629', 'es': u'\u0627\u0644\u0627\u0633\u0628\u0627\u0646\u064a\u0629', 'ru': u'\u0627\u0644\u0631\u0648\u0633\u064a\u0629', 'nl': u'\u0627\u0644\u0647\u0648\u0644\u0646\u062f\u064a\u0629', 'pt': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644\u064a\u0629', 'tr': u'\u0627\u0644\u062a\u0631\u0643\u064a\u0629', 'ne': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629', 'lt': u'\u0627\u0644\u0644\u062a\u0648\u0627\u0646\u064a\u0629', 'pa': u'\u0627\u0644\u0628\u0646\u062c\u0627\u0628\u064a\u0629', 'th': u'\u0627\u0644\u062a\u0627\u064a\u0644\u0627\u0646\u062f\u064a\u0629', 'vi': u'\u0627\u0644\u0641\u064a\u062a\u0646\u0627\u0645\u064a\u0629', 'ro': u'\u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064a\u0629', 'be': u'\u0627\u0644\u0628\u064a\u0644\u0648\u0631\u0648\u0633\u064a\u0629', 'fr': u'\u0627\u0644\u0641\u0631\u0646\u0633\u064a\u0629', 'bg': u'\u0627\u0644\u0628\u0644\u063a\u0627\u0631\u064a\u0629', 'uk': u'\u0627\u0644\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0629', 'hr': u'\u0627\u0644\u0643\u0631\u0648\u0627\u062a\u064a\u0629', 'bn': u'\u0627\u0644\u0628\u0646\u063a\u0627\u0644\u064a\u0629', 'bo': u'\u0627\u0644\u062a\u0628\u062a\u064a\u0629', 'da': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a\u0629', 'fa': u'\u0627\u0644\u0641\u0627\u0631\u0633\u064a\u0629', 'hi': u'\u0627\u0644\u0647\u0646\u062f\u064a\u0629', 'dz': u'\u0627\u0644\u0632\u0648\u0646\u062e\u0627\u064a\u0629', 'dv': u'\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629', 'fi': u'\u0627\u0644\u0641\u0646\u0644\u0646\u062f\u064a\u0629', 'ja': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a\u0629', 'he': u'\u0627\u0644\u0639\u0628\u0631\u064a\u0629', 'tl': u'\u0627\u0644\u062a\u0627\u063a\u0627\u0644\u0648\u063a\u064a\u0629', 'sr': u'\u0627\u0644\u0635\u0631\u0628\u064a\u0629', 'sq': u'\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629', 'mn': u'\u0627\u0644\u0645\u0646\u063a\u0648\u0644\u064a\u0629', 'ko': u'\u0627\u0644\u0643\u0648\u0631\u064a\u0629', 'km': u'\u0627\u0644\u062e\u0645\u064a\u0631\u064a\u0629', 'ur': u'\u0627\u0644\u0627\u0631\u062f\u064a\u0629', 'de': u'\u0627\u0644\u0627\u0644\u0645\u0627\u0646\u064a\u0629', 'ms': u'\u0644\u063a\u0629 \u0627\u0644\u0645\u0644\u0627\u064a\u0648', 'ug': u'\u0627\u0644\u0627\u063a\u0648\u0631\u064a\u0629', 'my': u'\u0627\u0644\u0628\u0648\u0631\u0645\u064a\u0629'} countries={'BD': u'\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634', 'BE': u'\u0628\u0644\u062c\u064a\u0643\u0627', 'BF': u'\u0628\u0648\u0631\u0643\u064a\u0646\u0627 \u0641\u0627\u0633\u0648', 'BG': u'\u0628\u0644\u063a\u0627\u0631\u064a\u0627', 'BA': u'\u0627\u0644\u0628\u0648\u0633\u0646\u0629 \u0648\u0627\u0644\u0647\u0631\u0633\u0643', 'BB': u'\u0628\u0631\u0628\u0627\u062f\u0648\u0633', 'BN': u'\u0628\u0631\u0648\u0646\u0627\u064a', 'BO': u'\u0628\u0648\u0644\u064a\u0641\u064a\u0627', 'BH': u'\u0627\u0644\u0628\u062d\u0631\u064a\u0646', 'BI': u'\u0628\u0648\u0631\u0648\u0646\u062f\u064a', 'BJ': u'\u0628\u0646\u064a\u0646', 'BT': u'\u0628\u0648\u062a\u0627\u0646', 'JM': u'\u062c\u0627\u0645\u0627\u064a\u0643\u0627', 'BW': u'\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627', 'WS': u'\u0633\u0627\u0645\u0648\u0627', 'BR': u'\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644', 'BS': u'\u0627\u0644\u0628\u0647\u0627\u0645\u0627', 'BY': u'\u0631\u0648\u0633\u064a\u0627 \u0627\u0644\u0628\u064a\u0636\u0627\u0621', 'BZ': u'\u0628\u0644\u064a\u0632', 'RU': u'\u0631\u0648\u0633\u064a\u0627', 'RW': u'\u0631\u0648\u0627\u0646\u062f\u0627', 'TM': u'\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646', 'TJ': u'\u062a\u0627\u062c\u064a\u0643\u0633\u062a\u0627\u0646', 'RO': u'\u0631\u0648\u0645\u0627\u0646\u064a\u0627', 'GW': u'\u063a\u064a\u0646\u064a\u0627 \u0628\u064a\u0633\u0627\u0648', 'GT': u'\u063a\u0648\u0627\u062a\u064a\u0645\u0627\u0644\u0627', 'GR': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646', 'GQ': u'\u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u0627\u0633\u062a\u0648\u0627\u0626\u064a\u0629', 'JP': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646', 'GY': u'\u063a\u0648\u0627\u064a\u0627\u0646\u0627', 'GE': u'\u062c\u0648\u0631\u062c\u064a\u0627', 'GD': u'\u063a\u0631\u064a\u0646\u0627\u062f\u0627', 'GB': u'\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'GA': u'\u063a\u0627\u0628\u0648\u0646', 'SV': u'\u0627\u0644\u0633\u0644\u0641\u0627\u062f\u0648\u0631', 'GN': u'\u063a\u064a\u0646\u064a\u0627', 'GM': u'\u063a\u0627\u0645\u0628\u064a\u0627', 'GH': u'\u063a\u0627\u0646\u0627', 'OM': u'\u0639\u0645\u0627\u0646', 'TN': u'\u062a\u0648\u0646\u0633', 'JO': u'\u0627\u0644\u0627\u0631\u062f\u0646', 'HR': u'\u0643\u0631\u0648\u0627\u062a\u064a\u0627', 'HT': u'\u0647\u0627\u064a\u062a\u064a', 'HU': u'\u0647\u0646\u063a\u0627\u0631\u064a\u0627', 'HN': u'\u0647\u0646\u062f\u0648\u0631\u0627\u0633', 'VE': u'\u0641\u0646\u0632\u0648\u064a\u0644\u0627', 'PW': u'\u0628\u0627\u0644\u0627\u0648', 'PT': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644', 'PY': u'\u0628\u0627\u0631\u0627\u063a\u0648\u0627\u064a', 'IQ': u'\u0627\u0644\u0639\u0631\u0627\u0642', 'PA': u'\u0628\u0646\u0645\u0627', 'PG': u'\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'PE': u'\u0628\u064a\u0631\u0648', 'PK': u'\u0627\u0644\u0628\u0627\u0643\u0633\u062a\u0627\u0646', 'PH': u'\u0627\u0644\u0641\u064a\u0644\u0628\u064a\u0646', 'PL': u'\u0628\u0648\u0644\u0646\u062f\u0627', 'ZM': u'\u0632\u0627\u0645\u0628\u064a\u0627', 'EH': u'\u0627\u0644\u0635\u062d\u0631\u0627\u0621 \u0627\u0644\u063a\u0631\u0628\u064a\u0629', 'EE': u'\u0627\u0633\u062a\u0648\u0646\u064a\u0627', 'EG': u'\u0645\u0635\u0631', 'ZA': u'\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u064a\u0642\u064a\u0627', 'EC': u'\u0627\u0643\u0648\u0627\u062f\u0648\u0631', 'VN': u'\u0641\u064a\u062a\u0646\u0627\u0645', 'SB': u'\u062c\u0632\u0631 \u0633\u0644\u064a\u0645\u0627\u0646', 'ET': u'\u0627\u062b\u064a\u0648\u0628\u064a\u0627', 'SO': u'\u0627\u0644\u0635\u0648\u0645\u0627\u0644', 'ZW': u'\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a', 'ES': u'\u0627\u0633\u0628\u0627\u0646\u064a\u0627', 'ER': u'\u0627\u0631\u062a\u064a\u0631\u064a\u0627', 'MD': u'\u0645\u0648\u0644\u062f\u0648\u0641\u0627', 'MG': u'\u0645\u062f\u063a\u0634\u0642\u0631', 'MA': u'\u0627\u0644\u0645\u063a\u0631\u0628', 'MC': u'\u0645\u0648\u0646\u0627\u0643\u0648', 'UZ': u'\u0627\u0632\u0628\u0643\u0633\u062a\u0627\u0646', 'MM': u'\u0645\u064a\u0627\u0646\u0645\u0627\u0631', 'ML': u'\u0645\u0627\u0644\u064a', 'MN': u'\u0645\u0646\u063a\u0648\u0644\u064a\u0627', 'MH': u'\u062c\u0632\u0631 \u0627\u0644\u0645\u0627\u0631\u0634\u0627\u0644', 'MK': u'\u0645\u0642\u062f\u0648\u0646\u064a\u0627', 'MU': u'\u0645\u0648\u0631\u064a\u0634\u0648\u0633', 'MT': u'\u0645\u0627\u0644\u0637\u0629', 'MW': u'\u0645\u0644\u0627\u0648\u064a', 'MV': u'\u0645\u0627\u0644\u062f\u064a\u0641', 'MR': u'\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627', 'UG': u'\u0627\u0648\u063a\u0646\u062f\u0627', 'MY': u'\u0645\u0627\u0644\u064a\u0632\u064a\u0627', 'MX': u'\u0627\u0644\u0645\u0643\u0633\u064a\u0643', 'IL': u'\u0627\u0633\u0631\u0627\u0626\u064a\u0644', 'FR': u'\u0641\u0631\u0646\u0633\u0627', 'FI': u'\u0641\u0646\u0644\u0646\u062f\u0627', 'FJ': u'\u0641\u064a\u062c\u064a', 'FM': u'\u0645\u064a\u0643\u0631\u0648\u0646\u064a\u0632\u064a\u0627', 'NI': u'\u0646\u064a\u0643\u0627\u0631\u0627\u063a\u0648\u0627', 'NL': u'\u0647\u0648\u0644\u0646\u062f\u0627', 'NO': u'\u0627\u0644\u0646\u0631\u0648\u064a\u062c', 'NA': u'\u0646\u0627\u0645\u064a\u0628\u064a\u0627', 'VU': u'\u0641\u0627\u0646\u0648\u0622\u062a\u0648', 'NE': u'\u0627\u0644\u0646\u064a\u062c\u0631', 'NG': u'\u0646\u064a\u062c\u064a\u0631\u064a\u0627', 'NZ': u'\u0632\u064a\u0644\u0646\u062f\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'NP': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644', 'NR': u'\u0646\u0627\u0648\u0631\u0648', 'CH': u'\u0633\u0648\u064a\u0633\u0631\u0627', 'CO': u'\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627', 'CN': u'\u0627\u0644\u0635\u064a\u0646', 'CM': u'\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0648\u0646', 'CL': u'\u062a\u0634\u064a\u0644\u064a', 'CA': u'\u0643\u0646\u062f\u0627', 'CG': u'\u0627\u0644\u0643\u0648\u0646\u063a\u0648', 'CF': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0641\u0631\u064a\u0642\u064a\u0627 \u0627\u0644\u0648\u0633\u0637\u0649', 'CZ': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062a\u0634\u064a\u0643', 'CY': u'\u0642\u0628\u0631\u0635', 'CR': u'\u0643\u0648\u0633\u062a\u0627\u0631\u064a\u0643\u0627', 'CV': u'\u0627\u0644\u0631\u0623\u0633 \u0627\u0644\u0627\u062e\u0636\u0631', 'CU': u'\u0643\u0648\u0628\u0627', 'SZ': u'\u0633\u0648\u0627\u0632\u064a\u0644\u0627\u0646\u062f', 'SY': u'\u0633\u0648\u0631\u064a\u0629', 'KG': u'\u0642\u064a\u0631\u063a\u064a\u0632\u0633\u062a\u0627\u0646', 'KE': u'\u0643\u064a\u0646\u064a\u0627', 'SR': u'\u0633\u0648\u0631\u064a\u0646\u0627\u0645', 'KI': u'\u0643\u064a\u0631\u064a\u0628\u0627\u062a\u064a', 'KH': u'\u0643\u0645\u0628\u0648\u062f\u064a\u0627', 'KN': u'\u0633\u0627\u0646\u062a \u0643\u064a\u062a\u0633 \u0648\u0646\u064a\u0641\u064a\u0633', 'KM': u'\u062c\u0632\u0631 \u0627\u0644\u0642\u0645\u0631', 'ST': u'\u0633\u0627\u0646 \u062a\u0648\u0645\u064a \u0648\u0628\u0631\u064a\u0646\u0633\u064a\u0628\u064a', 'SK': u'\u0633\u0644\u0648\u0641\u0627\u0643\u064a\u0627', 'KR': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u062c\u0646\u0648\u0628\u064a\u0629', 'SI': u'\u0633\u0644\u0648\u0641\u064a\u0646\u064a\u0627', 'KP': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629', 'KW': u'\u0627\u0644\u0643\u0648\u064a\u062a', 'SN': u'\u0627\u0644\u0633\u0646\u063a\u0627\u0644', 'SM': u'\u0633\u0627\u0646 \u0645\u0627\u0631\u064a\u0646\u0648', 'SL': u'\u0633\u064a\u0631\u0627\u0644\u064a\u0648\u0646', 'SC': u'\u0633\u064a\u0634\u0644', 'KZ': u'\u0643\u0627\u0632\u0627\u062e\u0633\u062a\u0627\u0646', 'SA': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629', 'SG': u'\u0633\u0646\u063a\u0627\u0641\u0648\u0631\u0629', 'SE': u'\u0627\u0644\u0633\u0648\u064a\u062f', 'SD': u'\u0627\u0644\u0633\u0648\u062f\u0627\u0646', 'DO': u'\u0627\u0644\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u064a\u0629', 'DM': u'\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u0627', 'DJ': u'\u062c\u064a\u0628\u0648\u062a\u064a', 'DK': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0631\u0643', 'DE': u'\u0627\u0644\u0645\u0627\u0646\u064a\u0627', 'YE': u'\u0627\u0644\u064a\u0645\u0646', 'DZ': u'\u0627\u0644\u062c\u0632\u0627\u0626\u0631', 'US': u'\u0627\u0644\u0627\u0648\u0644\u0627\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u062d\u062f\u0629 \u0627\u0644\u0627\u0645\u0631\u064a\u0643\u064a\u0629', 'UY': u'\u0627\u0631\u0648\u063a\u0648\u0627\u064a', 'LB': u'\u0644\u0628\u0646\u0627\u0646', 'LC': u'\u0633\u0627\u0646\u062a \u0644\u0648\u0633\u064a\u0627', 'LA': u'\u0644\u0627\u0648\u0633', 'TV': u'\u062a\u0648\u0641\u0627\u0644\u0648', 'TW': u'\u062a\u0627\u064a\u0648\u0627\u0646', 'TT': u'\u062a\u0631\u064a\u0646\u064a\u062f\u0627\u062f \u0648\u062a\u0648\u0628\u0627\u063a\u0648', 'TR': u'\u062a\u0631\u0643\u064a\u0627', 'LK': u'\u0633\u0631\u064a \u0644\u0627\u0646\u0643\u0627', 'LI': u'\u0644\u064a\u062e\u062a\u0646\u0634\u062a\u0627\u064a\u0646', 'LV': u'\u0644\u0627\u062a\u0641\u064a\u0627', 'TO': u'\u062a\u0648\u0646\u063a\u0627', 'LT': u'\u0644\u064a\u062a\u0648\u0627\u0646\u064a\u0627', 'LU': u'\u0644\u0648\u0643\u0633\u0648\u0645\u0628\u0631\u063a', 'LR': u'\u0644\u064a\u0628\u064a\u0631\u064a\u0627', 'LS': u'\u0644\u064a\u0633\u0648\u062a\u0648', 'TH': u'\u062a\u0627\u064a\u0644\u0646\u062f', 'TG': u'\u062a\u0648\u063a\u0648', 'TD': u'\u062a\u0634\u0627\u062f', 'LY': u'\u0644\u064a\u0628\u064a\u0627', 'VA': u'\u0627\u0644\u0641\u0627\u062a\u064a\u0643\u0627\u0646', 'VC': u'\u0633\u0627\u0646\u062a \u0641\u0646\u0633\u0646\u062a \u0648\u062c\u0632\u0631 \u063a\u0631\u064a\u0646\u0627\u062f\u064a\u0646', 'AE': u'\u0627\u0644\u0627\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'AD': u'\u0627\u0646\u062f\u0648\u0631\u0627', 'AG': u'\u0627\u0646\u062a\u064a\u063a\u0648\u0627 \u0648\u0628\u0631\u0628\u0648\u062f\u0627', 'AF': u'\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646', 'AI': u'\u0627\u0644\u0628\u0627\u0646\u064a\u0627', 'IS': u'\u0627\u064a\u0633\u0644\u0646\u062f\u0627', 'IR': u'\u0627\u064a\u0631\u0627\u0646', 'AM': u'\u0627\u0631\u0645\u064a\u0646\u064a\u0627', 'IT': u'\u0627\u064a\u0637\u0627\u0644\u064a\u0627', 'AO': u'\u0627\u0646\u063a\u0648\u0644\u0627', 'AR': u'\u0627\u0644\u0627\u0631\u062c\u0646\u062a\u064a\u0646', 'AU': u'\u0627\u0633\u062a\u0631\u0627\u0644\u064a\u0627', 'AT': u'\u0627\u0644\u0646\u0645\u0633\u0627', 'IN': u'\u0627\u0644\u0647\u0646\u062f', 'TZ': u'\u062a\u0627\u0646\u0632\u0627\u0646\u064a\u0627', 'AZ': u'\u0622\u0630\u0631\u0628\u064a\u062c\u0627\u0646', 'IE': u'\u0627\u064a\u0631\u0644\u0646\u062f\u0627', 'ID': u'\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0627', 'UA': u'\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0627', 'QA': u'\u0642\u0637\u0631', 'MZ': u'\u0645\u0648\u0632\u0645\u0628\u064a\u0642'} months=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] abbrMonths=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] days=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] abbrDays=[u'\u0646', u'\u062b', u'\u0631', u'\u062e', u'\u062c', u'\u0633', u'\u062d'] dateFormats={'medium': '%d/%m/%Y', 'full': '%%(dayname)s, %d %%(monthname)s, %Y', 'long': '%d %%(monthname)s, %Y', 'short': '%d/%m/%Y'} numericSymbols={'group': u'\u066c', 'nativeZeroDigit': u'\u0660', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': u'\u066b', 'percentSign': u'\u066a', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>a''turbogears/i18n/data/ar_LY.pyc; :Mc @s hdd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<ddE@=@=turbogears/i18n/data/ar_MA.py# Formatting configuration for locale ar_MA languages={'el': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646\u064a\u0629', 'gu': u'\u0627\u0644\u063a\u0648\u062c\u0627\u0631\u0627\u062a\u064a\u0629', 'en': u'\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629', 'zh': u'\u0627\u0644\u0635\u064a\u0646\u064a\u0629', 'sw': u'\u0627\u0644\u0633\u0648\u0627\u062d\u0644\u064a\u0629', 'ca': u'\u0627\u0644\u0643\u0627\u062a\u0627\u0644\u0648\u064a\u0646\u064a\u0629', 'it': u'\u0627\u0644\u0627\u064a\u0637\u0627\u0644\u064a\u0629', 'ar': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629', 'id': u'\u0627\u0644\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0629', 'es': u'\u0627\u0644\u0627\u0633\u0628\u0627\u0646\u064a\u0629', 'ru': u'\u0627\u0644\u0631\u0648\u0633\u064a\u0629', 'nl': u'\u0627\u0644\u0647\u0648\u0644\u0646\u062f\u064a\u0629', 'pt': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644\u064a\u0629', 'tr': u'\u0627\u0644\u062a\u0631\u0643\u064a\u0629', 'ne': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629', 'lt': u'\u0627\u0644\u0644\u062a\u0648\u0627\u0646\u064a\u0629', 'pa': u'\u0627\u0644\u0628\u0646\u062c\u0627\u0628\u064a\u0629', 'th': u'\u0627\u0644\u062a\u0627\u064a\u0644\u0627\u0646\u062f\u064a\u0629', 'vi': u'\u0627\u0644\u0641\u064a\u062a\u0646\u0627\u0645\u064a\u0629', 'ro': u'\u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064a\u0629', 'be': u'\u0627\u0644\u0628\u064a\u0644\u0648\u0631\u0648\u0633\u064a\u0629', 'fr': u'\u0627\u0644\u0641\u0631\u0646\u0633\u064a\u0629', 'bg': u'\u0627\u0644\u0628\u0644\u063a\u0627\u0631\u064a\u0629', 'uk': u'\u0627\u0644\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0629', 'hr': u'\u0627\u0644\u0643\u0631\u0648\u0627\u062a\u064a\u0629', 'bn': u'\u0627\u0644\u0628\u0646\u063a\u0627\u0644\u064a\u0629', 'bo': u'\u0627\u0644\u062a\u0628\u062a\u064a\u0629', 'da': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a\u0629', 'fa': u'\u0627\u0644\u0641\u0627\u0631\u0633\u064a\u0629', 'hi': u'\u0627\u0644\u0647\u0646\u062f\u064a\u0629', 'dz': u'\u0627\u0644\u0632\u0648\u0646\u062e\u0627\u064a\u0629', 'dv': u'\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629', 'fi': u'\u0627\u0644\u0641\u0646\u0644\u0646\u062f\u064a\u0629', 'ja': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a\u0629', 'he': u'\u0627\u0644\u0639\u0628\u0631\u064a\u0629', 'tl': u'\u0627\u0644\u062a\u0627\u063a\u0627\u0644\u0648\u063a\u064a\u0629', 'sr': u'\u0627\u0644\u0635\u0631\u0628\u064a\u0629', 'sq': u'\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629', 'mn': u'\u0627\u0644\u0645\u0646\u063a\u0648\u0644\u064a\u0629', 'ko': u'\u0627\u0644\u0643\u0648\u0631\u064a\u0629', 'km': u'\u0627\u0644\u062e\u0645\u064a\u0631\u064a\u0629', 'ur': u'\u0627\u0644\u0627\u0631\u062f\u064a\u0629', 'de': u'\u0627\u0644\u0627\u0644\u0645\u0627\u0646\u064a\u0629', 'ms': u'\u0644\u063a\u0629 \u0627\u0644\u0645\u0644\u0627\u064a\u0648', 'ug': u'\u0627\u0644\u0627\u063a\u0648\u0631\u064a\u0629', 'my': u'\u0627\u0644\u0628\u0648\u0631\u0645\u064a\u0629'} countries={'BD': u'\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634', 'BE': u'\u0628\u0644\u062c\u064a\u0643\u0627', 'BF': u'\u0628\u0648\u0631\u0643\u064a\u0646\u0627 \u0641\u0627\u0633\u0648', 'BG': u'\u0628\u0644\u063a\u0627\u0631\u064a\u0627', 'BA': u'\u0627\u0644\u0628\u0648\u0633\u0646\u0629 \u0648\u0627\u0644\u0647\u0631\u0633\u0643', 'BB': u'\u0628\u0631\u0628\u0627\u062f\u0648\u0633', 'BN': u'\u0628\u0631\u0648\u0646\u0627\u064a', 'BO': u'\u0628\u0648\u0644\u064a\u0641\u064a\u0627', 'BH': u'\u0627\u0644\u0628\u062d\u0631\u064a\u0646', 'BI': u'\u0628\u0648\u0631\u0648\u0646\u062f\u064a', 'BJ': u'\u0628\u0646\u064a\u0646', 'BT': u'\u0628\u0648\u062a\u0627\u0646', 'JM': u'\u062c\u0627\u0645\u0627\u064a\u0643\u0627', 'BW': u'\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627', 'WS': u'\u0633\u0627\u0645\u0648\u0627', 'BR': u'\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644', 'BS': u'\u0627\u0644\u0628\u0647\u0627\u0645\u0627', 'BY': u'\u0631\u0648\u0633\u064a\u0627 \u0627\u0644\u0628\u064a\u0636\u0627\u0621', 'BZ': u'\u0628\u0644\u064a\u0632', 'RU': u'\u0631\u0648\u0633\u064a\u0627', 'RW': u'\u0631\u0648\u0627\u0646\u062f\u0627', 'TM': u'\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646', 'TJ': u'\u062a\u0627\u062c\u064a\u0643\u0633\u062a\u0627\u0646', 'RO': u'\u0631\u0648\u0645\u0627\u0646\u064a\u0627', 'GW': u'\u063a\u064a\u0646\u064a\u0627 \u0628\u064a\u0633\u0627\u0648', 'GT': u'\u063a\u0648\u0627\u062a\u064a\u0645\u0627\u0644\u0627', 'GR': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646', 'GQ': u'\u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u0627\u0633\u062a\u0648\u0627\u0626\u064a\u0629', 'JP': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646', 'GY': u'\u063a\u0648\u0627\u064a\u0627\u0646\u0627', 'GE': u'\u062c\u0648\u0631\u062c\u064a\u0627', 'GD': u'\u063a\u0631\u064a\u0646\u0627\u062f\u0627', 'GB': u'\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'GA': u'\u063a\u0627\u0628\u0648\u0646', 'SV': u'\u0627\u0644\u0633\u0644\u0641\u0627\u062f\u0648\u0631', 'GN': u'\u063a\u064a\u0646\u064a\u0627', 'GM': u'\u063a\u0627\u0645\u0628\u064a\u0627', 'GH': u'\u063a\u0627\u0646\u0627', 'OM': u'\u0639\u0645\u0627\u0646', 'TN': u'\u062a\u0648\u0646\u0633', 'JO': u'\u0627\u0644\u0627\u0631\u062f\u0646', 'HR': u'\u0643\u0631\u0648\u0627\u062a\u064a\u0627', 'HT': u'\u0647\u0627\u064a\u062a\u064a', 'HU': u'\u0647\u0646\u063a\u0627\u0631\u064a\u0627', 'HN': u'\u0647\u0646\u062f\u0648\u0631\u0627\u0633', 'VE': u'\u0641\u0646\u0632\u0648\u064a\u0644\u0627', 'PW': u'\u0628\u0627\u0644\u0627\u0648', 'PT': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644', 'PY': u'\u0628\u0627\u0631\u0627\u063a\u0648\u0627\u064a', 'IQ': u'\u0627\u0644\u0639\u0631\u0627\u0642', 'PA': u'\u0628\u0646\u0645\u0627', 'PG': u'\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'PE': u'\u0628\u064a\u0631\u0648', 'PK': u'\u0627\u0644\u0628\u0627\u0643\u0633\u062a\u0627\u0646', 'PH': u'\u0627\u0644\u0641\u064a\u0644\u0628\u064a\u0646', 'PL': u'\u0628\u0648\u0644\u0646\u062f\u0627', 'ZM': u'\u0632\u0627\u0645\u0628\u064a\u0627', 'EH': u'\u0627\u0644\u0635\u062d\u0631\u0627\u0621 \u0627\u0644\u063a\u0631\u0628\u064a\u0629', 'EE': u'\u0627\u0633\u062a\u0648\u0646\u064a\u0627', 'EG': u'\u0645\u0635\u0631', 'ZA': u'\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u064a\u0642\u064a\u0627', 'EC': u'\u0627\u0643\u0648\u0627\u062f\u0648\u0631', 'VN': u'\u0641\u064a\u062a\u0646\u0627\u0645', 'SB': u'\u062c\u0632\u0631 \u0633\u0644\u064a\u0645\u0627\u0646', 'ET': u'\u0627\u062b\u064a\u0648\u0628\u064a\u0627', 'SO': u'\u0627\u0644\u0635\u0648\u0645\u0627\u0644', 'ZW': u'\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a', 'ES': u'\u0627\u0633\u0628\u0627\u0646\u064a\u0627', 'ER': u'\u0627\u0631\u062a\u064a\u0631\u064a\u0627', 'MD': u'\u0645\u0648\u0644\u062f\u0648\u0641\u0627', 'MG': u'\u0645\u062f\u063a\u0634\u0642\u0631', 'MA': u'\u0627\u0644\u0645\u063a\u0631\u0628', 'MC': u'\u0645\u0648\u0646\u0627\u0643\u0648', 'UZ': u'\u0627\u0632\u0628\u0643\u0633\u062a\u0627\u0646', 'MM': u'\u0645\u064a\u0627\u0646\u0645\u0627\u0631', 'ML': u'\u0645\u0627\u0644\u064a', 'MN': u'\u0645\u0646\u063a\u0648\u0644\u064a\u0627', 'MH': u'\u062c\u0632\u0631 \u0627\u0644\u0645\u0627\u0631\u0634\u0627\u0644', 'MK': u'\u0645\u0642\u062f\u0648\u0646\u064a\u0627', 'MU': u'\u0645\u0648\u0631\u064a\u0634\u0648\u0633', 'MT': u'\u0645\u0627\u0644\u0637\u0629', 'MW': u'\u0645\u0644\u0627\u0648\u064a', 'MV': u'\u0645\u0627\u0644\u062f\u064a\u0641', 'MR': u'\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627', 'UG': u'\u0627\u0648\u063a\u0646\u062f\u0627', 'MY': u'\u0645\u0627\u0644\u064a\u0632\u064a\u0627', 'MX': u'\u0627\u0644\u0645\u0643\u0633\u064a\u0643', 'IL': u'\u0627\u0633\u0631\u0627\u0626\u064a\u0644', 'FR': u'\u0641\u0631\u0646\u0633\u0627', 'FI': u'\u0641\u0646\u0644\u0646\u062f\u0627', 'FJ': u'\u0641\u064a\u062c\u064a', 'FM': u'\u0645\u064a\u0643\u0631\u0648\u0646\u064a\u0632\u064a\u0627', 'NI': u'\u0646\u064a\u0643\u0627\u0631\u0627\u063a\u0648\u0627', 'NL': u'\u0647\u0648\u0644\u0646\u062f\u0627', 'NO': u'\u0627\u0644\u0646\u0631\u0648\u064a\u062c', 'NA': u'\u0646\u0627\u0645\u064a\u0628\u064a\u0627', 'VU': u'\u0641\u0627\u0646\u0648\u0622\u062a\u0648', 'NE': u'\u0627\u0644\u0646\u064a\u062c\u0631', 'NG': u'\u0646\u064a\u062c\u064a\u0631\u064a\u0627', 'NZ': u'\u0632\u064a\u0644\u0646\u062f\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'NP': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644', 'NR': u'\u0646\u0627\u0648\u0631\u0648', 'CH': u'\u0633\u0648\u064a\u0633\u0631\u0627', 'CO': u'\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627', 'CN': u'\u0627\u0644\u0635\u064a\u0646', 'CM': u'\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0648\u0646', 'CL': u'\u062a\u0634\u064a\u0644\u064a', 'CA': u'\u0643\u0646\u062f\u0627', 'CG': u'\u0627\u0644\u0643\u0648\u0646\u063a\u0648', 'CF': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0641\u0631\u064a\u0642\u064a\u0627 \u0627\u0644\u0648\u0633\u0637\u0649', 'CZ': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062a\u0634\u064a\u0643', 'CY': u'\u0642\u0628\u0631\u0635', 'CR': u'\u0643\u0648\u0633\u062a\u0627\u0631\u064a\u0643\u0627', 'CV': u'\u0627\u0644\u0631\u0623\u0633 \u0627\u0644\u0627\u062e\u0636\u0631', 'CU': u'\u0643\u0648\u0628\u0627', 'SZ': u'\u0633\u0648\u0627\u0632\u064a\u0644\u0627\u0646\u062f', 'SY': u'\u0633\u0648\u0631\u064a\u0629', 'KG': u'\u0642\u064a\u0631\u063a\u064a\u0632\u0633\u062a\u0627\u0646', 'KE': u'\u0643\u064a\u0646\u064a\u0627', 'SR': u'\u0633\u0648\u0631\u064a\u0646\u0627\u0645', 'KI': u'\u0643\u064a\u0631\u064a\u0628\u0627\u062a\u064a', 'KH': u'\u0643\u0645\u0628\u0648\u062f\u064a\u0627', 'KN': u'\u0633\u0627\u0646\u062a \u0643\u064a\u062a\u0633 \u0648\u0646\u064a\u0641\u064a\u0633', 'KM': u'\u062c\u0632\u0631 \u0627\u0644\u0642\u0645\u0631', 'ST': u'\u0633\u0627\u0646 \u062a\u0648\u0645\u064a \u0648\u0628\u0631\u064a\u0646\u0633\u064a\u0628\u064a', 'SK': u'\u0633\u0644\u0648\u0641\u0627\u0643\u064a\u0627', 'KR': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u062c\u0646\u0648\u0628\u064a\u0629', 'SI': u'\u0633\u0644\u0648\u0641\u064a\u0646\u064a\u0627', 'KP': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629', 'KW': u'\u0627\u0644\u0643\u0648\u064a\u062a', 'SN': u'\u0627\u0644\u0633\u0646\u063a\u0627\u0644', 'SM': u'\u0633\u0627\u0646 \u0645\u0627\u0631\u064a\u0646\u0648', 'SL': u'\u0633\u064a\u0631\u0627\u0644\u064a\u0648\u0646', 'SC': u'\u0633\u064a\u0634\u0644', 'KZ': u'\u0643\u0627\u0632\u0627\u062e\u0633\u062a\u0627\u0646', 'SA': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629', 'SG': u'\u0633\u0646\u063a\u0627\u0641\u0648\u0631\u0629', 'SE': u'\u0627\u0644\u0633\u0648\u064a\u062f', 'SD': u'\u0627\u0644\u0633\u0648\u062f\u0627\u0646', 'DO': u'\u0627\u0644\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u064a\u0629', 'DM': u'\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u0627', 'DJ': u'\u062c\u064a\u0628\u0648\u062a\u064a', 'DK': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0631\u0643', 'DE': u'\u0627\u0644\u0645\u0627\u0646\u064a\u0627', 'YE': u'\u0627\u0644\u064a\u0645\u0646', 'DZ': u'\u0627\u0644\u062c\u0632\u0627\u0626\u0631', 'US': u'\u0627\u0644\u0627\u0648\u0644\u0627\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u062d\u062f\u0629 \u0627\u0644\u0627\u0645\u0631\u064a\u0643\u064a\u0629', 'UY': u'\u0627\u0631\u0648\u063a\u0648\u0627\u064a', 'LB': u'\u0644\u0628\u0646\u0627\u0646', 'LC': u'\u0633\u0627\u0646\u062a \u0644\u0648\u0633\u064a\u0627', 'LA': u'\u0644\u0627\u0648\u0633', 'TV': u'\u062a\u0648\u0641\u0627\u0644\u0648', 'TW': u'\u062a\u0627\u064a\u0648\u0627\u0646', 'TT': u'\u062a\u0631\u064a\u0646\u064a\u062f\u0627\u062f \u0648\u062a\u0648\u0628\u0627\u063a\u0648', 'TR': u'\u062a\u0631\u0643\u064a\u0627', 'LK': u'\u0633\u0631\u064a \u0644\u0627\u0646\u0643\u0627', 'LI': u'\u0644\u064a\u062e\u062a\u0646\u0634\u062a\u0627\u064a\u0646', 'LV': u'\u0644\u0627\u062a\u0641\u064a\u0627', 'TO': u'\u062a\u0648\u0646\u063a\u0627', 'LT': u'\u0644\u064a\u062a\u0648\u0627\u0646\u064a\u0627', 'LU': u'\u0644\u0648\u0643\u0633\u0648\u0645\u0628\u0631\u063a', 'LR': u'\u0644\u064a\u0628\u064a\u0631\u064a\u0627', 'LS': u'\u0644\u064a\u0633\u0648\u062a\u0648', 'TH': u'\u062a\u0627\u064a\u0644\u0646\u062f', 'TG': u'\u062a\u0648\u063a\u0648', 'TD': u'\u062a\u0634\u0627\u062f', 'LY': u'\u0644\u064a\u0628\u064a\u0627', 'VA': u'\u0627\u0644\u0641\u0627\u062a\u064a\u0643\u0627\u0646', 'VC': u'\u0633\u0627\u0646\u062a \u0641\u0646\u0633\u0646\u062a \u0648\u062c\u0632\u0631 \u063a\u0631\u064a\u0646\u0627\u062f\u064a\u0646', 'AE': u'\u0627\u0644\u0627\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'AD': u'\u0627\u0646\u062f\u0648\u0631\u0627', 'AG': u'\u0627\u0646\u062a\u064a\u063a\u0648\u0627 \u0648\u0628\u0631\u0628\u0648\u062f\u0627', 'AF': u'\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646', 'AI': u'\u0627\u0644\u0628\u0627\u0646\u064a\u0627', 'IS': u'\u0627\u064a\u0633\u0644\u0646\u062f\u0627', 'IR': u'\u0627\u064a\u0631\u0627\u0646', 'AM': u'\u0627\u0631\u0645\u064a\u0646\u064a\u0627', 'IT': u'\u0627\u064a\u0637\u0627\u0644\u064a\u0627', 'AO': u'\u0627\u0646\u063a\u0648\u0644\u0627', 'AR': u'\u0627\u0644\u0627\u0631\u062c\u0646\u062a\u064a\u0646', 'AU': u'\u0627\u0633\u062a\u0631\u0627\u0644\u064a\u0627', 'AT': u'\u0627\u0644\u0646\u0645\u0633\u0627', 'IN': u'\u0627\u0644\u0647\u0646\u062f', 'TZ': u'\u062a\u0627\u0646\u0632\u0627\u0646\u064a\u0627', 'AZ': u'\u0622\u0630\u0631\u0628\u064a\u062c\u0627\u0646', 'IE': u'\u0627\u064a\u0631\u0644\u0646\u062f\u0627', 'ID': u'\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0627', 'UA': u'\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0627', 'QA': u'\u0642\u0637\u0631', 'MZ': u'\u0645\u0648\u0632\u0645\u0628\u064a\u0642'} months=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] abbrMonths=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] days=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] abbrDays=[u'\u0646', u'\u062b', u'\u0631', u'\u062e', u'\u062c', u'\u0633', u'\u062d'] dateFormats={'medium': '%d/%m/%Y', 'full': '%%(dayname)s, %d %%(monthname)s, %Y', 'long': '%d %%(monthname)s, %Y', 'short': '%d/%m/%Y'} numericSymbols={'group': u'\u066c', 'nativeZeroDigit': '0', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': u'\u066b', 'percentSign': u'\u066a', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>::''turbogears/i18n/data/ar_MA.pyc; ;Mc @s hdd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<5F=F=turbogears/i18n/data/ar_OM.py# Formatting configuration for locale ar_OM languages={'el': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646\u064a\u0629', 'gu': u'\u0627\u0644\u063a\u0648\u062c\u0627\u0631\u0627\u062a\u064a\u0629', 'en': u'\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629', 'zh': u'\u0627\u0644\u0635\u064a\u0646\u064a\u0629', 'sw': u'\u0627\u0644\u0633\u0648\u0627\u062d\u0644\u064a\u0629', 'ca': u'\u0627\u0644\u0643\u0627\u062a\u0627\u0644\u0648\u064a\u0646\u064a\u0629', 'it': u'\u0627\u0644\u0627\u064a\u0637\u0627\u0644\u064a\u0629', 'ar': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629', 'id': u'\u0627\u0644\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0629', 'es': u'\u0627\u0644\u0627\u0633\u0628\u0627\u0646\u064a\u0629', 'ru': u'\u0627\u0644\u0631\u0648\u0633\u064a\u0629', 'nl': u'\u0627\u0644\u0647\u0648\u0644\u0646\u062f\u064a\u0629', 'pt': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644\u064a\u0629', 'tr': u'\u0627\u0644\u062a\u0631\u0643\u064a\u0629', 'ne': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629', 'lt': u'\u0627\u0644\u0644\u062a\u0648\u0627\u0646\u064a\u0629', 'pa': u'\u0627\u0644\u0628\u0646\u062c\u0627\u0628\u064a\u0629', 'th': u'\u0627\u0644\u062a\u0627\u064a\u0644\u0627\u0646\u062f\u064a\u0629', 'vi': u'\u0627\u0644\u0641\u064a\u062a\u0646\u0627\u0645\u064a\u0629', 'ro': u'\u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064a\u0629', 'be': u'\u0627\u0644\u0628\u064a\u0644\u0648\u0631\u0648\u0633\u064a\u0629', 'fr': u'\u0627\u0644\u0641\u0631\u0646\u0633\u064a\u0629', 'bg': u'\u0627\u0644\u0628\u0644\u063a\u0627\u0631\u064a\u0629', 'uk': u'\u0627\u0644\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0629', 'hr': u'\u0627\u0644\u0643\u0631\u0648\u0627\u062a\u064a\u0629', 'bn': u'\u0627\u0644\u0628\u0646\u063a\u0627\u0644\u064a\u0629', 'bo': u'\u0627\u0644\u062a\u0628\u062a\u064a\u0629', 'da': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a\u0629', 'fa': u'\u0627\u0644\u0641\u0627\u0631\u0633\u064a\u0629', 'hi': u'\u0627\u0644\u0647\u0646\u062f\u064a\u0629', 'dz': u'\u0627\u0644\u0632\u0648\u0646\u062e\u0627\u064a\u0629', 'dv': u'\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629', 'fi': u'\u0627\u0644\u0641\u0646\u0644\u0646\u062f\u064a\u0629', 'ja': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a\u0629', 'he': u'\u0627\u0644\u0639\u0628\u0631\u064a\u0629', 'tl': u'\u0627\u0644\u062a\u0627\u063a\u0627\u0644\u0648\u063a\u064a\u0629', 'sr': u'\u0627\u0644\u0635\u0631\u0628\u064a\u0629', 'sq': u'\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629', 'mn': u'\u0627\u0644\u0645\u0646\u063a\u0648\u0644\u064a\u0629', 'ko': u'\u0627\u0644\u0643\u0648\u0631\u064a\u0629', 'km': u'\u0627\u0644\u062e\u0645\u064a\u0631\u064a\u0629', 'ur': u'\u0627\u0644\u0627\u0631\u062f\u064a\u0629', 'de': u'\u0627\u0644\u0627\u0644\u0645\u0627\u0646\u064a\u0629', 'ms': u'\u0644\u063a\u0629 \u0627\u0644\u0645\u0644\u0627\u064a\u0648', 'ug': u'\u0627\u0644\u0627\u063a\u0648\u0631\u064a\u0629', 'my': u'\u0627\u0644\u0628\u0648\u0631\u0645\u064a\u0629'} countries={'BD': u'\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634', 'BE': u'\u0628\u0644\u062c\u064a\u0643\u0627', 'BF': u'\u0628\u0648\u0631\u0643\u064a\u0646\u0627 \u0641\u0627\u0633\u0648', 'BG': u'\u0628\u0644\u063a\u0627\u0631\u064a\u0627', 'BA': u'\u0627\u0644\u0628\u0648\u0633\u0646\u0629 \u0648\u0627\u0644\u0647\u0631\u0633\u0643', 'BB': u'\u0628\u0631\u0628\u0627\u062f\u0648\u0633', 'BN': u'\u0628\u0631\u0648\u0646\u0627\u064a', 'BO': u'\u0628\u0648\u0644\u064a\u0641\u064a\u0627', 'BH': u'\u0627\u0644\u0628\u062d\u0631\u064a\u0646', 'BI': u'\u0628\u0648\u0631\u0648\u0646\u062f\u064a', 'BJ': u'\u0628\u0646\u064a\u0646', 'BT': u'\u0628\u0648\u062a\u0627\u0646', 'JM': u'\u062c\u0627\u0645\u0627\u064a\u0643\u0627', 'BW': u'\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627', 'WS': u'\u0633\u0627\u0645\u0648\u0627', 'BR': u'\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644', 'BS': u'\u0627\u0644\u0628\u0647\u0627\u0645\u0627', 'BY': u'\u0631\u0648\u0633\u064a\u0627 \u0627\u0644\u0628\u064a\u0636\u0627\u0621', 'BZ': u'\u0628\u0644\u064a\u0632', 'RU': u'\u0631\u0648\u0633\u064a\u0627', 'RW': u'\u0631\u0648\u0627\u0646\u062f\u0627', 'TM': u'\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646', 'TJ': u'\u062a\u0627\u062c\u064a\u0643\u0633\u062a\u0627\u0646', 'RO': u'\u0631\u0648\u0645\u0627\u0646\u064a\u0627', 'GW': u'\u063a\u064a\u0646\u064a\u0627 \u0628\u064a\u0633\u0627\u0648', 'GT': u'\u063a\u0648\u0627\u062a\u064a\u0645\u0627\u0644\u0627', 'GR': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646', 'GQ': u'\u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u0627\u0633\u062a\u0648\u0627\u0626\u064a\u0629', 'JP': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646', 'GY': u'\u063a\u0648\u0627\u064a\u0627\u0646\u0627', 'GE': u'\u062c\u0648\u0631\u062c\u064a\u0627', 'GD': u'\u063a\u0631\u064a\u0646\u0627\u062f\u0627', 'GB': u'\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'GA': u'\u063a\u0627\u0628\u0648\u0646', 'SV': u'\u0627\u0644\u0633\u0644\u0641\u0627\u062f\u0648\u0631', 'GN': u'\u063a\u064a\u0646\u064a\u0627', 'GM': u'\u063a\u0627\u0645\u0628\u064a\u0627', 'GH': u'\u063a\u0627\u0646\u0627', 'OM': u'\u0639\u0645\u0627\u0646', 'TN': u'\u062a\u0648\u0646\u0633', 'JO': u'\u0627\u0644\u0627\u0631\u062f\u0646', 'HR': u'\u0643\u0631\u0648\u0627\u062a\u064a\u0627', 'HT': u'\u0647\u0627\u064a\u062a\u064a', 'HU': u'\u0647\u0646\u063a\u0627\u0631\u064a\u0627', 'HN': u'\u0647\u0646\u062f\u0648\u0631\u0627\u0633', 'VE': u'\u0641\u0646\u0632\u0648\u064a\u0644\u0627', 'PW': u'\u0628\u0627\u0644\u0627\u0648', 'PT': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644', 'PY': u'\u0628\u0627\u0631\u0627\u063a\u0648\u0627\u064a', 'IQ': u'\u0627\u0644\u0639\u0631\u0627\u0642', 'PA': u'\u0628\u0646\u0645\u0627', 'PG': u'\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'PE': u'\u0628\u064a\u0631\u0648', 'PK': u'\u0627\u0644\u0628\u0627\u0643\u0633\u062a\u0627\u0646', 'PH': u'\u0627\u0644\u0641\u064a\u0644\u0628\u064a\u0646', 'PL': u'\u0628\u0648\u0644\u0646\u062f\u0627', 'ZM': u'\u0632\u0627\u0645\u0628\u064a\u0627', 'EH': u'\u0627\u0644\u0635\u062d\u0631\u0627\u0621 \u0627\u0644\u063a\u0631\u0628\u064a\u0629', 'EE': u'\u0627\u0633\u062a\u0648\u0646\u064a\u0627', 'EG': u'\u0645\u0635\u0631', 'ZA': u'\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u064a\u0642\u064a\u0627', 'EC': u'\u0627\u0643\u0648\u0627\u062f\u0648\u0631', 'VN': u'\u0641\u064a\u062a\u0646\u0627\u0645', 'SB': u'\u062c\u0632\u0631 \u0633\u0644\u064a\u0645\u0627\u0646', 'ET': u'\u0627\u062b\u064a\u0648\u0628\u064a\u0627', 'SO': u'\u0627\u0644\u0635\u0648\u0645\u0627\u0644', 'ZW': u'\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a', 'ES': u'\u0627\u0633\u0628\u0627\u0646\u064a\u0627', 'ER': u'\u0627\u0631\u062a\u064a\u0631\u064a\u0627', 'MD': u'\u0645\u0648\u0644\u062f\u0648\u0641\u0627', 'MG': u'\u0645\u062f\u063a\u0634\u0642\u0631', 'MA': u'\u0627\u0644\u0645\u063a\u0631\u0628', 'MC': u'\u0645\u0648\u0646\u0627\u0643\u0648', 'UZ': u'\u0627\u0632\u0628\u0643\u0633\u062a\u0627\u0646', 'MM': u'\u0645\u064a\u0627\u0646\u0645\u0627\u0631', 'ML': u'\u0645\u0627\u0644\u064a', 'MN': u'\u0645\u0646\u063a\u0648\u0644\u064a\u0627', 'MH': u'\u062c\u0632\u0631 \u0627\u0644\u0645\u0627\u0631\u0634\u0627\u0644', 'MK': u'\u0645\u0642\u062f\u0648\u0646\u064a\u0627', 'MU': u'\u0645\u0648\u0631\u064a\u0634\u0648\u0633', 'MT': u'\u0645\u0627\u0644\u0637\u0629', 'MW': u'\u0645\u0644\u0627\u0648\u064a', 'MV': u'\u0645\u0627\u0644\u062f\u064a\u0641', 'MR': u'\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627', 'UG': u'\u0627\u0648\u063a\u0646\u062f\u0627', 'MY': u'\u0645\u0627\u0644\u064a\u0632\u064a\u0627', 'MX': u'\u0627\u0644\u0645\u0643\u0633\u064a\u0643', 'IL': u'\u0627\u0633\u0631\u0627\u0626\u064a\u0644', 'FR': u'\u0641\u0631\u0646\u0633\u0627', 'FI': u'\u0641\u0646\u0644\u0646\u062f\u0627', 'FJ': u'\u0641\u064a\u062c\u064a', 'FM': u'\u0645\u064a\u0643\u0631\u0648\u0646\u064a\u0632\u064a\u0627', 'NI': u'\u0646\u064a\u0643\u0627\u0631\u0627\u063a\u0648\u0627', 'NL': u'\u0647\u0648\u0644\u0646\u062f\u0627', 'NO': u'\u0627\u0644\u0646\u0631\u0648\u064a\u062c', 'NA': u'\u0646\u0627\u0645\u064a\u0628\u064a\u0627', 'VU': u'\u0641\u0627\u0646\u0648\u0622\u062a\u0648', 'NE': u'\u0627\u0644\u0646\u064a\u062c\u0631', 'NG': u'\u0646\u064a\u062c\u064a\u0631\u064a\u0627', 'NZ': u'\u0632\u064a\u0644\u0646\u062f\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'NP': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644', 'NR': u'\u0646\u0627\u0648\u0631\u0648', 'CH': u'\u0633\u0648\u064a\u0633\u0631\u0627', 'CO': u'\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627', 'CN': u'\u0627\u0644\u0635\u064a\u0646', 'CM': u'\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0648\u0646', 'CL': u'\u062a\u0634\u064a\u0644\u064a', 'CA': u'\u0643\u0646\u062f\u0627', 'CG': u'\u0627\u0644\u0643\u0648\u0646\u063a\u0648', 'CF': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0641\u0631\u064a\u0642\u064a\u0627 \u0627\u0644\u0648\u0633\u0637\u0649', 'CZ': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062a\u0634\u064a\u0643', 'CY': u'\u0642\u0628\u0631\u0635', 'CR': u'\u0643\u0648\u0633\u062a\u0627\u0631\u064a\u0643\u0627', 'CV': u'\u0627\u0644\u0631\u0623\u0633 \u0627\u0644\u0627\u062e\u0636\u0631', 'CU': u'\u0643\u0648\u0628\u0627', 'SZ': u'\u0633\u0648\u0627\u0632\u064a\u0644\u0627\u0646\u062f', 'SY': u'\u0633\u0648\u0631\u064a\u0629', 'KG': u'\u0642\u064a\u0631\u063a\u064a\u0632\u0633\u062a\u0627\u0646', 'KE': u'\u0643\u064a\u0646\u064a\u0627', 'SR': u'\u0633\u0648\u0631\u064a\u0646\u0627\u0645', 'KI': u'\u0643\u064a\u0631\u064a\u0628\u0627\u062a\u064a', 'KH': u'\u0643\u0645\u0628\u0648\u062f\u064a\u0627', 'KN': u'\u0633\u0627\u0646\u062a \u0643\u064a\u062a\u0633 \u0648\u0646\u064a\u0641\u064a\u0633', 'KM': u'\u062c\u0632\u0631 \u0627\u0644\u0642\u0645\u0631', 'ST': u'\u0633\u0627\u0646 \u062a\u0648\u0645\u064a \u0648\u0628\u0631\u064a\u0646\u0633\u064a\u0628\u064a', 'SK': u'\u0633\u0644\u0648\u0641\u0627\u0643\u064a\u0627', 'KR': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u062c\u0646\u0648\u0628\u064a\u0629', 'SI': u'\u0633\u0644\u0648\u0641\u064a\u0646\u064a\u0627', 'KP': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629', 'KW': u'\u0627\u0644\u0643\u0648\u064a\u062a', 'SN': u'\u0627\u0644\u0633\u0646\u063a\u0627\u0644', 'SM': u'\u0633\u0627\u0646 \u0645\u0627\u0631\u064a\u0646\u0648', 'SL': u'\u0633\u064a\u0631\u0627\u0644\u064a\u0648\u0646', 'SC': u'\u0633\u064a\u0634\u0644', 'KZ': u'\u0643\u0627\u0632\u0627\u062e\u0633\u062a\u0627\u0646', 'SA': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629', 'SG': u'\u0633\u0646\u063a\u0627\u0641\u0648\u0631\u0629', 'SE': u'\u0627\u0644\u0633\u0648\u064a\u062f', 'SD': u'\u0627\u0644\u0633\u0648\u062f\u0627\u0646', 'DO': u'\u0627\u0644\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u064a\u0629', 'DM': u'\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u0627', 'DJ': u'\u062c\u064a\u0628\u0648\u062a\u064a', 'DK': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0631\u0643', 'DE': u'\u0627\u0644\u0645\u0627\u0646\u064a\u0627', 'YE': u'\u0627\u0644\u064a\u0645\u0646', 'DZ': u'\u0627\u0644\u062c\u0632\u0627\u0626\u0631', 'US': u'\u0627\u0644\u0627\u0648\u0644\u0627\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u062d\u062f\u0629 \u0627\u0644\u0627\u0645\u0631\u064a\u0643\u064a\u0629', 'UY': u'\u0627\u0631\u0648\u063a\u0648\u0627\u064a', 'LB': u'\u0644\u0628\u0646\u0627\u0646', 'LC': u'\u0633\u0627\u0646\u062a \u0644\u0648\u0633\u064a\u0627', 'LA': u'\u0644\u0627\u0648\u0633', 'TV': u'\u062a\u0648\u0641\u0627\u0644\u0648', 'TW': u'\u062a\u0627\u064a\u0648\u0627\u0646', 'TT': u'\u062a\u0631\u064a\u0646\u064a\u062f\u0627\u062f \u0648\u062a\u0648\u0628\u0627\u063a\u0648', 'TR': u'\u062a\u0631\u0643\u064a\u0627', 'LK': u'\u0633\u0631\u064a \u0644\u0627\u0646\u0643\u0627', 'LI': u'\u0644\u064a\u062e\u062a\u0646\u0634\u062a\u0627\u064a\u0646', 'LV': u'\u0644\u0627\u062a\u0641\u064a\u0627', 'TO': u'\u062a\u0648\u0646\u063a\u0627', 'LT': u'\u0644\u064a\u062a\u0648\u0627\u0646\u064a\u0627', 'LU': u'\u0644\u0648\u0643\u0633\u0648\u0645\u0628\u0631\u063a', 'LR': u'\u0644\u064a\u0628\u064a\u0631\u064a\u0627', 'LS': u'\u0644\u064a\u0633\u0648\u062a\u0648', 'TH': u'\u062a\u0627\u064a\u0644\u0646\u062f', 'TG': u'\u062a\u0648\u063a\u0648', 'TD': u'\u062a\u0634\u0627\u062f', 'LY': u'\u0644\u064a\u0628\u064a\u0627', 'VA': u'\u0627\u0644\u0641\u0627\u062a\u064a\u0643\u0627\u0646', 'VC': u'\u0633\u0627\u0646\u062a \u0641\u0646\u0633\u0646\u062a \u0648\u062c\u0632\u0631 \u063a\u0631\u064a\u0646\u0627\u062f\u064a\u0646', 'AE': u'\u0627\u0644\u0627\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'AD': u'\u0627\u0646\u062f\u0648\u0631\u0627', 'AG': u'\u0627\u0646\u062a\u064a\u063a\u0648\u0627 \u0648\u0628\u0631\u0628\u0648\u062f\u0627', 'AF': u'\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646', 'AI': u'\u0627\u0644\u0628\u0627\u0646\u064a\u0627', 'IS': u'\u0627\u064a\u0633\u0644\u0646\u062f\u0627', 'IR': u'\u0627\u064a\u0631\u0627\u0646', 'AM': u'\u0627\u0631\u0645\u064a\u0646\u064a\u0627', 'IT': u'\u0627\u064a\u0637\u0627\u0644\u064a\u0627', 'AO': u'\u0627\u0646\u063a\u0648\u0644\u0627', 'AR': u'\u0627\u0644\u0627\u0631\u062c\u0646\u062a\u064a\u0646', 'AU': u'\u0627\u0633\u062a\u0631\u0627\u0644\u064a\u0627', 'AT': u'\u0627\u0644\u0646\u0645\u0633\u0627', 'IN': u'\u0627\u0644\u0647\u0646\u062f', 'TZ': u'\u062a\u0627\u0646\u0632\u0627\u0646\u064a\u0627', 'AZ': u'\u0622\u0630\u0631\u0628\u064a\u062c\u0627\u0646', 'IE': u'\u0627\u064a\u0631\u0644\u0646\u062f\u0627', 'ID': u'\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0627', 'UA': u'\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0627', 'QA': u'\u0642\u0637\u0631', 'MZ': u'\u0645\u0648\u0632\u0645\u0628\u064a\u0642'} months=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] abbrMonths=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] days=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] abbrDays=[u'\u0646', u'\u062b', u'\u0631', u'\u062e', u'\u062c', u'\u0633', u'\u062d'] dateFormats={'medium': '%d/%m/%Y', 'full': '%%(dayname)s, %d %%(monthname)s, %Y', 'long': '%d %%(monthname)s, %Y', 'short': '%d/%m/%Y'} numericSymbols={'group': u'\u066c', 'nativeZeroDigit': u'\u0660', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': u'\u066b', 'percentSign': u'\u066a', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>''turbogears/i18n/data/ar_OM.pyc; :Mc @s hdd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<ddX*>*>turbogears/i18n/data/ar_QA.py# Formatting configuration for locale ar_QA languages={'el': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646\u064a\u0629', 'gu': u'\u0627\u0644\u063a\u0648\u062c\u0627\u0631\u0627\u062a\u064a\u0629', 'en': u'\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629', 'zh': u'\u0627\u0644\u0635\u064a\u0646\u064a\u0629', 'sw': u'\u0627\u0644\u0633\u0648\u0627\u062d\u0644\u064a\u0629', 'ca': u'\u0627\u0644\u0643\u0627\u062a\u0627\u0644\u0648\u064a\u0646\u064a\u0629', 'it': u'\u0627\u0644\u0627\u064a\u0637\u0627\u0644\u064a\u0629', 'ar': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629', 'id': u'\u0627\u0644\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0629', 'es': u'\u0627\u0644\u0627\u0633\u0628\u0627\u0646\u064a\u0629', 'ru': u'\u0627\u0644\u0631\u0648\u0633\u064a\u0629', 'nl': u'\u0627\u0644\u0647\u0648\u0644\u0646\u062f\u064a\u0629', 'pt': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644\u064a\u0629', 'tr': u'\u0627\u0644\u062a\u0631\u0643\u064a\u0629', 'ne': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629', 'lt': u'\u0627\u0644\u0644\u062a\u0648\u0627\u0646\u064a\u0629', 'pa': u'\u0627\u0644\u0628\u0646\u062c\u0627\u0628\u064a\u0629', 'th': u'\u0627\u0644\u062a\u0627\u064a\u0644\u0627\u0646\u062f\u064a\u0629', 'vi': u'\u0627\u0644\u0641\u064a\u062a\u0646\u0627\u0645\u064a\u0629', 'ro': u'\u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064a\u0629', 'be': u'\u0627\u0644\u0628\u064a\u0644\u0648\u0631\u0648\u0633\u064a\u0629', 'fr': u'\u0627\u0644\u0641\u0631\u0646\u0633\u064a\u0629', 'bg': u'\u0627\u0644\u0628\u0644\u063a\u0627\u0631\u064a\u0629', 'uk': u'\u0627\u0644\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0629', 'hr': u'\u0627\u0644\u0643\u0631\u0648\u0627\u062a\u064a\u0629', 'bn': u'\u0627\u0644\u0628\u0646\u063a\u0627\u0644\u064a\u0629', 'bo': u'\u0627\u0644\u062a\u0628\u062a\u064a\u0629', 'da': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a\u0629', 'fa': u'\u0627\u0644\u0641\u0627\u0631\u0633\u064a\u0629', 'hi': u'\u0627\u0644\u0647\u0646\u062f\u064a\u0629', 'dz': u'\u0627\u0644\u0632\u0648\u0646\u062e\u0627\u064a\u0629', 'dv': u'\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629', 'fi': u'\u0627\u0644\u0641\u0646\u0644\u0646\u062f\u064a\u0629', 'ja': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a\u0629', 'he': u'\u0627\u0644\u0639\u0628\u0631\u064a\u0629', 'tl': u'\u0627\u0644\u062a\u0627\u063a\u0627\u0644\u0648\u063a\u064a\u0629', 'sr': u'\u0627\u0644\u0635\u0631\u0628\u064a\u0629', 'sq': u'\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629', 'mn': u'\u0627\u0644\u0645\u0646\u063a\u0648\u0644\u064a\u0629', 'ko': u'\u0627\u0644\u0643\u0648\u0631\u064a\u0629', 'km': u'\u0627\u0644\u062e\u0645\u064a\u0631\u064a\u0629', 'ur': u'\u0627\u0644\u0627\u0631\u062f\u064a\u0629', 'de': u'\u0627\u0644\u0627\u0644\u0645\u0627\u0646\u064a\u0629', 'ms': u'\u0644\u063a\u0629 \u0627\u0644\u0645\u0644\u0627\u064a\u0648', 'ug': u'\u0627\u0644\u0627\u063a\u0648\u0631\u064a\u0629', 'my': u'\u0627\u0644\u0628\u0648\u0631\u0645\u064a\u0629'} countries={'BD': u'\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634', 'BE': u'\u0628\u0644\u062c\u064a\u0643\u0627', 'BF': u'\u0628\u0648\u0631\u0643\u064a\u0646\u0627 \u0641\u0627\u0633\u0648', 'BG': u'\u0628\u0644\u063a\u0627\u0631\u064a\u0627', 'BA': u'\u0627\u0644\u0628\u0648\u0633\u0646\u0629 \u0648\u0627\u0644\u0647\u0631\u0633\u0643', 'BB': u'\u0628\u0631\u0628\u0627\u062f\u0648\u0633', 'BN': u'\u0628\u0631\u0648\u0646\u0627\u064a', 'BO': u'\u0628\u0648\u0644\u064a\u0641\u064a\u0627', 'BH': u'\u0627\u0644\u0628\u062d\u0631\u064a\u0646', 'BI': u'\u0628\u0648\u0631\u0648\u0646\u062f\u064a', 'BJ': u'\u0628\u0646\u064a\u0646', 'BT': u'\u0628\u0648\u062a\u0627\u0646', 'JM': u'\u062c\u0627\u0645\u0627\u064a\u0643\u0627', 'BW': u'\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627', 'WS': u'\u0633\u0627\u0645\u0648\u0627', 'BR': u'\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644', 'BS': u'\u0627\u0644\u0628\u0647\u0627\u0645\u0627', 'BY': u'\u0631\u0648\u0633\u064a\u0627 \u0627\u0644\u0628\u064a\u0636\u0627\u0621', 'BZ': u'\u0628\u0644\u064a\u0632', 'RU': u'\u0631\u0648\u0633\u064a\u0627', 'RW': u'\u0631\u0648\u0627\u0646\u062f\u0627', 'TM': u'\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646', 'TJ': u'\u062a\u0627\u062c\u064a\u0643\u0633\u062a\u0627\u0646', 'RO': u'\u0631\u0648\u0645\u0627\u0646\u064a\u0627', 'GW': u'\u063a\u064a\u0646\u064a\u0627 \u0628\u064a\u0633\u0627\u0648', 'GT': u'\u063a\u0648\u0627\u062a\u064a\u0645\u0627\u0644\u0627', 'GR': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646', 'GQ': u'\u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u0627\u0633\u062a\u0648\u0627\u0626\u064a\u0629', 'JP': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646', 'GY': u'\u063a\u0648\u0627\u064a\u0627\u0646\u0627', 'GE': u'\u062c\u0648\u0631\u062c\u064a\u0627', 'GD': u'\u063a\u0631\u064a\u0646\u0627\u062f\u0627', 'GB': u'\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'GA': u'\u063a\u0627\u0628\u0648\u0646', 'SV': u'\u0627\u0644\u0633\u0644\u0641\u0627\u062f\u0648\u0631', 'GN': u'\u063a\u064a\u0646\u064a\u0627', 'GM': u'\u063a\u0627\u0645\u0628\u064a\u0627', 'GH': u'\u063a\u0627\u0646\u0627', 'OM': u'\u0639\u0645\u0627\u0646', 'TN': u'\u062a\u0648\u0646\u0633', 'JO': u'\u0627\u0644\u0627\u0631\u062f\u0646', 'HR': u'\u0643\u0631\u0648\u0627\u062a\u064a\u0627', 'HT': u'\u0647\u0627\u064a\u062a\u064a', 'HU': u'\u0647\u0646\u063a\u0627\u0631\u064a\u0627', 'HN': u'\u0647\u0646\u062f\u0648\u0631\u0627\u0633', 'VE': u'\u0641\u0646\u0632\u0648\u064a\u0644\u0627', 'PW': u'\u0628\u0627\u0644\u0627\u0648', 'PT': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644', 'PY': u'\u0628\u0627\u0631\u0627\u063a\u0648\u0627\u064a', 'IQ': u'\u0627\u0644\u0639\u0631\u0627\u0642', 'PA': u'\u0628\u0646\u0645\u0627', 'PG': u'\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'PE': u'\u0628\u064a\u0631\u0648', 'PK': u'\u0627\u0644\u0628\u0627\u0643\u0633\u062a\u0627\u0646', 'PH': u'\u0627\u0644\u0641\u064a\u0644\u0628\u064a\u0646', 'PL': u'\u0628\u0648\u0644\u0646\u062f\u0627', 'ZM': u'\u0632\u0627\u0645\u0628\u064a\u0627', 'EH': u'\u0627\u0644\u0635\u062d\u0631\u0627\u0621 \u0627\u0644\u063a\u0631\u0628\u064a\u0629', 'EE': u'\u0627\u0633\u062a\u0648\u0646\u064a\u0627', 'EG': u'\u0645\u0635\u0631', 'ZA': u'\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u064a\u0642\u064a\u0627', 'EC': u'\u0627\u0643\u0648\u0627\u062f\u0648\u0631', 'VN': u'\u0641\u064a\u062a\u0646\u0627\u0645', 'SB': u'\u062c\u0632\u0631 \u0633\u0644\u064a\u0645\u0627\u0646', 'ET': u'\u0627\u062b\u064a\u0648\u0628\u064a\u0627', 'SO': u'\u0627\u0644\u0635\u0648\u0645\u0627\u0644', 'ZW': u'\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a', 'ES': u'\u0627\u0633\u0628\u0627\u0646\u064a\u0627', 'ER': u'\u0627\u0631\u062a\u064a\u0631\u064a\u0627', 'MD': u'\u0645\u0648\u0644\u062f\u0648\u0641\u0627', 'MG': u'\u0645\u062f\u063a\u0634\u0642\u0631', 'MA': u'\u0627\u0644\u0645\u063a\u0631\u0628', 'MC': u'\u0645\u0648\u0646\u0627\u0643\u0648', 'UZ': u'\u0627\u0632\u0628\u0643\u0633\u062a\u0627\u0646', 'MM': u'\u0645\u064a\u0627\u0646\u0645\u0627\u0631', 'ML': u'\u0645\u0627\u0644\u064a', 'MN': u'\u0645\u0646\u063a\u0648\u0644\u064a\u0627', 'MH': u'\u062c\u0632\u0631 \u0627\u0644\u0645\u0627\u0631\u0634\u0627\u0644', 'MK': u'\u0645\u0642\u062f\u0648\u0646\u064a\u0627', 'MU': u'\u0645\u0648\u0631\u064a\u0634\u0648\u0633', 'MT': u'\u0645\u0627\u0644\u0637\u0629', 'MW': u'\u0645\u0644\u0627\u0648\u064a', 'MV': u'\u0645\u0627\u0644\u062f\u064a\u0641', 'MR': u'\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627', 'UG': u'\u0627\u0648\u063a\u0646\u062f\u0627', 'MY': u'\u0645\u0627\u0644\u064a\u0632\u064a\u0627', 'MX': u'\u0627\u0644\u0645\u0643\u0633\u064a\u0643', 'IL': u'\u0627\u0633\u0631\u0627\u0626\u064a\u0644', 'FR': u'\u0641\u0631\u0646\u0633\u0627', 'FI': u'\u0641\u0646\u0644\u0646\u062f\u0627', 'FJ': u'\u0641\u064a\u062c\u064a', 'FM': u'\u0645\u064a\u0643\u0631\u0648\u0646\u064a\u0632\u064a\u0627', 'NI': u'\u0646\u064a\u0643\u0627\u0631\u0627\u063a\u0648\u0627', 'NL': u'\u0647\u0648\u0644\u0646\u062f\u0627', 'NO': u'\u0627\u0644\u0646\u0631\u0648\u064a\u062c', 'NA': u'\u0646\u0627\u0645\u064a\u0628\u064a\u0627', 'VU': u'\u0641\u0627\u0646\u0648\u0622\u062a\u0648', 'NE': u'\u0627\u0644\u0646\u064a\u062c\u0631', 'NG': u'\u0646\u064a\u062c\u064a\u0631\u064a\u0627', 'NZ': u'\u0632\u064a\u0644\u0646\u062f\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'NP': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644', 'NR': u'\u0646\u0627\u0648\u0631\u0648', 'CH': u'\u0633\u0648\u064a\u0633\u0631\u0627', 'CO': u'\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627', 'CN': u'\u0627\u0644\u0635\u064a\u0646', 'CM': u'\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0648\u0646', 'CL': u'\u062a\u0634\u064a\u0644\u064a', 'CA': u'\u0643\u0646\u062f\u0627', 'CG': u'\u0627\u0644\u0643\u0648\u0646\u063a\u0648', 'CF': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0641\u0631\u064a\u0642\u064a\u0627 \u0627\u0644\u0648\u0633\u0637\u0649', 'CZ': u'\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062a\u0634\u064a\u0643', 'CY': u'\u0642\u0628\u0631\u0635', 'CR': u'\u0643\u0648\u0633\u062a\u0627\u0631\u064a\u0643\u0627', 'CV': u'\u0627\u0644\u0631\u0623\u0633 \u0627\u0644\u0627\u062e\u0636\u0631', 'CU': u'\u0643\u0648\u0628\u0627', 'SZ': u'\u0633\u0648\u0627\u0632\u064a\u0644\u0627\u0646\u062f', 'SY': u'\u0633\u0648\u0631\u064a\u0629', 'KG': u'\u0642\u064a\u0631\u063a\u064a\u0632\u0633\u062a\u0627\u0646', 'KE': u'\u0643\u064a\u0646\u064a\u0627', 'SR': u'\u0633\u0648\u0631\u064a\u0646\u0627\u0645', 'KI': u'\u0643\u064a\u0631\u064a\u0628\u0627\u062a\u064a', 'KH': u'\u0643\u0645\u0628\u0648\u062f\u064a\u0627', 'KN': u'\u0633\u0627\u0646\u062a \u0643\u064a\u062a\u0633 \u0648\u0646\u064a\u0641\u064a\u0633', 'KM': u'\u062c\u0632\u0631 \u0627\u0644\u0642\u0645\u0631', 'ST': u'\u0633\u0627\u0646 \u062a\u0648\u0645\u064a \u0648\u0628\u0631\u064a\u0646\u0633\u064a\u0628\u064a', 'SK': u'\u0633\u0644\u0648\u0641\u0627\u0643\u064a\u0627', 'KR': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u062c\u0646\u0648\u0628\u064a\u0629', 'SI': u'\u0633\u0644\u0648\u0641\u064a\u0646\u064a\u0627', 'KP': u'\u0643\u0648\u0631\u064a\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629', 'KW': u'\u0627\u0644\u0643\u0648\u064a\u062a', 'SN': u'\u0627\u0644\u0633\u0646\u063a\u0627\u0644', 'SM': u'\u0633\u0627\u0646 \u0645\u0627\u0631\u064a\u0646\u0648', 'SL': u'\u0633\u064a\u0631\u0627\u0644\u064a\u0648\u0646', 'SC': u'\u0633\u064a\u0634\u0644', 'KZ': u'\u0643\u0627\u0632\u0627\u062e\u0633\u062a\u0627\u0646', 'SA': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629', 'SG': u'\u0633\u0646\u063a\u0627\u0641\u0648\u0631\u0629', 'SE': u'\u0627\u0644\u0633\u0648\u064a\u062f', 'SD': u'\u0627\u0644\u0633\u0648\u062f\u0627\u0646', 'DO': u'\u0627\u0644\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u064a\u0629', 'DM': u'\u062f\u0648\u0645\u064a\u0646\u064a\u0643\u0627', 'DJ': u'\u062c\u064a\u0628\u0648\u062a\u064a', 'DK': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0631\u0643', 'DE': u'\u0627\u0644\u0645\u0627\u0646\u064a\u0627', 'YE': u'\u0627\u0644\u064a\u0645\u0646', 'DZ': u'\u0627\u0644\u062c\u0632\u0627\u0626\u0631', 'US': u'\u0627\u0644\u0627\u0648\u0644\u0627\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u062d\u062f\u0629 \u0627\u0644\u0627\u0645\u0631\u064a\u0643\u064a\u0629', 'UY': u'\u0627\u0631\u0648\u063a\u0648\u0627\u064a', 'LB': u'\u0644\u0628\u0646\u0627\u0646', 'LC': u'\u0633\u0627\u0646\u062a \u0644\u0648\u0633\u064a\u0627', 'LA': u'\u0644\u0627\u0648\u0633', 'TV': u'\u062a\u0648\u0641\u0627\u0644\u0648', 'TW': u'\u062a\u0627\u064a\u0648\u0627\u0646', 'TT': u'\u062a\u0631\u064a\u0646\u064a\u062f\u0627\u062f \u0648\u062a\u0648\u0628\u0627\u063a\u0648', 'TR': u'\u062a\u0631\u0643\u064a\u0627', 'LK': u'\u0633\u0631\u064a \u0644\u0627\u0646\u0643\u0627', 'LI': u'\u0644\u064a\u062e\u062a\u0646\u0634\u062a\u0627\u064a\u0646', 'LV': u'\u0644\u0627\u062a\u0641\u064a\u0627', 'TO': u'\u062a\u0648\u0646\u063a\u0627', 'LT': u'\u0644\u064a\u062a\u0648\u0627\u0646\u064a\u0627', 'LU': u'\u0644\u0648\u0643\u0633\u0648\u0645\u0628\u0631\u063a', 'LR': u'\u0644\u064a\u0628\u064a\u0631\u064a\u0627', 'LS': u'\u0644\u064a\u0633\u0648\u062a\u0648', 'TH': u'\u062a\u0627\u064a\u0644\u0646\u062f', 'TG': u'\u062a\u0648\u063a\u0648', 'TD': u'\u062a\u0634\u0627\u062f', 'LY': u'\u0644\u064a\u0628\u064a\u0627', 'VA': u'\u0627\u0644\u0641\u0627\u062a\u064a\u0643\u0627\u0646', 'VC': u'\u0633\u0627\u0646\u062a \u0641\u0646\u0633\u0646\u062a \u0648\u062c\u0632\u0631 \u063a\u0631\u064a\u0646\u0627\u062f\u064a\u0646', 'AE': u'\u0627\u0644\u0627\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'AD': u'\u0627\u0646\u062f\u0648\u0631\u0627', 'AG': u'\u0627\u0646\u062a\u064a\u063a\u0648\u0627 \u0648\u0628\u0631\u0628\u0648\u062f\u0627', 'AF': u'\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646', 'AI': u'\u0627\u0644\u0628\u0627\u0646\u064a\u0627', 'IS': u'\u0627\u064a\u0633\u0644\u0646\u062f\u0627', 'IR': u'\u0627\u064a\u0631\u0627\u0646', 'AM': u'\u0627\u0631\u0645\u064a\u0646\u064a\u0627', 'IT': u'\u0627\u064a\u0637\u0627\u0644\u064a\u0627', 'AO': u'\u0627\u0646\u063a\u0648\u0644\u0627', 'AR': u'\u0627\u0644\u0627\u0631\u062c\u0646\u062a\u064a\u0646', 'AU': u'\u0627\u0633\u062a\u0631\u0627\u0644\u064a\u0627', 'AT': u'\u0627\u0644\u0646\u0645\u0633\u0627', 'IN': u'\u0627\u0644\u0647\u0646\u062f', 'TZ': u'\u062a\u0627\u0646\u0632\u0627\u0646\u064a\u0627', 'AZ': u'\u0622\u0630\u0631\u0628\u064a\u062c\u0627\u0646', 'IE': u'\u0627\u064a\u0631\u0644\u0646\u062f\u0627', 'ID': u'\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0627', 'UA': u'\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0627', 'QA': u'\u0642\u0637\u0631', 'MZ': u'\u0645\u0648\u0632\u0645\u0628\u064a\u0642'} months=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] abbrMonths=[u'\u064a\u0646\u0627\u064a\u0631', u'\u0641\u0628\u0631\u0627\u064a\u0631', u'\u0645\u0627\u0631\u0633', u'\u0623\u0628\u0631\u064a\u0644', u'\u0645\u0627\u064a\u0648', u'\u064a\u0648\u0646\u064a\u0648', u'\u064a\u0648\u0644\u064a\u0648', u'\u0623\u063a\u0633\u0637\u0633', u'\u0633\u0628\u062a\u0645\u0628\u0631', u'\u0623\u0643\u062a\u0648\u0628\u0631', u'\u0646\u0648\u0641\u0645\u0628\u0631', u'\u062f\u064a\u0633\u0645\u0628\u0631'] days=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] abbrDays=[u'\u0627\u0644\u0627\u062b\u0646\u064a\u0646', u'\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0627\u0644\u062e\u0645\u064a\u0633', u'\u0627\u0644\u062c\u0645\u0639\u0629', u'\u0627\u0644\u0633\u0628\u062a', u'\u0627\u0644\u0623\u062d\u062f'] dateFormats={'medium': '%d/%m/%Y', 'full': '%%(dayname)s, %d %%(monthname)s, %Y', 'long': '%d %%(monthname)s, %Y', 'short': '%d/%m/%Y'} numericSymbols={'group': u'\u066c', 'nativeZeroDigit': u'\u0660', 'exponential': 'E', 'perMille': u'\u2030', 'nan': u'\ufffd', 'decimal': u'\u066b', 'percentSign': u'\u066a', 'list': ';', 'patternDigit': '#', 'plusSign': '+', 'infinity': u'\u221e', 'minusSign': '-'} PK>֛''turbogears/i18n/data/ar_QA.pyc; ;Mc @s hdd<dd<dd<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdg<dhdi<djdk<dldm<dndo<dpdq<drds<dtdu<dvdw<dxdy<dzd{<d|d}<d~d<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd9s*>*>turbogears/i18n/data/ar_SA.py# Formatting configuration for locale ar_SA languages={'el': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646\u064a\u0629', 'gu': u'\u0627\u0644\u063a\u0648\u062c\u0627\u0631\u0627\u062a\u064a\u0629', 'en': u'\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629', 'zh': u'\u0627\u0644\u0635\u064a\u0646\u064a\u0629', 'sw': u'\u0627\u0644\u0633\u0648\u0627\u062d\u0644\u064a\u0629', 'ca': u'\u0627\u0644\u0643\u0627\u062a\u0627\u0644\u0648\u064a\u0646\u064a\u0629', 'it': u'\u0627\u0644\u0627\u064a\u0637\u0627\u0644\u064a\u0629', 'ar': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0629', 'id': u'\u0627\u0644\u0627\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0629', 'es': u'\u0627\u0644\u0627\u0633\u0628\u0627\u0646\u064a\u0629', 'ru': u'\u0627\u0644\u0631\u0648\u0633\u064a\u0629', 'nl': u'\u0627\u0644\u0647\u0648\u0644\u0646\u062f\u064a\u0629', 'pt': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644\u064a\u0629', 'tr': u'\u0627\u0644\u062a\u0631\u0643\u064a\u0629', 'ne': u'\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629', 'lt': u'\u0627\u0644\u0644\u062a\u0648\u0627\u0646\u064a\u0629', 'pa': u'\u0627\u0644\u0628\u0646\u062c\u0627\u0628\u064a\u0629', 'th': u'\u0627\u0644\u062a\u0627\u064a\u0644\u0627\u0646\u062f\u064a\u0629', 'vi': u'\u0627\u0644\u0641\u064a\u062a\u0646\u0627\u0645\u064a\u0629', 'ro': u'\u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064a\u0629', 'be': u'\u0627\u0644\u0628\u064a\u0644\u0648\u0631\u0648\u0633\u064a\u0629', 'fr': u'\u0627\u0644\u0641\u0631\u0646\u0633\u064a\u0629', 'bg': u'\u0627\u0644\u0628\u0644\u063a\u0627\u0631\u064a\u0629', 'uk': u'\u0627\u0644\u0627\u0648\u0643\u0631\u0627\u0646\u064a\u0629', 'hr': u'\u0627\u0644\u0643\u0631\u0648\u0627\u062a\u064a\u0629', 'bn': u'\u0627\u0644\u0628\u0646\u063a\u0627\u0644\u064a\u0629', 'bo': u'\u0627\u0644\u062a\u0628\u062a\u064a\u0629', 'da': u'\u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a\u0629', 'fa': u'\u0627\u0644\u0641\u0627\u0631\u0633\u064a\u0629', 'hi': u'\u0627\u0644\u0647\u0646\u062f\u064a\u0629', 'dz': u'\u0627\u0644\u0632\u0648\u0646\u062e\u0627\u064a\u0629', 'dv': u'\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629', 'fi': u'\u0627\u0644\u0641\u0646\u0644\u0646\u062f\u064a\u0629', 'ja': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a\u0629', 'he': u'\u0627\u0644\u0639\u0628\u0631\u064a\u0629', 'tl': u'\u0627\u0644\u062a\u0627\u063a\u0627\u0644\u0648\u063a\u064a\u0629', 'sr': u'\u0627\u0644\u0635\u0631\u0628\u064a\u0629', 'sq': u'\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629', 'mn': u'\u0627\u0644\u0645\u0646\u063a\u0648\u0644\u064a\u0629', 'ko': u'\u0627\u0644\u0643\u0648\u0631\u064a\u0629', 'km': u'\u0627\u0644\u062e\u0645\u064a\u0631\u064a\u0629', 'ur': u'\u0627\u0644\u0627\u0631\u062f\u064a\u0629', 'de': u'\u0627\u0644\u0627\u0644\u0645\u0627\u0646\u064a\u0629', 'ms': u'\u0644\u063a\u0629 \u0627\u0644\u0645\u0644\u0627\u064a\u0648', 'ug': u'\u0627\u0644\u0627\u063a\u0648\u0631\u064a\u0629', 'my': u'\u0627\u0644\u0628\u0648\u0631\u0645\u064a\u0629'} countries={'BD': u'\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634', 'BE': u'\u0628\u0644\u062c\u064a\u0643\u0627', 'BF': u'\u0628\u0648\u0631\u0643\u064a\u0646\u0627 \u0641\u0627\u0633\u0648', 'BG': u'\u0628\u0644\u063a\u0627\u0631\u064a\u0627', 'BA': u'\u0627\u0644\u0628\u0648\u0633\u0646\u0629 \u0648\u0627\u0644\u0647\u0631\u0633\u0643', 'BB': u'\u0628\u0631\u0628\u0627\u062f\u0648\u0633', 'BN': u'\u0628\u0631\u0648\u0646\u0627\u064a', 'BO': u'\u0628\u0648\u0644\u064a\u0641\u064a\u0627', 'BH': u'\u0627\u0644\u0628\u062d\u0631\u064a\u0646', 'BI': u'\u0628\u0648\u0631\u0648\u0646\u062f\u064a', 'BJ': u'\u0628\u0646\u064a\u0646', 'BT': u'\u0628\u0648\u062a\u0627\u0646', 'JM': u'\u062c\u0627\u0645\u0627\u064a\u0643\u0627', 'BW': u'\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627', 'WS': u'\u0633\u0627\u0645\u0648\u0627', 'BR': u'\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644', 'BS': u'\u0627\u0644\u0628\u0647\u0627\u0645\u0627', 'BY': u'\u0631\u0648\u0633\u064a\u0627 \u0627\u0644\u0628\u064a\u0636\u0627\u0621', 'BZ': u'\u0628\u0644\u064a\u0632', 'RU': u'\u0631\u0648\u0633\u064a\u0627', 'RW': u'\u0631\u0648\u0627\u0646\u062f\u0627', 'TM': u'\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646', 'TJ': u'\u062a\u0627\u062c\u064a\u0643\u0633\u062a\u0627\u0646', 'RO': u'\u0631\u0648\u0645\u0627\u0646\u064a\u0627', 'GW': u'\u063a\u064a\u0646\u064a\u0627 \u0628\u064a\u0633\u0627\u0648', 'GT': u'\u063a\u0648\u0627\u062a\u064a\u0645\u0627\u0644\u0627', 'GR': u'\u0627\u0644\u064a\u0648\u0646\u0627\u0646', 'GQ': u'\u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u0627\u0633\u062a\u0648\u0627\u0626\u064a\u0629', 'JP': u'\u0627\u0644\u064a\u0627\u0628\u0627\u0646', 'GY': u'\u063a\u0648\u0627\u064a\u0627\u0646\u0627', 'GE': u'\u062c\u0648\u0631\u062c\u064a\u0627', 'GD': u'\u063a\u0631\u064a\u0646\u0627\u062f\u0627', 'GB': u'\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629', 'GA': u'\u063a\u0627\u0628\u0648\u0646', 'SV': u'\u0627\u0644\u0633\u0644\u0641\u0627\u062f\u0648\u0631', 'GN': u'\u063a\u064a\u0646\u064a\u0627', 'GM': u'\u063a\u0627\u0645\u0628\u064a\u0627', 'GH': u'\u063a\u0627\u0646\u0627', 'OM': u'\u0639\u0645\u0627\u0646', 'TN': u'\u062a\u0648\u0646\u0633', 'JO': u'\u0627\u0644\u0627\u0631\u062f\u0646', 'HR': u'\u0643\u0631\u0648\u0627\u062a\u064a\u0627', 'HT': u'\u0647\u0627\u064a\u062a\u064a', 'HU': u'\u0647\u0646\u063a\u0627\u0631\u064a\u0627', 'HN': u'\u0647\u0646\u062f\u0648\u0631\u0627\u0633', 'VE': u'\u0641\u0646\u0632\u0648\u064a\u0644\u0627', 'PW': u'\u0628\u0627\u0644\u0627\u0648', 'PT': u'\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644', 'PY': u'\u0628\u0627\u0631\u0627\u063a\u0648\u0627\u064a', 'IQ': u'\u0627\u0644\u0639\u0631\u0627\u0642', 'PA': u'\u0628\u0646\u0645\u0627', 'PG': u'\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629', 'PE': u'\u0628\u064a\u0631\u0648', 'PK': u'\u0627\u0644\u0628\u0627\u0643\u0633\u062a\u0627\u0646', 'PH': u'\u0627\u0644\u0641\u064a\u0644\u0628\u064a\u0646', 'PL': u'\u0628\u0648\u0644\u0646\u062f\u0627', 'ZM': u'\u0632\u0627\u0645\u0628\u064a\u0627', 'EH': u'\u0627\u0644\u0635\u062d\u0631\u0627\u0621 \u0627\u0644\u063a\u0631\u0628\u064a\u0629', 'EE': u'\u0627\u0633\u062a\u0648\u0646\u064a\u0627', 'EG': u'\u0645\u0635\u0631', 'ZA': u'\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u064a\u0642\u064a\u0627', 'EC': u'\u0627\u0643\u0648\u0627\u062f\u0648\u0631', 'VN': u'\u0641\u064a\u062a\u0646\u0627\u0645', 'SB': u'\u062c\u0632\u0631 \u0633\u0644\u064a\u0645\u0627\u0646', 'ET': u'\u0627\u062b\u064a\u0648\u0628\u064a\u0627', 'SO': u'\u0627\u0644\u0635\u0648\u0645\u0627\u0644', 'ZW': u'\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a', 'ES': u'\u0627\u0633\u0628\u0627\u0646\u064a\u0627', 'ER': u'\u0627\u0631\u062a\u064a\u0631\u064a\u0627', 'MD': u'\u0645\u0648\u0644\u062f\u0648\u0641\u0627', 'MG': u'\u0645\u062f\u063a\u0634\u0642\u0631', 'MA': u'\u0627\u0644\u0645\u063a\u0631\u0628', 'MC': u'\u0645\u0648\u0646\u0627\u0643\u0648', 'UZ': u'\u0627\u0632\u0628\u0643\u0633\u062a\u0627\u0646', 'MM': u'\u0645\u064a\u0627\u0646\u0645\u0627\u0631', 'ML': u'\u0645\u0627\u0644\u064a', 'MN': u'\u0645\u0646\u063a\u0648\u0644\u064a\u0627', 'MH': u'\u062c\u0632\u0631 \u0627\u0644\u0645\u0627\u0631\u0634\u0627\u0644', 'MK': u'\u0645\u0642\u062f\u0648\u0646\u064a\u0627', 'MU': u'\u0645\u0648\u0631\u064a\u0634\u0648\u0633', 'MT': u'\u0645\u0627\u0644\u0637\u0629', 'MW': u'\u0645\u0644\u0627\u0648\u064a', 'MV': u'\u0645\u0627\u0644\u062f\u064a\u0641', '