Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions scripts/update-translations.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,19 @@ xgettext \
-k'PS_:1c,2' \
-k'NS_:1,2' \
-k'_ngettext:1,2' \
-k'G_:2' \
-k'NG_:2,3' \
-l python \
src/humanize/*.py

# Extract the contextual entries from the same calls without replacing ordinary ones.
xgettext \
--from-code=UTF-8 \
--join-existing \
-o humanize.pot \
--keyword \
-k'G_:1c,2' \
-k'NG_:1c,2,3' \
-l python \
src/humanize/*.py

Expand Down
51 changes: 51 additions & 0 deletions src/humanize/i18n.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,57 @@ def _ngettext(message: str, plural: str, num: int) -> str:
return get_translation().ngettext(message, plural, num)


def _pgettext_with_fallback(
msgctxt: str, message: str, use_context: bool = True
) -> str:
"""Translate with context, falling back to the ordinary translation.

Args:
msgctxt (str): Context of the translation.
message (str): Text to translate.
use_context (bool): Whether to look up the contextual translation first.

Returns:
str: Translated text.
"""
translation = get_translation()
if not use_context:
return translation.gettext(message)

contextual_message = f"{msgctxt}\x04{message}"
translated = translation.gettext(contextual_message)
if translated == contextual_message:
return translation.gettext(message)
return translated


def _npgettext_with_fallback(
msgctxt: str, message: str, plural: str, num: int, use_context: bool = True
) -> str:
"""Translate a plural with context, falling back to the ordinary translation.

Args:
msgctxt (str): Context of the translation.
message (str): Singular text to translate.
plural (str): Plural text to translate.
num (int): Number used to select the grammatical number.
use_context (bool): Whether to look up the contextual translation first.

Returns:
str: Translated text.
"""
translation = get_translation()
if not use_context:
return translation.ngettext(message, plural, num)

contextual_message = f"{msgctxt}\x04{message}"
contextual_plural = f"{msgctxt}\x04{plural}"
translated = translation.ngettext(contextual_message, contextual_plural, num)
if translated in (contextual_message, contextual_plural):
return translation.ngettext(message, plural, num)
return translated


def _gettext_noop(message: str) -> str:
"""Mark a string as a translation string without translating it.

Expand Down
118 changes: 117 additions & 1 deletion src/humanize/locale/de_DE/LC_MESSAGES/humanize.po
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ msgstr[1] "%d Jahre"
#: src/humanize/time.py:256
#, python-format
msgid "%s from now"
msgstr "%s ab jetzt"
msgstr "in %s"

#: src/humanize/time.py:256
#, python-format
Expand All @@ -363,3 +363,119 @@ msgstr "gestern"
#, python-format
msgid "%s and %s"
msgstr "%s und %s"

# Relative time uses the dative after "vor" and "in".
#: src/humanize/time.py
msgctxt "naturaltime"
msgid "a second"
msgstr "einer Sekunde"

#: src/humanize/time.py
msgctxt "naturaltime"
msgid "a minute"
msgstr "einer Minute"

#: src/humanize/time.py
msgctxt "naturaltime"
msgid "an hour"
msgstr "einer Stunde"

#: src/humanize/time.py
msgctxt "naturaltime"
msgid "a day"
msgstr "einem Tag"

#: src/humanize/time.py
msgctxt "naturaltime"
msgid "a month"
msgstr "einem Monat"

#: src/humanize/time.py
msgctxt "naturaltime"
msgid "a year"
msgstr "einem Jahr"

#: src/humanize/time.py
msgctxt "naturaltime"
msgid "1 year, 1 month"
msgstr "einem Jahr und einem Monat"

#: src/humanize/time.py
#, python-format
msgctxt "naturaltime"
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] "%d Mikrosekunde"
msgstr[1] "%d Mikrosekunden"

#: src/humanize/time.py
#, python-format
msgctxt "naturaltime"
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] "%d Millisekunde"
msgstr[1] "%d Millisekunden"

#: src/humanize/time.py
#, python-format
msgctxt "naturaltime"
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d Sekunde"
msgstr[1] "%d Sekunden"

#: src/humanize/time.py
#, python-format
msgctxt "naturaltime"
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d Minute"
msgstr[1] "%d Minuten"

#: src/humanize/time.py
#, python-format
msgctxt "naturaltime"
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d Stunde"
msgstr[1] "%d Stunden"

#: src/humanize/time.py
#, python-format
msgctxt "naturaltime"
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d Tag"
msgstr[1] "%d Tagen"

#: src/humanize/time.py
#, python-format
msgctxt "naturaltime"
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d Monat"
msgstr[1] "%d Monaten"

#: src/humanize/time.py
#, python-format
msgctxt "naturaltime"
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d Jahr"
msgstr[1] "%d Jahren"

#: src/humanize/time.py
#, python-format
msgctxt "naturaltime"
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "einem Jahr und %d Tag"
msgstr[1] "einem Jahr und %d Tagen"

#: src/humanize/time.py
#, python-format
msgctxt "naturaltime"
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "einem Jahr und %d Monat"
msgstr[1] "einem Jahr und %d Monaten"
Loading