Bug 6538: Collation variants do not work properly
If ICU is available, inspect the environment for $COLLATION and on a Mac also check the AppleCollationOrder default. Pass the results to a special ICU Locale used for sorting.
This commit is contained in:
parent
80c58f46d3
commit
49cdfe3283
@ -237,10 +237,10 @@ class GrampsLocale(object):
|
|||||||
if not self.language:
|
if not self.language:
|
||||||
self.language = [self.lang[:5]]
|
self.language = [self.lang[:5]]
|
||||||
|
|
||||||
if 'LC_COLLATE' in os.environ:
|
if 'COLLATION' in os.environ:
|
||||||
coll = os.environ['LC_COLLATE']
|
coll = os.environ['COLLATION']
|
||||||
if HAVE_ICU:
|
if HAVE_ICU:
|
||||||
if coll[:5] in ICU_LOCALES:
|
if coll[:2] in ICU_LOCALES:
|
||||||
self.collation = coll
|
self.collation = coll
|
||||||
else:
|
else:
|
||||||
self.collation = self.lang
|
self.collation = self.lang
|
||||||
@ -347,6 +347,9 @@ class GrampsLocale(object):
|
|||||||
else:
|
else:
|
||||||
self.collation = self.lang
|
self.collation = self.lang
|
||||||
|
|
||||||
|
if HAVE_ICU and 'COLLATION' in os.environ:
|
||||||
|
self.collation = os.environ['COLLATION']
|
||||||
|
|
||||||
loc = locale.getlocale(locale.LC_NUMERIC)
|
loc = locale.getlocale(locale.LC_NUMERIC)
|
||||||
if loc and loc[0]:
|
if loc and loc[0]:
|
||||||
self.numeric = '.'.join(loc)
|
self.numeric = '.'.join(loc)
|
||||||
@ -547,9 +550,6 @@ class GrampsLocale(object):
|
|||||||
else:
|
else:
|
||||||
self.language = None
|
self.language = None
|
||||||
|
|
||||||
#For alternate collation sequences. Works only with ICU, and
|
|
||||||
#set only on Macs.
|
|
||||||
self.coll_qualifier = None
|
|
||||||
_first = self._GrampsLocale__first_instance
|
_first = self._GrampsLocale__first_instance
|
||||||
if self == _first:
|
if self == _first:
|
||||||
self._GrampsLocale__init_first_instance()
|
self._GrampsLocale__init_first_instance()
|
||||||
@ -616,7 +616,7 @@ class GrampsLocale(object):
|
|||||||
if not languages or len(languages) == 0:
|
if not languages or len(languages) == 0:
|
||||||
LOG.warning("No language provided, using US English")
|
LOG.warning("No language provided, using US English")
|
||||||
else:
|
else:
|
||||||
raise ValueError("No usable translations in %s" %
|
raise ValueError("No usable translations in %s for " %
|
||||||
':'.join(languages))
|
':'.join(languages))
|
||||||
translator = GrampsNullTranslations()
|
translator = GrampsNullTranslations()
|
||||||
translator._language = "en"
|
translator._language = "en"
|
||||||
|
@ -194,24 +194,27 @@ def mac_setup_localization(glocale):
|
|||||||
"""
|
"""
|
||||||
Extract the collation (sort order) locale from the defaults string.
|
Extract the collation (sort order) locale from the defaults string.
|
||||||
"""
|
"""
|
||||||
apple_collation = _mac_get_gramps_defaults("Gramps", "AppleCollationOrder")
|
# The locale module can't deal with collation-qualified
|
||||||
|
# locales and setting one blows up setlocale, so we use
|
||||||
|
# $COLLATION directly instead.
|
||||||
|
if ('COLLATION') in os.environ:
|
||||||
|
apple_collation = os.environ['COLLATION']
|
||||||
|
else:
|
||||||
|
apple_collation = _mac_get_gramps_defaults("Gramps",
|
||||||
|
"AppleCollationOrder")
|
||||||
if not apple_collation:
|
if not apple_collation:
|
||||||
apple_collation = _mac_get_gramps_defaults("Global",
|
apple_collation = _mac_get_gramps_defaults("Global",
|
||||||
"AppleCollationOrder")
|
"AppleCollationOrder")
|
||||||
|
|
||||||
if not apple_collation:
|
if not apple_collation:
|
||||||
return (None, None)
|
print('No apple collation')
|
||||||
|
return None
|
||||||
apple_collation = apple_collation.strip()
|
apple_collation = apple_collation.strip()
|
||||||
if not apple_collation or apple_collation.startswith("root"):
|
if not apple_collation or apple_collation.startswith("root"):
|
||||||
return (None, None)
|
print('No meaningful apple collation')
|
||||||
div = apple_collation.split(b"@")
|
return None
|
||||||
collation = div[0]
|
print('Got collation %s from defaults' % apple_collation)
|
||||||
qualifier = None
|
return apple_collation
|
||||||
if len(div) > 1:
|
|
||||||
parts = div[1].split(b"=")
|
|
||||||
if len(parts) == 2 and parts[0] == 'collation':
|
|
||||||
qualifier = parts[1]
|
|
||||||
return (collation, qualifier)
|
|
||||||
|
|
||||||
#The action starts here
|
#The action starts here
|
||||||
_locale = None
|
_locale = None
|
||||||
@ -234,12 +237,11 @@ def mac_setup_localization(glocale):
|
|||||||
(glocale.lang, glocale.currency, glocale.calendar) = _mac_get_locale()
|
(glocale.lang, glocale.currency, glocale.calendar) = _mac_get_locale()
|
||||||
|
|
||||||
glocale.coll_qualifier = None
|
glocale.coll_qualifier = None
|
||||||
glocale.collation = locale.getlocale(locale.LC_COLLATE)[0]
|
glocale.collation = _mac_get_collation()
|
||||||
if not glocale.collation:
|
|
||||||
(glocale.collation, glocale.coll_qualifier) = _mac_get_collation()
|
|
||||||
|
|
||||||
if not glocale.lang and glocale.collation:
|
if not glocale.lang and glocale.collation:
|
||||||
glocale.lang = glocale.check_available_translations(glocale.collation)
|
coll_parts = glocale.collation.split('@')
|
||||||
|
glocale.lang = glocale.check_available_translations(coll_parts[0])
|
||||||
|
|
||||||
glocale.lang = locale.normalize(glocale.lang)
|
glocale.lang = locale.normalize(glocale.lang)
|
||||||
glocale.encoding = glocale.lang.split('.')[1]
|
glocale.encoding = glocale.lang.split('.')[1]
|
||||||
|
Loading…
Reference in New Issue
Block a user