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