Merge remote-tracking branch 'upstream/master' into pr/Andrew-Dickinson/587-1

This commit is contained in:
Glandos 2021-07-10 15:53:39 +02:00
commit 4fcce0ecb2
61 changed files with 2215 additions and 1256 deletions

16
.github/dependabot.yml vendored Normal file
View file

@ -0,0 +1,16 @@
version: 2
updates:
- package-ecosystem: pip
directory: "/"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 10
target-branch: master
allow:
- dependency-type: direct
- dependency-type: indirect
ignore:
- dependency-name: sphinx
versions:
- 3.5.0

76
.github/workflows/test-docs.yml vendored Normal file
View file

@ -0,0 +1,76 @@
name: Test & Docs
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
# Use postgresql and MariaDB versions of Debian buster
services:
postgres:
image: postgres:11
ports:
- 5432:5432
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ihatemoney
POSTGRES_DB: ihatemoney_ci
options:
--health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
mariadb:
image: mariadb:10.3
env:
MARIADB_ROOT_PASSWORD: ihatemoney
MARIADB_DATABASE: ihatemoney_ci
options: >-
--health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
ports:
- 3306:3306
strategy:
fail-fast: false
matrix:
python-version: [3.6, 3.7, 3.8, 3.9]
database: [sqlite]
# Test other databases only with one version of Python (Debian buster has 3.7)
include:
- python-version: 3.7
database: postgresql
- python-version: 3.7
database: mariadb
steps:
- uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install tox
# Run tox using the version of Python in `PATH`
- name: Run Tox with sqlite
run: tox -e py
if: matrix.database == 'sqlite'
env:
TESTING_SQLALCHEMY_DATABASE_URI: 'sqlite:///budget.db'
- name: Run Tox with postgresql
run: tox -e py
if: matrix.database == 'postgresql'
env:
TESTING_SQLALCHEMY_DATABASE_URI: 'postgresql+psycopg2://postgres:ihatemoney@localhost:5432/ihatemoney_ci'
- name: Run Tox with mariadb
run: tox -e py
if: matrix.database == 'mariadb'
env:
TESTING_SQLALCHEMY_DATABASE_URI: 'mysql+pymysql://root:ihatemoney@localhost:3306/ihatemoney_ci'
- name: Run Lint & Docs
run: tox -e lint_docs
if: matrix.python-version == '3.8'

View file

@ -11,6 +11,8 @@ Breaking changes
- Drop support for Python 2 (#483)
- Drop support for Python 3.5 (#571)
- Drop support for MySQL (#743)
- Require MariaDB version 10.3.2 or above (#632)
The minimum supported version is now Python 3.6

View file

@ -38,7 +38,7 @@ update: remove-install-stamp install ## Update the dependencies
.PHONY: serve
serve: install ## Run the ihatemoney server
@echo 'Running ihatemoney on http://localhost:5000'
$(PYTHON) -m ihatemoney.manage runserver
$(PYTHON) -m ihatemoney.manage run
.PHONY: test
test: install-dev ## Run the tests

View file

@ -1,9 +1,9 @@
I hate money
############
.. image:: https://travis-ci.org/spiral-project/ihatemoney.svg?branch=master
:target: https://travis-ci.org/spiral-project/ihatemoney
:alt: Travis CI Build Status
.. image:: https://github.com/spiral-project/ihatemoney/actions/workflows/test-docs.yml/badge.svg
:target: https://github.com/spiral-project/ihatemoney/actions/workflows/test-docs.yml
:alt: GitHub Actions Status
.. image:: https://hosted.weblate.org/widgets/i-hate-money/-/i-hate-money/svg-badge.svg
:target: https://hosted.weblate.org/engage/i-hate-money/?utm_source=widget
@ -30,7 +30,7 @@ Requirements
============
* **Python**: version 3.6 to 3.9.
* **Backends**: MySQL, PostgreSQL, SQLite, Memory.
* **Backends**: SQLite, PostgreSQL, MariaDB (version 10.3.2 or above), Memory.
Contributing
============

14
SECURITY.md Normal file
View file

@ -0,0 +1,14 @@
# Security Policy
## Supported Versions
| Version | Supported |
| ------- | ------------------ |
| 5.0.x | :heavy_check_mark: |
| 4.1.x | :heavy_check_mark: |
| <= 4.0 | :x: |
## Reporting a Vulnerability
In order to report a vulnerability, you can either join the IRC channel `#ihatemoney` on libera.chat and ping active users available for a private message,
or write an email to bugs-ihatemoney “@” antipoul.fr This email address is an alias, so you can expect an answer from another address.

View file

@ -24,7 +24,11 @@ format used can be found on `the SQLAlchemy documentation`_.
``sqlite:///home/ihatemoney/ihatemoney.db``. Do *not* store it under
``/tmp`` as this folder is cleared at each boot.
If you're using PostgreSQL, Your client must use utf8. Unfortunately,
For example, if you're using MariaDB, use a configuration similar to the following::
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://user:pass@localhost/dbname'
If you're using PostgreSQL, your client must use utf8. Unfortunately,
PostgreSQL default is to use ASCII. Either change your client settings,
or specify the encoding by appending ``?client_encoding=utf8`` to the
connection string. This will look like::

View file

@ -195,7 +195,7 @@ its source is located inside the `docs folder
Install doc dependencies (within the virtual environment, if any)::
pip install -r docs/requirements.txt
pip install -e .[doc]
And to produce a HTML doc in the `docs/_output` folder::

View file

@ -6,7 +6,7 @@ It keeps track of who bought what, when, and for whom; and helps to settle the
bills.
I hate money is written in python, using the `flask <https://palletsprojects.com/p/flask/>`_
framework. It's developped with ease of use in mind, and is trying to
framework. It's developed with ease of use in mind, and is trying to
keep things simple. Hope you (will) like it!
Table of contents

View file

@ -20,7 +20,7 @@ Requirements
«Ihatemoney» depends on:
* **Python**: version 3.6 to 3.9 included will work.
* **A Backend**: to choose among MySQL, PostgreSQL, SQLite or Memory.
* **A Backend**: to choose among SQLite, PostgreSQL, MariaDB (>= 10.3.2) or Memory.
* **Virtual environment** (recommended): `python3-venv` package under Debian/Ubuntu.
We recommend to use `virtual environment <https://docs.python.org/3/tutorial/venv.html>`_ but
@ -61,14 +61,14 @@ Test it
Once installed, you can start a test server::
ihatemoney runserver
ihatemoney run
And point your browser at `http://localhost:5000 <http://localhost:5000>`_.
Configure database with MySQL/MariaDB (optional)
Configure database with MariaDB (optional)
================================================
.. note:: Only required if you use MySQL/MariaDB.
.. note:: Only required if you use MariaDB. Make sure to use MariaDB 10.3.2 or newer.
1. Install PyMySQL dependencies. On Debian or Ubuntu, that would be::
@ -184,7 +184,7 @@ Install Gunicorn::
Obviously, adapt the ``ExecStart`` path for your installation folder.
If you use SQLite as database: remove mentions of ``postgresql.service`` in ``ihatemoney.service``.
If you use MySQL or MariaDB as database: replace mentions of ``postgresql.service`` by ``mysql.service`` or ``mariadb.service`` in ``ihatemoney.service``.
If you use MariaDB as database: replace mentions of ``postgresql.service`` by ``mariadb.service`` in ``ihatemoney.service``.
Then reload systemd, enable and start ``ihatemoney``::

View file

@ -1,2 +0,0 @@
Sphinx==3.5.3
docutils==0.17

View file

@ -57,7 +57,7 @@ If you were running IHateMoney using Python < 3.6, you must, **before** upgradin
or several of the following deployment options :
- Gunicorn (Nginx)
- MySQL
- MariaDB
- PostgreSQL
If so, pick the ``pip`` commands to use in the relevant section(s) of
@ -65,6 +65,30 @@ If so, pick the ``pip`` commands to use in the relevant section(s) of
Then follow :ref:`general-procedure` from step 1. in order to complete the update.
Switch to MariaDB >= 10.3.2 instead of MySQL
++++++++++++++++++++++++++++++++++++++++++++
.. note:: If you are using SQLite or PostgreSQL, you can skip this section, no
special action is required.
If you were running IHateMoney with MySQL, you must switch to MariaDB.
MySQL is no longer a supported database option.
In addition, the minimum supported version of MariaDB is 10.3.2.
See `this MySQL / MariaDB issue <https://github.com/spiral-project/ihatemoney/issues/632>`_
for details.
To upgrade:
1. Ensure you have a MariaDB server installed and configured, and that its
version is at least 10.3.2.
2. Copy your database from MySQL to MariaDB.
3. Ensure that IHateMoney is correctly configured to use your MariaDB database,
see :ref:`configuration`.
Then follow :ref:`general-procedure` from step 1. in order to complete the update.
2.x → 3.x
---------

View file

@ -69,7 +69,7 @@ class ProjectHandler(Resource):
return "DELETED"
def put(self, project):
form = EditProjectForm(meta={"csrf": False})
form = EditProjectForm(id=project.id, meta={"csrf": False})
if form.validate() and current_app.config.get("ALLOW_PUBLIC_PROJECT_CREATION"):
form.update(project)
db.session.commit()

View file

@ -1,12 +1,13 @@
from datetime import datetime
from re import match
from types import SimpleNamespace
import email_validator
from flask import request
from flask_babel import lazy_gettext as _
from flask_wtf.file import FileAllowed, FileField, FileRequired
from flask_wtf.form import FlaskForm
from jinja2 import Markup
from markupsafe import Markup
from werkzeug.security import check_password_hash, generate_password_hash
from wtforms.fields.core import Label, SelectField, SelectMultipleField
from wtforms.fields.html5 import DateField, DecimalField, URLField
@ -44,7 +45,7 @@ def get_billform_for(project, set_default=True, **kwargs):
"""
form = BillForm(**kwargs)
if form.original_currency.data == "None":
if form.original_currency.data is None:
form.original_currency.data = project.default_currency
show_no_currency = form.original_currency.data == CurrencyConverter.no_currency
@ -102,7 +103,11 @@ class CalculatorStringField(StringField):
class EditProjectForm(FlaskForm):
name = StringField(_("Project name"), validators=[DataRequired()])
password = StringField(_("Private code"), validators=[DataRequired()])
# If empty -> don't change the password
password = PasswordField(
_("New private code"),
description=_("Enter a new code if you want to change it"),
)
contact_email = StringField(_("Email"), validators=[DataRequired(), Email()])
project_history = BooleanField(_("Enable project history"))
ip_recording = BooleanField(_("Use IP tracking for project history"))
@ -110,6 +115,14 @@ class EditProjectForm(FlaskForm):
default_currency = SelectField(_("Default Currency"), validators=[DataRequired()])
def __init__(self, *args, **kwargs):
if not hasattr(self, "id"):
# We must access the project to validate the default currency, using its id.
# In ProjectForm, 'id' is provided, but not in this base class, so it *must*
# be provided by callers.
# Since id can be defined as a WTForms.StringField, we mimics it,
# using an object that can have a 'data' attribute.
# It defaults to empty string to ensure that query run smoothly.
self.id = SimpleNamespace(data=kwargs.pop("id", ""))
super().__init__(*args, **kwargs)
self.default_currency.choices = [
(currency_name, render_localized_currency(currency_name, detailed=True))
@ -127,32 +140,36 @@ class EditProjectForm(FlaskForm):
else:
return LoggingMode.ENABLED
def save(self):
"""Create a new project with the information given by this form.
Returns the created instance
"""
project = Project(
name=self.name.data,
id=self.id.data,
password=generate_password_hash(self.password.data),
contact_email=self.contact_email.data,
logging_preference=self.logging_preference,
default_currency=self.default_currency.data,
def validate_default_currency(form, field):
project = Project.query.get(form.id.data)
if (
project is not None
and field.data == CurrencyConverter.no_currency
and project.has_multiple_currencies()
):
raise ValidationError(
_(
"This project cannot be set to 'no currency'"
" because it contains bills in multiple currencies."
)
)
return project
def update(self, project):
"""Update the project with the information from the form"""
project.name = self.name.data
# Only update password if changed to prevent spurious log entries
if not check_password_hash(project.password, self.password.data):
if (
# Only update password if a new one is provided
self.password.data
# Only update password if different from the previous one,
# to prevent spurious log entries
and not check_password_hash(project.password, self.password.data)
):
project.password = generate_password_hash(self.password.data)
project.contact_email = self.contact_email.data
project.logging_preference = self.logging_preference
project.default_currency = self.default_currency.data
project.switch_currency(self.default_currency.data)
return project
@ -168,16 +185,30 @@ class UploadForm(FlaskForm):
class ProjectForm(EditProjectForm):
id = StringField(_("Project identifier"), validators=[DataRequired()])
# This field overrides the one from EditProjectForm
password = PasswordField(_("Private code"), validators=[DataRequired()])
submit = SubmitField(_("Create the project"))
def save(self):
"""Create a new project with the information given by this form.
Returns the created instance
"""
# WTForms Boolean Fields don't insert the default value when the
# request doesn't include any value the way that other fields do,
# so we'll manually do it here
self.project_history.data = LoggingMode.default() != LoggingMode.DISABLED
self.ip_recording.data = LoggingMode.default() == LoggingMode.RECORD_IP
return super().save()
# Create project
project = Project(
name=self.name.data,
id=self.id.data,
password=generate_password_hash(self.password.data),
contact_email=self.contact_email.data,
logging_preference=self.logging_preference,
default_currency=self.default_currency.data,
)
return project
def validate_id(form, field):
form.id.data = slugify(field.data)

View file

@ -5,8 +5,8 @@ import os
import random
import sys
from flask_migrate import Migrate, MigrateCommand
from flask_script import Command, Manager, Option
import click
from flask.cli import FlaskGroup
from werkzeug.security import generate_password_hash
from ihatemoney.models import Project, db
@ -14,31 +14,48 @@ from ihatemoney.run import create_app
from ihatemoney.utils import create_jinja_env
class GeneratePasswordHash(Command):
@click.group(cls=FlaskGroup, create_app=create_app)
def cli():
"""IHateMoney Management script"""
@cli.command(
context_settings={"ignore_unknown_options": True, "allow_extra_args": True}
)
@click.pass_context
def runserver(ctx):
"""Deprecated, use the "run" command instead"""
click.secho(
'"runserver" is deprecated, please use the standard "run" flask command',
fg="red",
)
run = cli.get_command(ctx, "run")
ctx.forward(run)
@click.command(name="generate_password_hash")
def password_hash():
"""Get password from user and hash it without printing it in clear text."""
def run(self):
password = getpass.getpass(prompt="Password: ")
print(generate_password_hash(password))
class GenerateConfig(Command):
def get_options(self):
return [
Option(
@click.command()
@click.argument(
"config_file",
choices=[
type=click.Choice(
[
"ihatemoney.cfg",
"apache-vhost.conf",
"gunicorn.conf.py",
"supervisord.conf",
"nginx.conf",
],
)
]
),
)
def generate_config(config_file):
"""Generate front-end server configuration"""
@staticmethod
def gen_secret_key():
return "".join(
[
@ -49,7 +66,6 @@ class GenerateConfig(Command):
]
)
def run(self, config_file):
env = create_jinja_env("conf-templates", strict_rendering=True)
template = env.get_template(f"{config_file}.j2")
@ -61,47 +77,22 @@ class GenerateConfig(Command):
pkg_path=pkg_path,
bin_path=bin_path,
sys_prefix=sys.prefix,
secret_key=self.gen_secret_key(),
secret_key=gen_secret_key(),
)
)
class DeleteProject(Command):
def run(self, project_name):
demo_project = Project.query.get(project_name)
db.session.delete(demo_project)
@cli.command()
@click.argument("project_name")
def delete_project(project_name):
"""Delete a project"""
project = Project.query.get(project_name)
if project is None:
click.secho(f'Project "{project_name}" not found', fg="red")
else:
db.session.delete(project)
db.session.commit()
def main():
QUIET_COMMANDS = ("generate_password_hash", "generate-config")
exception = None
backup_stderr = sys.stderr
# Hack to divert stderr for commands generating content to stdout
# to avoid confusing the user
if len(sys.argv) > 1 and sys.argv[1] in QUIET_COMMANDS:
sys.stderr = open(os.devnull, "w")
try:
app = create_app()
Migrate(app, db)
except Exception as e:
exception = e
# Restore stderr
sys.stderr = backup_stderr
if exception:
raise exception
manager = Manager(app)
manager.add_command("db", MigrateCommand)
manager.add_command("generate_password_hash", GeneratePasswordHash)
manager.add_command("generate-config", GenerateConfig)
manager.add_command("delete-project", DeleteProject)
manager.run()
if __name__ == "__main__":
main()
cli()

View file

@ -6,7 +6,7 @@ msgstr ""
msgid "Project name"
msgstr ""
msgid "Private code"
msgid "New private code"
msgstr ""
msgid "Email"
@ -21,6 +21,11 @@ msgstr ""
msgid "Default Currency"
msgstr ""
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr ""
@ -30,6 +35,9 @@ msgstr ""
msgid "Project identifier"
msgstr ""
msgid "Private code"
msgstr ""
msgid "Create the project"
msgstr ""
@ -291,6 +299,12 @@ msgstr ""
msgid "The Dashboard is currently deactivated."
msgstr ""
msgid "Download Mobile Application"
msgstr ""
msgid "Get it on"
msgstr ""
msgid "you sure?"
msgstr ""
@ -573,12 +587,6 @@ msgstr ""
msgid "Statistics"
msgstr ""
msgid "History"
msgstr ""
msgid "Settings"
msgstr ""
msgid "Languages"
msgstr ""
@ -588,6 +596,12 @@ msgstr ""
msgid "Start a new project"
msgstr ""
msgid "History"
msgstr ""
msgid "Settings"
msgstr ""
msgid "Other projects :"
msgstr ""

View file

@ -17,6 +17,7 @@ from sqlalchemy_continuum import make_versioned, version_class
from sqlalchemy_continuum.plugins import FlaskPlugin
from werkzeug.security import generate_password_hash
from ihatemoney.currency_convertor import CurrencyConverter
from ihatemoney.patch_sqlalchemy_continuum import PatchedBuilder
from ihatemoney.versioning import (
ConditionalVersioningManager,
@ -139,7 +140,7 @@ class Project(db.Model):
"spent": sum(
[
bill.pay_each() * member.weight
for bill in self.get_bills().all()
for bill in self.get_bills_unordered().all()
if member in bill.owers
]
),
@ -156,7 +157,7 @@ class Project(db.Model):
:rtype dict:
"""
monthly = defaultdict(lambda: defaultdict(float))
for bill in self.get_bills().all():
for bill in self.get_bills_unordered().all():
monthly[bill.date.year][bill.date.month] += bill.converted_amount
return monthly
@ -215,15 +216,31 @@ class Project(db.Model):
def has_bills(self):
"""return if the project do have bills or not"""
return self.get_bills().count() > 0
return self.get_bills_unordered().count() > 0
def get_bills(self):
"""Return the list of bills related to this project"""
def has_multiple_currencies(self):
"""Returns True if multiple currencies are used"""
# It would be more efficient to do the counting in the database,
# but this is called very rarely so we can tolerate if it's a bit
# slow. And doing this in Python is much more readable, see #784.
nb_currencies = len(
set(bill.original_currency for bill in self.get_bills_unordered())
)
return nb_currencies > 1
def get_bills_unordered(self):
"""Base query for bill list"""
return (
Bill.query.join(Person, Project)
.filter(Bill.payer_id == Person.id)
.filter(Person.project_id == Project.id)
.filter(Project.id == self.id)
)
def get_bills(self):
"""Return the list of bills related to this project"""
return (
self.get_bills_unordered()
.order_by(Bill.date.desc())
.order_by(Bill.creation_date.desc())
.order_by(Bill.id.desc())
@ -232,11 +249,8 @@ class Project(db.Model):
def get_member_bills(self, member_id):
"""Return the list of bills related to a specific member"""
return (
Bill.query.join(Person, Project)
.filter(Bill.payer_id == Person.id)
.filter(Person.project_id == Project.id)
self.get_bills_unordered()
.filter(Person.id == member_id)
.filter(Project.id == self.id)
.order_by(Bill.date.desc())
.order_by(Bill.id.desc())
)
@ -263,6 +277,41 @@ class Project(db.Model):
)
return pretty_bills
def switch_currency(self, new_currency):
if new_currency == self.default_currency:
return
# Update converted currency
if new_currency == CurrencyConverter.no_currency:
if self.has_multiple_currencies():
raise ValueError(f"Can't unset currency of project {self.id}")
for bill in self.get_bills_unordered():
# We are removing the currency, and we already checked that all bills
# had the same currency: it means that we can simply strip the currency
# without converting the amounts. We basically ignore the current default_currency
# Reset converted amount in case it was different from the original amount
bill.converted_amount = bill.amount
# Strip currency
bill.original_currency = CurrencyConverter.no_currency
db.session.add(bill)
else:
for bill in self.get_bills_unordered():
if bill.original_currency == CurrencyConverter.no_currency:
# Bills that were created without currency will be set to the new currency
bill.original_currency = new_currency
bill.converted_amount = bill.amount
else:
# Convert amount for others, without touching original_currency
bill.converted_amount = CurrencyConverter().exchange_currency(
bill.amount, bill.original_currency, new_currency
)
db.session.add(bill)
self.default_currency = new_currency
db.session.add(self)
db.session.commit()
def remove_member(self, member_id):
"""Remove a member from the project.

View file

@ -7,7 +7,7 @@ from flask import Flask, g, render_template, request, session
from flask_babel import Babel, format_currency
from flask_mail import Mail
from flask_migrate import Migrate, stamp, upgrade
from jinja2 import contextfilter
from jinja2 import pass_context
from werkzeug.middleware.proxy_fix import ProxyFix
from ihatemoney import default_settings
@ -160,7 +160,7 @@ def create_app(
# Undocumented currencyformat filter from flask_babel is forwarding to Babel format_currency
# We overwrite it to remove the currency sign ¤ when there is no currency
@contextfilter
@pass_context
def currency(context, number, currency=None, *args, **kwargs):
if currency is None:
currency = context.get("g").project.default_currency

View file

@ -5,7 +5,7 @@
<thead><tr><th>{{ _("Project") }}</th><th>{{ _("Number of members") }}</th><th>{{ _("Number of bills") }}</th><th>{{_("Newest bill")}}</th><th>{{_("Oldest bill")}}</th><th>{{_("Actions")}}</th></tr></thead>
<tbody>{% for project in projects|sort(attribute='name') %}
<tr>
<td><a href="{{ url_for(".list_bills", project_id=project.id) }}" title="{{ project.name }}">{{ project.name }}</a></td><td>{{ project.members | count }}</td><td>{{ project.get_bills().count() }}</td>
<td><a href="{{ url_for(".list_bills", project_id=project.id) }}" title="{{ project.name }}">{{ project.name }}</a></td><td>{{ project.members | count }}</td><td>{{ project.get_bills_unordered().count() }}</td>
{% if project.has_bills() %}
<td>{{ project.get_bills().all()[0].date }}</td>
<td>{{ project.get_bills().all()[-1].date }}</td>

View file

@ -2,7 +2,7 @@
<div class="form-group{% if inline %} row{% endif %}">
{% if field.type != "SubmitField" %}
{% if inline %}
{{ field.label(class="col-3") }}
{{ field.label(class="col-3 mt-2") }}
{% else %}
{{ field.label() }}
{% endif %}
@ -120,31 +120,38 @@
{% if title %}<legend>{% if edit %}{{ _("Edit this bill") }} {% else %}{{ _("Add a bill") }} {% endif %}</legend>{% endif %}
{% include "display_errors.html" %}
{{ form.hidden_tag() }}
{{ input(form.date, class="form-control", inline=True) }}
{{ input(form.date, inline=True) }}
{{ input(form.what, inline=True) }}
{{ input(form.payer, inline=True, class="form-control custom-select") }}
{{ input(form.amount, inline=True) }}
{% if g.project.default_currency != "XXX" %}
{{ input(form.original_currency, inline=True) }}
{% endif %}
{{ input(form.external_link, inline=True) }}
<div class="form-group row">
<label class="col-3" for="payed_for">{{ _("For whom?") }}</label>
<div class="controls col-9">
<ul id="payed_for" class="inputs-list">
<p><a href="#" id="selectall" onclick="selectCheckboxes(true)">{{ _("Select all") }}</a> | <a href="#" id="selectnone" onclick="selectCheckboxes(false)">{{_("Select none")}}</a></p>
<div id="payed_for" class="controls col-9">
<p>
<a class="badge badge-secondary" href="#" classid="selectall" onclick="selectCheckboxes(true)">{{ _("Everyone") }}</a>
<a class="badge badge-secondary" href="#" id="selectnone" onclick="selectCheckboxes(false)">{{_("No one")}}</a>
</p>
<div class="d-flex flex-column flex-wrap overflow-auto" style="max-height: 20em;">
{% for key, value, checked in form.payed_for.iter_choices() | sort(attribute='1') %}
<p class="form-check">
<p class="form-check text-break" style="max-width: 50%;">
<label for="payed_for-{{key}}" class="form-check-label">
<input name="payed_for" type="checkbox" {% if checked %}checked{% endif %} class="form-check-input" value="{{key}}" id="payed_for-{{key}}"/>
<span>{{value}}</span>
</label>
</p>
{% endfor %}
</ul>
</div>
</div>
</div>
<details class="mb-3">
<summary class="mb-2">{{ _("More options") }}</summary>
{% if g.project.default_currency != "XXX" %}
{{ input(form.original_currency, inline=True, class="form-control custom-select") }}
{% endif %}
{{ input(form.external_link, inline=True) }}
</details>
</fieldset>
<div class="actions">
{{ form.submit(class="btn btn-primary") }}

View file

@ -42,14 +42,12 @@
<h1><a class="navbar-brand" href="{{ url_for("main.home") }}"><span>#!</span> money?</a></h1>
<div class="collapse navbar-collapse" id="navbarToggler">
<ul class="navbar-nav ml-auto mr-auto">
<ul class="navbar-nav nav-fill w-100">
{% if g.project %}
{% block navbar %}
<li class="nav-item{% if current_view == 'list_bills' %} active{% endif %}"><a class="nav-link" href="{{ url_for("main.list_bills") }}">{{ _("Bills") }}</a></li>
<li class="nav-item{% if current_view == 'settle_bill' %} active{% endif %}"><a class="nav-link" href="{{ url_for("main.settle_bill") }}">{{ _("Settle") }}</a></li>
<li class="nav-item{% if current_view == 'statistics' %} active{% endif %}"><a class="nav-link" href="{{ url_for("main.statistics") }}">{{ _("Statistics") }}</a></li>
<li class="nav-item{% if current_view == 'history' %} active{% endif %}"><a class="nav-link" href="{{ url_for("main.history") }}">{{ _("History") }}</a></li>
<li class="nav-item{% if current_view == 'edit_project' %} active{% endif %}"><a class="nav-link" href="{{ url_for("main.edit_project") }}">{{ _("Settings") }}</a></li>
{% endblock %}
{% endif %}
</ul>
@ -92,7 +90,10 @@
{{ _("Start a new project") }}
</a>
</li>
{% if g.project %}
<li><a class="dropdown-item" href="{{ url_for("main.history") }}">{{ _("History") }}</a></li>
<li><a class="dropdown-item" href="{{ url_for("main.edit_project") }}">{{ _("Settings") }}</a></li>
{% endif %}
{% if session['projects'] and not ((session['projects'] | length) == 1 and g.project and session['projects'][0][0] == g.project.id) %}
<li class="dropdown-divider"></li>

View file

@ -4,11 +4,14 @@ import json
import re
from time import sleep
import unittest
from unittest.mock import MagicMock
from flask import session
import pytest
from werkzeug.security import check_password_hash, generate_password_hash
from ihatemoney import models, utils
from ihatemoney import models
from ihatemoney.currency_convertor import CurrencyConverter
from ihatemoney.tests.common.ihatemoney_testcase import IhatemoneyTestCase
from ihatemoney.versioning import LoggingMode
@ -494,12 +497,9 @@ class BudgetTestCase(IhatemoneyTestCase):
resp.data.decode("utf-8"),
)
# Change throttling delay
import gc
from ihatemoney.web import login_throttler
for obj in gc.get_objects():
if isinstance(obj, utils.LoginThrottler):
obj._delay = 0.005
break
login_throttler._delay = 0.005
# Wait for delay to expire and retry logging in
sleep(1)
resp = self.client.post(
@ -805,7 +805,8 @@ class BudgetTestCase(IhatemoneyTestCase):
self.assertEqual(response.status_code, 200)
def test_statistics(self):
self.post_project("raclette")
# Output is checked with the USD sign
self.post_project("raclette", default_currency="USD")
# add members
self.client.post("/raclette/members/add", data={"name": "zorglub", "weight": 2})
@ -1446,6 +1447,225 @@ class BudgetTestCase(IhatemoneyTestCase):
member = models.Person.query.filter(models.Person.id == 1).one_or_none()
self.assertEqual(member, None)
def test_currency_switch(self):
mock_data = {"USD": 1, "EUR": 0.8, "CAD": 1.2, CurrencyConverter.no_currency: 1}
converter = CurrencyConverter()
converter.get_rates = MagicMock(return_value=mock_data)
# A project should be editable
self.post_project("raclette")
# add members
self.client.post("/raclette/members/add", data={"name": "zorglub"})
self.client.post("/raclette/members/add", data={"name": "fred"})
self.client.post("/raclette/members/add", data={"name": "tata"})
# create bills
self.client.post(
"/raclette/add",
data={
"date": "2016-12-31",
"what": "fromage à raclette",
"payer": 1,
"payed_for": [1, 2, 3],
"amount": "10.0",
},
)
self.client.post(
"/raclette/add",
data={
"date": "2016-12-31",
"what": "red wine",
"payer": 2,
"payed_for": [1, 3],
"amount": "20",
},
)
self.client.post(
"/raclette/add",
data={
"date": "2017-01-01",
"what": "refund",
"payer": 3,
"payed_for": [2],
"amount": "13.33",
},
)
project = models.Project.query.get("raclette")
# First all converted_amount should be the same as amount, with no currency
for bill in project.get_bills():
assert bill.original_currency == CurrencyConverter.no_currency
assert bill.amount == bill.converted_amount
# Then, switch to EUR, all bills must have been changed to this currency
project.switch_currency("EUR")
for bill in project.get_bills():
assert bill.original_currency == "EUR"
assert bill.amount == bill.converted_amount
# Add a bill in EUR, the current default currency
self.client.post(
"/raclette/add",
data={
"date": "2017-01-01",
"what": "refund from EUR",
"payer": 3,
"payed_for": [2],
"amount": "20",
"original_currency": "EUR",
},
)
last_bill = project.get_bills().first()
assert last_bill.converted_amount == last_bill.amount
# Erase all currencies
project.switch_currency(CurrencyConverter.no_currency)
for bill in project.get_bills():
assert bill.original_currency == CurrencyConverter.no_currency
assert bill.amount == bill.converted_amount
# Let's go back to EUR to test conversion
project.switch_currency("EUR")
# This is a bill in CAD
self.client.post(
"/raclette/add",
data={
"date": "2017-01-01",
"what": "Poutine",
"payer": 3,
"payed_for": [2],
"amount": "18",
"original_currency": "CAD",
},
)
last_bill = project.get_bills().first()
expected_amount = converter.exchange_currency(last_bill.amount, "CAD", "EUR")
assert last_bill.converted_amount == expected_amount
# Switch to USD. Now, NO bill should be in USD, since they already had a currency
project.switch_currency("USD")
for bill in project.get_bills():
assert bill.original_currency != "USD"
expected_amount = converter.exchange_currency(
bill.amount, bill.original_currency, "USD"
)
assert bill.converted_amount == expected_amount
# Switching back to no currency must fail
with pytest.raises(ValueError):
project.switch_currency(CurrencyConverter.no_currency)
# It also must fails with a nice error using the form
resp = self.client.post(
"/raclette/edit",
data={
"name": "demonstration",
"password": "demo",
"contact_email": "demo@notmyidea.org",
"project_history": "y",
"default_currency": converter.no_currency,
},
)
# A user displayed error should be generated, and its currency should be the same.
self.assertStatus(200, resp)
self.assertIn('<p class="alert alert-danger">', resp.data.decode("utf-8"))
self.assertEqual(models.Project.query.get("raclette").default_currency, "USD")
def test_currency_switch_to_bill_currency(self):
mock_data = {"USD": 1, "EUR": 0.8, "CAD": 1.2, CurrencyConverter.no_currency: 1}
converter = CurrencyConverter()
converter.get_rates = MagicMock(return_value=mock_data)
# Default currency is 'XXX', but we should start from a project with a currency
self.post_project("raclette", default_currency="USD")
# add members
self.client.post("/raclette/members/add", data={"name": "zorglub"})
self.client.post("/raclette/members/add", data={"name": "fred"})
# Bill with a different currency than project's default
self.client.post(
"/raclette/add",
data={
"date": "2016-12-31",
"what": "fromage à raclette",
"payer": 1,
"payed_for": [1, 2],
"amount": "10.0",
"original_currency": "EUR",
},
)
project = models.Project.query.get("raclette")
bill = project.get_bills().first()
assert bill.converted_amount == converter.exchange_currency(
bill.amount, "EUR", "USD"
)
# And switch project to the currency from the bill we created
project.switch_currency("EUR")
bill = project.get_bills().first()
assert bill.converted_amount == bill.amount
def test_currency_switch_to_no_currency(self):
mock_data = {"USD": 1, "EUR": 0.8, "CAD": 1.2, CurrencyConverter.no_currency: 1}
converter = CurrencyConverter()
converter.get_rates = MagicMock(return_value=mock_data)
# Default currency is 'XXX', but we should start from a project with a currency
self.post_project("raclette", default_currency="USD")
# add members
self.client.post("/raclette/members/add", data={"name": "zorglub"})
self.client.post("/raclette/members/add", data={"name": "fred"})
# Bills with a different currency than project's default
self.client.post(
"/raclette/add",
data={
"date": "2016-12-31",
"what": "fromage à raclette",
"payer": 1,
"payed_for": [1, 2],
"amount": "10.0",
"original_currency": "EUR",
},
)
self.client.post(
"/raclette/add",
data={
"date": "2017-01-01",
"what": "aspirine",
"payer": 2,
"payed_for": [1, 2],
"amount": "5.0",
"original_currency": "EUR",
},
)
project = models.Project.query.get("raclette")
for bill in project.get_bills_unordered():
assert bill.converted_amount == converter.exchange_currency(
bill.amount, "EUR", "USD"
)
# And switch project to no currency: amount should be equal to what was submitted
project.switch_currency(converter.no_currency)
no_currency_bills = [
(bill.amount, bill.converted_amount) for bill in project.get_bills()
]
assert no_currency_bills == [(5.0, 5.0), (10.0, 10.0)]
if __name__ == "__main__":
unittest.main()

View file

@ -1,3 +1,5 @@
import os
from flask_testing import TestCase
from werkzeug.security import generate_password_hash
@ -30,7 +32,7 @@ class BaseTestCase(TestCase):
follow_redirects=True,
)
def post_project(self, name, follow_redirects=True):
def post_project(self, name, follow_redirects=True, default_currency="XXX"):
"""Create a fake project"""
# create the project
return self.client.post(
@ -40,25 +42,27 @@ class BaseTestCase(TestCase):
"id": name,
"password": name,
"contact_email": f"{name}@notmyidea.org",
"default_currency": "USD",
"default_currency": default_currency,
},
follow_redirects=follow_redirects,
)
def create_project(self, name):
def create_project(self, name, default_currency="XXX"):
project = models.Project(
id=name,
name=str(name),
password=generate_password_hash(name),
contact_email=f"{name}@notmyidea.org",
default_currency="USD",
default_currency=default_currency,
)
models.db.session.add(project)
models.db.session.commit()
class IhatemoneyTestCase(BaseTestCase):
SQLALCHEMY_DATABASE_URI = "sqlite://"
SQLALCHEMY_DATABASE_URI = os.environ.get(
"TESTING_SQLALCHEMY_DATABASE_URI", "sqlite://"
)
TESTING = True
WTF_CSRF_ENABLED = False # Simplifies the tests.

View file

@ -25,7 +25,7 @@ class HistoryTestCase(IhatemoneyTestCase):
"name": "demo",
"contact_email": "demo@notmyidea.org",
"password": "demo",
"default_currency": "USD",
"default_currency": "XXX",
}
if logging_preference != LoggingMode.DISABLED:
@ -78,7 +78,7 @@ class HistoryTestCase(IhatemoneyTestCase):
"contact_email": "demo2@notmyidea.org",
"password": "123456",
"project_history": "y",
"default_currency": "USD",
"default_currency": "USD", # Currency changed from default
}
resp = self.client.post("/demo/edit", data=new_data, follow_redirects=True)
@ -103,7 +103,7 @@ class HistoryTestCase(IhatemoneyTestCase):
resp.data.decode("utf-8").index("Project renamed "),
resp.data.decode("utf-8").index("Project private code changed"),
)
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 4)
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 5)
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
def test_project_privacy_edit(self):
@ -284,7 +284,7 @@ class HistoryTestCase(IhatemoneyTestCase):
self.assertIn(
"Some entries below contain IP addresses,", resp.data.decode("utf-8")
)
self.assertEqual(resp.data.decode("utf-8").count("127.0.0.1"), 10)
self.assertEqual(resp.data.decode("utf-8").count("127.0.0.1"), 12)
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 1)
# Generate more operations to confirm additional IP info isn't recorded
@ -292,8 +292,8 @@ class HistoryTestCase(IhatemoneyTestCase):
resp = self.client.get("/demo/history")
self.assertEqual(resp.status_code, 200)
self.assertEqual(resp.data.decode("utf-8").count("127.0.0.1"), 10)
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 6)
self.assertEqual(resp.data.decode("utf-8").count("127.0.0.1"), 12)
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 7)
# Clear IP Data
resp = self.client.post("/demo/strip_ip_addresses", follow_redirects=True)
@ -311,7 +311,7 @@ class HistoryTestCase(IhatemoneyTestCase):
"Some entries below contain IP addresses,", resp.data.decode("utf-8")
)
self.assertEqual(resp.data.decode("utf-8").count("127.0.0.1"), 0)
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 16)
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 19)
def test_logs_for_common_actions(self):
# adds a member to this project

View file

@ -1,3 +1,5 @@
# This file is only used for test case "test_default_configuration_file"
DEBUG = False
SQLALCHEMY_DATABASE_URI = 'sqlite:///budget.db'
SQLACHEMY_ECHO = DEBUG

View file

@ -1,3 +1,5 @@
# This file is only used for test case "test_env_var_configuration_file"
DEBUG = False
SQLALCHEMY_DATABASE_URI = 'sqlite:///budget.db'
SQLACHEMY_ECHO = DEBUG

View file

@ -1,4 +1,3 @@
import io
import os
import smtplib
import socket
@ -6,10 +5,11 @@ import unittest
from unittest.mock import MagicMock, patch
from sqlalchemy import orm
from werkzeug.security import check_password_hash
from ihatemoney import models
from ihatemoney.currency_convertor import CurrencyConverter
from ihatemoney.manage import DeleteProject, GenerateConfig, GeneratePasswordHash
from ihatemoney.manage import delete_project, generate_config, password_hash
from ihatemoney.run import load_configuration
from ihatemoney.tests.common.ihatemoney_testcase import BaseTestCase, IhatemoneyTestCase
@ -33,7 +33,8 @@ class ConfigurationTestCase(BaseTestCase):
)
def test_env_var_configuration_file(self):
"""Test that settings are loaded from the specified configuration file"""
"""Test that settings are loaded from a configuration file specified
with an environment variable."""
os.environ["IHATEMONEY_SETTINGS_FILE_PATH"] = os.path.join(
__HERE__, "ihatemoney_envvar.cfg"
)
@ -42,6 +43,7 @@ class ConfigurationTestCase(BaseTestCase):
# Test that the specified configuration file is loaded
# even if the default configuration file ihatemoney.cfg exists
# in the current directory.
os.environ["IHATEMONEY_SETTINGS_FILE_PATH"] = os.path.join(
__HERE__, "ihatemoney_envvar.cfg"
)
@ -52,7 +54,8 @@ class ConfigurationTestCase(BaseTestCase):
os.environ.pop("IHATEMONEY_SETTINGS_FILE_PATH", None)
def test_default_configuration_file(self):
"""Test that settings are loaded from the default configuration file"""
"""Test that settings are loaded from a configuration file if one is found
in the current directory."""
self.app.config.root_path = __HERE__
load_configuration(self.app)
self.assertEqual(self.app.config["SECRET_KEY"], "supersecret")
@ -82,28 +85,23 @@ class CommandTestCase(BaseTestCase):
- raise no exception
- produce something non-empty
"""
cmd = GenerateConfig()
for config_file in cmd.get_options()[0].kwargs["choices"]:
with patch("sys.stdout", new=io.StringIO()) as stdout:
cmd.run(config_file)
print(stdout.getvalue())
self.assertNotEqual(len(stdout.getvalue().strip()), 0)
runner = self.app.test_cli_runner()
for config_file in generate_config.params[0].type.choices:
result = runner.invoke(generate_config, config_file)
self.assertNotEqual(len(result.output.strip()), 0)
def test_generate_password_hash(self):
cmd = GeneratePasswordHash()
with patch("sys.stdout", new=io.StringIO()) as stdout, patch(
"getpass.getpass", new=lambda prompt: "secret"
): # NOQA
cmd.run()
print(stdout.getvalue())
self.assertEqual(len(stdout.getvalue().strip()), 189)
runner = self.app.test_cli_runner()
with patch("getpass.getpass", new=lambda prompt: "secret"):
result = runner.invoke(password_hash)
self.assertTrue(check_password_hash(result.output.strip(), "secret"))
def test_demo_project_deletion(self):
self.create_project("demo")
self.assertEquals(models.Project.query.get("demo").name, "demo")
self.assertEqual(models.Project.query.get("demo").name, "demo")
cmd = DeleteProject()
cmd.run("demo")
runner = self.app.test_cli_runner()
runner.invoke(delete_project, "demo")
self.assertEqual(len(models.Project.query.all()), 0)
@ -245,7 +243,7 @@ class EmailFailureTestCase(IhatemoneyTestCase):
class TestCurrencyConverter(unittest.TestCase):
converter = CurrencyConverter()
mock_data = {"USD": 1, "EUR": 0.8115}
mock_data = {"USD": 1, "EUR": 0.8, "CAD": 1.2, CurrencyConverter.no_currency: 1}
converter.get_rates = MagicMock(return_value=mock_data)
def test_only_one_instance(self):
@ -254,11 +252,14 @@ class TestCurrencyConverter(unittest.TestCase):
self.assertEqual(one, two)
def test_get_currencies(self):
self.assertCountEqual(self.converter.get_currencies(), ["USD", "EUR"])
self.assertCountEqual(
self.converter.get_currencies(),
["USD", "EUR", "CAD", CurrencyConverter.no_currency],
)
def test_exchange_currency(self):
result = self.converter.exchange_currency(100, "USD", "EUR")
self.assertEqual(result, 81.15)
self.assertEqual(result, 80.0)
if __name__ == "__main__":

View file

@ -1,30 +1,32 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-07-31 12:12+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2020-08-01 10:41+0000\n"
"Last-Translator: Oymate <dhruboadittya96@gmail.com>\n"
"Language-Team: Bengali (Bangladesh) <https://hosted.weblate.org/projects/"
"i-hate-money/i-hate-money/bn_BD/>\n"
"Language: bn_BD\n"
"Language-Team: Bengali (Bangladesh) "
"<https://hosted.weblate.org/projects/i-hate-money/i-hate-money/bn_BD/>\n"
"Plural-Forms: nplurals=2; plural=n != 1\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2-dev\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
"accepted."
msgstr ""
"কোন বৈধ পরিমাণ বা অভিব্যক্তি নয়। শুধুমাত্র সংখ্যা এবং + - * / অপারেটর গ্রহণ "
"করা হয়।"
"কোন বৈধ পরিমাণ বা অভিব্যক্তি নয়। শুধুমাত্র সংখ্যা এবং + - * / অপারেটর "
"গ্রহণ করা হয়।"
msgid "Project name"
msgstr "প্রকল্পের নাম"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "ব্যক্তিগত কোড"
msgid "Email"
@ -39,6 +41,11 @@ msgstr ""
msgid "Default Currency"
msgstr ""
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr ""
@ -48,6 +55,9 @@ msgstr ""
msgid "Project identifier"
msgstr ""
msgid "Private code"
msgstr "ব্যক্তিগত কোড"
msgid "Create the project"
msgstr ""
@ -309,6 +319,12 @@ msgstr ""
msgid "The Dashboard is currently deactivated."
msgstr ""
msgid "Download Mobile Application"
msgstr ""
msgid "Get it on"
msgstr ""
msgid "you sure?"
msgstr ""
@ -591,12 +607,6 @@ msgstr ""
msgid "Statistics"
msgstr ""
msgid "History"
msgstr ""
msgid "Settings"
msgstr ""
msgid "Languages"
msgstr ""
@ -606,6 +616,12 @@ msgstr ""
msgid "Start a new project"
msgstr ""
msgid "History"
msgstr ""
msgid "Settings"
msgstr ""
msgid "Other projects :"
msgstr ""
@ -769,3 +785,4 @@ msgstr ""
msgid "Period"
msgstr ""

View file

@ -1,30 +1,30 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-30 21:50+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2021-01-08 14:32+0000\n"
"Last-Translator: Oliver Klimt <klimt.oliver@gmail.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/cs/>\n"
"Language: cs\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/i-hate-money/i"
"-hate-money/cs/>\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\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"
"X-Generator: Weblate 4.4.1-dev\n"
"Generated-By: Babel 2.8.0\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
"accepted."
msgstr ""
"Neplatná částka nebo výraz. Pouze čísla a operátory + - * / jsou přípustná"
msgstr "Neplatná částka nebo výraz. Pouze čísla a operátory + - * / jsou přípustná"
msgid "Project name"
msgstr "Název projektu"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "Přístupový kód"
msgid "Email"
@ -39,6 +39,11 @@ msgstr "Záznam IP adres pro historii projektu"
msgid "Default Currency"
msgstr "Výchozí měna"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "Import exportovaného JSON souboru"
@ -48,6 +53,9 @@ msgstr "Import"
msgid "Project identifier"
msgstr "Identifikátor projektu"
msgid "Private code"
msgstr "Přístupový kód"
msgid "Create the project"
msgstr "Vytvořit projekt"
@ -56,8 +64,8 @@ msgid ""
"A project with this identifier (\"%(project)s\") already exists. Please "
"choose a new identifier"
msgstr ""
"Projekt s tímto identifikátorem (\"%(project)s\") již existuje, zvolte nový "
"identifikátor"
"Projekt s tímto identifikátorem (\"%(project)s\") již existuje, zvolte "
"nový identifikátor"
msgid "Get in"
msgstr "Vstoupit"
@ -311,6 +319,13 @@ msgstr ""
msgid "The Dashboard is currently deactivated."
msgstr ""
msgid "Download Mobile Application"
msgstr ""
#, fuzzy
msgid "Get it on"
msgstr "Vstoupit"
msgid "you sure?"
msgstr ""
@ -593,12 +608,6 @@ msgstr ""
msgid "Statistics"
msgstr ""
msgid "History"
msgstr ""
msgid "Settings"
msgstr ""
msgid "Languages"
msgstr ""
@ -608,6 +617,12 @@ msgstr ""
msgid "Start a new project"
msgstr ""
msgid "History"
msgstr ""
msgid "Settings"
msgstr ""
msgid "Other projects :"
msgstr ""
@ -787,3 +802,4 @@ msgstr ""
#~ "is by the server, so don\\'t reuse"
#~ " a personal password!"
#~ msgstr ""

View file

@ -1,19 +1,19 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-30 21:50+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2020-11-04 17:27+0000\n"
"Last-Translator: mdmdmdmdmd <exe_tmp@gmx.de>\n"
"Language-Team: German <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/de/>\n"
"Language: de\n"
"Language-Team: German <https://hosted.weblate.org/projects/i-hate-money/i"
"-hate-money/de/>\n"
"Plural-Forms: nplurals=2; plural=n != 1\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: Weblate 4.3.2-dev\n"
"Generated-By: Babel 2.8.0\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@ -25,7 +25,8 @@ msgstr ""
msgid "Project name"
msgstr "Projektname"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "Privater Code"
msgid "Email"
@ -40,6 +41,11 @@ msgstr "IP-Tracking für Verlauf benutzen"
msgid "Default Currency"
msgstr "Standardwährung"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "Zuvor exportierte JSON-Datei importieren"
@ -49,6 +55,9 @@ msgstr "Import"
msgid "Project identifier"
msgstr "Projektkennung"
msgid "Private code"
msgstr "Privater Code"
msgid "Create the project"
msgstr "Projekt erstellen"
@ -326,6 +335,14 @@ msgstr "Zeigen"
msgid "The Dashboard is currently deactivated."
msgstr "Das Dashboard ist aktuell deaktiviert."
#, fuzzy
msgid "Download Mobile Application"
msgstr "Handy-Applikation"
#, fuzzy
msgid "Get it on"
msgstr "Eintreten"
msgid "you sure?"
msgstr "Bist du sicher?"
@ -630,12 +647,6 @@ msgstr "Bilanz"
msgid "Statistics"
msgstr "Statistik"
msgid "History"
msgstr "Verlauf"
msgid "Settings"
msgstr "Einstellungen"
msgid "Languages"
msgstr "Sprachen"
@ -645,6 +656,12 @@ msgstr "Projekte"
msgid "Start a new project"
msgstr "Starte ein neues Projekt"
msgid "History"
msgstr "Verlauf"
msgid "Settings"
msgstr "Einstellungen"
msgid "Other projects :"
msgstr "Andere Projekte:"
@ -842,3 +859,4 @@ msgstr "Zeitraum"
#~ " gesendet. Es wird als Klartext auf"
#~ " dem Server gespeichert. Bitte verwenden"
#~ " daher kein persönliches Passwort!"

View file

@ -1,18 +1,20 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-30 21:50+0200\n"
"PO-Revision-Date: 2021-02-23 14:50+0000\n"
"Last-Translator: Michalis <michalisntovas@yahoo.gr>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/el/>\n"
"PO-Revision-Date: 2021-07-03 22:35+0000\n"
"Last-Translator: Eugenia Russell <eugenia.russell2019@gmail.com>\n"
"Language: el\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/i-hate-money/i"
"-hate-money/el/>\n"
"Plural-Forms: nplurals=2; plural=n != 1\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: Weblate 4.5\n"
"X-Generator: Weblate 4.8-dev\n"
"Generated-By: Babel 2.8.0\n"
msgid ""
@ -21,34 +23,43 @@ msgid ""
msgstr ""
msgid "Project name"
msgstr ""
msgstr "Τίτλος εργασίας"
msgid "Private code"
msgstr ""
#, fuzzy
msgid "New private code"
msgstr "Ιδιωτικός κωδικός"
msgid "Email"
msgstr ""
msgstr "Ηλεκτρονικό ταχυδρομείο"
msgid "Enable project history"
msgstr ""
msgstr "Ενεργοποίηση ιστορικού έργων"
msgid "Use IP tracking for project history"
msgstr ""
msgstr "Χρήση παρακολούθησης IP για ιστορικό έργων"
msgid "Default Currency"
msgstr "Προεπιλεγμένο Νόμισμα"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr ""
msgstr "Εισαγωγή αρχείου JSON που έχει εξαχθεί προηγουμένως"
msgid "Import"
msgstr ""
msgstr "Εισαγωγή"
msgid "Project identifier"
msgstr ""
msgstr "Αναγνωριστικό έργου"
msgid "Private code"
msgstr "Ιδιωτικός κωδικός"
msgid "Create the project"
msgstr ""
msgstr "Δημιουργήστε το έργο"
#, python-format
msgid ""
@ -57,28 +68,28 @@ msgid ""
msgstr ""
msgid "Get in"
msgstr ""
msgstr "Συνδεθείτε"
msgid "Admin password"
msgstr ""
msgstr "Κωδικός πρόσβασης διαχειριστή"
msgid "Send me the code by email"
msgstr "Στείλε μου τον κωδικό μέσω εμάιλ"
msgid "This project does not exists"
msgstr "Το πρότζεκτ αυτό δεν υπάρχει"
msgstr "Το έργο αυτό δεν υφίσταται"
msgid "Password mismatch"
msgstr "Ο κωδικός δεν ταιριάζει"
msgstr "Ασυμφωνία κωδικού πρόσβασης"
msgid "Password"
msgstr "Κωδικός"
msgstr "Κωδικός πρόσβασης"
msgid "Password confirmation"
msgstr "Επιβεβαίωση κωδικού"
msgstr "Επιβεβαίωση κωδικού πρόσβασης"
msgid "Reset password"
msgstr "Επαναφορά κωδικού"
msgstr "Επαναφορά κωδικού πρόσβασης"
msgid "Date"
msgstr "Ημερομηνία"
@ -87,35 +98,37 @@ msgid "What?"
msgstr "Τι?"
msgid "Payer"
msgstr "Πληρωτής"
msgstr "Φορέας πληρωμής"
msgid "Amount paid"
msgstr "Πληρωμένο ποσό"
msgstr "Καταβληθέν ποσό"
msgid "Currency"
msgstr "Νόμισμα"
msgid "External link"
msgstr ""
msgstr "Εξωτερική σύνδεση"
msgid "A link to an external document, related to this bill"
msgstr ""
"Ένας σύνδεσμος προς ένα εξωτερικό έγγραφο, που σχετίζεται με αυτόν τον "
"λογαριασμό"
msgid "For whom?"
msgstr "Για ποιόν?"
msgstr "Για ποιον;"
msgid "Submit"
msgstr "Υποβολή"
msgstr "Yποβολή"
msgid "Submit and add a new one"
msgstr "Υποβολή και προσθήκη νέου"
#, python-format
msgid "Project default: %(currency)s"
msgstr ""
msgstr "Προεπιλογή έργου: %(currency)s"
msgid "Bills can't be null"
msgstr ""
msgstr "Οι λογαριασμοί δεν μπορούν να είναι μηδενικοί"
msgid "Name"
msgstr "Όνομα"
@ -133,17 +146,17 @@ msgid "User name incorrect"
msgstr "Λανθασμένο όνομα χρήστη"
msgid "This project already have this member"
msgstr "Το πρότζεκτ έχει ήδη αυτό το μέλος"
msgstr "Αυτό το έργο έχει ήδη αυτό το μέλος"
msgid "People to notify"
msgstr "Άτομα να ειδοποιήσεις"
msgstr "Πρόσωπα προς ενημέρωση"
msgid "Send invites"
msgstr "Στείλε πρόσκληση"
msgstr "Αποστολή προσκλήσεων"
#, python-format
msgid "The email %(email)s is not valid"
msgstr ""
msgstr "Το μήνυμα ηλεκτρονικού ταχυδρομείου %(email)s δεν είναι έγκυρο"
msgid "Participant"
msgstr "Συμμέτοχος"
@ -167,10 +180,10 @@ msgstr ""
"προσπάθειες."
msgid "You either provided a bad token or no project identifier."
msgstr ""
msgstr "Είτε δώσατε ένα εσφαλμένο διακριτικό είτε δεν δώσατε αναγνωριστικό έργου."
msgid "This private code is not the right one"
msgstr ""
msgstr "Αυτός ο ιδιωτικός κωδικός δεν είναι ο σωστός"
#, python-format
msgid "You have just created '%(project)s' to share your expenses"
@ -183,12 +196,12 @@ msgid ""
"We tried to send you an reminder email, but there was an error. You can "
"still use the project normally."
msgstr ""
"Προσπαθήσαμε να σας στείλουμε ένα εμάιλ υπενθύμισης, αλλά υπήρξε ένα λάθος. "
"Μπορείτε ακόμα να χρησιμοποιήσετε το πρότζεκτ κανονικά."
"Προσπαθήσαμε να σας στείλουμε ένα εμάιλ υπενθύμισης, αλλά υπήρξε ένα "
"λάθος. Μπορείτε ακόμα να χρησιμοποιήσετε το πρότζεκτ κανονικά."
#, python-format
msgid "The project identifier is %(project)s"
msgstr ""
msgstr "Το αναγνωριστικό έργου είναι %(project)s"
msgid ""
"Sorry, there was an error while sending you an email with password reset "
@ -197,10 +210,10 @@ msgid ""
msgstr ""
msgid "No token provided"
msgstr ""
msgstr "Δεν παρέχεται διακριτικό"
msgid "Invalid token"
msgstr ""
msgstr "Το διακριτικό δεν είναι έγκυρο"
msgid "Unknown project"
msgstr "Άγνωστο πρότζεκτ"
@ -209,17 +222,17 @@ msgid "Password successfully reset."
msgstr "Επαναφορά του κωδικού επιτυχώς."
msgid "Project successfully uploaded"
msgstr ""
msgstr "Έργο που φορτώθηκε επιτυχώς"
msgid "Invalid JSON"
msgstr ""
msgstr "Η JSON δεν είναι έγκυρη"
msgid "Project successfully deleted"
msgstr "Το πρότζεκτ διαγράφηκε επιτυχώς"
#, python-format
msgid "You have been invited to share your expenses for %(project)s"
msgstr ""
msgstr "Έχετε κληθεί να μοιραστείτε τα έξοδά σας για %(project)s"
msgid "Your invitations have been sent"
msgstr "Οι προσκλήσεις έχουν σταλθεί"
@ -232,11 +245,11 @@ msgstr ""
#, python-format
msgid "%(member)s has been added"
msgstr ""
msgstr "%(member)s έχει προστεθεί"
#, python-format
msgid "%(name)s is part of this project again"
msgstr ""
msgstr "%(name)s είναι και πάλι μέρος αυτού του έργου"
#, python-format
msgid ""
@ -246,146 +259,159 @@ msgstr ""
#, python-format
msgid "User '%(name)s' has been removed"
msgstr ""
msgstr "Ο χρήστης '%(name)s' έχει αφαιρεθεί"
#, python-format
msgid "User '%(name)s' has been edited"
msgstr ""
msgstr "Ο χρήστης \"%(name)s\" έχει τροποποιηθεί"
msgid "The bill has been added"
msgstr "Ο λογαριασμός προστέθηκε"
msgid "The bill has been deleted"
msgstr ""
msgstr "Ο λογαριασμός έχει διαγραφεί"
msgid "The bill has been modified"
msgstr ""
msgstr "Ο λογαριασμός έχει τροποποιηθεί"
msgid "Sorry, we were unable to find the page you've asked for."
msgstr ""
msgstr "Λυπούμαστε, δεν ήταν δυνατή η εύρεση της σελίδας που ζητήσατε."
msgid "The best thing to do is probably to get back to the main page."
msgstr ""
msgstr "Το καλύτερο που έχετε να κάνετε είναι να επιστρέψετε στην κεντρική σελίδα."
msgid "Back to the list"
msgstr ""
msgstr "Επιστροφή στη λίστα"
msgid "Administration tasks are currently disabled."
msgstr ""
msgstr "Οι εργασίες διαχείρισης είναι προς το παρόν απενεργοποιημένες."
msgid "The project you are trying to access do not exist, do you want to"
msgstr ""
"Το έργο στο οποίο προσπαθείτε να αποκτήσετε πρόσβαση δεν υπάρχει, θέλετε "
"να"
msgid "create it"
msgstr ""
msgstr "δημιουργήστε αυτό"
msgid "?"
msgstr ""
msgstr ";"
msgid "Create a new project"
msgstr ""
msgstr "Δημιουργία νέου έργου"
msgid "Number of members"
msgstr ""
msgstr "Αριθμός μελών"
msgid "Number of bills"
msgstr ""
msgstr "Αριθμός λογαριασμών"
msgid "Newest bill"
msgstr ""
msgstr "Νεώτερος λογαριασμός"
msgid "Oldest bill"
msgstr ""
msgstr "Παλαιότερος λογαριασμός"
msgid "Actions"
msgstr ""
msgstr "Ενέργειες"
msgid "edit"
msgstr ""
msgstr "επιμελειθήτε"
msgid "delete"
msgstr ""
msgstr "διαγραφή"
msgid "show"
msgstr ""
msgstr "εμφάνιση"
msgid "The Dashboard is currently deactivated."
msgstr "Ο πίνακας ελέγχου είναι προς το παρόν απενεργοποιημένος."
msgid "Download Mobile Application"
msgstr ""
#, fuzzy
msgid "Get it on"
msgstr "Συνδεθείτε"
msgid "you sure?"
msgstr ""
msgstr "Είστε σίγουρος;"
msgid "Edit project"
msgstr ""
msgstr "Επεξεργασία έργου"
msgid "Import JSON"
msgstr ""
msgstr "Εισαγωγή JSON"
msgid "Choose file"
msgstr ""
msgstr "Επιλογή αρχείου"
msgid "Download project's data"
msgstr ""
msgstr "Κατεβάστε τα δεδομένα του έργου"
msgid "Bill items"
msgstr ""
msgstr "Στοιχεία λογαριασμού"
msgid "Download the list of bills with owner, amount, reason,... "
msgstr ""
"Κατεβάστε τη λίστα των λογαριασμών με τον ιδιοκτήτη, το ποσό, την "
"αιτία,... "
msgid "Settle plans"
msgstr ""
msgstr "Διευθέτηση σχεδίων"
msgid "Download the list of transactions needed to settle the current bills."
msgstr ""
"Κατεβάστε τη λίστα των συναλλαγών που απαιτούνται για την εξόφληση των "
"τρεχόντων λογαριασμών."
msgid "Can't remember the password?"
msgstr ""
msgstr "Δεν μπορείτε να θυμηθείτε τον κωδικό πρόσβασης;"
msgid "Cancel"
msgstr ""
msgstr "Ακύρωση"
msgid "Privacy Settings"
msgstr ""
msgstr "Ρυθμίσεις απορρήτου"
msgid "Edit the project"
msgstr ""
msgstr "Επεξεργαστείτε το έργο"
msgid "Edit this bill"
msgstr ""
msgstr "Επεξεργαστείτε αυτόν τον λογαριασμό"
msgid "Add a bill"
msgstr ""
msgstr "Προσθήκη λογαριασμού"
msgid "Select all"
msgstr ""
msgstr "Επιλογή όλων"
msgid "Select none"
msgstr ""
msgstr "Επιλογή κανενός"
msgid "Add participant"
msgstr ""
msgstr "Προσθήκη συμμετέχοντος"
msgid "Edit this member"
msgstr ""
msgstr "Επεξεργασία αυτού του μέλους"
msgid "john.doe@example.com, mary.moe@site.com"
msgstr ""
msgid "Send the invitations"
msgstr ""
msgstr "Αποστολή των προσκλήσεων"
msgid "Download"
msgstr ""
msgstr "Κατεβάστε"
msgid "Disabled Project History"
msgstr ""
msgstr "Απενεργοποιημένο ιστορικό έργου"
msgid "Disabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled Project History"
msgstr ""
msgstr "Ενεργοποιημένο ιστορικό έργου"
msgid "Disabled IP Address Recording"
msgstr ""
@ -397,16 +423,16 @@ msgid "Enabled IP Address Recording"
msgstr ""
msgid "History Settings Changed"
msgstr ""
msgstr "Αλλαγή ρυθμίσεων ιστορικού"
msgid "changed"
msgstr ""
msgstr "μεταβολή"
msgid "from"
msgstr ""
msgstr "από"
msgid "to"
msgstr ""
msgstr "προς"
msgid "Confirm Remove IP Adresses"
msgstr ""
@ -419,13 +445,13 @@ msgid ""
msgstr ""
msgid "Close"
msgstr ""
msgstr "Κλείστε"
msgid "Confirm Delete"
msgstr ""
msgstr "Επιβεβαίωση Διαγραφής;"
msgid "Delete Confirmation"
msgstr ""
msgstr "Επιβεβαίωση Διαγραφής"
msgid ""
"Are you sure you want to erase all history for this project? This action "
@ -433,16 +459,16 @@ msgid ""
msgstr ""
msgid "Added"
msgstr ""
msgstr "Προστέθηκε"
msgid "Removed"
msgstr ""
msgstr "Καταργήθηκε"
msgid "and"
msgstr ""
msgstr "και"
msgid "owers list"
msgstr ""
msgstr "λίστα οφειλών"
#, python-format
msgid ""
@ -469,25 +495,25 @@ msgid ""
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgstr "Διαγραφή αποθηκευμένων διευθύνσεων IP"
msgid "No history to erase"
msgstr ""
msgstr "Δεν υπάρχει ιστορία για διαγραφή"
msgid "Clear Project History"
msgstr ""
msgstr "Απαλοιφή ιστορικού έργου"
msgid "No IP Addresses to erase"
msgstr ""
msgstr "Δεν υπάρχουν διευθύνσεις IP προς διαγραφή"
msgid "Delete Stored IP Addresses"
msgstr ""
msgstr "Διαγραφή αποθηκευμένων διευθύνσεων IP"
msgid "Time"
msgstr ""
msgstr "Ώρα"
msgid "Event"
msgstr ""
msgstr "Εκδήλωση"
msgid "IP address recording can be enabled on the settings page"
msgstr ""
@ -496,56 +522,56 @@ msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgstr "Από IP"
msgid "added"
msgstr ""
msgstr "προστέθηκε"
msgid "Project private code changed"
msgstr ""
msgstr "Ο ιδιωτικός κωδικός έργου άλλαξε"
msgid "Project renamed to"
msgstr ""
msgstr "Το έργο μετονομάστηκε σε"
msgid "Project contact email changed to"
msgstr ""
msgstr "Το μήνυμα ηλεκτρονικού ταχυδρομείου επικοινωνίας έργου άλλαξε σε"
msgid "Project settings modified"
msgstr ""
msgstr "Τροποποιημένες ρυθμίσεις έργου"
msgid "deactivated"
msgstr ""
msgstr "απενεργοποιήθη"
msgid "reactivated"
msgstr ""
msgstr "επανενεργοποιήθη"
msgid "renamed to"
msgstr ""
msgstr "μετονομάστηκε σε"
msgid "External link changed to"
msgstr ""
msgstr "Ο εξωτερικός σύνδεσμος άλλαξε σε"
msgid "Amount"
msgstr ""
msgstr "Ποσό"
#, python-format
msgid "Amount in %(currency)s"
msgstr ""
msgstr "Ποσό σε %(currency)s"
msgid "modified"
msgstr ""
msgstr "τροποποιήθη"
msgid "removed"
msgstr ""
msgstr "αφαιρέθηκε"
msgid "changed in a unknown way"
msgstr ""
msgstr "άλλαξε με άγνωστο τρόπο"
msgid "Nothing to list"
msgstr ""
msgstr "Τίποτα προς καταγραφή"
msgid "Someone probably cleared the project history."
msgstr ""
msgstr "Κάποιος πιθανώς διέγραψε το ιστορικό του έργου."
msgid "Manage your shared <br />expenses, easily"
msgstr ""
@ -575,7 +601,7 @@ msgid "can't remember your password?"
msgstr ""
msgid "Create"
msgstr ""
msgstr "Δημιουργία"
msgid ""
"Don\\'t reuse a personal password. Choose a private code and send it to "
@ -594,12 +620,6 @@ msgstr ""
msgid "Statistics"
msgstr ""
msgid "History"
msgstr ""
msgid "Settings"
msgstr ""
msgid "Languages"
msgstr ""
@ -609,6 +629,12 @@ msgstr ""
msgid "Start a new project"
msgstr ""
msgid "History"
msgstr ""
msgid "Settings"
msgstr ""
msgid "Other projects :"
msgstr ""
@ -759,19 +785,19 @@ msgid "deactivate"
msgstr ""
msgid "reactivate"
msgstr ""
msgstr "επανενεργοποιήστε το"
msgid "Paid"
msgstr ""
msgstr "Εξοφλήθη"
msgid "Spent"
msgstr ""
msgstr "Ξοδεύτηκε"
msgid "Expenses by Month"
msgstr ""
msgstr "Δαπάνες ανά μήνα"
msgid "Period"
msgstr ""
msgstr "Περίοδος"
#~ msgid "%(msg_compl)sThe project identifier is %(project)s"
#~ msgstr ""
@ -788,3 +814,4 @@ msgstr ""
#~ "is by the server, so don\\'t reuse"
#~ " a personal password!"
#~ msgstr ""

File diff suppressed because it is too large Load diff

View file

@ -1,30 +1,32 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-22 14:01+0200\n"
"PO-Revision-Date: 2020-11-11 16:28+0000\n"
"Last-Translator: Puyma <puyma@amyup.xyz>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/es/>\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2021-04-14 08:27+0000\n"
"Last-Translator: fcoterroba <fcoterroba@gmail.com>\n"
"Language: es\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/i-hate-"
"money/i-hate-money/es/>\n"
"Plural-Forms: nplurals=2; plural=n != 1\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.4-dev\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
"accepted."
msgstr ""
"Cantidad o expresión no válida. Solo se aceptan números y los operadores + - "
"* /."
"Cantidad o expresión no válida. Solo se aceptan números y los operadores "
"+ - * /."
msgid "Project name"
msgstr "Nombre del proyecto"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "Código privado"
msgid "Email"
@ -34,11 +36,16 @@ msgid "Enable project history"
msgstr "Habilitar historial del proyecto"
msgid "Use IP tracking for project history"
msgstr ""
msgstr "Usar trackeo IP para historial de proyecto"
msgid "Default Currency"
msgstr "Moneda por defecto"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "Importar .JSON previamente exportado"
@ -48,6 +55,9 @@ msgstr "Importar"
msgid "Project identifier"
msgstr "Identificador del proyecto"
msgid "Private code"
msgstr "Código privado"
msgid "Create the project"
msgstr "Crear proyecto"
@ -56,6 +66,8 @@ msgid ""
"A project with this identifier (\"%(project)s\") already exists. Please "
"choose a new identifier"
msgstr ""
"Un proyecto con este identificador (\"%(project)s\") ya existe. Elija un "
"nuevo identificador, por favor."
msgid "Get in"
msgstr ""
@ -309,6 +321,13 @@ msgstr "mostrar"
msgid "The Dashboard is currently deactivated."
msgstr ""
#, fuzzy
msgid "Download Mobile Application"
msgstr "Aplicación móvil"
msgid "Get it on"
msgstr ""
msgid "you sure?"
msgstr ""
@ -578,8 +597,8 @@ msgid ""
"Don\\'t reuse a personal password. Choose a private code and send it to "
"your friends"
msgstr ""
"No reutilizes una contraseña personal. Escoge un código privado i envíalo a "
"tus amigos"
"No reutilizes una contraseña personal. Escoge un código privado i envíalo"
" a tus amigos"
msgid "Account manager"
msgstr ""
@ -593,12 +612,6 @@ msgstr ""
msgid "Statistics"
msgstr "Estadísticas"
msgid "History"
msgstr "Historia"
msgid "Settings"
msgstr "Ajustes"
msgid "Languages"
msgstr "Idiomas"
@ -608,6 +621,12 @@ msgstr "Proyectos"
msgid "Start a new project"
msgstr ""
msgid "History"
msgstr "Historia"
msgid "Settings"
msgstr "Ajustes"
msgid "Other projects :"
msgstr "Otros proyectos :"
@ -771,3 +790,4 @@ msgstr "Gastos por mes"
msgid "Period"
msgstr "Período"

View file

@ -1,19 +1,19 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-30 21:50+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2020-11-11 16:28+0000\n"
"Last-Translator: Puyma <puyma@amyup.xyz>\n"
"Language-Team: Spanish (Latin America) <https://hosted.weblate.org/projects/"
"i-hate-money/i-hate-money/es_419/>\n"
"Language: es_419\n"
"Language-Team: Spanish (Latin America) "
"<https://hosted.weblate.org/projects/i-hate-money/i-hate-money/es_419/>\n"
"Plural-Forms: nplurals=2; plural=n != 1\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: Weblate 4.4-dev\n"
"Generated-By: Babel 2.8.0\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@ -25,7 +25,8 @@ msgstr ""
msgid "Project name"
msgstr "Nombre del Proyecto"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "Código privado"
msgid "Email"
@ -40,6 +41,11 @@ msgstr "Registrar la IPs para el historial del proyecto"
msgid "Default Currency"
msgstr "Moneda por defecto"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "Importar archivo JSON previamente exportado"
@ -49,6 +55,9 @@ msgstr "Importar"
msgid "Project identifier"
msgstr "Identificador de proyecto"
msgid "Private code"
msgstr "Código privado"
msgid "Create the project"
msgstr "Crear proyecto"
@ -238,9 +247,9 @@ msgid ""
"Please check the email configuration of the server or contact the "
"administrator."
msgstr ""
"Lo sentimos, hubo un error cuando intentamos enviarle correos de invitación. "
"Por favor, revise la configuración de correo en el servidor o contactese con "
"el administrador."
"Lo sentimos, hubo un error cuando intentamos enviarle correos de "
"invitación. Por favor, revise la configuración de correo en el servidor o"
" contactese con el administrador."
#, python-format
msgid "%(member)s has been added"
@ -326,6 +335,14 @@ msgstr ""
msgid "The Dashboard is currently deactivated."
msgstr "El panel está desactivado actualmente."
#, fuzzy
msgid "Download Mobile Application"
msgstr "Aplicación móvil"
#, fuzzy
msgid "Get it on"
msgstr "Entrar"
msgid "you sure?"
msgstr "¿Estás seguro?"
@ -631,12 +648,6 @@ msgstr "Resolver"
msgid "Statistics"
msgstr "Estadísticas"
msgid "History"
msgstr "Historial"
msgid "Settings"
msgstr "Configuración"
msgid "Languages"
msgstr "Idiomas"
@ -646,6 +657,12 @@ msgstr "Proyectos"
msgid "Start a new project"
msgstr "Comenzar un nuevo proyecto"
msgid "History"
msgstr "Historial"
msgid "Settings"
msgstr "Configuración"
msgid "Other projects :"
msgstr "Otros proyectos :"
@ -842,3 +859,4 @@ msgstr "Período"
#~ " tus amigos. El servidor lo almacena"
#~ " tal cual, así que no reutilice "
#~ "una contraseña personal!"

View file

@ -7,18 +7,17 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2020-05-30 14:26+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2020-06-01 16:41+0000\n"
"Last-Translator: Glandos <bugs-github@antipoul.fr>\n"
"Language-Team: French <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/fr/>\n"
"Language: fr\n"
"Language-Team: French <https://hosted.weblate.org/projects/i-hate-money/i"
"-hate-money/fr/>\n"
"Plural-Forms: nplurals=2; plural=n > 1\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: Weblate 4.1-dev\n"
"Generated-By: Babel 2.8.0\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@ -30,7 +29,8 @@ msgstr ""
msgid "Project name"
msgstr "Nom de projet"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "Code daccès"
msgid "Email"
@ -45,6 +45,11 @@ msgstr "Collecter les adresses IP dans l'historique de projet"
msgid "Default Currency"
msgstr "Devise par défaut"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "Importer un fichier JSON précédemment exporté"
@ -54,6 +59,9 @@ msgstr "Importer"
msgid "Project identifier"
msgstr "Identifiant du projet"
msgid "Private code"
msgstr "Code daccès"
msgid "Create the project"
msgstr "Créer le projet"
@ -330,6 +338,14 @@ msgstr "voir"
msgid "The Dashboard is currently deactivated."
msgstr "Le tableau de bord est actuellement désactivée."
#, fuzzy
msgid "Download Mobile Application"
msgstr "Application mobile"
#, fuzzy
msgid "Get it on"
msgstr "Entrer"
msgid "you sure?"
msgstr "cest sûr ?"
@ -624,8 +640,8 @@ msgid ""
"Don\\'t reuse a personal password. Choose a private code and send it to "
"your friends"
msgstr ""
"Ne réutilisez pas un de vos mots de passe. Choisissez un code personnel et "
"envoyez le à vos amis"
"Ne réutilisez pas un de vos mots de passe. Choisissez un code personnel "
"et envoyez le à vos amis"
msgid "Account manager"
msgstr "Gestion de comptes"
@ -639,12 +655,6 @@ msgstr "Remboursements"
msgid "Statistics"
msgstr "Statistiques"
msgid "History"
msgstr "Historique"
msgid "Settings"
msgstr "Options"
msgid "Languages"
msgstr "Langues"
@ -654,6 +664,12 @@ msgstr "Projets"
msgid "Start a new project"
msgstr "Nouveau projet"
msgid "History"
msgstr "Historique"
msgid "Settings"
msgstr "Options"
msgid "Other projects :"
msgstr "Autres projets :"
@ -1059,3 +1075,4 @@ msgstr "Période"
#~ " vos amis et stocké en clair "
#~ "sur le serveur. Nutilisez pas un "
#~ "mot de passe personnel !"

View file

@ -1,30 +1,32 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-06-12 06:46+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2020-06-14 14:41+0000\n"
"Last-Translator: raghupalash <singhpalash0@gmail.com>\n"
"Language-Team: Hindi <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/hi/>\n"
"Language: hi\n"
"Language-Team: Hindi <https://hosted.weblate.org/projects/i-hate-money/i"
"-hate-money/hi/>\n"
"Plural-Forms: nplurals=2; plural=n > 1\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.1-dev\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
"accepted."
msgstr ""
"वैध राशि या चिह्न नहीं। केवल संख्या और + - * / ऑपरेटरों को स्वीकार किया जाता "
"है।"
"वैध राशि या चिह्न नहीं। केवल संख्या और + - * / ऑपरेटरों को स्वीकार किया "
"जाता है।"
msgid "Project name"
msgstr "परियोजना का नाम"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "निजी कोड"
msgid "Email"
@ -39,6 +41,11 @@ msgstr "प्रोजेक्ट इतिहास के लिए IP ट
msgid "Default Currency"
msgstr "डिफ़ॉल्ट मुद्रा"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "पूर्व में निर्यात की गई JSON फ़ाइल आयात करें"
@ -48,6 +55,9 @@ msgstr "आयात"
msgid "Project identifier"
msgstr "परियोजना पहचानकर्ता"
msgid "Private code"
msgstr "निजी कोड"
msgid "Create the project"
msgstr "परियोजना बनाएं"
@ -56,8 +66,8 @@ msgid ""
"A project with this identifier (\"%(project)s\") already exists. Please "
"choose a new identifier"
msgstr ""
"इस पहचानकर्ता के साथ एक परियोजना (\"%(project)s\") पहले से मौजूद है। कृपया "
"एक नया पहचानकर्ता चुनें"
"इस पहचानकर्ता के साथ एक परियोजना (\"%(project)s\") पहले से मौजूद है। "
"कृपया एक नया पहचानकर्ता चुनें"
msgid "Get in"
msgstr "अंदर जाइये"
@ -169,7 +179,8 @@ msgstr "यह व्यवस्थापक पासवर्ड सही
msgid "You either provided a bad token or no project identifier."
msgstr ""
"आपने या तो एक खराब टोकन प्रदान किया है या कोई प्रोजेक्ट पहचानकर्ता नहीं है।"
"आपने या तो एक खराब टोकन प्रदान किया है या कोई प्रोजेक्ट पहचानकर्ता नहीं "
"है।"
msgid "This private code is not the right one"
msgstr "यह निजी कोड सही नहीं है"
@ -185,8 +196,8 @@ msgid ""
"We tried to send you an reminder email, but there was an error. You can "
"still use the project normally."
msgstr ""
"हमने आपको एक अनुस्मारक ईमेल भेजने की कोशिश की, लेकिन कोई त्रुटि थी। आप अभी भी"
" सामान्य रूप से प्रोजेक्ट का उपयोग कर सकते हैं।"
"हमने आपको एक अनुस्मारक ईमेल भेजने की कोशिश की, लेकिन कोई त्रुटि थी। आप "
"अभी भी सामान्य रूप से प्रोजेक्ट का उपयोग कर सकते हैं।"
#, python-format
msgid "The project identifier is %(project)s"
@ -197,9 +208,9 @@ msgid ""
"instructions. Please check the email configuration of the server or "
"contact the administrator."
msgstr ""
"क्षमा करें, पासवर्ड रीसेट निर्देशों के साथ आपको एक ईमेल भेजते समय कोई त्रुटि "
"हुई थी। कृपया सर्वर के ईमेल कॉन्फ़िगरेशन की जाँच करें या व्यवस्थापक से संपर्"
"क करें।"
"क्षमा करें, पासवर्ड रीसेट निर्देशों के साथ आपको एक ईमेल भेजते समय कोई "
"त्रुटि हुई थी। कृपया सर्वर के ईमेल कॉन्फ़िगरेशन की जाँच करें या "
"व्यवस्थापक से संपर्क करें।"
msgid "No token provided"
msgstr "कोई टोकन प्रदान नहीं किया गया"
@ -225,7 +236,8 @@ msgstr "प्रोजेक्ट सफलतापूर्वक हटा
#, python-format
msgid "You have been invited to share your expenses for %(project)s"
msgstr ""
"आपको %(project)s के लिए अपने खर्चों को साझा करने के लिए आमंत्रित किया गया है"
"आपको %(project)s के लिए अपने खर्चों को साझा करने के लिए आमंत्रित किया गया"
" है"
msgid "Your invitations have been sent"
msgstr "आपके निमंत्रण भेज दिए गए हैं"
@ -235,8 +247,8 @@ msgid ""
"Please check the email configuration of the server or contact the "
"administrator."
msgstr ""
"क्षमा करें, आमंत्रण ईमेल भेजने का प्रयास करते समय कोई त्रुटि हुई। कृपया सर्"
"वर के ईमेल कॉन्फ़िगरेशन की जाँच करें या व्यवस्थापक से संपर्क करें।"
"क्षमा करें, आमंत्रण ईमेल भेजने का प्रयास करते समय कोई त्रुटि हुई। कृपया "
"सर्वर के ईमेल कॉन्फ़िगरेशन की जाँच करें या व्यवस्थापक से संपर्क करें।"
#, python-format
msgid "%(member)s has been added"
@ -251,8 +263,8 @@ msgid ""
"User '%(name)s' has been deactivated. It will still appear in the users "
"list until its balance becomes zero."
msgstr ""
"उपयोगकर्ता '%(name)s' को निष्क्रिय कर दिया गया है। यह तब भी उपयोगकर्ताओं की "
"सूची में दिखाई देगा जब तक कि इसका संतुलन शून्य नहीं हो जाता।"
"उपयोगकर्ता '%(name)s' को निष्क्रिय कर दिया गया है। यह तब भी उपयोगकर्ताओं "
"की सूची में दिखाई देगा जब तक कि इसका संतुलन शून्य नहीं हो जाता।"
#, python-format
msgid "User '%(name)s' has been removed"
@ -285,8 +297,8 @@ msgstr "वर्तमान में प्रबंधन कार्य
msgid "The project you are trying to access do not exist, do you want to"
msgstr ""
"जिस प्रोजेक्ट पर आप पहुचने की कोशिश कर रहे हैं, वह मौजूद नहीं है, क्या आप यह "
"करना चाहते हैं"
"जिस प्रोजेक्ट पर आप पहुचने की कोशिश कर रहे हैं, वह मौजूद नहीं है, क्या आप"
" यह करना चाहते हैं"
msgid "create it"
msgstr "बनाइये"
@ -324,6 +336,14 @@ msgstr "प्रदर्शन"
msgid "The Dashboard is currently deactivated."
msgstr "डैशबोर्ड वर्तमान में निष्क्रिय है।"
#, fuzzy
msgid "Download Mobile Application"
msgstr "मोबाइल एप्लीकेशन"
#, fuzzy
msgid "Get it on"
msgstr "अंदर जाइये"
msgid "you sure?"
msgstr "आपको यकीन है?"
@ -429,9 +449,10 @@ msgid ""
" The rest of the project history will be unaffected. This "
"action cannot be undone."
msgstr ""
"क्या आप वाकई इस प्रोजेक्ट के सभी रिकॉर्ड किए गए IP पतों को हटाना चाहते हैं?\n"
" परियोजना का बाकी इतिहास अप्रभावित रहेगा। इस कार्य को पूर्"
"ववत नहीं किया जा सकता।"
"क्या आप वाकई इस प्रोजेक्ट के सभी रिकॉर्ड किए गए IP पतों को हटाना चाहते "
"हैं?\n"
" परियोजना का बाकी इतिहास अप्रभावित रहेगा। इस कार्य को "
"पूर्ववत नहीं किया जा सकता।"
msgid "Close"
msgstr "बंद करे"
@ -446,8 +467,8 @@ msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
"क्या आप वाकई इस परियोजना के लिए सभी इतिहास मिटाना चाहते हैं? इस कार्य को पूर्"
"ववत नहीं किया जा सकता।"
"क्या आप वाकई इस परियोजना के लिए सभी इतिहास मिटाना चाहते हैं? इस कार्य को "
"पूर्ववत नहीं किया जा सकता।"
msgid "Added"
msgstr "जोड़ा गया"
@ -470,8 +491,8 @@ msgid ""
" "
msgstr ""
"\n"
" <i>इस प्रोजेक्ट में इतिहास अक्षम है। नई कार्रवाइयां नीचे दिखाई "
"नहीं देंगी। आप इतिहास को यहाँ से सक्षम कर सकते हैं</i>\n"
" <i>इस प्रोजेक्ट में इतिहास अक्षम है। नई कार्रवाइयां नीचे "
"दिखाई नहीं देंगी। आप इतिहास को यहाँ से सक्षम कर सकते हैं</i>\n"
" <a href=\"%(url)s\">सेटिंग्स पृष्ठ</a>\n"
" "
@ -485,18 +506,19 @@ msgid ""
" "
msgstr ""
"\n"
" <i>नीचे दी गई तालिका परियोजना इतिहास को अक्षम करने से पहले दर्ज "
"की गई कार्रवाइयों को दर्शाती है। आप उन्हें हटाने के लिए\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" data-"
"target=\"#confirm-erase\">प्रोजेक्ट इतिहास हटा</a>सकते हैं।</i></p>\n"
" <i>नीचे दी गई तालिका परियोजना इतिहास को अक्षम करने से पहले "
"दर्ज की गई कार्रवाइयों को दर्शाती है। आप उन्हें हटाने के लिए\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">प्रोजेक्ट इतिहास हटा</a>सकते हैं।</i></p>"
"\n"
" "
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
"नीचे कुछ प्रविष्टियों में IP पते हैं, भले ही इस परियोजना में IP रिकॉर्डिंग "
"अक्षम है। "
"नीचे कुछ प्रविष्टियों में IP पते हैं, भले ही इस परियोजना में IP "
"रिकॉर्डिंग अक्षम है। "
msgid "Delete stored IP addresses"
msgstr "संग्रहीत IP पते हटाएं"
@ -611,8 +633,8 @@ msgid ""
"Don\\'t reuse a personal password. Choose a private code and send it to "
"your friends"
msgstr ""
"व्यक्तिगत पासवर्ड का पुन: उपयोग न करें। एक निजी कोड चुनें और इसे अपने दोस्तों"
" को भेजें"
"व्यक्तिगत पासवर्ड का पुन: उपयोग न करें। एक निजी कोड चुनें और इसे अपने "
"दोस्तों को भेजें"
msgid "Account manager"
msgstr "खाता प्रबंधक"
@ -626,12 +648,6 @@ msgstr "चुकता करें"
msgid "Statistics"
msgstr "आंकड़े"
msgid "History"
msgstr "इतिहास"
msgid "Settings"
msgstr "सेटिंग्स"
msgid "Languages"
msgstr "भाषाएं"
@ -641,6 +657,12 @@ msgstr "परियोजनाएं"
msgid "Start a new project"
msgstr "नई परियोजना शुरू करें"
msgid "History"
msgstr "इतिहास"
msgid "Settings"
msgstr "सेटिंग्स"
msgid "Other projects :"
msgstr "अन्य परियोजनाएँ :"
@ -757,7 +779,8 @@ msgid ""
"You can share the project identifier and the private code by any "
"communication means."
msgstr ""
"आप किसी भी संचार माध्यम से परियोजना पहचानकर्ता और निजी कोड साझा कर सकते हैं।"
"आप किसी भी संचार माध्यम से परियोजना पहचानकर्ता और निजी कोड साझा कर सकते "
"हैं।"
msgid "Identifier:"
msgstr "पहचानकर्ता:"
@ -777,10 +800,10 @@ msgid ""
" creation of this budget management project and we will "
"send them an email for you."
msgstr ""
"उन ईमेल पतों की एक (अल्पविराम से अलग की गयी) सूची निर्दिष्ट करें जिन्हे आप "
"इस \n"
"\t\t बजट प्रबंधन परियोजना के निर्माण के बारे में सूचित करना चाहते हैं और "
"हम उन्हें आपके लिए एक ईमेल भेजेंगे।"
"उन ईमेल पतों की एक (अल्पविराम से अलग की गयी) सूची निर्दिष्ट करें जिन्हे "
"आप इस \n"
"\t\t बजट प्रबंधन परियोजना के निर्माण के बारे में सूचित करना चाहते हैं "
"और हम उन्हें आपके लिए एक ईमेल भेजेंगे।"
msgid "Who pays?"
msgstr "किसे भुगतान करना है?"
@ -811,3 +834,4 @@ msgstr "मासिक खर्च"
msgid "Period"
msgstr "अवधि"

View file

@ -1,31 +1,32 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-30 21:50+0200\n"
"PO-Revision-Date: 2021-02-21 04:50+0000\n"
"Last-Translator: Reza Almanda <rezaalmanda27@gmail.com>\n"
"Language-Team: Indonesian <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/id/>\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2021-04-14 08:27+0000\n"
"Last-Translator: whenwesober <naomi16i_1298q@cikuh.com>\n"
"Language: id\n"
"Language-Team: Indonesian <https://hosted.weblate.org/projects/i-hate-"
"money/i-hate-money/id/>\n"
"Plural-Forms: nplurals=1; plural=0\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"
"X-Generator: Weblate 4.5\n"
"Generated-By: Babel 2.8.0\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
"accepted."
msgstr ""
"Bukan jumlah atau operator yang valid. Hanya angka dan operator + -* / yang "
"diterima."
"Bukan jumlah atau operator yang valid. Hanya angka dan operator + -* / "
"yang diterima."
msgid "Project name"
msgstr "Nama proyek"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "Kode pribadi"
msgid "Email"
@ -40,6 +41,11 @@ msgstr "Gunakan pelacakan IP untuk riwayat proyek"
msgid "Default Currency"
msgstr "Mata Uang Standar"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "Impor file JSON yang sudah diekspor sebelumnya"
@ -49,6 +55,9 @@ msgstr "Impor"
msgid "Project identifier"
msgstr "Pengidentifikasi proyek"
msgid "Private code"
msgstr "Kode pribadi"
msgid "Create the project"
msgstr "Buat proyek"
@ -185,8 +194,8 @@ msgid ""
"We tried to send you an reminder email, but there was an error. You can "
"still use the project normally."
msgstr ""
"Kami telah mengirimi Anda email pengingat, tetapi ada kesalahan. Anda masih "
"dapat menggunakan proyek secara normal."
"Kami telah mengirimi Anda email pengingat, tetapi ada kesalahan. Anda "
"masih dapat menggunakan proyek secara normal."
#, python-format
msgid "The project identifier is %(project)s"
@ -197,8 +206,9 @@ msgid ""
"instructions. Please check the email configuration of the server or "
"contact the administrator."
msgstr ""
"Maaf, ada galat saat mengirim email berisi instruksi pengaturan ulang kata "
"sandi. Silakan periksa konfigurasi email peladen atau hubungi administrator."
"Maaf, ada galat saat mengirim email berisi instruksi pengaturan ulang "
"kata sandi. Silakan periksa konfigurasi email peladen atau hubungi "
"administrator."
msgid "No token provided"
msgstr "Belum ada token diberikan"
@ -320,6 +330,14 @@ msgstr "tampilkan"
msgid "The Dashboard is currently deactivated."
msgstr "Dasbor sekarang ini sedang dinonaktifkan."
#, fuzzy
msgid "Download Mobile Application"
msgstr "Aplikasi Gawai"
#, fuzzy
msgid "Get it on"
msgstr "Masuk"
msgid "you sure?"
msgstr "Anda yakin?"
@ -399,10 +417,10 @@ msgid "Disabled IP Address Recording"
msgstr "Perekaman Alamat IP Dinonaktifkan"
msgid "Enabled Project History & IP Address Recording"
msgstr ""
msgstr "Aktifkan Riwayat Proyek & Rekaman Alamat IP"
msgid "Enabled IP Address Recording"
msgstr ""
msgstr "Aktifkan Rekaman Alamat IP"
msgid "History Settings Changed"
msgstr "Setelan Riwayat Diubah"
@ -467,8 +485,8 @@ msgid ""
msgstr ""
"\n"
" <i> Proyek ini memiliki riwayat yang dinonaktifkan. Tindakan "
"baru tidak akan muncul di bawah ini. Anda dapat mengaktifkan riwayat pada</i>"
"\n"
"baru tidak akan muncul di bawah ini. Anda dapat mengaktifkan riwayat "
"pada</i>\n"
" <a href=\"%(url)s\">halaman pengaturan</a>\n"
" "
@ -481,90 +499,99 @@ msgid ""
"them.</i></p>\n"
" "
msgstr ""
"\n"
" <i> Tabel di bawah mencerminkan tindakan yang direkam sebelum"
" menonaktifkan riwayat proyek. Anda bisa\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\"> membersihkan riwayat proyek </a> untuk "
"menghapusnya. </i> </ p >\n"
" "
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
"Beberapa entri dibawah mengandung alamat IP, walaupun proyek ini "
"menonaktifkan rekaman alamat IP. "
msgid "Delete stored IP addresses"
msgstr ""
msgstr "Hapus alamat IP yang disimpan"
msgid "No history to erase"
msgstr ""
msgstr "Tidak ada riwayat untuk dihapus"
msgid "Clear Project History"
msgstr ""
msgstr "Bersihkan Riwayat Proyek"
msgid "No IP Addresses to erase"
msgstr ""
msgstr "Tidak ada Alamat IP untuk dihapus"
msgid "Delete Stored IP Addresses"
msgstr ""
msgstr "Hapus alamat IP yang disimpan"
msgid "Time"
msgstr ""
msgstr "Waktu"
msgid "Event"
msgstr ""
msgstr "Peristiwa"
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgstr "Perekaman alamat IP dapat diaktifkan di halaman pengaturan"
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgstr "Perekaman alamat IP dapat dinonaktifkan di halaman pengaturan"
msgid "From IP"
msgstr ""
msgstr "Dari IP"
msgid "added"
msgstr ""
msgstr "ditambahkan"
msgid "Project private code changed"
msgstr ""
msgstr "Kode pribadi proyek berubah"
msgid "Project renamed to"
msgstr ""
msgstr "Proyek berganti nama menjadi"
msgid "Project contact email changed to"
msgstr ""
msgstr "Email kontak proyek diubah menjadi"
msgid "Project settings modified"
msgstr ""
msgstr "Pengaturan proyek diubah"
msgid "deactivated"
msgstr ""
msgstr "dinonaktifkan"
msgid "reactivated"
msgstr ""
msgstr "aktivasi ulang"
msgid "renamed to"
msgstr ""
msgstr "berganti nama menjadi"
msgid "External link changed to"
msgstr ""
msgstr "Tautan eksternal diubah menjadi"
msgid "Amount"
msgstr ""
msgstr "Jumlah"
#, python-format
msgid "Amount in %(currency)s"
msgstr ""
msgstr "Jumlah dalam %(currency)s"
msgid "modified"
msgstr ""
msgstr "diubah"
msgid "removed"
msgstr ""
msgstr "dihapus"
msgid "changed in a unknown way"
msgstr ""
msgstr "berubah dengan cara yang tidak diketahui"
msgid "Nothing to list"
msgstr ""
msgstr "Tidak ada yang dicantumkan"
msgid "Someone probably cleared the project history."
msgstr ""
msgstr "Seseorang mungkin membersihkan riwayat proyek."
msgid "Manage your shared <br />expenses, easily"
msgstr "Atur pembagian harga <br />Anda, dengan mudah"
@ -600,6 +627,8 @@ msgid ""
"Don\\'t reuse a personal password. Choose a private code and send it to "
"your friends"
msgstr ""
"Jangan gunakan kembali kata sandi pribadi. Pilih kode pribadi dan "
"kirimkan ke teman Anda"
msgid "Account manager"
msgstr "Pengatur akun"
@ -613,12 +642,6 @@ msgstr "Atur"
msgid "Statistics"
msgstr "Statistik"
msgid "History"
msgstr ""
msgid "Settings"
msgstr "Pengaturan"
msgid "Languages"
msgstr "Bahasa"
@ -628,6 +651,12 @@ msgstr "Proyek"
msgid "Start a new project"
msgstr "Mulai proyek baru"
msgid "History"
msgstr "Riwayat"
msgid "Settings"
msgstr "Pengaturan"
msgid "Other projects :"
msgstr "Proyek lainnya:"
@ -660,7 +689,7 @@ msgstr "kamu bisa berkontribusi dan meningkatkannya!"
#, python-format
msgid "%(amount)s each"
msgstr ""
msgstr "%(amount)s masing-masing"
msgid "Invite people"
msgstr "Undang orang"
@ -672,10 +701,10 @@ msgid "Add a new bill"
msgstr "Tambah tagihan baru"
msgid "Newer bills"
msgstr ""
msgstr "Tagihan terbaru"
msgid "Older bills"
msgstr ""
msgstr "Tagihan terdahulu"
msgid "When?"
msgstr "Kapan?"
@ -797,10 +826,10 @@ msgid "Spent"
msgstr "Dihabiskan"
msgid "Expenses by Month"
msgstr ""
msgstr "Pengeluaran menurut Bulan"
msgid "Period"
msgstr ""
msgstr "Periode"
#~ msgid "%(member)s had been added"
#~ msgstr "%(member)s telah ditambahkan"
@ -830,3 +859,4 @@ msgstr ""
#~ "teman Anda. Kode ini disimpan dalam "
#~ "bentuk teks biasa dalam server, jadi "
#~ "jangan gunakan password Anda!"

View file

@ -1,30 +1,32 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-30 21:50+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2021-03-17 15:18+0000\n"
"Last-Translator: TomSolGit <Tommaso.solfa@gmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/it/>\n"
"Language: it\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/i-hate-"
"money/i-hate-money/it/>\n"
"Plural-Forms: nplurals=2; plural=n != 1\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: Weblate 4.5.2-dev\n"
"Generated-By: Babel 2.8.0\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
"accepted."
msgstr ""
"Quantità o espressione non valida. Solo numeri e operatori + - * / accettati."
"Quantità o espressione non valida. Solo numeri e operatori + - * / "
"accettati."
msgid "Project name"
msgstr "Nome del progetto"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "Codice privato"
msgid "Email"
@ -39,6 +41,11 @@ msgstr "Utilizzare la localizzazione IP per lo storico del progetto"
msgid "Default Currency"
msgstr "Valuta predefinita"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "Importare il file JSON esportato precedentemente"
@ -48,6 +55,9 @@ msgstr "Importare"
msgid "Project identifier"
msgstr "Identificatore del progetto"
msgid "Private code"
msgstr "Codice privato"
msgid "Create the project"
msgstr "Crea il progetto"
@ -325,6 +335,14 @@ msgstr "visualizza"
msgid "The Dashboard is currently deactivated."
msgstr "Il Cruscotto è attualmente disabilitato."
#, fuzzy
msgid "Download Mobile Application"
msgstr "Applicazione mobile"
#, fuzzy
msgid "Get it on"
msgstr "Entra"
msgid "you sure?"
msgstr "sei sicuro?"
@ -621,8 +639,8 @@ msgid ""
"Don\\'t reuse a personal password. Choose a private code and send it to "
"your friends"
msgstr ""
"Non riutilizzare una password personale. Scegli un codice privato e invialo "
"ai tuoi amici"
"Non riutilizzare una password personale. Scegli un codice privato e "
"invialo ai tuoi amici"
msgid "Account manager"
msgstr "Gestione account"
@ -636,12 +654,6 @@ msgstr "Liquidazioni"
msgid "Statistics"
msgstr "Statistiche"
msgid "History"
msgstr "Cronologia"
msgid "Settings"
msgstr "Impostazioni"
msgid "Languages"
msgstr "Lingue"
@ -651,6 +663,12 @@ msgstr "Progetti"
msgid "Start a new project"
msgstr "Avvia un nuovo progetto"
msgid "History"
msgstr "Cronologia"
msgid "Settings"
msgstr "Impostazioni"
msgid "Other projects :"
msgstr "Altri progetti:"
@ -844,3 +862,4 @@ msgstr "Periodo"
#~ " ai tuoi amici. È conservato in "
#~ "chiaro sul server, quindi non "
#~ "riutilizzarlo come password personale!"

View file

@ -1,18 +1,19 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-22 06:40+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2020-11-11 16:28+0000\n"
"Last-Translator: Jwen921 <yangjingwen0921@gmail.com>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/ja/>\n"
"Language: ja\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/i-hate-"
"money/i-hate-money/ja/>\n"
"Plural-Forms: nplurals=1; plural=0\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.4-dev\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@ -22,7 +23,8 @@ msgstr "無効な入力です。数字と「+ - * / 」の演算子しか入力
msgid "Project name"
msgstr "プロジェクトの名前"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "暗証コード"
msgid "Email"
@ -37,6 +39,11 @@ msgstr "IPでプロジェクトの歴史を追跡する"
msgid "Default Currency"
msgstr "初期設定にする通貨"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "以前のJSONファイルをインポートする"
@ -46,6 +53,9 @@ msgstr "インポート"
msgid "Project identifier"
msgstr "プロジェクトの名前"
msgid "Private code"
msgstr "暗証コード"
msgid "Create the project"
msgstr "プロジェクトを新規作成する"
@ -189,8 +199,7 @@ msgid ""
"Sorry, there was an error while sending you an email with password reset "
"instructions. Please check the email configuration of the server or "
"contact the administrator."
msgstr ""
"申し訳ございませんが、パスワード再設定の説明メールを送った時、エラーが発生しました。メールアドレスを一度確認してまたは管理者に連絡してください。"
msgstr "申し訳ございませんが、パスワード再設定の説明メールを送った時、エラーが発生しました。メールアドレスを一度確認してまたは管理者に連絡してください。"
msgid "No token provided"
msgstr "印が入力されていない"
@ -308,6 +317,14 @@ msgstr "表示"
msgid "The Dashboard is currently deactivated."
msgstr "現在ダッシュボードは操作できません。"
#, fuzzy
msgid "Download Mobile Application"
msgstr "携帯アプリ"
#, fuzzy
msgid "Get it on"
msgstr "入る"
msgid "you sure?"
msgstr "確認?"
@ -601,12 +618,6 @@ msgstr "解決"
msgid "Statistics"
msgstr "統計"
msgid "History"
msgstr "歴史"
msgid "Settings"
msgstr "設定"
msgid "Languages"
msgstr "言語"
@ -616,6 +627,12 @@ msgstr "プロジェクト"
msgid "Start a new project"
msgstr "新しいプロジェクトを始める"
msgid "History"
msgstr "歴史"
msgid "Settings"
msgstr "設定"
msgid "Other projects :"
msgstr "他のプロジェクト:"
@ -781,3 +798,4 @@ msgstr "月別の費用"
msgid "Period"
msgstr "期間"

View file

@ -1,19 +1,19 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-30 21:50+0200\n"
"PO-Revision-Date: 2020-06-18 10:41+0000\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2021-05-09 04:33+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/"
"i-hate-money/i-hate-money/nb_NO/>\n"
"Language: nb_NO\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/i"
"-hate-money/i-hate-money/nb_NO/>\n"
"Plural-Forms: nplurals=2; plural=n != 1\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: Weblate 4.1.1-dev\n"
"Generated-By: Babel 2.8.0\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@ -25,7 +25,8 @@ msgstr ""
msgid "Project name"
msgstr "Prosjektnavn"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "Privat kode"
msgid "Email"
@ -40,6 +41,11 @@ msgstr "Bruk IP-sporing for prosjekthistorikk"
msgid "Default Currency"
msgstr "Forvalgt valuta"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "Importer tidligere eksportert JSON-fil"
@ -49,6 +55,9 @@ msgstr "Importer"
msgid "Project identifier"
msgstr "Prosjektidentifikator"
msgid "Private code"
msgstr "Privat kode"
msgid "Create the project"
msgstr "Opprett prosjektet"
@ -240,7 +249,7 @@ msgstr ""
#, python-format
msgid "%(member)s has been added"
msgstr ""
msgstr "%(member)s har blitt lagt til"
#, python-format
msgid "%(name)s is part of this project again"
@ -319,11 +328,19 @@ msgid "delete"
msgstr "slett"
msgid "show"
msgstr ""
msgstr "vis"
msgid "The Dashboard is currently deactivated."
msgstr "Oversikten er for tiden avskrudd."
#, fuzzy
msgid "Download Mobile Application"
msgstr "Mobilprogram"
#, fuzzy
msgid "Get it on"
msgstr "Til prosjektet"
msgid "you sure?"
msgstr "er du sikker?"
@ -452,10 +469,10 @@ msgid "Added"
msgstr ""
msgid "Removed"
msgstr ""
msgstr "Fjernet"
msgid "and"
msgstr ""
msgstr "og"
msgid "owers list"
msgstr "eierliste"
@ -611,12 +628,6 @@ msgstr "Gjør opp"
msgid "Statistics"
msgstr "Statistikk"
msgid "History"
msgstr "Historikk"
msgid "Settings"
msgstr "Innstillinger"
msgid "Languages"
msgstr "Språk"
@ -626,6 +637,12 @@ msgstr "Prosjekter"
msgid "Start a new project"
msgstr "Start et nytt prosjekt"
msgid "History"
msgstr "Historikk"
msgid "Settings"
msgstr "Innstillinger"
#, fuzzy
msgid "Other projects :"
msgstr "Andre prosjekter:"
@ -673,10 +690,10 @@ msgid "Add a new bill"
msgstr "Legg til en ny regning"
msgid "Newer bills"
msgstr ""
msgstr "Nyere regninger"
msgid "Older bills"
msgstr ""
msgstr "Eldre regninger"
msgid "When?"
msgstr "Når?"
@ -942,3 +959,4 @@ msgstr ""
#~ " venne dine. Den lagres som den "
#~ "er på tjeneren, så ikke gjenbruk "
#~ "et personlig passord."

View file

@ -1,19 +1,19 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2020-05-30 21:50+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2021-02-17 02:50+0000\n"
"Last-Translator: Sander Kooijmans <weblate@gogognome.nl>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/nl/>\n"
"Language: nl\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/i-hate-money/i"
"-hate-money/nl/>\n"
"Plural-Forms: nplurals=2; plural=n != 1\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: Weblate 4.5\n"
"Generated-By: Babel 2.8.0\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@ -25,7 +25,8 @@ msgstr ""
msgid "Project name"
msgstr "Projectnaam"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "Privécode"
msgid "Email"
@ -40,6 +41,11 @@ msgstr "IP-tracking voor projectgeschiedenis gebruiken"
msgid "Default Currency"
msgstr "Standaard munteenheid"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "Eerder geëxporteerd JSON-bestand importeren"
@ -49,6 +55,9 @@ msgstr "Importeren"
msgid "Project identifier"
msgstr "Project-id"
msgid "Private code"
msgstr "Privécode"
msgid "Create the project"
msgstr "Project aanmaken"
@ -185,8 +194,8 @@ msgid ""
"We tried to send you an reminder email, but there was an error. You can "
"still use the project normally."
msgstr ""
"We hebben geprobeerd een herinneringsmail te versturen, maar er is iets fout "
"gegaan. Je kunt het project nog steeds normaal gebruiken."
"We hebben geprobeerd een herinneringsmail te versturen, maar er is iets "
"fout gegaan. Je kunt het project nog steeds normaal gebruiken."
#, python-format
msgid "The project identifier is %(project)s"
@ -198,8 +207,8 @@ msgid ""
"contact the administrator."
msgstr ""
"Sorry, er is iets fout gegaan bij het verzenden van een e-mail met "
"instructies om je wachtwoord te herstellen. Controleer de e-mailinstellingen "
"van de server of neem contact op met de beheerder."
"instructies om je wachtwoord te herstellen. Controleer de "
"e-mailinstellingen van de server of neem contact op met de beheerder."
msgid "No token provided"
msgstr "Geen toegangssleutel opgegeven"
@ -322,6 +331,14 @@ msgstr "tonen"
msgid "The Dashboard is currently deactivated."
msgstr "De overzichtspagina is momenteel uitgeschakeld."
#, fuzzy
msgid "Download Mobile Application"
msgstr "Mobiele app"
#, fuzzy
msgid "Get it on"
msgstr "Inloggen"
msgid "you sure?"
msgstr "weet je het zeker?"
@ -429,10 +446,10 @@ msgid ""
" The rest of the project history will be unaffected. This "
"action cannot be undone."
msgstr ""
"Weet je zeker dat je alle vastgelegde IP-adressen wilt verwijderen van dit "
"project?\n"
"De rest van de projectgeschiedenis blijft onveranderd. Deze actie kan niet "
"ongedaan worden gemaakt."
"Weet je zeker dat je alle vastgelegde IP-adressen wilt verwijderen van "
"dit project?\n"
"De rest van de projectgeschiedenis blijft onveranderd. Deze actie kan "
"niet ongedaan worden gemaakt."
msgid "Close"
msgstr "Sluiten"
@ -472,8 +489,8 @@ msgid ""
msgstr ""
"\n"
" <i>Dit project heeft de geschiedenis uitgeschakeld. Nieuwe "
"acties zullen niet hieronder verschijnen. Je kunt de geschiedenis aanzetten "
"op de </i>\n"
"acties zullen niet hieronder verschijnen. Je kunt de geschiedenis "
"aanzetten op de </i>\n"
" <a href=\"%(url)s\">instellingen-pagina</a>\n"
" "
@ -605,8 +622,8 @@ msgid ""
"Don\\'t reuse a personal password. Choose a private code and send it to "
"your friends"
msgstr ""
"Hergebruik geen persoonlijk wachtwoord. Kies een privécode en stuur het naar "
"je vrienden"
"Hergebruik geen persoonlijk wachtwoord. Kies een privécode en stuur het "
"naar je vrienden"
msgid "Account manager"
msgstr "Accountbeheer"
@ -620,12 +637,6 @@ msgstr "Schikken"
msgid "Statistics"
msgstr "Statistieken"
msgid "History"
msgstr "Geschiedenis"
msgid "Settings"
msgstr "Instellingen"
msgid "Languages"
msgstr "Talen"
@ -635,6 +646,12 @@ msgstr "Projecten"
msgid "Start a new project"
msgstr "Nieuw project starten"
msgid "History"
msgstr "Geschiedenis"
msgid "Settings"
msgstr "Instellingen"
msgid "Other projects :"
msgstr "Overige projecten:"
@ -826,3 +843,4 @@ msgstr "Periode"
#~ " vrienden. Deze wordt in platte tekst"
#~ " opgeslagen op de server, dus gebruik"
#~ " geen persoonlijk wachtwoord!"

View file

@ -1,20 +1,20 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-30 21:50+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2020-06-03 15:41+0000\n"
"Last-Translator: Szylu <chipolade@gmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/pl/>\n"
"Language: pl\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/i-hate-money/i"
"-hate-money/pl/>\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && "
"(n%100<10 || n%100>=20) ? 1 : 2\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"
"X-Generator: Weblate 4.1-dev\n"
"Generated-By: Babel 2.8.0\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@ -26,7 +26,8 @@ msgstr ""
msgid "Project name"
msgstr "Nazwa projektu"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "Kod prywatny"
msgid "Email"
@ -41,6 +42,11 @@ msgstr "Użyj śledzenia IP do historii projektu"
msgid "Default Currency"
msgstr "Domyślna waluta"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "Zaimportuj wcześniej wyeksportowany plik JSON"
@ -50,6 +56,9 @@ msgstr "Importuj"
msgid "Project identifier"
msgstr "Identyfikator projektu"
msgid "Private code"
msgstr "Kod prywatny"
msgid "Create the project"
msgstr "Stwórz projekt"
@ -186,8 +195,8 @@ msgid ""
"We tried to send you an reminder email, but there was an error. You can "
"still use the project normally."
msgstr ""
"Próbowaliśmy wysłać Ci wiadomość e-mail z przypomnieniem, ale wystąpił błąd. "
"Nadal możesz normalnie korzystać z projektu."
"Próbowaliśmy wysłać Ci wiadomość e-mail z przypomnieniem, ale wystąpił "
"błąd. Nadal możesz normalnie korzystać z projektu."
#, python-format
msgid "The project identifier is %(project)s"
@ -325,6 +334,14 @@ msgstr "pokaż"
msgid "The Dashboard is currently deactivated."
msgstr "Pulpit nawigacyjny jest obecnie dezaktywowany."
#, fuzzy
msgid "Download Mobile Application"
msgstr "Aplikacja mobilna"
#, fuzzy
msgid "Get it on"
msgstr "Wejdź"
msgid "you sure?"
msgstr "jesteś pewny?"
@ -629,12 +646,6 @@ msgstr "Rozliczenia"
msgid "Statistics"
msgstr "Statystyki"
msgid "History"
msgstr "Historia"
msgid "Settings"
msgstr "Ustawienia"
msgid "Languages"
msgstr "Języki"
@ -644,6 +655,12 @@ msgstr "Projekty"
msgid "Start a new project"
msgstr "Rozpocznij nowy projekt"
msgid "History"
msgstr "Historia"
msgid "Settings"
msgstr "Ustawienia"
msgid "Other projects :"
msgstr "Inne projekty:"
@ -837,3 +854,4 @@ msgstr "Okres"
#~ "znajomych. Jest przechowywany w stanie "
#~ "niezmienionym przez serwer, więc nie "
#~ "używaj ponownie osobistego hasła!"

View file

@ -1,18 +1,19 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-08-23 21:43+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2020-10-05 12:12+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/pt/>\n"
"Language: pt\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/i-hate-"
"money/i-hate-money/pt/>\n"
"Plural-Forms: nplurals=2; plural=n > 1\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.3-dev\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@ -24,7 +25,8 @@ msgstr ""
msgid "Project name"
msgstr "Nome do projeto"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "Código privado"
msgid "Email"
@ -39,6 +41,11 @@ msgstr "Usar rastreamento de IP para o histórico do projeto"
msgid "Default Currency"
msgstr "Moeda predefinida"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "Importar ficheiro JSON exportado anteriormente"
@ -48,6 +55,9 @@ msgstr "Importar"
msgid "Project identifier"
msgstr "Identificador do projeto"
msgid "Private code"
msgstr "Código privado"
msgid "Create the project"
msgstr "Criar o projeto"
@ -161,8 +171,7 @@ msgid "No Currency"
msgstr "Sem Moeda"
msgid "Too many failed login attempts, please retry later."
msgstr ""
"Muitas tentativas de login falhas, por favor, tente novamente mais tarde."
msgstr "Muitas tentativas de login falhas, por favor, tente novamente mais tarde."
#, python-format
msgid "This admin password is not the right one. Only %(num)d attempts left."
@ -200,8 +209,8 @@ msgid ""
"contact the administrator."
msgstr ""
"Desculpe, houve um erro ao te enviar um email com as instruções de "
"redefinição de palavra-passe. Por favor, confira a configuração de e-mail do "
"servidor ou entre em contato com um administrador."
"redefinição de palavra-passe. Por favor, confira a configuração de e-mail"
" do servidor ou entre em contato com um administrador."
msgid "No token provided"
msgstr "Nenhum token fornecido"
@ -236,8 +245,9 @@ msgid ""
"Please check the email configuration of the server or contact the "
"administrator."
msgstr ""
"Desculpe, houve um erro ao enviar os convites via e-mail. Por favor, confira "
"a configuração de email do servidor ou entre em contato com um administrador."
"Desculpe, houve um erro ao enviar os convites via e-mail. Por favor, "
"confira a configuração de email do servidor ou entre em contato com um "
"administrador."
#, python-format
msgid "%(member)s has been added"
@ -252,8 +262,8 @@ msgid ""
"User '%(name)s' has been deactivated. It will still appear in the users "
"list until its balance becomes zero."
msgstr ""
"Utilizador '%(name)s' foi desativado. Ele continuará aparecendo na lista de "
"utilizadores até que o seu balanço seja zero."
"Utilizador '%(name)s' foi desativado. Ele continuará aparecendo na lista "
"de utilizadores até que o seu balanço seja zero."
#, python-format
msgid "User '%(name)s' has been removed"
@ -276,8 +286,7 @@ msgid "Sorry, we were unable to find the page you've asked for."
msgstr "Desculpe, não foi possível encontrar a página que solicitou."
msgid "The best thing to do is probably to get back to the main page."
msgstr ""
"É provável que a melhor coisa a fazer seja voltar para a página inicial."
msgstr "É provável que a melhor coisa a fazer seja voltar para a página inicial."
msgid "Back to the list"
msgstr "Voltar para a lista"
@ -324,6 +333,14 @@ msgstr "exibir"
msgid "The Dashboard is currently deactivated."
msgstr "O Painel de Controle atualmente está desativado."
#, fuzzy
msgid "Download Mobile Application"
msgstr "Aplicação Mobile"
#, fuzzy
msgid "Get it on"
msgstr "Entrar"
msgid "you sure?"
msgstr "tem certeza?"
@ -350,7 +367,8 @@ msgstr "Estabelecer planos"
msgid "Download the list of transactions needed to settle the current bills."
msgstr ""
"Descarregar a lista de transações necessárias para liquidar as contas atuais."
"Descarregar a lista de transações necessárias para liquidar as contas "
"atuais."
msgid "Can't remember the password?"
msgstr "Esqueceu a palavra-passe?"
@ -430,9 +448,10 @@ msgid ""
" The rest of the project history will be unaffected. This "
"action cannot be undone."
msgstr ""
"Tem certeza que deseja apagar todos os endereços IP gravados deste projeto?\n"
" O resto do histórico do projeto não será afetado. Esta ação "
"não pode ser desfeita."
"Tem certeza que deseja apagar todos os endereços IP gravados deste "
"projeto?\n"
" O resto do histórico do projeto não será afetado. Esta "
"ação não pode ser desfeita."
msgid "Close"
msgstr "Fechar"
@ -447,8 +466,8 @@ msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
"Tem certeza que deseja apagar todo o histórico deste projeto? Esta ação não "
"pode ser desfeita."
"Tem certeza que deseja apagar todo o histórico deste projeto? Esta ação "
"não pode ser desfeita."
msgid "Added"
msgstr "Adicionado"
@ -488,8 +507,8 @@ msgstr ""
"\n"
" <i>A tabela abaixo reflete as ações registadas antes da "
"desativação do histórico do projeto. Pode\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" data-"
"target=\"#confirm-erase\">limpar o histórico do projeto</a> para "
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">limpar o histórico do projeto</a> para "
"removê-las.</i></p>\n"
" "
@ -497,8 +516,8 @@ msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
"Algumas das entradas abaixo contém endereços IP, mesmo este projeto tendo a "
"gravação de IP desativada. "
"Algumas das entradas abaixo contém endereços IP, mesmo este projeto tendo"
" a gravação de IP desativada. "
msgid "Delete stored IP addresses"
msgstr "Deletar endereços IP gravados"
@ -525,8 +544,7 @@ msgid "IP address recording can be enabled on the settings page"
msgstr "A gravação do endereço IP pode ser ativada na página de configurações"
msgid "IP address recording can be disabled on the settings page"
msgstr ""
"A gravação do endereço IP pode ser desativada na página de configurações"
msgstr "A gravação do endereço IP pode ser desativada na página de configurações"
msgid "From IP"
msgstr "Do IP"
@ -614,8 +632,8 @@ msgid ""
"Don\\'t reuse a personal password. Choose a private code and send it to "
"your friends"
msgstr ""
"Não reutilize uma palavra-passe pessoal. Escolha um código privado e envie-o "
"para seus amigos"
"Não reutilize uma palavra-passe pessoal. Escolha um código privado e "
"envie-o para seus amigos"
msgid "Account manager"
msgstr "Gestor de contas"
@ -629,12 +647,6 @@ msgstr "Estabelecer"
msgid "Statistics"
msgstr "Estatísticas"
msgid "History"
msgstr "Histórico"
msgid "Settings"
msgstr "Configurações"
msgid "Languages"
msgstr "Linguagens"
@ -644,6 +656,12 @@ msgstr "Projetos"
msgid "Start a new project"
msgstr "Começar um novo projeto"
msgid "History"
msgstr "Histórico"
msgid "Settings"
msgstr "Configurações"
msgid "Other projects :"
msgstr "Outros projetos:"
@ -738,8 +756,8 @@ msgid ""
"A link to reset your password has been sent to you, please check your "
"emails."
msgstr ""
"Uma ligação para redefinir a sua palavra-passe foi enviado a si, por favor "
"verifique os seus e-mails."
"Uma ligação para redefinir a sua palavra-passe foi enviado a si, por "
"favor verifique os seus e-mails."
msgid "Return to home page"
msgstr "Retornar à pagina inicial"
@ -760,8 +778,8 @@ msgid ""
"You can share the project identifier and the private code by any "
"communication means."
msgstr ""
"Pode compartilhar o identificador do projeto e o código privado por qualquer "
"meio de comunicação."
"Pode compartilhar o identificador do projeto e o código privado por "
"qualquer meio de comunicação."
msgid "Identifier:"
msgstr "Identificador:"
@ -785,8 +803,8 @@ msgid ""
msgstr ""
"Especifique uma lista (separada por vírgulas) de endereços de e-mail que "
"deseja notificar sobre a\n"
" criação deste projeto de gestão orçamental e enviaremos um e-"
"mail para si."
" criação deste projeto de gestão orçamental e enviaremos "
"um e-mail para si."
msgid "Who pays?"
msgstr "Quem paga?"
@ -817,3 +835,4 @@ msgstr "Despesas por mês"
msgid "Period"
msgstr "Período"

View file

@ -1,18 +1,19 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-06-27 02:02+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2020-08-27 19:22+0000\n"
"Last-Translator: André Oliveira <andre_pinto_oliveira@outlook.pt>\n"
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
"i-hate-money/i-hate-money/pt_BR/>\n"
"Language: pt_BR\n"
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/i"
"-hate-money/i-hate-money/pt_BR/>\n"
"Plural-Forms: nplurals=2; plural=n > 1\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.2.1-dev\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@ -24,7 +25,8 @@ msgstr ""
msgid "Project name"
msgstr "Nome do projeto"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "Código privado"
msgid "Email"
@ -39,6 +41,11 @@ msgstr "Usar rastreamento de IP para o histórico do projeto"
msgid "Default Currency"
msgstr "Moeda Padrão"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "Importar arquivo JSON exportado anteriormente"
@ -48,6 +55,9 @@ msgstr "Importar"
msgid "Project identifier"
msgstr "Identificador do projeto"
msgid "Private code"
msgstr "Código privado"
msgid "Create the project"
msgstr "Criar o projeto"
@ -161,8 +171,7 @@ msgid "No Currency"
msgstr "Sem Moeda"
msgid "Too many failed login attempts, please retry later."
msgstr ""
"Muitas tentativas de login falhas, por favor, tente novamente mais tarde."
msgstr "Muitas tentativas de login falhas, por favor, tente novamente mais tarde."
#, python-format
msgid "This admin password is not the right one. Only %(num)d attempts left."
@ -236,8 +245,9 @@ msgid ""
"Please check the email configuration of the server or contact the "
"administrator."
msgstr ""
"Desculpe, houve um erro ao enviar os convites via e-mail. Por favor, confira "
"a configuração de email do servidor ou entre em contato com um administrador."
"Desculpe, houve um erro ao enviar os convites via e-mail. Por favor, "
"confira a configuração de email do servidor ou entre em contato com um "
"administrador."
#, python-format
msgid "%(member)s has been added"
@ -276,8 +286,7 @@ msgid "Sorry, we were unable to find the page you've asked for."
msgstr "Desculpe, não foi possível encontrar a página que você solicitou."
msgid "The best thing to do is probably to get back to the main page."
msgstr ""
"É provável que a melhor coisa a fazer seja voltar para a página inicial."
msgstr "É provável que a melhor coisa a fazer seja voltar para a página inicial."
msgid "Back to the list"
msgstr "Voltar para a lista"
@ -324,6 +333,14 @@ msgstr "exibir"
msgid "The Dashboard is currently deactivated."
msgstr "O Painel de Controle atualmente está desativado."
#, fuzzy
msgid "Download Mobile Application"
msgstr "Aplicação Mobile"
#, fuzzy
msgid "Get it on"
msgstr "Entrar"
msgid "you sure?"
msgstr "tem certeza?"
@ -349,8 +366,7 @@ msgid "Settle plans"
msgstr "Estabelecer planos"
msgid "Download the list of transactions needed to settle the current bills."
msgstr ""
"Baixar a lista de transações necessárias para liquidar as contas atuais."
msgstr "Baixar a lista de transações necessárias para liquidar as contas atuais."
msgid "Can't remember the password?"
msgstr "Esqueceu a senha?"
@ -432,8 +448,8 @@ msgid ""
msgstr ""
"Você tem certeza que deseja deletar todos os endereços IP gravados deste "
"projeto?\n"
" O resto do histórico do projeto não será afetado. Esta ação "
"não pode ser desfeita."
" O resto do histórico do projeto não será afetado. Esta "
"ação não pode ser desfeita."
msgid "Close"
msgstr "Fechar"
@ -448,8 +464,8 @@ msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
"Tem certeza que deseja apagar todo o histórico deste projeto? Esta ação não "
"pode ser desfeita."
"Tem certeza que deseja apagar todo o histórico deste projeto? Esta ação "
"não pode ser desfeita."
msgid "Added"
msgstr "Adicionado"
@ -489,8 +505,8 @@ msgstr ""
"\n"
" <i>A tabela abaixo reflete as ações registradas antes da "
"desativação do histórico do projeto. Você pode\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" data-"
"target=\"#confirm-erase\">limpar o histórico do projeto</a> para "
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">limpar o histórico do projeto</a> para "
"removê-las.</i></p>\n"
" "
@ -498,8 +514,8 @@ msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
"Algumas das entradas abaixo contém endereços IP, mesmo este projeto tendo a "
"gravação de IP desativada. "
"Algumas das entradas abaixo contém endereços IP, mesmo este projeto tendo"
" a gravação de IP desativada. "
msgid "Delete stored IP addresses"
msgstr "Deletar endereços IP salvos"
@ -526,8 +542,7 @@ msgid "IP address recording can be enabled on the settings page"
msgstr "A gravação do endereço IP pode ser ativada na página de configurações"
msgid "IP address recording can be disabled on the settings page"
msgstr ""
"A gravação do endereço IP pode ser desativada na página de configurações"
msgstr "A gravação do endereço IP pode ser desativada na página de configurações"
msgid "From IP"
msgstr "Do IP"
@ -630,12 +645,6 @@ msgstr "Estabelecer"
msgid "Statistics"
msgstr "Estatísticas"
msgid "History"
msgstr "Histórico"
msgid "Settings"
msgstr "Configurações"
msgid "Languages"
msgstr "Linguagens"
@ -645,6 +654,12 @@ msgstr "Projetos"
msgid "Start a new project"
msgstr "Começar um novo projeto"
msgid "History"
msgstr "Histórico"
msgid "Settings"
msgstr "Configurações"
msgid "Other projects :"
msgstr "Outros projetos:"
@ -784,10 +799,10 @@ msgid ""
" creation of this budget management project and we will "
"send them an email for you."
msgstr ""
"Especifica uma lista de endereços de email (separados por vírgula) que você "
"quer notificar acerca da\n"
" criação deste projeto de gestão de saldo e nós iremos enviar "
"um email por si."
"Especifica uma lista de endereços de email (separados por vírgula) que "
"você quer notificar acerca da\n"
" criação deste projeto de gestão de saldo e nós iremos "
"enviar um email por si."
msgid "Who pays?"
msgstr "Quem paga?"
@ -818,3 +833,4 @@ msgstr "Gastos por Mês"
msgid "Period"
msgstr "Período"

View file

@ -1,20 +1,20 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-30 21:50+0200\n"
"PO-Revision-Date: 2020-08-17 17:32+0000\n"
"Last-Translator: Alexey Napalkov <flynbit@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/ru/>\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2021-05-10 11:33+0000\n"
"Last-Translator: Vsevolod <sevauserg.com@gmail.com>\n"
"Language: ru\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/i-hate-"
"money/i-hate-money/ru/>\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"
"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"
"X-Generator: Weblate 4.2-dev\n"
"Generated-By: Babel 2.8.0\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@ -26,7 +26,8 @@ msgstr ""
msgid "Project name"
msgstr "Имя проекта"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "Приватный код"
msgid "Email"
@ -41,6 +42,11 @@ msgstr "Использовать отслеживание по IP для ист
msgid "Default Currency"
msgstr "Валюта по умолчанию"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "Импортировать ранее экспортированный JSON файл"
@ -50,6 +56,9 @@ msgstr "Импортировать"
msgid "Project identifier"
msgstr "Идентификатор проекта"
msgid "Private code"
msgstr "Приватный код"
msgid "Create the project"
msgstr "Создать проект"
@ -188,8 +197,9 @@ msgid ""
"We tried to send you an reminder email, but there was an error. You can "
"still use the project normally."
msgstr ""
"Мы попытались отправить вам напоминание по электронной почте, но произошла "
"ошибка. Вы по-прежнему можете использовать проект в обычном режиме."
"Мы попытались отправить вам напоминание по электронной почте, но "
"произошла ошибка. Вы по-прежнему можете использовать проект в обычном "
"режиме."
#, python-format
msgid "The project identifier is %(project)s"
@ -200,9 +210,9 @@ msgid ""
"instructions. Please check the email configuration of the server or "
"contact the administrator."
msgstr ""
"К сожалению, при отправке вам электронного письма с инструкциями по сбросу "
"пароля произошла ошибка. Пожалуйста, проверьте конфигурацию электронной "
"почты сервера или свяжитесь с администратором."
"К сожалению, при отправке вам электронного письма с инструкциями по "
"сбросу пароля произошла ошибка. Пожалуйста, проверьте конфигурацию "
"электронной почты сервера или свяжитесь с администратором."
msgid "No token provided"
msgstr "Не предоставлен токен"
@ -325,6 +335,14 @@ msgstr "показать"
msgid "The Dashboard is currently deactivated."
msgstr "Панель инструментов в данный момент отключена."
#, fuzzy
msgid "Download Mobile Application"
msgstr "Мобильное приложение"
#, fuzzy
msgid "Get it on"
msgstr "Войти"
msgid "you sure?"
msgstr "вы уверены?"
@ -347,7 +365,7 @@ msgid "Download the list of bills with owner, amount, reason,... "
msgstr "Скачать список счетов с владельцем, суммой, причиной, .. "
msgid "Settle plans"
msgstr "Урегулировать планы"
msgstr "Планы оплаты"
msgid "Download the list of transactions needed to settle the current bills."
msgstr "Скачать список переводов нужных, чтобы урегулировать данные счета."
@ -624,17 +642,11 @@ msgid "Bills"
msgstr "Счета"
msgid "Settle"
msgstr "Отрегулировать"
msgstr "Оплаты"
msgid "Statistics"
msgstr "Статистика"
msgid "History"
msgstr "История"
msgid "Settings"
msgstr "Настройки"
msgid "Languages"
msgstr "Языки"
@ -644,6 +656,12 @@ msgstr "Проекты"
msgid "Start a new project"
msgstr "Начать новый проект"
msgid "History"
msgstr "История"
msgid "Settings"
msgstr "Настройки"
msgid "Other projects :"
msgstr "Остальные проекты :"
@ -833,3 +851,4 @@ msgstr "Период"
#~ " друзьям. Он хранится на сервере как"
#~ " есть, поэтому не используйте личный "
#~ "пароль!"

View file

@ -1,19 +1,20 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-08 13:59+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2021-04-09 13:26+0000\n"
"Last-Translator: Rastko Sarcevic <ralesarcevic@gmail.com>\n"
"Language-Team: Serbian <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/sr/>\n"
"Language: sr\n"
"Language-Team: Serbian <https://hosted.weblate.org/projects/i-hate-"
"money/i-hate-money/sr/>\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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\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"
"X-Generator: Weblate 4.6-dev\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@ -23,7 +24,7 @@ msgstr ""
msgid "Project name"
msgstr ""
msgid "Private code"
msgid "New private code"
msgstr ""
msgid "Email"
@ -38,6 +39,11 @@ msgstr ""
msgid "Default Currency"
msgstr "Podrazumevana Valuta"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr ""
@ -47,6 +53,9 @@ msgstr "Uvezi"
msgid "Project identifier"
msgstr ""
msgid "Private code"
msgstr ""
msgid "Create the project"
msgstr ""
@ -308,6 +317,13 @@ msgstr "prikaži"
msgid "The Dashboard is currently deactivated."
msgstr ""
#, fuzzy
msgid "Download Mobile Application"
msgstr "Mobilna Aplikacija"
msgid "Get it on"
msgstr ""
msgid "you sure?"
msgstr ""
@ -590,12 +606,6 @@ msgstr ""
msgid "Statistics"
msgstr "Statistika"
msgid "History"
msgstr "Istorija"
msgid "Settings"
msgstr "Podešavanja"
msgid "Languages"
msgstr "Jezici"
@ -605,6 +615,12 @@ msgstr ""
msgid "Start a new project"
msgstr ""
msgid "History"
msgstr "Istorija"
msgid "Settings"
msgstr "Podešavanja"
msgid "Other projects :"
msgstr ""
@ -768,3 +784,4 @@ msgstr "Mesečni troškovi"
msgid "Period"
msgstr "Period"

View file

@ -1,18 +1,20 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-30 01:37+0200\n"
"PO-Revision-Date: 2020-10-31 01:26+0000\n"
"Last-Translator: Kristoffer Grundström <swedishsailfishosuser@tutanota.com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/sv/>\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2021-05-26 07:33+0000\n"
"Last-Translator: Kristoffer Grundström "
"<swedishsailfishosuser@tutanota.com>\n"
"Language: sv\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/i-hate-"
"money/i-hate-money/sv/>\n"
"Plural-Forms: nplurals=2; plural=n != 1\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2-dev\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@ -22,7 +24,8 @@ msgstr ""
msgid "Project name"
msgstr "Namn på projektet"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "Privat kod"
msgid "Email"
@ -32,158 +35,172 @@ msgid "Enable project history"
msgstr "Aktiva projekthistorik"
msgid "Use IP tracking for project history"
msgstr ""
msgstr "Använd IP-spårning för projekthistorik"
msgid "Default Currency"
msgstr "Standardvaluta"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr ""
msgstr "Importera tidigare exporterad JSON-fil"
msgid "Import"
msgstr ""
msgstr "Importera"
msgid "Project identifier"
msgstr ""
msgstr "Projektidentifierare"
msgid "Private code"
msgstr "Privat kod"
msgid "Create the project"
msgstr ""
msgstr "Skapa projektet"
#, python-format
msgid ""
"A project with this identifier (\"%(project)s\") already exists. Please "
"choose a new identifier"
msgstr ""
"Ett projekt med den här identifieraren (\"%(project)s\") finns redan. "
"Vänligen välj en annan identifierare"
msgid "Get in"
msgstr ""
msgid "Admin password"
msgstr ""
msgstr "Lösenord för admin"
msgid "Send me the code by email"
msgstr ""
msgstr "Skicka koden till mig via e-post"
msgid "This project does not exists"
msgstr ""
msgstr "Det här projektet finns inte"
msgid "Password mismatch"
msgstr ""
msgid "Password"
msgstr ""
msgstr "Lösenord"
msgid "Password confirmation"
msgstr ""
msgstr "Lösenordsbekräftelse"
msgid "Reset password"
msgstr ""
msgstr "Återställ lösenord"
msgid "Date"
msgstr ""
msgstr "Datum"
msgid "What?"
msgstr ""
msgstr "Vad?"
msgid "Payer"
msgstr ""
msgstr "Betalare"
msgid "Amount paid"
msgstr ""
msgstr "Betald summa"
msgid "Currency"
msgstr ""
msgstr "Valuta"
msgid "External link"
msgstr ""
msgstr "Extern länk"
msgid "A link to an external document, related to this bill"
msgstr ""
msgstr "En länk till ett externt dokument, relaterad till den här räkningen"
msgid "For whom?"
msgstr ""
msgstr "För vem?"
msgid "Submit"
msgstr ""
msgstr "Skicka in"
msgid "Submit and add a new one"
msgstr ""
msgstr "Skicka in och lägg till en ny"
#, python-format
msgid "Project default: %(currency)s"
msgstr ""
msgid "Bills can't be null"
msgstr ""
msgstr "Räkningar kan inte vara null"
msgid "Name"
msgstr ""
msgstr "Namn"
msgid "Weights should be positive"
msgstr ""
msgstr "Vikter borde vara positiva"
msgid "Weight"
msgstr ""
msgstr "Vikt"
msgid "Add"
msgstr ""
msgstr "Lägg till"
msgid "User name incorrect"
msgstr ""
msgstr "Användarnamnet felaktigt"
msgid "This project already have this member"
msgstr ""
msgstr "Det här projektet har redan den här medlemmen"
msgid "People to notify"
msgstr ""
msgstr "Personer att meddela"
msgid "Send invites"
msgstr ""
msgstr "Skicka inbjudningar"
#, python-format
msgid "The email %(email)s is not valid"
msgstr ""
msgid "Participant"
msgstr ""
msgstr "Deltagare"
msgid "Bill"
msgstr ""
msgstr "Räkning"
msgid "Project"
msgstr ""
msgstr "Projekt"
msgid "No Currency"
msgstr ""
msgstr "Ingen valuta"
msgid "Too many failed login attempts, please retry later."
msgstr ""
msgstr "För många misslyckade inloggningsförsök, försök igen senare."
#, python-format
msgid "This admin password is not the right one. Only %(num)d attempts left."
msgstr ""
"Det här lösenordet för admin är inte det rätta. Endast %(num)d försök "
"kvar."
msgid "You either provided a bad token or no project identifier."
msgstr ""
msgid "This private code is not the right one"
msgstr ""
msgstr "Den här privata koden är inte den rätta"
#, python-format
msgid "You have just created '%(project)s' to share your expenses"
msgstr ""
msgstr "Du har just skapat '%(project)s' för att dela ut dina kostnader"
msgid "A reminder email has just been sent to you"
msgstr ""
msgstr "Ett e-postmeddelande med påminnelse har just skickats till dig"
msgid ""
"We tried to send you an reminder email, but there was an error. You can "
"still use the project normally."
msgstr ""
"Vi försökte skicka en påminnelse till din e-postadress, men det uppstod "
"ett fel. Du kan fortfarande använda det här projektet normalt."
#, python-format
msgid "The project identifier is %(project)s"
msgstr ""
msgstr "Projektets identifierare är %(project)s"
msgid ""
"Sorry, there was an error while sending you an email with password reset "
@ -192,32 +209,32 @@ msgid ""
msgstr ""
msgid "No token provided"
msgstr ""
msgstr "Ingen symbol tillhandahölls"
msgid "Invalid token"
msgstr ""
msgstr "Ogiltig symbol"
msgid "Unknown project"
msgstr ""
msgstr "Okänt projekt"
msgid "Password successfully reset."
msgstr ""
msgstr "Återställningen av lösenordet lyckades."
msgid "Project successfully uploaded"
msgstr ""
msgstr "Uppladdningen av projektet lyckades"
msgid "Invalid JSON"
msgstr ""
msgstr "Ogiltig JSON"
msgid "Project successfully deleted"
msgstr ""
msgstr "Borttagningen av projektet lyckades"
#, python-format
msgid "You have been invited to share your expenses for %(project)s"
msgstr ""
msgstr "Du har bjudits in att dela ut dina kostnader för %(project)s"
msgid "Your invitations have been sent"
msgstr ""
msgstr "Dina inbjudningar har skickats"
msgid ""
"Sorry, there was an error while trying to send the invitation emails. "
@ -227,11 +244,11 @@ msgstr ""
#, python-format
msgid "%(member)s has been added"
msgstr ""
msgstr "%(member)s har lagts till"
#, python-format
msgid "%(name)s is part of this project again"
msgstr ""
msgstr "%(name)s är en del av det här projektet igen"
#, python-format
msgid ""
@ -241,86 +258,93 @@ msgstr ""
#, python-format
msgid "User '%(name)s' has been removed"
msgstr ""
msgstr "Användaren '%(name)s' har tagits bort"
#, python-format
msgid "User '%(name)s' has been edited"
msgstr ""
msgstr "Användaren '%(name)s' har blivit redigerad"
msgid "The bill has been added"
msgstr ""
msgstr "Räkningen har lagts till"
msgid "The bill has been deleted"
msgstr ""
msgstr "Räkningen har tagits bort"
msgid "The bill has been modified"
msgstr ""
msgstr "Räkningen har blivit modifierad"
msgid "Sorry, we were unable to find the page you've asked for."
msgstr ""
msgstr "Ledsen, men vi kunde inte hitta sidan som du frågade efter."
msgid "The best thing to do is probably to get back to the main page."
msgstr ""
msgstr "Det bästa du kan göra är förmodligen att gå tillbaka till huvudsidan."
msgid "Back to the list"
msgstr ""
msgstr "Tillbaka till listan"
msgid "Administration tasks are currently disabled."
msgstr ""
msgid "The project you are trying to access do not exist, do you want to"
msgstr ""
msgstr "Projektet som du försöker komma åt finns inte, vill du"
msgid "create it"
msgstr ""
msgstr "skapa det"
msgid "?"
msgstr ""
msgstr "?"
msgid "Create a new project"
msgstr ""
msgstr "Skapa ett nytt projekt"
msgid "Number of members"
msgstr ""
msgstr "Antalet medlemmar"
msgid "Number of bills"
msgstr ""
msgstr "Antalet räkningar"
msgid "Newest bill"
msgstr ""
msgstr "Nyaste räkningen"
msgid "Oldest bill"
msgstr ""
msgstr "Äldsta räkningen"
msgid "Actions"
msgstr ""
msgstr "Åtgärder"
msgid "edit"
msgstr ""
msgstr "redigera"
msgid "delete"
msgstr ""
msgstr "ta bort"
msgid "show"
msgstr ""
msgstr "visa"
msgid "The Dashboard is currently deactivated."
msgstr "Instrumentpanelen är för närvarande inaktiverad."
#, fuzzy
msgid "Download Mobile Application"
msgstr "Mobilapplikation"
msgid "Get it on"
msgstr ""
msgid "you sure?"
msgstr ""
msgstr "säker?"
msgid "Edit project"
msgstr ""
msgstr "Redigera projekt"
msgid "Import JSON"
msgstr ""
msgstr "Importera JSON"
msgid "Choose file"
msgstr ""
msgstr "Välj fil"
msgid "Download project's data"
msgstr ""
msgstr "Ladda ner projektets data"
msgid "Bill items"
msgstr ""
@ -335,61 +359,61 @@ msgid "Download the list of transactions needed to settle the current bills."
msgstr ""
msgid "Can't remember the password?"
msgstr ""
msgstr "Kan du inte komma ihåg lösenordet?"
msgid "Cancel"
msgstr ""
msgstr "Avbryt"
msgid "Privacy Settings"
msgstr ""
msgstr "Inställningar för privatliv"
msgid "Edit the project"
msgstr ""
msgstr "Redigera projektet"
msgid "Edit this bill"
msgstr ""
msgstr "Redigera den här räkningen"
msgid "Add a bill"
msgstr ""
msgstr "Lägg till en räkning"
msgid "Select all"
msgstr ""
msgstr "Välj alla"
msgid "Select none"
msgstr ""
msgstr "Välj ingen"
msgid "Add participant"
msgstr ""
msgstr "Lägg till deltagare"
msgid "Edit this member"
msgstr ""
msgstr "Redigera det här numret"
msgid "john.doe@example.com, mary.moe@site.com"
msgstr ""
msgstr "john.doe@exempel.com, mary.moe@sida.com"
msgid "Send the invitations"
msgstr ""
msgstr "Skicka inbjudningarna"
msgid "Download"
msgstr ""
msgstr "Ladda ner"
msgid "Disabled Project History"
msgstr ""
msgstr "Inaktiverade projekthistorik"
msgid "Disabled Project History & IP Address Recording"
msgstr ""
msgstr "Inaktiverade projekthistorik och inspelning av IP-adress"
msgid "Enabled Project History"
msgstr ""
msgstr "Aktiverade projekthistorik"
msgid "Disabled IP Address Recording"
msgstr ""
msgstr "Inaktiverade inspelning av IP-adress"
msgid "Enabled Project History & IP Address Recording"
msgstr ""
msgstr "Aktiverade projekthistorik & inspelning av IP-adress"
msgid "Enabled IP Address Recording"
msgstr ""
msgstr "Aktiverade inspelning av IP-adress"
msgid "History Settings Changed"
msgstr ""
@ -398,10 +422,10 @@ msgid "changed"
msgstr ""
msgid "from"
msgstr ""
msgstr "från"
msgid "to"
msgstr ""
msgstr "till"
msgid "Confirm Remove IP Adresses"
msgstr ""
@ -414,27 +438,29 @@ msgid ""
msgstr ""
msgid "Close"
msgstr ""
msgstr "Stäng"
msgid "Confirm Delete"
msgstr ""
msgstr "Bekräfta borttagning"
msgid "Delete Confirmation"
msgstr ""
msgstr "Ta bort bekräftelse"
msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
"Är du säker på att du vill ta bort alla historik för det här projektet? "
"Den här åtgärden kan inte göras ogjord."
msgid "Added"
msgstr ""
msgstr "Lades till"
msgid "Removed"
msgstr ""
msgstr "Togs bort"
msgid "and"
msgstr ""
msgstr "och"
msgid "owers list"
msgstr ""
@ -462,27 +488,29 @@ msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
"Några poster här nedan innehåller IP-adresser, fastän det här projektet "
"har IP-inspelning inaktiverat. "
msgid "Delete stored IP addresses"
msgstr ""
msgstr "Ta bort lagrade IP-adresser"
msgid "No history to erase"
msgstr ""
msgstr "Ingen historik att ta bort"
msgid "Clear Project History"
msgstr ""
msgstr "Rensa projektets historik"
msgid "No IP Addresses to erase"
msgstr ""
msgstr "Inga IP-adresser att ta bort"
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgstr "Tid"
msgid "Event"
msgstr ""
msgstr "Händelse"
msgid "IP address recording can be enabled on the settings page"
msgstr ""
@ -491,86 +519,86 @@ msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgstr "Från IP"
msgid "added"
msgstr ""
msgstr "lades till"
msgid "Project private code changed"
msgstr ""
msgstr "Projektets privata kod ändrades"
msgid "Project renamed to"
msgstr ""
msgstr "Projektet döptes om till"
msgid "Project contact email changed to"
msgstr ""
msgstr "Projektets e-post för kontakt ändrades till"
msgid "Project settings modified"
msgstr ""
msgstr "Projektets inställningar ändrades"
msgid "deactivated"
msgstr ""
msgstr "inaktiverades"
msgid "reactivated"
msgstr ""
msgstr "återaktiverades"
msgid "renamed to"
msgstr ""
msgstr "döptes om till"
msgid "External link changed to"
msgstr ""
msgstr "Extern länk ändrades till"
msgid "Amount"
msgstr ""
msgstr "Summa"
#, python-format
msgid "Amount in %(currency)s"
msgstr ""
msgstr "Summa i %(currency)s"
msgid "modified"
msgstr ""
msgstr "ändrades"
msgid "removed"
msgstr ""
msgstr "togs bort"
msgid "changed in a unknown way"
msgstr ""
msgstr "ändrades på ett okänt sätt"
msgid "Nothing to list"
msgstr ""
msgstr "Inget att lista"
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily"
msgstr ""
msgstr "Hantera dina utdelade <br />kostnader, lätt"
msgid "Try out the demo"
msgstr ""
msgstr "Prova demot"
msgid "You're sharing a house?"
msgstr ""
msgstr "Delar du ett hus?"
msgid "Going on holidays with friends?"
msgstr ""
msgstr "Ska du på semester med dina vänner?"
msgid "Simply sharing money with others?"
msgstr ""
msgstr "Delar du helt enkelt pengar med andra?"
msgid "We can help!"
msgstr ""
msgstr "Vi kan hjälpa!"
msgid "Log in to an existing project"
msgstr ""
msgstr "Logga in i ett befintligt projekt"
msgid "Log in"
msgstr ""
msgstr "Logga in"
msgid "can't remember your password?"
msgstr ""
msgstr "kan du inte komma ihåg ditt lösenord?"
msgid "Create"
msgstr ""
msgstr "Skapa"
msgid ""
"Don\\'t reuse a personal password. Choose a private code and send it to "
@ -578,121 +606,121 @@ msgid ""
msgstr ""
msgid "Account manager"
msgstr ""
msgstr "Kontoansvarig"
msgid "Bills"
msgstr ""
msgstr "Räkningar"
msgid "Settle"
msgstr ""
msgid "Statistics"
msgstr ""
msgid "History"
msgstr ""
msgid "Settings"
msgstr ""
msgstr "Statistik"
msgid "Languages"
msgstr ""
msgstr "Språk"
msgid "Projects"
msgstr ""
msgstr "Projekt"
msgid "Start a new project"
msgstr ""
msgstr "Starta ett nytt projekt"
msgid "History"
msgstr "Historik"
msgid "Settings"
msgstr "Inställningar"
msgid "Other projects :"
msgstr ""
msgstr "Andra projekt :"
msgid "switch to"
msgstr ""
msgstr "byt till"
msgid "Dashboard"
msgstr ""
msgstr "Instrumentpanel"
msgid "Logout"
msgstr ""
msgstr "Logga ut"
msgid "Code"
msgstr ""
msgstr "Kod"
msgid "Mobile Application"
msgstr ""
msgstr "Mobilapplikation"
msgid "Documentation"
msgstr ""
msgstr "Dokumentation"
msgid "Administation Dashboard"
msgstr ""
msgid "\"I hate money\" is a free software"
msgstr ""
msgstr "\"Jag hatar pengar\" är en fri mjukvara"
msgid "you can contribute and improve it!"
msgstr ""
msgstr "du kan bidra och förbättra det!"
#, python-format
msgid "%(amount)s each"
msgstr ""
msgstr "%(amount)s var"
msgid "Invite people"
msgstr ""
msgstr "Bjud in personer"
msgid "You should start by adding participants"
msgstr ""
msgstr "Du borde börja med att lägga till deltagare"
msgid "Add a new bill"
msgstr ""
msgstr "Lägg till en ny räkning"
msgid "Newer bills"
msgstr ""
msgstr "Nyare räkningar"
msgid "Older bills"
msgstr ""
msgstr "Äldre räkningar"
msgid "When?"
msgstr ""
msgstr "När?"
msgid "Who paid?"
msgstr ""
msgstr "Vem betalade?"
msgid "For what?"
msgstr ""
msgstr "För vad?"
msgid "How much?"
msgstr ""
msgstr "Hur mycket?"
#, python-format
msgid "Added on %(date)s"
msgstr ""
msgstr "Lades till %(date)s"
msgid "Everyone"
msgstr ""
msgstr "Alla"
#, python-format
msgid "Everyone but %(excluded)s"
msgstr ""
msgstr "Alla förutom %(excluded)s"
msgid "No bills"
msgstr ""
msgstr "Inga räkningar"
msgid "Nothing to list yet."
msgstr ""
msgstr "Ingenting att lista än."
msgid "You probably want to"
msgstr ""
msgstr "Du kanske vill"
msgid "add a bill"
msgstr ""
msgstr "lägg till en räkning"
msgid "add participants"
msgstr ""
msgstr "lägg till deltagare"
msgid "Password reminder"
msgstr ""
msgstr "Lösenordspåminnare"
msgid ""
"A link to reset your password has been sent to you, please check your "
@ -700,19 +728,19 @@ msgid ""
msgstr ""
msgid "Return to home page"
msgstr ""
msgstr "Återgå till första-sidan"
msgid "Your projects"
msgstr ""
msgstr "Dina projekt"
msgid "Reset your password"
msgstr ""
msgstr "Återställ ditt lösenord"
msgid "Invite people to join this project"
msgstr ""
msgstr "Bjud in personer att ansluta till det här projektet"
msgid "Share Identifier & code"
msgstr ""
msgstr "Dela ut identifierare & kod"
msgid ""
"You can share the project identifier and the private code by any "
@ -720,13 +748,13 @@ msgid ""
msgstr ""
msgid "Identifier:"
msgstr ""
msgstr "Identifierare:"
msgid "Share the Link"
msgstr ""
msgstr "Dela ut länken"
msgid "You can directly share the following link via your prefered medium"
msgstr ""
msgstr "Du kan direkt dela ut följande länk via föredraget media"
msgid "Send via Emails"
msgstr ""
@ -739,31 +767,32 @@ msgid ""
msgstr ""
msgid "Who pays?"
msgstr ""
msgstr "Vem betalar?"
msgid "To whom?"
msgstr ""
msgstr "Till vem?"
msgid "Who?"
msgstr ""
msgstr "Vem?"
msgid "Balance"
msgstr ""
msgstr "Saldo"
msgid "deactivate"
msgstr ""
msgstr "inaktivera"
msgid "reactivate"
msgstr ""
msgstr "återaktivera"
msgid "Paid"
msgstr ""
msgstr "Betald"
msgid "Spent"
msgstr ""
msgid "Expenses by Month"
msgstr ""
msgstr "Kostnader per månad"
msgid "Period"
msgstr ""
msgstr "Period"

View file

@ -1,18 +1,19 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-06-30 19:34+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2020-07-01 18:41+0000\n"
"Last-Translator: rohitn01 <rohitmen01@gmail.com>\n"
"Language-Team: Tamil <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/ta/>\n"
"Language: ta\n"
"Language-Team: Tamil <https://hosted.weblate.org/projects/i-hate-money/i"
"-hate-money/ta/>\n"
"Plural-Forms: nplurals=2; plural=n != 1\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2-dev\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@ -24,7 +25,8 @@ msgstr ""
msgid "Project name"
msgstr "திட்டத்தின் பெயர்"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "தனியார் குறியீடு"
msgid "Email"
@ -39,6 +41,11 @@ msgstr "திட்ட வரலாற்றுக்கு ஐபி கண்
msgid "Default Currency"
msgstr "இயல்புநிலை நாணயம்"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "முன்னர் ஏற்றுமதி செய்யப்பட்ட JSON கோப்பை இறக்குமதி செய்க"
@ -48,6 +55,9 @@ msgstr "இறக்குமதி"
msgid "Project identifier"
msgstr "திட்ட அடையாளங்காட்டி"
msgid "Private code"
msgstr "தனியார் குறியீடு"
msgid "Create the project"
msgstr "திட்டத்தை உருவாக்கவும்"
@ -56,8 +66,8 @@ msgid ""
"A project with this identifier (\"%(project)s\") already exists. Please "
"choose a new identifier"
msgstr ""
"இந்த அடையாளங்காட்டியுடன் ஒரு திட்டம் (\"%(project)s\") ஏற்கனவே இருக்கிறது. "
"புதிய அடையாளங்காட்டியைத் தேர்ந்தெடுக்கவும்"
"இந்த அடையாளங்காட்டியுடன் ஒரு திட்டம் (\"%(project)s\") ஏற்கனவே "
"இருக்கிறது. புதிய அடையாளங்காட்டியைத் தேர்ந்தெடுக்கவும்"
msgid "Get in"
msgstr "உள்ளே வா"
@ -180,8 +190,8 @@ msgstr "இந்த தனிப்பட்ட குறியீடு சர
#, python-format
msgid "You have just created '%(project)s' to share your expenses"
msgstr ""
"நீங்கள் இப்போது உருவாக்கியுள்ளீர்கள் '%(project)s' உங்கள் செலவுகளை பகிர்ந்து "
"கொள்ள"
"நீங்கள் இப்போது உருவாக்கியுள்ளீர்கள் '%(project)s' உங்கள் செலவுகளை "
"பகிர்ந்து கொள்ள"
msgid "A reminder email has just been sent to you"
msgstr "ஒரு நினைவூட்டல் மின்னஞ்சல் உங்களுக்கு அனுப்பப்பட்டுள்ளது"
@ -190,8 +200,8 @@ msgid ""
"We tried to send you an reminder email, but there was an error. You can "
"still use the project normally."
msgstr ""
"உங்களுக்கு நினைவூட்டல் மின்னஞ்சலை அனுப்ப முயற்சித்தோம், ஆனால் பிழை ஏற்பட்டது"
". நீங்கள் இன்னும் திட்டத்தை சாதாரணமாக பயன்படுத்தலாம்."
"உங்களுக்கு நினைவூட்டல் மின்னஞ்சலை அனுப்ப முயற்சித்தோம், ஆனால் பிழை "
"ஏற்பட்டது. நீங்கள் இன்னும் திட்டத்தை சாதாரணமாக பயன்படுத்தலாம்."
#, python-format
msgid "The project identifier is %(project)s"
@ -203,8 +213,8 @@ msgid ""
"contact the administrator."
msgstr ""
"மன்னிக்கவும், கடவுச்சொல் மீட்டமைப்பு வழிமுறைகளுடன் உங்களுக்கு மின்னஞ்சல் "
"அனுப்பும்போது பிழை ஏற்பட்டது. சேவையகத்தின் மின்னஞ்சல் உள்ளமைவை சரிபார்க்கவும்"
" அல்லது நிர்வாகியைத் தொடர்பு கொள்ளவும்."
"அனுப்பும்போது பிழை ஏற்பட்டது. சேவையகத்தின் மின்னஞ்சல் உள்ளமைவை "
"சரிபார்க்கவும் அல்லது நிர்வாகியைத் தொடர்பு கொள்ளவும்."
msgid "No token provided"
msgstr "டோக்கன் வழங்கப்படவில்லை"
@ -325,6 +335,13 @@ msgstr ""
msgid "The Dashboard is currently deactivated."
msgstr ""
msgid "Download Mobile Application"
msgstr ""
#, fuzzy
msgid "Get it on"
msgstr "உள்ளே வா"
msgid "you sure?"
msgstr ""
@ -607,12 +624,6 @@ msgstr ""
msgid "Statistics"
msgstr ""
msgid "History"
msgstr ""
msgid "Settings"
msgstr ""
msgid "Languages"
msgstr ""
@ -622,6 +633,12 @@ msgstr ""
msgid "Start a new project"
msgstr ""
msgid "History"
msgstr ""
msgid "Settings"
msgstr ""
msgid "Other projects :"
msgstr ""
@ -785,3 +802,4 @@ msgstr ""
msgid "Period"
msgstr ""

View file

@ -1,19 +1,19 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-30 21:50+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2020-06-01 16:41+0000\n"
"Last-Translator: Oğuz Ersen <oguzersen@protonmail.com>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/tr/>\n"
"Language: tr\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/i-hate-"
"money/i-hate-money/tr/>\n"
"Plural-Forms: nplurals=2; plural=n != 1\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: Weblate 4.1-dev\n"
"Generated-By: Babel 2.8.0\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@ -25,7 +25,8 @@ msgstr ""
msgid "Project name"
msgstr "Proje adı"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "Özel kod"
msgid "Email"
@ -40,6 +41,11 @@ msgstr "Proje geçmişi için IP izlemeyi kullan"
msgid "Default Currency"
msgstr "Öntanımlı Para Birimi"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "Önceden dışa aktarılan JSON dosyasını içe aktar"
@ -49,6 +55,9 @@ msgstr "İçe aktar"
msgid "Project identifier"
msgstr "Proje tanımlayıcısı"
msgid "Private code"
msgstr "Özel kod"
msgid "Create the project"
msgstr "Proje oluştur"
@ -324,6 +333,14 @@ msgstr "göster"
msgid "The Dashboard is currently deactivated."
msgstr "Gösterge paneli şu anda devre dışı."
#, fuzzy
msgid "Download Mobile Application"
msgstr "Telefon Uygulaması"
#, fuzzy
msgid "Get it on"
msgstr "Alın"
msgid "you sure?"
msgstr "emin misiniz?"
@ -629,12 +646,6 @@ msgstr "Öde"
msgid "Statistics"
msgstr "İstatistikler"
msgid "History"
msgstr "Geçmiş"
msgid "Settings"
msgstr "Ayarlar"
msgid "Languages"
msgstr "Diller"
@ -644,6 +655,12 @@ msgstr "Projeler"
msgid "Start a new project"
msgstr "Yeni bir proje başlat"
msgid "History"
msgstr "Geçmiş"
msgid "Settings"
msgstr "Ayarlar"
msgid "Other projects :"
msgstr "Diğer projeler:"
@ -837,3 +854,4 @@ msgstr "Dönem"
#~ " Sunucu tarafından olduğu gibi "
#~ "saklanmaktadır, bu yüzden kişisel bir "
#~ "parolayı tekrar kullanmayın!"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-30 21:50+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2020-05-21 18:48+0000\n"
"Last-Translator: Andrew Zaplitnyak <zaplitnyak@gmail.com>\n"
"Language: uk\n"
@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.8.0\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@ -24,7 +24,8 @@ msgstr "Не вірна сума чи вираз. Приймаються тіл
msgid "Project name"
msgstr "Назва проєкту"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "Приватний код"
msgid "Email"
@ -39,6 +40,11 @@ msgstr "Слідкувати за мережевою адресою(IP) для
msgid "Default Currency"
msgstr "Стандартна валюта"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "Імпортувати попередньо експортований JSON файл"
@ -48,6 +54,9 @@ msgstr "Імпортувати"
msgid "Project identifier"
msgstr "Ідентифікатор проєкту"
msgid "Private code"
msgstr "Приватний код"
msgid "Create the project"
msgstr "Створити проєкт"
@ -311,6 +320,13 @@ msgstr ""
msgid "The Dashboard is currently deactivated."
msgstr ""
msgid "Download Mobile Application"
msgstr ""
#, fuzzy
msgid "Get it on"
msgstr "Отримати в"
msgid "you sure?"
msgstr ""
@ -593,12 +609,6 @@ msgstr ""
msgid "Statistics"
msgstr ""
msgid "History"
msgstr ""
msgid "Settings"
msgstr ""
msgid "Languages"
msgstr ""
@ -608,6 +618,12 @@ msgstr ""
msgid "Start a new project"
msgstr ""
msgid "History"
msgstr ""
msgid "Settings"
msgstr ""
msgid "Other projects :"
msgstr ""

View file

@ -1,19 +1,20 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-30 21:50+0200\n"
"POT-Creation-Date: 2021-07-07 01:01+0200\n"
"PO-Revision-Date: 2020-10-12 04:47+0000\n"
"Last-Translator: Jwen921 <yangjingwen0921@gmail.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"i-hate-money/i-hate-money/zh_Hans/>\n"
"Language: zh_Hans\n"
"Language-Team: Chinese (Simplified) "
"<https://hosted.weblate.org/projects/i-hate-money/i-hate-money/zh_Hans/>"
"\n"
"Plural-Forms: nplurals=1; plural=0\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"
"X-Generator: Weblate 4.3-dev\n"
"Generated-By: Babel 2.8.0\n"
"Generated-By: Babel 2.9.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@ -23,7 +24,8 @@ msgstr "金额或符号无效。仅限数字与+-*/符号。"
msgid "Project name"
msgstr "账目名称"
msgid "Private code"
#, fuzzy
msgid "New private code"
msgstr "共享密钥"
msgid "Email"
@ -38,6 +40,11 @@ msgstr "用IP追踪项目历史"
msgid "Default Currency"
msgstr "默认货币"
msgid ""
"This project cannot be set to 'no currency' because it contains bills in "
"multiple currencies."
msgstr ""
msgid "Import previously exported JSON file"
msgstr "导入之前的JSON 文件"
@ -47,6 +54,9 @@ msgstr "导入"
msgid "Project identifier"
msgstr "账目名称"
msgid "Private code"
msgstr "共享密钥"
msgid "Create the project"
msgstr "创建账目明细"
@ -308,6 +318,14 @@ msgstr "显示"
msgid "The Dashboard is currently deactivated."
msgstr "操作面板失效"
#, fuzzy
msgid "Download Mobile Application"
msgstr "手机软件"
#, fuzzy
msgid "Get it on"
msgstr "进入"
msgid "you sure?"
msgstr "确定?"
@ -602,12 +620,6 @@ msgstr "解决"
msgid "Statistics"
msgstr "统计"
msgid "History"
msgstr "历史"
msgid "Settings"
msgstr "设置"
msgid "Languages"
msgstr "语言"
@ -617,6 +629,12 @@ msgstr "项目"
msgid "Start a new project"
msgstr "开始一个新项目"
msgid "History"
msgstr "历史"
msgid "Settings"
msgstr "设置"
msgid "Other projects :"
msgstr "其他项目:"
@ -798,3 +816,4 @@ msgstr "期间"
#~ "is by the server, so don\\'t reuse"
#~ " a personal password!"
#~ msgstr "进入码已发送给朋友,会被保存在服务器,不要重复使用私人密码!"

View file

@ -36,7 +36,6 @@ from sqlalchemy_continuum import Operation
from werkzeug.exceptions import NotFound
from werkzeug.security import check_password_hash, generate_password_hash
from ihatemoney.currency_convertor import CurrencyConverter
from ihatemoney.forms import (
AdminAuthenticationForm,
AuthenticationForm,
@ -161,7 +160,7 @@ def admin():
client_ip = request.remote_addr
if not login_throttler.is_login_allowed(client_ip):
msg = _("Too many failed login attempts, please retry later.")
form.errors["admin_password"] = [msg]
form["admin_password"].errors = [msg]
return render_template(
"admin.html",
form=form,
@ -183,7 +182,7 @@ def admin():
"This admin password is not the right one. Only %(num)d attempts left.",
num=login_throttler.get_remaining_attempts(client_ip),
)
form.errors["admin_password"] = [msg]
form["admin_password"].errors = [msg]
return render_template(
"admin.html",
form=form,
@ -210,7 +209,7 @@ def authenticate(project_id=None):
# User doesn't provide project identifier or a valid token
# return to authenticate form
msg = _("You either provided a bad token or no project identifier.")
form.errors["id"] = [msg]
form["id"].errors = [msg]
return render_template("authenticate.html", form=form)
project = Project.query.get(project_id)
@ -246,7 +245,7 @@ def authenticate(project_id=None):
return redirect(url_for(".list_bills"))
if is_post_auth and not check_password_hash(project.password, form.password.data):
msg = _("This private code is not the right one")
form.errors["password"] = [msg]
form["password"].errors = [msg]
return render_template("authenticate.html", form=form)
@ -400,7 +399,7 @@ def reset_password():
@main.route("/<project_id>/edit", methods=["GET", "POST"])
def edit_project():
edit_form = EditProjectForm()
edit_form = EditProjectForm(id=g.project.id)
import_form = UploadForm()
# Import form
if import_form.validate_on_submit():
@ -415,17 +414,6 @@ def edit_project():
# Edit form
if edit_form.validate_on_submit():
project = edit_form.update(g.project)
# Update converted currency
if project.default_currency != CurrencyConverter.no_currency:
for bill in project.get_bills():
if bill.original_currency == CurrencyConverter.no_currency:
bill.original_currency = project.default_currency
bill.converted_amount = CurrencyConverter().exchange_currency(
bill.amount, bill.original_currency, project.default_currency
)
db.session.add(bill)
db.session.add(project)
db.session.commit()
@ -549,7 +537,7 @@ def export_project(file, format):
return send_file(
file2export,
attachment_filename=f"{g.project.id}-{file}.{format}",
download_name=f"{g.project.id}-{file}.{format}",
as_attachment=True,
)

View file

@ -27,18 +27,17 @@ install_requires =
cachetools~=4.1
debts~=0.5
email_validator~=1.0
Flask-Babel~=1.0
Flask-Babel>=1,<3
Flask-Cors~=3.0
Flask-Mail~=0.9
Flask-Migrate>=2.5.3 # Not following semantic versioning (e.g. https://github.com/miguelgrinberg/flask-migrate/commit/1af28ba273de6c88544623b8dc02dd539340294b)
Flask-Migrate>=2.5.3,<4 # Not following semantic versioning (e.g. https://github.com/miguelgrinberg/flask-migrate/commit/1af28ba273de6c88544623b8dc02dd539340294b)
Flask-RESTful~=0.3
Flask-Script~=2.0
Flask-SQLAlchemy~=2.4
Flask-WTF~=0.14,>=0.14.3 # See b76da172652da94c1f9c4b2fdd965375da8a2c3f
WTForms~=2.2.1,<2.3 # See #567
Flask~=1.1
itsdangerous~=1.1
Jinja2~=2.11
WTForms>=2.3.1,<2.4
Flask>=1.1,<3.0
itsdangerous>=1.1,<3.0
Jinja2>=3.0,<4.0
requests~=2.22
SQLAlchemy-Continuum~=1.3
SQLAlchemy~=1.3.0 # New 1.4 changes API, see #728
@ -52,10 +51,20 @@ dev =
pytest>=5.4.1
tox>=3.14.6
zest.releaser>=6.20.1
psycopg2-binary>=2.8.5
PyMySQL>=0.9,<0.10
doc =
Sphinx==4.0.3
docutils==0.17.1
[options.entry_points]
flask.commands =
generate_password_hash = ihatemoney.manage:password_hash
generate-config = ihatemoney.manage:generate_config
console_scripts =
ihatemoney = ihatemoney.manage:main
ihatemoney = ihatemoney.manage:cli
paste.app_factory =
main = ihatemoney.run:main

23
tox.ini
View file

@ -1,8 +1,9 @@
[tox]
envlist = py39,py38,py37,py36,docs,flake8,black
envlist = py39,py38,py37,py36,lint_docs
skip_missing_interpreters = True
[testenv]
passenv = TESTING_SQLALCHEMY_DATABASE_URI
commands =
python --version
@ -14,20 +15,14 @@ deps =
# To be sure we are importing ihatemoney pkg from pip-installed version
changedir = /tmp
[testenv:docs]
commands = sphinx-build -a -n -b html -d docs/_build/doctrees docs docs/_build/html
deps =
-rdocs/requirements.txt
changedir = {toxinidir}
[testenv:black]
[testenv:lint_docs]
commands =
black --check --target-version=py36 .
isort -c -rc .
changedir = {toxinidir}
[testenv:flake8]
commands = flake8 ihatemoney
isort -c .
flake8 ihatemoney
sphinx-build -a -n -b html -d docs/_build/doctrees docs docs/_build/html
deps =
-e.[dev,doc]
changedir = {toxinidir}
[flake8]
@ -41,5 +36,5 @@ extend-ignore =
python =
3.6: py36
3.7: py37
3.8: py38, docs, black, flake8
3.8: py38, lint_docs
3.9: py39