Difference between revisions of "Test date handlers"

From Gramps
Jump to: navigation, search
m
(TO_CHECK)
 
(45 intermediate revisions by one other user not shown)
Line 2: Line 2:
  
 
List of date handlers is [[Handler_List|available]].
 
List of date handlers is [[Handler_List|available]].
 +
 +
=Date object into Gramps=
 +
 +
[[Dates]] in Gramps are much more complex than just a month, day, and year. Dates are always in a particular calendar, can span a time frame, can be approximate, and have support for many other subtleties specific to genealogy data.
 +
 +
=Lexeme inflections=
 +
 +
A '''lexeme''':
 +
# (''linguistics'') Roughly, the set of inflected forms taken by a single word, such as the lexeme ''RUN'' including as members "''run''" (lemma), "''running''" (inflected form), or "''ran''", and excluding "''runner''" (derived term).
 +
#(''computing'') an individual instance of a continuous character sequence without spaces, used in lexical analysis (token)
 +
 +
:source : https://en.wiktionary.org/wiki/lexeme
 +
 +
==Types of inflections==
 +
 +
{n: nominative}
 +
{g: genitive}
 +
{d: dative}
 +
 +
The '''nominative''' cases are found in Estonian, Slovak, Ukrainian, Hungarian, Lithuanian, Georgian, German, Latin, Greek, Icelandic, Old English, Old French, Polish, Serbian, Czech, Romanian, Russian, and Pashto, among other languages.
 +
 +
Many languages have a '''genitive''' case, including Albanian, Arabic, Armenian, Basque, Dutch, Estonian, Finnish, Georgian, German, Greek, Icelandic, Irish, Latin, Latvian, Lithuanian, Romanian, Sanskrit, Scottish Gaelic, Turkish and all Slavic languages except Bulgarian and Macedonian.
 +
 +
The '''dative''' was common among early Indo-European languages and has survived to the present in the Balto-Slavic branch and the Germanic branch, among others. It also exists in similar forms in several non-Indo-European languages, such as the Uralic family of languages, and Altaic languages.
 +
 +
==Examples==
 +
 +
#: ../gramps/gen/datehandler/_datestrings.py:70
 +
msgid "localized lexeme inflections||May"
 +
msgstr "И=май|Р=мая|Т=маем|П=мае"
 +
 +
==How it is used by Gramps==
 +
 +
Gramps extracts all inflections of the same lexeme, stripping the ‘|’, like for context.
 +
 +
The possible formats are either (1) a single string for a language with no inflections, or (2) a list of <inflection name>=<inflected form>, separated with ‘|’.
 +
 +
For example:
 +
 +
#“Uninflectable”
 +
#“n=Inflected-nominative|g=Inflected-genitive|d=Inflected-dative”
 +
 +
:See [https://gramps-project.org/docs/gen/gen_utils.html#gramps.gen.utils.grampslocale.GrampsTranslations.lexgettext lexgettext] for more details.
 +
 +
=Keys into translation strings=
 +
 +
==Related to month inflections==
 +
 +
#. If there is no special inflection for "from <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.
 +
#: ../gramps/gen/datehandler/_datedisplay.py:340
 +
msgid "from-date|"
 +
msgstr ""
 +
 +
#. If there is no special inflection for "and <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.
 +
#: ../gramps/gen/datehandler/_datedisplay.py:369
 +
msgid "and-date|"
 +
msgstr ""
 +
 +
#. 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?!
 +
#: ../gramps/gen/datehandler/_datedisplay.py:386
 +
msgid "before-date|"
 +
msgstr ""
 +
 +
''date'' on context is maybe confusing?
 +
What about: ''from-month|'', ''and-month|'', ''before-month|''?
 +
 +
#. TRANSLATORS: see
 +
#. http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
 +
#. to learn how to select proper inflection for your language.
 +
#: ../gramps/gen/datehandler/_datedisplay.py:450
 +
msgid "{long_month} {day:d}, {year}"
 +
msgstr ""
 +
 +
#. TRANSLATORS: see
 +
#. http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
 +
#. to learn how to select proper inflection for your language.
 +
#: ../gramps/gen/datehandler/_datedisplay.py:465
 +
msgid "{short_month} {day:d}, {year}"
 +
msgstr ""
 +
 +
#. TRANSLATORS: see
 +
#. http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
 +
#. to learn how to select proper inflection for your language.
 +
#: ../gramps/gen/datehandler/_datedisplay.py:480
 +
msgid "{day:d} {long_month} {year}"
 +
msgstr ""
 +
 +
#. TRANSLATORS: see
 +
#. http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
 +
#. to learn how to select proper inflection for your language.
 +
#: ../gramps/gen/datehandler/_datedisplay.py:496
 +
msgid "{day:d} {short_month} {year}"
 +
msgstr ""
 +
 +
Need new rules for supporting this type of key format into ''po/check_po'' script.
 +
 +
==Specific mapping==
 +
 +
#: ../gramps/gen/datehandler/_datedisplay.py:349
 +
msgid "{date_quality}from {date_start} to {date_stop}{nonstd_calendar_and_ny}"
 +
msgstr ""
 +
 +
return _("{date_quality}from {date_start} to {date_stop}"
 +
                    "{nonstd_calendar_and_ny}").format(
 +
                    date_quality=qual_str,
 +
                    date_start=d1,
 +
                    date_stop=d2,
 +
                    nonstd_calendar_and_ny=scal)
 +
 +
Why to use such a code, there?
 +
Same question for:
 +
 +
#: ../gramps/gen/datehandler/_datedisplay.py:371
 +
msgid ""
 +
"{date_quality}between {date_start} and {date_stop}{nonstd_calendar_and_ny}"
 +
msgstr ""
 +
 +
#: ../gramps/gen/datehandler/_datedisplay.py:388
 +
msgid "{date_quality}{noncompound_modifier}{date}{nonstd_calendar_and_ny}"
 +
msgstr ""
 +
 +
=Migrations and refactorings=
 +
 +
> $ PYTHONPATH=/usr/local/lib/python2.7/site-packages/ GRAMPS_RESOURCES=$PWD LANGUAGE=de
 +
python -m gramps.gen.datehandler._datestrings
 +
 +
LC_TIME={lang_region}.utf8 or LANGUAGE={lang} should match all [[Handler_List|available date handlers]].
 +
 +
See # {{bug|6926}} for patches.
 +
Git => revision [http://sourceforge.net/p/gramps/source/ci/918785ad58c6f2a575a7e51704bbaf44e7e63301 918785..]
 +
 +
=TO_CHECK=
  
  
Line 7: Line 153:
 
  GRAMPS_RESOURCES=$PWD python -m unittest discover -p 'date*test.py'
 
  GRAMPS_RESOURCES=$PWD python -m unittest discover -p 'date*test.py'
  
{| {{prettytable}}
+
{| class="wikitable sortable"
 
! locale
 
! locale
 
! score
 
! score
! stats
+
! date formats MAX:  8
 
|-
 
|-
 
|ar
 
|ar
Line 118: Line 264:
 
|}
 
|}
  
  > $ PYTHONPATH=/usr/local/lib/python2.7/site-packages/ LC_ALL=fr_FR.utf8 LANG=fr_FR.utf8
+
  > $ PYTHONPATH=/usr/local/lib/python2.7/site-packages/
 
  GRAMPS_RESOURCES=$PWD python -m gramps.gen.datehandler.__init__
 
  GRAMPS_RESOURCES=$PWD python -m gramps.gen.datehandler.__init__
ca: 6 (u'AAAA-MM-DD (ISO)', u'Num\xe8rica', u'Mes Dia, Any', u'MES Dia, Any', u'Dia Mes, Any', u'Dia MES, Any') own dg: False
 
CS: 6 (u'ISO (rrrr-mm-dd)', u'numerick\xfd', u'm\u011bs\xedc den, Rok', u'm\u011bs den, Rok', u'den. m\u011bs\xedc rok', u'den. m\u011bs rok') own dg: False
 
cs: 6 (u'ISO (rrrr-mm-dd)', u'numerick\xfd', u'm\u011bs\xedc den, Rok', u'm\u011bs den, Rok', u'den. m\u011bs\xedc rok', u'den. m\u011bs rok') own dg: False
 
sv: 6 (u'\xc5\xc5\xc5\xc5-MM-DD (ISO)', u'\xc5r/m\xe5n/dag', u'M\xe5nad dag, \xe5r', u'M\xc5N DAG \xc5R', u'Dag m\xe5nad \xe5r', u'DAG M\xc5N \xc5R') own dg: False
 
HR: 6 (u'AAAA-MM-JJ (ISO)', u'D\xe9faut syst\xe8me', u'Mois Jour, Ann\xe9e', u'MOI Jour, Ann\xe9e', u'Jour Mois Ann\xe9e', u'Jour MOI Ann\xe9e') own dg: False
 
lt: 3 (u'mmmm-MM-DD (ISO)', u'mmmm m. m\u0117nesio diena d.', u'M\u0117n diena, metai') own dg: True
 
sl: 4 (u'ISO (leto-mm-dd)', u'\u0161tevil\u010dno', u'dan. mes. leto', u'dan. mesec leto') own dg: True
 
hr: 6 (u'AAAA-MM-JJ (ISO)', u'D\xe9faut syst\xe8me', u'Mois Jour, Ann\xe9e', u'MOI Jour, Ann\xe9e', u'Jour Mois Ann\xe9e', u'Jour MOI Ann\xe9e') own dg: False
 
SK: 6 (u'RRRR-MM-DD (ISO)', u'numerick\xfd', u'Mesiac De\u0148, Rok', u'MES De\u0148, Rok', u'De\u0148, Mesiac, Rok', u'De\u0148 MES Rok') own dg: False
 
pl: 6 (u'RRRR-MM-DD (ISO)', u'Numeryczny', u'Miesi\u0105c Dzie\u0144, Rok', u'Dzie\u0144.Miesi\u0105c.Rok', u'Dzie\u0144 Miesi\u0105c Rok', u'Dzie\u0144 MieRzym Rok') own dg: True
 
uk: 6 (u'\u0440\u0440\u0440\u0440-\u043c\u043c-\u0434\u0434 (ISO)', u'\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0438\u0439 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0438 (\u0434/\u043c/\u0440)', u'\u043c\u0456\u0441\u044f\u0446\u044c \u0434\u0435\u043d\u044c, \u0440\u0456\u043a', u'\u043c\u0456\u0441. \u0434\u0434, \u0440\u0440\u0440\u0440', u'\u0434\u0435\u043d\u044c \u043c\u0456\u0441\u044f\u0446\u044c \u0440\u0456\u043a', u'\u0434\u0434 \u043c\u0456\u0441. \u0440\u0440\u0440\u0440') own dg: False
 
SL: 4 (u'ISO (leto-mm-dd)', u'\u0161tevil\u010dno', u'dan. mes. leto', u'dan. mesec leto') own dg: True
 
el: 5 (u'\u0395\u0395\u0395\u0395-\u039c\u039c-\u0397\u0397 (ISO)', u'\u0397\u0397-\u039c\u039c-\u0395\u0395\u0395\u0395', u'\u0397\u0397/\u039c\u039c/\u0395\u0395\u0395\u0395', u'\u0397\u0397 \u039c\u03ae\u03bd\u03b1\u03c2 \u0395\u0395\u0395\u0395', u'\u0397\u0397 \u039c\u03ae\u03bd \u0395\u0395\u0395\u0395') own dg: True
 
en: 6 (u'AAAA-MM-JJ (ISO)', u'D\xe9faut syst\xe8me', u'Mois Jour, Ann\xe9e', u'MOI Jour, Ann\xe9e', u'Jour Mois Ann\xe9e', u'Jour MOI Ann\xe9e') own dg: False
 
fr: 8 (u'AAAA-MM-JJ (ISO)', u'D\xe9faut syst\xe8me (J/M/A)', u'Jour Mois Ann\xe9e', u'Jour MOI Ann\xe9e', u'Jour. Mois Ann\xe9e', u'Jour. MOI Ann\xe9e', u'Mois Jour, Ann\xe9e', u'MOI Jour, Ann\xe9e') own dg: True
 
ar: 6 (u'YYYY-MM-DD (\u0642\u064a\u0627\u0633\u064a)', u'\u0639\u062f\u062f\u064a', u'\u0634\u0647\u0631 \u064a\u0648\u0645, \u0633\u0646\u0629', u'\u0634\u0647\u0631 \u064a\u0648\u0645, \u0633\u0646\u0629', u'\u064a\u0648\u0645 \u0634\u0647\u0631 \u0633\u0646\u0629', u'\u064a\u0648\u0645 \u0634\u0647\u0631 \u0633\u0646\u0629') own dg: False
 
es: 6 (u'AAAA-MM-DD (ISO)', u'Num\xe9rica', u'Mes D\xeda, A\xf1o', u'MES D\xeda, A\xf1o', u'D\xeda Mes, A\xf1o', u'D\xeda MES, A\xf1o') own dg: False
 
nl: 6 (u'JJJJ-MM-DD (ISO)', u'Numerisch DD/MM/JJ', u'Maand Dag, Jaar', u'Mnd. Dag Jaar', u'Dag Maand Jaar', u'Dag Mnd. Jaar') own dg: True
 
nn: 6 (u'\xc5\xc5\xc5\xc5-MM-DD (ISO)', u'Numerisk', u'M\xe5ned dag, \xe5r', u'M\xe5n Dag \xc5r', u'Dag m\xe5ned \xe5r', u'Dag M\xe5n \xc5r') own dg: False
 
nb: 6 (u'\xc5\xc5\xc5\xc5-MM-DD (ISO)', u'Numerisk', u'M\xe5ned dag, \xe5r', u'M\xe5n Dag \xc5r', u'Dag m\xe5ned \xe5r', u'Dag M\xe5n \xc5r') own dg: False
 
it: 6 (u'AAAA-MM-DD (ISO)', u'Numerico', u'Mese Giorno Anno', u'MES Giorno, Anno', u'Giorno Mese Anno', u'Giorno MES Anno') own dg: False
 
bg: 6 (u'\u0413\u0413\u0413\u0413-\u041c\u041c-\u0414\u0414 (ISO)', u'\u0427\u0438\u0441\u043b\u043e\u0432', u'\u041c\u0435\u0441\u0435\u0446 \u0414\u0435\u043d, \u0413\u043e\u0434\u0438\u043d\u0430', u'\u041c\u0435\u0441. \u0414\u0435\u043d, \u0413\u043e\u0434\u0438\u043d\u0430', u'\u0414\u0435\u043d \u041c\u0435\u0441\u0435\u0446 \u0413\u043e\u0434\u0438\u043d\u0430', u'\u0414\u0435\u043d \u041c\u0435\u0441. \u0413\u043e\u0434\u0438\u043d\u0430') own dg: False
 
fi: 2 (u'VVVV-KK-PP (ISO)', u'PP.KK.VVVV') own dg: False
 
da: 6 (u'\xc5\xc5\xc5\xc5-MM-DD (ISO)', u'Numerisk', u'M\xe5ned dag, \xe5r', u'Md Dag \xc5r', u'Dag m\xe5ned \xe5r', u'Dag md \xc5r') own dg: False
 
pt: 6 (u'AAAA-MM-DD (ISO)', u'Num\xe9rica', u'M\xeas Dia, Ano', u'M\xcaS Dia, Ano', u'Dia M\xeas, Ano', u'Dia M\xcaS, Ano') own dg: False
 
sr: 5 (u'GGGG-MM-DD (ISO-8601)', u'Numeri\u010dki (DD.MM.GGGG.)', u'D. MMM GGGG.', u'D. Mesec GGGG.', u'D. Rb GGGG.') own dg: True
 
sk: 6 (u'RRRR-MM-DD (ISO)', u'numerick\xfd', u'Mesiac De\u0148, Rok', u'MES De\u0148, Rok', u'De\u0148, Mesiac, Rok', u'De\u0148 MES Rok') own dg: False
 
de: 6 (u'JJJJ-MM-DD (ISO)', u'Numerisch', u'Monat Tag Jahr', u'MONAT Tag Jahr', u'Tag. Monat Jahr', u'Tag. MONAT Jahr') own dg: True
 
ru: 6 (u'AAAA-MM-JJ (ISO)', u'D\xe9faut syst\xe8me', u'Mois Jour, Ann\xe9e', u'MOI Jour, Ann\xe9e', u'Jour Mois Ann\xe9e', u'Jour MOI Ann\xe9e') own dg: False
 
MAX:  8
 
  
 +
=See also=
 +
* [[Testing Gramps]]
  
 
[[Category:Developers/Quality_Assurance]]
 
[[Category:Developers/Quality_Assurance]]
 
[[Category:Developers/General]]
 
[[Category:Developers/General]]

Latest revision as of 05:38, 2 January 2015

See date handler for new method on master (trunk).

List of date handlers is available.

Date object into Gramps

Dates in Gramps are much more complex than just a month, day, and year. Dates are always in a particular calendar, can span a time frame, can be approximate, and have support for many other subtleties specific to genealogy data.

Lexeme inflections

A lexeme:

  1. (linguistics) Roughly, the set of inflected forms taken by a single word, such as the lexeme RUN including as members "run" (lemma), "running" (inflected form), or "ran", and excluding "runner" (derived term).
  2. (computing) an individual instance of a continuous character sequence without spaces, used in lexical analysis (token)
source : https://en.wiktionary.org/wiki/lexeme

Types of inflections

{n: nominative}
{g: genitive}
{d: dative}

The nominative cases are found in Estonian, Slovak, Ukrainian, Hungarian, Lithuanian, Georgian, German, Latin, Greek, Icelandic, Old English, Old French, Polish, Serbian, Czech, Romanian, Russian, and Pashto, among other languages.

Many languages have a genitive case, including Albanian, Arabic, Armenian, Basque, Dutch, Estonian, Finnish, Georgian, German, Greek, Icelandic, Irish, Latin, Latvian, Lithuanian, Romanian, Sanskrit, Scottish Gaelic, Turkish and all Slavic languages except Bulgarian and Macedonian.

The dative was common among early Indo-European languages and has survived to the present in the Balto-Slavic branch and the Germanic branch, among others. It also exists in similar forms in several non-Indo-European languages, such as the Uralic family of languages, and Altaic languages.

Examples

#: ../gramps/gen/datehandler/_datestrings.py:70
msgid "localized lexeme inflections||May"
msgstr "И=май|Р=мая|Т=маем|П=мае"

How it is used by Gramps

Gramps extracts all inflections of the same lexeme, stripping the ‘|’, like for context.

The possible formats are either (1) a single string for a language with no inflections, or (2) a list of <inflection name>=<inflected form>, separated with ‘|’.

For example:

  1. “Uninflectable”
  2. “n=Inflected-nominative|g=Inflected-genitive|d=Inflected-dative”
See lexgettext for more details.

Keys into translation strings

Related to month inflections

#. If there is no special inflection for "from <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.
#: ../gramps/gen/datehandler/_datedisplay.py:340
msgid "from-date|"
msgstr ""
#. If there is no special inflection for "and <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.
#: ../gramps/gen/datehandler/_datedisplay.py:369
msgid "and-date|"
msgstr ""
#. 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?!
#: ../gramps/gen/datehandler/_datedisplay.py:386
msgid "before-date|"
msgstr ""

date on context is maybe confusing? What about: from-month|, and-month|, before-month|?

#. TRANSLATORS: see
#. http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
#. to learn how to select proper inflection for your language.
#: ../gramps/gen/datehandler/_datedisplay.py:450
msgid "{long_month} {day:d}, {year}"
msgstr ""
#. TRANSLATORS: see
#. http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
#. to learn how to select proper inflection for your language.
#: ../gramps/gen/datehandler/_datedisplay.py:465
msgid "{short_month} {day:d}, {year}"
msgstr ""
#. TRANSLATORS: see
#. http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
#. to learn how to select proper inflection for your language.
#: ../gramps/gen/datehandler/_datedisplay.py:480
msgid "{day:d} {long_month} {year}"
msgstr ""
#. TRANSLATORS: see
#. http://gramps-project.org/wiki/index.php?title=Translating_Gramps#Translating_dates
#. to learn how to select proper inflection for your language.
#: ../gramps/gen/datehandler/_datedisplay.py:496
msgid "{day:d} {short_month} {year}"
msgstr ""

Need new rules for supporting this type of key format into po/check_po script.

Specific mapping

#: ../gramps/gen/datehandler/_datedisplay.py:349
msgid "{date_quality}from {date_start} to {date_stop}{nonstd_calendar_and_ny}"
msgstr ""
return _("{date_quality}from {date_start} to {date_stop}"
                   "{nonstd_calendar_and_ny}").format(
                   date_quality=qual_str, 
                   date_start=d1, 
                   date_stop=d2, 
                   nonstd_calendar_and_ny=scal)

Why to use such a code, there? Same question for:

#: ../gramps/gen/datehandler/_datedisplay.py:371
msgid ""
"{date_quality}between {date_start} and {date_stop}{nonstd_calendar_and_ny}"
msgstr ""
#: ../gramps/gen/datehandler/_datedisplay.py:388
msgid "{date_quality}{noncompound_modifier}{date}{nonstd_calendar_and_ny}"
msgstr ""

Migrations and refactorings

> $ PYTHONPATH=/usr/local/lib/python2.7/site-packages/ GRAMPS_RESOURCES=$PWD LANGUAGE=de
python -m gramps.gen.datehandler._datestrings

LC_TIME={lang_region}.utf8 or LANGUAGE={lang} should match all available date handlers.

See # 6926 for patches. Git => revision 918785..

TO_CHECK

>$ PYTHONPATH=/usr/local/lib/python2.7/site-packages/ LC_ALL=en_GB.utf8 LANG=en_GB.utf8 
GRAMPS_RESOURCES=$PWD python -m unittest discover -p 'date*test.py'
locale score date formats MAX: 8
ar 6
bg 6
ca 6
cs 6
da 6
de Ran 59 tests in 7.665s (using the fallback 'C' locale) 6
en Ran 59 tests in 7.558s (using the fallback 'C' locale) 6
el 5
es 6
fi 2
fr Ran 59 tests in 9.007s (skipped=1) 8
hr Ran 59 tests in 7.771s (using the fallback 'C' locale) 6
it 6
lt 3
nb 6
nl 6
nn 6
ru Ran 59 tests in 7.646s (using the fallback 'C' locale) 6
pl 6
pt 6
sk 6
sl 4
sr 5
sv Ran 59 tests in 7.662s (using the fallback 'C' locale) 6
uk 6
.. .. ..
> $ PYTHONPATH=/usr/local/lib/python2.7/site-packages/  
GRAMPS_RESOURCES=$PWD python -m gramps.gen.datehandler.__init__

See also