8175: date inflections in _datahandler.py

This commit is contained in:
Paul Franklin 2014-11-22 16:05:32 -08:00
parent a7bffb9259
commit 0436228eb1
3 changed files with 235 additions and 121 deletions

View File

@ -119,6 +119,23 @@ class DateDisplayRU(DateDisplay):
display = DateDisplay.display_formatted
def dd_dformat04(self, date_val, inflect, long_months):
"""
day month_name year -- for Russian locale
"""
year = self._slash_year(date_val[2], date_val[3])
if date_val[0] == 0:
if date_val[1] == 0:
return year
else:
return self.format_long_month_year(date_val[1], year,
inflect, long_months)
else:
return "{day:d} {long_month.f[Р]} {year}".format(
day = date_val[0],
long_month = long_months[date_val[1]],
year = year)
#-------------------------------------------------------------------------
#
# Register classes

View File

@ -3,6 +3,8 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2004-2006 Donald N. Allingham
# Copyright (C) 2013 Vassilii Khachaturov
# Copyright (C) 2014 Paul Franklin
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -65,7 +67,7 @@ class DateDisplay(object):
# such as YY.MM.DD, MM-DD-YY, or whatever your locale prefers.
# This should be the format that is used under the locale by
# strftime() for '%x'.
# You may translate this string as "Numerical", "System preferred", or similar.
# You may translate this as "Numerical", "System preferred", or similar.
_("date format|Numerical"),
# Full month name, day, year
@ -83,10 +85,11 @@ class DateDisplay(object):
"""
.. note:: Will be overridden if a locale-specific date displayer exists.
If your localized :meth:`~_display_calendar`/:meth:`~_display_gregorian` are
overridden,you should override the whole formats list according to your own
formats, and you need not localize the format names here. This ``formats``
must agree with :meth:`~_display_calendar`/:meth:`~_display_gregorian`.
If your localized :meth:`~_display_calendar`/:meth:`~_display_gregorian`
are overridden, you should override the whole formats list according
to your own formats, and you need not localize the format names here.
This ``formats`` must agree with
:meth:`~_display_calendar`/:meth:`~_display_gregorian`.
"""
del _
@ -182,18 +185,21 @@ class DateDisplay(object):
: _("and|{long_month} {year}"),
"before"
# You only need to translate this string if you translate one of the
# inflect=_("...") with "before"
# If "before <Month>" needs a special inflection in your
# language, translate this to "{long_month.f[X]} {year}"
# (where X is one of the month-name inflections you defined)
: _("before|{long_month} {year}"),
"after"
# You only need to translate this string if you translate one of the
# inflect=_("...") with "after"
# If "after <Month>" needs a special inflection in your
# language, translate this to "{long_month.f[X]} {year}"
# (where X is one of the month-name inflections you defined)
: _("after|{long_month} {year}"),
"about"
# You only need to translate this string if you translate one of the
# inflect=_("...") with "about"
# If "about <Month>" needs a special inflection in your
# language, translate this to "{long_month.f[X]} {year}"
# (where X is one of the month-name inflections you defined)
: _("about|{long_month} {year}"),
# TODO if no modifier, but with qual, might need to inflect in some lang.
@ -220,12 +226,21 @@ class DateDisplay(object):
: _("and|{short_month} {year}"),
"before"
# If "before <Month>" needs a special inflection in your
# language, translate this to "{short_month.f[X]} {year}"
# (where X is one of the month-name inflections you defined)
: _("before|{short_month} {year}"),
"after"
# If "after <Month>" needs a special inflection in your
# language, translate this to "{short_month.f[X]} {year}"
# (where X is one of the month-name inflections you defined)
: _("after|{short_month} {year}"),
"about"
# If "about <Month>" needs a special inflection in your
# language, translate this to "{short_month.f[X]} {year}"
# (where X is one of the month-name inflections you defined)
: _("about|{short_month} {year}"),
}
@ -257,8 +272,9 @@ class DateDisplay(object):
"""
Return a text string representing the date.
(Will be overridden if a locale-specific date displayer exists.)
Disregard any format settings and use display_iso for each date.
(Will be overridden if a locale-specific date displayer exists.)
"""
mod = date.get_modifier()
cal = date.get_calendar()
@ -374,15 +390,24 @@ class DateDisplay(object):
date_stop=d2,
nonstd_calendar_and_ny=scal)
else:
text = self.display_cal[date.get_calendar()](start,
# If there is no special inflection for "before/after/around <Month>" in your
# language, don't translate this string.
# Otherwise, translate it to the ENGLISH!!! ENGLISH!!!
# key appearing above in the FORMATS_... dict
# that maps to the special inflected format string that you need to localize.
# TODO are there languages for which the inflections for the different
# modifiers are different?!
inflect=_("before-date|") if mod != Date.MOD_NONE else "")
if mod == Date.MOD_BEFORE:
# If there is no special inflection for "before <Month>"
# in your language, DON'T translate this string. Otherwise,
# "translate" this to "before" in ENGLISH!!! ENGLISH!!!
date_type = _("before-date|")
elif mod == Date.MOD_AFTER:
# If there is no special inflection for "after <Month>"
# in your language, DON'T translate this string. Otherwise,
# "translate" this to "after" in ENGLISH!!! ENGLISH!!!
date_type = _("after-date|")
elif mod == Date.MOD_ABOUT:
# If there is no special inflection for "about <Month>"
# in your language, DON'T translate this string. Otherwise,
# "translate" this to "about" in ENGLISH!!! ENGLISH!!!
date_type = _("about-date|")
else:
date_type = ""
text = self.display_cal[cal](start, inflect=date_type)
scal = self.format_extras(cal, newyear)
return _("{date_quality}{noncompound_modifier}{date}"
"{nonstd_calendar_and_ny}").format(
@ -398,104 +423,167 @@ class DateDisplay(object):
# Julian and Swedish date display is the same as Gregorian
_display_julian = _display_swedish = _display_gregorian
def format_long_month_year(self, month, year, inflect, long_months):
return self.FORMATS_long_month_year[inflect].format(
long_month = long_months[month],
year = year)
def format_short_month_year(self, month, year, inflect, short_months):
return self.FORMATS_short_month_year[inflect].format(
short_month = short_months[month],
year = year)
def format_long_month(self, month, inflect, long_months):
return self.FORMATS_long_month_year[inflect].format(
long_month = long_months[month], year = '').rstrip()
def format_short_month(self, month, inflect, short_months):
return self.FORMATS_short_month_year[inflect].format(
short_month = short_months[month], year = '').rstrip()
def dd_dformat01(self, date_val):
"""
numerical
this must agree with DateDisplayEn's "formats" definition
(it may be overridden if a locale-specific date displayer exists)
"""
if date_val[3]:
return self.display_iso(date_val)
else:
if date_val[0] == date_val[1] == 0:
return str(date_val[2])
else:
value = self._tformat.replace('%m', str(date_val[1]))
value = value.replace('%d', str(date_val[0]))
value = value.replace('%Y', str(abs(date_val[2])))
return value.replace('-', '/')
def dd_dformat02(self, date_val, inflect, long_months):
"""
month_name day, year
this must agree with DateDisplayEn's "formats" definition
(it may be overridden if a locale-specific date displayer exists)
"""
_ = self._locale.translation.sgettext
year = self._slash_year(date_val[2], date_val[3])
if date_val[0] == 0:
if date_val[1] == 0:
return year
else:
return self.format_long_month_year(date_val[1], year,
inflect, long_months)
else:
# TRANSLATORS: this month is ALREADY inflected: ignore it
return _("{long_month} {day:d}, {year}").format(
long_month = self.format_long_month(date_val[1],
inflect,
long_months),
day = date_val[0],
year = year)
def dd_dformat03(self, date_val, inflect, short_months):
"""
month_abbreviation day, year
this must agree with DateDisplayEn's "formats" definition
(it may be overridden if a locale-specific date displayer exists)
"""
_ = self._locale.translation.sgettext
year = self._slash_year(date_val[2], date_val[3])
if date_val[0] == 0:
if date_val[1] == 0:
return year
else:
return self.format_short_month_year(date_val[1], year,
inflect, short_months)
else:
# TRANSLATORS: this month is ALREADY inflected: ignore it
return _("{short_month} {day:d}, {year}").format(
short_month = self.format_short_month(date_val[1],
inflect,
short_months),
day = date_val[0],
year = year)
def dd_dformat04(self, date_val, inflect, long_months):
"""
day month_name year
this must agree with DateDisplayEn's "formats" definition
(it may be overridden if a locale-specific date displayer exists)
"""
_ = self._locale.translation.sgettext
year = self._slash_year(date_val[2], date_val[3])
if date_val[0] == 0:
if date_val[1] == 0:
return year
else:
return self.format_long_month_year(date_val[1], year,
inflect, long_months)
else:
# TRANSLATORS: this month is ALREADY inflected: ignore it
return _("{day:d} {long_month} {year}").format(
day = date_val[0],
long_month = self.format_long_month(date_val[1],
inflect,
long_months),
year = year)
def dd_dformat05(self, date_val, inflect, short_months):
"""
day month_abbreviation year
this must agree with DateDisplayEn's "formats" definition
(it may be overridden if a locale-specific date displayer exists)
"""
_ = self._locale.translation.sgettext
year = self._slash_year(date_val[2], date_val[3])
if date_val[0] == 0:
if date_val[1] == 0:
return year
else:
return self.format_short_month_year(date_val[1], year,
inflect, short_months)
else:
# TRANSLATORS: this month is ALREADY inflected: ignore it
return _("{day:d} {short_month} {year}").format(
day = date_val[0],
short_month = self.format_short_month(date_val[1],
inflect,
short_months),
year = year)
def _display_calendar(self, date_val, long_months, short_months = None,
inflect=""):
inflect=""):
"""
this must agree with DateDisplayEn's "formats" definition
(it may be overridden if a locale-specific date displayer exists)
"""
if short_months is None:
# Let the short formats work the same as long formats
short_months = long_months
_ = self._locale.translation.sgettext
# this one must agree with DateDisplayEn's "formats" definition
# (it may be overridden if a locale-specific date displayer exists)
year = self._slash_year(date_val[2], date_val[3])
# For partial dates, several formats reduce to just month + year.
def format_long_month_year():
return self.FORMATS_long_month_year[inflect].format(
long_month = long_months[date_val[1]],
year = year)
def format_short_month_year():
return self.FORMATS_short_month_year[inflect].format(
short_month = short_months[date_val[1]],
year = year)
if self.format == 0:
return self.display_iso(date_val)
elif self.format == 1:
# numerical
if date_val[3]:
return self.display_iso(date_val)
else:
if date_val[0] == date_val[1] == 0:
value = str(date_val[2])
else:
value = self._tformat.replace('%m', str(date_val[1]))
value = value.replace('%d', str(date_val[0]))
value = value.replace('%Y', str(abs(date_val[2])))
value = value.replace('-', '/')
value = self.dd_dformat01(date_val)
elif self.format == 2:
# month_name day, year
if date_val[0] == 0:
if date_val[1] == 0:
value = year
else:
value = format_long_month_year()
else:
# TRANSLATORS: see
# http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
# to learn how to select proper inflection for your language.
value = _("{long_month} {day:d}, {year}").format(
long_month = long_months[date_val[1]],
day = date_val[0],
year = year)
value = self.dd_dformat02(date_val, inflect, long_months)
elif self.format == 3:
# month_abbreviation day, year
if date_val[0] == 0:
if date_val[1] == 0:
value = year
else:
value = format_short_month_year()
else:
# TRANSLATORS: see
# http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
# to learn how to select proper inflection for your language.
value = _("{short_month} {day:d}, {year}").format(
short_month = short_months[date_val[1]],
day = date_val[0],
year = year)
value = self.dd_dformat03(date_val, inflect, short_months)
elif self.format == 4:
# day month_name year
if date_val[0] == 0:
if date_val[1] == 0:
value = year
else:
value = format_long_month_year()
else:
# TRANSLATORS: see
# http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
# to learn how to select proper inflection for your language.
value = _("{day:d} {long_month} {year}").format(
day = date_val[0],
long_month = long_months[date_val[1]],
year = year)
value = self.dd_dformat04(date_val, inflect, long_months)
# elif self.format == 5:
else:
# day month_abbreviation year
if date_val[0] == 0:
if date_val[1] == 0:
value = year
else:
value = format_short_month_year()
else:
# TRANSLATORS: see
# http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
# to learn how to select proper inflection for your language.
value = _("{day:d} {short_month} {year}").format(
short_month = short_months[date_val[1]],
day = date_val[0],
year = year)
value = self.dd_dformat05(date_val, inflect, short_months)
if date_val[2] < 0:
# TODO fix BUG 7064: non-Gregorian calendars wrongly use BCE notation for negative dates
return self._bce_str % value

View File

@ -958,20 +958,23 @@ msgstr "{long_month.f[Т]} {year}"
msgid "and|{long_month} {year}"
msgstr ""
#. You only need to translate this string if you translate one of the
#. inflect=_("...") with "before"
#. If "before <Month>" needs a special inflection in your
#. language, translate this to "{long_month.f[X]} {year}"
#. (where X is one of the month-name inflections you defined)
#: ../gramps/gen/datehandler/_datedisplay.py:188
msgid "before|{long_month} {year}"
msgstr "{long_month.f[Р]} {year}"
#. You only need to translate this string if you translate one of the
#. inflect=_("...") with "after"
#. If "after <Month>" needs a special inflection in your
#. language, translate this to "{long_month.f[X]} {year}"
#. (where X is one of the month-name inflections you defined)
#: ../gramps/gen/datehandler/_datedisplay.py:193
msgid "after|{long_month} {year}"
msgstr "{long_month.f[Р]} {year}"
#. You only need to translate this string if you translate one of the
#. inflect=_("...") with "about"
#. If "about <Month>" needs a special inflection in your
#. language, translate this to "{long_month.f[X]} {year}"
#. (where X is one of the month-name inflections you defined)
#: ../gramps/gen/datehandler/_datedisplay.py:198
msgid "about|{long_month} {year}"
msgstr "{long_month.f[Р]} {year}"
@ -1057,17 +1060,27 @@ msgid ""
"{date_quality}between {date_start} and {date_stop}{nonstd_calendar_and_ny}"
msgstr "{date_quality}между {date_start} и {date_stop}{nonstd_calendar_and_ny}"
#. If there is no special inflection for "before/after/around <Month>" in your
#. language, don't translate this string.
#. Otherwise, translate it to the ENGLISH!!! ENGLISH!!!
#. key appearing above in the FORMATS_... dict
#. that maps to the special inflected format string that you need to localize.
#. TODO are there languages for which the inflections for the different
#. modifiers are different?!
#. If there is no special inflection for "before <Month>"
#. in your language, DON'T translate this string. Otherwise,
#. "translate" this to "before" in ENGLISH!!! ENGLISH!!!
#: ../gramps/gen/datehandler/_datedisplay.py:386
msgid "before-date|"
msgstr "before"
#. If there is no special inflection for "after <Month>"
#. in your language, DON'T translate this string. Otherwise,
#. "translate" this to "after" in ENGLISH!!! ENGLISH!!!
#: ../gramps/gen/datehandler/_datedisplay.py:394
msgid "after-date|"
msgstr "after"
#. If there is no special inflection for "about <Month>"
#. in your language, DON'T translate this string. Otherwise,
#. "translate" this to "about" in ENGLISH!!! ENGLISH!!!
#: ../gramps/gen/datehandler/_datedisplay.py:403
msgid "about-date|"
msgstr "about"
#: ../gramps/gen/datehandler/_datedisplay.py:388
msgid "{date_quality}{noncompound_modifier}{date}{nonstd_calendar_and_ny}"
msgstr ""
@ -1086,19 +1099,15 @@ msgstr "{long_month} {day:d}, {year}"
msgid "{short_month} {day:d}, {year}"
msgstr "{short_month} {day:d}, {year}"
#. TRANSLATORS: see
#. http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
#. to learn how to select proper inflection for your language.
#. TRANSLATORS: this month is ALREADY inflected: ignore it
#: ../gramps/gen/datehandler/_datedisplay.py:480
msgid "{day:d} {long_month} {year}"
msgstr "{day:d} {long_month.f[Р]} {year}"
msgstr "{day:d} {long_month} {year}"
#. TRANSLATORS: see
#. http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
#. to learn how to select proper inflection for your language.
#. TRANSLATORS: this month is ALREADY inflected: ignore it
#: ../gramps/gen/datehandler/_datedisplay.py:496
msgid "{day:d} {short_month} {year}"
msgstr "{day:d} {short_month.f[Р]} {year}"
msgstr "{day:d} {short_month} {year}"
#. TRANSLATORS: see
#. http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates