[Python-checkins] CVS: python/dist/src/Lib locale.py,1.7,1.8
Fredrik Lundh
python-dev@python.org
Sun, 9 Jul 2000 10:13:00 -0700
Update of /cvsroot/python/python/dist/src/Lib
In directory slayer.i.sourceforge.net:/tmp/cvs-serv2501/Lib
Modified Files:
locale.py
Log Message:
- merged setlocale and set_locale. the internal setlocale
function is overridden by a python version which accepts
*either* a string (old behaviour) or a locale tuple.
- renamed a few methods (for consistency):
get_locale => getlocale
get_default_locale => getdefaultlocale
set_to_default => resetlocale (!)
- the _locale implementation module can now implement
an optional _getdefaultlocale function. if that function
isn't available, a POSIX-based approach is used (checking
LANG and other environment variables, as usual).
(patch #100765)
Index: locale.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/locale.py,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -r1.7 -r1.8
*** locale.py 2000/06/28 14:48:01 1.7
--- locale.py 2000/07/09 17:12:58 1.8
***************
*** 12,24 ****
"""
! import string
! ### Load C lib locale APIs or use an emulation
try:
from _locale import *
except ImportError:
CHAR_MAX = 127
LC_ALL = 6
--- 12,30 ----
"""
! import string, sys
! # Try importing the _locale module.
! #
! # If this fails, fall back on a basic 'C' locale emulation.
! #
try:
+
from _locale import *
except ImportError:
+ # Locale emulation
+
CHAR_MAX = 127
LC_ALL = 6
***************
*** 32,36 ****
def localeconv():
! """ localeconv() -> dict.
Returns numeric and monetary locale-specific parameters.
"""
--- 38,42 ----
def localeconv():
! """ localeconv() -> dict.
Returns numeric and monetary locale-specific parameters.
"""
***************
*** 39,69 ****
'currency_symbol': '',
'n_sign_posn': 127,
! 'p_cs_precedes': 127,
! 'n_cs_precedes': 127,
! 'mon_grouping': [],
'n_sep_by_space': 127,
'decimal_point': '.',
'negative_sign': '',
'positive_sign': '',
! 'p_sep_by_space': 127,
'int_curr_symbol': '',
! 'p_sign_posn': 127,
'thousands_sep': '',
! 'mon_thousands_sep': '',
! 'frac_digits': 127,
'mon_decimal_point': '',
'int_frac_digits': 127}
!
def setlocale(category, value=None):
! """ setlocale(integer,string=None) -> string.
Activates/queries locale processing.
"""
if value is not None and \
value is not 'C':
! raise Error,'_locale emulation only supports "C" locale'
return 'C'
def strcoll(a,b):
! """ strcoll(string,string) -> int.
Compares two strings according to the locale.
"""
--- 45,75 ----
'currency_symbol': '',
'n_sign_posn': 127,
! 'p_cs_precedes': 127,
! 'n_cs_precedes': 127,
! 'mon_grouping': [],
'n_sep_by_space': 127,
'decimal_point': '.',
'negative_sign': '',
'positive_sign': '',
! 'p_sep_by_space': 127,
'int_curr_symbol': '',
! 'p_sign_posn': 127,
'thousands_sep': '',
! 'mon_thousands_sep': '',
! 'frac_digits': 127,
'mon_decimal_point': '',
'int_frac_digits': 127}
!
def setlocale(category, value=None):
! """ setlocale(integer,string=None) -> string.
Activates/queries locale processing.
"""
if value is not None and \
value is not 'C':
! raise Error, '_locale emulation only supports "C" locale'
return 'C'
def strcoll(a,b):
! """ strcoll(string,string) -> int.
Compares two strings according to the locale.
"""
***************
*** 71,75 ****
def strxfrm(s):
! """ strxfrm(string) -> string.
Returns a string that behaves for cmp locale-aware.
"""
--- 77,81 ----
def strxfrm(s):
! """ strxfrm(string) -> string.
Returns a string that behaves for cmp locale-aware.
"""
***************
*** 87,91 ****
result=""
while s and grouping:
! # if grouping is -1, we are done
if grouping[0]==CHAR_MAX:
break
--- 93,97 ----
result=""
while s and grouping:
! # if grouping is -1, we are done
if grouping[0]==CHAR_MAX:
break
***************
*** 108,112 ****
def format(f,val,grouping=0):
"""Formats a value in the same way that the % formatting would use,
! but takes the current locale into account.
Grouping is applied if the third parameter is true."""
result = f % val
--- 114,118 ----
def format(f,val,grouping=0):
"""Formats a value in the same way that the % formatting would use,
! but takes the current locale into account.
Grouping is applied if the third parameter is true."""
result = f % val
***************
*** 119,124 ****
return fields[0]
else:
! raise Error,"Too many decimal points in result string"
!
def str(val):
"""Convert float to integer, taking the locale into account."""
--- 125,130 ----
return fields[0]
else:
! raise Error, "Too many decimal points in result string"
!
def str(val):
"""Convert float to integer, taking the locale into account."""
***************
*** 136,140 ****
if dd:
s=string.split(str,dd)
! str=string.join(s,'.')
#finally, parse the string
return func(str)
--- 142,146 ----
if dd:
s=string.split(str,dd)
! str=string.join(s, '.')
#finally, parse the string
return func(str)
***************
*** 145,159 ****
def _test():
! setlocale(LC_ALL,"")
#do grouping
! s1=format("%d",123456789,1)
! print s1,"is",atoi(s1)
#standard formatting
s1=str(3.14)
! print s1,"is",atof(s1)
### Locale name aliasing engine
# Author: Marc-Andre Lemburg, mal@lemburg.com
def normalize(localename):
--- 151,170 ----
def _test():
! setlocale(LC_ALL, "")
#do grouping
! s1=format("%d", 123456789,1)
! print s1, "is", atoi(s1)
#standard formatting
s1=str(3.14)
! print s1, "is", atof(s1)
### Locale name aliasing engine
# Author: Marc-Andre Lemburg, mal@lemburg.com
+ # Various tweaks by Fredrik Lundh <effbot@telia.com>
+
+ # store away the low-level version of setlocale (it's
+ # overridden below)
+ _setlocale = setlocale
def normalize(localename):
***************
*** 230,234 ****
return None, None
else:
! raise ValueError,'unknown locale: %s' % localename
return l
--- 241,245 ----
return None, None
else:
! raise ValueError, 'unknown locale: %s' % localename
return l
***************
*** 248,253 ****
else:
return language + '.' + encoding
!
! def get_default(envvars=('LANGUAGE', 'LC_ALL', 'LC_CTYPE', 'LANG')):
""" Tries to determine the default locale settings and returns
--- 259,264 ----
else:
return language + '.' + encoding
!
! def getdefaultlocale(envvars=('LANGUAGE', 'LC_ALL', 'LC_CTYPE', 'LANG')):
""" Tries to determine the default locale settings and returns
***************
*** 255,260 ****
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
--- 266,271 ----
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
***************
*** 272,275 ****
--- 283,297 ----
"""
+ try:
+ # check if it's supported by the _locale module
+ import _locale
+ code, encoding = _locale._getdefaultlocale()
+ if sys.platform == "win32" and code and code[:2] == "0x":
+ # map windows language identifier to language name
+ code = windows_locale.get(int(code, 0))
+ return code, encoding
+ except (ImportError, NameError):
+ pass
+ # fall back on POSIX behaviour
import os
lookup = os.environ.get
***************
*** 281,286 ****
localename = 'C'
return _parse_localename(localename)
! def get_locale(category=LC_CTYPE):
""" Returns the current setting for the given locale category as
--- 303,311 ----
localename = 'C'
return _parse_localename(localename)
+
+ # compatibility
+ get_default = getdefaultlocale
! def getlocale(category=LC_CTYPE):
""" Returns the current setting for the given locale category as
***************
*** 295,326 ****
"""
! localename = setlocale(category)
if category == LC_ALL and ';' in localename:
! raise TypeError,'category LC_ALL is not supported'
return _parse_localename(localename)
! def set_locale(localetuple, category=LC_ALL):
! """ Set the locale according to the localetuple (language code,
! encoding) as returned by get_locale() and get_default().
! The given codes are passed through the locale aliasing engine
! before being given to setlocale() for processing.
! category may be given as one of the LC_* values. It defaults
! to LC_ALL.
"""
! setlocale(category, normalize(_build_localename(localetuple)))
! def set_to_default(category=LC_ALL):
""" Sets the locale for category to the default setting.
The default setting is determined by calling
! get_default(). category defaults to LC_ALL.
!
"""
! setlocale(category, _build_localename(get_default()))
### Database
--- 320,353 ----
"""
! localename = _setlocale(category)
if category == LC_ALL and ';' in localename:
! raise TypeError, 'category LC_ALL is not supported'
return _parse_localename(localename)
! def setlocale(category, locale=None):
! """ Set the locale for the given category. The locale can be
! a string, a locale tuple (language code, encoding), or None.
! Locale tuples are converted to strings the locale aliasing
! engine. Locale strings are passed directly to the C lib.
! category may be given as one of the LC_* values.
"""
! if locale and type(locale) is not type(""):
! # convert to string
! locale = normalize(_build_localename(locale))
! return _setlocale(category, locale)
! def resetlocale(category=LC_ALL):
""" Sets the locale for category to the default setting.
The default setting is determined by calling
! getdefaultlocale(). category defaults to LC_ALL.
!
"""
! _setlocale(category, _build_localename(getdefaultlocale()))
### Database
***************
*** 330,334 ****
# definitions and adding some more aliases. The file is usually
# available as /usr/lib/X11/locale/locale.alias.
! #
#
--- 357,361 ----
# definitions and adding some more aliases. The file is usually
# available as /usr/lib/X11/locale/locale.alias.
! #
#
***************
*** 337,374 ****
#
encoding_alias = {
! '437': 'C',
! 'c': 'C',
! 'iso8859': 'ISO8859-1',
! '8859': 'ISO8859-1',
! '88591': 'ISO8859-1',
! 'ascii': 'ISO8859-1',
! 'en': 'ISO8859-1',
! 'iso88591': 'ISO8859-1',
! 'iso_8859-1': 'ISO8859-1',
! '885915': 'ISO8859-15',
! 'iso885915': 'ISO8859-15',
! 'iso_8859-15': 'ISO8859-15',
! 'iso8859-2': 'ISO8859-2',
! 'iso88592': 'ISO8859-2',
! 'iso_8859-2': 'ISO8859-2',
! 'iso88595': 'ISO8859-5',
! 'iso88596': 'ISO8859-6',
! 'iso88597': 'ISO8859-7',
! 'iso88598': 'ISO8859-8',
! 'iso88599': 'ISO8859-9',
! 'iso-2022-jp': 'JIS7',
! 'jis': 'JIS7',
! 'jis7': 'JIS7',
! 'sjis': 'SJIS',
! 'tis620': 'TACTIS',
! 'ajec': 'eucJP',
! 'eucjp': 'eucJP',
! 'ujis': 'eucJP',
! 'utf-8': 'utf',
! 'utf8': 'utf',
! 'utf8@ucs4': 'utf',
}
! #
# The locale_alias table maps lowercase alias names to C locale names
# (case-sensitive). Encodings are always separated from the locale
--- 364,401 ----
#
encoding_alias = {
! '437': 'C',
! 'c': 'C',
! 'iso8859': 'ISO8859-1',
! '8859': 'ISO8859-1',
! '88591': 'ISO8859-1',
! 'ascii': 'ISO8859-1',
! 'en': 'ISO8859-1',
! 'iso88591': 'ISO8859-1',
! 'iso_8859-1': 'ISO8859-1',
! '885915': 'ISO8859-15',
! 'iso885915': 'ISO8859-15',
! 'iso_8859-15': 'ISO8859-15',
! 'iso8859-2': 'ISO8859-2',
! 'iso88592': 'ISO8859-2',
! 'iso_8859-2': 'ISO8859-2',
! 'iso88595': 'ISO8859-5',
! 'iso88596': 'ISO8859-6',
! 'iso88597': 'ISO8859-7',
! 'iso88598': 'ISO8859-8',
! 'iso88599': 'ISO8859-9',
! 'iso-2022-jp': 'JIS7',
! 'jis': 'JIS7',
! 'jis7': 'JIS7',
! 'sjis': 'SJIS',
! 'tis620': 'TACTIS',
! 'ajec': 'eucJP',
! 'eucjp': 'eucJP',
! 'ujis': 'eucJP',
! 'utf-8': 'utf',
! 'utf8': 'utf',
! 'utf8@ucs4': 'utf',
}
! #
# The locale_alias table maps lowercase alias names to C locale names
# (case-sensitive). Encodings are always separated from the locale
***************
*** 562,565 ****
--- 589,632 ----
}
+ #
+ # this maps windows language identifiers (as used on Windows 95 and
+ # earlier) to locale strings.
+ #
+ # NOTE: this mapping is incomplete. If your language is missing, send
+ # a note with the missing language identifier and the suggested locale
+ # code to Fredrik Lundh <effbot@telia.com>. Thanks /F
+
+ windows_locale = {
+ 0x0404: "zh_TW", # Chinese (Taiwan)
+ 0x0804: "zh_CN", # Chinese (PRC)
+ 0x0406: "da_DK", # Danish
+ 0x0413: "nl_NL", # Dutch (Netherlands)
+ 0x0409: "en_US", # English (United States)
+ 0x0809: "en_UK", # English (United Kingdom)
+ 0x0c09: "en_AU", # English (Australian)
+ 0x1009: "en_CA", # English (Canadian)
+ 0x1409: "en_NZ", # English (New Zealand)
+ 0x1809: "en_IE", # English (Ireland)
+ 0x1c09: "en_ZA", # English (South Africa)
+ 0x040b: "fi_FI", # Finnish
+ 0x040c: "fr_FR", # French (Standard)
+ 0x080c: "fr_BE", # French (Belgian)
+ 0x0c0c: "fr_CA", # French (Canadian)
+ 0x100c: "fr_CH", # French (Switzerland)
+ 0x0407: "de_DE", # German (Standard)
+ 0x0408: "el_GR", # Greek
+ 0x040d: "iw_IL", # Hebrew
+ 0x040f: "is_IS", # Icelandic
+ 0x0410: "it_IT", # Italian (Standard)
+ 0x0411: "ja_JA", # Japanese
+ 0x0414: "no_NO", # Norwegian (Bokmal)
+ 0x0816: "pt_PT", # Portuguese (Standard)
+ 0x0c0a: "es_ES", # Spanish (Modern Sort)
+ 0x0441: "sw_KE", # Swahili (Kenya)
+ 0x041d: "sv_SE", # Swedish
+ 0x081d: "sv_FI", # Swedish (Finland)
+ 0x041f: "tr_TR", # Turkish
+ }
+
def _print_locale():
***************
*** 574,580 ****
del categories['LC_ALL']
! print 'Locale defaults as determined by get_default():'
print '-'*72
! lang, enc = get_default()
print 'Language: ', lang or '(undefined)'
print 'Encoding: ', enc or '(undefined)'
--- 641,647 ----
del categories['LC_ALL']
! print 'Locale defaults as determined by getdefaultlocale():'
print '-'*72
! lang, enc = getdefaultlocale()
print 'Language: ', lang or '(undefined)'
print 'Encoding: ', enc or '(undefined)'
***************
*** 584,621 ****
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
- set_to_default()
print
! print 'Locale settings after calling set_to_default():'
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
!
try:
! setlocale(LC_ALL,"")
except:
print 'NOTE:'
! print 'setlocale(LC_ALL,"") does not support the default locale'
print 'given in the OS environment variables.'
else:
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
!
###
--- 651,688 ----
print '-'*72
for name,category in categories.items():
! print name, '...'
! lang, enc = getlocale(category)
print ' Language: ', lang or '(undefined)'
print ' Encoding: ', enc or '(undefined)'
print
print
! print 'Locale settings after calling resetlocale():'
print '-'*72
+ resetlocale()
for name,category in categories.items():
! print name, '...'
! lang, enc = getlocale(category)
print ' Language: ', lang or '(undefined)'
print ' Encoding: ', enc or '(undefined)'
print
!
try:
! setlocale(LC_ALL, "")
except:
print 'NOTE:'
! print 'setlocale(LC_ALL, "") does not support the default locale'
print 'given in the OS environment variables.'
else:
print
! print 'Locale settings after calling setlocale(LC_ALL, ""):'
print '-'*72
for name,category in categories.items():
! print name, '...'
! lang, enc = getlocale(category)
print ' Language: ', lang or '(undefined)'
print ' Encoding: ', enc or '(undefined)'
print
!
###