Browse Source

Add overview of the last release age/date at each newznab provider to History/Layout "Connect fails".

Add enum34 1.1.10.
Add humanize 3.1.0 (aec9dc2).
tags/release_0.25.1
JackDandy 5 years ago
parent
commit
63faae8d94
  1. 3
      CHANGES.md
  2. 8
      gui/slick/css/style.css
  3. 82
      gui/slick/interfaces/default/history.tmpl
  4. 4
      lib/_23.py
  5. 838
      lib/enum34/__init__.py
  6. 33
      lib/humanize/__init__.py
  7. 6
      lib/humanize/compat.py
  8. 71
      lib/humanize/filesize.py
  9. 132
      lib/humanize/i18n.py
  10. BIN
      lib/humanize/locale/de_DE/LC_MESSAGES/humanize.mo
  11. 287
      lib/humanize/locale/de_DE/LC_MESSAGES/humanize.po
  12. BIN
      lib/humanize/locale/es_ES/LC_MESSAGES/humanize.mo
  13. 286
      lib/humanize/locale/es_ES/LC_MESSAGES/humanize.po
  14. BIN
      lib/humanize/locale/fa_IR/LC_MESSAGES/humanize.mo
  15. 287
      lib/humanize/locale/fa_IR/LC_MESSAGES/humanize.po
  16. BIN
      lib/humanize/locale/fi_FI/LC_MESSAGES/humanize.mo
  17. 286
      lib/humanize/locale/fi_FI/LC_MESSAGES/humanize.po
  18. BIN
      lib/humanize/locale/fr_FR/LC_MESSAGES/humanize.mo
  19. 307
      lib/humanize/locale/fr_FR/LC_MESSAGES/humanize.po
  20. BIN
      lib/humanize/locale/id_ID/LC_MESSAGES/humanize.mo
  21. 276
      lib/humanize/locale/id_ID/LC_MESSAGES/humanize.po
  22. BIN
      lib/humanize/locale/it_IT/LC_MESSAGES/humanize.mo
  23. 286
      lib/humanize/locale/it_IT/LC_MESSAGES/humanize.po
  24. BIN
      lib/humanize/locale/ja_JP/LC_MESSAGES/humanize.mo
  25. 288
      lib/humanize/locale/ja_JP/LC_MESSAGES/humanize.po
  26. BIN
      lib/humanize/locale/ko_KR/LC_MESSAGES/humanize.mo
  27. 306
      lib/humanize/locale/ko_KR/LC_MESSAGES/humanize.po
  28. BIN
      lib/humanize/locale/nl_NL/LC_MESSAGES/humanize.mo
  29. 287
      lib/humanize/locale/nl_NL/LC_MESSAGES/humanize.po
  30. BIN
      lib/humanize/locale/pl_PL/LC_MESSAGES/humanize.mo
  31. 296
      lib/humanize/locale/pl_PL/LC_MESSAGES/humanize.po
  32. BIN
      lib/humanize/locale/pt_BR/LC_MESSAGES/humanize.mo
  33. 286
      lib/humanize/locale/pt_BR/LC_MESSAGES/humanize.po
  34. BIN
      lib/humanize/locale/pt_PT/LC_MESSAGES/humanize.mo
  35. 286
      lib/humanize/locale/pt_PT/LC_MESSAGES/humanize.po
  36. BIN
      lib/humanize/locale/ru_RU/LC_MESSAGES/humanize.mo
  37. 305
      lib/humanize/locale/ru_RU/LC_MESSAGES/humanize.po
  38. BIN
      lib/humanize/locale/sk_SK/LC_MESSAGES/humanize.mo
  39. 296
      lib/humanize/locale/sk_SK/LC_MESSAGES/humanize.po
  40. BIN
      lib/humanize/locale/tr_TR/LC_MESSAGES/humanize.mo
  41. 287
      lib/humanize/locale/tr_TR/LC_MESSAGES/humanize.po
  42. BIN
      lib/humanize/locale/uk_UA/LC_MESSAGES/humanize.mo
  43. 293
      lib/humanize/locale/uk_UA/LC_MESSAGES/humanize.po
  44. BIN
      lib/humanize/locale/vi_VI/LC_MESSAGES/humanize.mo
  45. 294
      lib/humanize/locale/vi_VI/LC_MESSAGES/humanize.po
  46. BIN
      lib/humanize/locale/zh_CN/LC_MESSAGES/humanize.mo
  47. 286
      lib/humanize/locale/zh_CN/LC_MESSAGES/humanize.po
  48. 365
      lib/humanize/number.py
  49. 557
      lib/humanize/time.py

3
CHANGES.md

@ -1,5 +1,6 @@
### 0.23.0 (2019-xx-xx xx:xx:xx UTC)
* Add overview of the last release age/date at each newznab provider to History/Layout "Connect fails"
* Add "History new..." to Shows menu by clicking the number
* Add db backup to the scheduled daily update
* Add display "Database backups" location at config/about if feature available
@ -39,6 +40,8 @@
* Change API version to 14
* Change add a test for both require and ignore show specific words with partial match, both should fail
* Change init showDict for all unit tests
* Add enum34 1.1.10
* Add humanize 3.1.0 (aec9dc2)
* Update included fallback timezone info file to 2020d
* Update attr 20.1.0.dev0 (4bd6827) to 20.2.0 (4f74fba)
* Update Beautiful Soup 4.8.2 (r559) to 4.9.3 (r593)

8
gui/slick/css/style.css

@ -2775,6 +2775,14 @@ history.tmpl
background-color:#3f993f
}
.yellow-bg{
background-color:#cfd958;
color:#282828
}
.blue-bg{
background-color:#2779d0
}
#history-table td,
#history-table td.provider span{
text-align:center

82
gui/slick/interfaces/default/history.tmpl

@ -10,6 +10,8 @@
<% def sg_var(varname, default=False): return getattr(sickbeard, varname, default) %>#slurp#
<% def sg_str(varname, default=''): return getattr(sickbeard, varname, default) %>#slurp#
##
#import humanize
##
#set $layout = $sg_str('HISTORY_LAYOUT', 'detailed')
#set $layout_name = 'watched' in $layout and 'Watched' or 'stats' in $layout and 'Activity Hits' or 'provider_failures'in $layout and 'Connect Failures' or 'Activity'
#set sg_port = str($getVar('sbHttpPort', WEB_PORT))
@ -396,7 +398,6 @@
<li>Label (Profile): <span class="grey-text">emby or kodi</span> , <span class="grey-text">!kodi and !plex</span> , <span class="grey-text">emby user2</span> , <span class="grey-text">emby user"</span> (single end quote excludes user2)</li>
<li>Quality: <span class="grey-text">sd or dl</span> , <span class="grey-text">blu</span></li>
</ul>
</td
</td>
</tr>
<tr class="$row_class()">
@ -591,9 +592,6 @@
##
<div id="server-failures">
<div style="padding-bottom:10px">
#for $cur_provider in $sickbeard.newznabProviderList:
<div><img height="16px" src="$sbRoot/images/providers/$cur_provider.image_name()"> $cur_provider.get_id() - latest release date: $cur_provider.last_recent_search</div>
#end for
#for ($check, $check_name, $check_url) in [
('tvdb', 'TVDB Api', 'api.thetvdb.com'), ('thexem', 'The Xem', 'thexem.de'), ('github', 'GitHub', 'github.com'),
]
@ -606,6 +604,82 @@
#end for
</div>
#if $sickbeard.USE_NZBS
<style>
table.last_rls th{padding-right:20px}
table.last_rls td{vertical-align:middle;line-height:1.1em}
table.last_rls span.prov-name{display:inline-block;white-space:nowrap;overflow:hidden;vertical-align: middle}
table.last_rls img{margin:0 5px}
.status{padding:4px 20px;display:block}
</style>
<div style="padding-bottom:20px">
<table style="margin-bottom:10px" class="manageTable last_rls server-failures tablesorter hover-highlight focus-highlight text-center tablesorter-default" cellspacing="0" border="0" cellpadding="0">
<thead>
<tr>
<th class="text-left" style="width:13em"></th>
<th class="text-center">last release age</th>
<th class="text-center">dated</th>
<th class="text-center">provider is...</th>
</tr>
</thead>
#set global $row = 0
<tbody>
#for $cur_provider in $sorted($sickbeard.newznabProviderList, key=lambda x: x.last_recent_search or SGDatetime(2000,1,1), reverse=True)
#set $last_rls_date = '-'
#set $last_rls_age = None
#set $last_rls_age_str = '-'
#if $cur_provider.last_recent_search
#set $last_rls_date = $SGDatetime.sbfdatetime($cur_provider.last_recent_search)
#set $last_rls_timedelta = ($SGDatetime.now() - $cur_provider.last_recent_search)
#set $last_rls_age = $last_rls_timedelta.days
#set $last_rls_age_str = '%s days ago' % $last_rls_age
#set $tmp = $humanize.naturalday(cur_provider.last_recent_search, format='', locale=False)
#if $tmp
#if 'yesterday' == $tmp
#set $last_rls_age_str = $humanize.naturalday(cur_provider.last_recent_search)
#else
#set $last_rls_age_str = $humanize.naturaltime($last_rls_timedelta)
#end if
#end if
#end if
#set $status_class = 'yellow-bg'
#set $status_text = 'not enabled'
#if $cur_provider.is_active()
#if not $cur_provider.enable_recentsearch
#set $status_text = 'recent ' + $status_text
#else
#set $status_class = 'contrast-text green-bg'
#set $status_text = 'enabled'
#if '-' != $last_rls_date
#if 4 > $last_rls_age
#set $status_text = 'normal'
#else
#set $status_class = 'contrast-text'
#if 14 >= $last_rls_age
#set $status_class += ' blue-bg'
#set $status_text = 'overdue'
#else
#set $status_class += ' red-bg'
#set $status_text = 'not normal'
#end if
#end if
#end if
#end if
#end if
<tr class="$row_class()#echo ('',' grey-text')[not $cur_provider.is_active()]#">
<td class="text-left">
<span class="prov-name"><img height="16px" src="$sbRoot/images/providers/$cur_provider.image_name()">$cur_provider.name</span>
</td>
<td>$last_rls_age_str</td>
<td>$last_rls_date</td>
<td><span class="status $status_class">$status_text</span></td>
</tr>
#end for
</tbody>
</table>
</div>
#end if
#if $domain_fail_cnt or $provider_fail_cnt
<style>
.component-group{min-height:50px}

4
lib/_23.py

@ -146,6 +146,8 @@ if 2 != version_info[0]:
# noinspection PyUnresolvedReferences,PyCompatibility
from configparser import ConfigParser
# noinspection PyUnresolvedReferences
from enum import Enum
# noinspection PyUnresolvedReferences
from os import scandir, DirEntry
# noinspection PyUnresolvedReferences
from itertools import zip_longest
@ -227,6 +229,8 @@ else:
b64encodebytes = encodestring
# noinspection PyUnresolvedReferences
from lib.backports.configparser import ConfigParser
# noinspection PyUnresolvedReferences
from lib.enum34 import Enum
# noinspection PyProtectedMember,PyUnresolvedReferences
from lib.scandir.scandir import scandir, GenericDirEntry as DirEntry
# noinspection PyUnresolvedReferences,PyDeprecation

838
lib/enum34/__init__.py

@ -0,0 +1,838 @@
"""Python Enumerations"""
import sys as _sys
__all__ = ['Enum', 'IntEnum', 'unique']
version = 1, 1, 10
pyver = float('%s.%s' % _sys.version_info[:2])
try:
any
except NameError:
def any(iterable):
for element in iterable:
if element:
return True
return False
try:
from collections import OrderedDict
except ImportError:
OrderedDict = None
try:
basestring
except NameError:
# In Python 2 basestring is the ancestor of both str and unicode
# in Python 3 it's just str, but was missing in 3.1
basestring = str
try:
unicode
except NameError:
# In Python 3 unicode no longer exists (it's just str)
unicode = str
class _RouteClassAttributeToGetattr(object):
"""Route attribute access on a class to __getattr__.
This is a descriptor, used to define attributes that act differently when
accessed through an instance and through a class. Instance access remains
normal, but access to an attribute through a class will be routed to the
class's __getattr__ method; this is done by raising AttributeError.
"""
def __init__(self, fget=None):
self.fget = fget
def __get__(self, instance, ownerclass=None):
if instance is None:
raise AttributeError()
return self.fget(instance)
def __set__(self, instance, value):
raise AttributeError("can't set attribute")
def __delete__(self, instance):
raise AttributeError("can't delete attribute")
def _is_descriptor(obj):
"""Returns True if obj is a descriptor, False otherwise."""
return (
hasattr(obj, '__get__') or
hasattr(obj, '__set__') or
hasattr(obj, '__delete__'))
def _is_dunder(name):
"""Returns True if a __dunder__ name, False otherwise."""
return (name[:2] == name[-2:] == '__' and
name[2:3] != '_' and
name[-3:-2] != '_' and
len(name) > 4)
def _is_sunder(name):
"""Returns True if a _sunder_ name, False otherwise."""
return (name[0] == name[-1] == '_' and
name[1:2] != '_' and
name[-2:-1] != '_' and
len(name) > 2)
def _make_class_unpicklable(cls):
"""Make the given class un-picklable."""
def _break_on_call_reduce(self, protocol=None):
raise TypeError('%r cannot be pickled' % self)
cls.__reduce_ex__ = _break_on_call_reduce
cls.__module__ = '<unknown>'
class _EnumDict(dict):
"""Track enum member order and ensure member names are not reused.
EnumMeta will use the names found in self._member_names as the
enumeration member names.
"""
def __init__(self):
super(_EnumDict, self).__init__()
self._member_names = []
def __setitem__(self, key, value):
"""Changes anything not dundered or not a descriptor.
If a descriptor is added with the same name as an enum member, the name
is removed from _member_names (this may leave a hole in the numerical
sequence of values).
If an enum member name is used twice, an error is raised; duplicate
values are not checked for.
Single underscore (sunder) names are reserved.
Note: in 3.x __order__ is simply discarded as a not necessary piece
leftover from 2.x
"""
if pyver >= 3.0 and key in ('_order_', '__order__'):
return
elif key == '__order__':
key = '_order_'
if _is_sunder(key):
if key != '_order_':
raise ValueError('_names_ are reserved for future Enum use')
elif _is_dunder(key):
pass
elif key in self._member_names:
# descriptor overwriting an enum?
raise TypeError('Attempted to reuse key: %r' % key)
elif not _is_descriptor(value):
if key in self:
# enum overwriting a descriptor?
raise TypeError('Key already defined as: %r' % self[key])
self._member_names.append(key)
super(_EnumDict, self).__setitem__(key, value)
# Dummy value for Enum as EnumMeta explicity checks for it, but of course until
# EnumMeta finishes running the first time the Enum class doesn't exist. This
# is also why there are checks in EnumMeta like `if Enum is not None`
Enum = None
class EnumMeta(type):
"""Metaclass for Enum"""
@classmethod
def __prepare__(metacls, cls, bases):
return _EnumDict()
def __new__(metacls, cls, bases, classdict):
# an Enum class is final once enumeration items have been defined; it
# cannot be mixed with other types (int, float, etc.) if it has an
# inherited __new__ unless a new __new__ is defined (or the resulting
# class will fail).
if type(classdict) is dict:
original_dict = classdict
classdict = _EnumDict()
for k, v in original_dict.items():
classdict[k] = v
member_type, first_enum = metacls._get_mixins_(bases)
__new__, save_new, use_args = metacls._find_new_(classdict, member_type,
first_enum)
# save enum items into separate mapping so they don't get baked into
# the new class
members = dict((k, classdict[k]) for k in classdict._member_names)
for name in classdict._member_names:
del classdict[name]
# py2 support for definition order
_order_ = classdict.get('_order_')
if _order_ is None:
if pyver < 3.0:
try:
_order_ = [name for (name, value) in sorted(members.items(), key=lambda item: item[1])]
except TypeError:
_order_ = [name for name in sorted(members.keys())]
else:
_order_ = classdict._member_names
else:
del classdict['_order_']
if pyver < 3.0:
if isinstance(_order_, basestring):
_order_ = _order_.replace(',', ' ').split()
aliases = [name for name in members if name not in _order_]
_order_ += aliases
# check for illegal enum names (any others?)
invalid_names = set(members) & set(['mro'])
if invalid_names:
raise ValueError('Invalid enum member name(s): %s' % (
', '.join(invalid_names), ))
# save attributes from super classes so we know if we can take
# the shortcut of storing members in the class dict
base_attributes = set([a for b in bases for a in b.__dict__])
# create our new Enum type
enum_class = super(EnumMeta, metacls).__new__(metacls, cls, bases, classdict)
enum_class._member_names_ = [] # names in random order
if OrderedDict is not None:
enum_class._member_map_ = OrderedDict()
else:
enum_class._member_map_ = {} # name->value map
enum_class._member_type_ = member_type
# Reverse value->name map for hashable values.
enum_class._value2member_map_ = {}
# instantiate them, checking for duplicates as we go
# we instantiate first instead of checking for duplicates first in case
# a custom __new__ is doing something funky with the values -- such as
# auto-numbering ;)
if __new__ is None:
__new__ = enum_class.__new__
for member_name in _order_:
value = members[member_name]
if not isinstance(value, tuple):
args = (value, )
else:
args = value
if member_type is tuple: # special case for tuple enums
args = (args, ) # wrap it one more time
if not use_args or not args:
enum_member = __new__(enum_class)
if not hasattr(enum_member, '_value_'):
enum_member._value_ = value
else:
enum_member = __new__(enum_class, *args)
if not hasattr(enum_member, '_value_'):
enum_member._value_ = member_type(*args)
value = enum_member._value_
enum_member._name_ = member_name
enum_member.__objclass__ = enum_class
enum_member.__init__(*args)
# If another member with the same value was already defined, the
# new member becomes an alias to the existing one.
for name, canonical_member in enum_class._member_map_.items():
if canonical_member.value == enum_member._value_:
enum_member = canonical_member
break
else:
# Aliases don't appear in member names (only in __members__).
enum_class._member_names_.append(member_name)
# performance boost for any member that would not shadow
# a DynamicClassAttribute (aka _RouteClassAttributeToGetattr)
if member_name not in base_attributes:
setattr(enum_class, member_name, enum_member)
# now add to _member_map_
enum_class._member_map_[member_name] = enum_member
try:
# This may fail if value is not hashable. We can't add the value
# to the map, and by-value lookups for this value will be
# linear.
enum_class._value2member_map_[value] = enum_member
except TypeError:
pass
# If a custom type is mixed into the Enum, and it does not know how
# to pickle itself, pickle.dumps will succeed but pickle.loads will
# fail. Rather than have the error show up later and possibly far
# from the source, sabotage the pickle protocol for this class so
# that pickle.dumps also fails.
#
# However, if the new class implements its own __reduce_ex__, do not
# sabotage -- it's on them to make sure it works correctly. We use
# __reduce_ex__ instead of any of the others as it is preferred by
# pickle over __reduce__, and it handles all pickle protocols.
unpicklable = False
if '__reduce_ex__' not in classdict:
if member_type is not object:
methods = ('__getnewargs_ex__', '__getnewargs__',
'__reduce_ex__', '__reduce__')
if not any(m in member_type.__dict__ for m in methods):
_make_class_unpicklable(enum_class)
unpicklable = True
# double check that repr and friends are not the mixin's or various
# things break (such as pickle)
for name in ('__repr__', '__str__', '__format__', '__reduce_ex__'):
class_method = getattr(enum_class, name)
obj_method = getattr(member_type, name, None)
enum_method = getattr(first_enum, name, None)
if name not in classdict and class_method is not enum_method:
if name == '__reduce_ex__' and unpicklable:
continue
setattr(enum_class, name, enum_method)
# method resolution and int's are not playing nice
# Python's less than 2.6 use __cmp__
if pyver < 2.6:
if issubclass(enum_class, int):
setattr(enum_class, '__cmp__', getattr(int, '__cmp__'))
elif pyver < 3.0:
if issubclass(enum_class, int):
for method in (
'__le__',
'__lt__',
'__gt__',
'__ge__',
'__eq__',
'__ne__',
'__hash__',
):
setattr(enum_class, method, getattr(int, method))
# replace any other __new__ with our own (as long as Enum is not None,
# anyway) -- again, this is to support pickle
if Enum is not None:
# if the user defined their own __new__, save it before it gets
# clobbered in case they subclass later
if save_new:
setattr(enum_class, '__member_new__', enum_class.__dict__['__new__'])
setattr(enum_class, '__new__', Enum.__dict__['__new__'])
return enum_class
def __bool__(cls):
"""
classes/types should always be True.
"""
return True
def __call__(cls, value, names=None, module=None, type=None, start=1):
"""Either returns an existing member, or creates a new enum class.
This method is used both when an enum class is given a value to match
to an enumeration member (i.e. Color(3)) and for the functional API
(i.e. Color = Enum('Color', names='red green blue')).
When used for the functional API: `module`, if set, will be stored in
the new class' __module__ attribute; `type`, if set, will be mixed in
as the first base class.
Note: if `module` is not set this routine will attempt to discover the
calling module by walking the frame stack; if this is unsuccessful
the resulting class will not be pickleable.
"""
if names is None: # simple value lookup
return cls.__new__(cls, value)
# otherwise, functional API: we're creating a new Enum type
return cls._create_(value, names, module=module, type=type, start=start)
def __contains__(cls, member):
return isinstance(member, cls) and member.name in cls._member_map_
def __delattr__(cls, attr):
# nicer error message when someone tries to delete an attribute
# (see issue19025).
if attr in cls._member_map_:
raise AttributeError(
"%s: cannot delete Enum member." % cls.__name__)
super(EnumMeta, cls).__delattr__(attr)
def __dir__(self):
return (['__class__', '__doc__', '__members__', '__module__'] +
self._member_names_)
@property
def __members__(cls):
"""Returns a mapping of member name->value.
This mapping lists all enum members, including aliases. Note that this
is a copy of the internal mapping.
"""
return cls._member_map_.copy()
def __getattr__(cls, name):
"""Return the enum member matching `name`
We use __getattr__ instead of descriptors or inserting into the enum
class' __dict__ in order to support `name` and `value` being both
properties for enum members (which live in the class' __dict__) and
enum members themselves.
"""
if _is_dunder(name):
raise AttributeError(name)
try:
return cls._member_map_[name]
except KeyError:
raise AttributeError(name)
def __getitem__(cls, name):
return cls._member_map_[name]
def __iter__(cls):
return (cls._member_map_[name] for name in cls._member_names_)
def __reversed__(cls):
return (cls._member_map_[name] for name in reversed(cls._member_names_))
def __len__(cls):
return len(cls._member_names_)
__nonzero__ = __bool__
def __repr__(cls):
return "<enum %r>" % cls.__name__
def __setattr__(cls, name, value):
"""Block attempts to reassign Enum members.
A simple assignment to the class namespace only changes one of the
several possible ways to get an Enum member from the Enum class,
resulting in an inconsistent Enumeration.
"""
member_map = cls.__dict__.get('_member_map_', {})
if name in member_map:
raise AttributeError('Cannot reassign members.')
super(EnumMeta, cls).__setattr__(name, value)
def _create_(cls, class_name, names=None, module=None, type=None, start=1):
"""Convenience method to create a new Enum class.
`names` can be:
* A string containing member names, separated either with spaces or
commas. Values are auto-numbered from 1.
* An iterable of member names. Values are auto-numbered from 1.
* An iterable of (member name, value) pairs.
* A mapping of member name -> value.
"""
if pyver < 3.0:
# if class_name is unicode, attempt a conversion to ASCII
if isinstance(class_name, unicode):
try:
class_name = class_name.encode('ascii')
except UnicodeEncodeError:
raise TypeError('%r is not representable in ASCII' % class_name)
metacls = cls.__class__
if type is None:
bases = (cls, )
else:
bases = (type, cls)
classdict = metacls.__prepare__(class_name, bases)
_order_ = []
# special processing needed for names?
if isinstance(names, basestring):
names = names.replace(',', ' ').split()
if isinstance(names, (tuple, list)) and isinstance(names[0], basestring):
names = [(e, i+start) for (i, e) in enumerate(names)]
# Here, names is either an iterable of (name, value) or a mapping.
item = None # in case names is empty
for item in names:
if isinstance(item, basestring):
member_name, member_value = item, names[item]
else:
member_name, member_value = item
classdict[member_name] = member_value
_order_.append(member_name)
# only set _order_ in classdict if name/value was not from a mapping
if not isinstance(item, basestring):
classdict['_order_'] = _order_
enum_class = metacls.__new__(metacls, class_name, bases, classdict)
# TODO: replace the frame hack if a blessed way to know the calling
# module is ever developed
if module is None:
try:
module = _sys._getframe(2).f_globals['__name__']
except (AttributeError, ValueError):
pass
if module is None:
_make_class_unpicklable(enum_class)
else:
enum_class.__module__ = module
return enum_class
@staticmethod
def _get_mixins_(bases):
"""Returns the type for creating enum members, and the first inherited
enum class.
bases: the tuple of bases that was given to __new__
"""
if not bases or Enum is None:
return object, Enum
# double check that we are not subclassing a class with existing
# enumeration members; while we're at it, see if any other data
# type has been mixed in so we can use the correct __new__
member_type = first_enum = None
for base in bases:
if (base is not Enum and
issubclass(base, Enum) and
base._member_names_):
raise TypeError("Cannot extend enumerations")
# base is now the last base in bases
if not issubclass(base, Enum):
raise TypeError("new enumerations must be created as "
"`ClassName([mixin_type,] enum_type)`")
# get correct mix-in type (either mix-in type of Enum subclass, or
# first base if last base is Enum)
if not issubclass(bases[0], Enum):
member_type = bases[0] # first data type
first_enum = bases[-1] # enum type
else:
for base in bases[0].__mro__:
# most common: (IntEnum, int, Enum, object)
# possible: (<Enum 'AutoIntEnum'>, <Enum 'IntEnum'>,
# <class 'int'>, <Enum 'Enum'>,
# <class 'object'>)
if issubclass(base, Enum):
if first_enum is None:
first_enum = base
else:
if member_type is None:
member_type = base
return member_type, first_enum
if pyver < 3.0:
@staticmethod
def _find_new_(classdict, member_type, first_enum):
"""Returns the __new__ to be used for creating the enum members.
classdict: the class dictionary given to __new__
member_type: the data type whose __new__ will be used by default
first_enum: enumeration to check for an overriding __new__
"""
# now find the correct __new__, checking to see of one was defined
# by the user; also check earlier enum classes in case a __new__ was
# saved as __member_new__
__new__ = classdict.get('__new__', None)
if __new__:
return None, True, True # __new__, save_new, use_args
N__new__ = getattr(None, '__new__')
O__new__ = getattr(object, '__new__')
if Enum is None:
E__new__ = N__new__
else:
E__new__ = Enum.__dict__['__new__']
# check all possibles for __member_new__ before falling back to
# __new__
for method in ('__member_new__', '__new__'):
for possible in (member_type, first_enum):
try:
target = possible.__dict__[method]
except (AttributeError, KeyError):
target = getattr(possible, method, None)
if target not in [
None,
N__new__,
O__new__,
E__new__,
]:
if method == '__member_new__':
classdict['__new__'] = target
return None, False, True
if isinstance(target, staticmethod):
target = target.__get__(member_type)
__new__ = target
break
if __new__ is not None:
break
else:
__new__ = object.__new__
# if a non-object.__new__ is used then whatever value/tuple was
# assigned to the enum member name will be passed to __new__ and to the
# new enum member's __init__
if __new__ is object.__new__:
use_args = False
else:
use_args = True
return __new__, False, use_args
else:
@staticmethod
def _find_new_(classdict, member_type, first_enum):
"""Returns the __new__ to be used for creating the enum members.
classdict: the class dictionary given to __new__
member_type: the data type whose __new__ will be used by default
first_enum: enumeration to check for an overriding __new__
"""
# now find the correct __new__, checking to see of one was defined
# by the user; also check earlier enum classes in case a __new__ was
# saved as __member_new__
__new__ = classdict.get('__new__', None)
# should __new__ be saved as __member_new__ later?
save_new = __new__ is not None
if __new__ is None:
# check all possibles for __member_new__ before falling back to
# __new__
for method in ('__member_new__', '__new__'):
for possible in (member_type, first_enum):
target = getattr(possible, method, None)
if target not in (
None,
None.__new__,
object.__new__,
Enum.__new__,
):
__new__ = target
break
if __new__ is not None:
break
else:
__new__ = object.__new__
# if a non-object.__new__ is used then whatever value/tuple was
# assigned to the enum member name will be passed to __new__ and to the
# new enum member's __init__
if __new__ is object.__new__:
use_args = False
else:
use_args = True
return __new__, save_new, use_args
########################################################
# In order to support Python 2 and 3 with a single
# codebase we have to create the Enum methods separately
# and then use the `type(name, bases, dict)` method to
# create the class.
########################################################
temp_enum_dict = {}
temp_enum_dict['__doc__'] = "Generic enumeration.\n\n Derive from this class to define new enumerations.\n\n"
def __new__(cls, value):
# all enum instances are actually created during class construction
# without calling this method; this method is called by the metaclass'
# __call__ (i.e. Color(3) ), and by pickle
if type(value) is cls:
# For lookups like Color(Color.red)
value = value.value
#return value
# by-value search for a matching enum member
# see if it's in the reverse mapping (for hashable values)
try:
if value in cls._value2member_map_:
return cls._value2member_map_[value]
except TypeError:
# not there, now do long search -- O(n) behavior
for member in cls._member_map_.values():
if member.value == value:
return member
raise ValueError("%s is not a valid %s" % (value, cls.__name__))
temp_enum_dict['__new__'] = __new__
del __new__
def __repr__(self):
return "<%s.%s: %r>" % (
self.__class__.__name__, self._name_, self._value_)
temp_enum_dict['__repr__'] = __repr__
del __repr__
def __str__(self):
return "%s.%s" % (self.__class__.__name__, self._name_)
temp_enum_dict['__str__'] = __str__
del __str__
if pyver >= 3.0:
def __dir__(self):
added_behavior = [
m
for cls in self.__class__.mro()
for m in cls.__dict__
if m[0] != '_' and m not in self._member_map_
]
return (['__class__', '__doc__', '__module__', ] + added_behavior)
temp_enum_dict['__dir__'] = __dir__
del __dir__
def __format__(self, format_spec):
# mixed-in Enums should use the mixed-in type's __format__, otherwise
# we can get strange results with the Enum name showing up instead of
# the value
# pure Enum branch
if self._member_type_ is object:
cls = str
val = str(self)
# mix-in branch
else:
cls = self._member_type_
val = self.value
return cls.__format__(val, format_spec)
temp_enum_dict['__format__'] = __format__
del __format__
####################################
# Python's less than 2.6 use __cmp__
if pyver < 2.6:
def __cmp__(self, other):
if type(other) is self.__class__:
if self is other:
return 0
return -1
return NotImplemented
raise TypeError("unorderable types: %s() and %s()" % (self.__class__.__name__, other.__class__.__name__))
temp_enum_dict['__cmp__'] = __cmp__
del __cmp__
else:
def __le__(self, other):
raise TypeError("unorderable types: %s() <= %s()" % (self.__class__.__name__, other.__class__.__name__))
temp_enum_dict['__le__'] = __le__
del __le__
def __lt__(self, other):
raise TypeError("unorderable types: %s() < %s()" % (self.__class__.__name__, other.__class__.__name__))
temp_enum_dict['__lt__'] = __lt__
del __lt__
def __ge__(self, other):
raise TypeError("unorderable types: %s() >= %s()" % (self.__class__.__name__, other.__class__.__name__))
temp_enum_dict['__ge__'] = __ge__
del __ge__
def __gt__(self, other):
raise TypeError("unorderable types: %s() > %s()" % (self.__class__.__name__, other.__class__.__name__))
temp_enum_dict['__gt__'] = __gt__
del __gt__
def __eq__(self, other):
if type(other) is self.__class__:
return self is other
return NotImplemented
temp_enum_dict['__eq__'] = __eq__
del __eq__
def __ne__(self, other):
if type(other) is self.__class__:
return self is not other
return NotImplemented
temp_enum_dict['__ne__'] = __ne__
del __ne__
def __hash__(self):
return hash(self._name_)
temp_enum_dict['__hash__'] = __hash__
del __hash__
def __reduce_ex__(self, proto):
return self.__class__, (self._value_, )
temp_enum_dict['__reduce_ex__'] = __reduce_ex__
del __reduce_ex__
# _RouteClassAttributeToGetattr is used to provide access to the `name`
# and `value` properties of enum members while keeping some measure of
# protection from modification, while still allowing for an enumeration
# to have members named `name` and `value`. This works because enumeration
# members are not set directly on the enum class -- __getattr__ is
# used to look them up.
@_RouteClassAttributeToGetattr
def name(self):
return self._name_
temp_enum_dict['name'] = name
del name
@_RouteClassAttributeToGetattr
def value(self):
return self._value_
temp_enum_dict['value'] = value
del value
@classmethod
def _convert(cls, name, module, filter, source=None):
"""
Create a new Enum subclass that replaces a collection of global constants
"""
# convert all constants from source (or module) that pass filter() to
# a new Enum called name, and export the enum and its members back to
# module;
# also, replace the __reduce_ex__ method so unpickling works in
# previous Python versions
module_globals = vars(_sys.modules[module])
if source:
source = vars(source)
else:
source = module_globals
members = dict((name, value) for name, value in source.items() if filter(name))
cls = cls(name, members, module=module)
cls.__reduce_ex__ = _reduce_ex_by_name
module_globals.update(cls.__members__)
module_globals[name] = cls
return cls
temp_enum_dict['_convert'] = _convert
del _convert
Enum = EnumMeta('Enum', (object, ), temp_enum_dict)
del temp_enum_dict
# Enum has now been created
###########################
class IntEnum(int, Enum):
"""Enum where members are also (and must be) ints"""
def _reduce_ex_by_name(self, proto):
return self.name
def unique(enumeration):
"""Class decorator that ensures only unique members exist in an enumeration."""
duplicates = []
for name, member in enumeration.__members__.items():
if name != member.name:
duplicates.append((name, member.name))
if duplicates:
duplicate_names = ', '.join(
["%s -> %s" % (alias, name) for (alias, name) in duplicates]
)
raise ValueError('duplicate names found in %r: %s' %
(enumeration, duplicate_names)
)
return enumeration

33
lib/humanize/__init__.py

@ -0,0 +1,33 @@
"""Main package for humanize."""
from humanize.filesize import naturalsize
from humanize.i18n import activate, deactivate
from humanize.number import apnumber, fractional, intcomma, intword, ordinal, scientific
from humanize.time import (
naturaldate,
naturalday,
naturaldelta,
naturaltime,
precisedelta,
)
__version__ = VERSION = '3.1.0'
__all__ = [
"__version__",
"activate",
"apnumber",
"deactivate",
"fractional",
"intcomma",
"intword",
"naturaldate",
"naturalday",
"naturaldelta",
"naturalsize",
"naturaltime",
"ordinal",
"precisedelta",
"scientific",
"VERSION",
]

6
lib/humanize/compat.py

@ -0,0 +1,6 @@
import sys
if sys.version_info < (3,):
string_types = (basestring,) # noqa: F821
else:
string_types = (str,)

71
lib/humanize/filesize.py

@ -0,0 +1,71 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Bits and bytes related humanization."""
suffixes = {
"decimal": ("kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"),
"binary": ("KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"),
"gnu": "KMGTPEZY",
}
def naturalsize(value, binary=False, gnu=False, format="%.1f"):
"""Format a number of bytes like a human readable filesize (e.g. 10 kB).
By default, decimal suffixes (kB, MB) are used.
Non-GNU modes are compatible with jinja2's `filesizeformat` filter.
Examples:
```pycon
>>> naturalsize(3000000)
'3.0 MB'
>>> naturalsize(300, False, True)
'300B'
>>> naturalsize(3000, False, True)
'2.9K'
>>> naturalsize(3000, False, True, "%.3f")
'2.930K'
>>> naturalsize(3000, True)
'2.9 KiB'
```
Args:
value (int, float, str): Integer to convert.
binary (bool): If `True`, uses binary suffixes (KiB, MiB) with base
2<sup>10</sup> instead of 10<sup>3</sup>.
gnu (bool): If `True`, the binary argument is ignored and GNU-style
(`ls -sh` style) prefixes are used (K, M) with the 2**10 definition.
format (str): Custom formatter.
Returns:
str: Human readable representation of a filesize.
"""
if gnu:
suffix = suffixes["gnu"]
elif binary:
suffix = suffixes["binary"]
else:
suffix = suffixes["decimal"]
base = 1024 if (gnu or binary) else 1000
bytes = float(value)
abs_bytes = abs(bytes)
if abs_bytes == 1 and not gnu:
return "%d Byte" % bytes
elif abs_bytes < base and not gnu:
return "%d Bytes" % bytes
elif abs_bytes < base and gnu:
return "%dB" % bytes
for i, s in enumerate(suffix):
unit = base ** (i + 2)
if abs_bytes < unit and not gnu:
return (format + " %s") % ((base * bytes / unit), s)
elif abs_bytes < unit and gnu:
return (format + "%s") % ((base * bytes / unit), s)
if gnu:
return (format + "%s") % ((base * bytes / unit), s)
return (format + " %s") % ((base * bytes / unit), s)

132
lib/humanize/i18n.py

@ -0,0 +1,132 @@
# -*- coding: utf-8 -*-
"""Activate, get and deactivate translations."""
import gettext as gettext_module
import os.path
from threading import local
__all__ = ["activate", "deactivate", "gettext", "ngettext"]
_TRANSLATIONS = {None: gettext_module.NullTranslations()}
_CURRENT = local()
def _get_default_locale_path():
try:
if __file__ is None:
return None
return os.path.join(os.path.dirname(__file__), "locale")
except NameError:
return None
def get_translation():
try:
return _TRANSLATIONS[_CURRENT.locale]
except (AttributeError, KeyError):
return _TRANSLATIONS[None]
def activate(locale, path=None):
"""Activate internationalisation.
Set `locale` as current locale. Search for locale in directory `path`.
Args:
locale (str): Language name, e.g. `en_GB`.
path (str): Path to search for locales.
Returns:
dict: Translations.
Raises:
Exception: If humanize cannot find the locale folder.
"""
if path is None:
path = _get_default_locale_path()
if path is None:
raise Exception(
"Humanize cannot determinate the default location of the 'locale' folder. "
"You need to pass the path explicitly."
)
if locale not in _TRANSLATIONS:
translation = gettext_module.translation("humanize", path, [locale])
_TRANSLATIONS[locale] = translation
_CURRENT.locale = locale
return _TRANSLATIONS[locale]
def deactivate():
"""Deactivate internationalisation."""
_CURRENT.locale = None
def gettext(message):
"""Get translation.
Args:
message (str): Text to translate.
Returns:
str: Translated text.
"""
return get_translation().gettext(message)
def pgettext(msgctxt, message):
"""Fetches a particular translation.
It works with `msgctxt` .po modifiers and allows duplicate keys with different
translations.
Args:
msgctxt (str): Context of the translation.
message (str): Text to translate.
Returns:
str: Translated text.
"""
# This GNU gettext function was added in Python 3.8, so for older versions we
# reimplement it. It works by joining `msgctx` and `message` by '4' byte.
try:
# Python 3.8+
return get_translation().pgettext(msgctxt, message)
except AttributeError:
# Python 3.7 and older
key = msgctxt + "\x04" + message
translation = get_translation().gettext(key)
return message if translation == key else translation
def ngettext(message, plural, num):
"""Plural version of gettext.
Args:
message (str): Singular text to translate.
plural (str): Plural text to translate.
num (str): The number (e.g. item count) to determine translation for the
respective grammatical number.
Returns:
str: Translated text.
"""
return get_translation().ngettext(message, plural, num)
def gettext_noop(message):
"""Mark a string as a translation string without translating it.
Example usage:
```python
CONSTANTS = [gettext_noop('first'), gettext_noop('second')]
def num_name(n):
return gettext(CONSTANTS[n])
```
Args:
message (str): Text to translate in the future.
Returns:
str: Original text, unchanged.
"""
return message

BIN
lib/humanize/locale/de_DE/LC_MESSAGES/humanize.mo

Binary file not shown.

287
lib/humanize/locale/de_DE/LC_MESSAGES/humanize.po

@ -0,0 +1,287 @@
# German translation for humanize.
# Copyright (C) 2016 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the humanize package.
# Christian Klein <chris@5711.org>, 2016.
#
msgid ""
msgstr ""
"Project-Id-Version: humanize\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2016-12-18 11:50+0100\n"
"Last-Translator: Christian Klein <chris@5711.org>\n"
"Language-Team: German\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Generated-By: Christian Klein\n"
"X-Generator: Sublime Text 3\n"
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "."
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "."
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "."
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "."
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "."
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "."
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "."
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "."
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "."
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "."
#: src/humanize/number.py:82
msgid "million"
msgstr "Million"
#: src/humanize/number.py:83
msgid "billion"
msgstr "Milliarde"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "Billion"
#: src/humanize/number.py:85
msgid "quadrillion"
msgstr "Billiarde"
#: src/humanize/number.py:86
msgid "quintillion"
msgstr "Trillion"
#: src/humanize/number.py:87
msgid "sextillion"
msgstr "Trilliarde"
#: src/humanize/number.py:88
msgid "septillion"
msgstr "Quadrillion"
#: src/humanize/number.py:89
msgid "octillion"
msgstr "Quadrillarde"
#: src/humanize/number.py:90
msgid "nonillion"
msgstr "Quintillion"
#: src/humanize/number.py:91
msgid "decillion"
msgstr "Quintilliarde"
#: src/humanize/number.py:92
msgid "googol"
msgstr "Googol"
#: src/humanize/number.py:147
msgid "zero"
msgstr "null"
#: src/humanize/number.py:148
msgid "one"
msgstr "eins"
#: src/humanize/number.py:149
msgid "two"
msgstr "zwei"
#: src/humanize/number.py:150
msgid "three"
msgstr "drei"
#: src/humanize/number.py:151
msgid "four"
msgstr "vier"
#: src/humanize/number.py:152
msgid "five"
msgstr "fünf"
#: src/humanize/number.py:153
msgid "six"
msgstr "sechs"
#: src/humanize/number.py:154
msgid "seven"
msgstr "sieben"
#: src/humanize/number.py:155
msgid "eight"
msgstr "acht"
#: src/humanize/number.py:156
msgid "nine"
msgstr "neun"
#: src/humanize/time.py:119
#, fuzzy, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] "%d Mikrosekunde"
msgstr[1] "%d Mikrosekunden"
#: src/humanize/time.py:128
#, fuzzy, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] "%d Millisekunde"
msgstr[1] "%d Millisekunden"
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "ein Moment"
#: src/humanize/time.py:133
msgid "a second"
msgstr "eine Sekunde"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d Sekunde"
msgstr[1] "%d Sekunden"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "eine Minute"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d Minute"
msgstr[1] "%d Minuten"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "eine Stunde"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d Stunde"
msgstr[1] "%d Stunden"
#: src/humanize/time.py:148
msgid "a day"
msgstr "ein Tag"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d Tag"
msgstr[1] "%d Tage"
#: src/humanize/time.py:155
msgid "a month"
msgstr "ein Monat"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d Monat"
msgstr[1] "%d Monate"
#: src/humanize/time.py:160
msgid "a year"
msgstr "ein Jahr"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "ein Jahr und %d Tag"
msgstr[1] "ein Jahr und %d Tage"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "ein Monat"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "ein Jahr und %d Monat"
msgstr[1] "ein Jahr und %d Monate"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d Jahr"
msgstr[1] "%d Jahre"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "%s ab jetzt"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "vor %s"
#: src/humanize/time.py:205
msgid "now"
msgstr "jetzt"
#: src/humanize/time.py:227
msgid "today"
msgstr "heute"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "morgen"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "gestern"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr "%s und %s"

BIN
lib/humanize/locale/es_ES/LC_MESSAGES/humanize.mo

Binary file not shown.

286
lib/humanize/locale/es_ES/LC_MESSAGES/humanize.po

@ -0,0 +1,286 @@
# Spanish (Spain) translations for PROJECT.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Álvaro Mondéjar <mondejar1994@gmail.com>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2020-03-31 21:08+0200\n"
"Last-Translator: Álvaro Mondéjar <mondejar1994@gmail.com>\n"
"Language-Team: \n"
"Language: es_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n"
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "º"
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "º"
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "º"
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "º"
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "º"
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "º"
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "º"
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "º"
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "º"
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "º"
#: src/humanize/number.py:82
msgid "million"
msgstr "millón"
#: src/humanize/number.py:83
msgid "billion"
msgstr "billón"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "trillón"
#: src/humanize/number.py:85
msgid "quadrillion"
msgstr "quatrillón"
#: src/humanize/number.py:86
msgid "quintillion"
msgstr "quintillón"
#: src/humanize/number.py:87
msgid "sextillion"
msgstr "sextillón"
#: src/humanize/number.py:88
msgid "septillion"
msgstr "septillón"
#: src/humanize/number.py:89
msgid "octillion"
msgstr "octillón"
#: src/humanize/number.py:90
msgid "nonillion"
msgstr "nonillón"
#: src/humanize/number.py:91
msgid "decillion"
msgstr "decillón"
#: src/humanize/number.py:92
msgid "googol"
msgstr "gúgol"
#: src/humanize/number.py:147
msgid "zero"
msgstr "cero"
#: src/humanize/number.py:148
msgid "one"
msgstr "uno"
#: src/humanize/number.py:149
msgid "two"
msgstr "dos"
#: src/humanize/number.py:150
msgid "three"
msgstr "tres"
#: src/humanize/number.py:151
msgid "four"
msgstr "cuatro"
#: src/humanize/number.py:152
msgid "five"
msgstr "cinco"
#: src/humanize/number.py:153
msgid "six"
msgstr "seis"
#: src/humanize/number.py:154
msgid "seven"
msgstr "siete"
#: src/humanize/number.py:155
msgid "eight"
msgstr "ocho"
#: src/humanize/number.py:156
msgid "nine"
msgstr "nueve"
#: src/humanize/time.py:119
#, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] "%d microsegundo"
msgstr[1] "%d microsegundos"
#: src/humanize/time.py:128
#, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] "%d milisegundo"
msgstr[1] "%d milisegundos"
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "un momento"
#: src/humanize/time.py:133
msgid "a second"
msgstr "un segundo"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d segundo"
msgstr[1] "%d segundos"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "un minuto"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d minuto"
msgstr[1] "%d minutos"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "una hora"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d hora"
msgstr[1] "%d horas"
#: src/humanize/time.py:148
msgid "a day"
msgstr "un día"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d día"
msgstr[1] "%d días"
#: src/humanize/time.py:155
msgid "a month"
msgstr "un mes"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d mes"
msgstr[1] "%d meses"
#: src/humanize/time.py:160
msgid "a year"
msgstr "un año"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "1 año y %d día"
msgstr[1] "1 año y %d días"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "1 año y 1 mes"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "1 año y %d mes"
msgstr[1] "1 año y %d meses"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d año"
msgstr[1] "%d años"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "en %s"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "hace %s"
#: src/humanize/time.py:205
msgid "now"
msgstr "ahora"
#: src/humanize/time.py:227
msgid "today"
msgstr "hoy"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "mañana"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "ayer"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr ""

BIN
lib/humanize/locale/fa_IR/LC_MESSAGES/humanize.mo

Binary file not shown.

287
lib/humanize/locale/fa_IR/LC_MESSAGES/humanize.po

@ -0,0 +1,287 @@
# German translation for humanize.
# Copyright (C) 2016 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the humanize package.
# Christian Klein <chris@5711.org>, 2016.
#
msgid ""
msgstr ""
"Project-Id-Version: humanize\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2017-01-10 02:44+0330\n"
"Last-Translator: Christian Klein <chris@5711.org>\n"
"Language-Team: German\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Generated-By: Christian Klein\n"
"X-Generator: Poedit 1.5.4\n"
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "."
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "اولین"
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "دومین"
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "سومین"
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "چهارمین"
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "پنجمین"
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "ششمین"
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "هفتمین"
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "هشتمین"
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "نهمین"
#: src/humanize/number.py:82
msgid "million"
msgstr "میلیون"
#: src/humanize/number.py:83
msgid "billion"
msgstr "میلیارد"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "ترلیون"
#: src/humanize/number.py:85
msgid "quadrillion"
msgstr "کوادریلیون"
#: src/humanize/number.py:86
msgid "quintillion"
msgstr "کوانتیلیون"
#: src/humanize/number.py:87
msgid "sextillion"
msgstr "سکستیلیون"
#: src/humanize/number.py:88
msgid "septillion"
msgstr "سپتیلیون"
#: src/humanize/number.py:89
msgid "octillion"
msgstr "اوکتیلیون"
#: src/humanize/number.py:90
msgid "nonillion"
msgstr "نونیلیون"
#: src/humanize/number.py:91
msgid "decillion"
msgstr "دسیلیون"
#: src/humanize/number.py:92
msgid "googol"
msgstr "گوگول"
#: src/humanize/number.py:147
msgid "zero"
msgstr ""
#: src/humanize/number.py:148
msgid "one"
msgstr "یک"
#: src/humanize/number.py:149
msgid "two"
msgstr "دو"
#: src/humanize/number.py:150
msgid "three"
msgstr "سه"
#: src/humanize/number.py:151
msgid "four"
msgstr "چهار"
#: src/humanize/number.py:152
msgid "five"
msgstr "پنج"
#: src/humanize/number.py:153
msgid "six"
msgstr "شش"
#: src/humanize/number.py:154
msgid "seven"
msgstr "هفت"
#: src/humanize/number.py:155
msgid "eight"
msgstr "هشت"
#: src/humanize/number.py:156
msgid "nine"
msgstr "نه"
#: src/humanize/time.py:119
#, fuzzy, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] ""
msgstr[1] ""
#: src/humanize/time.py:128
#, fuzzy, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] ""
msgstr[1] ""
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "یک لحظه"
#: src/humanize/time.py:133
msgid "a second"
msgstr "یک ثانیه"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d ثانیه"
msgstr[1] "%d ثانیه"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "یک دقیقه"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d دقیقه"
msgstr[1] "%d دقیقه"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "یک ساعت"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d ساعت"
msgstr[1] "%d ساعت"
#: src/humanize/time.py:148
msgid "a day"
msgstr "یک روز"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d روز"
msgstr[1] "%d روز"
#: src/humanize/time.py:155
msgid "a month"
msgstr "یک ماه"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d ماه"
msgstr[1] "%d ماه"
#: src/humanize/time.py:160
msgid "a year"
msgstr "یک سال"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "۱ سال و %d روز"
msgstr[1] "۱ سال و %d روز"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "۱ سال و ۱ ماه"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "۱ سال و %d ماه"
msgstr[1] "۱ سال و %d ماه"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d سال"
msgstr[1] "%d سال"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "%s تا به اکنون"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "%s پیش"
#: src/humanize/time.py:205
msgid "now"
msgstr "اکنون"
#: src/humanize/time.py:227
msgid "today"
msgstr "امروز"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "فردا"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "دیروز"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr ""

BIN
lib/humanize/locale/fi_FI/LC_MESSAGES/humanize.mo

Binary file not shown.

286
lib/humanize/locale/fi_FI/LC_MESSAGES/humanize.po

@ -0,0 +1,286 @@
# Finnish translations for humanize package
# Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the humanize package.
# Ville Skyttä <ville.skytta@iki.fi>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: humanize\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2017-03-02 11:26+0200\n"
"Last-Translator: Ville Skyttä <ville.skytta@iki.fi>\n"
"Language-Team: Finnish\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 1.8.12\n"
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "."
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "."
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "."
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "."
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "."
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "."
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "."
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "."
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "."
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "."
#: src/humanize/number.py:82
msgid "million"
msgstr "miljoonaa"
#: src/humanize/number.py:83
msgid "billion"
msgstr "miljardia"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "biljoonaa"
#: src/humanize/number.py:85
msgid "quadrillion"
msgstr "kvadriljoonaa"
#: src/humanize/number.py:86
msgid "quintillion"
msgstr "kvintiljoonaa"
#: src/humanize/number.py:87
msgid "sextillion"
msgstr "sekstiljoonaa"
#: src/humanize/number.py:88
msgid "septillion"
msgstr "septiljoonaa"
#: src/humanize/number.py:89
msgid "octillion"
msgstr "oktiljoonaa"
#: src/humanize/number.py:90
msgid "nonillion"
msgstr "noniljoonaa"
#: src/humanize/number.py:91
msgid "decillion"
msgstr "dekiljoonaa"
#: src/humanize/number.py:92
msgid "googol"
msgstr "googol"
#: src/humanize/number.py:147
msgid "zero"
msgstr "nolla"
#: src/humanize/number.py:148
msgid "one"
msgstr "yksi"
#: src/humanize/number.py:149
msgid "two"
msgstr "kaksi"
#: src/humanize/number.py:150
msgid "three"
msgstr "kolme"
#: src/humanize/number.py:151
msgid "four"
msgstr "neljä"
#: src/humanize/number.py:152
msgid "five"
msgstr "viisi"
#: src/humanize/number.py:153
msgid "six"
msgstr "kuusi"
#: src/humanize/number.py:154
msgid "seven"
msgstr "seitsemän"
#: src/humanize/number.py:155
msgid "eight"
msgstr "kahdeksan"
#: src/humanize/number.py:156
msgid "nine"
msgstr "yhdeksän"
#: src/humanize/time.py:119
#, fuzzy, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] "%d mikrosekunti"
msgstr[1] "%d mikrosekuntia"
#: src/humanize/time.py:128
#, fuzzy, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] "%d millisekunti"
msgstr[1] "%d millisekuntia"
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "hetki"
#: src/humanize/time.py:133
msgid "a second"
msgstr "sekunti"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d sekunti"
msgstr[1] "%d sekuntia"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "minuutti"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d minuutti"
msgstr[1] "%d minuuttia"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "tunti"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d tunti"
msgstr[1] "%d tuntia"
#: src/humanize/time.py:148
msgid "a day"
msgstr "päivä"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d päivä"
msgstr[1] "%d päivää"
#: src/humanize/time.py:155
msgid "a month"
msgstr "kuukausi"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d kuukausi"
msgstr[1] "%d kuukautta"
#: src/humanize/time.py:160
msgid "a year"
msgstr "vuosi"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "1 vuosi, %d päivä"
msgstr[1] "1 vuosi, %d päivää"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "1 vuosi, 1 kuukausi"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "1 vuosi, %d kuukausi"
msgstr[1] "1 vuosi, %d kuukautta"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d vuosi"
msgstr[1] "%d vuotta"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "%s tästä"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "%s sitten"
#: src/humanize/time.py:205
msgid "now"
msgstr "nyt"
#: src/humanize/time.py:227
msgid "today"
msgstr "tänään"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "huomenna"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "eilen"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr "%s ja %s"

BIN
lib/humanize/locale/fr_FR/LC_MESSAGES/humanize.mo

Binary file not shown.

307
lib/humanize/locale/fr_FR/LC_MESSAGES/humanize.po

@ -0,0 +1,307 @@
# French (France) translations for PROJECT.
# Copyright (C) 2013 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2013-06-22 08:52+0100\n"
"Last-Translator: Olivier Cortès <oc@1flow.io>\n"
"Language-Team: fr_FR <LL@li.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"Generated-By: Babel 0.9.6\n"
"X-Generator: Poedit 1.5.5\n"
#: src/humanize/number.py:31
#, fuzzy
msgctxt "0"
msgid "th"
msgstr "e"
#: src/humanize/number.py:32
#, fuzzy
msgctxt "1"
msgid "st"
msgstr "er"
#: src/humanize/number.py:33
#, fuzzy
msgctxt "2"
msgid "nd"
msgstr "e"
#: src/humanize/number.py:34
#, fuzzy
msgctxt "3"
msgid "rd"
msgstr "e"
#: src/humanize/number.py:35
#, fuzzy
msgctxt "4"
msgid "th"
msgstr "e"
#: src/humanize/number.py:36
#, fuzzy
msgctxt "5"
msgid "th"
msgstr "e"
#: src/humanize/number.py:37
#, fuzzy
msgctxt "6"
msgid "th"
msgstr "e"
#: src/humanize/number.py:38
#, fuzzy
msgctxt "7"
msgid "th"
msgstr "e"
#: src/humanize/number.py:39
#, fuzzy
msgctxt "8"
msgid "th"
msgstr "e"
#: src/humanize/number.py:40
#, fuzzy
msgctxt "9"
msgid "th"
msgstr "e"
#: src/humanize/number.py:82
#, fuzzy
msgid "million"
msgstr "%(value)s million"
#: src/humanize/number.py:83
msgid "billion"
msgstr "milliard"
#: src/humanize/number.py:84
#, fuzzy
msgid "trillion"
msgstr "%(value)s billion"
#: src/humanize/number.py:85
#, fuzzy
msgid "quadrillion"
msgstr "%(value)s billiard"
#: src/humanize/number.py:86
#, fuzzy
msgid "quintillion"
msgstr "%(value)s trillion"
#: src/humanize/number.py:87
#, fuzzy
msgid "sextillion"
msgstr "%(value)s trilliard"
#: src/humanize/number.py:88
#, fuzzy
msgid "septillion"
msgstr "%(value)s quatrillion"
#: src/humanize/number.py:89
#, fuzzy
msgid "octillion"
msgstr "%(value)s quadrilliard"
#: src/humanize/number.py:90
#, fuzzy
msgid "nonillion"
msgstr "%(value)s quintillion"
#: src/humanize/number.py:91
#, fuzzy
msgid "decillion"
msgstr "%(value)s quintilliard"
#: src/humanize/number.py:92
#, fuzzy
msgid "googol"
msgstr "%(value)s gogol"
#: src/humanize/number.py:147
msgid "zero"
msgstr "zéro"
#: src/humanize/number.py:148
msgid "one"
msgstr "un"
#: src/humanize/number.py:149
msgid "two"
msgstr "deux"
#: src/humanize/number.py:150
msgid "three"
msgstr "trois"
#: src/humanize/number.py:151
msgid "four"
msgstr "quatre"
#: src/humanize/number.py:152
msgid "five"
msgstr "cinq"
#: src/humanize/number.py:153
msgid "six"
msgstr "six"
#: src/humanize/number.py:154
msgid "seven"
msgstr "sept"
#: src/humanize/number.py:155
msgid "eight"
msgstr "huit"
#: src/humanize/number.py:156
msgid "nine"
msgstr "neuf"
#: src/humanize/time.py:119
#, fuzzy, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] "%d microseconde"
msgstr[1] "%d microsecondes"
#: src/humanize/time.py:128
#, fuzzy, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] "%d milliseconde"
msgstr[1] "%d millisecondes"
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "un moment"
#: src/humanize/time.py:133
msgid "a second"
msgstr "une seconde"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d seconde"
msgstr[1] "%d secondes"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "une minute"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d minute"
msgstr[1] "%d minutes"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "une heure"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d heure"
msgstr[1] "%d heures"
#: src/humanize/time.py:148
msgid "a day"
msgstr "un jour"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d jour"
msgstr[1] "%d jours"
#: src/humanize/time.py:155
msgid "a month"
msgstr "un mois"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d mois"
msgstr[1] "%d mois"
#: src/humanize/time.py:160
msgid "a year"
msgstr "un an"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "un an et %d jour"
msgstr[1] "un an et %d jours"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "un an et un mois"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "un an et %d mois"
msgstr[1] "un an et %d mois"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d an"
msgstr[1] "%d ans"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "dans %s"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "il y a %s"
#: src/humanize/time.py:205
msgid "now"
msgstr "maintenant"
#: src/humanize/time.py:227
msgid "today"
msgstr "aujourd'hui"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "demain"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "hier"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr "%s et %s"

BIN
lib/humanize/locale/id_ID/LC_MESSAGES/humanize.mo

Binary file not shown.

276
lib/humanize/locale/id_ID/LC_MESSAGES/humanize.po

@ -0,0 +1,276 @@
# Indonesian translations for PACKAGE package.
# Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# <adie.rebel@gmail.com>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2017-03-18 15:41+0700\n"
"Last-Translator: adie.rebel@gmail.com\n"
"Language-Team: Indonesian\n"
"Language: id\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 1.8.11\n"
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "."
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "."
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "."
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "."
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "."
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "."
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "."
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "."
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "."
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "."
#: src/humanize/number.py:82
msgid "million"
msgstr "juta"
#: src/humanize/number.py:83
msgid "billion"
msgstr "miliar"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "triliun"
#: src/humanize/number.py:85
msgid "quadrillion"
msgstr "kuadriliun"
#: src/humanize/number.py:86
msgid "quintillion"
msgstr "quintillion"
#: src/humanize/number.py:87
msgid "sextillion"
msgstr "sextillion"
#: src/humanize/number.py:88
msgid "septillion"
msgstr "septillion"
#: src/humanize/number.py:89
msgid "octillion"
msgstr "octillion"
#: src/humanize/number.py:90
msgid "nonillion"
msgstr "nonillion"
#: src/humanize/number.py:91
msgid "decillion"
msgstr "decillion"
#: src/humanize/number.py:92
msgid "googol"
msgstr "googol"
#: src/humanize/number.py:147
msgid "zero"
msgstr "nol"
#: src/humanize/number.py:148
msgid "one"
msgstr "satu"
#: src/humanize/number.py:149
msgid "two"
msgstr "dua"
#: src/humanize/number.py:150
msgid "three"
msgstr "tiga"
#: src/humanize/number.py:151
msgid "four"
msgstr "empat"
#: src/humanize/number.py:152
msgid "five"
msgstr "lima"
#: src/humanize/number.py:153
msgid "six"
msgstr "enam"
#: src/humanize/number.py:154
msgid "seven"
msgstr "tujuh"
#: src/humanize/number.py:155
msgid "eight"
msgstr "delapan"
#: src/humanize/number.py:156
msgid "nine"
msgstr "sembilan"
#: src/humanize/time.py:119
#, fuzzy, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] "%d mikro detik"
#: src/humanize/time.py:128
#, fuzzy, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] "%d mili detik"
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "beberapa saat"
#: src/humanize/time.py:133
msgid "a second"
msgstr "sedetik"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d detik"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "semenit"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d menit"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "sejam"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d jam"
#: src/humanize/time.py:148
msgid "a day"
msgstr "sehari"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d hari"
#: src/humanize/time.py:155
msgid "a month"
msgstr "sebulan"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d bulan"
#: src/humanize/time.py:160
msgid "a year"
msgstr "setahun"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "1 tahun, %d hari"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "1 tahun, 1 bulan"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "1 tahun, %d bulan"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d tahun"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "%s dari sekarang"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "%s yang lalu"
#: src/humanize/time.py:205
msgid "now"
msgstr "sekarang"
#: src/humanize/time.py:227
msgid "today"
msgstr "hari ini"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "besok"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "kemarin"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr "%s dan %s"

BIN
lib/humanize/locale/it_IT/LC_MESSAGES/humanize.mo

Binary file not shown.

286
lib/humanize/locale/it_IT/LC_MESSAGES/humanize.po

@ -0,0 +1,286 @@
# Italian translations for PACKAGE package.
# Copyright (C) 2018 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# derfel <code@derfel.net>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2018-10-27 22:52+0200\n"
"Last-Translator: derfel <code@derfel.net>\n"
"Language-Team: Italian\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.2\n"
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "º"
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "º"
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "º"
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "º"
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "º"
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "º"
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "º"
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "º"
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "º"
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "º"
#: src/humanize/number.py:82
msgid "million"
msgstr "milioni"
#: src/humanize/number.py:83
msgid "billion"
msgstr "miliardi"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "bilioni"
#: src/humanize/number.py:85
msgid "quadrillion"
msgstr "biliardi"
#: src/humanize/number.py:86
msgid "quintillion"
msgstr "trilioni"
#: src/humanize/number.py:87
msgid "sextillion"
msgstr "triliardi"
#: src/humanize/number.py:88
msgid "septillion"
msgstr "quadrilioni"
#: src/humanize/number.py:89
msgid "octillion"
msgstr "quadriliardi"
#: src/humanize/number.py:90
msgid "nonillion"
msgstr "quintilioni"
#: src/humanize/number.py:91
msgid "decillion"
msgstr "quintiliardi"
#: src/humanize/number.py:92
msgid "googol"
msgstr "googol"
#: src/humanize/number.py:147
msgid "zero"
msgstr "zero"
#: src/humanize/number.py:148
msgid "one"
msgstr "uno"
#: src/humanize/number.py:149
msgid "two"
msgstr "due"
#: src/humanize/number.py:150
msgid "three"
msgstr "tre"
#: src/humanize/number.py:151
msgid "four"
msgstr "quattro"
#: src/humanize/number.py:152
msgid "five"
msgstr "cinque"
#: src/humanize/number.py:153
msgid "six"
msgstr "sei"
#: src/humanize/number.py:154
msgid "seven"
msgstr "sette"
#: src/humanize/number.py:155
msgid "eight"
msgstr "otto"
#: src/humanize/number.py:156
msgid "nine"
msgstr "nove"
#: src/humanize/time.py:119
#, fuzzy, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] "%d microsecondo"
msgstr[1] "%d microsecondi"
#: src/humanize/time.py:128
#, fuzzy, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] "%d millisecondo"
msgstr[1] "%d millisecondi"
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "un momento"
#: src/humanize/time.py:133
msgid "a second"
msgstr "un secondo"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d secondo"
msgstr[1] "%d secondi"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "un minuto"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d minuto"
msgstr[1] "%d minuti"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "un'ora"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d ora"
msgstr[1] "%d ore"
#: src/humanize/time.py:148
msgid "a day"
msgstr "un giorno"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d giorno"
msgstr[1] "%d giorni"
#: src/humanize/time.py:155
msgid "a month"
msgstr "un mese"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d mese"
msgstr[1] "%d mesi"
#: src/humanize/time.py:160
msgid "a year"
msgstr "un anno"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "un anno e %d giorno"
msgstr[1] "un anno e %d giorni"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "un anno ed un mese"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "un anno e %d mese"
msgstr[1] "un anno e %d mesi"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d anno"
msgstr[1] "%d anni"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "fra %s"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "%s fa"
#: src/humanize/time.py:205
msgid "now"
msgstr "adesso"
#: src/humanize/time.py:227
msgid "today"
msgstr "oggi"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "domani"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "ieri"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr ""

BIN
lib/humanize/locale/ja_JP/LC_MESSAGES/humanize.mo

Binary file not shown.

288
lib/humanize/locale/ja_JP/LC_MESSAGES/humanize.po

@ -0,0 +1,288 @@
# Japanese (Japan) translations for humanize.
# Copyright (C) 2018
# This file is distributed under the same license as the humanize project.
# @qoolloop, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: humanize\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2018-01-22 10:48+0900\n"
"Last-Translator: Kan Torii <oss@qoolloop.com>\n"
"Language-Team: Japanese\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"Generated-By: Babel 0.9.6\n"
"X-Generator: Poedit 2.0.6\n"
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "番目"
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "番目"
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "番目"
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "番目"
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "番目"
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "番目"
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "番目"
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "番目"
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "番目"
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "番目"
#: src/humanize/number.py:82
msgid "million"
msgstr "百万"
#: src/humanize/number.py:83
#, fuzzy
msgid "billion"
msgstr "十億"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "兆"
#: src/humanize/number.py:85
#, fuzzy
msgid "quadrillion"
msgstr "千兆"
#: src/humanize/number.py:86
#, fuzzy
msgid "quintillion"
msgstr "百京"
#: src/humanize/number.py:87
#, fuzzy
msgid "sextillion"
msgstr "十垓"
#: src/humanize/number.py:88
#, fuzzy
msgid "septillion"
msgstr "じょ"
#: src/humanize/number.py:89
#, fuzzy
msgid "octillion"
msgstr "千じょ"
#: src/humanize/number.py:90
#, fuzzy
msgid "nonillion"
msgstr "百穣"
#: src/humanize/number.py:91
#, fuzzy
msgid "decillion"
msgstr "十溝"
#: src/humanize/number.py:92
#, fuzzy
msgid "googol"
msgstr "溝無量大数"
#: src/humanize/number.py:147
msgid "zero"
msgstr ""
#: src/humanize/number.py:148
msgid "one"
msgstr "一"
#: src/humanize/number.py:149
msgid "two"
msgstr "二"
#: src/humanize/number.py:150
msgid "three"
msgstr "三"
#: src/humanize/number.py:151
msgid "four"
msgstr "四"
#: src/humanize/number.py:152
msgid "five"
msgstr "五"
#: src/humanize/number.py:153
msgid "six"
msgstr "六"
#: src/humanize/number.py:154
msgid "seven"
msgstr "七"
#: src/humanize/number.py:155
msgid "eight"
msgstr "八"
#: src/humanize/number.py:156
msgid "nine"
msgstr "九"
#: src/humanize/time.py:119
#, fuzzy, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] ""
#: src/humanize/time.py:128
#, fuzzy, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] ""
#: src/humanize/time.py:131 src/humanize/time.py:204
#, fuzzy
msgid "a moment"
msgstr "短時間"
#: src/humanize/time.py:133
msgid "a second"
msgstr "1秒"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d秒"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "1分"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d分"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "1時間"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d時間"
#: src/humanize/time.py:148
msgid "a day"
msgstr "1日"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d日"
#: src/humanize/time.py:155
msgid "a month"
msgstr "1ヶ月"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%dヶ月"
#: src/humanize/time.py:160
msgid "a year"
msgstr "1年"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "1年 %d日"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "1年 1ヶ月"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "1年 %dヶ月"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d年"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "%s後"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "%s前"
#: src/humanize/time.py:205
#, fuzzy
msgid "now"
msgstr "今"
#: src/humanize/time.py:227
msgid "today"
msgstr "本日"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "明日"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "昨日"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr ""

BIN
lib/humanize/locale/ko_KR/LC_MESSAGES/humanize.mo

Binary file not shown.

306
lib/humanize/locale/ko_KR/LC_MESSAGES/humanize.po

@ -0,0 +1,306 @@
# Korean (Korea) translations for humanize.
# Copyright (C) 2013
# This file is distributed under the same license as the humanize project.
# @youngrok, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2013-07-10 11:38+0900\n"
"Last-Translator: @youngrok\n"
"Language-Team: ko_KR <LL@li.org>\n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"Generated-By: Babel 0.9.6\n"
"X-Generator: Poedit 1.5.7\n"
#: src/humanize/number.py:31
#, fuzzy
msgctxt "0"
msgid "th"
msgstr "번째"
#: src/humanize/number.py:32
#, fuzzy
msgctxt "1"
msgid "st"
msgstr "번째"
#: src/humanize/number.py:33
#, fuzzy
msgctxt "2"
msgid "nd"
msgstr "번째"
#: src/humanize/number.py:34
#, fuzzy
msgctxt "3"
msgid "rd"
msgstr "번째"
#: src/humanize/number.py:35
#, fuzzy
msgctxt "4"
msgid "th"
msgstr "번째"
#: src/humanize/number.py:36
#, fuzzy
msgctxt "5"
msgid "th"
msgstr "번째"
#: src/humanize/number.py:37
#, fuzzy
msgctxt "6"
msgid "th"
msgstr "번째"
#: src/humanize/number.py:38
#, fuzzy
msgctxt "7"
msgid "th"
msgstr "번째"
#: src/humanize/number.py:39
#, fuzzy
msgctxt "8"
msgid "th"
msgstr "번째"
#: src/humanize/number.py:40
#, fuzzy
msgctxt "9"
msgid "th"
msgstr "번째"
#: src/humanize/number.py:82
msgid "million"
msgstr "%(value)s million"
#: src/humanize/number.py:83
msgid "billion"
msgstr "milliard"
#: src/humanize/number.py:84
#, fuzzy
msgid "trillion"
msgstr "%(value)s billion"
#: src/humanize/number.py:85
#, fuzzy
msgid "quadrillion"
msgstr "%(value)s quadrillion"
#: src/humanize/number.py:86
#, fuzzy
msgid "quintillion"
msgstr "%(value)s quintillion"
#: src/humanize/number.py:87
#, fuzzy
msgid "sextillion"
msgstr "%(value)s sextillion"
#: src/humanize/number.py:88
#, fuzzy
msgid "septillion"
msgstr "%(value)s septillion"
#: src/humanize/number.py:89
#, fuzzy
msgid "octillion"
msgstr "%(value)s octillion"
#: src/humanize/number.py:90
#, fuzzy
msgid "nonillion"
msgstr "%(value)s nonillion"
#: src/humanize/number.py:91
#, fuzzy
msgid "decillion"
msgstr "%(value)s décillion"
#: src/humanize/number.py:92
#, fuzzy
msgid "googol"
msgstr "%(value)s gogol"
#: src/humanize/number.py:147
msgid "zero"
msgstr ""
#: src/humanize/number.py:148
msgid "one"
msgstr "하나"
#: src/humanize/number.py:149
msgid "two"
msgstr "둘"
#: src/humanize/number.py:150
msgid "three"
msgstr "셋"
#: src/humanize/number.py:151
msgid "four"
msgstr "넷"
#: src/humanize/number.py:152
msgid "five"
msgstr "다섯"
#: src/humanize/number.py:153
msgid "six"
msgstr "여섯"
#: src/humanize/number.py:154
msgid "seven"
msgstr "일곱"
#: src/humanize/number.py:155
msgid "eight"
msgstr "여덟"
#: src/humanize/number.py:156
msgid "nine"
msgstr "아홉"
#: src/humanize/time.py:119
#, fuzzy, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] ""
msgstr[1] ""
#: src/humanize/time.py:128
#, fuzzy, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] ""
msgstr[1] ""
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "잠깐"
#: src/humanize/time.py:133
msgid "a second"
msgstr "1초"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d초"
msgstr[1] "%d초"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "1분"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d분"
msgstr[1] "%d분"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "1시간"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d heure"
msgstr[1] "%d시간"
#: src/humanize/time.py:148
msgid "a day"
msgstr "하루"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d jour"
msgstr[1] "%d일"
#: src/humanize/time.py:155
msgid "a month"
msgstr "한달"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d mois"
msgstr[1] "%d개월"
#: src/humanize/time.py:160
msgid "a year"
msgstr "1년"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "1년 %d일"
msgstr[1] "1년 %d일"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "1년, 1개월"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "1년, %d개월"
msgstr[1] "1년, %d개월"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d 년"
msgstr[1] "%d ans"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "%s 후"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "%s 전"
#: src/humanize/time.py:205
msgid "now"
msgstr "방금"
#: src/humanize/time.py:227
msgid "today"
msgstr "오늘"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "내일"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "어제"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr ""

BIN
lib/humanize/locale/nl_NL/LC_MESSAGES/humanize.mo

Binary file not shown.

287
lib/humanize/locale/nl_NL/LC_MESSAGES/humanize.po

@ -0,0 +1,287 @@
# French (France) translations for PROJECT.
# Copyright (C) 2013 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2015-03-25 21:08+0100\n"
"Last-Translator: Martin van Wingerden\n"
"Language-Team: nl_NL\n"
"Language: nl_NL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Generated-By: Babel 0.9.6\n"
"X-Generator: Poedit 1.7.5\n"
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "de"
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "ste"
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "de"
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "de"
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "de"
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "de"
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "de"
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "de"
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "de"
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "de"
#: src/humanize/number.py:82
msgid "million"
msgstr "miljoen"
#: src/humanize/number.py:83
msgid "billion"
msgstr "miljard"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "biljoen"
#: src/humanize/number.py:85
msgid "quadrillion"
msgstr "biljard"
#: src/humanize/number.py:86
msgid "quintillion"
msgstr "triljoen"
#: src/humanize/number.py:87
msgid "sextillion"
msgstr "triljard"
#: src/humanize/number.py:88
msgid "septillion"
msgstr "quadriljoen"
#: src/humanize/number.py:89
msgid "octillion"
msgstr "quadriljard"
#: src/humanize/number.py:90
msgid "nonillion"
msgstr "quintiljoen"
#: src/humanize/number.py:91
msgid "decillion"
msgstr "quintiljard"
#: src/humanize/number.py:92
msgid "googol"
msgstr "googol"
#: src/humanize/number.py:147
msgid "zero"
msgstr "nul"
#: src/humanize/number.py:148
msgid "one"
msgstr "één"
#: src/humanize/number.py:149
msgid "two"
msgstr "twee"
#: src/humanize/number.py:150
msgid "three"
msgstr "drie"
#: src/humanize/number.py:151
msgid "four"
msgstr "vier"
#: src/humanize/number.py:152
msgid "five"
msgstr "vijf"
#: src/humanize/number.py:153
msgid "six"
msgstr "zes"
#: src/humanize/number.py:154
msgid "seven"
msgstr "zeven"
#: src/humanize/number.py:155
msgid "eight"
msgstr "acht"
#: src/humanize/number.py:156
msgid "nine"
msgstr "negen"
#: src/humanize/time.py:119
#, fuzzy, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] "%d microseconde"
msgstr[1] "%d microseconden"
#: src/humanize/time.py:128
#, fuzzy, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] "%d milliseconde"
msgstr[1] "%d milliseconden"
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "een moment"
#: src/humanize/time.py:133
msgid "a second"
msgstr "een seconde"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d seconde"
msgstr[1] "%d seconden"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "een minuut"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d minuut"
msgstr[1] "%d minuten"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "een uur"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d uur"
msgstr[1] "%d uren"
#: src/humanize/time.py:148
msgid "a day"
msgstr "een dag"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d dag"
msgstr[1] "%d dagen"
#: src/humanize/time.py:155
msgid "a month"
msgstr "een maand"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d maand"
msgstr[1] "%d maanden"
#: src/humanize/time.py:160
msgid "a year"
msgstr "een jaar"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "1 jaar, %d dag"
msgstr[1] "1 jaar, %d dagen"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "1 jaar, 1 maand"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "1 jaar, %d maand"
msgstr[1] "1 jaar, %d maanden"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d jaar"
msgstr[1] "%d jaar"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "over %s"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "%s geleden"
#: src/humanize/time.py:205
msgid "now"
msgstr "nu"
#: src/humanize/time.py:227
msgid "today"
msgstr "vandaag"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "morgen"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "gisteren"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr "%s en %s"

BIN
lib/humanize/locale/pl_PL/LC_MESSAGES/humanize.mo

Binary file not shown.

296
lib/humanize/locale/pl_PL/LC_MESSAGES/humanize.po

@ -0,0 +1,296 @@
# Polish translations for PACKAGE package.
# Copyright (C) 2020 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Bartosz Bubak <bartosz.bubak@gmail.com>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2020-04-22 10:02+0200\n"
"Last-Translator: Bartosz Bubak <bartosz.bubak gmail com>\n"
"Language-Team: Polish\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2);\n"
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "."
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "."
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "."
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "."
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "."
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "."
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "."
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "."
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "."
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "."
#: src/humanize/number.py:82
msgid "million"
msgstr "milion"
#: src/humanize/number.py:83
msgid "billion"
msgstr "bilion"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "trylion"
#: src/humanize/number.py:85
msgid "quadrillion"
msgstr "kwadrylion"
#: src/humanize/number.py:86
msgid "quintillion"
msgstr "kwintylion"
#: src/humanize/number.py:87
msgid "sextillion"
msgstr "sekstylion"
#: src/humanize/number.py:88
msgid "septillion"
msgstr "septylion"
#: src/humanize/number.py:89
msgid "octillion"
msgstr "oktylion"
#: src/humanize/number.py:90
msgid "nonillion"
msgstr "nonilion"
#: src/humanize/number.py:91
msgid "decillion"
msgstr "decylion"
#: src/humanize/number.py:92
msgid "googol"
msgstr "googol"
#: src/humanize/number.py:147
msgid "zero"
msgstr "zero"
#: src/humanize/number.py:148
msgid "one"
msgstr "jeden"
#: src/humanize/number.py:149
msgid "two"
msgstr "dwa"
#: src/humanize/number.py:150
msgid "three"
msgstr "trzy"
#: src/humanize/number.py:151
msgid "four"
msgstr "cztery"
#: src/humanize/number.py:152
msgid "five"
msgstr "pięć"
#: src/humanize/number.py:153
msgid "six"
msgstr "sześć"
#: src/humanize/number.py:154
msgid "seven"
msgstr "siedem"
#: src/humanize/number.py:155
msgid "eight"
msgstr "osiem"
#: src/humanize/number.py:156
msgid "nine"
msgstr "dziewięć"
#: src/humanize/time.py:119
#, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] "%d mikrosekunda"
msgstr[1] "%d mikrosekundy"
msgstr[2] "%d mikrosekund"
#: src/humanize/time.py:128
#, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] "%d milisekunda"
msgstr[1] "%d milisekundy"
msgstr[2] "%d milisekund"
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "chwila"
#: src/humanize/time.py:133
msgid "a second"
msgstr "sekunda"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d sekunda"
msgstr[1] "%d sekundy"
msgstr[2] "%d sekund"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "minuta"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d minuta"
msgstr[1] "%d minuty"
msgstr[2] "%d minut"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "godzina"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d godzina"
msgstr[1] "%d godziny"
msgstr[2] "%d godzin"
#: src/humanize/time.py:148
msgid "a day"
msgstr "dzień"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d dzień"
msgstr[1] "%d dni"
msgstr[2] "%d dni"
#: src/humanize/time.py:155
msgid "a month"
msgstr "miesiąc"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d miesiąc"
msgstr[1] "%d miesiące"
msgstr[2] "%d miesięcy"
#: src/humanize/time.py:160
msgid "a year"
msgstr "rok"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "1 rok, %d dzień"
msgstr[1] "1 rok, %d dni"
msgstr[2] "1 rok, %d dni"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr ""
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "1 rok, %d miesiąc"
msgstr[1] "1 rok, %d miesiące"
msgstr[2] "1 rok, %d miesięcy"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d rok"
msgstr[1] "%d lat"
msgstr[2] "%d lata"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "%s od teraz"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "%s temu"
#: src/humanize/time.py:205
msgid "now"
msgstr "teraz"
#: src/humanize/time.py:227
msgid "today"
msgstr "dziś"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "jutro"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "wczoraj"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr ""

BIN
lib/humanize/locale/pt_BR/LC_MESSAGES/humanize.mo

Binary file not shown.

286
lib/humanize/locale/pt_BR/LC_MESSAGES/humanize.po

@ -0,0 +1,286 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2016-06-15 15:58-0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 1.8.5\n"
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "º"
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "º"
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "º"
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "º"
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "º"
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "º"
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "º"
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "º"
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "º"
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "º"
#: src/humanize/number.py:82
msgid "million"
msgstr "milhão"
#: src/humanize/number.py:83
msgid "billion"
msgstr "bilhão"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "trilhão"
#: src/humanize/number.py:85
msgid "quadrillion"
msgstr "quatrilhão"
#: src/humanize/number.py:86
msgid "quintillion"
msgstr "quintilhão"
#: src/humanize/number.py:87
msgid "sextillion"
msgstr "sextilhão"
#: src/humanize/number.py:88
msgid "septillion"
msgstr "septilhão"
#: src/humanize/number.py:89
msgid "octillion"
msgstr "octilhão"
#: src/humanize/number.py:90
msgid "nonillion"
msgstr "nonilhão"
#: src/humanize/number.py:91
msgid "decillion"
msgstr "decilhão"
#: src/humanize/number.py:92
msgid "googol"
msgstr "undecilhão"
#: src/humanize/number.py:147
msgid "zero"
msgstr "zero"
#: src/humanize/number.py:148
msgid "one"
msgstr "um"
#: src/humanize/number.py:149
msgid "two"
msgstr "dois"
#: src/humanize/number.py:150
msgid "three"
msgstr "três"
#: src/humanize/number.py:151
msgid "four"
msgstr "quatro"
#: src/humanize/number.py:152
msgid "five"
msgstr "cinco"
#: src/humanize/number.py:153
msgid "six"
msgstr "seis"
#: src/humanize/number.py:154
msgid "seven"
msgstr "sete"
#: src/humanize/number.py:155
msgid "eight"
msgstr "oito"
#: src/humanize/number.py:156
msgid "nine"
msgstr "nove"
#: src/humanize/time.py:119
#, fuzzy, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] "%d microssegundo"
msgstr[1] "%d microssegundos"
#: src/humanize/time.py:128
#, fuzzy, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] "%d milissegundo"
msgstr[1] "%d milissegundos"
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "um momento"
#: src/humanize/time.py:133
msgid "a second"
msgstr "um segundo"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d segundo"
msgstr[1] "%d segundos"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "um minuto"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d minuto"
msgstr[1] "%d minutos"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "uma hora"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d hora"
msgstr[1] "%d horas"
#: src/humanize/time.py:148
msgid "a day"
msgstr "um dia"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d dia"
msgstr[1] "%d dias"
#: src/humanize/time.py:155
msgid "a month"
msgstr "um mês"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d mês"
msgstr[1] "%d meses"
#: src/humanize/time.py:160
msgid "a year"
msgstr "um ano"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "1 ano e %d dia"
msgstr[1] "1 ano e %d dias"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "1 ano e 1 mês"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "1 ano e %d mês"
msgstr[1] "1 ano e %d meses"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d ano"
msgstr[1] "%d anos"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "em %s"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "há %s"
#: src/humanize/time.py:205
msgid "now"
msgstr "agora"
#: src/humanize/time.py:227
msgid "today"
msgstr "hoje"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "amanhã"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "ontem"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr "%s e %s"

BIN
lib/humanize/locale/pt_PT/LC_MESSAGES/humanize.mo

Binary file not shown.

286
lib/humanize/locale/pt_PT/LC_MESSAGES/humanize.po

@ -0,0 +1,286 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2020-07-05 18:17+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: pt_PT\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 2.3.1\n"
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "º"
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "º"
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "º"
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "º"
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "º"
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "º"
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "º"
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "º"
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "º"
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "º"
#: src/humanize/number.py:82
msgid "million"
msgstr "milhão"
#: src/humanize/number.py:83
msgid "billion"
msgstr "milhar de milhão"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "bilião"
#: src/humanize/number.py:85
msgid "quadrillion"
msgstr "mil biliões"
#: src/humanize/number.py:86
msgid "quintillion"
msgstr "trilião"
#: src/humanize/number.py:87
msgid "sextillion"
msgstr "mil triliões"
#: src/humanize/number.py:88
msgid "septillion"
msgstr "quatrilião"
#: src/humanize/number.py:89
msgid "octillion"
msgstr "mil quatriliões"
#: src/humanize/number.py:90
msgid "nonillion"
msgstr "quintilhão"
#: src/humanize/number.py:91
msgid "decillion"
msgstr "mil quintilhões"
#: src/humanize/number.py:92
msgid "googol"
msgstr "sextilhão"
#: src/humanize/number.py:147
msgid "zero"
msgstr "zero"
#: src/humanize/number.py:148
msgid "one"
msgstr "um"
#: src/humanize/number.py:149
msgid "two"
msgstr "dois"
#: src/humanize/number.py:150
msgid "three"
msgstr "três"
#: src/humanize/number.py:151
msgid "four"
msgstr "quatro"
#: src/humanize/number.py:152
msgid "five"
msgstr "cinco"
#: src/humanize/number.py:153
msgid "six"
msgstr "seis"
#: src/humanize/number.py:154
msgid "seven"
msgstr "sete"
#: src/humanize/number.py:155
msgid "eight"
msgstr "oito"
#: src/humanize/number.py:156
msgid "nine"
msgstr "nove"
#: src/humanize/time.py:119
#, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] "%d microssegundo"
msgstr[1] "%d microssegundos"
#: src/humanize/time.py:128
#, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] "%d milissegundo"
msgstr[1] "%d milissegundos"
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "um momento"
#: src/humanize/time.py:133
msgid "a second"
msgstr "um segundo"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d segundo"
msgstr[1] "%d segundos"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "um minuto"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d minuto"
msgstr[1] "%d minutos"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "uma hora"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d hora"
msgstr[1] "%d horas"
#: src/humanize/time.py:148
msgid "a day"
msgstr "um dia"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d dia"
msgstr[1] "%d dias"
#: src/humanize/time.py:155
msgid "a month"
msgstr "um mês"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d mês"
msgstr[1] "%d meses"
#: src/humanize/time.py:160
msgid "a year"
msgstr "um ano"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "1 ano e %d dia"
msgstr[1] "1 ano e %d dias"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "1 ano e 1 mês"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "1 ano e %d mês"
msgstr[1] "1 ano e %d meses"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d ano"
msgstr[1] "%d anos"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "daqui a %s"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "há %s"
#: src/humanize/time.py:205
msgid "now"
msgstr "agora"
#: src/humanize/time.py:227
msgid "today"
msgstr "hoje"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "amanhã"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "ontem"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr "%s e %s"

BIN
lib/humanize/locale/ru_RU/LC_MESSAGES/humanize.mo

Binary file not shown.

305
lib/humanize/locale/ru_RU/LC_MESSAGES/humanize.po

@ -0,0 +1,305 @@
# Russian (Russia) translations for PROJECT.
# Copyright (C) 2013 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 20:53+0300\n"
"PO-Revision-Date: 2014-03-24 20:32+0300\n"
"Last-Translator: Sergey Prokhorov <me@seriyps.ru>\n"
"Language-Team: ru_RU <LL@li.org>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"Generated-By: Babel 0.9.6\n"
"X-Generator: Poedit 1.5.4\n"
# в Django тут "ий" но на самом деле оба варианта работают плохо
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "ой"
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "ый"
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "ой"
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "ий"
# в Django тут "ий" но на самом деле оба варианта работают плохо
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "ый"
# в Django тут "ий" но на самом деле оба варианта работают плохо
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "ый"
# в Django тут "ий" но на самом деле оба варианта работают плохо
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "ой"
# в Django тут "ий" но на самом деле оба варианта работают плохо
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "ой"
# в Django тут "ий" но на самом деле оба варианта работают плохо
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "ой"
# в Django тут "ий" но на самом деле оба варианта работают плохо
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "ый"
#: src/humanize/number.py:82
msgid "million"
msgstr "миллиона"
#: src/humanize/number.py:83
msgid "billion"
msgstr "миллиарда"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "триллиона"
#: src/humanize/number.py:85
msgid "quadrillion"
msgstr "квадриллиона"
#: src/humanize/number.py:86
msgid "quintillion"
msgstr "квинтиллиона"
#: src/humanize/number.py:87
msgid "sextillion"
msgstr "сикстиллиона"
#: src/humanize/number.py:88
msgid "septillion"
msgstr "септиллиона"
#: src/humanize/number.py:89
msgid "octillion"
msgstr "октиллиона"
#: src/humanize/number.py:90
msgid "nonillion"
msgstr "нониллиона"
#: src/humanize/number.py:91
msgid "decillion"
msgstr "децилиона"
#: src/humanize/number.py:92
msgid "googol"
msgstr "гогола"
#: src/humanize/number.py:147
msgid "zero"
msgstr ""
#: src/humanize/number.py:148
msgid "one"
msgstr "один"
#: src/humanize/number.py:149
msgid "two"
msgstr "два"
#: src/humanize/number.py:150
msgid "three"
msgstr "три"
#: src/humanize/number.py:151
msgid "four"
msgstr "четыре"
#: src/humanize/number.py:152
msgid "five"
msgstr "пять"
#: src/humanize/number.py:153
msgid "six"
msgstr "шесть"
#: src/humanize/number.py:154
msgid "seven"
msgstr "семь"
#: src/humanize/number.py:155
msgid "eight"
msgstr "восемь"
#: src/humanize/number.py:156
msgid "nine"
msgstr "девять"
#: src/humanize/time.py:119
#, fuzzy, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: src/humanize/time.py:128
#, fuzzy, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "только что"
#: src/humanize/time.py:133
msgid "a second"
msgstr "секунду"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d секунда"
msgstr[1] "%d секунды"
msgstr[2] "%d секунд"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "минуту"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d минута"
msgstr[1] "%d минуты"
msgstr[2] "%d минут"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "час"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d час"
msgstr[1] "%d часа"
msgstr[2] "%d часов"
#: src/humanize/time.py:148
msgid "a day"
msgstr "день"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d день"
msgstr[1] "%d дня"
msgstr[2] "%d дней"
#: src/humanize/time.py:155
msgid "a month"
msgstr "месяц"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d месяц"
msgstr[1] "%d месяца"
msgstr[2] "%d месяцев"
#: src/humanize/time.py:160
msgid "a year"
msgstr "год"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "1 год, %d день"
msgstr[1] "1 год, %d дня"
msgstr[2] "1 год, %d дней"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "1 год, 1 месяц"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "1 год, %d месяц"
msgstr[1] "1 год, %d месяца"
msgstr[2] "1 год, %d месяцев"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d год"
msgstr[1] "%d года"
msgstr[2] "%d лет"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "через %s"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "%s назад"
#: src/humanize/time.py:205
msgid "now"
msgstr "сейчас"
#: src/humanize/time.py:227
msgid "today"
msgstr "сегодня"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "завтра"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "вчера"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr "%s и %s"

BIN
lib/humanize/locale/sk_SK/LC_MESSAGES/humanize.mo

Binary file not shown.

296
lib/humanize/locale/sk_SK/LC_MESSAGES/humanize.po

@ -0,0 +1,296 @@
# Slovak translation of humanize
# Copyright (C) 2016
# This file is distributed under the same license as the PACKAGE package.
# Jose Riha <jose1711 gmail com>, 2016.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: humanize\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2020-09-29 22:43+0300\n"
"Last-Translator: Jose Riha <jose1711 gmail com>\n"
"Language-Team: sk <LL@li.org>\n"
"Language: Slovak\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "."
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "."
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "."
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "."
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "."
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "."
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "."
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "."
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "."
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "."
#: src/humanize/number.py:82
msgid "million"
msgstr "milióna/ov"
#: src/humanize/number.py:83
msgid "billion"
msgstr "miliardy/árd"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "bilióna/ov"
#: src/humanize/number.py:85
msgid "quadrillion"
msgstr "biliardy/árd"
#: src/humanize/number.py:86
msgid "quintillion"
msgstr "trilióna/árd"
#: src/humanize/number.py:87
msgid "sextillion"
msgstr "triliardy/árd"
#: src/humanize/number.py:88
msgid "septillion"
msgstr "kvadrilióna/ov"
#: src/humanize/number.py:89
msgid "octillion"
msgstr "kvadriliardy/árd"
#: src/humanize/number.py:90
msgid "nonillion"
msgstr "kvintilióna/ov"
#: src/humanize/number.py:91
msgid "decillion"
msgstr "kvintiliardy/árd"
#: src/humanize/number.py:92
msgid "googol"
msgstr "googola/ov"
#: src/humanize/number.py:147
msgid "zero"
msgstr "nula"
#: src/humanize/number.py:148
msgid "one"
msgstr "jedna"
#: src/humanize/number.py:149
msgid "two"
msgstr "dve"
#: src/humanize/number.py:150
msgid "three"
msgstr "tri"
#: src/humanize/number.py:151
msgid "four"
msgstr "štyri"
#: src/humanize/number.py:152
msgid "five"
msgstr "päť"
#: src/humanize/number.py:153
msgid "six"
msgstr "šesť"
#: src/humanize/number.py:154
msgid "seven"
msgstr "sedem"
#: src/humanize/number.py:155
msgid "eight"
msgstr "osem"
#: src/humanize/number.py:156
msgid "nine"
msgstr "deväť"
#: src/humanize/time.py:119
#, fuzzy, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] "%d mikrosekundu"
msgstr[1] "%d mikrosekundy"
msgstr[2] "%d mikrosekúnd"
#: src/humanize/time.py:128
#, fuzzy, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] "%d milisekundu"
msgstr[1] "%d milisekundy"
msgstr[2] "%d milisekúnd"
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "chvíľku"
#: src/humanize/time.py:133
msgid "a second"
msgstr "sekundu"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d sekundu"
msgstr[1] "%d sekundy"
msgstr[2] "%d sekúnd"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "minútu"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d minútu"
msgstr[1] "%d minúty"
msgstr[2] "%d minút"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "hodinu"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d hodina"
msgstr[1] "%d hodiny"
msgstr[2] "%d hodín"
#: src/humanize/time.py:148
msgid "a day"
msgstr "deň"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d deň"
msgstr[1] "%d dni"
msgstr[2] "%d dní"
#: src/humanize/time.py:155
msgid "a month"
msgstr "mesiac"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d mesiac"
msgstr[1] "%d mesiace"
msgstr[2] "%d mesiacov"
#: src/humanize/time.py:160
msgid "a year"
msgstr "rok"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "1 rok, %d deň"
msgstr[1] "1 rok, %d dni"
msgstr[2] "1 rok, %d dní"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "1 rok, 1 mesiac"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "1 rok, %d mesiac"
msgstr[1] "1 rok, %d mesiace"
msgstr[2] "1 rok, %d mesiacov"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d rok"
msgstr[1] "%d roky"
msgstr[2] "%d rokov"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "o %s"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "%s naspäť"
#: src/humanize/time.py:205
msgid "now"
msgstr "teraz"
#: src/humanize/time.py:227
msgid "today"
msgstr "dnes"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "zajtra"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "včera"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr ""

BIN
lib/humanize/locale/tr_TR/LC_MESSAGES/humanize.mo

Binary file not shown.

287
lib/humanize/locale/tr_TR/LC_MESSAGES/humanize.po

@ -0,0 +1,287 @@
# Turkish translation for humanize.
# Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the humanize package.
# Emre Çintay <emre@cintay.com>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: humanize\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2017-02-23 20:00+0300\n"
"Last-Translator: Emre Çintay <emre@cintay.com>\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 1.8.7.1\n"
"Generated-By: Emre Çintay\n"
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "."
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "."
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "."
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "."
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "."
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "."
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "."
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "."
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "."
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "."
#: src/humanize/number.py:82
msgid "million"
msgstr "milyon"
#: src/humanize/number.py:83
msgid "billion"
msgstr "milyar"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "trilyon"
#: src/humanize/number.py:85
msgid "quadrillion"
msgstr "katrilyon"
#: src/humanize/number.py:86
msgid "quintillion"
msgstr "kentilyon"
#: src/humanize/number.py:87
msgid "sextillion"
msgstr "sekstilyon"
#: src/humanize/number.py:88
msgid "septillion"
msgstr "septilyon"
#: src/humanize/number.py:89
msgid "octillion"
msgstr "oktilyon"
#: src/humanize/number.py:90
msgid "nonillion"
msgstr "nonilyon"
#: src/humanize/number.py:91
msgid "decillion"
msgstr "desilyon"
#: src/humanize/number.py:92
msgid "googol"
msgstr "googol"
#: src/humanize/number.py:147
msgid "zero"
msgstr ""
#: src/humanize/number.py:148
msgid "one"
msgstr "bir"
#: src/humanize/number.py:149
msgid "two"
msgstr "iki"
#: src/humanize/number.py:150
msgid "three"
msgstr "üç"
#: src/humanize/number.py:151
msgid "four"
msgstr "dört"
#: src/humanize/number.py:152
msgid "five"
msgstr "beş"
#: src/humanize/number.py:153
msgid "six"
msgstr "altı"
#: src/humanize/number.py:154
msgid "seven"
msgstr "yedi"
#: src/humanize/number.py:155
msgid "eight"
msgstr "sekiz"
#: src/humanize/number.py:156
msgid "nine"
msgstr "dokuz"
#: src/humanize/time.py:119
#, fuzzy, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] ""
msgstr[1] ""
#: src/humanize/time.py:128
#, fuzzy, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] ""
msgstr[1] ""
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "biraz"
#: src/humanize/time.py:133
msgid "a second"
msgstr "bir saniye"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d saniye"
msgstr[1] "%d saniye"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "bir dakika"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d dakika"
msgstr[1] "%d dakika"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "bir saat"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d saat"
msgstr[1] "%d saat"
#: src/humanize/time.py:148
msgid "a day"
msgstr "bir gün"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d gün"
msgstr[1] "%d gün"
#: src/humanize/time.py:155
msgid "a month"
msgstr "bir ay"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d ay"
msgstr[1] "%d ay"
#: src/humanize/time.py:160
msgid "a year"
msgstr "bir yıl"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "1 yıl, %d gün"
msgstr[1] "1 yıl, %d gün"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "1 yıl, 1 ay"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "1 yıl, %d ay"
msgstr[1] "1 yıl, %d ay"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d yıl"
msgstr[1] "%d yıl"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "şu andan itibaren %s"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "%s önce"
#: src/humanize/time.py:205
msgid "now"
msgstr "şimdi"
#: src/humanize/time.py:227
msgid "today"
msgstr "bugün"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "yarın"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "dün"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr ""

BIN
lib/humanize/locale/uk_UA/LC_MESSAGES/humanize.mo

Binary file not shown.

293
lib/humanize/locale/uk_UA/LC_MESSAGES/humanize.po

@ -0,0 +1,293 @@
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: \n"
"Last-Translator: TL\n"
"Language-Team: uk_UA\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"Generated-By:\n"
"X-Generator: \n"
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "ий"
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "ий"
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "ий"
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "ій"
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "ий"
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "ий"
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "ий"
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "ий"
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "ий"
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "ий"
#: src/humanize/number.py:82
msgid "million"
msgstr "мільйонів"
#: src/humanize/number.py:83
msgid "billion"
msgstr "мільярдів"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "трильйонів"
#: src/humanize/number.py:85
msgid "quadrillion"
msgstr "квадрильйонів"
#: src/humanize/number.py:86
msgid "quintillion"
msgstr "квинтиліонів"
#: src/humanize/number.py:87
msgid "sextillion"
msgstr "сикстильйонів"
#: src/humanize/number.py:88
msgid "septillion"
msgstr "септильйонів"
#: src/humanize/number.py:89
msgid "octillion"
msgstr "октильйонів"
#: src/humanize/number.py:90
msgid "nonillion"
msgstr "нонильйонів"
#: src/humanize/number.py:91
msgid "decillion"
msgstr "децильйонів"
#: src/humanize/number.py:92
msgid "googol"
msgstr "гугола"
#: src/humanize/number.py:147
msgid "zero"
msgstr "нуль"
#: src/humanize/number.py:148
msgid "one"
msgstr "один"
#: src/humanize/number.py:149
msgid "two"
msgstr "два"
#: src/humanize/number.py:150
msgid "three"
msgstr "три"
#: src/humanize/number.py:151
msgid "four"
msgstr "чотири"
#: src/humanize/number.py:152
msgid "five"
msgstr "п'ять"
#: src/humanize/number.py:153
msgid "six"
msgstr "шість"
#: src/humanize/number.py:154
msgid "seven"
msgstr "сім"
#: src/humanize/number.py:155
msgid "eight"
msgstr "вісім"
#: src/humanize/number.py:156
msgid "nine"
msgstr "дев'ять"
#: src/humanize/time.py:119
#, fuzzy, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] "%d мікросекунда"
msgstr[1] "%d мікросекунд"
msgstr[2] "%d мікросекунди"
#: src/humanize/time.py:128
#, fuzzy, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] "%d мілісекунда"
msgstr[1] "%d мілісекунди"
msgstr[2] "%d мілісекунди"
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "у цей момент"
#: src/humanize/time.py:133
msgid "a second"
msgstr "секунду"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d секунда"
msgstr[1] "%d секунд"
msgstr[2] "%d секунд"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "хвилина"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d хвилина"
msgstr[1] "%d хвилини"
msgstr[2] "%d хвилин"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "година"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d година"
msgstr[1] "%d годин"
msgstr[2] "%d годин"
#: src/humanize/time.py:148
msgid "a day"
msgstr "день"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d день"
msgstr[1] "%d дня"
msgstr[2] "%d дні"
#: src/humanize/time.py:155
msgid "a month"
msgstr "місяць"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d місяць"
msgstr[1] "%d місяця"
msgstr[2] "%d місяців"
#: src/humanize/time.py:160
msgid "a year"
msgstr "рік"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "1 рік, %d день"
msgstr[1] "1 рік, %d дня"
msgstr[2] "1 рік, %d днів"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "1 рік, 1 місяць"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "1 рік, %d місяць"
msgstr[1] "1 рік, %d місяця"
msgstr[2] "1 рік, %d місяців"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d рік"
msgstr[1] "%d роки"
msgstr[2] "%d років"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "через %s"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "%s назад"
#: src/humanize/time.py:205
msgid "now"
msgstr "зараз"
#: src/humanize/time.py:227
msgid "today"
msgstr "сьогодні"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "завтра"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "вчора"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr ""

BIN
lib/humanize/locale/vi_VI/LC_MESSAGES/humanize.mo

Binary file not shown.

294
lib/humanize/locale/vi_VI/LC_MESSAGES/humanize.po

@ -0,0 +1,294 @@
# French (France) translations for PROJECT.
# Copyright (C) 2013 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2017-05-30 11:51+0700\n"
"Last-Translator: Olivier Cortès <oc@1flow.io>\n"
"Language-Team: vi_VI <sapd@vccloud.vn>\n"
"Language: vi_VN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"Generated-By: Babel 0.9.6\n"
"X-Generator: Poedit 1.8.7.1\n"
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "."
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "."
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "."
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "."
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "."
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "."
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "."
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "."
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "."
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "."
#: src/humanize/number.py:82
msgid "million"
msgstr "%(value)s triệu"
#: src/humanize/number.py:83
msgid "billion"
msgstr "tỷ"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "%(value)s nghìn tỷ"
#: src/humanize/number.py:85
msgid "quadrillion"
msgstr "%(value)s triệu tỷ"
#: src/humanize/number.py:86
#, fuzzy
msgid "quintillion"
msgstr "%(value)s quintillion"
#: src/humanize/number.py:87
#, fuzzy
msgid "sextillion"
msgstr "%(value)s sextillion"
#: src/humanize/number.py:88
#, fuzzy
msgid "septillion"
msgstr "%(value)s septillion"
#: src/humanize/number.py:89
#, fuzzy
msgid "octillion"
msgstr "%(value)s octillion"
#: src/humanize/number.py:90
#, fuzzy
msgid "nonillion"
msgstr "%(value)s nonillion"
#: src/humanize/number.py:91
#, fuzzy
msgid "decillion"
msgstr "%(value)s décillion"
#: src/humanize/number.py:92
#, fuzzy
msgid "googol"
msgstr "%(value)s gogol"
#: src/humanize/number.py:147
msgid "zero"
msgstr ""
#: src/humanize/number.py:148
msgid "one"
msgstr "một"
#: src/humanize/number.py:149
msgid "two"
msgstr "hai"
#: src/humanize/number.py:150
msgid "three"
msgstr "ba"
#: src/humanize/number.py:151
msgid "four"
msgstr "bốn"
#: src/humanize/number.py:152
msgid "five"
msgstr "năm"
#: src/humanize/number.py:153
msgid "six"
msgstr "sáu"
#: src/humanize/number.py:154
msgid "seven"
msgstr "bảy"
#: src/humanize/number.py:155
msgid "eight"
msgstr "tám"
#: src/humanize/number.py:156
msgid "nine"
msgstr "chín"
#: src/humanize/time.py:119
#, fuzzy, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] ""
msgstr[1] ""
#: src/humanize/time.py:128
#, fuzzy, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] ""
msgstr[1] ""
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "ngay lúc này"
#: src/humanize/time.py:133
msgid "a second"
msgstr "một giây"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d giây"
msgstr[1] "%d giây"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "một phút"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d phút"
msgstr[1] "%d phút"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "một giờ"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d giờ"
msgstr[1] "%d giờ"
#: src/humanize/time.py:148
msgid "a day"
msgstr "một ngày"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d ngày"
msgstr[1] "%d ngày"
#: src/humanize/time.py:155
msgid "a month"
msgstr "một tháng"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d tháng"
msgstr[1] "%d tháng"
#: src/humanize/time.py:160
msgid "a year"
msgstr "một năm"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "1 năm %d ngày"
msgstr[1] "1 năm %d ngày"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "1 năm 1 tháng"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "1 năm %d tháng"
msgstr[1] "un an et %d mois"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d năm"
msgstr[1] "%d năm"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "%s ngày tới"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "%s trước"
#: src/humanize/time.py:205
msgid "now"
msgstr "ngay bây giờ"
#: src/humanize/time.py:227
msgid "today"
msgstr "hôm nay"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "ngày mai"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "ngày hôm qua"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr ""

BIN
lib/humanize/locale/zh_CN/LC_MESSAGES/humanize.mo

Binary file not shown.

286
lib/humanize/locale/zh_CN/LC_MESSAGES/humanize.po

@ -0,0 +1,286 @@
# Simplified Chinese (China) translation for the project
# Copyright (C) 2016
# This file is distributed under the same license as the PACKAGE package.
# AZLisme <helloazl@icloud.com>, 2016.
# Liwen SUN <sunliwen@gmail.com>, 2019.
#
msgid ""
msgstr ""
"Project-Id-Version: 1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-29 21:07+0300\n"
"PO-Revision-Date: 2016-11-14 23:02+0000\n"
"Last-Translator: Liwen SUN <sunliwen@gmail.com>\n"
"Language-Team: Chinese (simplified)\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: src/humanize/number.py:31
msgctxt "0"
msgid "th"
msgstr "第"
#: src/humanize/number.py:32
msgctxt "1"
msgid "st"
msgstr "第"
#: src/humanize/number.py:33
msgctxt "2"
msgid "nd"
msgstr "第"
#: src/humanize/number.py:34
msgctxt "3"
msgid "rd"
msgstr "第"
#: src/humanize/number.py:35
msgctxt "4"
msgid "th"
msgstr "第"
#: src/humanize/number.py:36
msgctxt "5"
msgid "th"
msgstr "第"
#: src/humanize/number.py:37
msgctxt "6"
msgid "th"
msgstr "第"
#: src/humanize/number.py:38
msgctxt "7"
msgid "th"
msgstr "第"
#: src/humanize/number.py:39
msgctxt "8"
msgid "th"
msgstr "第"
#: src/humanize/number.py:40
msgctxt "9"
msgid "th"
msgstr "第"
#: src/humanize/number.py:82
msgid "million"
msgstr "百万"
#: src/humanize/number.py:83
msgid "billion"
msgstr "十亿"
#: src/humanize/number.py:84
msgid "trillion"
msgstr "兆"
#: src/humanize/number.py:85
msgid "quadrillion"
msgstr "万亿"
#: src/humanize/number.py:86
msgid "quintillion"
msgstr "百京"
#: src/humanize/number.py:87
msgid "sextillion"
msgstr "十垓"
#: src/humanize/number.py:88
msgid "septillion"
msgstr "秭"
#: src/humanize/number.py:89
msgid "octillion"
msgstr "千秭"
#: src/humanize/number.py:90
msgid "nonillion"
msgstr "百穰"
#: src/humanize/number.py:91
msgid "decillion"
msgstr "十沟"
#: src/humanize/number.py:92
msgid "googol"
msgstr "古高尔"
#: src/humanize/number.py:147
msgid "zero"
msgstr ""
#: src/humanize/number.py:148
msgid "one"
msgstr "一"
#: src/humanize/number.py:149
msgid "two"
msgstr "二"
#: src/humanize/number.py:150
msgid "three"
msgstr "三"
#: src/humanize/number.py:151
msgid "four"
msgstr "四"
#: src/humanize/number.py:152
msgid "five"
msgstr "五"
#: src/humanize/number.py:153
msgid "six"
msgstr "六"
#: src/humanize/number.py:154
msgid "seven"
msgstr "七"
#: src/humanize/number.py:155
msgid "eight"
msgstr "八"
#: src/humanize/number.py:156
msgid "nine"
msgstr "九"
#: src/humanize/time.py:119
#, fuzzy, python-format
msgid "%d microsecond"
msgid_plural "%d microseconds"
msgstr[0] ""
msgstr[1] ""
#: src/humanize/time.py:128
#, fuzzy, python-format
msgid "%d millisecond"
msgid_plural "%d milliseconds"
msgstr[0] ""
msgstr[1] ""
#: src/humanize/time.py:131 src/humanize/time.py:204
msgid "a moment"
msgstr "一会儿"
#: src/humanize/time.py:133
msgid "a second"
msgstr "1秒"
#: src/humanize/time.py:135
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d秒"
msgstr[1] "%d秒"
#: src/humanize/time.py:137
msgid "a minute"
msgstr "1分"
#: src/humanize/time.py:140
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d分"
msgstr[1] "%d分"
#: src/humanize/time.py:142
msgid "an hour"
msgstr "1小时"
#: src/humanize/time.py:145
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d小时"
msgstr[1] "%d小时"
#: src/humanize/time.py:148
msgid "a day"
msgstr "1天"
#: src/humanize/time.py:150 src/humanize/time.py:153
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d天"
msgstr[1] "%d天"
#: src/humanize/time.py:155
msgid "a month"
msgstr "1月"
#: src/humanize/time.py:157
#, python-format
msgid "%d month"
msgid_plural "%d months"
msgstr[0] "%d月"
msgstr[1] "%d月"
#: src/humanize/time.py:160
msgid "a year"
msgstr "1年"
#: src/humanize/time.py:162 src/humanize/time.py:171
#, python-format
msgid "1 year, %d day"
msgid_plural "1 year, %d days"
msgstr[0] "%d年"
msgstr[1] "%d年"
#: src/humanize/time.py:165
msgid "1 year, 1 month"
msgstr "1年又1月"
#: src/humanize/time.py:168
#, python-format
msgid "1 year, %d month"
msgid_plural "1 year, %d months"
msgstr[0] "1年又%d月"
msgstr[1] "1年又%d月"
#: src/humanize/time.py:173
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d年"
msgstr[1] "%d年"
#: src/humanize/time.py:201
#, python-format
msgid "%s from now"
msgstr "%s之后"
#: src/humanize/time.py:201
#, python-format
msgid "%s ago"
msgstr "%s之前"
#: src/humanize/time.py:205
msgid "now"
msgstr "现在"
#: src/humanize/time.py:227
msgid "today"
msgstr "今天"
#: src/humanize/time.py:229
msgid "tomorrow"
msgstr "明天"
#: src/humanize/time.py:231
msgid "yesterday"
msgstr "昨天"
#: src/humanize/time.py:498
#, python-format
msgid "%s and %s"
msgstr ""

365
lib/humanize/number.py

@ -0,0 +1,365 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Humanizing functions for numbers."""
import re
from fractions import Fraction
from . import compat
from .i18n import gettext as _
from .i18n import gettext_noop as N_
from .i18n import pgettext as P_
def ordinal(value):
"""Converts an integer to its ordinal as a string.
For example, 1 is "1st", 2 is "2nd", 3 is "3rd", etc. Works for any integer or
anything `int()` will turn into an integer. Anything other value will have nothing
done to it.
Examples:
```pycon
>>> ordinal(1)
'1st'
>>> ordinal(1002)
'1002nd'
>>> ordinal(103)
'103rd'
>>> ordinal(4)
'4th'
>>> ordinal(12)
'12th'
>>> ordinal(101)
'101st'
>>> ordinal(111)
'111th'
>>> ordinal("something else")
'something else'
>>> ordinal(None) is None
True
```
Args:
value (int, str, float): Integer to convert.
Returns:
str: Ordinal string.
"""
try:
value = int(value)
except (TypeError, ValueError):
return value
t = (
P_("0", "th"),
P_("1", "st"),
P_("2", "nd"),
P_("3", "rd"),
P_("4", "th"),
P_("5", "th"),
P_("6", "th"),
P_("7", "th"),
P_("8", "th"),
P_("9", "th"),
)
if value % 100 in (11, 12, 13): # special case
return "%d%s" % (value, t[0])
return "%d%s" % (value, t[value % 10])
def intcomma(value, ndigits=None):
"""Converts an integer to a string containing commas every three digits.
For example, 3000 becomes "3,000" and 45000 becomes "45,000". To maintain some
compatibility with Django's `intcomma`, this function also accepts floats.
Examples:
``pycon
>>> intcomma(100)
'100'
>>> intcomma("1000")
'1,000'
>>> intcomma(1_000_000)
'1,000,000'
>>> intcomma(1_234_567.25)
'1,234,567.25'
>>> intcomma(1234.5454545, 2)
'1,234.55'
>>> intcomma(14308.40, 1)
'14,308.4'
>>> intcomma(None) is None
True
```
Args:
value (int, float, str): Integer or float to convert.
ndigits (int, None): Digits of precision for rounding after the decimal point.
Returns:
str: string containing commas every three digits.
"""
try:
if isinstance(value, compat.string_types):
float(value.replace(",", ""))
else:
float(value)
except (TypeError, ValueError):
return value
if ndigits:
orig = "{0:.{1}f}".format(value, ndigits)
else:
orig = str(value)
new = re.sub(r"^(-?\d+)(\d{3})", r"\g<1>,\g<2>", orig)
if orig == new:
return new
else:
return intcomma(new)
powers = [10 ** x for x in (6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 100)]
human_powers = (
N_("million"),
N_("billion"),
N_("trillion"),
N_("quadrillion"),
N_("quintillion"),
N_("sextillion"),
N_("septillion"),
N_("octillion"),
N_("nonillion"),
N_("decillion"),
N_("googol"),
)
def intword(value, format="%.1f"):
"""Converts a large integer to a friendly text representation.
Works best for numbers over 1 million. For example, 1_000_000 becomes "1.0 million",
1200000 becomes "1.2 million" and "1_200_000_000" becomes "1.2 billion". Supports up
to decillion (33 digits) and googol (100 digits).
Examples:
```pycon
>>> intword("100")
'100'
>>> intword("1000000")
'1.0 million'
>>> intword(1_200_000_000)
'1.2 billion'
>>> intword(8100000000000000000000000000000000)
'8.1 decillion'
>>> intword(None) is None
True
>>> intword("1234000", "%0.3f")
'1.234 million'
```
Args:
value (int, float, str): Integer to convert.
format (str): To change the number of decimal or general format of the number
portion.
Returns:
str: Friendly text representation as a string, unless the value passed could not
be coaxed into an `int`.
"""
try:
value = int(value)
except (TypeError, ValueError):
return value
if value < powers[0]:
return str(value)
for ordinal, power in enumerate(powers[1:], 1):
if value < power:
chopped = value / float(powers[ordinal - 1])
if float(format % chopped) == float(10 ** 3):
chopped = value / float(powers[ordinal])
return (" ".join([format, _(human_powers[ordinal])])) % chopped
else:
return (" ".join([format, _(human_powers[ordinal - 1])])) % chopped
return str(value)
def apnumber(value):
"""Converts an integer to Associated Press style.
Examples:
```pycon
>>> apnumber(0)
'zero'
>>> apnumber(5)
'five'
>>> apnumber(10)
'10'
>>> apnumber("7")
'seven'
>>> apnumber("foo")
'foo'
>>> apnumber(None) is None
True
```
Args:
value (int, float, str): Integer to convert.
Returns:
str: For numbers 0-9, the number spelled out. Otherwise, the number. This always
returns a string unless the value was not `int`-able, unlike the Django filter.
"""
try:
value = int(value)
except (TypeError, ValueError):
return value
if not 0 <= value < 10:
return str(value)
return (
_("zero"),
_("one"),
_("two"),
_("three"),
_("four"),
_("five"),
_("six"),
_("seven"),
_("eight"),
_("nine"),
)[value]
def fractional(value):
"""Convert to fractional number.
There will be some cases where one might not want to show ugly decimal places for
floats and decimals.
This function returns a human-readable fractional number in form of fractions and
mixed fractions.
Pass in a string, or a number or a float, and this function returns:
* a string representation of a fraction
* or a whole number
* or a mixed fraction
Examples:
```pycon
>>> fractional(0.3)
'3/10'
>>> fractional(1.3)
'1 3/10'
>>> fractional(float(1/3))
'1/3'
>>> fractional(1)
'1'
>>> fractional("ten")
'ten'
>>> fractional(None) is None
True
```
Args:
value (int, float, str): Integer to convert.
Returns:
str: Fractional number as a string.
"""
try:
number = float(value)
except (TypeError, ValueError):
return value
whole_number = int(number)
frac = Fraction(number - whole_number).limit_denominator(1000)
numerator = frac._numerator
denominator = frac._denominator
if whole_number and not numerator and denominator == 1:
# this means that an integer was passed in
# (or variants of that integer like 1.0000)
return "%.0f" % whole_number
elif not whole_number:
return "{:.0f}/{:.0f}".format(numerator, denominator)
else:
return "{:.0f} {:.0f}/{:.0f}".format(whole_number, numerator, denominator)
def scientific(value, precision=2):
"""Return number in string scientific notation z.wq x 10ⁿ.
Examples:
```pycon
>>> scientific(float(0.3))
'3.00 x 10⁻¹'
>>> scientific(int(500))
'5.00 x 10²'
>>> scientific(-1000)
'1.00 x 10⁻³'
>>> scientific(1000, 1)
'1.0 x 10³'
>>> scientific(1000, 3)
'1.000 x 10³'
>>> scientific("99")
'9.90 x 10¹'
>>> scientific("foo")
'foo'
>>> scientific(None) is None
True
```
Args:
value (int, float, str): Input number.
precision (int): Number of decimal for first part of the number.
Returns:
str: Number in scientific notation z.wq x 10.
"""
exponents = {
"0": "",
"1": "¹",
"2": "²",
"3": "³",
"4": "",
"5": "",
"6": "",
"7": "",
"8": "",
"9": "",
"+": "",
"-": "",
}
negative = False
try:
if "-" in str(value):
value = str(value).replace("-", "")
negative = True
if isinstance(value, str):
value = float(value)
fmt = "{:.%se}" % str(int(precision))
n = fmt.format(value)
except (ValueError, TypeError):
return value
part1, part2 = n.split("e")
if "-0" in part2:
part2 = part2.replace("-0", "-")
if "+0" in part2:
part2 = part2.replace("+0", "")
new_part2 = []
if negative:
new_part2.append(exponents["-"])
for char in part2:
new_part2.append(exponents[char])
final_str = part1 + " x 10" + "".join(new_part2)
return final_str

557
lib/humanize/time.py

@ -0,0 +1,557 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Time humanizing functions.
These are largely borrowed from Django's `contrib.humanize`.
"""
import datetime as dt
import math
from _23 import Enum
from .i18n import gettext as _
from .i18n import ngettext
__all__ = [
"naturaldelta",
"naturaltime",
"naturalday",
"naturaldate",
"precisedelta",
]
class Unit(Enum):
MICROSECONDS = 0
MILLISECONDS = 1
SECONDS = 2
MINUTES = 3
HOURS = 4
DAYS = 5
MONTHS = 6
YEARS = 7
def __lt__(self, other):
if self.__class__ is other.__class__:
return self.value < other.value
return NotImplemented
def __eq__(self, other):
if self.__class__ is other.__class__:
return self.value == other.value
return NotImplemented
def __le__(self, other):
if self.__class__ is other.__class__:
return self.value <= other.value
return NotImplemented
def __ge__(self, other):
if self.__class__ is other.__class__:
return self.value >= other.value
return NotImplemented
def __ne__(self, other):
if self.__class__ is other.__class__:
return self.value != other.value
return NotImplemented
def _now():
return dt.datetime.now()
def abs_timedelta(delta):
"""Return an "absolute" value for a timedelta, always representing a time distance.
Args:
delta (datetime.timedelta): Input timedelta.
Returns:
datetime.timedelta: Absolute timedelta.
"""
if delta.days < 0:
now = _now()
return now - (now + delta)
return delta
def date_and_delta(value, now=None):
"""Turn a value into a date and a timedelta which represents how long ago it was.
If that's not possible, return `(None, value)`.
"""
if not now:
now = _now()
if isinstance(value, dt.datetime):
date = value
delta = now - value
elif isinstance(value, dt.timedelta):
date = now - value
delta = value
else:
try:
value = int(value)
delta = dt.timedelta(seconds=value)
date = now - delta
except (ValueError, TypeError):
return None, value
return date, abs_timedelta(delta)
def naturaldelta(value, months=True, minimum_unit="seconds", when=None):
"""Return a natural representation of a timedelta or number of seconds.
This is similar to `naturaltime`, but does not add tense to the result.
Args:
value (datetime.timedelta): A timedelta or a number of seconds.
months (bool): If `True`, then a number of months (based on 30.5 days) will be
used for fuzziness between years.
minimum_unit (str): The lowest unit that can be used.
when (datetime.timedelta): Point in time relative to which _value_ is
interpreted. Defaults to the current time in the local timezone.
Returns:
str: A natural representation of the amount of time elapsed.
Examples
Compare two timestamps in a custom local timezone::
import datetime as dt
from dateutil.tz import gettz
berlin = gettz("Europe/Berlin")
now = dt.datetime.now(tz=berlin)
later = now + dt.timedelta(minutes=30)
assert naturaldelta(later, when=now) == "30 minutes"
"""
tmp = Unit[minimum_unit.upper()]
if tmp not in (Unit.SECONDS, Unit.MILLISECONDS, Unit.MICROSECONDS):
raise ValueError("Minimum unit '%s' not supported" % minimum_unit)
minimum_unit = tmp
date, delta = date_and_delta(value, now=when)
if date is None:
return value
use_months = months
seconds = abs(delta.seconds)
days = abs(delta.days)
years = days // 365
days = days % 365
months = int(days // 30.5)
if not years and days < 1:
if seconds == 0:
if minimum_unit == Unit.MICROSECONDS and delta.microseconds < 1000:
return (
ngettext("%d microsecond", "%d microseconds", delta.microseconds)
% delta.microseconds
)
elif minimum_unit == Unit.MILLISECONDS or (
minimum_unit == Unit.MICROSECONDS
# and 1000 <= delta.microseconds < 1_000_000 # using _ is PY3 only
and 1000 <= delta.microseconds < 1000000
):
milliseconds = delta.microseconds / 1000
return (
ngettext("%d millisecond", "%d milliseconds", milliseconds)
% milliseconds
)
return _("a moment")
elif seconds == 1:
return _("a second")
elif seconds < 60:
return ngettext("%d second", "%d seconds", seconds) % seconds
elif 60 <= seconds < 120:
return _("a minute")
elif 120 <= seconds < 3600:
minutes = seconds // 60
return ngettext("%d minute", "%d minutes", minutes) % minutes
elif 3600 <= seconds < 3600 * 2:
return _("an hour")
elif 3600 < seconds:
hours = seconds // 3600
return ngettext("%d hour", "%d hours", hours) % hours
elif years == 0:
if days == 1:
return _("a day")
if not use_months:
return ngettext("%d day", "%d days", days) % days
else:
if not months:
return ngettext("%d day", "%d days", days) % days
elif months == 1:
return _("a month")
else:
return ngettext("%d month", "%d months", months) % months
elif years == 1:
if not months and not days:
return _("a year")
elif not months:
return ngettext("1 year, %d day", "1 year, %d days", days) % days
elif use_months:
if months == 1:
return _("1 year, 1 month")
else:
return (
ngettext("1 year, %d month", "1 year, %d months", months) % months
)
else:
return ngettext("1 year, %d day", "1 year, %d days", days) % days
else:
return ngettext("%d year", "%d years", years) % years
def naturaltime(value, future=False, months=True, minimum_unit="seconds", when=None):
"""Return a natural representation of a time in a resolution that makes sense.
This is more or less compatible with Django's `naturaltime` filter.
Args:
value (datetime.datetime, int): A `datetime` or a number of seconds.
future (bool): Ignored for `datetime`s, where the tense is always figured out
based on the current time. For integers, the return value will be past tense
by default, unless future is `True`.
months (bool): If `True`, then a number of months (based on 30.5 days) will be
used for fuzziness between years.
minimum_unit (str): The lowest unit that can be used.
when (datetime.datetime): Point in time relative to which _value_ is
interpreted. Defaults to the current time in the local timezone.
Returns:
str: A natural representation of the input in a resolution that makes sense.
"""
now = when or _now()
date, delta = date_and_delta(value, now=now)
if date is None:
return value
# determine tense by value only if datetime/timedelta were passed
if isinstance(value, (dt.datetime, dt.timedelta)):
future = date > now
ago = _("%s from now") if future else _("%s ago")
delta = naturaldelta(delta, months, minimum_unit, when=when)
if delta == _("a moment"):
return _("now")
return ago % delta
def naturalday(value, format="%b %d", locale=True):
"""Return a natural day.
For date values that are tomorrow, today or yesterday compared to
present day return representing string. Otherwise, return a string
formatted according to `format`.
"""
try:
value = dt.date(value.year, value.month, value.day)
except AttributeError:
# Passed value wasn't date-ish
return value
except (OverflowError, ValueError):
# Date arguments out of range
return value
delta = value - dt.date.today()
if delta.days == 0:
if not locale:
return "today"
return _("today")
elif delta.days == 1:
return _("tomorrow")
elif delta.days == -1:
return _("yesterday")
return value.strftime(format)
def naturaldate(value):
"""Like `naturalday`, but append a year for dates more than ~five months away."""
try:
value = dt.date(value.year, value.month, value.day)
except AttributeError:
# Passed value wasn't date-ish
return value
except (OverflowError, ValueError):
# Date arguments out of range
return value
delta = abs_timedelta(value - dt.date.today())
if delta.days >= 5 * 365 / 12:
return naturalday(value, "%b %d %Y")
return naturalday(value)
def _quotient_and_remainder(value, divisor, unit, minimum_unit, suppress):
"""Divide `value` by `divisor` returning the quotient and remainder.
If `unit` is `minimum_unit`, makes the quotient a float number and the remainder
will be zero. The rational is that if `unit` is the unit of the quotient, we cannot
represent the remainder because it would require a unit smaller than the
`minimum_unit`.
>>> from humanize.time import _quotient_and_remainder, Unit
>>> _quotient_and_remainder(36, 24, Unit.DAYS, Unit.DAYS, [])
(1.5, 0)
If unit is in `suppress`, the quotient will be zero and the remainder will be the
initial value. The idea is that if we cannot use `unit`, we are forced to use a
lower unit so we cannot do the division.
>>> _quotient_and_remainder(36, 24, Unit.DAYS, Unit.HOURS, [Unit.DAYS])
(0, 36)
In other case return quotient and remainder as `divmod` would do it.
>>> _quotient_and_remainder(36, 24, Unit.DAYS, Unit.HOURS, [])
(1, 12)
"""
if unit == minimum_unit:
return (value / divisor, 0)
elif unit in suppress:
return (0, value)
else:
return divmod(value, divisor)
def _carry(value1, value2, ratio, unit, min_unit, suppress):
"""Return a tuple with two values.
If the unit is in `suppress`, multiply `value1` by `ratio` and add it to `value2`
(carry to right). The idea is that if we cannot represent `value1` we need to
represent it in a lower unit.
>>> from humanize.time import _carry, Unit
>>> _carry(2, 6, 24, Unit.DAYS, Unit.SECONDS, [Unit.DAYS])
(0, 54)
If the unit is the minimum unit, `value2` is divided by `ratio` and added to
`value1` (carry to left). We assume that `value2` has a lower unit so we need to
carry it to `value1`.
>>> _carry(2, 6, 24, Unit.DAYS, Unit.DAYS, [])
(2.25, 0)
Otherwise, just return the same input:
>>> _carry(2, 6, 24, Unit.DAYS, Unit.SECONDS, [])
(2, 6)
"""
if unit == min_unit:
return (value1 + value2 / ratio, 0)
elif unit in suppress:
return (0, value2 + value1 * ratio)
else:
return (value1, value2)
def _suitable_minimum_unit(min_unit, suppress):
"""Return a minimum unit suitable that is not suppressed.
If not suppressed, return the same unit:
>>> from humanize.time import _suitable_minimum_unit, Unit
>>> _suitable_minimum_unit(Unit.HOURS, [])
<Unit.HOURS: 4>
But if suppressed, find a unit greather than the original one that is not
suppressed:
>>> _suitable_minimum_unit(Unit.HOURS, [Unit.HOURS])
<Unit.DAYS: 5>
>>> _suitable_minimum_unit(Unit.HOURS, [Unit.HOURS, Unit.DAYS])
<Unit.MONTHS: 6>
"""
if min_unit in suppress:
for unit in Unit:
if unit > min_unit and unit not in suppress:
return unit
raise ValueError(
"Minimum unit is suppressed and no suitable replacement was found"
)
return min_unit
def _suppress_lower_units(min_unit, suppress):
"""Extend suppressed units (if any) with all units lower than the minimum unit.
>>> from humanize.time import _suppress_lower_units, Unit
>>> list(sorted(_suppress_lower_units(Unit.SECONDS, [Unit.DAYS])))
[<Unit.MICROSECONDS: 0>, <Unit.MILLISECONDS: 1>, <Unit.DAYS: 5>]
"""
suppress = set(suppress)
for u in Unit:
if u == min_unit:
break
suppress.add(u)
return suppress
def precisedelta(value, minimum_unit="seconds", suppress=(), format="%0.2f"):
"""Return a precise representation of a timedelta.
```pycon
>>> import datetime as dt
>>> from humanize.time import precisedelta
>>> delta = dt.timedelta(seconds=3633, days=2, microseconds=123000)
>>> precisedelta(delta)
'2 days, 1 hour and 33.12 seconds'
```
A custom `format` can be specified to control how the fractional part
is represented:
```pycon
>>> precisedelta(delta, format="%0.4f")
'2 days, 1 hour and 33.1230 seconds'
```
Instead, the `minimum_unit` can be changed to have a better resolution;
the function will still readjust the unit to use the greatest of the
units that does not lose precision.
For example setting microseconds but still representing the date with milliseconds:
```pycon
>>> precisedelta(delta, minimum_unit="microseconds")
'2 days, 1 hour, 33 seconds and 123 milliseconds'
```
If desired, some units can be suppressed: you will not see them represented and the
time of the other units will be adjusted to keep representing the same timedelta:
```pycon
>>> precisedelta(delta, suppress=['days'])
'49 hours and 33.12 seconds'
```
Note that microseconds precision is lost if the seconds and all
the units below are suppressed:
```pycon
>>> delta = dt.timedelta(seconds=90, microseconds=100)
>>> precisedelta(delta, suppress=['seconds', 'milliseconds', 'microseconds'])
'1.50 minutes'
```
If the delta is too small to be represented with the minimum unit,
a value of zero will be returned:
```pycon
>>> delta = dt.timedelta(seconds=1)
>>> precisedelta(delta, minimum_unit="minutes")
'0.02 minutes'
>>> delta = dt.timedelta(seconds=0.1)
>>> precisedelta(delta, minimum_unit="minutes")
'0 minutes'
```
"""
date, delta = date_and_delta(value)
if date is None:
return value
suppress = [Unit[s.upper()] for s in suppress]
# Find a suitable minimum unit (it can be greater the one that the
# user gave us if it is suppressed).
min_unit = Unit[minimum_unit.upper()]
min_unit = _suitable_minimum_unit(min_unit, suppress)
del minimum_unit
# Expand the suppressed units list/set to include all the units
# that are below the minimum unit
suppress = _suppress_lower_units(min_unit, suppress)
# handy aliases
days = delta.days
secs = delta.seconds
usecs = delta.microseconds
MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS, MONTHS, YEARS = list(
Unit
)
# Given DAYS compute YEARS and the remainder of DAYS as follows:
# if YEARS is the minimum unit, we cannot use DAYS so
# we will use a float for YEARS and 0 for DAYS:
# years, days = years/days, 0
#
# if YEARS is suppressed, use DAYS:
# years, days = 0, days
#
# otherwise:
# years, days = divmod(years, days)
#
# The same applies for months, hours, minutes and milliseconds below
years, days = _quotient_and_remainder(days, 365, YEARS, min_unit, suppress)
months, days = _quotient_and_remainder(days, 30.5, MONTHS, min_unit, suppress)
# If DAYS is not in suppress, we can represent the days but
# if it is a suppressed unit, we need to carry it to a lower unit,
# seconds in this case.
#
# The same applies for secs and usecs below
days, secs = _carry(days, secs, 24 * 3600, DAYS, min_unit, suppress)
hours, secs = _quotient_and_remainder(secs, 3600, HOURS, min_unit, suppress)
minutes, secs = _quotient_and_remainder(secs, 60, MINUTES, min_unit, suppress)
secs, usecs = _carry(secs, usecs, 1e6, SECONDS, min_unit, suppress)
msecs, usecs = _quotient_and_remainder(
usecs, 1000, MILLISECONDS, min_unit, suppress
)
# if _unused != 0 we had lost some precision
usecs, _unused = _carry(usecs, 0, 1, MICROSECONDS, min_unit, suppress)
fmts = [
("%d year", "%d years", years),
("%d month", "%d months", months),
("%d day", "%d days", days),
("%d hour", "%d hours", hours),
("%d minute", "%d minutes", minutes),
("%d second", "%d seconds", secs),
("%d millisecond", "%d milliseconds", msecs),
("%d microsecond", "%d microseconds", usecs),
]
texts = []
for unit, fmt in zip(reversed(Unit), fmts):
singular_txt, plural_txt, value = fmt
if value > 0 or (not texts and unit == min_unit):
fmt_txt = ngettext(singular_txt, plural_txt, value)
if unit == min_unit and math.modf(value)[0] > 0:
fmt_txt = fmt_txt.replace("%d", format)
texts.append(fmt_txt % value)
if unit == min_unit:
break
if len(texts) == 1:
return texts[0]
head = ", ".join(texts[:-1])
tail = texts[-1]
return _("%s and %s") % (head, tail)
Loading…
Cancel
Save