49 changed files with 7621 additions and 5 deletions
@ -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 |
@ -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", |
||||
|
] |
@ -0,0 +1,6 @@ |
|||||
|
import sys |
||||
|
|
||||
|
if sys.version_info < (3,): |
||||
|
string_types = (basestring,) # noqa: F821 |
||||
|
else: |
||||
|
string_types = (str,) |
@ -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) |
@ -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 |
Binary file not shown.
@ -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" |
Binary file not shown.
@ -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 "" |
Binary file not shown.
@ -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 "" |
Binary file not shown.
@ -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" |
Binary file not shown.
@ -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" |
Binary file not shown.
@ -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" |
Binary file not shown.
@ -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 "" |
Binary file not shown.
@ -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 "" |
Binary file not shown.
@ -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 "" |
Binary file not shown.
@ -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" |
Binary file not shown.
@ -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 "" |
Binary file not shown.
@ -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" |
Binary file not shown.
@ -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" |
Binary file not shown.
@ -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" |
Binary file not shown.
@ -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 "" |
Binary file not shown.
@ -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 "" |
Binary file not shown.
@ -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 "" |
Binary file not shown.
@ -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 "" |
Binary file not shown.
@ -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 "" |
@ -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 |
@ -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…
Reference in new issue