Bug 9159: Date format does not match system.

Make US English a special-case locale with en_GB the default if the locale
is en_XX where XX != US.

Note that untranslated languages will still end up using the 'C' locale.
This commit is contained in:
John Ralls 2016-02-08 11:18:11 -08:00
parent 36da63b33e
commit 54e8ea0e39

View File

@ -120,6 +120,10 @@ def _check_mswin_locale(locale):
msloc = _LOCALE_NAMES[locale[:2]][:2] msloc = _LOCALE_NAMES[locale[:2]][:2]
locale = locale[:2] locale = locale[:2]
except KeyError: except KeyError:
#US English is the outlier, all other English locales want
#real English:
if locale[:2] == ('en') and locale[:5] != 'en_US':
return ('en_GB', '1252')
return (None, None) return (None, None)
return (locale, msloc) return (locale, msloc)
@ -127,7 +131,9 @@ def _check_mswin_locale_reverse(locale):
for (loc, msloc) in _LOCALE_NAMES.items(): for (loc, msloc) in _LOCALE_NAMES.items():
if msloc and locale == msloc[0]: if msloc and locale == msloc[0]:
return (loc, msloc[1]) return (loc, msloc[1])
#US English is the outlier, all other English locales want real English:
if locale.startswith('English') and locale != 'English_United States':
return ('en_GB', '1252')
return (None, None) return (None, None)
#------------------------------------------------------------------------ #------------------------------------------------------------------------
@ -284,6 +290,8 @@ class GrampsLocale(object):
if not locale[0]: if not locale[0]:
return False return False
lang = self.check_available_translations(locale[0]) lang = self.check_available_translations(locale[0])
if not lang and locale[0].startswith('en'):
locale[0] = lang = 'en_GB'
if not lang: if not lang:
return False return False
self.lang = locale[0] self.lang = locale[0]
@ -795,9 +803,11 @@ class GrampsLocale(object):
if locale[:5] in self.languages: if locale[:5] in self.languages:
return locale[:5] return locale[:5]
#US English is the outlier, all other English locales want real English:
if locale[:2] == 'en' and locale[:5] != 'en_US':
return 'en_GB'
if locale[:2] in self.languages: if locale[:2] in self.languages:
return locale[:2] return locale[:2]
return None return None
def get_language_dict(self): def get_language_dict(self):
@ -969,8 +979,8 @@ class Lexeme(str):
Prints out:: Prints out::
In English locale: In English locale:
CHRISTMAS CHRISTMAS
Christmas is celebrated in December Christmas is celebrated in December
Merry Christmas! Merry Christmas!
In Russian locale: In Russian locale:
@ -984,17 +994,17 @@ class Lexeme(str):
These forms are accessible under dictionary keys for each form. These forms are accessible under dictionary keys for each form.
The names of the forms are language-specific. They are assigned The names of the forms are language-specific. They are assigned
by the human translator of the corresponding language (in XX.po) by the human translator of the corresponding language (in XX.po)
as in the example above, as in the example above,
see :meth:`~GrampsTranslations.lexgettext` docs see :meth:`~GrampsTranslations.lexgettext` docs
for more info. for more info.
The translated format string can then refer to a specific form The translated format string can then refer to a specific form
of the lexeme using ``.``:attr:`~Lexeme.f` and square brackets: of the lexeme using ``.``:attr:`~Lexeme.f` and square brackets:
``{holiday.f[GENITIVE]}`` ``{holiday.f[GENITIVE]}``
expects holiday to be a Lexeme which has a form ``'GENITIVE'`` in it. expects holiday to be a Lexeme which has a form ``'GENITIVE'`` in it.
An instance of Lexeme can also be used as a regular unicode string. An instance of Lexeme can also be used as a regular unicode string.
In this case, the work will be delegated to the string for the very In this case, the work will be delegated to the string for the very
first form provided in the translated string. In the example above, first form provided in the translated string. In the example above,
``{holiday}`` in the translated string will expand to the Russian ``{holiday}`` in the translated string will expand to the Russian
nominative form for Christmas, and ``xmas.upper()`` will produce nominative form for Christmas, and ``xmas.upper()`` will produce
@ -1002,9 +1012,9 @@ class Lexeme(str):
.. rubric:: Motivation .. rubric:: Motivation
Lexeme is the term used in linguistics for the set of forms taken Lexeme is the term used in linguistics for the set of forms taken
by a particular word, e.g. cases for a noun or tenses for a verb. by a particular word, e.g. cases for a noun or tenses for a verb.
Gramps often needs to compose sentences from several blocks of Gramps often needs to compose sentences from several blocks of
text and single words, often by using python string formatting. text and single words, often by using python string formatting.
@ -1017,7 +1027,7 @@ class Lexeme(str):
enddate_month = m2, enddate_month = m2,
enddate_year = y2) enddate_year = y2)
To make such text translatable, the arguments injected into To make such text translatable, the arguments injected into
format string need to bear all the linguistical information format string need to bear all the linguistical information
on how to plug them into a sentence, i.e., the forms, depending on how to plug them into a sentence, i.e., the forms, depending
on the linguistic context of where the argument appears. on the linguistic context of where the argument appears.
@ -1026,8 +1036,8 @@ class Lexeme(str):
On the other hand, for languages where there is no linguistic On the other hand, for languages where there is no linguistic
variation in such sentences, the code needs not to be aware of variation in such sentences, the code needs not to be aware of
the underlying :class:`~Lexeme` complexity; the underlying :class:`~Lexeme` complexity;
and so they can be processed just like simple strings and so they can be processed just like simple strings
both when passed around in the code and when formatted. both when passed around in the code and when formatted.
""" """
@ -1037,7 +1047,7 @@ class Lexeme(str):
else: else:
od = collections.OrderedDict(iterable) od = collections.OrderedDict(iterable)
l = list(od.values()) or [""] l = list(od.values()) or [""]
newobj = str.__new__(cls, l[0], *args, **kwargs) newobj = str.__new__(cls, l[0], *args, **kwargs)
newobj._forms = od newobj._forms = od
return newobj return newobj
@ -1045,7 +1055,7 @@ class Lexeme(str):
"""All lexeme forms, in the same order as given upon construction. """All lexeme forms, in the same order as given upon construction.
The first one returned is the default form, which is used when the The first one returned is the default form, which is used when the
Lexeme instance is used in lieu of a string object. Lexeme instance is used in lieu of a string object.
Same as ``f.values()``""" Same as ``f.values()``"""
return self._forms.values() return self._forms.values()
@ -1126,7 +1136,7 @@ class GrampsTranslations(gettext.GNUTranslations):
stripping the '|'-separated context using :meth:`~sgettext` stripping the '|'-separated context using :meth:`~sgettext`
The *resulting* message provided by the translator The *resulting* message provided by the translator
is supposed to be '|'-separated as well. is supposed to be '|'-separated as well.
The possible formats are either (1) a single string The possible formats are either (1) a single string
for a language with no inflections, or (2) a list of for a language with no inflections, or (2) a list of
<inflection name>=<inflected form>, separated with '|'. <inflection name>=<inflected form>, separated with '|'.