[Python-Dev] Extending locale.py

M.-A. Lemburg mal@lemburg.com
Fri, 26 May 2000 16:49:23 +0200


This is a multi-part message in MIME format.
--------------FDA69223F7CCDED3D7828E2B
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

To make moving into the direction of making the string encoding
depend on the locale settings a little easier, I've started
to hack away at an extension of the locale.py module.

The module provides enough information to be able to set the string
encoding in site.py at startup. 

Additional code for _localemodule.c would be nice for platforms
which use other APIs to get at the active code page, e.g. on
Windows and Macs.

Please try it on your platform and tell me what you think
of the APIs.

Thanks,
-- 
Marc-Andre Lemburg
______________________________________________________________________
Business:                                      http://www.lemburg.com/
Python Pages:                           http://www.lemburg.com/python/
--------------FDA69223F7CCDED3D7828E2B
Content-Type: text/python; charset=us-ascii;
 name="localex.py"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="localex.py"

""" Extented locale.py

    This version of locale.py contains a locale aliasing engine and
    knows the default encoding of many common locales.

    (c) Marc-Andre Lemburg, mal@lemburg.com

"""
from locale import *
import string

__version__ = '0.1'

### APIs

def normalize(localename):

    """ Returns a normalized locale code for the given locale
        name.

        The locale code is usable for setting the locale using
        setlocale().

        If normalization fails, the original name is returned
        unchanged.

    """
    lname = string.lower(localename)
    if ':' in lname:
        # ':' is sometimes used as encoding delimiter.
        lname = string.replace(lname, ':', '.')
    code = locale_alias.get(lname, localename)
    if code is localename:
        # Could be that the encoding is not known; in that case
        # we default to the default encoding for that locale code
        # just like setlocale() does.
        if '.' in lname:
            lname, encoding = string.split(lname, '.')
        code = locale_alias.get(lname, localename)
    return code

def _parse_localename(localename):

    """ Parses the locale code for localename and returns the
        result as tuple (language code, encoding).

        The language code corresponds to RFC 1766.  code and encoding
        can be None in case the values cannot be determined.

    """
    code = normalize(localename)
    l = string.split(code, '.')
    if len(l) != 2:
        if l[0] == 'C':
            return None,None
        else:
            raise SystemError,'error in locale.locale_alias: missing encoding'
    return l
    
def get_default():

    """ Tries to determine the default locale settings and returns
        them as tuple (language code, encoding).

        According to POSIX, a program which has not called
        setlocale(LC_ALL,"") runs using the portable 'C' locale.
        Calling setlocale(LC_ALL,"") lets it use the default locale as
        defined by the LANG variable. Since we don't want to interfere
        with the current locale setting we thus emulate the behaviour
        in the way described above.

        Except for the code 'C', the language code corresponds to RFC
        1766.  code and encoding can be None in case the values cannot
        be determined.

    """
    # XXX On some systems the environment variables LC_ALL, LC_CTYPE, etc.
    #     complement the setting of LANG... perhaps we should try those
    #     variables too ?
    import os
    localename = os.environ.get('LANG','C')
    return _parse_localename(localename)

def get_locale(category=LC_CTYPE):

    """ Returns the current setting for the given locale category as
        tuple (language code, encoding).

        category may be one of the LC_* value except LC_ALL. It
        defaults to LC_CTYPE.

        Except for the code 'C', the language code corresponds to RFC
        1766.  code and encoding can be None in case the values cannot
        be determined.

    """
    return _parse_localename(setlocale(category))

def set_locale(localename, category=LC_ALL):

    """ Set the locale to localename.

        localename can be given as common locale name. It will be
        filtered through a list of common aliases for the C locale
        codes.

        category may be given as one of the LC_* values. It defaults
        to LC_ALL.

    """
    setlocale(category, normalize(localename))

### Data
#
# The following table was extracted from the locale.alias file which
# comes with X11. It is usually available as
# /usr/lib/X11/locale/locale.alias.
#
# The table maps lowercase alias names to C locale names. Encodings
# are always separated from the locale name using a dot ('.').
#
locale_alias = {
        'american.iso88591':             'en_US.ISO8859-1',
        'american.iso885915':            'en_US.ISO8859-15',
        'ar':                            'ar_AA.ISO8859-6',
        'ar_aa':                         'ar_AA.ISO8859-6',
        'ar_sa.iso88596':                'ar_SA.ISO8859-6',
        'arabic.iso88596':               'ar_AA.ISO8859-6',
        'bg':                            'bg_BG.ISO8859-5',
        'bg_bg':                         'bg_BG.ISO8859-5',
        'bg_bg.iso88595':                'bg_BG.ISO8859-5',
        'bulgarian':                     'bg_BG.ISO8859-5',
        'c-french.iso88591':             'fr_CA.ISO8859-1',
        'c-french.iso885915':            'fr_CA.ISO8859-15',
        'c.en':                          'C',
        'c.iso88591':                    'en_US.ISO8859-1',
        'c.iso885915':                   'en_US.ISO8859-15',
        'c_c.c':                         'C',
        'cextend':                       'en_US.ISO8859-1',
        'cextend.en':                    'en_US.ISO8859-1',
        'chinese-s':                     'zh_CN.eucCN',
        'chinese-t':                     'zh_TW.eucTW',
        'croatian':                      'hr_HR.ISO8859-2',
        'cs':                            'cs_CZ.ISO8859-2',
        'cs_cs':                         'cs_CZ.ISO8859-2',
        'cs_cs.iso8859-2':               'cs_CZ.ISO8859-2',
        'cs_cz':                         'cs_CZ.ISO8859-2',
        'cs_cz.iso88592':                'cs_CZ.ISO8859-2',
        'cz':                            'cz_CZ.ISO8859-2',
        'cz_cz':                         'cz_CZ.ISO8859-2',
        'czech':                         'cs_CS.ISO8859-2',
        'da':                            'da_DK.ISO8859-1',
        'da_dk':                         'da_DK.ISO8859-1',
        'da_dk.88591':                   'da_DK.ISO8859-1',
        'da_dk.88591.en':                'da_DK.ISO8859-1',
        'da_dk.885915':                  'da_DK.ISO8859-15',
        'da_dk.885915.en':               'da_DK.ISO8859-15',
        'da_dk.iso88591':                'da_DK.ISO8859-1',
        'da_dk.iso885915':               'da_DK.ISO8859-15',
        'da_dk.iso_8859-1':              'da_DK.ISO8859-1',
        'da_dk.iso_8859-15':             'da_DK.ISO8859-15',
        'danish.iso88591':               'da_DK.ISO8859-1',
        'danish.iso885915':              'da_DK.ISO8859-15',
        'de':                            'de_DE.ISO8859-1',
        'de_at':                         'de_AT.ISO8859-1',
        'de_at.iso_8859-1':              'de_AT.ISO8859-1',
        'de_at.iso_8859-15':             'de_AT.ISO8859-15',
        'de_ch':                         'de_CH.ISO8859-1',
        'de_ch.iso_8859-1':              'de_CH.ISO8859-1',
        'de_ch.iso_8859-15':             'de_CH.ISO8859-15',
        'de_de':                         'de_DE.ISO8859-1',
        'de_de.88591':                   'de_DE.ISO8859-1',
        'de_de.88591.en':                'de_DE.ISO8859-1',
        'de_de.885915':                  'de_DE.ISO8859-15',
        'de_de.885915.en':               'de_DE.ISO8859-15',
        'de_de.iso88591':                'de_DE.ISO8859-1',
        'de_de.iso885915':               'de_DE.ISO8859-15',
        'de_de.iso_8859-1':              'de_DE.ISO8859-1',
        'de_de.iso_8859-15':             'de_DE.ISO8859-15',
        'dutch.iso88591':                'nl_BE.ISO8859-1',
        'dutch.iso885915':               'nl_BE.ISO8859-15',
        'ee':                            'ee_EE.ISO8859-4',
        'el':                            'el_GR.ISO8859-7',
        'el_gr':                         'el_GR.ISO8859-7',
        'el_gr.iso88597':                'el_GR.ISO8859-7',
        'en':                            'en_US.ISO8859-1',
        'en_au':                         'en_AU.ISO8859-1',
        'en_au.iso_8859-1':              'en_AU.ISO8859-1',
        'en_au.iso_8859-15':             'en_AU.ISO8859-15',
        'en_ca':                         'en_CA.ISO8859-1',
        'en_ca.iso_8859-1':              'en_CA.ISO8859-1',
        'en_ca.iso_8859-15':             'en_CA.ISO8859-15',
        'en_gb':                         'en_GB.ISO8859-1',
        'en_gb.88591':                   'en_GB.ISO8859-1',
        'en_gb.88591.en':                'en_GB.ISO8859-1',
        'en_gb.885915':                  'en_GB.ISO8859-15',
        'en_gb.885915.en':               'en_GB.ISO8859-15',
        'en_gb.iso88591':                'en_GB.ISO8859-1',
        'en_gb.iso885915':               'en_GB.ISO8859-15',
        'en_gb.iso_8859-1':              'en_GB.ISO8859-1',
        'en_gb.iso_8859-15':             'en_GB.ISO8859-15',
        'en_ie':                         'en_IE.ISO8859-1',
        'en_nz':                         'en_NZ.ISO8859-1',
        'en_uk':                         'en_GB.ISO8859-1',
        'en_us':                         'en_US.ISO8859-1',
        'en_us.88591':                   'en_US.ISO8859-1',
        'en_us.88591.en':                'en_US.ISO8859-1',
        'en_us.885915':                  'en_US.ISO8859-15',
        'en_us.885915.en':               'en_US.ISO8859-15',
        'en_us.iso88591':                'en_US.ISO8859-1',
        'en_us.iso885915':               'en_US.ISO8859-15',
        'en_us.iso_8859-1':              'en_US.ISO8859-1',
        'en_us.iso_8859-15':             'en_US.ISO8859-15',
        'en_us.utf-8':                   'en_US.utf',
        'en_us.utf-8':                   'en_US.utf',
        'eng_gb.8859':                   'en_GB.ISO8859-1',
        'eng_gb.8859.in':                'en_GB.ISO8859-1',
        'english.iso88591':              'en_EN.ISO8859-1',
        'english.iso885915':             'en_EN.ISO8859-15',
        'english_uk.8859':               'en_GB.ISO8859-1',
        'english_united-states.437':     'C',
        'english_us.8859':               'en_US.ISO8859-1',
        'english_us.ascii':              'en_US.ISO8859-1',
        'es':                            'es_ES.ISO8859-1',
        'es_ar':                         'es_AR.ISO8859-1',
        'es_bo':                         'es_BO.ISO8859-1',
        'es_cl':                         'es_CL.ISO8859-1',
        'es_co':                         'es_CO.ISO8859-1',
        'es_cr':                         'es_CR.ISO8859-1',
        'es_ec':                         'es_EC.ISO8859-1',
        'es_es':                         'es_ES.ISO8859-1',
        'es_es.88591':                   'es_ES.ISO8859-1',
        'es_es.88591.en':                'es_ES.ISO8859-1',
        'es_es.885915':                  'es_ES.ISO8859-15',
        'es_es.885915.en':               'es_ES.ISO8859-15',
        'es_es.iso88591':                'es_ES.ISO8859-1',
        'es_es.iso885915':               'es_ES.ISO8859-15',
        'es_es.iso_8859-1':              'es_ES.ISO8859-1',
        'es_es.iso_8859-15':             'es_ES.ISO8859-15',
        'es_gt':                         'es_GT.ISO8859-1',
        'es_mx':                         'es_MX.ISO8859-1',
        'es_ni':                         'es_NI.ISO8859-1',
        'es_pa':                         'es_PA.ISO8859-1',
        'es_pe':                         'es_PE.ISO8859-1',
        'es_py':                         'es_PY.ISO8859-1',
        'es_sv':                         'es_SV.ISO8859-1',
        'es_uy':                         'es_UY.ISO8859-1',
        'es_ve':                         'es_VE.ISO8859-1',
        'et':                            'et_EE.ISO8859-4',
        'et_ee':                         'et_EE.ISO8859-4',
        'fi':                            'fi_FI.ISO8859-1',
        'fi_fi':                         'fi_FI.ISO8859-1',
        'fi_fi.88591':                   'fi_FI.ISO8859-1',
        'fi_fi.88591.en':                'fi_FI.ISO8859-1',
        'fi_fi.885915':                  'fi_FI.ISO8859-15',
        'fi_fi.885915.en':               'fi_FI.ISO8859-15',
        'fi_fi.iso88591':                'fi_FI.ISO8859-1',
        'fi_fi.iso885915':               'fi_FI.ISO8859-15',
        'fi_fi.iso_8859-1':              'fi_FI.ISO8859-1',
        'fi_fi.iso_8859-15':             'fi_FI.ISO8859-15',
        'finnish.iso88591':              'fi_FI.ISO8859-1',
        'finnish.iso885915':             'fi_FI.ISO8859-15',
        'fr':                            'fr_FR.ISO8859-1',
        'fr_be':                         'fr_BE.ISO8859-1',
        'fr_be.88591':                   'fr_BE.ISO8859-1',
        'fr_be.88591.en':                'fr_BE.ISO8859-1',
        'fr_be.885915':                  'fr_BE.ISO8859-15',
        'fr_be.885915.en':               'fr_BE.ISO8859-15',
        'fr_be.iso_8859-1':              'fr_BE.ISO8859-1',
        'fr_be.iso_8859-15':             'fr_BE.ISO8859-15',
        'fr_ca':                         'fr_CA.ISO8859-1',
        'fr_ca.88591':                   'fr_CA.ISO8859-1',
        'fr_ca.88591.en':                'fr_CA.ISO8859-1',
        'fr_ca.885915':                  'fr_CA.ISO8859-15',
        'fr_ca.885915.en':               'fr_CA.ISO8859-15',
        'fr_ca.iso88591':                'fr_CA.ISO8859-1',
        'fr_ca.iso885915':               'fr_CA.ISO8859-15',
        'fr_ca.iso_8859-1':              'fr_CA.ISO8859-1',
        'fr_ca.iso_8859-15':             'fr_CA.ISO8859-15',
        'fr_ch':                         'fr_CH.ISO8859-1',
        'fr_ch.88591':                   'fr_CH.ISO8859-1',
        'fr_ch.88591.en':                'fr_CH.ISO8859-1',
        'fr_ch.885915':                  'fr_CH.ISO8859-15',
        'fr_ch.885915.en':               'fr_CH.ISO8859-15',
        'fr_ch.iso_8859-1':              'fr_CH.ISO8859-1',
        'fr_ch.iso_8859-15':             'fr_CH.ISO8859-15',
        'fr_fr':                         'fr_FR.ISO8859-1',
        'fr_fr.88591':                   'fr_FR.ISO8859-1',
        'fr_fr.88591.en':                'fr_FR.ISO8859-1',
        'fr_fr.885915':                  'fr_FR.ISO8859-15',
        'fr_fr.885915.en':               'fr_FR.ISO8859-15',
        'fr_fr.iso88591':                'fr_FR.ISO8859-1',
        'fr_fr.iso885915':               'fr_FR.ISO8859-15',
        'fr_fr.iso_8859-1':              'fr_FR.ISO8859-1',
        'fr_fr.iso_8859-15':             'fr_FR.ISO8859-15',
        'fre_fr.8859':                   'fr_FR.ISO8859-1',
        'fre_fr.8859.in':                'fr_FR.ISO8859-1',
        'french.iso88591':               'fr_CH.ISO8859-1',
        'french.iso885915':              'fr_CH.ISO8859-15',
        'french_france.8859':            'fr_FR.ISO8859-1',
        'ger_de.8859':                   'de_DE.ISO8859-1',
        'ger_de.8859.in':                'de_DE.ISO8859-1',
        'german.iso88591':               'de_CH.ISO8859-1',
        'german.iso885915':              'de_CH.ISO8859-15',
        'german_germany.8859':           'de_DE.ISO8859-1',
        'greek.iso88597':                'el_GR.ISO8859-7',
        'hebrew.iso88598':               'iw_IL.ISO8859-8',
        'hr':                            'hr_HR.ISO8859-2',
        'hr_hr':                         'hr_HR.ISO8859-2',
        'hr_hr.iso88592':                'hr_HR.ISO8859-2',
        'hr_hr.iso_8859-2':              'hr_HR.ISO8859-2',
        'hu':                            'hu_HU.ISO8859-2',
        'hu_hu':                         'hu_HU.ISO8859-2',
        'hu_hu.iso88592':                'hu_HU.ISO8859-2',
        'hungarian':                     'hu_HU.ISO8859-2',
        'icelandic.iso88591':            'is_IS.ISO8859-1',
        'icelandic.iso885915':           'is_IS.ISO8859-15',
        'id':                            'id_ID.ISO8859-1',
        'id_id':                         'id_ID.ISO8859-1',
        'id_id.iso88591':                'id_ID.ISO8859-1',
        'is':                            'is_IS.ISO8859-1',
        'is_is':                         'is_IS.ISO8859-1',
        'is_is.iso88591':                'is_IS.ISO8859-1',
        'is_is.iso885915':               'is_IS.ISO8859-15',
        'is_is.iso_8859-1':              'is_IS.ISO8859-1',
        'is_is.iso_8859-15':             'is_IS.ISO8859-15',
        'iso-8859-1':                    'en_US.ISO8859-1',
        'iso-8859-15':                   'en_US.ISO8859-15',
        'iso8859-1':                     'en_US.ISO8859-1',
        'iso8859-15':                    'en_US.ISO8859-15',
        'iso_8859_1':                    'en_US.ISO8859-1',
        'iso_8859_15':                   'en_US.ISO8859-15',
        'it':                            'it_IT.ISO8859-1',
        'it_ch':                         'it_CH.ISO8859-1',
        'it_ch.iso_8859-1':              'it_CH.ISO8859-1',
        'it_ch.iso_8859-15':             'it_CH.ISO8859-15',
        'it_it':                         'it_IT.ISO8859-1',
        'it_it.88591':                   'it_IT.ISO8859-1',
        'it_it.88591.en':                'it_IT.ISO8859-1',
        'it_it.885915':                  'it_IT.ISO8859-15',
        'it_it.885915.en':               'it_IT.ISO8859-15',
        'it_it.iso88591':                'it_IT.ISO8859-1',
        'it_it.iso885915':               'it_IT.ISO8859-15',
        'it_it.iso_8859-1':              'it_IT.ISO8859-1',
        'it_it.iso_8859-15':             'it_IT.ISO8859-15',
        'italian.iso88591':              'it_IT.ISO8859-1',
        'italian.iso885915':             'it_IT.ISO8859-15',
        'iw':                            'iw_IL.ISO8859-8',
        'iw_il':                         'iw_IL.ISO8859-8',
        'iw_il.iso88598':                'iw_IL.ISO8859-8',
        'ja':                            'ja_JP.eucJP',
        'ja.jis':                        'ja_JP.JIS7',
        'ja.sjis':                       'ja_JP.SJIS',
        'ja_jp':                         'ja_JP.eucJP',
        'ja_jp.ajec':                    'ja_JP.eucJP',
        'ja_jp.euc':                     'ja_JP.eucJP',
        'ja_jp.eucjp':                   'ja_JP.eucJP',
        'ja_jp.iso-2022-jp':             'ja_JP.JIS7',
        'ja_jp.jis':                     'ja_JP.JIS7',
        'ja_jp.jis7':                    'ja_JP.JIS7',
        'ja_jp.mscode':                  'ja_JP.SJIS',
        'ja_jp.sjis':                    'ja_JP.SJIS',
        'ja_jp.ujis':                    'ja_JP.eucJP',
        'japan':                         'ja_JP.eucJP',
        'japanese':                      'ja_JP.SJIS',
        'japanese-euc':                  'ja_JP.eucJP',
        'japanese.euc':                  'ja_JP.eucJP',
        'jp_jp':                         'ja_JP.eucJP',
        'ko':                            'ko_KR.eucKR',
        'ko_kr':                         'ko_KR.eucKR',
        'ko_kr.euc':                     'ko_KR.eucKR',
        'ko_kr.euc':                     'ko_KR.eucKR',
        'korean':                        'ko_KR.eucKR',
        'lt':                            'lt_LT.ISO8859-4',
        'lv':                            'lv_LV.ISO8859-4',
        'mk':                            'mk_MK.ISO8859-5',
        'mk_mk':                         'mk_MK.ISO8859-5',
        'nl':                            'nl_NL.ISO8859-1',
        'nl_be':                         'nl_BE.ISO8859-1',
        'nl_be.88591':                   'nl_BE.ISO8859-1',
        'nl_be.88591.en':                'nl_BE.ISO8859-1',
        'nl_be.885915':                  'nl_BE.ISO8859-15',
        'nl_be.885915.en':               'nl_BE.ISO8859-15',
        'nl_be.iso_8859-1':              'nl_BE.ISO8859-1',
        'nl_be.iso_8859-15':             'nl_BE.ISO8859-15',
        'nl_nl':                         'nl_NL.ISO8859-1',
        'nl_nl.88591':                   'nl_NL.ISO8859-1',
        'nl_nl.88591.en':                'nl_NL.ISO8859-1',
        'nl_nl.885915':                  'nl_NL.ISO8859-15',
        'nl_nl.885915.en':               'nl_NL.ISO8859-15',
        'nl_nl.iso88591':                'nl_NL.ISO8859-1',
        'nl_nl.iso885915':               'nl_NL.ISO8859-15',
        'nl_nl.iso_8859-1':              'nl_NL.ISO8859-1',
        'nl_nl.iso_8859-15':             'nl_NL.ISO8859-15',
        'no':                            'no_NO.ISO8859-1',
        'no_no':                         'no_NO.ISO8859-1',
        'no_no.88591':                   'no_NO.ISO8859-1',
        'no_no.88591.en':                'no_NO.ISO8859-1',
        'no_no.885915':                  'no_NO.ISO8859-15',
        'no_no.885915.en':               'no_NO.ISO8859-15',
        'no_no.iso88591':                'no_NO.ISO8859-1',
        'no_no.iso885915':               'no_NO.ISO8859-15',
        'no_no.iso_8859-1':              'no_NO.ISO8859-1',
        'no_no.iso_8859-15':             'no_NO.ISO8859-15',
        'norwegian.iso88591':            'no_NO.ISO8859-1',
        'norwegian.iso885915':           'no_NO.ISO8859-15',
        'pl':                            'pl_PL.ISO8859-2',
        'pl_pl':                         'pl_PL.ISO8859-2',
        'pl_pl.iso88592':                'pl_PL.ISO8859-2',
        'polish':                        'pl_PL.ISO8859-2',
        'portuguese.iso88591':           'pt_PT.ISO8859-1',
        'portuguese.iso885915':          'pt_PT.ISO8859-15',
        'portuguese_brazil.8859':        'pt_BR.ISO8859-1',
        'posix':                         'C',
        'posix-utf2':                    'C',
        'pt':                            'pt_PT.ISO8859-1',
        'pt_br':                         'pt_BR.ISO8859-1',
        'pt_pt':                         'pt_PT.ISO8859-1',
        'pt_pt.88591':                   'pt_PT.ISO8859-1',
        'pt_pt.88591.en':                'pt_PT.ISO8859-1',
        'pt_pt.885915':                  'pt_PT.ISO8859-15',
        'pt_pt.885915.en':               'pt_PT.ISO8859-15',
        'pt_pt.iso88591':                'pt_PT.ISO8859-1',
        'pt_pt.iso885915':               'pt_PT.ISO8859-15',
        'pt_pt.iso_8859-1':              'pt_PT.ISO8859-1',
        'pt_pt.iso_8859-15':             'pt_PT.ISO8859-15',
        'ro':                            'ro_RO.ISO8859-2',
        'ro_ro':                         'ro_RO.ISO8859-2',
        'ro_ro.iso88592':                'ro_RO.ISO8859-2',
        'ru':                            'ru_RU.ISO8859-5',
        'ru_ru':                         'ru_RU.ISO8859-5',
        'ru_ru.iso88595':                'ru_RU.ISO8859-5',
        'rumanian':                      'ro_RO.ISO8859-2',
        'russian':                       'ru_RU.ISO8859-5',
        'serbocroatian':                 'sh_YU.ISO8859-2',
        'sh':                            'sh_YU.ISO8859-2',
        'sh_hr.iso88592':                'sh_HR.ISO8859-2',
        'sh_sp':                         'sh_YU.ISO8859-2',
        'sh_yu':                         'sh_YU.ISO8859-2',
        'sk':                            'sk_SK.ISO8859-2',
        'sk_sk':                         'sk_SK.ISO8859-2',
        'sk_sk.iso88592':                'sk_SK.ISO8859-2',
        'sl':                            'sl_CS.ISO8859-2',
        'sl_cs':                         'sl_CS.ISO8859-2',
        'sl_si':                         'sl_SI.ISO8859-2',
        'sl_si.iso88592':                'sl_SI.ISO8859-2',
        'slovak':                        'sk_SK.ISO8859-2',
        'slovene':                       'sl_CS.ISO8859-2',
        'sp':                            'sp_YU.ISO8859-5',
        'sp_yu':                         'sp_YU.ISO8859-5',
        'spanish.iso88591':              'es_ES.ISO8859-1',
        'spanish.iso885915':             'es_ES.ISO8859-15',
        'spanish_spain.8859':            'es_ES.ISO8859-1',
        'sr_sp':                         'sr_SP.ISO8859-2',
        'sv':                            'sv_SE.ISO8859-1',
        'sv_se':                         'sv_SE.ISO8859-1',
        'sv_se.88591':                   'sv_SE.ISO8859-1',
        'sv_se.88591.en':                'sv_SE.ISO8859-1',
        'sv_se.885915':                  'sv_SE.ISO8859-15',
        'sv_se.885915.en':               'sv_SE.ISO8859-15',
        'sv_se.iso88591':                'sv_SE.ISO8859-1',
        'sv_se.iso885915':               'sv_SE.ISO8859-15',
        'sv_se.iso_8859-1':              'sv_SE.ISO8859-1',
        'sv_se.iso_8859-15':             'sv_SE.ISO8859-15',
        'swedish.iso88591':              'sv_SE.ISO8859-1',
        'swedish.iso885915':             'sv_SE.ISO8859-15',
        'th_th':                         'th_TH.TACTIS',
        'th_th.tis620':                  'th_TH.TACTIS',
        'tr':                            'tr_TR.ISO8859-9',
        'tr_tr':                         'tr_TR.ISO8859-9',
        'tr_tr.iso88599':                'tr_TR.ISO8859-9',
        'turkish.iso88599':              'tr_TR.ISO8859-9',
        'univ.utf8':                     'en_US.utf',
        'universal.utf8@ucs4':           'en_US.utf',
        'zh':                            'zh_CN.eucCN',
        'zh_cn':                         'zh_CN.eucCN',
        'zh_cn.big5':                    'zh_TW.eucTW',
        'zh_cn.euc':                     'zh_CN.eucCN',
        'zh_tw':                         'zh_TW.eucTW',
        'zh_tw.euc':                     'zh_TW.eucTW',
}

if __name__ == '__main__':

    categories = {}
    def _init_categories():
        for k,v in globals().items():
            if k[:3] == 'LC_':
                categories[k] = v
    _init_categories()

    print 'Locale defaults:'
    print '-'*72
    lang, enc = get_default()
    print 'Language: ', lang or '(undefined)'
    print 'Encoding: ', enc or '(undefined)'
    print

    print 'Locale settings on startup:'
    print '-'*72
    for name,category in categories.items():
        print name,'...'
        lang, enc = get_locale(category)
        print '   Language: ', lang or '(undefined)'
        print '   Encoding: ', enc or '(undefined)'
        print

    setlocale(LC_ALL,"")
    print
    print 'Locale settings after calling setlocale(LC_ALL,""):'
    print '-'*72
    for name,category in categories.items():
        print name,'...'
        lang, enc = get_locale(category)
        print '   Language: ', lang or '(undefined)'
        print '   Encoding: ', enc or '(undefined)'
        print
    

--------------FDA69223F7CCDED3D7828E2B--