Merge branch 'master' into master

This commit is contained in:
Glandos 2020-04-26 22:54:29 +02:00 committed by GitHub
commit 6f991be65d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
57 changed files with 3376 additions and 1020 deletions

3
.gitignore vendored
View file

@ -11,4 +11,5 @@ build
.vscode .vscode
.env .env
.pytest_cache .pytest_cache
ihatemoney/budget.db
.idea/

13
.isort.cfg Normal file
View file

@ -0,0 +1,13 @@
[settings]
# Needed for black compatibility
multi_line_output=3
include_trailing_comma=True
force_grid_wrap=0
line_length=88
combine_as_imports=True
# If set, imports will be sorted within their section independent to the import_type.
force_sort_within_sections=True
# skip
skip_glob=.local,**/migrations/**,**/node_modules/**,**/node-forge/**

View file

@ -1,9 +1,9 @@
sudo: false sudo: false
language: python language: python
python: python:
- "3.5"
- "3.6" - "3.6"
- "3.7" - "3.7"
- "3.8"
script: tox script: tox
install: install:
- pip install tox-travis - pip install tox-travis

View file

@ -9,7 +9,7 @@ This document describes changes between each past release.
- Add support for espanol latino america (es_419) - Add support for espanol latino america (es_419)
- Use the external debts lib to solve settlements (#476) - Use the external debts lib to solve settlements (#476)
- Remove balance column in statistics view (#323) - Remove balance column in statistics view (#323)
- Remove requirements files in favor of setup.cfg pinning (#558)
4.1.3 (2019-09-18) 4.1.3 (2019-09-18)
================== ==================

View file

@ -7,20 +7,27 @@ Adrien CLERC
Alexandre Avenel Alexandre Avenel
Alexis Métaireau Alexis Métaireau
Allan Nordhøy Allan Nordhøy
am97
Andrew Dickinson
Arnaud Bos Arnaud Bos
Baptiste Jonglez Baptiste Jonglez
Benjamin Bouvier Benjamin Bouvier
Berteh Berteh
bmatticus
Brice Maron Brice Maron
Byron Ullauri Byron Ullauri
Carey Metcalfe Carey Metcalfe
Daniel Schreiber Daniel Schreiber
DavidRThrashJr
donkers donkers
Edwin Smulders
Elizabeth Sherrock Elizabeth Sherrock
eMerzh
Feth AREZKI Feth AREZKI
Frédéric Sureau Frédéric Sureau
Glandos Glandos
Heimen Stoffels Heimen Stoffels
James Leong
Jocelyn Delalande Jocelyn Delalande
Lucas Verney Lucas Verney
Luc Didry Luc Didry
@ -37,3 +44,4 @@ Richard Coates
THANOS SIOURDAKIS THANOS SIOURDAKIS
Toover Toover
Xavier Mehrenberger Xavier Mehrenberger
zorun

View file

@ -1,3 +1,3 @@
include *.rst include *.rst
recursive-include ihatemoney *.rst *.py *.yaml *.po *.mo *.html *.css *.js *.eot *.svg *.woff *.txt *.png *.ini *.cfg *.j2 recursive-include ihatemoney *.rst *.py *.yaml *.po *.mo *.html *.css *.js *.eot *.svg *.woff *.txt *.png *.ini *.cfg *.j2
include LICENSE CONTRIBUTORS CHANGELOG.rst requirements.txt include LICENSE CONTRIBUTORS CHANGELOG.rst

View file

@ -11,10 +11,10 @@ ZOPFLIPNG := zopflipng
.PHONY: all .PHONY: all
all: install ## Alias for install all: install ## Alias for install
.PHONY: install .PHONY: install
install: virtualenv $(INSTALL_STAMP) ## Install dependencies install: virtualenv setup.cfg $(INSTALL_STAMP) ## Install dependencies
$(INSTALL_STAMP): $(INSTALL_STAMP):
$(VENV)/bin/pip install -U pip $(VENV)/bin/pip install -U pip
$(VENV)/bin/pip install -r requirements.txt $(VENV)/bin/pip install -e .
touch $(INSTALL_STAMP) touch $(INSTALL_STAMP)
.PHONY: virtualenv .PHONY: virtualenv
@ -23,9 +23,9 @@ $(PYTHON):
$(VIRTUALENV) $(VENV) $(VIRTUALENV) $(VENV)
.PHONY: install-dev .PHONY: install-dev
install-dev: $(INSTALL_STAMP) $(DEV_STAMP) ## Install development dependencies install-dev: virtualenv setup.cfg $(INSTALL_STAMP) $(DEV_STAMP) ## Install development dependencies
$(DEV_STAMP): $(PYTHON) dev-requirements.txt $(DEV_STAMP): $(PYTHON)
$(VENV)/bin/pip install -Ur dev-requirements.txt $(VENV)/bin/pip install -Ue .[dev]
touch $(DEV_STAMP) touch $(DEV_STAMP)
.PHONY: remove-install-stamp .PHONY: remove-install-stamp
@ -41,11 +41,19 @@ serve: install ## Run the ihatemoney server
$(PYTHON) -m ihatemoney.manage runserver $(PYTHON) -m ihatemoney.manage runserver
.PHONY: test .PHONY: test
test: $(DEV_STAMP) ## Run the tests test: install-dev ## Run the tests
$(VENV)/bin/tox $(VENV)/bin/tox
.PHONY: black
black: install-dev ## Run the tests
$(VENV)/bin/black --target-version=py34 .
.PHONY: isort
isort: install-dev ## Run the tests
$(VENV)/bin/isort -rc .
.PHONY: release .PHONY: release
release: $(DEV_STAMP) ## Release a new version (see https://ihatemoney.readthedocs.io/en/latest/contributing.html#how-to-release) release: install-dev ## Release a new version (see https://ihatemoney.readthedocs.io/en/latest/contributing.html#how-to-release)
$(VENV)/bin/fullrelease $(VENV)/bin/fullrelease
.PHONY: compress-assets .PHONY: compress-assets
@ -76,13 +84,6 @@ create-empty-database-revision: ## Create an empty database revision
@read -p "Please enter a message describing this revision: " rev_message; \ @read -p "Please enter a message describing this revision: " rev_message; \
$(PYTHON) -m ihatemoney.manage db revision -d ihatemoney/migrations -m "$${rev_message}" $(PYTHON) -m ihatemoney.manage db revision -d ihatemoney/migrations -m "$${rev_message}"
.PHONY: build-requirements
build-requirements: ## Save currently installed packages to requirements.txt
$(VIRTUALENV) $(TEMPDIR)
$(TEMPDIR)/bin/pip install -U pip
$(TEMPDIR)/bin/pip install -Ue "."
$(TEMPDIR)/bin/pip freeze | grep -v -- '-e' > requirements.txt
.PHONY: clean .PHONY: clean
clean: ## Destroy the virtual environment clean: ## Destroy the virtual environment
rm -rf .venv rm -rf .venv

View file

@ -5,6 +5,10 @@ I hate money
:target: https://travis-ci.org/spiral-project/ihatemoney :target: https://travis-ci.org/spiral-project/ihatemoney
:alt: Travis CI Build Status :alt: Travis CI Build 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
:alt: Translation status from Weblate
*I hate money* is a web application made to ease shared budget management. *I hate money* is a web application made to ease shared budget management.
It keeps track of who bought what, when, and for whom; and helps to settle the It keeps track of who bought what, when, and for whom; and helps to settle the
bills. bills.
@ -21,7 +25,7 @@ encouraged to do so.
Requirements Requirements
============ ============
* **Python**: 3.5, 3.6, 3.7. * **Python**: 3.6, 3.7, 3.8.
* **Backends**: MySQL, PostgreSQL, SQLite, Memory. * **Backends**: MySQL, PostgreSQL, SQLite, Memory.
Contributing Contributing
@ -31,3 +35,9 @@ Do you wish to contribute to IHateMoney? Fantastic! There's a lot of very
useful help on the official `contributing useful help on the official `contributing
<https://ihatemoney.readthedocs.io/en/latest/contributing.html>`_ page. <https://ihatemoney.readthedocs.io/en/latest/contributing.html>`_ page.
Translation status
==================
.. image:: https://hosted.weblate.org/widgets/i-hate-money/-/i-hate-money/multi-blue.svg
:target: https://hosted.weblate.org/engage/i-hate-money/?utm_source=widget
:alt: Translation status for each language

View file

@ -1,6 +0,0 @@
zest.releaser
tox
pytest
flake8
Flask-Testing
black ; python_version >= '3.6'

View file

@ -1,6 +1,3 @@
# coding: utf8
import sys, os
templates_path = ["_templates"] templates_path = ["_templates"]
source_suffix = ".rst" source_suffix = ".rst"
master_doc = "index" master_doc = "index"

View file

@ -1,84 +1,7 @@
Contributing Contributing
############ ############
Set up a dev environment .. _how-to-contribute:
=======================
You must develop on top of the Git master branch::
git clone https://github.com/spiral-project/ihatemoney.git
Then you need to build your dev environment. Choose your way…
The quick way
-------------
If System :ref:`installation-requirements` are fulfilled, you can just issue::
make serve
It will setup a `virtualenv <https://pypi.python.org/pypi/virtualenv>`_,
install dependencies, and run the test server.
The hard way
------------
Alternatively, you can also use the `requirements.txt` file to install the
dependencies yourself. That would be::
pip install -r requirements.txt
pip install -e .
And then run the application::
cd ihatemoney
python run.py
Accessing dev server
--------------------
In any case, you can point your browser at `http://localhost:5000 <http://localhost:5000>`_.
It's as simple as that!
Updating
--------
In case you want to update to newer versions (from Git), you can just run the "update" command::
make update
Create database migrations
--------------------------
In case you need to modify the database schema, first update the models in
``ihatemoney/models.py``. Then run the following command to create a new
database revision file::
make create-database-revision
If your changes are simple enough, the generated script will be populated with
the necessary migrations steps. You can edit the generated script. e.g: To add
data migrations.
For complex migrations, it is recommended to start from an empty revision file
which can be created with the following command::
make create-empty-database-revision
Useful settings
----------------
It is better to actually turn the debugging mode on when you're developing.
You can create a ``settings.cfg`` file, with the following content::
DEBUG = True
SQLACHEMY_ECHO = DEBUG
You can also set the `TESTING` flag to `True` so no mails are sent
(and no exception is raised) while you're on development mode.
Then before running the application, declare its path with ::
export IHATEMONEY_SETTINGS_FILE_PATH="$(pwd)/settings.cfg"
How to contribute How to contribute
================= =================
@ -93,21 +16,8 @@ As a developer
-------------- --------------
If you want to contribute code, you can write it and then issue a pull request If you want to contribute code, you can write it and then issue a pull request
on github. Please, think about updating and running the tests before asking for on github. To get started, please read :ref:`setup-dev-environment` and
a pull request as it will help us to maintain the code clean and running. :ref:`contributing-developer`.
To do so::
make test
We are using the `black <https://black.readthedocs.io/en/stable/>`_ formatter
for all the Python files in this project. Be sure to run it locally on your
files. To do so, just run::
black ihatemoney
You can also integrate it with your dev environment (as a *format-on-save*
hook, for instance).
As a designer / Front-end developer As a designer / Front-end developer
----------------------------------- -----------------------------------
@ -139,6 +49,143 @@ will update the issue tracker with your feedback.
Thanks again! Thanks again!
.. _setup-dev-environment:
Set up a dev environment
========================
You must develop on top of the Git master branch::
git clone https://github.com/spiral-project/ihatemoney.git
Then you need to build your dev environment. Choose your way…
The quick way
-------------
If System :ref:`installation-requirements` are fulfilled, you can just issue::
make serve
It will setup a `virtualenv <https://pypi.python.org/pypi/virtualenv>`_,
install dependencies, and run the test server.
The hard way
------------
Alternatively, you can use pip to install dependencies yourself. That would be::
pip install -e .
And then run the application::
cd ihatemoney
python run.py
Accessing dev server
--------------------
In any case, you can point your browser at `http://localhost:5000 <http://localhost:5000>`_.
It's as simple as that!
Updating
--------
In case you want to update to newer versions (from Git), you can just run the "update" command::
make update
Useful settings
----------------
It is better to actually turn the debugging mode on when you're developing.
You can create a ``settings.cfg`` file, with the following content::
DEBUG = True
SQLACHEMY_ECHO = DEBUG
You can also set the `TESTING` flag to `True` so no mails are sent
(and no exception is raised) while you're on development mode.
Then before running the application, declare its path with ::
export IHATEMONEY_SETTINGS_FILE_PATH="$(pwd)/settings.cfg"
.. _contributing-developer:
Contributing as a developer
===========================
All code contributions should be submitted as Pull Requests on the
`github project <https://github.com/spiral-project/ihatemoney>`_.
Below are some points that you should check to help you prepare your Pull Request.
Running tests
-------------
Please, think about updating and running the tests before asking for a pull request
as it will help us to maintain the code clean and running.
To run the tests::
make test
Tests can be edited in ``ihatemoney/tests/tests.py``. If some test cases fail because
of your changes, first check whether your code correctly handle these cases.
If you are confident that your code is correct and that the test cases simply need
to be updated to match your changes, update the test cases and send them as part of
your pull request.
If you are introducing a new feature, you need to either add tests to existing classes,
or add a new class (if your new feature is significantly different from existing code).
Formatting code
---------------
We are using `black <https://black.readthedocs.io/en/stable/>`_ and
`isort <https://timothycrosley.github.io/isort/>`_ formatters for all the Python
files in this project. Be sure to run it locally on your files.
To do so, just run::
make black isort
You can also integrate them with your dev environment (as a *format-on-save*
hook, for instance).
Creating database migrations
----------------------------
In case you need to modify the database schema, first make sure that you have
an up-to-date database by running the dev server at least once (the quick way
or the hard way, see above). The dev server applies all existing migrations
when starting up.
You can now update the models in ``ihatemoney/models.py``. Then run the following
command to create a new database revision file::
make create-database-revision
If your changes are simple enough, the generated script will be populated with
the necessary migrations steps. You can view and edit the generated script, which
is useful to review that the expected model changes have been properly detected.
Usually the auto-detection works well in most cases, but you can of course edit the
script to fix small issues. You could also edit the script to add data migrations.
When you are done with your changes, don't forget to add the migration script to
your final git commit!
If the migration script looks completely wrong, remove the script and start again
with an empty database. The simplest way is to remove or rename the dev database
located at ``/tmp/ihatemoney.db``, and run the dev server at least once.
For complex migrations, it is recommended to start from an empty revision file
which can be created with the following command::
make create-empty-database-revision
You then need to write the migration steps yourself.
How to build the documentation ? How to build the documentation ?
================================ ================================

View file

@ -17,7 +17,7 @@ Requirements
«Ihatemoney» depends on: «Ihatemoney» depends on:
* **Python**: either 3.5, 3.6 or 3.7 will work. * **Python**: either 3.6, 3.7 or 3.8 will work.
* **A Backend**: to choose among MySQL, PostgreSQL, SQLite or Memory. * **A Backend**: to choose among MySQL, PostgreSQL, SQLite or Memory.
* **Virtualenv** (recommended): `virtualenv` package under Debian/Ubuntu. * **Virtualenv** (recommended): `virtualenv` package under Debian/Ubuntu.

View file

@ -1,2 +1,2 @@
Sphinx==1.5.5 Sphinx==3.0.2
docutils==0.13.1 docutils==0.16

View file

@ -1,12 +1,12 @@
# coding: utf8 from functools import wraps
from flask import request, current_app
from flask import current_app, request
from flask_restful import Resource, abort from flask_restful import Resource, abort
from werkzeug.security import check_password_hash
from wtforms.fields.core import BooleanField from wtforms.fields.core import BooleanField
from ihatemoney.models import db, Project, Person, Bill from ihatemoney.forms import EditProjectForm, MemberForm, ProjectForm, get_billform_for
from ihatemoney.forms import ProjectForm, EditProjectForm, MemberForm, get_billform_for from ihatemoney.models import Bill, Person, Project, db
from werkzeug.security import check_password_hash
from functools import wraps
def need_auth(f): def need_auth(f):

View file

@ -1,17 +1,16 @@
# coding: utf8
from flask import Blueprint from flask import Blueprint
from flask_restful import Api
from flask_cors import CORS from flask_cors import CORS
from flask_restful import Api
from ihatemoney.api.common import ( from ihatemoney.api.common import (
ProjectsHandler,
ProjectHandler,
TokenHandler,
MemberHandler,
ProjectStatsHandler,
MembersHandler,
BillHandler, BillHandler,
BillsHandler, BillsHandler,
MemberHandler,
MembersHandler,
ProjectHandler,
ProjectsHandler,
ProjectStatsHandler,
TokenHandler,
) )
api = Blueprint("api", __name__, url_prefix="/api") api = Blueprint("api", __name__, url_prefix="/api")

View file

View file

@ -8,4 +8,4 @@ ACTIVATE_DEMO_PROJECT = True
ADMIN_PASSWORD = "" ADMIN_PASSWORD = ""
ALLOW_PUBLIC_PROJECT_CREATION = True ALLOW_PUBLIC_PROJECT_CREATION = True
ACTIVATE_ADMIN_DASHBOARD = False ACTIVATE_ADMIN_DASHBOARD = False
SUPPORTED_LANGUAGES = ["en", "fr", "de", "nl", "es_419"] SUPPORTED_LANGUAGES = ["en", "fr", "de", "nl", "es_419", "nb_NO", "id"]

View file

@ -1,29 +1,27 @@
from datetime import datetime
from re import match
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 flask_wtf.form import FlaskForm
from jinja2 import Markup
from werkzeug.security import check_password_hash, generate_password_hash
from wtforms.fields.core import SelectField, SelectMultipleField from wtforms.fields.core import SelectField, SelectMultipleField
from wtforms.fields.html5 import DateField, DecimalField, URLField from wtforms.fields.html5 import DateField, DecimalField, URLField
from wtforms.fields.simple import PasswordField, SubmitField, StringField, BooleanField, HiddenField from wtforms.fields.simple import BooleanField, HiddenField, PasswordField, StringField, SubmitField
from wtforms.validators import ( from wtforms.validators import (
Email,
DataRequired, DataRequired,
ValidationError, Email,
EqualTo, EqualTo,
NumberRange, NumberRange,
Optional, Optional,
ValidationError,
) )
from flask_wtf.file import FileField, FileAllowed, FileRequired
from flask_babel import lazy_gettext as _ from ihatemoney.models import LoggingMode, Person, Project
from flask import request from ihatemoney.utils import eval_arithmetic_expression, slugify
from werkzeug.security import generate_password_hash, check_password_hash
from datetime import datetime
from re import match
from jinja2 import Markup
import email_validator
from ihatemoney.models import Project, Person, LoggingMode
from ihatemoney.utils import slugify, eval_arithmetic_expression
def strip_filter(string): def strip_filter(string):

View file

@ -1,15 +1,7 @@
from flask_babel import gettext as _ from flask_babel import gettext as _
from sqlalchemy_continuum import ( from sqlalchemy_continuum import Operation, parent_class
Operation,
parent_class,
)
from ihatemoney.models import ( from ihatemoney.models import BillVersion, Person, PersonVersion, ProjectVersion
PersonVersion,
ProjectVersion,
BillVersion,
Person,
)
def get_history_queries(project): def get_history_queries(project):
@ -78,7 +70,7 @@ def get_history(project, human_readable_names=True):
for version_list in [person_query.all(), project_query.all(), bill_query.all()]: for version_list in [person_query.all(), project_query.all(), bill_query.all()]:
for version in version_list: for version in version_list:
object_type = { object_type = {
"Person": _("Person"), "Person": _("Participant"),
"Bill": _("Bill"), "Bill": _("Bill"),
"Project": _("Project"), "Project": _("Project"),
}[parent_class(type(version)).__name__] }[parent_class(type(version)).__name__]

View file

@ -1,16 +1,16 @@
#!/usr/bin/env python #!/usr/bin/env python
import getpass
import os import os
import random import random
import sys import sys
import getpass
from flask_script import Manager, Command, Option
from flask_migrate import Migrate, MigrateCommand from flask_migrate import Migrate, MigrateCommand
from flask_script import Command, Manager, Option
from werkzeug.security import generate_password_hash from werkzeug.security import generate_password_hash
from ihatemoney.models import Project, db
from ihatemoney.run import create_app from ihatemoney.run import create_app
from ihatemoney.models import db, Project
from ihatemoney.utils import create_jinja_env from ihatemoney.utils import create_jinja_env
@ -51,7 +51,7 @@ class GenerateConfig(Command):
def run(self, config_file): def run(self, config_file):
env = create_jinja_env("conf-templates", strict_rendering=True) env = create_jinja_env("conf-templates", strict_rendering=True)
template = env.get_template("%s.j2" % config_file) template = env.get_template(f"{config_file}.j2")
bin_path = os.path.dirname(sys.executable) bin_path = os.path.dirname(sys.executable)
pkg_path = os.path.abspath(os.path.dirname(__file__)) pkg_path = os.path.abspath(os.path.dirname(__file__))

View file

@ -12,6 +12,18 @@ msgstr ""
msgid "Email" msgid "Email"
msgstr "" msgstr ""
msgid "Enable project history"
msgstr ""
msgid "Use IP tracking for project history"
msgstr ""
msgid "Import previously exported JSON file"
msgstr ""
msgid "Import"
msgstr ""
msgid "Project identifier" msgid "Project identifier"
msgstr "" msgstr ""
@ -106,6 +118,15 @@ msgstr ""
msgid "The email %(email)s is not valid" msgid "The email %(email)s is not valid"
msgstr "" msgstr ""
msgid "Participant"
msgstr ""
msgid "Bill"
msgstr ""
msgid "Project"
msgstr ""
msgid "Too many failed login attempts, please retry later." msgid "Too many failed login attempts, please retry later."
msgstr "" msgstr ""
@ -139,6 +160,12 @@ msgstr ""
msgid "Password successfully reset." msgid "Password successfully reset."
msgstr "" msgstr ""
msgid "Project successfully uploaded"
msgstr ""
msgid "Invalid JSON"
msgstr ""
msgid "Project successfully deleted" msgid "Project successfully deleted"
msgstr "" msgstr ""
@ -150,7 +177,7 @@ msgid "Your invitations have been sent"
msgstr "" msgstr ""
#, python-format #, python-format
msgid "%(member)s had been added" msgid "%(member)s has been added"
msgstr "" msgstr ""
#, python-format #, python-format
@ -204,9 +231,6 @@ msgstr ""
msgid "Create a new project" msgid "Create a new project"
msgstr "" msgstr ""
msgid "Project"
msgstr ""
msgid "Number of members" msgid "Number of members"
msgstr "" msgstr ""
@ -228,6 +252,9 @@ msgstr ""
msgid "delete" msgid "delete"
msgstr "" msgstr ""
msgid "see"
msgstr ""
msgid "The Dashboard is currently deactivated." msgid "The Dashboard is currently deactivated."
msgstr "" msgstr ""
@ -237,6 +264,12 @@ msgstr ""
msgid "Edit project" msgid "Edit project"
msgstr "" msgstr ""
msgid "Import JSON"
msgstr ""
msgid "Choose file"
msgstr ""
msgid "Download project's data" msgid "Download project's data"
msgstr "" msgstr ""
@ -258,6 +291,9 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr ""
msgid "Privacy Settings"
msgstr ""
msgid "Edit the project" msgid "Edit the project"
msgstr "" msgstr ""
@ -288,6 +324,177 @@ msgstr ""
msgid "Download" msgid "Download"
msgstr "" msgstr ""
msgid "Disabled Project History"
msgstr ""
msgid "Disabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled Project History"
msgstr ""
msgid "Disabled IP Address Recording"
msgstr ""
msgid "Enabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled IP Address Recording"
msgstr ""
msgid "History Settings Changed"
msgstr ""
msgid "changed"
msgstr ""
msgid "from"
msgstr ""
msgid "to"
msgstr ""
msgid "Confirm Remove IP Adresses"
msgstr ""
msgid ""
"Are you sure you want to delete all recorded IP addresses from this "
"project?\n"
" The rest of the project history will be unaffected. This "
"action cannot be undone."
msgstr ""
msgid "Close"
msgstr ""
msgid "Confirm Delete"
msgstr ""
msgid "Delete Confirmation"
msgstr ""
msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
msgid "Added"
msgstr ""
msgid "Removed"
msgstr ""
msgid "and"
msgstr ""
msgid "owers list"
msgstr ""
msgid "Who?"
msgstr ""
msgid "Balance"
msgstr ""
#, python-format
msgid ""
"\n"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily" msgid "Manage your shared <br />expenses, easily"
msgstr "" msgstr ""
@ -335,6 +542,9 @@ msgstr ""
msgid "Statistics" msgid "Statistics"
msgstr "" msgstr ""
msgid "History"
msgstr ""
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
@ -392,6 +602,12 @@ msgstr ""
msgid "Add a new bill" msgid "Add a new bill"
msgstr "" msgstr ""
msgid "Newer bills"
msgstr ""
msgid "Older bills"
msgstr ""
msgid "When?" msgid "When?"
msgstr "" msgstr ""
@ -418,9 +634,6 @@ msgstr ""
msgid "each" msgid "each"
msgstr "" msgstr ""
msgid "see"
msgstr ""
msgid "No bills" msgid "No bills"
msgstr "" msgstr ""
@ -489,15 +702,15 @@ msgstr ""
msgid "To whom?" msgid "To whom?"
msgstr "" msgstr ""
msgid "Who?"
msgstr ""
msgid "Paid" msgid "Paid"
msgstr "" msgstr ""
msgid "Spent" msgid "Spent"
msgstr "" msgstr ""
msgid "Balance" msgid "Expenses by Month"
msgstr ""
msgid "Period"
msgstr "" msgstr ""

View file

@ -41,7 +41,7 @@ def run_migrations_offline():
""" """
url = config.get_main_option("sqlalchemy.url") url = config.get_main_option("sqlalchemy.url")
context.configure(url=url) context.configure(url=url, include_object=include_object)
with context.begin_transaction(): with context.begin_transaction():
context.run_migrations() context.run_migrations()
@ -75,6 +75,7 @@ def run_migrations_online():
context.configure( context.configure(
connection=connection, connection=connection,
target_metadata=target_metadata, target_metadata=target_metadata,
include_object=include_object,
process_revision_directives=process_revision_directives, process_revision_directives=process_revision_directives,
**current_app.extensions["migrate"].configure_args **current_app.extensions["migrate"].configure_args
) )
@ -86,6 +87,12 @@ def run_migrations_online():
connection.close() connection.close()
def include_object(object, name, type_, reflected, compare_to):
if name == "sqlite_sequence":
return False
return True
if context.is_offline_mode(): if context.is_offline_mode():
run_migrations_offline() run_migrations_offline()
else: else:

View file

@ -165,6 +165,18 @@ def upgrade():
sa.Column("remote_addr", sa.String(length=50), nullable=True), sa.Column("remote_addr", sa.String(length=50), nullable=True),
sa.PrimaryKeyConstraint("id"), sa.PrimaryKeyConstraint("id"),
) )
bind = op.get_bind()
if bind.engine.name == "sqlite":
with op.batch_alter_table("project", recreate="always") as batch_op:
batch_op.add_column(
sa.Column(
"logging_preference",
sa.Enum("DISABLED", "ENABLED", "RECORD_IP", name="loggingmode"),
server_default="ENABLED",
nullable=False,
),
)
else:
op.add_column( op.add_column(
"project", "project",
sa.Column( sa.Column(
@ -179,6 +191,12 @@ def upgrade():
def downgrade(): def downgrade():
# ### commands auto generated by Alembic - please adjust! ### # ### commands auto generated by Alembic - please adjust! ###
bind = op.get_bind()
if bind.engine.name == "sqlite":
with op.batch_alter_table("project", recreate="always") as batch_op:
batch_op.drop_column("logging_preference")
else:
op.drop_column("project", "logging_preference") op.drop_column("project", "logging_preference")
op.drop_table("transaction") op.drop_table("transaction")
op.drop_index( op.drop_index(

View file

@ -15,6 +15,8 @@ import sqlalchemy as sa
def upgrade(): def upgrade():
bind = op.get_bind()
if bind.engine.name == "sqlite":
alter_table_batches = [ alter_table_batches = [
op.batch_alter_table( op.batch_alter_table(
"person", recreate="always", table_kwargs={"sqlite_autoincrement": True} "person", recreate="always", table_kwargs={"sqlite_autoincrement": True}
@ -23,7 +25,9 @@ def upgrade():
"bill", recreate="always", table_kwargs={"sqlite_autoincrement": True} "bill", recreate="always", table_kwargs={"sqlite_autoincrement": True}
), ),
op.batch_alter_table( op.batch_alter_table(
"billowers", recreate="always", table_kwargs={"sqlite_autoincrement": True} "billowers",
recreate="always",
table_kwargs={"sqlite_autoincrement": True},
), ),
] ]
@ -33,15 +37,21 @@ def upgrade():
def downgrade(): def downgrade():
bind = op.get_bind()
if bind.engine.name == "sqlite":
alter_table_batches = [ alter_table_batches = [
op.batch_alter_table( op.batch_alter_table(
"person", recreate="always", table_kwargs={"sqlite_autoincrement": False} "person",
recreate="always",
table_kwargs={"sqlite_autoincrement": False},
), ),
op.batch_alter_table( op.batch_alter_table(
"bill", recreate="always", table_kwargs={"sqlite_autoincrement": False} "bill", recreate="always", table_kwargs={"sqlite_autoincrement": False}
), ),
op.batch_alter_table( op.batch_alter_table(
"billowers", recreate="always", table_kwargs={"sqlite_autoincrement": False} "billowers",
recreate="always",
table_kwargs={"sqlite_autoincrement": False},
), ),
] ]

View file

@ -1,33 +1,29 @@
from collections import defaultdict from collections import defaultdict
from datetime import datetime from datetime import datetime
import sqlalchemy
from flask_sqlalchemy import SQLAlchemy, BaseQuery
from flask import g, current_app
from debts import settle from debts import settle
from sqlalchemy import orm from flask import current_app, g
from sqlalchemy.sql import func from flask_sqlalchemy import BaseQuery, SQLAlchemy
from itsdangerous import ( from itsdangerous import (
TimedJSONWebSignatureSerializer,
URLSafeSerializer,
BadSignature, BadSignature,
SignatureExpired, SignatureExpired,
TimedJSONWebSignatureSerializer,
URLSafeSerializer,
) )
from sqlalchemy_continuum import make_versioned import sqlalchemy
from sqlalchemy import orm
from sqlalchemy.sql import func
from sqlalchemy_continuum import make_versioned, version_class
from sqlalchemy_continuum.plugins import FlaskPlugin from sqlalchemy_continuum.plugins import FlaskPlugin
from sqlalchemy_continuum import version_class
from ihatemoney.patch_sqlalchemy_continuum import PatchedBuilder from ihatemoney.patch_sqlalchemy_continuum import PatchedBuilder
from ihatemoney.versioning import ( from ihatemoney.versioning import (
LoggingMode,
ConditionalVersioningManager, ConditionalVersioningManager,
version_privacy_predicate, LoggingMode,
get_ip_if_allowed, get_ip_if_allowed,
version_privacy_predicate,
) )
make_versioned( make_versioned(
user_cls=None, user_cls=None,
manager=ConditionalVersioningManager( manager=ConditionalVersioningManager(
@ -327,7 +323,7 @@ class Project(db.Model):
return self.name return self.name
def __repr__(self): def __repr__(self):
return "<Project %s>" % self.name return f"<Project {self.name}>"
class Person(db.Model): class Person(db.Model):
@ -385,7 +381,7 @@ class Person(db.Model):
return self.name return self.name
def __repr__(self): def __repr__(self):
return "<Person %s for project %s>" % (self.name, self.project.name) return f"<Person {self.name} for project {self.project.name}>"
# We need to manually define a join table for m2m relations # We need to manually define a join table for m2m relations
@ -466,13 +462,12 @@ class Bill(db.Model):
return 0 return 0
def __str__(self): def __str__(self):
return "%s for %s" % (self.amount, self.what) return self.what
def __repr__(self): def __repr__(self):
return "<Bill of %s from %s for %s>" % ( return (
self.amount, f"<Bill of {self.amount} from {self.payer} for "
self.payer, f"{', '.join([o.name for o in self.owers])}>"
", ".join([o.name for o in self.owers]),
) )

View file

@ -38,7 +38,7 @@ from sqlalchemy_continuum import Operation
from sqlalchemy_continuum.builder import Builder from sqlalchemy_continuum.builder import Builder
from sqlalchemy_continuum.expression_reflector import VersionExpressionReflector from sqlalchemy_continuum.expression_reflector import VersionExpressionReflector
from sqlalchemy_continuum.relationship_builder import RelationshipBuilder from sqlalchemy_continuum.relationship_builder import RelationshipBuilder
from sqlalchemy_continuum.utils import option, adapt_columns from sqlalchemy_continuum.utils import adapt_columns, option
class PatchedRelationShipBuilder(RelationshipBuilder): class PatchedRelationShipBuilder(RelationshipBuilder):

View file

@ -2,12 +2,13 @@ import os
import os.path import os.path
import warnings import warnings
from flask import Flask, g, request, session, render_template from flask import Flask, g, render_template, request, session
from flask_babel import Babel from flask_babel import Babel
from flask_mail import Mail from flask_mail import Mail
from flask_migrate import Migrate, upgrade, stamp from flask_migrate import Migrate, stamp, upgrade
from werkzeug.middleware.proxy_fix import ProxyFix from werkzeug.middleware.proxy_fix import ProxyFix
from ihatemoney import default_settings
from ihatemoney.api.v1 import api as apiv1 from ihatemoney.api.v1 import api as apiv1
from ihatemoney.models import db from ihatemoney.models import db
from ihatemoney.utils import ( from ihatemoney.utils import (
@ -19,8 +20,6 @@ from ihatemoney.utils import (
) )
from ihatemoney.web import main as web_interface from ihatemoney.web import main as web_interface
from ihatemoney import default_settings
def setup_database(app): def setup_database(app):
"""Prepare the database. Create tables, run migrations etc.""" """Prepare the database. Create tables, run migrations etc."""

View file

@ -10,4 +10,5 @@
<div class="col-xs-12 col-sm-5 col-md-4 offset-md-2"> <div class="col-xs-12 col-sm-5 col-md-4 offset-md-2">
<a href='{{ url_for("main.home") }}'>{{ _("The best thing to do is probably to get back to the main page.")}}</a> <a href='{{ url_for("main.home") }}'>{{ _("The best thing to do is probably to get back to the main page.")}}</a>
</div> </div>
</main>
{% endblock %} {% endblock %}

View file

@ -124,18 +124,25 @@
{% if current_log_pref == LoggingMode.DISABLED or (current_log_pref != LoggingMode.RECORD_IP and any_ip_addresses) %} {% if current_log_pref == LoggingMode.DISABLED or (current_log_pref != LoggingMode.RECORD_IP and any_ip_addresses) %}
<div id="history_warnings" class="card card-body bg-light"> <div id="history_warnings" class="card card-body bg-light">
{% if current_log_pref == LoggingMode.DISABLED %} {% if current_log_pref == LoggingMode.DISABLED %}
<p> <p>{% set url = url_for(".edit_project") %}
<i>{{ _("This project has history disabled. New actions won't appear below. You can enable history on the") }}</i> {% trans %}
<a href="{{ url_for(".edit_project") }}">{{ _("settings page") }}</a> <i>This project has history disabled. New actions won't appear below. You can enable history on the</i>
<a href="{{ url }}">settings page</a>
{% endtrans %}
</p> </p>
{% if history %} {% if history %}
<p><i>{{ _("The table below reflects actions recorded prior to disabling project history. You can ") }} <p>
<a href="#" data-toggle="modal" data-keyboard="false" data-target="#confirm-erase">{{ _("clear project history") }}</a> {{ _("to remove them.") }}</i></p> {% trans %}
<i>The table below reflects actions recorded prior to disabling project history. You can
<a href="#" data-toggle="modal" data-keyboard="false" data-target="#confirm-erase">clear project history</a> to remove them.</i></p>
{% endtrans %}
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if current_log_pref != LoggingMode.RECORD_IP and any_ip_addresses %} {% if current_log_pref != LoggingMode.RECORD_IP and any_ip_addresses %}
<p><i>{{ _("Some entries below contain IP addresses, even though this project has IP recording disabled. ") }} <p>
<a href="#" data-toggle="modal" data-keyboard="false" data-target="#confirm-ip-delete">{{ _("Delete stored IP addresses") }}</a></i></p> <i>{{ _("Some entries below contain IP addresses, even though this project has IP recording disabled. ") }}
<a href="#" data-toggle="modal" data-keyboard="false" data-target="#confirm-ip-delete">{{ _("Delete stored IP addresses") }}</a></i>
</p>
{% endif %} {% endif %}
</div> </div>
{% endif %} {% endif %}
@ -160,10 +167,11 @@
<th style="width: 15%">{{ _("Time") }}</th> <th style="width: 15%">{{ _("Time") }}</th>
<th style="width: 65%">{{ _("Event") }}</th> <th style="width: 65%">{{ _("Event") }}</th>
<th style="width: 20%"> <th style="width: 20%">
<span data-toggle="tooltip" title="{{_('IP address recording can be') }} <span data-toggle="tooltip" title="{% if current_log_pref != LoggingMode.RECORD_IP %}
{% if current_log_pref != LoggingMode.RECORD_IP %} {{_('IP address recording can be enabled on the settings page') }}
{{ _("enabled") }}{% else %}{{ _("disabled") }}{% endif %} {% else %}
{{ _('on the Settings page') }}"> {{_('IP address recording can be disabled on the settings page') }}
{% endif %}">
{{ _("From IP") }}</span></th> {{ _("From IP") }}</span></th>
</tr></thead> </tr></thead>
<tbody> <tbody>
@ -201,7 +209,7 @@
{{ event.object_type }} <em class="font-italic">{{ event.object_desc }}</em> {{ event.object_type }} <em class="font-italic">{{ event.object_desc }}</em>
{% if event.val_after == False %}{{ _("deactivated") }}{% else %}{{ _("reactivated") }}{% endif %} {% if event.val_after == False %}{{ _("deactivated") }}{% else %}{{ _("reactivated") }}{% endif %}
{% elif event.prop_changed == "name" or event.prop_changed == "what" %} {% elif event.prop_changed == "name" or event.prop_changed == "what" %}
{{ describe_object(event) }} {{ _("renamed") }} {{ _("to") }} <em class="font-italic">{{ event.val_after }}</em> {{ describe_object(event) }} {{ _("renamed to") }} <em class="font-italic">{{ event.val_after }}</em>
{% elif event.prop_changed == "weight" %} {% elif event.prop_changed == "weight" %}
{{ simple_property_change(event, _("Weight")) }} {{ simple_property_change(event, _("Weight")) }}
{% elif event.prop_changed == "external_link" %} {% elif event.prop_changed == "external_link" %}
@ -240,8 +248,7 @@
<i class="icon icon-white hand-holding-heart">{{ static_include("images/hand-holding-heart.svg") | safe }}</i> <i class="icon icon-white hand-holding-heart">{{ static_include("images/hand-holding-heart.svg") | safe }}</i>
<h3>{{ _('Nothing to list')}}</h3> <h3>{{ _('Nothing to list')}}</h3>
<p> <p>
{{ _("Someone probably") }}<br /> {{ _("Someone probably cleared the project history.") }}
{{ _("cleared the project history.") }}
</p> </p>
</div> </div>
</div></div> </div></div>

View file

@ -1,26 +1,22 @@
# coding: utf8 import base64
from collections import defaultdict
import datetime
import io
import json
import os
from time import sleep
import unittest import unittest
from unittest.mock import patch from unittest.mock import patch
import datetime
import os
import io
import json
import base64
from collections import defaultdict
from time import sleep
from werkzeug.security import generate_password_hash, check_password_hash
from flask import session from flask import session
from flask_testing import TestCase from flask_testing import TestCase
from ihatemoney.run import create_app, db, load_configuration
from ihatemoney.manage import GenerateConfig, GeneratePasswordHash, DeleteProject
from ihatemoney import models, history
from ihatemoney.versioning import LoggingMode
from ihatemoney import utils
from sqlalchemy import orm from sqlalchemy import orm
from werkzeug.security import check_password_hash, generate_password_hash
from ihatemoney import history, models, utils
from ihatemoney.manage import DeleteProject, GenerateConfig, GeneratePasswordHash
from ihatemoney.run import create_app, db, load_configuration
from ihatemoney.versioning import LoggingMode
# Unset configuration file env var if previously set # Unset configuration file env var if previously set
os.environ.pop("IHATEMONEY_SETTINGS_FILE_PATH", None) os.environ.pop("IHATEMONEY_SETTINGS_FILE_PATH", None)
@ -62,7 +58,7 @@ class BaseTestCase(TestCase):
"name": name, "name": name,
"id": name, "id": name,
"password": name, "password": name,
"contact_email": "%s@notmyidea.org" % name, "contact_email": f"{name}@notmyidea.org",
}, },
) )
@ -71,7 +67,7 @@ class BaseTestCase(TestCase):
id=name, id=name,
name=str(name), name=str(name),
password=generate_password_hash(name), password=generate_password_hash(name),
contact_email="%s@notmyidea.org" % name, contact_email=f"{name}@notmyidea.org",
) )
models.db.session.add(project) models.db.session.add(project)
models.db.session.commit() models.db.session.commit()
@ -86,7 +82,7 @@ class IhatemoneyTestCase(BaseTestCase):
return self.assertEqual( return self.assertEqual(
expected, expected,
resp.status_code, resp.status_code,
"%s expected %s, got %s" % (url, expected, resp.status_code), f"{url} expected {expected}, got {resp.status_code}",
) )
@ -413,7 +409,7 @@ class BudgetTestCase(IhatemoneyTestCase):
) )
# remove fred # remove fred
self.client.post("/raclette/members/%s/delete" % fred_id) self.client.post(f"/raclette/members/{fred_id}/delete")
# he is still in the database, but is deactivated # he is still in the database, but is deactivated
self.assertEqual(len(models.Project.query.get("raclette").members), 2) self.assertEqual(len(models.Project.query.get("raclette").members), 2)
@ -423,7 +419,7 @@ class BudgetTestCase(IhatemoneyTestCase):
# a bill or displaying the balance # a bill or displaying the balance
result = self.client.get("/raclette/") result = self.client.get("/raclette/")
self.assertNotIn( self.assertNotIn(
("/raclette/members/%s/delete" % fred_id), result.data.decode("utf-8") (f"/raclette/members/{fred_id}/delete"), result.data.decode("utf-8")
) )
result = self.client.get("/raclette/add") result = self.client.get("/raclette/add")
@ -622,7 +618,7 @@ class BudgetTestCase(IhatemoneyTestCase):
# edit the bill # edit the bill
self.client.post( self.client.post(
"/raclette/edit/%s" % bill.id, f"/raclette/edit/{bill.id}",
data={ data={
"date": "2011-08-10", "date": "2011-08-10",
"what": "fromage à raclette", "what": "fromage à raclette",
@ -636,7 +632,7 @@ class BudgetTestCase(IhatemoneyTestCase):
self.assertEqual(bill.amount, 10, "bill edition") self.assertEqual(bill.amount, 10, "bill edition")
# delete the bill # delete the bill
self.client.get("/raclette/delete/%s" % bill.id) self.client.get(f"/raclette/delete/{bill.id}")
self.assertEqual(0, len(models.Bill.query.all()), "bill deletion") self.assertEqual(0, len(models.Bill.query.all()), "bill deletion")
# test balance # test balance
@ -1082,7 +1078,7 @@ class BudgetTestCase(IhatemoneyTestCase):
self.assertNotEqual( self.assertNotEqual(
0.0, 0.0,
rounded_amount, rounded_amount,
msg="%f is equal to zero after rounding" % t["amount"], msg=f"{t['amount']} is equal to zero after rounding",
) )
def test_export(self): def test_export(self):
@ -1428,7 +1424,7 @@ class APITestCase(IhatemoneyTestCase):
def api_create(self, name, id=None, password=None, contact=None): def api_create(self, name, id=None, password=None, contact=None):
id = id or name id = id or name
password = password or name password = password or name
contact = contact or "%s@notmyidea.org" % name contact = contact or f"{name}@notmyidea.org"
return self.client.post( return self.client.post(
"/api/projects", "/api/projects",
@ -1442,7 +1438,7 @@ class APITestCase(IhatemoneyTestCase):
def api_add_member(self, project, name, weight=1): def api_add_member(self, project, name, weight=1):
self.client.post( self.client.post(
"/api/projects/%s/members" % project, f"/api/projects/{project}/members",
data={"name": name, "weight": weight}, data={"name": name, "weight": weight},
headers=self.get_auth(project), headers=self.get_auth(project),
) )
@ -1450,11 +1446,11 @@ class APITestCase(IhatemoneyTestCase):
def get_auth(self, username, password=None): def get_auth(self, username, password=None):
password = password or username password = password or username
base64string = ( base64string = (
base64.encodebytes(("%s:%s" % (username, password)).encode("utf-8")) base64.encodebytes(f"{username}:{password}".encode("utf-8"))
.decode("utf-8") .decode("utf-8")
.replace("\n", "") .replace("\n", "")
) )
return {"Authorization": "Basic %s" % base64string} return {"Authorization": f"Basic {base64string}"}
def test_cors_requests(self): def test_cors_requests(self):
# Create a project and test that CORS headers are present if requested. # Create a project and test that CORS headers are present if requested.
@ -1610,7 +1606,7 @@ class APITestCase(IhatemoneyTestCase):
# Access with token # Access with token
resp = self.client.get( resp = self.client.get(
"/api/projects/raclette/token", "/api/projects/raclette/token",
headers={"Authorization": "Basic %s" % decoded_resp["token"]}, headers={"Authorization": f"Basic {decoded_resp['token']}"},
) )
self.assertEqual(200, resp.status_code) self.assertEqual(200, resp.status_code)
@ -2139,10 +2135,10 @@ class APITestCase(IhatemoneyTestCase):
resp = self.client.get("/raclette/history", follow_redirects=True) resp = self.client.get("/raclette/history", follow_redirects=True)
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
self.assertIn( self.assertIn(
"Person %s added" % em_surround("alexis"), resp.data.decode("utf-8") f"Participant {em_surround('alexis')} added", resp.data.decode("utf-8")
) )
self.assertIn( self.assertIn(
"Project %s added" % em_surround("raclette"), resp.data.decode("utf-8"), f"Project {em_surround('raclette')} added", resp.data.decode("utf-8"),
) )
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 2) self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 2)
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8")) self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
@ -2278,7 +2274,7 @@ class HistoryTestCase(IhatemoneyTestCase):
resp = self.client.get("/demo/history") resp = self.client.get("/demo/history")
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
self.assertIn( self.assertIn(
"Project %s added" % em_surround("demo"), resp.data.decode("utf-8"), f"Project {em_surround('demo')} added", resp.data.decode("utf-8"),
) )
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 1) self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 1)
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8")) self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
@ -2334,7 +2330,7 @@ class HistoryTestCase(IhatemoneyTestCase):
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8")) self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
self.assertNotIn("<td> -- </td>", resp.data.decode("utf-8")) self.assertNotIn("<td> -- </td>", resp.data.decode("utf-8"))
self.assertNotIn( self.assertNotIn(
"Project %s added" % em_surround("demo"), resp.data.decode("utf-8") f"Project {em_surround('demo')} added", resp.data.decode("utf-8")
) )
def test_project_edit(self): def test_project_edit(self):
@ -2350,18 +2346,16 @@ class HistoryTestCase(IhatemoneyTestCase):
resp = self.client.get("/demo/history") resp = self.client.get("/demo/history")
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
self.assertIn(f"Project {em_surround('demo')} added", resp.data.decode("utf-8"))
self.assertIn( self.assertIn(
"Project %s added" % em_surround("demo"), resp.data.decode("utf-8") f"Project contact email changed to {em_surround('demo2@notmyidea.org')}",
)
self.assertIn(
"Project contact email changed to %s" % em_surround("demo2@notmyidea.org"),
resp.data.decode("utf-8"), resp.data.decode("utf-8"),
) )
self.assertIn( self.assertIn(
"Project private code changed", resp.data.decode("utf-8"), "Project private code changed", resp.data.decode("utf-8"),
) )
self.assertIn( self.assertIn(
"Project renamed to %s" % em_surround("demo2"), resp.data.decode("utf-8"), f"Project renamed to {em_surround('demo2')}", resp.data.decode("utf-8"),
) )
self.assertLess( self.assertLess(
resp.data.decode("utf-8").index("Project renamed "), resp.data.decode("utf-8").index("Project renamed "),
@ -2477,7 +2471,7 @@ class HistoryTestCase(IhatemoneyTestCase):
# edit the bill # edit the bill
resp = self.client.post( resp = self.client.post(
"/demo/edit/%i" % bill_id, f"/demo/edit/{bill_id}",
data={ data={
"date": "2011-08-10", "date": "2011-08-10",
"what": "fromage à raclette", "what": "fromage à raclette",
@ -2489,12 +2483,12 @@ class HistoryTestCase(IhatemoneyTestCase):
) )
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
# delete the bill # delete the bill
resp = self.client.get("/demo/delete/%i" % bill_id, follow_redirects=True) resp = self.client.get(f"/demo/delete/{bill_id}", follow_redirects=True)
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
# delete user using POST method # delete user using POST method
resp = self.client.post( resp = self.client.post(
"/demo/members/%i/delete" % user_id, follow_redirects=True f"/demo/members/{user_id}/delete", follow_redirects=True
) )
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
@ -2596,7 +2590,7 @@ class HistoryTestCase(IhatemoneyTestCase):
resp = self.client.get("/demo/history") resp = self.client.get("/demo/history")
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
self.assertIn( self.assertIn(
"Person %s added" % em_surround("alexis"), resp.data.decode("utf-8") f"Participant {em_surround('alexis')} added", resp.data.decode("utf-8")
) )
# create a bill # create a bill
@ -2616,7 +2610,7 @@ class HistoryTestCase(IhatemoneyTestCase):
resp = self.client.get("/demo/history") resp = self.client.get("/demo/history")
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
self.assertIn( self.assertIn(
"Bill %s added" % em_surround("25.0 for fromage à raclette"), f"Bill {em_surround('fromage à raclette')} added",
resp.data.decode("utf-8"), resp.data.decode("utf-8"),
) )
@ -2637,26 +2631,26 @@ class HistoryTestCase(IhatemoneyTestCase):
resp = self.client.get("/demo/history") resp = self.client.get("/demo/history")
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
self.assertIn( self.assertIn(
"Bill %s added" % em_surround("25.0 for fromage à raclette"), f"Bill {em_surround('fromage à raclette')} added",
resp.data.decode("utf-8"), resp.data.decode("utf-8"),
) )
self.assertRegex( self.assertRegex(
resp.data.decode("utf-8"), resp.data.decode("utf-8"),
r"Bill %s:\s* Amount changed\s* from %s\s* to %s" r"Bill %s:\s* Amount changed\s* from %s\s* to %s"
% ( % (
em_surround("25.0 for fromage à raclette", regex_escape=True), em_surround("fromage à raclette", regex_escape=True),
em_surround("25.0", regex_escape=True), em_surround("25.0", regex_escape=True),
em_surround("10.0", regex_escape=True), em_surround("10.0", regex_escape=True),
), ),
) )
self.assertIn( self.assertIn(
"Bill %s renamed to %s" "Bill %s renamed to %s"
% (em_surround("25.0 for fromage à raclette"), em_surround("new thing"),), % (em_surround("fromage à raclette"), em_surround("new thing"),),
resp.data.decode("utf-8"), resp.data.decode("utf-8"),
) )
self.assertLess( self.assertLess(
resp.data.decode("utf-8").index( resp.data.decode("utf-8").index(
"Bill %s renamed to" % em_surround("25.0 for fromage à raclette") f"Bill {em_surround('fromage à raclette')} renamed to"
), ),
resp.data.decode("utf-8").index("Amount changed"), resp.data.decode("utf-8").index("Amount changed"),
) )
@ -2668,8 +2662,7 @@ class HistoryTestCase(IhatemoneyTestCase):
resp = self.client.get("/demo/history") resp = self.client.get("/demo/history")
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
self.assertIn( self.assertIn(
"Bill %s removed" % em_surround("10.0 for new thing"), f"Bill {em_surround('new thing')} removed", resp.data.decode("utf-8"),
resp.data.decode("utf-8"),
) )
# edit user # edit user
@ -2684,7 +2677,7 @@ class HistoryTestCase(IhatemoneyTestCase):
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
self.assertRegex( self.assertRegex(
resp.data.decode("utf-8"), resp.data.decode("utf-8"),
r"Person %s:\s* Weight changed\s* from %s\s* to %s" r"Participant %s:\s* Weight changed\s* from %s\s* to %s"
% ( % (
em_surround("alexis", regex_escape=True), em_surround("alexis", regex_escape=True),
em_surround("1.0", regex_escape=True), em_surround("1.0", regex_escape=True),
@ -2692,13 +2685,13 @@ class HistoryTestCase(IhatemoneyTestCase):
), ),
) )
self.assertIn( self.assertIn(
"Person %s renamed to %s" "Participant %s renamed to %s"
% (em_surround("alexis"), em_surround("new name"),), % (em_surround("alexis"), em_surround("new name"),),
resp.data.decode("utf-8"), resp.data.decode("utf-8"),
) )
self.assertLess( self.assertLess(
resp.data.decode("utf-8").index( resp.data.decode("utf-8").index(
"Person %s renamed" % em_surround("alexis") f"Participant {em_surround('alexis')} renamed"
), ),
resp.data.decode("utf-8").index("Weight changed"), resp.data.decode("utf-8").index("Weight changed"),
) )
@ -2710,7 +2703,7 @@ class HistoryTestCase(IhatemoneyTestCase):
resp = self.client.get("/demo/history") resp = self.client.get("/demo/history")
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
self.assertIn( self.assertIn(
"Person %s removed" % em_surround("new name"), resp.data.decode("utf-8") f"Participant {em_surround('new name')} removed", resp.data.decode("utf-8")
) )
def test_double_bill_double_person_edit_second(self): def test_double_bill_double_person_edit_second(self):
@ -2763,9 +2756,8 @@ class HistoryTestCase(IhatemoneyTestCase):
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
self.assertRegex( self.assertRegex(
resp.data.decode("utf-8"), resp.data.decode("utf-8"),
r"Bill %s:\s* Amount changed\s* from %s\s* to %s" r"Bill {}:\s* Amount changed\s* from {}\s* to {}".format(
% ( em_surround("Bill 1", regex_escape=True),
em_surround("25.0 for Bill 1", regex_escape=True),
em_surround("25.0", regex_escape=True), em_surround("25.0", regex_escape=True),
em_surround("88.0", regex_escape=True), em_surround("88.0", regex_escape=True),
), ),
@ -2773,8 +2765,7 @@ class HistoryTestCase(IhatemoneyTestCase):
self.assertNotRegex( self.assertNotRegex(
resp.data.decode("utf-8"), resp.data.decode("utf-8"),
r"Removed\s* %s\s* and\s* %s\s* from\s* owers list" r"Removed\s* {}\s* and\s* {}\s* from\s* owers list".format(
% (
em_surround("User 1", regex_escape=True), em_surround("User 1", regex_escape=True),
em_surround("User 2", regex_escape=True), em_surround("User 2", regex_escape=True),
), ),
@ -2809,12 +2800,9 @@ class HistoryTestCase(IhatemoneyTestCase):
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 5) self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 5)
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8")) self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
self.assertIn(f"Bill {em_surround('Bill 1')} added", resp.data.decode("utf-8"))
self.assertIn( self.assertIn(
"Bill %s added" % em_surround("25.0 for Bill 1"), resp.data.decode("utf-8") f"Bill {em_surround('Bill 1')} removed", resp.data.decode("utf-8"),
)
self.assertIn(
"Bill %s removed" % em_surround("25.0 for Bill 1"),
resp.data.decode("utf-8"),
) )
# Add a new bill # Add a new bill
@ -2833,21 +2821,13 @@ class HistoryTestCase(IhatemoneyTestCase):
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 6) self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 6)
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8")) self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
self.assertIn( self.assertIn(f"Bill {em_surround('Bill 1')} added", resp.data.decode("utf-8"))
"Bill %s added" % em_surround("25.0 for Bill 1"), resp.data.decode("utf-8")
)
self.assertEqual( self.assertEqual(
resp.data.decode("utf-8").count( resp.data.decode("utf-8").count(f"Bill {em_surround('Bill 1')} added"), 1,
"Bill %s added" % em_surround("25.0 for Bill 1")
),
1,
) )
self.assertIn(f"Bill {em_surround('Bill 2')} added", resp.data.decode("utf-8"))
self.assertIn( self.assertIn(
"Bill %s added" % em_surround("20.0 for Bill 2"), resp.data.decode("utf-8") f"Bill {em_surround('Bill 1')} removed", resp.data.decode("utf-8"),
)
self.assertIn(
"Bill %s removed" % em_surround("25.0 for Bill 1"),
resp.data.decode("utf-8"),
) )
def test_double_bill_double_person_edit_second_no_web(self): def test_double_bill_double_person_edit_second_no_web(self):

Binary file not shown.

View file

@ -1,16 +1,18 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-24 18:27+0200\n" "POT-Creation-Date: 2020-04-25 13:02+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: cs\n" "Language: cs\n"
"Language-Team: none\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2)\n"
"MIME-Version: 1.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" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Translate Toolkit 2.4.0\n" "Generated-By: Babel 2.8.0\n"
msgid "" msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are " "Not a valid amount or expression. Only numbers and + - * / operators are "
@ -26,6 +28,18 @@ msgstr ""
msgid "Email" msgid "Email"
msgstr "" msgstr ""
msgid "Enable project history"
msgstr ""
msgid "Use IP tracking for project history"
msgstr ""
msgid "Import previously exported JSON file"
msgstr ""
msgid "Import"
msgstr ""
msgid "Project identifier" msgid "Project identifier"
msgstr "" msgstr ""
@ -120,6 +134,15 @@ msgstr ""
msgid "The email %(email)s is not valid" msgid "The email %(email)s is not valid"
msgstr "" msgstr ""
msgid "Participant"
msgstr ""
msgid "Bill"
msgstr ""
msgid "Project"
msgstr ""
msgid "Too many failed login attempts, please retry later." msgid "Too many failed login attempts, please retry later."
msgstr "" msgstr ""
@ -153,6 +176,12 @@ msgstr ""
msgid "Password successfully reset." msgid "Password successfully reset."
msgstr "" msgstr ""
msgid "Project successfully uploaded"
msgstr ""
msgid "Invalid JSON"
msgstr ""
msgid "Project successfully deleted" msgid "Project successfully deleted"
msgstr "" msgstr ""
@ -164,7 +193,7 @@ msgid "Your invitations have been sent"
msgstr "" msgstr ""
#, python-format #, python-format
msgid "%(member)s had been added" msgid "%(member)s has been added"
msgstr "" msgstr ""
#, python-format #, python-format
@ -218,9 +247,6 @@ msgstr ""
msgid "Create a new project" msgid "Create a new project"
msgstr "" msgstr ""
msgid "Project"
msgstr ""
msgid "Number of members" msgid "Number of members"
msgstr "" msgstr ""
@ -242,6 +268,9 @@ msgstr ""
msgid "delete" msgid "delete"
msgstr "" msgstr ""
msgid "see"
msgstr ""
msgid "The Dashboard is currently deactivated." msgid "The Dashboard is currently deactivated."
msgstr "" msgstr ""
@ -251,6 +280,12 @@ msgstr ""
msgid "Edit project" msgid "Edit project"
msgstr "" msgstr ""
msgid "Import JSON"
msgstr ""
msgid "Choose file"
msgstr ""
msgid "Download project's data" msgid "Download project's data"
msgstr "" msgstr ""
@ -272,6 +307,9 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr ""
msgid "Privacy Settings"
msgstr ""
msgid "Edit the project" msgid "Edit the project"
msgstr "" msgstr ""
@ -302,6 +340,177 @@ msgstr ""
msgid "Download" msgid "Download"
msgstr "" msgstr ""
msgid "Disabled Project History"
msgstr ""
msgid "Disabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled Project History"
msgstr ""
msgid "Disabled IP Address Recording"
msgstr ""
msgid "Enabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled IP Address Recording"
msgstr ""
msgid "History Settings Changed"
msgstr ""
msgid "changed"
msgstr ""
msgid "from"
msgstr ""
msgid "to"
msgstr ""
msgid "Confirm Remove IP Adresses"
msgstr ""
msgid ""
"Are you sure you want to delete all recorded IP addresses from this "
"project?\n"
" The rest of the project history will be unaffected. This "
"action cannot be undone."
msgstr ""
msgid "Close"
msgstr ""
msgid "Confirm Delete"
msgstr ""
msgid "Delete Confirmation"
msgstr ""
msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
msgid "Added"
msgstr ""
msgid "Removed"
msgstr ""
msgid "and"
msgstr ""
msgid "owers list"
msgstr ""
msgid "Who?"
msgstr ""
msgid "Balance"
msgstr ""
#, python-format
msgid ""
"\n"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily" msgid "Manage your shared <br />expenses, easily"
msgstr "" msgstr ""
@ -349,6 +558,9 @@ msgstr ""
msgid "Statistics" msgid "Statistics"
msgstr "" msgstr ""
msgid "History"
msgstr ""
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
@ -406,6 +618,12 @@ msgstr ""
msgid "Add a new bill" msgid "Add a new bill"
msgstr "" msgstr ""
msgid "Newer bills"
msgstr ""
msgid "Older bills"
msgstr ""
msgid "When?" msgid "When?"
msgstr "" msgstr ""
@ -432,9 +650,6 @@ msgstr ""
msgid "each" msgid "each"
msgstr "" msgstr ""
msgid "see"
msgstr ""
msgid "No bills" msgid "No bills"
msgstr "" msgstr ""
@ -503,14 +718,14 @@ msgstr ""
msgid "To whom?" msgid "To whom?"
msgstr "" msgstr ""
msgid "Who?"
msgstr ""
msgid "Paid" msgid "Paid"
msgstr "" msgstr ""
msgid "Spent" msgid "Spent"
msgstr "" msgstr ""
msgid "Balance" msgid "Expenses by Month"
msgstr ""
msgid "Period"
msgstr "" msgstr ""

View file

@ -1,25 +1,26 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-12 09:58+0200\n" "POT-Creation-Date: 2020-04-25 13:02+0200\n"
"PO-Revision-Date: 2020-02-12 10:50+0000\n" "PO-Revision-Date: 2020-02-12 10:50+0000\n"
"Last-Translator: flolilo <flolilo@mailbox.org>\n" "Last-Translator: flolilo <flolilo@mailbox.org>\n"
"Language-Team: German <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/de/>\n"
"Language: 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" "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" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Generated-By: Babel 2.8.0\n"
"X-Generator: Weblate 3.11-dev\n"
msgid "" msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are " "Not a valid amount or expression. Only numbers and + - * / operators are "
"accepted." "accepted."
msgstr "" msgstr ""
"Kein gültiger Betrag oder Ausdruck. Es werden nur Zahlen und die Operatoren +" "Kein gültiger Betrag oder Ausdruck. Es werden nur Zahlen und die "
" - * / akzeptiert." "Operatoren + - * / akzeptiert."
msgid "Project name" msgid "Project name"
msgstr "Projektname" msgstr "Projektname"
@ -30,6 +31,18 @@ msgstr "Privater Code"
msgid "Email" msgid "Email"
msgstr "E-Mail" msgstr "E-Mail"
msgid "Enable project history"
msgstr ""
msgid "Use IP tracking for project history"
msgstr ""
msgid "Import previously exported JSON file"
msgstr ""
msgid "Import"
msgstr ""
msgid "Project identifier" msgid "Project identifier"
msgstr "Projektkennung" msgstr "Projektkennung"
@ -41,8 +54,8 @@ msgid ""
"A project with this identifier (\"%(project)s\") already exists. Please " "A project with this identifier (\"%(project)s\") already exists. Please "
"choose a new identifier" "choose a new identifier"
msgstr "" msgstr ""
"Ein Projekt mit der Kennung (\"%(project)s\") existiert bereits. Bitte wähle " "Ein Projekt mit der Kennung (\"%(project)s\") existiert bereits. Bitte "
"eine andere Kennung" "wähle eine andere Kennung"
msgid "Get in" msgid "Get in"
msgstr "Eintreten" msgstr "Eintreten"
@ -80,6 +93,12 @@ msgstr "Von"
msgid "Amount paid" msgid "Amount paid"
msgstr "Betrag" msgstr "Betrag"
msgid "External link"
msgstr ""
msgid "A link to an external document, related to this bill"
msgstr ""
msgid "For whom?" msgid "For whom?"
msgstr "Für wen?" msgstr "Für wen?"
@ -120,6 +139,15 @@ msgstr "Einladung senden"
msgid "The email %(email)s is not valid" msgid "The email %(email)s is not valid"
msgstr "Die E-Mail-Adresse(n) %(email)s ist/sind nicht gültig" msgstr "Die E-Mail-Adresse(n) %(email)s ist/sind nicht gültig"
msgid "Participant"
msgstr ""
msgid "Bill"
msgstr ""
msgid "Project"
msgstr "Projekt"
msgid "Too many failed login attempts, please retry later." msgid "Too many failed login attempts, please retry later."
msgstr "Zu viele fehlgeschlagene Anmeldeversuche, bitte versuche es später." msgstr "Zu viele fehlgeschlagene Anmeldeversuche, bitte versuche es später."
@ -130,8 +158,7 @@ msgstr ""
"verbleibend." "verbleibend."
msgid "You either provided a bad token or no project identifier." msgid "You either provided a bad token or no project identifier."
msgstr "" msgstr "Du hast entweder einen ungültigen Token oder keine Projekt-ID angegeben."
"Du hast entweder einen ungültigen Token oder keine Projekt-ID angegeben."
msgid "This private code is not the right one" msgid "This private code is not the right one"
msgstr "Der private Code ist nicht korrekt" msgstr "Der private Code ist nicht korrekt"
@ -158,6 +185,12 @@ msgstr "Unbekanntes Projekt"
msgid "Password successfully reset." msgid "Password successfully reset."
msgstr "Passwort erfolgreich zurückgesetzt." msgstr "Passwort erfolgreich zurückgesetzt."
msgid "Project successfully uploaded"
msgstr ""
msgid "Invalid JSON"
msgstr ""
msgid "Project successfully deleted" msgid "Project successfully deleted"
msgstr "Projekt erfolgreich gelöscht" msgstr "Projekt erfolgreich gelöscht"
@ -169,8 +202,8 @@ msgid "Your invitations have been sent"
msgstr "Deine Einladungen wurden versendet" msgstr "Deine Einladungen wurden versendet"
#, python-format #, python-format
msgid "%(member)s had been added" msgid "%(member)s has been added"
msgstr "%(member)s wurde(n) hinzugefügt" msgstr ""
#, python-format #, python-format
msgid "%(name)s is part of this project again" msgid "%(name)s is part of this project again"
@ -225,9 +258,6 @@ msgstr "?"
msgid "Create a new project" msgid "Create a new project"
msgstr "Neues Projekt erstellen" msgstr "Neues Projekt erstellen"
msgid "Project"
msgstr "Projekt"
msgid "Number of members" msgid "Number of members"
msgstr "Anzahl der Teilnehmer" msgstr "Anzahl der Teilnehmer"
@ -249,6 +279,9 @@ msgstr "Bearbeiten"
msgid "delete" msgid "delete"
msgstr "Löschen" msgstr "Löschen"
msgid "see"
msgstr ""
msgid "The Dashboard is currently deactivated." msgid "The Dashboard is currently deactivated."
msgstr "Das Dashboard ist aktuell deaktiviert." msgstr "Das Dashboard ist aktuell deaktiviert."
@ -258,6 +291,12 @@ msgstr "Bist du sicher?"
msgid "Edit project" msgid "Edit project"
msgstr "Projekt bearbeiten" msgstr "Projekt bearbeiten"
msgid "Import JSON"
msgstr ""
msgid "Choose file"
msgstr ""
msgid "Download project's data" msgid "Download project's data"
msgstr "Projektdaten herunterladen" msgstr "Projektdaten herunterladen"
@ -279,6 +318,9 @@ msgstr "Passwort vergessen?"
msgid "Cancel" msgid "Cancel"
msgstr "Abbrechen" msgstr "Abbrechen"
msgid "Privacy Settings"
msgstr ""
msgid "Edit the project" msgid "Edit the project"
msgstr "Projekt bearbeiten" msgstr "Projekt bearbeiten"
@ -309,6 +351,177 @@ msgstr "Einladung versenden"
msgid "Download" msgid "Download"
msgstr "Herunterladen" msgstr "Herunterladen"
msgid "Disabled Project History"
msgstr ""
msgid "Disabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled Project History"
msgstr ""
msgid "Disabled IP Address Recording"
msgstr ""
msgid "Enabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled IP Address Recording"
msgstr ""
msgid "History Settings Changed"
msgstr ""
msgid "changed"
msgstr ""
msgid "from"
msgstr ""
msgid "to"
msgstr ""
msgid "Confirm Remove IP Adresses"
msgstr ""
msgid ""
"Are you sure you want to delete all recorded IP addresses from this "
"project?\n"
" The rest of the project history will be unaffected. This "
"action cannot be undone."
msgstr ""
msgid "Close"
msgstr ""
msgid "Confirm Delete"
msgstr ""
msgid "Delete Confirmation"
msgstr ""
msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
msgid "Added"
msgstr ""
msgid "Removed"
msgstr ""
msgid "and"
msgstr ""
msgid "owers list"
msgstr ""
msgid "Who?"
msgstr "Wer?"
msgid "Balance"
msgstr "Bilanz"
#, python-format
msgid ""
"\n"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily" msgid "Manage your shared <br />expenses, easily"
msgstr "Verwalten deine geteilten <br />Ausgaben ganz einfach" msgstr "Verwalten deine geteilten <br />Ausgaben ganz einfach"
@ -343,8 +556,9 @@ msgid ""
"This access code will be sent to your friends. It is stored as-is by the " "This access code will be sent to your friends. It is stored as-is by the "
"server, so don\\'t reuse a personal password!" "server, so don\\'t reuse a personal password!"
msgstr "" msgstr ""
"Dieser Zugangscode wird an deine Freunde gesendet. Es wird als Klartext auf " "Dieser Zugangscode wird an deine Freunde gesendet. Es wird als Klartext "
"dem Server gespeichert. Bitte verwenden daher kein persönliches Passwort!" "auf dem Server gespeichert. Bitte verwenden daher kein persönliches "
"Passwort!"
msgid "Account manager" msgid "Account manager"
msgstr "Konten" msgstr "Konten"
@ -358,6 +572,9 @@ msgstr "Bilanz"
msgid "Statistics" msgid "Statistics"
msgstr "Statistik" msgstr "Statistik"
msgid "History"
msgstr ""
msgid "Settings" msgid "Settings"
msgstr "Einstellungen" msgstr "Einstellungen"
@ -415,6 +632,12 @@ msgstr "Du kannst anfangen, Teilnehmer hinzuzufügen"
msgid "Add a new bill" msgid "Add a new bill"
msgstr "Neue Ausgabe" msgstr "Neue Ausgabe"
msgid "Newer bills"
msgstr ""
msgid "Older bills"
msgstr ""
msgid "When?" msgid "When?"
msgstr "Wann?" msgstr "Wann?"
@ -485,8 +708,8 @@ msgid ""
"You can share the project identifier and the private code by any " "You can share the project identifier and the private code by any "
"communication means." "communication means."
msgstr "" msgstr ""
"Du kannst die Projekt-ID und den privaten Code auf jedem Kommunikationsweg " "Du kannst die Projekt-ID und den privaten Code auf jedem "
"weitergeben." "Kommunikationsweg weitergeben."
msgid "Identifier:" msgid "Identifier:"
msgstr "ID:" msgstr "ID:"
@ -495,8 +718,7 @@ msgid "Share the Link"
msgstr "Link teilen" msgstr "Link teilen"
msgid "You can directly share the following link via your prefered medium" msgid "You can directly share the following link via your prefered medium"
msgstr "" msgstr "Du kannst den folgenden Link direkt über dein bevorzugtes Medium teilen"
"Du kannst den folgenden Link direkt über dein bevorzugtes Medium teilen"
msgid "Send via Emails" msgid "Send via Emails"
msgstr "Per E-Mail versenden" msgstr "Per E-Mail versenden"
@ -507,10 +729,10 @@ msgid ""
" creation of this budget management project and we will " " creation of this budget management project and we will "
"send them an email for you." "send them an email for you."
msgstr "" msgstr ""
"Gib eine (durch Kommas getrennte) Liste von E-Mail-Adressen an, die du über " "Gib eine (durch Kommas getrennte) Liste von E-Mail-Adressen an, die du "
"die\n" "über die\n"
"\t\t\tErstellung dieses Projekts informieren möchtest, und wir senden ihnen " "\t\t\tErstellung dieses Projekts informieren möchtest, und wir senden "
"eine E-Mail." "ihnen eine E-Mail."
msgid "Who pays?" msgid "Who pays?"
msgstr "Wer zahlt?" msgstr "Wer zahlt?"
@ -518,14 +740,21 @@ msgstr "Wer zahlt?"
msgid "To whom?" msgid "To whom?"
msgstr "An wen?" msgstr "An wen?"
msgid "Who?"
msgstr "Wer?"
msgid "Paid" msgid "Paid"
msgstr "Bezahlt" msgstr "Bezahlt"
msgid "Spent" msgid "Spent"
msgstr "Ausgegeben" msgstr "Ausgegeben"
msgid "Balance" msgid "Expenses by Month"
msgstr "Bilanz" msgstr ""
msgid "Period"
msgstr ""
#~ msgid "Someone probably"
#~ msgstr ""
#~ msgid "cleared the project history."
#~ msgstr ""

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 21:48+0200\n" "POT-Creation-Date: 2020-04-25 13:02+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language: el\n" "Language: el\n"
@ -12,7 +12,7 @@ msgstr ""
"MIME-Version: 1.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" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.7.0\n" "Generated-By: Babel 2.8.0\n"
msgid "" msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are " "Not a valid amount or expression. Only numbers and + - * / operators are "
@ -28,6 +28,18 @@ msgstr ""
msgid "Email" msgid "Email"
msgstr "" msgstr ""
msgid "Enable project history"
msgstr ""
msgid "Use IP tracking for project history"
msgstr ""
msgid "Import previously exported JSON file"
msgstr ""
msgid "Import"
msgstr ""
msgid "Project identifier" msgid "Project identifier"
msgstr "" msgstr ""
@ -122,6 +134,15 @@ msgstr ""
msgid "The email %(email)s is not valid" msgid "The email %(email)s is not valid"
msgstr "" msgstr ""
msgid "Participant"
msgstr ""
msgid "Bill"
msgstr ""
msgid "Project"
msgstr ""
msgid "Too many failed login attempts, please retry later." msgid "Too many failed login attempts, please retry later."
msgstr "" msgstr ""
@ -155,6 +176,12 @@ msgstr ""
msgid "Password successfully reset." msgid "Password successfully reset."
msgstr "" msgstr ""
msgid "Project successfully uploaded"
msgstr ""
msgid "Invalid JSON"
msgstr ""
msgid "Project successfully deleted" msgid "Project successfully deleted"
msgstr "" msgstr ""
@ -166,7 +193,7 @@ msgid "Your invitations have been sent"
msgstr "" msgstr ""
#, python-format #, python-format
msgid "%(member)s had been added" msgid "%(member)s has been added"
msgstr "" msgstr ""
#, python-format #, python-format
@ -220,9 +247,6 @@ msgstr ""
msgid "Create a new project" msgid "Create a new project"
msgstr "" msgstr ""
msgid "Project"
msgstr ""
msgid "Number of members" msgid "Number of members"
msgstr "" msgstr ""
@ -244,6 +268,9 @@ msgstr ""
msgid "delete" msgid "delete"
msgstr "" msgstr ""
msgid "see"
msgstr ""
msgid "The Dashboard is currently deactivated." msgid "The Dashboard is currently deactivated."
msgstr "" msgstr ""
@ -253,6 +280,12 @@ msgstr ""
msgid "Edit project" msgid "Edit project"
msgstr "" msgstr ""
msgid "Import JSON"
msgstr ""
msgid "Choose file"
msgstr ""
msgid "Download project's data" msgid "Download project's data"
msgstr "" msgstr ""
@ -274,6 +307,9 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr ""
msgid "Privacy Settings"
msgstr ""
msgid "Edit the project" msgid "Edit the project"
msgstr "" msgstr ""
@ -304,6 +340,177 @@ msgstr ""
msgid "Download" msgid "Download"
msgstr "" msgstr ""
msgid "Disabled Project History"
msgstr ""
msgid "Disabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled Project History"
msgstr ""
msgid "Disabled IP Address Recording"
msgstr ""
msgid "Enabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled IP Address Recording"
msgstr ""
msgid "History Settings Changed"
msgstr ""
msgid "changed"
msgstr ""
msgid "from"
msgstr ""
msgid "to"
msgstr ""
msgid "Confirm Remove IP Adresses"
msgstr ""
msgid ""
"Are you sure you want to delete all recorded IP addresses from this "
"project?\n"
" The rest of the project history will be unaffected. This "
"action cannot be undone."
msgstr ""
msgid "Close"
msgstr ""
msgid "Confirm Delete"
msgstr ""
msgid "Delete Confirmation"
msgstr ""
msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
msgid "Added"
msgstr ""
msgid "Removed"
msgstr ""
msgid "and"
msgstr ""
msgid "owers list"
msgstr ""
msgid "Who?"
msgstr ""
msgid "Balance"
msgstr ""
#, python-format
msgid ""
"\n"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily" msgid "Manage your shared <br />expenses, easily"
msgstr "" msgstr ""
@ -351,6 +558,9 @@ msgstr ""
msgid "Statistics" msgid "Statistics"
msgstr "" msgstr ""
msgid "History"
msgstr ""
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
@ -408,6 +618,12 @@ msgstr ""
msgid "Add a new bill" msgid "Add a new bill"
msgstr "" msgstr ""
msgid "Newer bills"
msgstr ""
msgid "Older bills"
msgstr ""
msgid "When?" msgid "When?"
msgstr "" msgstr ""
@ -434,9 +650,6 @@ msgstr ""
msgid "each" msgid "each"
msgstr "" msgstr ""
msgid "see"
msgstr ""
msgid "No bills" msgid "No bills"
msgstr "" msgstr ""
@ -505,97 +718,14 @@ msgstr ""
msgid "To whom?" msgid "To whom?"
msgstr "" msgstr ""
msgid "Who?"
msgstr ""
msgid "Paid" msgid "Paid"
msgstr "" msgstr ""
msgid "Spent" msgid "Spent"
msgstr "" msgstr ""
msgid "Balance" msgid "Expenses by Month"
msgstr "" msgstr ""
#~ msgid "" msgid "Period"
#~ "Not a valid amount or expression.Only" msgstr ""
#~ " numbers and + - * / "
#~ "operatorsare accepted."
#~ msgstr ""
#~ msgid "What do you want to download ?"
#~ msgstr ""
#~ msgid "bills"
#~ msgstr ""
#~ msgid "transactions"
#~ msgstr ""
#~ msgid "Export file format"
#~ msgstr ""
#~ msgid "Edit this project"
#~ msgstr ""
#~ msgid "Download this project's data"
#~ msgstr ""
#~ msgid "Type user name here"
#~ msgstr ""
#~ msgid "No, thanks"
#~ msgstr ""
#~ msgid "Manage your shared <br>expenses, easily"
#~ msgstr ""
#~ msgid "Log to an existing project"
#~ msgstr ""
#~ msgid "log in"
#~ msgstr ""
#~ msgid "or create a new one"
#~ msgstr ""
#~ msgid "let's get started"
#~ msgstr ""
#~ msgid "options"
#~ msgstr ""
#~ msgid "Project settings"
#~ msgstr ""
#~ msgid "This is a free software"
#~ msgstr ""
#~ msgid "Invite people to join this project!"
#~ msgstr ""
#~ msgid "Added on"
#~ msgstr ""
#~ msgid "Nothing to list yet. You probably want to"
#~ msgstr ""
#~ msgid ""
#~ "Specify a (comma separated) list of "
#~ "email adresses you want to notify "
#~ "about the\n"
#~ "creation of this budget management "
#~ "project and we will send them an"
#~ " email for you."
#~ msgstr ""
#~ msgid ""
#~ "If you prefer, you can share the project identifier and the shared\n"
#~ "password by other communication means. "
#~ "Or even directly share the following "
#~ "link:"
#~ msgstr ""
#~ msgid "A link to reset your password has been sent to your email."
#~ msgstr ""

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-20 11:52+0200\n" "POT-Creation-Date: 2020-04-25 13:02+0200\n"
"PO-Revision-Date: 2019-09-25 22:28+0000\n" "PO-Revision-Date: 2019-09-25 22:28+0000\n"
"Last-Translator: Diego Caraballo <diegocaraballo84@gmail.com>\n" "Last-Translator: Diego Caraballo <diegocaraballo84@gmail.com>\n"
"Language: es_419\n" "Language: es_419\n"
@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.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" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.7.0\n" "Generated-By: Babel 2.8.0\n"
msgid "" msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are " "Not a valid amount or expression. Only numbers and + - * / operators are "
@ -31,6 +31,18 @@ msgstr "Código privado"
msgid "Email" msgid "Email"
msgstr "Correo Electrónico" msgstr "Correo Electrónico"
msgid "Enable project history"
msgstr ""
msgid "Use IP tracking for project history"
msgstr ""
msgid "Import previously exported JSON file"
msgstr ""
msgid "Import"
msgstr ""
msgid "Project identifier" msgid "Project identifier"
msgstr "Identificador de proyecto" msgstr "Identificador de proyecto"
@ -127,6 +139,15 @@ msgstr "Enviar invitaciones"
msgid "The email %(email)s is not valid" msgid "The email %(email)s is not valid"
msgstr "El correo electrónico %(email)s no es válido" msgstr "El correo electrónico %(email)s no es válido"
msgid "Participant"
msgstr ""
msgid "Bill"
msgstr ""
msgid "Project"
msgstr "Proyecto"
msgid "Too many failed login attempts, please retry later." msgid "Too many failed login attempts, please retry later."
msgstr "" msgstr ""
"Demasiados intentos fallidos de inicio de sesión, vuelva a intentarlo más" "Demasiados intentos fallidos de inicio de sesión, vuelva a intentarlo más"
@ -164,6 +185,12 @@ msgstr "Proyecto desconocido"
msgid "Password successfully reset." msgid "Password successfully reset."
msgstr "Contraseña restablecida con éxito." msgstr "Contraseña restablecida con éxito."
msgid "Project successfully uploaded"
msgstr ""
msgid "Invalid JSON"
msgstr ""
msgid "Project successfully deleted" msgid "Project successfully deleted"
msgstr "Proyecto eliminado correctamente" msgstr "Proyecto eliminado correctamente"
@ -175,8 +202,8 @@ msgid "Your invitations have been sent"
msgstr "Sus invitaciones han sido enviadas" msgstr "Sus invitaciones han sido enviadas"
#, python-format #, python-format
msgid "%(member)s had been added" msgid "%(member)s has been added"
msgstr "se han añadido %(member)s" msgstr ""
#, python-format #, python-format
msgid "%(name)s is part of this project again" msgid "%(name)s is part of this project again"
@ -231,9 +258,6 @@ msgstr "?"
msgid "Create a new project" msgid "Create a new project"
msgstr "Crear un nuevo proyecto" msgstr "Crear un nuevo proyecto"
msgid "Project"
msgstr "Proyecto"
msgid "Number of members" msgid "Number of members"
msgstr "Número de miembros" msgstr "Número de miembros"
@ -255,6 +279,9 @@ msgstr "Editar"
msgid "delete" msgid "delete"
msgstr "Eliminar" msgstr "Eliminar"
msgid "see"
msgstr "ver"
msgid "The Dashboard is currently deactivated." msgid "The Dashboard is currently deactivated."
msgstr "El panel está desactivado actualmente." msgstr "El panel está desactivado actualmente."
@ -264,6 +291,12 @@ msgstr "¿Estás seguro?"
msgid "Edit project" msgid "Edit project"
msgstr "Editar proyecto" msgstr "Editar proyecto"
msgid "Import JSON"
msgstr ""
msgid "Choose file"
msgstr ""
msgid "Download project's data" msgid "Download project's data"
msgstr "Descargar datos del proyecto" msgstr "Descargar datos del proyecto"
@ -287,6 +320,9 @@ msgstr "¿No recuerdas la contraseña?"
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
msgid "Privacy Settings"
msgstr ""
msgid "Edit the project" msgid "Edit the project"
msgstr "Editar el proyecto" msgstr "Editar el proyecto"
@ -317,6 +353,177 @@ msgstr "Enviar las invitaciones"
msgid "Download" msgid "Download"
msgstr "Descargar" msgstr "Descargar"
msgid "Disabled Project History"
msgstr ""
msgid "Disabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled Project History"
msgstr ""
msgid "Disabled IP Address Recording"
msgstr ""
msgid "Enabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled IP Address Recording"
msgstr ""
msgid "History Settings Changed"
msgstr ""
msgid "changed"
msgstr ""
msgid "from"
msgstr ""
msgid "to"
msgstr ""
msgid "Confirm Remove IP Adresses"
msgstr ""
msgid ""
"Are you sure you want to delete all recorded IP addresses from this "
"project?\n"
" The rest of the project history will be unaffected. This "
"action cannot be undone."
msgstr ""
msgid "Close"
msgstr ""
msgid "Confirm Delete"
msgstr ""
msgid "Delete Confirmation"
msgstr ""
msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
msgid "Added"
msgstr ""
msgid "Removed"
msgstr ""
msgid "and"
msgstr ""
msgid "owers list"
msgstr ""
msgid "Who?"
msgstr "¿Quién?"
msgid "Balance"
msgstr "Balance"
#, python-format
msgid ""
"\n"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily" msgid "Manage your shared <br />expenses, easily"
msgstr "Gestione sus gastos compartidos <br />fácilmente" msgstr "Gestione sus gastos compartidos <br />fácilmente"
@ -366,6 +573,9 @@ msgstr "Resolver"
msgid "Statistics" msgid "Statistics"
msgstr "Estadísticas" msgstr "Estadísticas"
msgid "History"
msgstr ""
msgid "Settings" msgid "Settings"
msgstr "Configuración" msgstr "Configuración"
@ -423,6 +633,12 @@ msgstr "Deberías comenzar agregando participantes"
msgid "Add a new bill" msgid "Add a new bill"
msgstr "Añadir una nueva factura" msgstr "Añadir una nueva factura"
msgid "Newer bills"
msgstr ""
msgid "Older bills"
msgstr ""
msgid "When?" msgid "When?"
msgstr "¿Cuando?" msgstr "¿Cuando?"
@ -449,9 +665,6 @@ msgstr "Todo el mundo menos %(excluded)s"
msgid "each" msgid "each"
msgstr "Cada" msgstr "Cada"
msgid "see"
msgstr "ver"
msgid "No bills" msgid "No bills"
msgstr "Sin facturas" msgstr "Sin facturas"
@ -530,15 +743,17 @@ msgstr "¿Quién paga?"
msgid "To whom?" msgid "To whom?"
msgstr "¿A quién?" msgstr "¿A quién?"
msgid "Who?"
msgstr "¿Quién?"
msgid "Paid" msgid "Paid"
msgstr "Pagado" msgstr "Pagado"
msgid "Spent" msgid "Spent"
msgstr "Gastado" msgstr "Gastado"
msgid "Balance" msgid "Expenses by Month"
msgstr "Balance" msgstr ""
msgid "Period"
msgstr ""
#~ msgid "%(member)s had been added"
#~ msgstr "se han añadido %(member)s"

View file

@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-10-01 21:48+0200\n" "POT-Creation-Date: 2020-04-25 13:02+0200\n"
"PO-Revision-Date: 2019-10-07 22:56+0000\n" "PO-Revision-Date: 2020-04-25 11:14+0000\n"
"Last-Translator: Alexis Metaireau <alexis@notmyidea.org>\n" "Last-Translator: Rémy Hubscher <hubscher.remy@gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/i-hate-money/" "Language-Team: French <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/fr/>\n" "i-hate-money/fr/>\n"
"Language: fr\n" "Language: fr\n"
@ -17,15 +17,15 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.9-dev\n" "X-Generator: Weblate 4.0.2-dev\n"
"Generated-By: Babel 2.7.0\n" "Generated-By: Babel 2.8.0\n"
msgid "" msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are " "Not a valid amount or expression. Only numbers and + - * / operators are "
"accepted." "accepted."
msgstr "" msgstr ""
"Ceci n'est pas pas un montant ou une expression valide. Seuls les nombres" "Ceci n'est pas un montant ou une expression valide. Seuls les nombres et "
" et les opérateurs + - * / sont acceptés." "les opérateurs + - * / sont acceptés."
msgid "Project name" msgid "Project name"
msgstr "Nom de projet" msgstr "Nom de projet"
@ -36,6 +36,18 @@ msgstr "Code daccès"
msgid "Email" msgid "Email"
msgstr "Email" msgstr "Email"
msgid "Enable project history"
msgstr "Activer l'historique de projet"
msgid "Use IP tracking for project history"
msgstr "Collecter les adresses IP dans l'historique de projet"
msgid "Import previously exported JSON file"
msgstr "Importer un fichier JSON précédemment exporté"
msgid "Import"
msgstr "Importer"
msgid "Project identifier" msgid "Project identifier"
msgstr "Identifiant du projet" msgstr "Identifiant du projet"
@ -132,6 +144,15 @@ msgstr "Envoyer les invitations"
msgid "The email %(email)s is not valid" msgid "The email %(email)s is not valid"
msgstr "Lemail %(email)s est invalide" msgstr "Lemail %(email)s est invalide"
msgid "Participant"
msgstr "Participant"
msgid "Bill"
msgstr "Facture"
msgid "Project"
msgstr "Projet"
msgid "Too many failed login attempts, please retry later." msgid "Too many failed login attempts, please retry later."
msgstr "Trop d'échecs dauthentification successifs, veuillez réessayer plus tard." msgstr "Trop d'échecs dauthentification successifs, veuillez réessayer plus tard."
@ -167,6 +188,12 @@ msgstr "Project inconnu"
msgid "Password successfully reset." msgid "Password successfully reset."
msgstr "Le mot de passe a été changé avec succès." msgstr "Le mot de passe a été changé avec succès."
msgid "Project successfully uploaded"
msgstr "Le projet a été correctement importé"
msgid "Invalid JSON"
msgstr "Le fichier JSON est invalide"
msgid "Project successfully deleted" msgid "Project successfully deleted"
msgstr "Projet supprimé" msgstr "Projet supprimé"
@ -178,8 +205,8 @@ msgid "Your invitations have been sent"
msgstr "Vos invitations ont bien été envoyées" msgstr "Vos invitations ont bien été envoyées"
#, python-format #, python-format
msgid "%(member)s had been added" msgid "%(member)s has been added"
msgstr "%(member)s a bien été ajouté" msgstr "%(member)s a été ajouté"
#, python-format #, python-format
msgid "%(name)s is part of this project again" msgid "%(name)s is part of this project again"
@ -234,9 +261,6 @@ msgstr " ?"
msgid "Create a new project" msgid "Create a new project"
msgstr "Créer un nouveau projet" msgstr "Créer un nouveau projet"
msgid "Project"
msgstr "Projets"
msgid "Number of members" msgid "Number of members"
msgstr "Nombre de membres" msgstr "Nombre de membres"
@ -258,6 +282,9 @@ msgstr "éditer"
msgid "delete" msgid "delete"
msgstr "supprimer" msgstr "supprimer"
msgid "see"
msgstr "voir"
msgid "The Dashboard is currently deactivated." msgid "The Dashboard is currently deactivated."
msgstr "Le tableau de bord est actuellement désactivée." msgstr "Le tableau de bord est actuellement désactivée."
@ -267,6 +294,12 @@ msgstr "cest sûr ?"
msgid "Edit project" msgid "Edit project"
msgstr "Éditer le projet" msgstr "Éditer le projet"
msgid "Import JSON"
msgstr "Import JSON"
msgid "Choose file"
msgstr "Choisir un fichier"
msgid "Download project's data" msgid "Download project's data"
msgstr "Télécharger les données du projet" msgstr "Télécharger les données du projet"
@ -288,6 +321,9 @@ msgstr "Vous ne vous souvenez plus du code daccès ?"
msgid "Cancel" msgid "Cancel"
msgstr "Annuler" msgstr "Annuler"
msgid "Privacy Settings"
msgstr "Vie privée"
msgid "Edit the project" msgid "Edit the project"
msgstr "Éditer le projet" msgstr "Éditer le projet"
@ -318,6 +354,202 @@ msgstr "Envoyer les invitations"
msgid "Download" msgid "Download"
msgstr "Télécharger" msgstr "Télécharger"
msgid "Disabled Project History"
msgstr "Désactiver l'historique du projet"
msgid "Disabled Project History & IP Address Recording"
msgstr "Désactiver l'historique du projet et l'enregistrement des adresses IP"
msgid "Enabled Project History"
msgstr "Activer l'historique du projet"
msgid "Disabled IP Address Recording"
msgstr "Désactiver l'enregistrement des adresses IP"
msgid "Enabled Project History & IP Address Recording"
msgstr "Activer l'historique du projet et lenregistrement des adresses IP"
msgid "Enabled IP Address Recording"
msgstr "Activer l'enregistrement des adresses IP"
msgid "History Settings Changed"
msgstr "Paramètres d'historique modifiés"
msgid "changed"
msgstr "modifié"
msgid "from"
msgstr "du"
msgid "to"
msgstr "au"
msgid "Confirm Remove IP Adresses"
msgstr "Confirmer la suppression des adresses IP"
msgid ""
"Are you sure you want to delete all recorded IP addresses from this "
"project?\n"
" The rest of the project history will be unaffected. This "
"action cannot be undone."
msgstr ""
"Êtes-vous sur de vouloir supprimer toutes les adresses IP enregistrées pour "
"ce projet ?\n"
"Le reste de l'historique ne sera pas affecté. Cette action n'est pas "
"réversible."
msgid "Close"
msgstr "Fermer"
msgid "Confirm Delete"
msgstr "Confirmer la suppression"
msgid "Delete Confirmation"
msgstr "Confirmation de suppression"
msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
"Êtes-vous sur de vouloir supprimer tout l'historique du projet ? Cette "
"action n'est pas réversible."
msgid "Added"
msgstr "Ajouté"
msgid "Removed"
msgstr "Supprimé"
msgid "and"
msgstr "et"
msgid "owers list"
msgstr "Liste des débiteurs"
msgid "Who?"
msgstr "Qui ?"
msgid "Balance"
msgstr "Solde"
#, python-format
msgid ""
"\n"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
"\n"
" <i>L'historique de ce projet a été désactivé. Les nouvelles "
"actions n'apparaîtront pas ci-dessous. Vous pouvez réactiver l'historique"
" du projet dans les </i>\n"
" <a href=\"%(url)s\">paramètres du projet</a>\n"
" "
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
"\n"
" <i>Le tableau ci-dessous liste les actions enregistrées avant"
" la désactivation de l'historique du projet. Vous pouvez\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> cliquer ici pour"
" les supprimer.</i></p>\n"
" "
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
"Certaines entrées de l'historique contiennent une adresse IP, bien que ce"
" projet ait désactivé l'enregistrement des adresses IP. "
msgid "Delete stored IP addresses"
msgstr "Supprimer toutes les adresses IP enregistrées"
msgid "No history to erase"
msgstr "Aucun historique à supprimer"
msgid "Clear Project History"
msgstr "Supprimer les entrées de l'historique du projet"
msgid "No IP Addresses to erase"
msgstr "Aucune adresse IP à supprimer"
msgid "Delete Stored IP Addresses"
msgstr "Supprimer les adresses IP enregistrées"
msgid "Time"
msgstr "Heure"
msgid "Event"
msgstr "Évènement"
msgid "IP address recording can be enabled on the settings page"
msgstr ""
"L'enregistrement des adresses IP peut-être activé dans les paramètres de "
"la page"
msgid "IP address recording can be disabled on the settings page"
msgstr ""
"L'enregistrement des adresses IP peut-être désactivé dans les paramètres "
"de la page"
msgid "From IP"
msgstr "Depuis l'IP"
msgid "added"
msgstr "ajouté"
msgid "Project private code changed"
msgstr "Le mot de passe du projet a été modifié"
msgid "Project renamed to"
msgstr "Le projet a été renommé"
msgid "Project contact email changed to"
msgstr "L'adresse email de contact du projet a été modifié en"
msgid "Project settings modified"
msgstr "Les paramètres du projet ont été modifiés"
msgid "deactivated"
msgstr "désactivé"
msgid "reactivated"
msgstr "réactivé"
msgid "renamed to"
msgstr "renommé en"
msgid "External link changed to"
msgstr "Le lien d'accès a été modifié en"
msgid "Amount"
msgstr "Montant"
msgid "modified"
msgstr "modifié"
msgid "removed"
msgstr "supprimé"
msgid "changed in a unknown way"
msgstr "modifié d'une manière inconnue"
msgid "Nothing to list"
msgstr "Rien à afficher"
msgid "Someone probably cleared the project history."
msgstr "Quelqu'un a probablement vidé l'historique du projet."
msgid "Manage your shared <br />expenses, easily" msgid "Manage your shared <br />expenses, easily"
msgstr "Gérez vos dépenses <br />partagées, facilement" msgstr "Gérez vos dépenses <br />partagées, facilement"
@ -367,6 +599,9 @@ msgstr "Remboursements"
msgid "Statistics" msgid "Statistics"
msgstr "Statistiques" msgstr "Statistiques"
msgid "History"
msgstr "Historique"
msgid "Settings" msgid "Settings"
msgstr "Options" msgstr "Options"
@ -424,6 +659,12 @@ msgstr "Vous devriez commencer par ajouter des participants"
msgid "Add a new bill" msgid "Add a new bill"
msgstr "Nouvelle facture" msgstr "Nouvelle facture"
msgid "Newer bills"
msgstr "Nouvelles factures"
msgid "Older bills"
msgstr "Ancienne factures"
msgid "When?" msgid "When?"
msgstr "Quand ?" msgstr "Quand ?"
@ -450,9 +691,6 @@ msgstr "Tout le monde sauf %(excluded)s"
msgid "each" msgid "each"
msgstr "chacun" msgstr "chacun"
msgid "see"
msgstr "voir"
msgid "No bills" msgid "No bills"
msgstr "Pas encore de factures" msgstr "Pas encore de factures"
@ -527,27 +765,17 @@ msgstr "Qui doit payer ?"
msgid "To whom?" msgid "To whom?"
msgstr "Pour qui ?" msgstr "Pour qui ?"
msgid "Who?"
msgstr "Qui ?"
msgid "Paid" msgid "Paid"
msgstr "A payé" msgstr "A payé"
msgid "Spent" msgid "Spent"
msgstr "A dépensé" msgstr "A dépensé"
msgid "Balance" msgid "Expenses by Month"
msgstr "Solde" msgstr "Dépenses par mois"
msgid "Import"
msgstr "Importer"
msgid "Project successfully uploaded"
msgstr "Le projet a été correctement importé"
msgid "Invalid JSON"
msgstr "Le fichier JSON est invalide"
msgid "Period"
msgstr "Période"
#~ msgid "" #~ msgid ""
#~ "The project identifier is used to " #~ "The project identifier is used to "
@ -695,3 +923,72 @@ msgstr "Le fichier JSON est invalide"
#~ msgid "A link to reset your password has been sent to your email." #~ msgid "A link to reset your password has been sent to your email."
#~ msgstr "Un lien pour changer votre mot de passe vous a été envoyé par mail." #~ msgstr "Un lien pour changer votre mot de passe vous a été envoyé par mail."
#~ msgid "%(member)s had been added"
#~ msgstr "%(member)s a bien été ajouté"
#~ msgid "Disabled Project History"
#~ msgstr "Historisation du projet désactivée"
#~ msgid "Disabled Project History & IP Address Recording"
#~ msgstr "Historisation du projet et enregistrement des adresses IP désactivés"
#~ msgid "Enabled Project History"
#~ msgstr "Historisation du projet activée"
#~ msgid "Disabled IP Address Recording"
#~ msgstr "Enregistrement des adresses IP désactivé"
#~ msgid "Enabled Project History & IP Address Recording"
#~ msgstr "Historisation du projet et enregistrement des adresses IP activés"
#~ msgid "Enabled IP Address Recording"
#~ msgstr "Enregistrement des adresses IP activé"
#~ msgid "History Settings Changed"
#~ msgstr "Changement des paramètres dhistorisation"
#~ msgid "changed"
#~ msgstr "modifié"
#~ msgid "from"
#~ msgstr "depuis"
#~ msgid "to"
#~ msgstr "vers"
#~ msgid "Confirm Remove IP Adresses"
#~ msgstr "Confirmer la suppression des adresses IP"
#~ msgid ""
#~ "Are you sure you want to delete"
#~ " all recorded IP addresses from this"
#~ " project?\n"
#~ " The rest of the project"
#~ " history will be unaffected. This "
#~ "action cannot be undone."
#~ msgstr ""
#~ "Êtes vous sûr de supprimer toutes "
#~ "les adresses IP enregistrées dans ce "
#~ "projet ?\n"
#~ "Le reste de lhistorique du projet "
#~ "restera inchangé. Cette action est "
#~ "irréversible."
#~ msgid "Close"
#~ msgstr "Fermer"
#~ msgid "Confirm Delete"
#~ msgstr "Confirmer la suppression"
#~ msgid "Delete Confirmation"
#~ msgstr "Confirmation de suppression"
#~ msgid ""
#~ "Are you sure you want to erase "
#~ "all history for this project? This "
#~ "action cannot be undone."
#~ msgstr ""
#~ "Êtes vous sûr de supprimer la "
#~ "totalité de lhistorique de ce projet"
#~ " ? Cette action est irréversible."

Binary file not shown.

View file

@ -1,24 +1,26 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-11-15 09:12+0200\n" "POT-Creation-Date: 2020-04-25 13:02+0200\n"
"PO-Revision-Date: 2019-11-16 10:04+0000\n" "PO-Revision-Date: 2019-11-16 10:04+0000\n"
"Last-Translator: Muhammad Fauzi <fauzi.padlaw@gmail.com>\n" "Last-Translator: Muhammad Fauzi <fauzi.padlaw@gmail.com>\n"
"Language-Team: Indonesian <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/id/>\n"
"Language: id\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" "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" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n" "Generated-By: Babel 2.8.0\n"
"X-Generator: Weblate 3.10-dev\n"
msgid "" msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are " "Not a valid amount or expression. Only numbers and + - * / operators are "
"accepted." "accepted."
msgstr "" msgstr ""
"Jumlah atau operator tidak valid. Hanya angka dan opertaor +-* yang diterima." "Jumlah atau operator tidak valid. Hanya angka dan opertaor +-* yang "
"diterima."
msgid "Project name" msgid "Project name"
msgstr "Nama proyek" msgstr "Nama proyek"
@ -29,6 +31,18 @@ msgstr "Kode pribadi"
msgid "Email" msgid "Email"
msgstr "Surel" msgstr "Surel"
msgid "Enable project history"
msgstr ""
msgid "Use IP tracking for project history"
msgstr ""
msgid "Import previously exported JSON file"
msgstr ""
msgid "Import"
msgstr ""
msgid "Project identifier" msgid "Project identifier"
msgstr "Pengidentifikasi proyek" msgstr "Pengidentifikasi proyek"
@ -40,8 +54,8 @@ msgid ""
"A project with this identifier (\"%(project)s\") already exists. Please " "A project with this identifier (\"%(project)s\") already exists. Please "
"choose a new identifier" "choose a new identifier"
msgstr "" msgstr ""
"Sebuah proyek dengan ID ini (\"%(project)s\") sudah ada. Silakan pilih ID " "Sebuah proyek dengan ID ini (\"%(project)s\") sudah ada. Silakan pilih ID"
"baru" " baru"
msgid "Get in" msgid "Get in"
msgstr "Masuk" msgstr "Masuk"
@ -125,6 +139,15 @@ msgstr "Kirim undangan"
msgid "The email %(email)s is not valid" msgid "The email %(email)s is not valid"
msgstr "Surel %(email)s tidak valid" msgstr "Surel %(email)s tidak valid"
msgid "Participant"
msgstr ""
msgid "Bill"
msgstr ""
msgid "Project"
msgstr "Proyek"
msgid "Too many failed login attempts, please retry later." msgid "Too many failed login attempts, please retry later."
msgstr "Terlalu banyak percobaan masuk, silakan coba lagi nanti." msgstr "Terlalu banyak percobaan masuk, silakan coba lagi nanti."
@ -158,6 +181,12 @@ msgstr "Proyek tidak diketahui"
msgid "Password successfully reset." msgid "Password successfully reset."
msgstr "Kata sandi berhasil diatur ulang." msgstr "Kata sandi berhasil diatur ulang."
msgid "Project successfully uploaded"
msgstr ""
msgid "Invalid JSON"
msgstr ""
msgid "Project successfully deleted" msgid "Project successfully deleted"
msgstr "Proyek berhasil dihapus" msgstr "Proyek berhasil dihapus"
@ -169,8 +198,8 @@ msgid "Your invitations have been sent"
msgstr "Undangan Anda telah dikirim" msgstr "Undangan Anda telah dikirim"
#, python-format #, python-format
msgid "%(member)s had been added" msgid "%(member)s has been added"
msgstr "%(member)s telah ditambahkan" msgstr ""
#, python-format #, python-format
msgid "%(name)s is part of this project again" msgid "%(name)s is part of this project again"
@ -225,9 +254,6 @@ msgstr "?"
msgid "Create a new project" msgid "Create a new project"
msgstr "Buat proyek baru" msgstr "Buat proyek baru"
msgid "Project"
msgstr "Proyek"
msgid "Number of members" msgid "Number of members"
msgstr "Jumlah anggota" msgstr "Jumlah anggota"
@ -249,6 +275,9 @@ msgstr "ubah"
msgid "delete" msgid "delete"
msgstr "hapus" msgstr "hapus"
msgid "see"
msgstr "lihat"
msgid "The Dashboard is currently deactivated." msgid "The Dashboard is currently deactivated."
msgstr "Dasbor sekarang ini sedang dinonaktifkan." msgstr "Dasbor sekarang ini sedang dinonaktifkan."
@ -258,6 +287,12 @@ msgstr "Anda yakin?"
msgid "Edit project" msgid "Edit project"
msgstr "Ubah proyek" msgstr "Ubah proyek"
msgid "Import JSON"
msgstr ""
msgid "Choose file"
msgstr ""
msgid "Download project's data" msgid "Download project's data"
msgstr "Unduh data proyek" msgstr "Unduh data proyek"
@ -279,6 +314,9 @@ msgstr "Tidak bisa mengingat kata sandi?"
msgid "Cancel" msgid "Cancel"
msgstr "Batalkan" msgstr "Batalkan"
msgid "Privacy Settings"
msgstr ""
msgid "Edit the project" msgid "Edit the project"
msgstr "Ubah proyek" msgstr "Ubah proyek"
@ -309,6 +347,177 @@ msgstr "Kirim undangan"
msgid "Download" msgid "Download"
msgstr "Unduh" msgstr "Unduh"
msgid "Disabled Project History"
msgstr ""
msgid "Disabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled Project History"
msgstr ""
msgid "Disabled IP Address Recording"
msgstr ""
msgid "Enabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled IP Address Recording"
msgstr ""
msgid "History Settings Changed"
msgstr ""
msgid "changed"
msgstr ""
msgid "from"
msgstr ""
msgid "to"
msgstr ""
msgid "Confirm Remove IP Adresses"
msgstr ""
msgid ""
"Are you sure you want to delete all recorded IP addresses from this "
"project?\n"
" The rest of the project history will be unaffected. This "
"action cannot be undone."
msgstr ""
msgid "Close"
msgstr ""
msgid "Confirm Delete"
msgstr ""
msgid "Delete Confirmation"
msgstr ""
msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
msgid "Added"
msgstr ""
msgid "Removed"
msgstr ""
msgid "and"
msgstr ""
msgid "owers list"
msgstr ""
msgid "Who?"
msgstr "Siapa?"
msgid "Balance"
msgstr "Saldo"
#, python-format
msgid ""
"\n"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily" msgid "Manage your shared <br />expenses, easily"
msgstr "Atur pembagian harga <br />Anda, dengan mudah" msgstr "Atur pembagian harga <br />Anda, dengan mudah"
@ -343,8 +552,8 @@ msgid ""
"This access code will be sent to your friends. It is stored as-is by the " "This access code will be sent to your friends. It is stored as-is by the "
"server, so don\\'t reuse a personal password!" "server, so don\\'t reuse a personal password!"
msgstr "" msgstr ""
"Kode akses ini akan dikirimkan ke teman Anda. Kode ini disimpan dalam bentuk " "Kode akses ini akan dikirimkan ke teman Anda. Kode ini disimpan dalam "
"teks biasa dalam server, jadi jangan gunakan password Anda!" "bentuk teks biasa dalam server, jadi jangan gunakan password Anda!"
msgid "Account manager" msgid "Account manager"
msgstr "Pengatur akun" msgstr "Pengatur akun"
@ -358,6 +567,9 @@ msgstr "Atur"
msgid "Statistics" msgid "Statistics"
msgstr "Statistik" msgstr "Statistik"
msgid "History"
msgstr ""
msgid "Settings" msgid "Settings"
msgstr "Pengaturan" msgstr "Pengaturan"
@ -415,6 +627,12 @@ msgstr "Anda harus mulai dengan menambahkan partisipan"
msgid "Add a new bill" msgid "Add a new bill"
msgstr "Tambah tagihan baru" msgstr "Tambah tagihan baru"
msgid "Newer bills"
msgstr ""
msgid "Older bills"
msgstr ""
msgid "When?" msgid "When?"
msgstr "Kapan?" msgstr "Kapan?"
@ -441,9 +659,6 @@ msgstr "Semua orang kecuali %(excluded)s"
msgid "each" msgid "each"
msgstr "setiap" msgstr "setiap"
msgid "see"
msgstr "lihat"
msgid "No bills" msgid "No bills"
msgstr "Tidak ada tagihan" msgstr "Tidak ada tagihan"
@ -466,8 +681,8 @@ msgid ""
"A link to reset your password has been sent to you, please check your " "A link to reset your password has been sent to you, please check your "
"emails." "emails."
msgstr "" msgstr ""
"Tautan atur ulang kata sandi telah dikirim kepada Anda, silakan cek email " "Tautan atur ulang kata sandi telah dikirim kepada Anda, silakan cek email"
"Anda." " Anda."
msgid "Return to home page" msgid "Return to home page"
msgstr "Kembali ke halaman depan" msgstr "Kembali ke halaman depan"
@ -499,7 +714,8 @@ msgstr "Bagikan tautan"
msgid "You can directly share the following link via your prefered medium" msgid "You can directly share the following link via your prefered medium"
msgstr "" msgstr ""
"Anda bisa membagikan tautan secara langsung melalui media yang Anda inginkan" "Anda bisa membagikan tautan secara langsung melalui media yang Anda "
"inginkan"
msgid "Send via Emails" msgid "Send via Emails"
msgstr "Kirim melalui surel" msgstr "Kirim melalui surel"
@ -510,10 +726,10 @@ msgid ""
" creation of this budget management project and we will " " creation of this budget management project and we will "
"send them an email for you." "send them an email for you."
msgstr "" msgstr ""
"Spesifikkan daftar alamat surel (dipisah dengan koma) yang akan Anda kirim " "Spesifikkan daftar alamat surel (dipisah dengan koma) yang akan Anda "
"pemberitahuan tentang\n" "kirim pemberitahuan tentang\n"
" pembuatan dari manajemen anggaran proyek ini dan kami akan " " pembuatan dari manajemen anggaran proyek ini dan kami "
"memngirim mereka sebuah surel." "akan memngirim mereka sebuah surel."
msgid "Who pays?" msgid "Who pays?"
msgstr "Siapa membayar?" msgstr "Siapa membayar?"
@ -521,14 +737,24 @@ msgstr "Siapa membayar?"
msgid "To whom?" msgid "To whom?"
msgstr "Kepada siapa?" msgstr "Kepada siapa?"
msgid "Who?"
msgstr "Siapa?"
msgid "Paid" msgid "Paid"
msgstr "Dibayar" msgstr "Dibayar"
msgid "Spent" msgid "Spent"
msgstr "Dihabiskan" msgstr "Dihabiskan"
msgid "Balance" msgid "Expenses by Month"
msgstr "Saldo" msgstr ""
msgid "Period"
msgstr ""
#~ msgid "%(member)s had been added"
#~ msgstr "%(member)s telah ditambahkan"
#~ msgid "Someone probably"
#~ msgstr ""
#~ msgid "cleared the project history."
#~ msgstr ""

View file

@ -1,19 +1,19 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-09-30 23:53+0200\n" "POT-Creation-Date: 2020-04-25 13:02+0200\n"
"PO-Revision-Date: 2019-11-12 09:04+0000\n" "PO-Revision-Date: 2019-11-12 09:04+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\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: 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" "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" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Generated-By: Babel 2.8.0\n"
"X-Generator: Weblate 3.10-dev\n"
"Generated-By: Babel 2.7.0\n"
msgid "" msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are " "Not a valid amount or expression. Only numbers and + - * / operators are "
@ -31,6 +31,18 @@ msgstr "Privat kode"
msgid "Email" msgid "Email"
msgstr "E-post" msgstr "E-post"
msgid "Enable project history"
msgstr ""
msgid "Use IP tracking for project history"
msgstr ""
msgid "Import previously exported JSON file"
msgstr ""
msgid "Import"
msgstr ""
msgid "Project identifier" msgid "Project identifier"
msgstr "Prosjektidentifikator" msgstr "Prosjektidentifikator"
@ -129,6 +141,15 @@ msgstr "Send invitasjoner"
msgid "The email %(email)s is not valid" msgid "The email %(email)s is not valid"
msgstr "E-posten \"%(email)s\" er ikke gyldig" msgstr "E-posten \"%(email)s\" er ikke gyldig"
msgid "Participant"
msgstr ""
msgid "Bill"
msgstr ""
msgid "Project"
msgstr "Prosjekt"
msgid "Too many failed login attempts, please retry later." msgid "Too many failed login attempts, please retry later."
msgstr "For mange mislykkede innloggingsforsøk, prøv igjen senere." msgstr "For mange mislykkede innloggingsforsøk, prøv igjen senere."
@ -165,6 +186,12 @@ msgstr "Ukjent prosjekt"
msgid "Password successfully reset." msgid "Password successfully reset."
msgstr "Passord tilbakestilt." msgstr "Passord tilbakestilt."
msgid "Project successfully uploaded"
msgstr ""
msgid "Invalid JSON"
msgstr ""
#, fuzzy #, fuzzy
msgid "Project successfully deleted" msgid "Project successfully deleted"
msgstr "Prosjekt slettet" msgstr "Prosjekt slettet"
@ -179,8 +206,8 @@ msgid "Your invitations have been sent"
msgstr "Invitasjonene dine har blitt sendt" msgstr "Invitasjonene dine har blitt sendt"
#, python-format #, python-format
msgid "%(member)s had been added" msgid "%(member)s has been added"
msgstr "%(member)s lagt til" msgstr ""
#, python-format #, python-format
msgid "%(name)s is part of this project again" msgid "%(name)s is part of this project again"
@ -237,9 +264,6 @@ msgstr "?"
msgid "Create a new project" msgid "Create a new project"
msgstr "Opprett et nytt prosjekt" msgstr "Opprett et nytt prosjekt"
msgid "Project"
msgstr "Prosjekt"
msgid "Number of members" msgid "Number of members"
msgstr "Antall medlemmer" msgstr "Antall medlemmer"
@ -261,6 +285,10 @@ msgstr "rediger"
msgid "delete" msgid "delete"
msgstr "slett" msgstr "slett"
#, fuzzy
msgid "see"
msgstr "se"
msgid "The Dashboard is currently deactivated." msgid "The Dashboard is currently deactivated."
msgstr "Oversikten er for tiden avskrudd." msgstr "Oversikten er for tiden avskrudd."
@ -270,6 +298,12 @@ msgstr "er du sikker?"
msgid "Edit project" msgid "Edit project"
msgstr "Rediger prosjekt" msgstr "Rediger prosjekt"
msgid "Import JSON"
msgstr ""
msgid "Choose file"
msgstr ""
msgid "Download project's data" msgid "Download project's data"
msgstr "Last ned prosjektets data" msgstr "Last ned prosjektets data"
@ -294,6 +328,9 @@ msgstr "Husker du ikke passordet?"
msgid "Cancel" msgid "Cancel"
msgstr "Avbryt" msgstr "Avbryt"
msgid "Privacy Settings"
msgstr ""
msgid "Edit the project" msgid "Edit the project"
msgstr "Rediger prosjektet" msgstr "Rediger prosjektet"
@ -325,6 +362,178 @@ msgstr "Send ut invitasjonene"
msgid "Download" msgid "Download"
msgstr "Last nd" msgstr "Last nd"
msgid "Disabled Project History"
msgstr ""
msgid "Disabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled Project History"
msgstr ""
msgid "Disabled IP Address Recording"
msgstr ""
msgid "Enabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled IP Address Recording"
msgstr ""
msgid "History Settings Changed"
msgstr ""
msgid "changed"
msgstr ""
msgid "from"
msgstr ""
msgid "to"
msgstr ""
msgid "Confirm Remove IP Adresses"
msgstr ""
msgid ""
"Are you sure you want to delete all recorded IP addresses from this "
"project?\n"
" The rest of the project history will be unaffected. This "
"action cannot be undone."
msgstr ""
msgid "Close"
msgstr ""
msgid "Confirm Delete"
msgstr ""
msgid "Delete Confirmation"
msgstr ""
msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
msgid "Added"
msgstr ""
msgid "Removed"
msgstr ""
msgid "and"
msgstr ""
msgid "owers list"
msgstr ""
msgid "Who?"
msgstr "Hvem?"
#, fuzzy
msgid "Balance"
msgstr "Kontobalanse"
#, python-format
msgid ""
"\n"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily" msgid "Manage your shared <br />expenses, easily"
msgstr "Håndter delte <br />utgifter, enkelt" msgstr "Håndter delte <br />utgifter, enkelt"
@ -376,6 +585,9 @@ msgstr "Gjør opp"
msgid "Statistics" msgid "Statistics"
msgstr "Statistikk" msgstr "Statistikk"
msgid "History"
msgstr ""
msgid "Settings" msgid "Settings"
msgstr "Innstillinger" msgstr "Innstillinger"
@ -436,6 +648,12 @@ msgstr "Du kan starte ved å legge til deltagere"
msgid "Add a new bill" msgid "Add a new bill"
msgstr "Legg til en ny regning" msgstr "Legg til en ny regning"
msgid "Newer bills"
msgstr ""
msgid "Older bills"
msgstr ""
msgid "When?" msgid "When?"
msgstr "Når?" msgstr "Når?"
@ -462,10 +680,6 @@ msgstr "Alle, unntagen %(excluded)s"
msgid "each" msgid "each"
msgstr "hver" msgstr "hver"
#, fuzzy
msgid "see"
msgstr "se"
msgid "No bills" msgid "No bills"
msgstr "Ingen regninger" msgstr "Ingen regninger"
@ -546,18 +760,17 @@ msgstr "Hvem betaler?"
msgid "To whom?" msgid "To whom?"
msgstr "Til hvem?" msgstr "Til hvem?"
msgid "Who?"
msgstr "Hvem?"
msgid "Paid" msgid "Paid"
msgstr "Betalt" msgstr "Betalt"
msgid "Spent" msgid "Spent"
msgstr "Forbrukt" msgstr "Forbrukt"
#, fuzzy msgid "Expenses by Month"
msgid "Balance" msgstr ""
msgstr "Kontobalanse"
msgid "Period"
msgstr ""
#~ msgid "" #~ msgid ""
#~ "The project identifier is used to " #~ "The project identifier is used to "
@ -672,3 +885,6 @@ msgstr "Kontobalanse"
#~ "En lenke for å tilbakestille passordet" #~ "En lenke for å tilbakestille passordet"
#~ " har blitt sent til deg per " #~ " har blitt sent til deg per "
#~ "e-post." #~ "e-post."
#~ msgid "%(member)s had been added"
#~ msgstr "%(member)s lagt til"

View file

@ -1,19 +1,19 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-09-30 23:53+0200\n" "POT-Creation-Date: 2020-04-25 13:02+0200\n"
"PO-Revision-Date: 2019-10-07 22:56+0000\n" "PO-Revision-Date: 2019-10-07 22:56+0000\n"
"Last-Translator: Heimen Stoffels <vistausss@outlook.com>\n" "Last-Translator: Heimen Stoffels <vistausss@outlook.com>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/nl/>\n"
"Language: 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" "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" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Generated-By: Babel 2.8.0\n"
"X-Generator: Weblate 3.9-dev\n"
"Generated-By: Babel 2.7.0\n"
msgid "" msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are " "Not a valid amount or expression. Only numbers and + - * / operators are "
@ -29,6 +29,18 @@ msgstr "Privécode"
msgid "Email" msgid "Email"
msgstr "E-mailadres" msgstr "E-mailadres"
msgid "Enable project history"
msgstr ""
msgid "Use IP tracking for project history"
msgstr ""
msgid "Import previously exported JSON file"
msgstr ""
msgid "Import"
msgstr ""
msgid "Project identifier" msgid "Project identifier"
msgstr "Project-id" msgstr "Project-id"
@ -123,6 +135,15 @@ msgstr "Uitnodigingen versturen"
msgid "The email %(email)s is not valid" msgid "The email %(email)s is not valid"
msgstr "Het e-mailadres '%(email)s' is onjuist" msgstr "Het e-mailadres '%(email)s' is onjuist"
msgid "Participant"
msgstr ""
msgid "Bill"
msgstr ""
msgid "Project"
msgstr "Project"
msgid "Too many failed login attempts, please retry later." msgid "Too many failed login attempts, please retry later."
msgstr "Te vaak onjuist ingelogd. Probeer het later opnieuw." msgstr "Te vaak onjuist ingelogd. Probeer het later opnieuw."
@ -158,6 +179,12 @@ msgstr "Onbekend project"
msgid "Password successfully reset." msgid "Password successfully reset."
msgstr "Wachtwoord is hersteld." msgstr "Wachtwoord is hersteld."
msgid "Project successfully uploaded"
msgstr ""
msgid "Invalid JSON"
msgstr ""
msgid "Project successfully deleted" msgid "Project successfully deleted"
msgstr "Project is verwijderd" msgstr "Project is verwijderd"
@ -169,8 +196,8 @@ msgid "Your invitations have been sent"
msgstr "Je uitnodigingen zijn verstuurd" msgstr "Je uitnodigingen zijn verstuurd"
#, python-format #, python-format
msgid "%(member)s had been added" msgid "%(member)s has been added"
msgstr "%(member)s is toegevoegd" msgstr ""
#, python-format #, python-format
msgid "%(name)s is part of this project again" msgid "%(name)s is part of this project again"
@ -225,9 +252,6 @@ msgstr "?"
msgid "Create a new project" msgid "Create a new project"
msgstr "Nieuw project aanmaken" msgstr "Nieuw project aanmaken"
msgid "Project"
msgstr "Project"
msgid "Number of members" msgid "Number of members"
msgstr "Aantal deelnemers" msgstr "Aantal deelnemers"
@ -249,6 +273,9 @@ msgstr "bewerken"
msgid "delete" msgid "delete"
msgstr "verwijderen" msgstr "verwijderen"
msgid "see"
msgstr "bekijk"
msgid "The Dashboard is currently deactivated." msgid "The Dashboard is currently deactivated."
msgstr "De overzichtspagina is momenteel uitgeschakeld." msgstr "De overzichtspagina is momenteel uitgeschakeld."
@ -258,6 +285,12 @@ msgstr "weet je het zeker?"
msgid "Edit project" msgid "Edit project"
msgstr "Project aanpassen" msgstr "Project aanpassen"
msgid "Import JSON"
msgstr ""
msgid "Choose file"
msgstr ""
msgid "Download project's data" msgid "Download project's data"
msgstr "Projectgegevens downloaden" msgstr "Projectgegevens downloaden"
@ -281,6 +314,9 @@ msgstr "Ben je je wachtwoord vergeten?"
msgid "Cancel" msgid "Cancel"
msgstr "Annuleren" msgstr "Annuleren"
msgid "Privacy Settings"
msgstr ""
msgid "Edit the project" msgid "Edit the project"
msgstr "Project bewerken" msgstr "Project bewerken"
@ -311,6 +347,177 @@ msgstr "Uitnodigingen versturen"
msgid "Download" msgid "Download"
msgstr "Downloaden" msgstr "Downloaden"
msgid "Disabled Project History"
msgstr ""
msgid "Disabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled Project History"
msgstr ""
msgid "Disabled IP Address Recording"
msgstr ""
msgid "Enabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled IP Address Recording"
msgstr ""
msgid "History Settings Changed"
msgstr ""
msgid "changed"
msgstr ""
msgid "from"
msgstr ""
msgid "to"
msgstr ""
msgid "Confirm Remove IP Adresses"
msgstr ""
msgid ""
"Are you sure you want to delete all recorded IP addresses from this "
"project?\n"
" The rest of the project history will be unaffected. This "
"action cannot be undone."
msgstr ""
msgid "Close"
msgstr ""
msgid "Confirm Delete"
msgstr ""
msgid "Delete Confirmation"
msgstr ""
msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
msgid "Added"
msgstr ""
msgid "Removed"
msgstr ""
msgid "and"
msgstr ""
msgid "owers list"
msgstr ""
msgid "Who?"
msgstr "Wie?"
msgid "Balance"
msgstr "Saldo"
#, python-format
msgid ""
"\n"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily" msgid "Manage your shared <br />expenses, easily"
msgstr "Beheer eenvoudig je <br />gedeelde uitgaven" msgstr "Beheer eenvoudig je <br />gedeelde uitgaven"
@ -360,6 +567,9 @@ msgstr "Schikken"
msgid "Statistics" msgid "Statistics"
msgstr "Statistieken" msgstr "Statistieken"
msgid "History"
msgstr ""
msgid "Settings" msgid "Settings"
msgstr "Instellingen" msgstr "Instellingen"
@ -417,6 +627,12 @@ msgstr "Begin met het toevoegen van deelnemers"
msgid "Add a new bill" msgid "Add a new bill"
msgstr "Nieuwe rekening toevoegen" msgstr "Nieuwe rekening toevoegen"
msgid "Newer bills"
msgstr ""
msgid "Older bills"
msgstr ""
msgid "When?" msgid "When?"
msgstr "Wanneer?" msgstr "Wanneer?"
@ -443,9 +659,6 @@ msgstr "Iedereen, behalve %(excluded)s"
msgid "each" msgid "each"
msgstr "per persoon" msgstr "per persoon"
msgid "see"
msgstr "bekijk"
msgid "No bills" msgid "No bills"
msgstr "Geen rekeningen" msgstr "Geen rekeningen"
@ -522,128 +735,14 @@ msgstr "Wie betaalt?"
msgid "To whom?" msgid "To whom?"
msgstr "Aan wie?" msgstr "Aan wie?"
msgid "Who?"
msgstr "Wie?"
msgid "Paid" msgid "Paid"
msgstr "Betaald" msgstr "Betaald"
msgid "Spent" msgid "Spent"
msgstr "Uitgegeven" msgstr "Uitgegeven"
msgid "Balance" msgid "Expenses by Month"
msgstr "Saldo" msgstr ""
#~ msgid "" msgid "Period"
#~ "The project identifier is used to " msgstr ""
#~ "log in and for the URL of "
#~ "the project. We tried to generate "
#~ "an identifier for you but a "
#~ "project with this identifier already "
#~ "exists. Please create a new identifier"
#~ " that you will be able to "
#~ "remember"
#~ msgstr ""
#~ "De project-id wordt gebruikt om in"
#~ " te loggen en als url van het"
#~ " project. We hebben geprobeerd om een"
#~ " id voor je te genereren, maar "
#~ "er is al een project met deze "
#~ "id. Creëer een nieuwe id die je"
#~ " makkelijk kunt onthouden."
#~ msgid ""
#~ "Not a valid amount or expression.Only"
#~ " numbers and + - * / "
#~ "operatorsare accepted."
#~ msgstr ""
#~ "Geen geldig bedrag of geldige expressie."
#~ " Alleen getallen en + - * / "
#~ "zijn toegestaan."
#~ msgid "What do you want to download ?"
#~ msgstr "Wat wil je downloaden?"
#~ msgid "bills"
#~ msgstr "rekeningen"
#~ msgid "transactions"
#~ msgstr "transacties"
#~ msgid "Export file format"
#~ msgstr "Bestandsformaat voor exporteren"
#~ msgid "Edit this project"
#~ msgstr "Dit project bewerken"
#~ msgid "Download this project's data"
#~ msgstr "Projectgegevens downloaden"
#~ msgid "Type user name here"
#~ msgstr "Typ hier de gebruikersnaam"
#~ msgid "No, thanks"
#~ msgstr "Nee, bedankt"
#~ msgid "Manage your shared <br>expenses, easily"
#~ msgstr "Beheer eenvoudig je gedeelde <br>uitgaven"
#~ msgid "Log to an existing project"
#~ msgstr "Log in op een bestaand project"
#~ msgid "log in"
#~ msgstr "inloggen"
#~ msgid "or create a new one"
#~ msgstr "of creëer een nieuwe"
#~ msgid "let's get started"
#~ msgstr "aan de slag"
#~ msgid "options"
#~ msgstr "opties"
#~ msgid "Project settings"
#~ msgstr "Projectinstellingen"
#~ msgid "This is a free software"
#~ msgstr "Dit is vrije software"
#~ msgid "Invite people to join this project!"
#~ msgstr "Nodig mensen uit voor dit project!"
#~ msgid "Added on"
#~ msgstr "Toegevoegd op"
#~ msgid "Nothing to list yet. You probably want to"
#~ msgstr "Er kan nog geen opsomming worden gemaakt. Voeg"
#~ msgid ""
#~ "Specify a (comma separated) list of "
#~ "email adresses you want to notify "
#~ "about the\n"
#~ "creation of this budget management "
#~ "project and we will send them an"
#~ " email for you."
#~ msgstr ""
#~ "Geef een kommagescheiden lijst van "
#~ "e-mailadressen op. Deze mensen worden op"
#~ " de\n"
#~ "hoogte gebracht van het bestaan van "
#~ "dit project en wij sturen hen een"
#~ " e-mail."
#~ msgid ""
#~ "If you prefer, you can share the project identifier and the shared\n"
#~ "password by other communication means. "
#~ "Or even directly share the following "
#~ "link:"
#~ msgstr ""
#~ "Als je wilt, dan kun je de project-id en het gedeelde wachtwoord\n"
#~ "delen via andere kanalen. Of deel gewoon de volgende link:"
#~ msgid "A link to reset your password has been sent to your email."
#~ msgstr ""
#~ "Er is een link met "
#~ "wachtwoordherstelinstructies naar je e-mailadres "
#~ "verstuurd."

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 21:48+0200\n" "POT-Creation-Date: 2020-04-25 13:02+0200\n"
"PO-Revision-Date: 2019-08-07 13:24+0000\n" "PO-Revision-Date: 2019-08-07 13:24+0000\n"
"Last-Translator: Mesut Akcan <makcan@gmail.com>\n" "Last-Translator: Mesut Akcan <makcan@gmail.com>\n"
"Language: tr\n" "Language: tr\n"
@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.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" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.7.0\n" "Generated-By: Babel 2.8.0\n"
msgid "" msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are " "Not a valid amount or expression. Only numbers and + - * / operators are "
@ -31,6 +31,18 @@ msgstr "Özel kod"
msgid "Email" msgid "Email"
msgstr "E-posta" msgstr "E-posta"
msgid "Enable project history"
msgstr ""
msgid "Use IP tracking for project history"
msgstr ""
msgid "Import previously exported JSON file"
msgstr ""
msgid "Import"
msgstr ""
msgid "Project identifier" msgid "Project identifier"
msgstr "Proje tanımlayıcısı" msgstr "Proje tanımlayıcısı"
@ -127,6 +139,15 @@ msgstr ""
msgid "The email %(email)s is not valid" msgid "The email %(email)s is not valid"
msgstr "" msgstr ""
msgid "Participant"
msgstr ""
msgid "Bill"
msgstr ""
msgid "Project"
msgstr ""
msgid "Too many failed login attempts, please retry later." msgid "Too many failed login attempts, please retry later."
msgstr "" msgstr ""
@ -160,6 +181,12 @@ msgstr ""
msgid "Password successfully reset." msgid "Password successfully reset."
msgstr "" msgstr ""
msgid "Project successfully uploaded"
msgstr ""
msgid "Invalid JSON"
msgstr ""
msgid "Project successfully deleted" msgid "Project successfully deleted"
msgstr "" msgstr ""
@ -171,7 +198,7 @@ msgid "Your invitations have been sent"
msgstr "" msgstr ""
#, python-format #, python-format
msgid "%(member)s had been added" msgid "%(member)s has been added"
msgstr "" msgstr ""
#, python-format #, python-format
@ -225,9 +252,6 @@ msgstr ""
msgid "Create a new project" msgid "Create a new project"
msgstr "" msgstr ""
msgid "Project"
msgstr ""
msgid "Number of members" msgid "Number of members"
msgstr "" msgstr ""
@ -249,6 +273,9 @@ msgstr ""
msgid "delete" msgid "delete"
msgstr "" msgstr ""
msgid "see"
msgstr ""
msgid "The Dashboard is currently deactivated." msgid "The Dashboard is currently deactivated."
msgstr "" msgstr ""
@ -258,6 +285,12 @@ msgstr ""
msgid "Edit project" msgid "Edit project"
msgstr "" msgstr ""
msgid "Import JSON"
msgstr ""
msgid "Choose file"
msgstr ""
msgid "Download project's data" msgid "Download project's data"
msgstr "" msgstr ""
@ -279,6 +312,9 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr ""
msgid "Privacy Settings"
msgstr ""
msgid "Edit the project" msgid "Edit the project"
msgstr "" msgstr ""
@ -309,6 +345,177 @@ msgstr ""
msgid "Download" msgid "Download"
msgstr "" msgstr ""
msgid "Disabled Project History"
msgstr ""
msgid "Disabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled Project History"
msgstr ""
msgid "Disabled IP Address Recording"
msgstr ""
msgid "Enabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled IP Address Recording"
msgstr ""
msgid "History Settings Changed"
msgstr ""
msgid "changed"
msgstr ""
msgid "from"
msgstr ""
msgid "to"
msgstr ""
msgid "Confirm Remove IP Adresses"
msgstr ""
msgid ""
"Are you sure you want to delete all recorded IP addresses from this "
"project?\n"
" The rest of the project history will be unaffected. This "
"action cannot be undone."
msgstr ""
msgid "Close"
msgstr ""
msgid "Confirm Delete"
msgstr ""
msgid "Delete Confirmation"
msgstr ""
msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
msgid "Added"
msgstr ""
msgid "Removed"
msgstr ""
msgid "and"
msgstr ""
msgid "owers list"
msgstr ""
msgid "Who?"
msgstr ""
msgid "Balance"
msgstr ""
#, python-format
msgid ""
"\n"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily" msgid "Manage your shared <br />expenses, easily"
msgstr "" msgstr ""
@ -356,6 +563,9 @@ msgstr ""
msgid "Statistics" msgid "Statistics"
msgstr "" msgstr ""
msgid "History"
msgstr ""
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
@ -413,6 +623,12 @@ msgstr ""
msgid "Add a new bill" msgid "Add a new bill"
msgstr "" msgstr ""
msgid "Newer bills"
msgstr ""
msgid "Older bills"
msgstr ""
msgid "When?" msgid "When?"
msgstr "" msgstr ""
@ -439,9 +655,6 @@ msgstr ""
msgid "each" msgid "each"
msgstr "" msgstr ""
msgid "see"
msgstr ""
msgid "No bills" msgid "No bills"
msgstr "" msgstr ""
@ -510,91 +723,14 @@ msgstr ""
msgid "To whom?" msgid "To whom?"
msgstr "" msgstr ""
msgid "Who?"
msgstr ""
msgid "Paid" msgid "Paid"
msgstr "" msgstr ""
msgid "Spent" msgid "Spent"
msgstr "" msgstr ""
msgid "Balance" msgid "Expenses by Month"
msgstr "" msgstr ""
#~ msgid "What do you want to download ?" msgid "Period"
#~ msgstr "" msgstr ""
#~ msgid "bills"
#~ msgstr ""
#~ msgid "transactions"
#~ msgstr ""
#~ msgid "Export file format"
#~ msgstr ""
#~ msgid "Edit this project"
#~ msgstr ""
#~ msgid "Download this project's data"
#~ msgstr ""
#~ msgid "Type user name here"
#~ msgstr ""
#~ msgid "No, thanks"
#~ msgstr ""
#~ msgid "Manage your shared <br>expenses, easily"
#~ msgstr ""
#~ msgid "Log to an existing project"
#~ msgstr ""
#~ msgid "log in"
#~ msgstr ""
#~ msgid "or create a new one"
#~ msgstr ""
#~ msgid "let's get started"
#~ msgstr ""
#~ msgid "options"
#~ msgstr ""
#~ msgid "Project settings"
#~ msgstr ""
#~ msgid "This is a free software"
#~ msgstr ""
#~ msgid "Invite people to join this project!"
#~ msgstr ""
#~ msgid "Added on"
#~ msgstr ""
#~ msgid "Nothing to list yet. You probably want to"
#~ msgstr ""
#~ msgid ""
#~ "Specify a (comma separated) list of "
#~ "email adresses you want to notify "
#~ "about the\n"
#~ "creation of this budget management "
#~ "project and we will send them an"
#~ " email for you."
#~ msgstr ""
#~ msgid ""
#~ "If you prefer, you can share the project identifier and the shared\n"
#~ "password by other communication means. "
#~ "Or even directly share the following "
#~ "link:"
#~ msgstr ""
#~ msgid "A link to reset your password has been sent to your email."
#~ msgstr ""

Binary file not shown.

View file

@ -1,19 +1,20 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-12-05 15:35+0200\n" "POT-Creation-Date: 2020-04-25 13:02+0200\n"
"PO-Revision-Date: 2019-12-08 16:26+0000\n" "PO-Revision-Date: 2019-12-08 16:26+0000\n"
"Last-Translator: Tymofij Lytvynenko <till.svit@gmail.com>\n" "Last-Translator: Tymofij Lytvynenko <till.svit@gmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/uk/>\n"
"Language: uk\n" "Language: uk\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/i-hate-"
"money/i-hate-money/uk/>\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" "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" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=" "Generated-By: Babel 2.8.0\n"
"4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 3.10-dev\n"
msgid "" msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are " "Not a valid amount or expression. Only numbers and + - * / operators are "
@ -29,6 +30,18 @@ msgstr "Приватний код"
msgid "Email" msgid "Email"
msgstr "Е-пошта" msgstr "Е-пошта"
msgid "Enable project history"
msgstr ""
msgid "Use IP tracking for project history"
msgstr ""
msgid "Import previously exported JSON file"
msgstr ""
msgid "Import"
msgstr ""
msgid "Project identifier" msgid "Project identifier"
msgstr "Ідентифікатор проєкту" msgstr "Ідентифікатор проєкту"
@ -123,6 +136,15 @@ msgstr ""
msgid "The email %(email)s is not valid" msgid "The email %(email)s is not valid"
msgstr "" msgstr ""
msgid "Participant"
msgstr ""
msgid "Bill"
msgstr ""
msgid "Project"
msgstr ""
msgid "Too many failed login attempts, please retry later." msgid "Too many failed login attempts, please retry later."
msgstr "" msgstr ""
@ -156,6 +178,12 @@ msgstr ""
msgid "Password successfully reset." msgid "Password successfully reset."
msgstr "" msgstr ""
msgid "Project successfully uploaded"
msgstr ""
msgid "Invalid JSON"
msgstr ""
msgid "Project successfully deleted" msgid "Project successfully deleted"
msgstr "" msgstr ""
@ -167,7 +195,7 @@ msgid "Your invitations have been sent"
msgstr "" msgstr ""
#, python-format #, python-format
msgid "%(member)s had been added" msgid "%(member)s has been added"
msgstr "" msgstr ""
#, python-format #, python-format
@ -221,9 +249,6 @@ msgstr ""
msgid "Create a new project" msgid "Create a new project"
msgstr "" msgstr ""
msgid "Project"
msgstr ""
msgid "Number of members" msgid "Number of members"
msgstr "" msgstr ""
@ -245,6 +270,9 @@ msgstr ""
msgid "delete" msgid "delete"
msgstr "" msgstr ""
msgid "see"
msgstr ""
msgid "The Dashboard is currently deactivated." msgid "The Dashboard is currently deactivated."
msgstr "" msgstr ""
@ -254,6 +282,12 @@ msgstr ""
msgid "Edit project" msgid "Edit project"
msgstr "" msgstr ""
msgid "Import JSON"
msgstr ""
msgid "Choose file"
msgstr ""
msgid "Download project's data" msgid "Download project's data"
msgstr "" msgstr ""
@ -275,6 +309,9 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr ""
msgid "Privacy Settings"
msgstr ""
msgid "Edit the project" msgid "Edit the project"
msgstr "" msgstr ""
@ -305,6 +342,177 @@ msgstr ""
msgid "Download" msgid "Download"
msgstr "" msgstr ""
msgid "Disabled Project History"
msgstr ""
msgid "Disabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled Project History"
msgstr ""
msgid "Disabled IP Address Recording"
msgstr ""
msgid "Enabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled IP Address Recording"
msgstr ""
msgid "History Settings Changed"
msgstr ""
msgid "changed"
msgstr ""
msgid "from"
msgstr ""
msgid "to"
msgstr ""
msgid "Confirm Remove IP Adresses"
msgstr ""
msgid ""
"Are you sure you want to delete all recorded IP addresses from this "
"project?\n"
" The rest of the project history will be unaffected. This "
"action cannot be undone."
msgstr ""
msgid "Close"
msgstr ""
msgid "Confirm Delete"
msgstr ""
msgid "Delete Confirmation"
msgstr ""
msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
msgid "Added"
msgstr ""
msgid "Removed"
msgstr ""
msgid "and"
msgstr ""
msgid "owers list"
msgstr ""
msgid "Who?"
msgstr ""
msgid "Balance"
msgstr ""
#, python-format
msgid ""
"\n"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily" msgid "Manage your shared <br />expenses, easily"
msgstr "" msgstr ""
@ -352,6 +560,9 @@ msgstr ""
msgid "Statistics" msgid "Statistics"
msgstr "" msgstr ""
msgid "History"
msgstr ""
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
@ -409,6 +620,12 @@ msgstr ""
msgid "Add a new bill" msgid "Add a new bill"
msgstr "" msgstr ""
msgid "Newer bills"
msgstr ""
msgid "Older bills"
msgstr ""
msgid "When?" msgid "When?"
msgstr "" msgstr ""
@ -435,9 +652,6 @@ msgstr ""
msgid "each" msgid "each"
msgstr "" msgstr ""
msgid "see"
msgstr ""
msgid "No bills" msgid "No bills"
msgstr "" msgstr ""
@ -506,14 +720,14 @@ msgstr ""
msgid "To whom?" msgid "To whom?"
msgstr "" msgstr ""
msgid "Who?"
msgstr ""
msgid "Paid" msgid "Paid"
msgstr "" msgstr ""
msgid "Spent" msgid "Spent"
msgstr "" msgstr ""
msgid "Balance" msgid "Expenses by Month"
msgstr ""
msgid "Period"
msgstr "" msgstr ""

View file

@ -1,19 +1,20 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 21:48+0200\n" "POT-Creation-Date: 2020-04-25 13:02+0200\n"
"PO-Revision-Date: 2020-02-09 12:01+0000\n" "PO-Revision-Date: 2020-02-09 12:01+0000\n"
"Last-Translator: Muge Niu <mugeniu12138@gmail.com>\n" "Last-Translator: Muge Niu <mugeniu12138@gmail.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "Language: zh_HANS_CN\n"
"i-hate-money/i-hate-money/zh_Hans/>\n" "Language-Team: Chinese (Simplified) "
"Language: zh_HANS-CN\n" "<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" "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" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n" "Generated-By: Babel 2.8.0\n"
"X-Generator: Weblate 3.11-dev\n"
"Generated-By: Babel 2.7.0\n"
msgid "" msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are " "Not a valid amount or expression. Only numbers and + - * / operators are "
@ -29,6 +30,18 @@ msgstr "共享密钥"
msgid "Email" msgid "Email"
msgstr "邮箱" msgstr "邮箱"
msgid "Enable project history"
msgstr ""
msgid "Use IP tracking for project history"
msgstr ""
msgid "Import previously exported JSON file"
msgstr ""
msgid "Import"
msgstr ""
msgid "Project identifier" msgid "Project identifier"
msgstr "账目名称" msgstr "账目名称"
@ -123,6 +136,15 @@ msgstr ""
msgid "The email %(email)s is not valid" msgid "The email %(email)s is not valid"
msgstr "" msgstr ""
msgid "Participant"
msgstr ""
msgid "Bill"
msgstr ""
msgid "Project"
msgstr ""
msgid "Too many failed login attempts, please retry later." msgid "Too many failed login attempts, please retry later."
msgstr "" msgstr ""
@ -156,6 +178,12 @@ msgstr ""
msgid "Password successfully reset." msgid "Password successfully reset."
msgstr "" msgstr ""
msgid "Project successfully uploaded"
msgstr ""
msgid "Invalid JSON"
msgstr ""
msgid "Project successfully deleted" msgid "Project successfully deleted"
msgstr "" msgstr ""
@ -167,7 +195,7 @@ msgid "Your invitations have been sent"
msgstr "" msgstr ""
#, python-format #, python-format
msgid "%(member)s had been added" msgid "%(member)s has been added"
msgstr "" msgstr ""
#, python-format #, python-format
@ -221,9 +249,6 @@ msgstr ""
msgid "Create a new project" msgid "Create a new project"
msgstr "" msgstr ""
msgid "Project"
msgstr ""
msgid "Number of members" msgid "Number of members"
msgstr "" msgstr ""
@ -245,6 +270,9 @@ msgstr ""
msgid "delete" msgid "delete"
msgstr "" msgstr ""
msgid "see"
msgstr ""
msgid "The Dashboard is currently deactivated." msgid "The Dashboard is currently deactivated."
msgstr "" msgstr ""
@ -254,6 +282,12 @@ msgstr ""
msgid "Edit project" msgid "Edit project"
msgstr "" msgstr ""
msgid "Import JSON"
msgstr ""
msgid "Choose file"
msgstr ""
msgid "Download project's data" msgid "Download project's data"
msgstr "" msgstr ""
@ -275,6 +309,9 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "取消" msgstr "取消"
msgid "Privacy Settings"
msgstr ""
msgid "Edit the project" msgid "Edit the project"
msgstr "" msgstr ""
@ -305,6 +342,177 @@ msgstr ""
msgid "Download" msgid "Download"
msgstr "下载" msgstr "下载"
msgid "Disabled Project History"
msgstr ""
msgid "Disabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled Project History"
msgstr ""
msgid "Disabled IP Address Recording"
msgstr ""
msgid "Enabled Project History & IP Address Recording"
msgstr ""
msgid "Enabled IP Address Recording"
msgstr ""
msgid "History Settings Changed"
msgstr ""
msgid "changed"
msgstr ""
msgid "from"
msgstr ""
msgid "to"
msgstr ""
msgid "Confirm Remove IP Adresses"
msgstr ""
msgid ""
"Are you sure you want to delete all recorded IP addresses from this "
"project?\n"
" The rest of the project history will be unaffected. This "
"action cannot be undone."
msgstr ""
msgid "Close"
msgstr ""
msgid "Confirm Delete"
msgstr ""
msgid "Delete Confirmation"
msgstr ""
msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
msgid "Added"
msgstr ""
msgid "Removed"
msgstr ""
msgid "and"
msgstr ""
msgid "owers list"
msgstr ""
msgid "Who?"
msgstr "谁?"
msgid "Balance"
msgstr ""
#, python-format
msgid ""
"\n"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily" msgid "Manage your shared <br />expenses, easily"
msgstr "" msgstr ""
@ -352,6 +560,9 @@ msgstr ""
msgid "Statistics" msgid "Statistics"
msgstr "" msgstr ""
msgid "History"
msgstr ""
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
@ -409,6 +620,12 @@ msgstr ""
msgid "Add a new bill" msgid "Add a new bill"
msgstr "" msgstr ""
msgid "Newer bills"
msgstr ""
msgid "Older bills"
msgstr ""
msgid "When?" msgid "When?"
msgstr "什么时候?" msgstr "什么时候?"
@ -435,9 +652,6 @@ msgstr ""
msgid "each" msgid "each"
msgstr "" msgstr ""
msgid "see"
msgstr ""
msgid "No bills" msgid "No bills"
msgstr "" msgstr ""
@ -506,107 +720,14 @@ msgstr ""
msgid "To whom?" msgid "To whom?"
msgstr "" msgstr ""
msgid "Who?"
msgstr "谁?"
msgid "Paid" msgid "Paid"
msgstr "" msgstr ""
msgid "Spent" msgid "Spent"
msgstr "" msgstr ""
msgid "Balance" msgid "Expenses by Month"
msgstr "" msgstr ""
#~ msgid "" msgid "Period"
#~ "The project identifier is used to " msgstr ""
#~ "log in and for the URL of "
#~ "the project. We tried to generate "
#~ "an identifier for you but a "
#~ "project with this identifier already "
#~ "exists. Please create a new identifier"
#~ " that you will be able to "
#~ "remember"
#~ msgstr ""
#~ msgid ""
#~ "Not a valid amount or expression.Only"
#~ " numbers and + - * / "
#~ "operatorsare accepted."
#~ msgstr ""
#~ msgid "What do you want to download ?"
#~ msgstr "你想下载什么?"
#~ msgid "bills"
#~ msgstr ""
#~ msgid "transactions"
#~ msgstr ""
#~ msgid "Export file format"
#~ msgstr ""
#~ msgid "Edit this project"
#~ msgstr ""
#~ msgid "Download this project's data"
#~ msgstr ""
#~ msgid "Type user name here"
#~ msgstr ""
#~ msgid "No, thanks"
#~ msgstr ""
#~ msgid "Manage your shared <br>expenses, easily"
#~ msgstr ""
#~ msgid "Log to an existing project"
#~ msgstr ""
#~ msgid "log in"
#~ msgstr ""
#~ msgid "or create a new one"
#~ msgstr ""
#~ msgid "let's get started"
#~ msgstr ""
#~ msgid "options"
#~ msgstr ""
#~ msgid "Project settings"
#~ msgstr ""
#~ msgid "This is a free software"
#~ msgstr ""
#~ msgid "Invite people to join this project!"
#~ msgstr ""
#~ msgid "Added on"
#~ msgstr ""
#~ msgid "Nothing to list yet. You probably want to"
#~ msgstr ""
#~ msgid ""
#~ "Specify a (comma separated) list of "
#~ "email adresses you want to notify "
#~ "about the\n"
#~ "creation of this budget management "
#~ "project and we will send them an"
#~ " email for you."
#~ msgstr ""
#~ msgid ""
#~ "If you prefer, you can share the project identifier and the shared\n"
#~ "password by other communication means. "
#~ "Or even directly share the following "
#~ "link:"
#~ msgstr ""
#~ msgid "A link to reset your password has been sent to your email."
#~ msgstr ""

View file

@ -1,19 +1,17 @@
import re
import os
import ast import ast
import operator
from enum import Enum
from io import BytesIO, StringIO
import jinja2
from json import dumps, JSONEncoder
from flask import redirect, current_app
from babel import Locale
from werkzeug.routing import HTTPException, RoutingException
from datetime import datetime, timedelta
import csv import csv
from datetime import datetime, timedelta
from enum import Enum
from io import BytesIO, StringIO
from json import JSONEncoder, dumps
import operator
import os
import re
from babel import Locale
from flask import current_app, redirect
import jinja2
from werkzeug.routing import HTTPException, RoutingException
def slugify(value): def slugify(value):
@ -99,7 +97,7 @@ def static_include(filename):
def locale_from_iso(iso_code): def locale_from_iso(iso_code):
return Locale(iso_code) return Locale.parse(iso_code)
def list_of_dicts2json(dict_to_convert): def list_of_dicts2json(dict_to_convert):

View file

@ -8,25 +8,27 @@ Basically, this blueprint takes care of the authentication and provides
some shortcuts to make your life better when coding (see `pull_project` some shortcuts to make your life better when coding (see `pull_project`
and `add_project_id` for a quick overview) and `add_project_id` for a quick overview)
""" """
from datetime import datetime
from functools import wraps
import json import json
import os import os
from functools import wraps
from smtplib import SMTPRecipientsRefused from smtplib import SMTPRecipientsRefused
from dateutil.parser import parse from dateutil.parser import parse
from dateutil.relativedelta import relativedelta
from flask import ( from flask import (
abort,
Blueprint, Blueprint,
abort,
current_app, current_app,
flash, flash,
g, g,
redirect, redirect,
render_template, render_template,
request, request,
session,
url_for,
send_file, send_file,
send_from_directory, send_from_directory,
session,
url_for,
) )
from flask_babel import get_locale, gettext as _ from flask_babel import get_locale, gettext as _
from flask_mail import Message from flask_mail import Message
@ -42,23 +44,21 @@ from ihatemoney.forms import (
InviteForm, InviteForm,
MemberForm, MemberForm,
PasswordReminder, PasswordReminder,
ResetPasswordForm,
ProjectForm, ProjectForm,
get_billform_for, ResetPasswordForm,
UploadForm, UploadForm,
get_billform_for,
) )
from ihatemoney.history import get_history_queries, get_history from ihatemoney.history import get_history, get_history_queries
from ihatemoney.models import db, Project, Person, Bill, LoggingMode from ihatemoney.models import Bill, LoggingMode, Person, Project, db
from ihatemoney.utils import ( from ihatemoney.utils import (
Redirect303,
list_of_dicts2json,
list_of_dicts2csv,
LoginThrottler, LoginThrottler,
Redirect303,
get_members, get_members,
list_of_dicts2csv,
list_of_dicts2json,
same_bill, same_bill,
) )
from datetime import datetime
from dateutil.relativedelta import relativedelta
main = Blueprint("main", __name__) main = Blueprint("main", __name__)
@ -301,9 +301,7 @@ def create_project():
project=g.project.name, project=g.project.name,
) )
message_body = render_template( message_body = render_template(f"reminder_mail.{get_locale().language}.j2")
"reminder_mail.%s.j2" % get_locale().language
)
msg = Message( msg = Message(
message_title, body=message_body, recipients=[project.contact_email] message_title, body=message_body, recipients=[project.contact_email]
@ -337,7 +335,7 @@ def remind_password():
# get the project # get the project
project = Project.query.get(form.id.data) project = Project.query.get(form.id.data)
# send a link to reset the password # send a link to reset the password
password_reminder = "password_reminder.%s.j2" % get_locale().language password_reminder = f"password_reminder.{get_locale().language}.j2"
current_app.mail.send( current_app.mail.send(
Message( Message(
"password recovery", "password recovery",
@ -521,7 +519,7 @@ def export_project(file, format):
return send_file( return send_file(
file2export, file2export,
attachment_filename="%s-%s.%s" % (g.project.id, file, format), attachment_filename=f"{g.project.id}-{file}.{format}",
as_attachment=True, as_attachment=True,
) )
@ -571,7 +569,7 @@ def invite():
# send the email # send the email
message_body = render_template( message_body = render_template(
"invitation_mail.%s.j2" % get_locale().language f"invitation_mail.{get_locale().language}.j2"
) )
message_title = _( message_title = _(
@ -621,7 +619,7 @@ def add_member():
if form.validate(): if form.validate():
member = form.save(g.project, Person()) member = form.save(g.project, Person())
db.session.commit() db.session.commit()
flash(_("%(member)s had been added", member=member.name)) flash(_("%(member)s has been added", member=member.name))
return redirect(url_for(".list_bills")) return redirect(url_for(".list_bills"))
return render_template("add_member.html", form=form) return render_template("add_member.html", form=form)

View file

@ -1,28 +0,0 @@
alembic==1.2.0
aniso8601==8.0.0
Babel==2.7.0
blinker==1.4
Click==7.0
debts==0.4
dnspython==1.16.0
email-validator==1.0.4
Flask==1.1.1
Flask-Babel==0.12.2
Flask-Cors==3.0.8
Flask-Mail==0.9.1
Flask-Migrate==2.5.2
Flask-RESTful==0.3.7
Flask-Script==2.0.6
Flask-SQLAlchemy==2.4.1
Flask-WTF==0.14.2
idna==2.8
itsdangerous==1.1.0
Jinja2==2.10.1
Mako==1.1.0
MarkupSafe==1.1.1
python-dateutil==2.8.0
pytz==2019.2
SQLAlchemy==1.3.8
SQLAlchemy-Continuum==1.3.9
Werkzeug==0.16.0
WTForms==2.2.1

View file

@ -11,9 +11,9 @@ license = Custom BSD Beerware
classifiers = classifiers =
Programming Language :: Python Programming Language :: Python
Programming Language :: Python :: 3 Programming Language :: Python :: 3
Programming Language :: Python :: 3.5
Programming Language :: Python :: 3.6 Programming Language :: Python :: 3.6
Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.8
Topic :: Internet :: WWW/HTTP Topic :: Internet :: WWW/HTTP
Topic :: Internet :: WWW/HTTP :: WSGI :: Application Topic :: Internet :: WWW/HTTP :: WSGI :: Application
@ -22,29 +22,32 @@ packages = find:
include_package_data = True include_package_data = True
zip_safe = False zip_safe = False
install_requires = install_requires =
flask blinker==1.4
flask-wtf debts==0.5
flask-sqlalchemy<3.0 email_validator==1.0.5
SQLAlchemy-Continuum Flask-Babel==1.0.0
flask-mail Flask-Cors==3.0.8
Flask-Migrate Flask-Mail==0.9.1
Flask-script Flask-Migrate==2.5.3
flask-babel Flask-RESTful==0.3.8
flask-restful Flask-Script==2.0.6
jinja2 Flask-SQLAlchemy==2.4.1
blinker Flask-WTF==0.14.3
flask-cors WTForms==2.2.1
itsdangerous Flask==1.1.2
email_validator itsdangerous==1.1.0
debts Jinja2==2.11.2
SQLAlchemy-Continuum==1.3.9
[options.extras_require] [options.extras_require]
dev = dev =
zest.releaser black==19.10b0 ; python_version >= '3.6'
tox flake8==3.7.9
pytest Flask-Testing==0.8.0
flake8 isort==4.3.21
Flask-Testing pytest==5.4.1
tox==3.14.6
zest.releaser==6.20.1
[options.entry_points] [options.entry_points]
console_scripts = console_scripts =

17
tox.ini
View file

@ -1,5 +1,5 @@
[tox] [tox]
envlist = py37,py36,py35,docs,flake8,black envlist = py38,py37,py36,docs,flake8,black
skip_missing_interpreters = True skip_missing_interpreters = True
[testenv] [testenv]
@ -9,8 +9,7 @@ commands =
py.test --pyargs ihatemoney.tests.tests py.test --pyargs ihatemoney.tests.tests
deps = deps =
-rdev-requirements.txt -e.[dev]
-rrequirements.txt
# To be sure we are importing ihatemoney pkg from pip-installed version # To be sure we are importing ihatemoney pkg from pip-installed version
changedir = /tmp changedir = /tmp
@ -22,15 +21,13 @@ deps =
changedir = {toxinidir} changedir = {toxinidir}
[testenv:black] [testenv:black]
commands = black --check --target-version=py34 . commands =
deps = black --check --target-version=py34 .
-rdev-requirements.txt isort -c -rc .
changedir = {toxinidir} changedir = {toxinidir}
[testenv:flake8] [testenv:flake8]
commands = flake8 ihatemoney commands = flake8 ihatemoney
deps =
-rdev-requirements.txt
changedir = {toxinidir} changedir = {toxinidir}
[flake8] [flake8]
@ -42,6 +39,6 @@ extend-ignore =
[travis] [travis]
python = python =
3.5: py35 3.6: py36
3.6: py36, docs, black, flake8
3.7: py37 3.7: py37
3.8: py38, docs, black, flake8