diff --git a/.gitignore b/.gitignore
index 1b9de4d9..d8d18940 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,5 +10,6 @@ dist
build
.vscode
.env
-.pytest_cache
-
+.pytest_cache
+ihatemoney/budget.db
+.idea/
diff --git a/.isort.cfg b/.isort.cfg
new file mode 100644
index 00000000..ba73fb7a
--- /dev/null
+++ b/.isort.cfg
@@ -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/**
diff --git a/.travis.yml b/.travis.yml
index c18d65f8..ca72fb95 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,9 +1,9 @@
sudo: false
language: python
python:
- - "3.5"
- "3.6"
- "3.7"
+ - "3.8"
script: tox
install:
- pip install tox-travis
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 76831ccb..e4ecb923 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -9,7 +9,7 @@ This document describes changes between each past release.
- Add support for espanol latino america (es_419)
- Use the external debts lib to solve settlements (#476)
- Remove balance column in statistics view (#323)
-
+- Remove requirements files in favor of setup.cfg pinning (#558)
4.1.3 (2019-09-18)
==================
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 3b243fea..340471df 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -7,20 +7,27 @@ Adrien CLERC
Alexandre Avenel
Alexis Métaireau
Allan Nordhøy
+am97
+Andrew Dickinson
Arnaud Bos
Baptiste Jonglez
Benjamin Bouvier
Berteh
+bmatticus
Brice Maron
Byron Ullauri
Carey Metcalfe
Daniel Schreiber
+DavidRThrashJr
donkers
+Edwin Smulders
Elizabeth Sherrock
+eMerzh
Feth AREZKI
Frédéric Sureau
Glandos
Heimen Stoffels
+James Leong
Jocelyn Delalande
Lucas Verney
Luc Didry
@@ -37,3 +44,4 @@ Richard Coates
THANOS SIOURDAKIS
Toover
Xavier Mehrenberger
+zorun
diff --git a/MANIFEST.in b/MANIFEST.in
index 74ea23b1..d47086be 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,3 +1,3 @@
include *.rst
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
diff --git a/Makefile b/Makefile
index 42b0e263..a6817094 100644
--- a/Makefile
+++ b/Makefile
@@ -11,10 +11,10 @@ ZOPFLIPNG := zopflipng
.PHONY: all
all: install ## Alias for install
.PHONY: install
-install: virtualenv $(INSTALL_STAMP) ## Install dependencies
+install: virtualenv setup.cfg $(INSTALL_STAMP) ## Install dependencies
$(INSTALL_STAMP):
$(VENV)/bin/pip install -U pip
- $(VENV)/bin/pip install -r requirements.txt
+ $(VENV)/bin/pip install -e .
touch $(INSTALL_STAMP)
.PHONY: virtualenv
@@ -23,9 +23,9 @@ $(PYTHON):
$(VIRTUALENV) $(VENV)
.PHONY: install-dev
-install-dev: $(INSTALL_STAMP) $(DEV_STAMP) ## Install development dependencies
-$(DEV_STAMP): $(PYTHON) dev-requirements.txt
- $(VENV)/bin/pip install -Ur dev-requirements.txt
+install-dev: virtualenv setup.cfg $(INSTALL_STAMP) $(DEV_STAMP) ## Install development dependencies
+$(DEV_STAMP): $(PYTHON)
+ $(VENV)/bin/pip install -Ue .[dev]
touch $(DEV_STAMP)
.PHONY: remove-install-stamp
@@ -41,11 +41,19 @@ serve: install ## Run the ihatemoney server
$(PYTHON) -m ihatemoney.manage runserver
.PHONY: test
-test: $(DEV_STAMP) ## Run the tests
+test: install-dev ## Run the tests
$(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
-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
.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; \
$(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
clean: ## Destroy the virtual environment
rm -rf .venv
diff --git a/README.rst b/README.rst
index c2166955..84d73b4a 100644
--- a/README.rst
+++ b/README.rst
@@ -5,6 +5,10 @@ I hate money
:target: https://travis-ci.org/spiral-project/ihatemoney
: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.
It keeps track of who bought what, when, and for whom; and helps to settle the
bills.
@@ -21,7 +25,7 @@ encouraged to do so.
Requirements
============
-* **Python**: 3.5, 3.6, 3.7.
+* **Python**: 3.6, 3.7, 3.8.
* **Backends**: MySQL, PostgreSQL, SQLite, Memory.
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
`_ 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
diff --git a/dev-requirements.txt b/dev-requirements.txt
deleted file mode 100644
index 9163cf81..00000000
--- a/dev-requirements.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-zest.releaser
-tox
-pytest
-flake8
-Flask-Testing
-black ; python_version >= '3.6'
diff --git a/docs/conf.py b/docs/conf.py
index 82c0e03d..1ec26a5d 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,6 +1,3 @@
-# coding: utf8
-import sys, os
-
templates_path = ["_templates"]
source_suffix = ".rst"
master_doc = "index"
diff --git a/docs/contributing.rst b/docs/contributing.rst
index b053f8b6..8e0d69aa 100644
--- a/docs/contributing.rst
+++ b/docs/contributing.rst
@@ -1,84 +1,7 @@
Contributing
############
-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 `_,
-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 `_.
-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
-on github. 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 do so::
-
- make test
-
-We are using the `black `_ 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).
+on github. To get started, please read :ref:`setup-dev-environment` and
+:ref:`contributing-developer`.
As a designer / Front-end developer
-----------------------------------
@@ -139,6 +49,143 @@ will update the issue tracker with your feedback.
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 `_,
+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 `_.
+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 `_.
+
+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 `_ and
+`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 ?
================================
@@ -173,7 +220,7 @@ In order to prepare a new release, we are following the following steps:
make compress-assets
- Build the translations::
-
+
make update-translations
make build-translations
diff --git a/docs/installation.rst b/docs/installation.rst
index 4994499e..ca2b9bdf 100644
--- a/docs/installation.rst
+++ b/docs/installation.rst
@@ -17,7 +17,7 @@ Requirements
«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.
* **Virtualenv** (recommended): `virtualenv` package under Debian/Ubuntu.
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 75b31607..3cfd193c 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,2 +1,2 @@
-Sphinx==1.5.5
-docutils==0.13.1
+Sphinx==3.0.2
+docutils==0.16
diff --git a/ihatemoney/api/common.py b/ihatemoney/api/common.py
index 728d2a8e..9aefa2c8 100644
--- a/ihatemoney/api/common.py
+++ b/ihatemoney/api/common.py
@@ -1,12 +1,12 @@
-# coding: utf8
-from flask import request, current_app
+from functools import wraps
+
+from flask import current_app, request
from flask_restful import Resource, abort
+from werkzeug.security import check_password_hash
from wtforms.fields.core import BooleanField
-from ihatemoney.models import db, Project, Person, Bill
-from ihatemoney.forms import ProjectForm, EditProjectForm, MemberForm, get_billform_for
-from werkzeug.security import check_password_hash
-from functools import wraps
+from ihatemoney.forms import EditProjectForm, MemberForm, ProjectForm, get_billform_for
+from ihatemoney.models import Bill, Person, Project, db
def need_auth(f):
diff --git a/ihatemoney/api/v1/resources.py b/ihatemoney/api/v1/resources.py
index 821ba2bd..dc1708ce 100644
--- a/ihatemoney/api/v1/resources.py
+++ b/ihatemoney/api/v1/resources.py
@@ -1,17 +1,16 @@
-# coding: utf8
from flask import Blueprint
-from flask_restful import Api
from flask_cors import CORS
+from flask_restful import Api
from ihatemoney.api.common import (
- ProjectsHandler,
- ProjectHandler,
- TokenHandler,
- MemberHandler,
- ProjectStatsHandler,
- MembersHandler,
BillHandler,
BillsHandler,
+ MemberHandler,
+ MembersHandler,
+ ProjectHandler,
+ ProjectsHandler,
+ ProjectStatsHandler,
+ TokenHandler,
)
api = Blueprint("api", __name__, url_prefix="/api")
diff --git a/ihatemoney/budget.db b/ihatemoney/budget.db
deleted file mode 100644
index e69de29b..00000000
diff --git a/ihatemoney/default_settings.py b/ihatemoney/default_settings.py
index 7ce44220..4895ab98 100644
--- a/ihatemoney/default_settings.py
+++ b/ihatemoney/default_settings.py
@@ -8,4 +8,4 @@ ACTIVATE_DEMO_PROJECT = True
ADMIN_PASSWORD = ""
ALLOW_PUBLIC_PROJECT_CREATION = True
ACTIVATE_ADMIN_DASHBOARD = False
-SUPPORTED_LANGUAGES = ["en", "fr", "de", "nl", "es_419"]
+SUPPORTED_LANGUAGES = ["en", "fr", "de", "nl", "es_419", "nb_NO", "id"]
diff --git a/ihatemoney/forms.py b/ihatemoney/forms.py
index 0426b758..7f2e0dce 100644
--- a/ihatemoney/forms.py
+++ b/ihatemoney/forms.py
@@ -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 jinja2 import Markup
+from werkzeug.security import check_password_hash, generate_password_hash
from wtforms.fields.core import SelectField, SelectMultipleField
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 (
- Email,
DataRequired,
- ValidationError,
+ Email,
EqualTo,
NumberRange,
Optional,
+ ValidationError,
)
-from flask_wtf.file import FileField, FileAllowed, FileRequired
-from flask_babel import lazy_gettext as _
-from flask import request
-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
+from ihatemoney.models import LoggingMode, Person, Project
+from ihatemoney.utils import eval_arithmetic_expression, slugify
def strip_filter(string):
diff --git a/ihatemoney/history.py b/ihatemoney/history.py
index cda141e4..9dda3de6 100644
--- a/ihatemoney/history.py
+++ b/ihatemoney/history.py
@@ -1,15 +1,7 @@
from flask_babel import gettext as _
-from sqlalchemy_continuum import (
- Operation,
- parent_class,
-)
+from sqlalchemy_continuum import Operation, parent_class
-from ihatemoney.models import (
- PersonVersion,
- ProjectVersion,
- BillVersion,
- Person,
-)
+from ihatemoney.models import BillVersion, Person, PersonVersion, ProjectVersion
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 in version_list:
object_type = {
- "Person": _("Person"),
+ "Person": _("Participant"),
"Bill": _("Bill"),
"Project": _("Project"),
}[parent_class(type(version)).__name__]
diff --git a/ihatemoney/manage.py b/ihatemoney/manage.py
index 6343ee7c..eb1e24c2 100755
--- a/ihatemoney/manage.py
+++ b/ihatemoney/manage.py
@@ -1,16 +1,16 @@
#!/usr/bin/env python
+import getpass
import os
import random
import sys
-import getpass
-from flask_script import Manager, Command, Option
from flask_migrate import Migrate, MigrateCommand
+from flask_script import Command, Manager, Option
from werkzeug.security import generate_password_hash
+from ihatemoney.models import Project, db
from ihatemoney.run import create_app
-from ihatemoney.models import db, Project
from ihatemoney.utils import create_jinja_env
@@ -51,7 +51,7 @@ class GenerateConfig(Command):
def run(self, config_file):
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)
pkg_path = os.path.abspath(os.path.dirname(__file__))
diff --git a/ihatemoney/messages.pot b/ihatemoney/messages.pot
index d6401a56..63f16cd0 100644
--- a/ihatemoney/messages.pot
+++ b/ihatemoney/messages.pot
@@ -12,6 +12,18 @@ msgstr ""
msgid "Email"
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"
msgstr ""
@@ -106,6 +118,15 @@ msgstr ""
msgid "The email %(email)s is not valid"
msgstr ""
+msgid "Participant"
+msgstr ""
+
+msgid "Bill"
+msgstr ""
+
+msgid "Project"
+msgstr ""
+
msgid "Too many failed login attempts, please retry later."
msgstr ""
@@ -139,6 +160,12 @@ msgstr ""
msgid "Password successfully reset."
msgstr ""
+msgid "Project successfully uploaded"
+msgstr ""
+
+msgid "Invalid JSON"
+msgstr ""
+
msgid "Project successfully deleted"
msgstr ""
@@ -150,7 +177,7 @@ msgid "Your invitations have been sent"
msgstr ""
#, python-format
-msgid "%(member)s had been added"
+msgid "%(member)s has been added"
msgstr ""
#, python-format
@@ -204,9 +231,6 @@ msgstr ""
msgid "Create a new project"
msgstr ""
-msgid "Project"
-msgstr ""
-
msgid "Number of members"
msgstr ""
@@ -228,6 +252,9 @@ msgstr ""
msgid "delete"
msgstr ""
+msgid "see"
+msgstr ""
+
msgid "The Dashboard is currently deactivated."
msgstr ""
@@ -237,6 +264,12 @@ msgstr ""
msgid "Edit project"
msgstr ""
+msgid "Import JSON"
+msgstr ""
+
+msgid "Choose file"
+msgstr ""
+
msgid "Download project's data"
msgstr ""
@@ -258,6 +291,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Privacy Settings"
+msgstr ""
+
msgid "Edit the project"
msgstr ""
@@ -288,6 +324,177 @@ msgstr ""
msgid "Download"
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"
+" This project has history disabled. New actions won't "
+"appear below. You can enable history on the\n"
+" settings page\n"
+" "
+msgstr ""
+
+msgid ""
+"\n"
+" The table below reflects actions recorded prior to "
+"disabling project history. You can\n"
+" clear project history to remove "
+"them.
\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
expenses, easily"
msgstr ""
@@ -335,6 +542,9 @@ msgstr ""
msgid "Statistics"
msgstr ""
+msgid "History"
+msgstr ""
+
msgid "Settings"
msgstr ""
@@ -392,6 +602,12 @@ msgstr ""
msgid "Add a new bill"
msgstr ""
+msgid "Newer bills"
+msgstr ""
+
+msgid "Older bills"
+msgstr ""
+
msgid "When?"
msgstr ""
@@ -418,9 +634,6 @@ msgstr ""
msgid "each"
msgstr ""
-msgid "see"
-msgstr ""
-
msgid "No bills"
msgstr ""
@@ -489,15 +702,15 @@ msgstr ""
msgid "To whom?"
msgstr ""
-msgid "Who?"
-msgstr ""
-
msgid "Paid"
msgstr ""
msgid "Spent"
msgstr ""
-msgid "Balance"
+msgid "Expenses by Month"
+msgstr ""
+
+msgid "Period"
msgstr ""
diff --git a/ihatemoney/migrations/env.py b/ihatemoney/migrations/env.py
index 4d4729c5..0bd0031e 100755
--- a/ihatemoney/migrations/env.py
+++ b/ihatemoney/migrations/env.py
@@ -41,7 +41,7 @@ def run_migrations_offline():
"""
url = config.get_main_option("sqlalchemy.url")
- context.configure(url=url)
+ context.configure(url=url, include_object=include_object)
with context.begin_transaction():
context.run_migrations()
@@ -75,6 +75,7 @@ def run_migrations_online():
context.configure(
connection=connection,
target_metadata=target_metadata,
+ include_object=include_object,
process_revision_directives=process_revision_directives,
**current_app.extensions["migrate"].configure_args
)
@@ -86,6 +87,12 @@ def run_migrations_online():
connection.close()
+def include_object(object, name, type_, reflected, compare_to):
+ if name == "sqlite_sequence":
+ return False
+ return True
+
+
if context.is_offline_mode():
run_migrations_offline()
else:
diff --git a/ihatemoney/migrations/versions/2dcb0c0048dc_autologger.py b/ihatemoney/migrations/versions/2dcb0c0048dc_autologger.py
index 08008355..b0b4f44c 100644
--- a/ihatemoney/migrations/versions/2dcb0c0048dc_autologger.py
+++ b/ihatemoney/migrations/versions/2dcb0c0048dc_autologger.py
@@ -165,21 +165,39 @@ def upgrade():
sa.Column("remote_addr", sa.String(length=50), nullable=True),
sa.PrimaryKeyConstraint("id"),
)
- op.add_column(
- "project",
- sa.Column(
- "logging_preference",
- sa.Enum("DISABLED", "ENABLED", "RECORD_IP", name="loggingmode"),
- server_default="ENABLED",
- nullable=False,
- ),
- )
+ 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(
+ "project",
+ sa.Column(
+ "logging_preference",
+ sa.Enum("DISABLED", "ENABLED", "RECORD_IP", name="loggingmode"),
+ server_default="ENABLED",
+ nullable=False,
+ ),
+ )
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
- op.drop_column("project", "logging_preference")
+
+ 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_table("transaction")
op.drop_index(
op.f("ix_project_version_transaction_id"), table_name="project_version"
diff --git a/ihatemoney/migrations/versions/cb038f79982e_sqlite_autoincrement.py b/ihatemoney/migrations/versions/cb038f79982e_sqlite_autoincrement.py
index ae5ab326..718aa75a 100644
--- a/ihatemoney/migrations/versions/cb038f79982e_sqlite_autoincrement.py
+++ b/ihatemoney/migrations/versions/cb038f79982e_sqlite_autoincrement.py
@@ -15,36 +15,46 @@ import sqlalchemy as sa
def upgrade():
- alter_table_batches = [
- op.batch_alter_table(
- "person", recreate="always", table_kwargs={"sqlite_autoincrement": True}
- ),
- op.batch_alter_table(
- "bill", recreate="always", table_kwargs={"sqlite_autoincrement": True}
- ),
- op.batch_alter_table(
- "billowers", recreate="always", table_kwargs={"sqlite_autoincrement": True}
- ),
- ]
+ bind = op.get_bind()
+ if bind.engine.name == "sqlite":
+ alter_table_batches = [
+ op.batch_alter_table(
+ "person", recreate="always", table_kwargs={"sqlite_autoincrement": True}
+ ),
+ op.batch_alter_table(
+ "bill", recreate="always", table_kwargs={"sqlite_autoincrement": True}
+ ),
+ op.batch_alter_table(
+ "billowers",
+ recreate="always",
+ table_kwargs={"sqlite_autoincrement": True},
+ ),
+ ]
- for batch_op in alter_table_batches:
- with batch_op:
- pass
+ for batch_op in alter_table_batches:
+ with batch_op:
+ pass
def downgrade():
- alter_table_batches = [
- op.batch_alter_table(
- "person", recreate="always", table_kwargs={"sqlite_autoincrement": False}
- ),
- op.batch_alter_table(
- "bill", recreate="always", table_kwargs={"sqlite_autoincrement": False}
- ),
- op.batch_alter_table(
- "billowers", recreate="always", table_kwargs={"sqlite_autoincrement": False}
- ),
- ]
+ bind = op.get_bind()
+ if bind.engine.name == "sqlite":
+ alter_table_batches = [
+ op.batch_alter_table(
+ "person",
+ recreate="always",
+ table_kwargs={"sqlite_autoincrement": False},
+ ),
+ op.batch_alter_table(
+ "bill", recreate="always", table_kwargs={"sqlite_autoincrement": False}
+ ),
+ op.batch_alter_table(
+ "billowers",
+ recreate="always",
+ table_kwargs={"sqlite_autoincrement": False},
+ ),
+ ]
- for batch_op in alter_table_batches:
- with batch_op:
- pass
+ for batch_op in alter_table_batches:
+ with batch_op:
+ pass
diff --git a/ihatemoney/models.py b/ihatemoney/models.py
index 53214946..1d546784 100644
--- a/ihatemoney/models.py
+++ b/ihatemoney/models.py
@@ -1,33 +1,29 @@
from collections import defaultdict
-
from datetime import datetime
-import sqlalchemy
-from flask_sqlalchemy import SQLAlchemy, BaseQuery
-from flask import g, current_app
-
from debts import settle
-from sqlalchemy import orm
-from sqlalchemy.sql import func
+from flask import current_app, g
+from flask_sqlalchemy import BaseQuery, SQLAlchemy
from itsdangerous import (
- TimedJSONWebSignatureSerializer,
- URLSafeSerializer,
BadSignature,
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 import version_class
from ihatemoney.patch_sqlalchemy_continuum import PatchedBuilder
from ihatemoney.versioning import (
- LoggingMode,
ConditionalVersioningManager,
- version_privacy_predicate,
+ LoggingMode,
get_ip_if_allowed,
+ version_privacy_predicate,
)
-
make_versioned(
user_cls=None,
manager=ConditionalVersioningManager(
@@ -327,7 +323,7 @@ class Project(db.Model):
return self.name
def __repr__(self):
- return "" % self.name
+ return f""
class Person(db.Model):
@@ -385,7 +381,7 @@ class Person(db.Model):
return self.name
def __repr__(self):
- return "" % (self.name, self.project.name)
+ return f""
# We need to manually define a join table for m2m relations
@@ -466,13 +462,12 @@ class Bill(db.Model):
return 0
def __str__(self):
- return "%s for %s" % (self.amount, self.what)
+ return self.what
def __repr__(self):
- return "" % (
- self.amount,
- self.payer,
- ", ".join([o.name for o in self.owers]),
+ return (
+ f""
)
diff --git a/ihatemoney/patch_sqlalchemy_continuum.py b/ihatemoney/patch_sqlalchemy_continuum.py
index e0680c6a..dbbd9083 100644
--- a/ihatemoney/patch_sqlalchemy_continuum.py
+++ b/ihatemoney/patch_sqlalchemy_continuum.py
@@ -38,7 +38,7 @@ from sqlalchemy_continuum import Operation
from sqlalchemy_continuum.builder import Builder
from sqlalchemy_continuum.expression_reflector import VersionExpressionReflector
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):
diff --git a/ihatemoney/run.py b/ihatemoney/run.py
index 161761c0..c4b53234 100644
--- a/ihatemoney/run.py
+++ b/ihatemoney/run.py
@@ -2,12 +2,13 @@ import os
import os.path
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_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 ihatemoney import default_settings
from ihatemoney.api.v1 import api as apiv1
from ihatemoney.models import db
from ihatemoney.utils import (
@@ -19,8 +20,6 @@ from ihatemoney.utils import (
)
from ihatemoney.web import main as web_interface
-from ihatemoney import default_settings
-
def setup_database(app):
"""Prepare the database. Create tables, run migrations etc."""
diff --git a/ihatemoney/templates/404.html b/ihatemoney/templates/404.html
index 7e282c2e..353f0be1 100644
--- a/ihatemoney/templates/404.html
+++ b/ihatemoney/templates/404.html
@@ -10,4 +10,5 @@
+
{% endblock %}
diff --git a/ihatemoney/templates/history.html b/ihatemoney/templates/history.html
index 875040e4..1ac3284f 100644
--- a/ihatemoney/templates/history.html
+++ b/ihatemoney/templates/history.html
@@ -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 %}
-
- {{ _("This project has history disabled. New actions won't appear below. You can enable history on the") }}
- {{ _("settings page") }}
+
{% set url = url_for(".edit_project") %}
+ {% trans %}
+ This project has history disabled. New actions won't appear below. You can enable history on the
+ settings page
+ {% endtrans %}
{% if history %}
-
{{ _("The table below reflects actions recorded prior to disabling project history. You can ") }}
- {{ _("clear project history") }} {{ _("to remove them.") }}
+
+ {% trans %}
+ The table below reflects actions recorded prior to disabling project history. You can
+ clear project history to remove them.
+ {% endtrans %}
{% endif %}
{% endif %}
{% if current_log_pref != LoggingMode.RECORD_IP and any_ip_addresses %}
-
{{ _("Some entries below contain IP addresses, even though this project has IP recording disabled. ") }}
- {{ _("Delete stored IP addresses") }}
+
+ {{ _("Some entries below contain IP addresses, even though this project has IP recording disabled. ") }}
+ {{ _("Delete stored IP addresses") }}
+
{% endif %}
{% endif %}
@@ -160,10 +167,11 @@
{{ _("Time") }} |
{{ _("Event") }} |
-
+
{{ _("From IP") }} |
@@ -201,7 +209,7 @@
{{ event.object_type }} {{ event.object_desc }}
{% if event.val_after == False %}{{ _("deactivated") }}{% else %}{{ _("reactivated") }}{% endif %}
{% elif event.prop_changed == "name" or event.prop_changed == "what" %}
- {{ describe_object(event) }} {{ _("renamed") }} {{ _("to") }} {{ event.val_after }}
+ {{ describe_object(event) }} {{ _("renamed to") }} {{ event.val_after }}
{% elif event.prop_changed == "weight" %}
{{ simple_property_change(event, _("Weight")) }}
{% elif event.prop_changed == "external_link" %}
@@ -240,8 +248,7 @@
{{ static_include("images/hand-holding-heart.svg") | safe }}
{{ _('Nothing to list')}}
- {{ _("Someone probably") }}
- {{ _("cleared the project history.") }}
+ {{ _("Someone probably cleared the project history.") }}
diff --git a/ihatemoney/tests/tests.py b/ihatemoney/tests/tests.py
index 7e0efb5c..d062930f 100644
--- a/ihatemoney/tests/tests.py
+++ b/ihatemoney/tests/tests.py
@@ -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
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_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 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
os.environ.pop("IHATEMONEY_SETTINGS_FILE_PATH", None)
@@ -62,7 +58,7 @@ class BaseTestCase(TestCase):
"name": name,
"id": name,
"password": name,
- "contact_email": "%s@notmyidea.org" % name,
+ "contact_email": f"{name}@notmyidea.org",
},
)
@@ -71,7 +67,7 @@ class BaseTestCase(TestCase):
id=name,
name=str(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.commit()
@@ -86,7 +82,7 @@ class IhatemoneyTestCase(BaseTestCase):
return self.assertEqual(
expected,
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
- 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
self.assertEqual(len(models.Project.query.get("raclette").members), 2)
@@ -423,7 +419,7 @@ class BudgetTestCase(IhatemoneyTestCase):
# a bill or displaying the balance
result = self.client.get("/raclette/")
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")
@@ -622,7 +618,7 @@ class BudgetTestCase(IhatemoneyTestCase):
# edit the bill
self.client.post(
- "/raclette/edit/%s" % bill.id,
+ f"/raclette/edit/{bill.id}",
data={
"date": "2011-08-10",
"what": "fromage à raclette",
@@ -636,7 +632,7 @@ class BudgetTestCase(IhatemoneyTestCase):
self.assertEqual(bill.amount, 10, "bill edition")
# 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")
# test balance
@@ -1082,7 +1078,7 @@ class BudgetTestCase(IhatemoneyTestCase):
self.assertNotEqual(
0.0,
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):
@@ -1428,7 +1424,7 @@ class APITestCase(IhatemoneyTestCase):
def api_create(self, name, id=None, password=None, contact=None):
id = id or name
password = password or name
- contact = contact or "%s@notmyidea.org" % name
+ contact = contact or f"{name}@notmyidea.org"
return self.client.post(
"/api/projects",
@@ -1442,7 +1438,7 @@ class APITestCase(IhatemoneyTestCase):
def api_add_member(self, project, name, weight=1):
self.client.post(
- "/api/projects/%s/members" % project,
+ f"/api/projects/{project}/members",
data={"name": name, "weight": weight},
headers=self.get_auth(project),
)
@@ -1450,11 +1446,11 @@ class APITestCase(IhatemoneyTestCase):
def get_auth(self, username, password=None):
password = password or username
base64string = (
- base64.encodebytes(("%s:%s" % (username, password)).encode("utf-8"))
+ base64.encodebytes(f"{username}:{password}".encode("utf-8"))
.decode("utf-8")
.replace("\n", "")
)
- return {"Authorization": "Basic %s" % base64string}
+ return {"Authorization": f"Basic {base64string}"}
def test_cors_requests(self):
# Create a project and test that CORS headers are present if requested.
@@ -1610,7 +1606,7 @@ class APITestCase(IhatemoneyTestCase):
# Access with token
resp = self.client.get(
"/api/projects/raclette/token",
- headers={"Authorization": "Basic %s" % decoded_resp["token"]},
+ headers={"Authorization": f"Basic {decoded_resp['token']}"},
)
self.assertEqual(200, resp.status_code)
@@ -2139,10 +2135,10 @@ class APITestCase(IhatemoneyTestCase):
resp = self.client.get("/raclette/history", follow_redirects=True)
self.assertEqual(resp.status_code, 200)
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(
- "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(" -- | "), 2)
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
@@ -2278,7 +2274,7 @@ class HistoryTestCase(IhatemoneyTestCase):
resp = self.client.get("/demo/history")
self.assertEqual(resp.status_code, 200)
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(" -- | "), 1)
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(" -- | ", resp.data.decode("utf-8"))
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):
@@ -2350,18 +2346,16 @@ class HistoryTestCase(IhatemoneyTestCase):
resp = self.client.get("/demo/history")
self.assertEqual(resp.status_code, 200)
+ self.assertIn(f"Project {em_surround('demo')} added", resp.data.decode("utf-8"))
self.assertIn(
- "Project %s added" % em_surround("demo"), resp.data.decode("utf-8")
- )
- self.assertIn(
- "Project contact email changed to %s" % em_surround("demo2@notmyidea.org"),
+ f"Project contact email changed to {em_surround('demo2@notmyidea.org')}",
resp.data.decode("utf-8"),
)
self.assertIn(
"Project private code changed", resp.data.decode("utf-8"),
)
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(
resp.data.decode("utf-8").index("Project renamed "),
@@ -2477,7 +2471,7 @@ class HistoryTestCase(IhatemoneyTestCase):
# edit the bill
resp = self.client.post(
- "/demo/edit/%i" % bill_id,
+ f"/demo/edit/{bill_id}",
data={
"date": "2011-08-10",
"what": "fromage à raclette",
@@ -2489,12 +2483,12 @@ class HistoryTestCase(IhatemoneyTestCase):
)
self.assertEqual(resp.status_code, 200)
# 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)
# delete user using POST method
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)
@@ -2596,7 +2590,7 @@ class HistoryTestCase(IhatemoneyTestCase):
resp = self.client.get("/demo/history")
self.assertEqual(resp.status_code, 200)
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
@@ -2616,7 +2610,7 @@ class HistoryTestCase(IhatemoneyTestCase):
resp = self.client.get("/demo/history")
self.assertEqual(resp.status_code, 200)
self.assertIn(
- "Bill %s added" % em_surround("25.0 for fromage à raclette"),
+ f"Bill {em_surround('fromage à raclette')} added",
resp.data.decode("utf-8"),
)
@@ -2637,26 +2631,26 @@ class HistoryTestCase(IhatemoneyTestCase):
resp = self.client.get("/demo/history")
self.assertEqual(resp.status_code, 200)
self.assertIn(
- "Bill %s added" % em_surround("25.0 for fromage à raclette"),
+ f"Bill {em_surround('fromage à raclette')} added",
resp.data.decode("utf-8"),
)
self.assertRegex(
resp.data.decode("utf-8"),
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("10.0", regex_escape=True),
),
)
self.assertIn(
"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"),
)
self.assertLess(
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"),
)
@@ -2668,8 +2662,7 @@ class HistoryTestCase(IhatemoneyTestCase):
resp = self.client.get("/demo/history")
self.assertEqual(resp.status_code, 200)
self.assertIn(
- "Bill %s removed" % em_surround("10.0 for new thing"),
- resp.data.decode("utf-8"),
+ f"Bill {em_surround('new thing')} removed", resp.data.decode("utf-8"),
)
# edit user
@@ -2684,7 +2677,7 @@ class HistoryTestCase(IhatemoneyTestCase):
self.assertEqual(resp.status_code, 200)
self.assertRegex(
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("1.0", regex_escape=True),
@@ -2692,13 +2685,13 @@ class HistoryTestCase(IhatemoneyTestCase):
),
)
self.assertIn(
- "Person %s renamed to %s"
+ "Participant %s renamed to %s"
% (em_surround("alexis"), em_surround("new name"),),
resp.data.decode("utf-8"),
)
self.assertLess(
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"),
)
@@ -2710,7 +2703,7 @@ class HistoryTestCase(IhatemoneyTestCase):
resp = self.client.get("/demo/history")
self.assertEqual(resp.status_code, 200)
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):
@@ -2763,9 +2756,8 @@ class HistoryTestCase(IhatemoneyTestCase):
self.assertEqual(resp.status_code, 200)
self.assertRegex(
resp.data.decode("utf-8"),
- r"Bill %s:\s* Amount changed\s* from %s\s* to %s"
- % (
- em_surround("25.0 for Bill 1", regex_escape=True),
+ r"Bill {}:\s* Amount changed\s* from {}\s* to {}".format(
+ em_surround("Bill 1", regex_escape=True),
em_surround("25.0", regex_escape=True),
em_surround("88.0", regex_escape=True),
),
@@ -2773,8 +2765,7 @@ class HistoryTestCase(IhatemoneyTestCase):
self.assertNotRegex(
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 2", regex_escape=True),
),
@@ -2809,12 +2800,9 @@ class HistoryTestCase(IhatemoneyTestCase):
self.assertEqual(resp.status_code, 200)
self.assertEqual(resp.data.decode("utf-8").count(" -- | "), 5)
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(
- "Bill %s added" % em_surround("25.0 for Bill 1"), resp.data.decode("utf-8")
- )
- self.assertIn(
- "Bill %s removed" % em_surround("25.0 for Bill 1"),
- resp.data.decode("utf-8"),
+ f"Bill {em_surround('Bill 1')} removed", resp.data.decode("utf-8"),
)
# Add a new bill
@@ -2833,21 +2821,13 @@ class HistoryTestCase(IhatemoneyTestCase):
self.assertEqual(resp.status_code, 200)
self.assertEqual(resp.data.decode("utf-8").count(" -- | "), 6)
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
- self.assertIn(
- "Bill %s added" % em_surround("25.0 for Bill 1"), resp.data.decode("utf-8")
- )
+ self.assertIn(f"Bill {em_surround('Bill 1')} added", resp.data.decode("utf-8"))
self.assertEqual(
- resp.data.decode("utf-8").count(
- "Bill %s added" % em_surround("25.0 for Bill 1")
- ),
- 1,
+ resp.data.decode("utf-8").count(f"Bill {em_surround('Bill 1')} added"), 1,
)
+ self.assertIn(f"Bill {em_surround('Bill 2')} added", resp.data.decode("utf-8"))
self.assertIn(
- "Bill %s added" % em_surround("20.0 for Bill 2"), resp.data.decode("utf-8")
- )
- self.assertIn(
- "Bill %s removed" % em_surround("25.0 for Bill 1"),
- resp.data.decode("utf-8"),
+ f"Bill {em_surround('Bill 1')} removed", resp.data.decode("utf-8"),
)
def test_double_bill_double_person_edit_second_no_web(self):
diff --git a/ihatemoney/translations/cs/LC_MESSAGES/messages.mo b/ihatemoney/translations/cs/LC_MESSAGES/messages.mo
new file mode 100644
index 00000000..58260758
Binary files /dev/null and b/ihatemoney/translations/cs/LC_MESSAGES/messages.mo differ
diff --git a/ihatemoney/translations/cs/LC_MESSAGES/messages.po b/ihatemoney/translations/cs/LC_MESSAGES/messages.po
index adc914fb..ed2fddf0 100644
--- a/ihatemoney/translations/cs/LC_MESSAGES/messages.po
+++ b/ihatemoney/translations/cs/LC_MESSAGES/messages.po
@@ -1,16 +1,18 @@
+
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: Automatically generated\n"
-"Language-Team: none\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"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Translate Toolkit 2.4.0\n"
+"Generated-By: Babel 2.8.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@@ -26,6 +28,18 @@ msgstr ""
msgid "Email"
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"
msgstr ""
@@ -120,6 +134,15 @@ msgstr ""
msgid "The email %(email)s is not valid"
msgstr ""
+msgid "Participant"
+msgstr ""
+
+msgid "Bill"
+msgstr ""
+
+msgid "Project"
+msgstr ""
+
msgid "Too many failed login attempts, please retry later."
msgstr ""
@@ -153,6 +176,12 @@ msgstr ""
msgid "Password successfully reset."
msgstr ""
+msgid "Project successfully uploaded"
+msgstr ""
+
+msgid "Invalid JSON"
+msgstr ""
+
msgid "Project successfully deleted"
msgstr ""
@@ -164,7 +193,7 @@ msgid "Your invitations have been sent"
msgstr ""
#, python-format
-msgid "%(member)s had been added"
+msgid "%(member)s has been added"
msgstr ""
#, python-format
@@ -218,9 +247,6 @@ msgstr ""
msgid "Create a new project"
msgstr ""
-msgid "Project"
-msgstr ""
-
msgid "Number of members"
msgstr ""
@@ -242,6 +268,9 @@ msgstr ""
msgid "delete"
msgstr ""
+msgid "see"
+msgstr ""
+
msgid "The Dashboard is currently deactivated."
msgstr ""
@@ -251,6 +280,12 @@ msgstr ""
msgid "Edit project"
msgstr ""
+msgid "Import JSON"
+msgstr ""
+
+msgid "Choose file"
+msgstr ""
+
msgid "Download project's data"
msgstr ""
@@ -272,6 +307,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Privacy Settings"
+msgstr ""
+
msgid "Edit the project"
msgstr ""
@@ -302,6 +340,177 @@ msgstr ""
msgid "Download"
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"
+" This project has history disabled. New actions won't "
+"appear below. You can enable history on the\n"
+" settings page\n"
+" "
+msgstr ""
+
+msgid ""
+"\n"
+" The table below reflects actions recorded prior to "
+"disabling project history. You can\n"
+" clear project history to remove "
+"them.\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
expenses, easily"
msgstr ""
@@ -349,6 +558,9 @@ msgstr ""
msgid "Statistics"
msgstr ""
+msgid "History"
+msgstr ""
+
msgid "Settings"
msgstr ""
@@ -406,6 +618,12 @@ msgstr ""
msgid "Add a new bill"
msgstr ""
+msgid "Newer bills"
+msgstr ""
+
+msgid "Older bills"
+msgstr ""
+
msgid "When?"
msgstr ""
@@ -432,9 +650,6 @@ msgstr ""
msgid "each"
msgstr ""
-msgid "see"
-msgstr ""
-
msgid "No bills"
msgstr ""
@@ -503,14 +718,14 @@ msgstr ""
msgid "To whom?"
msgstr ""
-msgid "Who?"
-msgstr ""
-
msgid "Paid"
msgstr ""
msgid "Spent"
msgstr ""
-msgid "Balance"
+msgid "Expenses by Month"
+msgstr ""
+
+msgid "Period"
msgstr ""
diff --git a/ihatemoney/translations/de/LC_MESSAGES/messages.mo b/ihatemoney/translations/de/LC_MESSAGES/messages.mo
index f5065170..8cf55064 100644
Binary files a/ihatemoney/translations/de/LC_MESSAGES/messages.mo and b/ihatemoney/translations/de/LC_MESSAGES/messages.mo differ
diff --git a/ihatemoney/translations/de/LC_MESSAGES/messages.po b/ihatemoney/translations/de/LC_MESSAGES/messages.po
index d96ba17a..ee83f826 100644
--- a/ihatemoney/translations/de/LC_MESSAGES/messages.po
+++ b/ihatemoney/translations/de/LC_MESSAGES/messages.po
@@ -1,25 +1,26 @@
+
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: flolilo \n"
-"Language-Team: German \n"
"Language: de\n"
+"Language-Team: German \n"
+"Plural-Forms: nplurals=2; plural=n != 1\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.11-dev\n"
+"Generated-By: Babel 2.8.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
"accepted."
msgstr ""
-"Kein gültiger Betrag oder Ausdruck. Es werden nur Zahlen und die Operatoren +"
-" - * / akzeptiert."
+"Kein gültiger Betrag oder Ausdruck. Es werden nur Zahlen und die "
+"Operatoren + - * / akzeptiert."
msgid "Project name"
msgstr "Projektname"
@@ -30,6 +31,18 @@ msgstr "Privater Code"
msgid "Email"
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"
msgstr "Projektkennung"
@@ -41,8 +54,8 @@ msgid ""
"A project with this identifier (\"%(project)s\") already exists. Please "
"choose a new identifier"
msgstr ""
-"Ein Projekt mit der Kennung (\"%(project)s\") existiert bereits. Bitte wähle "
-"eine andere Kennung"
+"Ein Projekt mit der Kennung (\"%(project)s\") existiert bereits. Bitte "
+"wähle eine andere Kennung"
msgid "Get in"
msgstr "Eintreten"
@@ -80,6 +93,12 @@ msgstr "Von"
msgid "Amount paid"
msgstr "Betrag"
+msgid "External link"
+msgstr ""
+
+msgid "A link to an external document, related to this bill"
+msgstr ""
+
msgid "For whom?"
msgstr "Für wen?"
@@ -120,6 +139,15 @@ msgstr "Einladung senden"
msgid "The email %(email)s is not valid"
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."
msgstr "Zu viele fehlgeschlagene Anmeldeversuche, bitte versuche es später."
@@ -130,8 +158,7 @@ msgstr ""
"verbleibend."
msgid "You either provided a bad token or no project identifier."
-msgstr ""
-"Du hast entweder einen ungültigen Token oder keine Projekt-ID angegeben."
+msgstr "Du hast entweder einen ungültigen Token oder keine Projekt-ID angegeben."
msgid "This private code is not the right one"
msgstr "Der private Code ist nicht korrekt"
@@ -158,6 +185,12 @@ msgstr "Unbekanntes Projekt"
msgid "Password successfully reset."
msgstr "Passwort erfolgreich zurückgesetzt."
+msgid "Project successfully uploaded"
+msgstr ""
+
+msgid "Invalid JSON"
+msgstr ""
+
msgid "Project successfully deleted"
msgstr "Projekt erfolgreich gelöscht"
@@ -169,8 +202,8 @@ msgid "Your invitations have been sent"
msgstr "Deine Einladungen wurden versendet"
#, python-format
-msgid "%(member)s had been added"
-msgstr "%(member)s wurde(n) hinzugefügt"
+msgid "%(member)s has been added"
+msgstr ""
#, python-format
msgid "%(name)s is part of this project again"
@@ -225,9 +258,6 @@ msgstr "?"
msgid "Create a new project"
msgstr "Neues Projekt erstellen"
-msgid "Project"
-msgstr "Projekt"
-
msgid "Number of members"
msgstr "Anzahl der Teilnehmer"
@@ -249,6 +279,9 @@ msgstr "Bearbeiten"
msgid "delete"
msgstr "Löschen"
+msgid "see"
+msgstr ""
+
msgid "The Dashboard is currently deactivated."
msgstr "Das Dashboard ist aktuell deaktiviert."
@@ -258,6 +291,12 @@ msgstr "Bist du sicher?"
msgid "Edit project"
msgstr "Projekt bearbeiten"
+msgid "Import JSON"
+msgstr ""
+
+msgid "Choose file"
+msgstr ""
+
msgid "Download project's data"
msgstr "Projektdaten herunterladen"
@@ -279,6 +318,9 @@ msgstr "Passwort vergessen?"
msgid "Cancel"
msgstr "Abbrechen"
+msgid "Privacy Settings"
+msgstr ""
+
msgid "Edit the project"
msgstr "Projekt bearbeiten"
@@ -309,6 +351,177 @@ msgstr "Einladung versenden"
msgid "Download"
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"
+" This project has history disabled. New actions won't "
+"appear below. You can enable history on the\n"
+" settings page\n"
+" "
+msgstr ""
+
+msgid ""
+"\n"
+" The table below reflects actions recorded prior to "
+"disabling project history. You can\n"
+" clear project history to remove "
+"them.\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
expenses, easily"
msgstr "Verwalten deine geteilten
Ausgaben ganz einfach"
@@ -343,8 +556,9 @@ msgid ""
"This access code will be sent to your friends. It is stored as-is by the "
"server, so don\\'t reuse a personal password!"
msgstr ""
-"Dieser Zugangscode wird an deine Freunde gesendet. Es wird als Klartext auf "
-"dem Server gespeichert. Bitte verwenden daher kein persönliches Passwort!"
+"Dieser Zugangscode wird an deine Freunde gesendet. Es wird als Klartext "
+"auf dem Server gespeichert. Bitte verwenden daher kein persönliches "
+"Passwort!"
msgid "Account manager"
msgstr "Konten"
@@ -358,6 +572,9 @@ msgstr "Bilanz"
msgid "Statistics"
msgstr "Statistik"
+msgid "History"
+msgstr ""
+
msgid "Settings"
msgstr "Einstellungen"
@@ -415,6 +632,12 @@ msgstr "Du kannst anfangen, Teilnehmer hinzuzufügen"
msgid "Add a new bill"
msgstr "Neue Ausgabe"
+msgid "Newer bills"
+msgstr ""
+
+msgid "Older bills"
+msgstr ""
+
msgid "When?"
msgstr "Wann?"
@@ -485,8 +708,8 @@ msgid ""
"You can share the project identifier and the private code by any "
"communication means."
msgstr ""
-"Du kannst die Projekt-ID und den privaten Code auf jedem Kommunikationsweg "
-"weitergeben."
+"Du kannst die Projekt-ID und den privaten Code auf jedem "
+"Kommunikationsweg weitergeben."
msgid "Identifier:"
msgstr "ID:"
@@ -495,8 +718,7 @@ msgid "Share the Link"
msgstr "Link teilen"
msgid "You can directly share the following link via your prefered medium"
-msgstr ""
-"Du kannst den folgenden Link direkt über dein bevorzugtes Medium teilen"
+msgstr "Du kannst den folgenden Link direkt über dein bevorzugtes Medium teilen"
msgid "Send via Emails"
msgstr "Per E-Mail versenden"
@@ -507,10 +729,10 @@ msgid ""
" creation of this budget management project and we will "
"send them an email for you."
msgstr ""
-"Gib eine (durch Kommas getrennte) Liste von E-Mail-Adressen an, die du über "
-"die\n"
-"\t\t\tErstellung dieses Projekts informieren möchtest, und wir senden ihnen "
-"eine E-Mail."
+"Gib eine (durch Kommas getrennte) Liste von E-Mail-Adressen an, die du "
+"über die\n"
+"\t\t\tErstellung dieses Projekts informieren möchtest, und wir senden "
+"ihnen eine E-Mail."
msgid "Who pays?"
msgstr "Wer zahlt?"
@@ -518,14 +740,21 @@ msgstr "Wer zahlt?"
msgid "To whom?"
msgstr "An wen?"
-msgid "Who?"
-msgstr "Wer?"
-
msgid "Paid"
msgstr "Bezahlt"
msgid "Spent"
msgstr "Ausgegeben"
-msgid "Balance"
-msgstr "Bilanz"
+msgid "Expenses by Month"
+msgstr ""
+
+msgid "Period"
+msgstr ""
+
+#~ msgid "Someone probably"
+#~ msgstr ""
+
+#~ msgid "cleared the project history."
+#~ msgstr ""
+
diff --git a/ihatemoney/translations/el/LC_MESSAGES/messages.mo b/ihatemoney/translations/el/LC_MESSAGES/messages.mo
index 84234951..69086172 100644
Binary files a/ihatemoney/translations/el/LC_MESSAGES/messages.mo and b/ihatemoney/translations/el/LC_MESSAGES/messages.mo differ
diff --git a/ihatemoney/translations/el/LC_MESSAGES/messages.po b/ihatemoney/translations/el/LC_MESSAGES/messages.po
index 14132161..337012bb 100644
--- a/ihatemoney/translations/el/LC_MESSAGES/messages.po
+++ b/ihatemoney/translations/el/LC_MESSAGES/messages.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: Automatically generated\n"
"Language: el\n"
@@ -12,7 +12,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.7.0\n"
+"Generated-By: Babel 2.8.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@@ -28,6 +28,18 @@ msgstr ""
msgid "Email"
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"
msgstr ""
@@ -122,6 +134,15 @@ msgstr ""
msgid "The email %(email)s is not valid"
msgstr ""
+msgid "Participant"
+msgstr ""
+
+msgid "Bill"
+msgstr ""
+
+msgid "Project"
+msgstr ""
+
msgid "Too many failed login attempts, please retry later."
msgstr ""
@@ -155,6 +176,12 @@ msgstr ""
msgid "Password successfully reset."
msgstr ""
+msgid "Project successfully uploaded"
+msgstr ""
+
+msgid "Invalid JSON"
+msgstr ""
+
msgid "Project successfully deleted"
msgstr ""
@@ -166,7 +193,7 @@ msgid "Your invitations have been sent"
msgstr ""
#, python-format
-msgid "%(member)s had been added"
+msgid "%(member)s has been added"
msgstr ""
#, python-format
@@ -220,9 +247,6 @@ msgstr ""
msgid "Create a new project"
msgstr ""
-msgid "Project"
-msgstr ""
-
msgid "Number of members"
msgstr ""
@@ -244,6 +268,9 @@ msgstr ""
msgid "delete"
msgstr ""
+msgid "see"
+msgstr ""
+
msgid "The Dashboard is currently deactivated."
msgstr ""
@@ -253,6 +280,12 @@ msgstr ""
msgid "Edit project"
msgstr ""
+msgid "Import JSON"
+msgstr ""
+
+msgid "Choose file"
+msgstr ""
+
msgid "Download project's data"
msgstr ""
@@ -274,6 +307,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Privacy Settings"
+msgstr ""
+
msgid "Edit the project"
msgstr ""
@@ -304,6 +340,177 @@ msgstr ""
msgid "Download"
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"
+" This project has history disabled. New actions won't "
+"appear below. You can enable history on the\n"
+" settings page\n"
+" "
+msgstr ""
+
+msgid ""
+"\n"
+" The table below reflects actions recorded prior to "
+"disabling project history. You can\n"
+" clear project history to remove "
+"them.\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
expenses, easily"
msgstr ""
@@ -351,6 +558,9 @@ msgstr ""
msgid "Statistics"
msgstr ""
+msgid "History"
+msgstr ""
+
msgid "Settings"
msgstr ""
@@ -408,6 +618,12 @@ msgstr ""
msgid "Add a new bill"
msgstr ""
+msgid "Newer bills"
+msgstr ""
+
+msgid "Older bills"
+msgstr ""
+
msgid "When?"
msgstr ""
@@ -434,9 +650,6 @@ msgstr ""
msgid "each"
msgstr ""
-msgid "see"
-msgstr ""
-
msgid "No bills"
msgstr ""
@@ -505,97 +718,14 @@ msgstr ""
msgid "To whom?"
msgstr ""
-msgid "Who?"
-msgstr ""
-
msgid "Paid"
msgstr ""
msgid "Spent"
msgstr ""
-msgid "Balance"
+msgid "Expenses by Month"
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
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 ""
-
+msgid "Period"
+msgstr ""
diff --git a/ihatemoney/translations/es_419/LC_MESSAGES/messages.mo b/ihatemoney/translations/es_419/LC_MESSAGES/messages.mo
index 7f1de2cc..97e55c96 100644
Binary files a/ihatemoney/translations/es_419/LC_MESSAGES/messages.mo and b/ihatemoney/translations/es_419/LC_MESSAGES/messages.mo differ
diff --git a/ihatemoney/translations/es_419/LC_MESSAGES/messages.po b/ihatemoney/translations/es_419/LC_MESSAGES/messages.po
index 1ce97596..f6358b02 100644
--- a/ihatemoney/translations/es_419/LC_MESSAGES/messages.po
+++ b/ihatemoney/translations/es_419/LC_MESSAGES/messages.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: Diego Caraballo \n"
"Language: es_419\n"
@@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.7.0\n"
+"Generated-By: Babel 2.8.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@@ -31,6 +31,18 @@ msgstr "Código privado"
msgid "Email"
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"
msgstr "Identificador de proyecto"
@@ -127,6 +139,15 @@ msgstr "Enviar invitaciones"
msgid "The email %(email)s is not valid"
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."
msgstr ""
"Demasiados intentos fallidos de inicio de sesión, vuelva a intentarlo más"
@@ -164,6 +185,12 @@ msgstr "Proyecto desconocido"
msgid "Password successfully reset."
msgstr "Contraseña restablecida con éxito."
+msgid "Project successfully uploaded"
+msgstr ""
+
+msgid "Invalid JSON"
+msgstr ""
+
msgid "Project successfully deleted"
msgstr "Proyecto eliminado correctamente"
@@ -175,8 +202,8 @@ msgid "Your invitations have been sent"
msgstr "Sus invitaciones han sido enviadas"
#, python-format
-msgid "%(member)s had been added"
-msgstr "se han añadido %(member)s"
+msgid "%(member)s has been added"
+msgstr ""
#, python-format
msgid "%(name)s is part of this project again"
@@ -231,9 +258,6 @@ msgstr "?"
msgid "Create a new project"
msgstr "Crear un nuevo proyecto"
-msgid "Project"
-msgstr "Proyecto"
-
msgid "Number of members"
msgstr "Número de miembros"
@@ -255,6 +279,9 @@ msgstr "Editar"
msgid "delete"
msgstr "Eliminar"
+msgid "see"
+msgstr "ver"
+
msgid "The Dashboard is currently deactivated."
msgstr "El panel está desactivado actualmente."
@@ -264,6 +291,12 @@ msgstr "¿Estás seguro?"
msgid "Edit project"
msgstr "Editar proyecto"
+msgid "Import JSON"
+msgstr ""
+
+msgid "Choose file"
+msgstr ""
+
msgid "Download project's data"
msgstr "Descargar datos del proyecto"
@@ -287,6 +320,9 @@ msgstr "¿No recuerdas la contraseña?"
msgid "Cancel"
msgstr "Cancelar"
+msgid "Privacy Settings"
+msgstr ""
+
msgid "Edit the project"
msgstr "Editar el proyecto"
@@ -317,6 +353,177 @@ msgstr "Enviar las invitaciones"
msgid "Download"
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"
+" This project has history disabled. New actions won't "
+"appear below. You can enable history on the\n"
+" settings page\n"
+" "
+msgstr ""
+
+msgid ""
+"\n"
+" The table below reflects actions recorded prior to "
+"disabling project history. You can\n"
+" clear project history to remove "
+"them.\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
expenses, easily"
msgstr "Gestione sus gastos compartidos
fácilmente"
@@ -366,6 +573,9 @@ msgstr "Resolver"
msgid "Statistics"
msgstr "Estadísticas"
+msgid "History"
+msgstr ""
+
msgid "Settings"
msgstr "Configuración"
@@ -423,6 +633,12 @@ msgstr "Deberías comenzar agregando participantes"
msgid "Add a new bill"
msgstr "Añadir una nueva factura"
+msgid "Newer bills"
+msgstr ""
+
+msgid "Older bills"
+msgstr ""
+
msgid "When?"
msgstr "¿Cuando?"
@@ -449,9 +665,6 @@ msgstr "Todo el mundo menos %(excluded)s"
msgid "each"
msgstr "Cada"
-msgid "see"
-msgstr "ver"
-
msgid "No bills"
msgstr "Sin facturas"
@@ -530,15 +743,17 @@ msgstr "¿Quién paga?"
msgid "To whom?"
msgstr "¿A quién?"
-msgid "Who?"
-msgstr "¿Quién?"
-
msgid "Paid"
msgstr "Pagado"
msgid "Spent"
msgstr "Gastado"
-msgid "Balance"
-msgstr "Balance"
+msgid "Expenses by Month"
+msgstr ""
+msgid "Period"
+msgstr ""
+
+#~ msgid "%(member)s had been added"
+#~ msgstr "se han añadido %(member)s"
diff --git a/ihatemoney/translations/fr/LC_MESSAGES/messages.mo b/ihatemoney/translations/fr/LC_MESSAGES/messages.mo
index 1b05ab4f..21076f19 100644
Binary files a/ihatemoney/translations/fr/LC_MESSAGES/messages.mo and b/ihatemoney/translations/fr/LC_MESSAGES/messages.mo differ
diff --git a/ihatemoney/translations/fr/LC_MESSAGES/messages.po b/ihatemoney/translations/fr/LC_MESSAGES/messages.po
index f4c1f36c..56f19c9b 100644
--- a/ihatemoney/translations/fr/LC_MESSAGES/messages.po
+++ b/ihatemoney/translations/fr/LC_MESSAGES/messages.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2019-10-01 21:48+0200\n"
-"PO-Revision-Date: 2019-10-07 22:56+0000\n"
-"Last-Translator: Alexis Metaireau \n"
+"POT-Creation-Date: 2020-04-25 13:02+0200\n"
+"PO-Revision-Date: 2020-04-25 11:14+0000\n"
+"Last-Translator: Rémy Hubscher \n"
"Language-Team: French \n"
"Language: fr\n"
@@ -17,15 +17,15 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 3.9-dev\n"
-"Generated-By: Babel 2.7.0\n"
+"X-Generator: Weblate 4.0.2-dev\n"
+"Generated-By: Babel 2.8.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
"accepted."
msgstr ""
-"Ceci n'est pas pas un montant ou une expression valide. Seuls les nombres"
-" et les opérateurs + - * / sont acceptés."
+"Ceci n'est pas un montant ou une expression valide. Seuls les nombres et "
+"les opérateurs + - * / sont acceptés."
msgid "Project name"
msgstr "Nom de projet"
@@ -36,6 +36,18 @@ msgstr "Code d’accès"
msgid "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"
msgstr "Identifiant du projet"
@@ -132,6 +144,15 @@ msgstr "Envoyer les invitations"
msgid "The email %(email)s is not valid"
msgstr "L’email %(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."
msgstr "Trop d'échecs d’authentification successifs, veuillez réessayer plus tard."
@@ -167,6 +188,12 @@ msgstr "Project inconnu"
msgid "Password successfully reset."
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"
msgstr "Projet supprimé"
@@ -178,8 +205,8 @@ msgid "Your invitations have been sent"
msgstr "Vos invitations ont bien été envoyées"
#, python-format
-msgid "%(member)s had been added"
-msgstr "%(member)s a bien été ajouté"
+msgid "%(member)s has been added"
+msgstr "%(member)s a été ajouté"
#, python-format
msgid "%(name)s is part of this project again"
@@ -234,9 +261,6 @@ msgstr " ?"
msgid "Create a new project"
msgstr "Créer un nouveau projet"
-msgid "Project"
-msgstr "Projets"
-
msgid "Number of members"
msgstr "Nombre de membres"
@@ -258,6 +282,9 @@ msgstr "éditer"
msgid "delete"
msgstr "supprimer"
+msgid "see"
+msgstr "voir"
+
msgid "The Dashboard is currently deactivated."
msgstr "Le tableau de bord est actuellement désactivée."
@@ -267,6 +294,12 @@ msgstr "c’est sûr ?"
msgid "Edit project"
msgstr "Éditer le projet"
+msgid "Import JSON"
+msgstr "Import JSON"
+
+msgid "Choose file"
+msgstr "Choisir un fichier"
+
msgid "Download project's data"
msgstr "Télécharger les données du projet"
@@ -288,6 +321,9 @@ msgstr "Vous ne vous souvenez plus du code d’accès ?"
msgid "Cancel"
msgstr "Annuler"
+msgid "Privacy Settings"
+msgstr "Vie privée"
+
msgid "Edit the project"
msgstr "Éditer le projet"
@@ -318,6 +354,202 @@ msgstr "Envoyer les invitations"
msgid "Download"
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 l’enregistrement 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"
+" This project has history disabled. New actions won't "
+"appear below. You can enable history on the\n"
+" settings page\n"
+" "
+msgstr ""
+"\n"
+" 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 \n"
+" paramètres du projet\n"
+" "
+
+msgid ""
+"\n"
+" The table below reflects actions recorded prior to "
+"disabling project history. You can\n"
+" clear project history to remove "
+"them.\n"
+" "
+msgstr ""
+"\n"
+" Le tableau ci-dessous liste les actions enregistrées avant"
+" la désactivation de l'historique du projet. Vous pouvez\n"
+" clear project history cliquer ici pour"
+" les supprimer.\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
expenses, easily"
msgstr "Gérez vos dépenses
partagées, facilement"
@@ -367,6 +599,9 @@ msgstr "Remboursements"
msgid "Statistics"
msgstr "Statistiques"
+msgid "History"
+msgstr "Historique"
+
msgid "Settings"
msgstr "Options"
@@ -424,6 +659,12 @@ msgstr "Vous devriez commencer par ajouter des participants"
msgid "Add a new bill"
msgstr "Nouvelle facture"
+msgid "Newer bills"
+msgstr "Nouvelles factures"
+
+msgid "Older bills"
+msgstr "Ancienne factures"
+
msgid "When?"
msgstr "Quand ?"
@@ -450,9 +691,6 @@ msgstr "Tout le monde sauf %(excluded)s"
msgid "each"
msgstr "chacun"
-msgid "see"
-msgstr "voir"
-
msgid "No bills"
msgstr "Pas encore de factures"
@@ -527,27 +765,17 @@ msgstr "Qui doit payer ?"
msgid "To whom?"
msgstr "Pour qui ?"
-msgid "Who?"
-msgstr "Qui ?"
-
msgid "Paid"
msgstr "A payé"
msgid "Spent"
msgstr "A dépensé"
-msgid "Balance"
-msgstr "Solde"
-
-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 "Expenses by Month"
+msgstr "Dépenses par mois"
+msgid "Period"
+msgstr "Période"
#~ msgid ""
#~ "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."
#~ 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 d’historisation"
+
+#~ 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 l’historique 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 l’historique de ce projet"
+#~ " ? Cette action est irréversible."
diff --git a/ihatemoney/translations/id/LC_MESSAGES/messages.mo b/ihatemoney/translations/id/LC_MESSAGES/messages.mo
new file mode 100644
index 00000000..ad2962c1
Binary files /dev/null and b/ihatemoney/translations/id/LC_MESSAGES/messages.mo differ
diff --git a/ihatemoney/translations/id/LC_MESSAGES/messages.po b/ihatemoney/translations/id/LC_MESSAGES/messages.po
index 1a7f7edf..079048c7 100644
--- a/ihatemoney/translations/id/LC_MESSAGES/messages.po
+++ b/ihatemoney/translations/id/LC_MESSAGES/messages.po
@@ -1,24 +1,26 @@
+
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: Muhammad Fauzi \n"
-"Language-Team: Indonesian \n"
"Language: id\n"
+"Language-Team: Indonesian \n"
+"Plural-Forms: nplurals=1; plural=0\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.10-dev\n"
+"Generated-By: Babel 2.8.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
"accepted."
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"
msgstr "Nama proyek"
@@ -29,6 +31,18 @@ msgstr "Kode pribadi"
msgid "Email"
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"
msgstr "Pengidentifikasi proyek"
@@ -40,8 +54,8 @@ msgid ""
"A project with this identifier (\"%(project)s\") already exists. Please "
"choose a new identifier"
msgstr ""
-"Sebuah proyek dengan ID ini (\"%(project)s\") sudah ada. Silakan pilih ID "
-"baru"
+"Sebuah proyek dengan ID ini (\"%(project)s\") sudah ada. Silakan pilih ID"
+" baru"
msgid "Get in"
msgstr "Masuk"
@@ -125,6 +139,15 @@ msgstr "Kirim undangan"
msgid "The email %(email)s is not 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."
msgstr "Terlalu banyak percobaan masuk, silakan coba lagi nanti."
@@ -158,6 +181,12 @@ msgstr "Proyek tidak diketahui"
msgid "Password successfully reset."
msgstr "Kata sandi berhasil diatur ulang."
+msgid "Project successfully uploaded"
+msgstr ""
+
+msgid "Invalid JSON"
+msgstr ""
+
msgid "Project successfully deleted"
msgstr "Proyek berhasil dihapus"
@@ -169,8 +198,8 @@ msgid "Your invitations have been sent"
msgstr "Undangan Anda telah dikirim"
#, python-format
-msgid "%(member)s had been added"
-msgstr "%(member)s telah ditambahkan"
+msgid "%(member)s has been added"
+msgstr ""
#, python-format
msgid "%(name)s is part of this project again"
@@ -225,9 +254,6 @@ msgstr "?"
msgid "Create a new project"
msgstr "Buat proyek baru"
-msgid "Project"
-msgstr "Proyek"
-
msgid "Number of members"
msgstr "Jumlah anggota"
@@ -249,6 +275,9 @@ msgstr "ubah"
msgid "delete"
msgstr "hapus"
+msgid "see"
+msgstr "lihat"
+
msgid "The Dashboard is currently deactivated."
msgstr "Dasbor sekarang ini sedang dinonaktifkan."
@@ -258,6 +287,12 @@ msgstr "Anda yakin?"
msgid "Edit project"
msgstr "Ubah proyek"
+msgid "Import JSON"
+msgstr ""
+
+msgid "Choose file"
+msgstr ""
+
msgid "Download project's data"
msgstr "Unduh data proyek"
@@ -279,6 +314,9 @@ msgstr "Tidak bisa mengingat kata sandi?"
msgid "Cancel"
msgstr "Batalkan"
+msgid "Privacy Settings"
+msgstr ""
+
msgid "Edit the project"
msgstr "Ubah proyek"
@@ -309,6 +347,177 @@ msgstr "Kirim undangan"
msgid "Download"
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"
+" This project has history disabled. New actions won't "
+"appear below. You can enable history on the\n"
+" settings page\n"
+" "
+msgstr ""
+
+msgid ""
+"\n"
+" The table below reflects actions recorded prior to "
+"disabling project history. You can\n"
+" clear project history to remove "
+"them.\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
expenses, easily"
msgstr "Atur pembagian harga
Anda, dengan mudah"
@@ -343,8 +552,8 @@ msgid ""
"This access code will be sent to your friends. It is stored as-is by the "
"server, so don\\'t reuse a personal password!"
msgstr ""
-"Kode akses ini akan dikirimkan ke teman Anda. Kode ini disimpan dalam bentuk "
-"teks biasa dalam server, jadi jangan gunakan password Anda!"
+"Kode akses ini akan dikirimkan ke teman Anda. Kode ini disimpan dalam "
+"bentuk teks biasa dalam server, jadi jangan gunakan password Anda!"
msgid "Account manager"
msgstr "Pengatur akun"
@@ -358,6 +567,9 @@ msgstr "Atur"
msgid "Statistics"
msgstr "Statistik"
+msgid "History"
+msgstr ""
+
msgid "Settings"
msgstr "Pengaturan"
@@ -415,6 +627,12 @@ msgstr "Anda harus mulai dengan menambahkan partisipan"
msgid "Add a new bill"
msgstr "Tambah tagihan baru"
+msgid "Newer bills"
+msgstr ""
+
+msgid "Older bills"
+msgstr ""
+
msgid "When?"
msgstr "Kapan?"
@@ -441,9 +659,6 @@ msgstr "Semua orang kecuali %(excluded)s"
msgid "each"
msgstr "setiap"
-msgid "see"
-msgstr "lihat"
-
msgid "No bills"
msgstr "Tidak ada tagihan"
@@ -466,8 +681,8 @@ msgid ""
"A link to reset your password has been sent to you, please check your "
"emails."
msgstr ""
-"Tautan atur ulang kata sandi telah dikirim kepada Anda, silakan cek email "
-"Anda."
+"Tautan atur ulang kata sandi telah dikirim kepada Anda, silakan cek email"
+" Anda."
msgid "Return to home page"
msgstr "Kembali ke halaman depan"
@@ -499,7 +714,8 @@ msgstr "Bagikan tautan"
msgid "You can directly share the following link via your prefered medium"
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"
msgstr "Kirim melalui surel"
@@ -510,10 +726,10 @@ msgid ""
" creation of this budget management project and we will "
"send them an email for you."
msgstr ""
-"Spesifikkan daftar alamat surel (dipisah dengan koma) yang akan Anda kirim "
-"pemberitahuan tentang\n"
-" pembuatan dari manajemen anggaran proyek ini dan kami akan "
-"memngirim mereka sebuah surel."
+"Spesifikkan daftar alamat surel (dipisah dengan koma) yang akan Anda "
+"kirim pemberitahuan tentang\n"
+" pembuatan dari manajemen anggaran proyek ini dan kami "
+"akan memngirim mereka sebuah surel."
msgid "Who pays?"
msgstr "Siapa membayar?"
@@ -521,14 +737,24 @@ msgstr "Siapa membayar?"
msgid "To whom?"
msgstr "Kepada siapa?"
-msgid "Who?"
-msgstr "Siapa?"
-
msgid "Paid"
msgstr "Dibayar"
msgid "Spent"
msgstr "Dihabiskan"
-msgid "Balance"
-msgstr "Saldo"
+msgid "Expenses by Month"
+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 ""
+
diff --git a/ihatemoney/translations/nb_NO/LC_MESSAGES/messages.mo b/ihatemoney/translations/nb_NO/LC_MESSAGES/messages.mo
index dd628180..ae0a3ca3 100644
Binary files a/ihatemoney/translations/nb_NO/LC_MESSAGES/messages.mo and b/ihatemoney/translations/nb_NO/LC_MESSAGES/messages.mo differ
diff --git a/ihatemoney/translations/nb_NO/LC_MESSAGES/messages.po b/ihatemoney/translations/nb_NO/LC_MESSAGES/messages.po
index 1a95c5e6..22cf027b 100644
--- a/ihatemoney/translations/nb_NO/LC_MESSAGES/messages.po
+++ b/ihatemoney/translations/nb_NO/LC_MESSAGES/messages.po
@@ -1,19 +1,19 @@
+
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: Allan Nordhøy \n"
-"Language-Team: Norwegian Bokmål \n"
"Language: nb_NO\n"
+"Language-Team: Norwegian Bokmål \n"
+"Plural-Forms: nplurals=2; plural=n != 1\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.10-dev\n"
-"Generated-By: Babel 2.7.0\n"
+"Generated-By: Babel 2.8.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@@ -31,6 +31,18 @@ msgstr "Privat kode"
msgid "Email"
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"
msgstr "Prosjektidentifikator"
@@ -129,6 +141,15 @@ msgstr "Send invitasjoner"
msgid "The email %(email)s is not valid"
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."
msgstr "For mange mislykkede innloggingsforsøk, prøv igjen senere."
@@ -165,6 +186,12 @@ msgstr "Ukjent prosjekt"
msgid "Password successfully reset."
msgstr "Passord tilbakestilt."
+msgid "Project successfully uploaded"
+msgstr ""
+
+msgid "Invalid JSON"
+msgstr ""
+
#, fuzzy
msgid "Project successfully deleted"
msgstr "Prosjekt slettet"
@@ -179,8 +206,8 @@ msgid "Your invitations have been sent"
msgstr "Invitasjonene dine har blitt sendt"
#, python-format
-msgid "%(member)s had been added"
-msgstr "%(member)s lagt til"
+msgid "%(member)s has been added"
+msgstr ""
#, python-format
msgid "%(name)s is part of this project again"
@@ -237,9 +264,6 @@ msgstr "?"
msgid "Create a new project"
msgstr "Opprett et nytt prosjekt"
-msgid "Project"
-msgstr "Prosjekt"
-
msgid "Number of members"
msgstr "Antall medlemmer"
@@ -261,6 +285,10 @@ msgstr "rediger"
msgid "delete"
msgstr "slett"
+#, fuzzy
+msgid "see"
+msgstr "se"
+
msgid "The Dashboard is currently deactivated."
msgstr "Oversikten er for tiden avskrudd."
@@ -270,6 +298,12 @@ msgstr "er du sikker?"
msgid "Edit project"
msgstr "Rediger prosjekt"
+msgid "Import JSON"
+msgstr ""
+
+msgid "Choose file"
+msgstr ""
+
msgid "Download project's data"
msgstr "Last ned prosjektets data"
@@ -294,6 +328,9 @@ msgstr "Husker du ikke passordet?"
msgid "Cancel"
msgstr "Avbryt"
+msgid "Privacy Settings"
+msgstr ""
+
msgid "Edit the project"
msgstr "Rediger prosjektet"
@@ -325,6 +362,178 @@ msgstr "Send ut invitasjonene"
msgid "Download"
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"
+" This project has history disabled. New actions won't "
+"appear below. You can enable history on the\n"
+" settings page\n"
+" "
+msgstr ""
+
+msgid ""
+"\n"
+" The table below reflects actions recorded prior to "
+"disabling project history. You can\n"
+" clear project history to remove "
+"them.\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
expenses, easily"
msgstr "Håndter delte
utgifter, enkelt"
@@ -376,6 +585,9 @@ msgstr "Gjør opp"
msgid "Statistics"
msgstr "Statistikk"
+msgid "History"
+msgstr ""
+
msgid "Settings"
msgstr "Innstillinger"
@@ -436,6 +648,12 @@ msgstr "Du kan starte ved å legge til deltagere"
msgid "Add a new bill"
msgstr "Legg til en ny regning"
+msgid "Newer bills"
+msgstr ""
+
+msgid "Older bills"
+msgstr ""
+
msgid "When?"
msgstr "Når?"
@@ -462,10 +680,6 @@ msgstr "Alle, unntagen %(excluded)s"
msgid "each"
msgstr "hver"
-#, fuzzy
-msgid "see"
-msgstr "se"
-
msgid "No bills"
msgstr "Ingen regninger"
@@ -546,18 +760,17 @@ msgstr "Hvem betaler?"
msgid "To whom?"
msgstr "Til hvem?"
-msgid "Who?"
-msgstr "Hvem?"
-
msgid "Paid"
msgstr "Betalt"
msgid "Spent"
msgstr "Forbrukt"
-#, fuzzy
-msgid "Balance"
-msgstr "Kontobalanse"
+msgid "Expenses by Month"
+msgstr ""
+
+msgid "Period"
+msgstr ""
#~ msgid ""
#~ "The project identifier is used to "
@@ -672,3 +885,6 @@ msgstr "Kontobalanse"
#~ "En lenke for å tilbakestille passordet"
#~ " har blitt sent til deg per "
#~ "e-post."
+
+#~ msgid "%(member)s had been added"
+#~ msgstr "%(member)s lagt til"
diff --git a/ihatemoney/translations/nl/LC_MESSAGES/messages.mo b/ihatemoney/translations/nl/LC_MESSAGES/messages.mo
index 70d78297..7ce4bd35 100644
Binary files a/ihatemoney/translations/nl/LC_MESSAGES/messages.mo and b/ihatemoney/translations/nl/LC_MESSAGES/messages.mo differ
diff --git a/ihatemoney/translations/nl/LC_MESSAGES/messages.po b/ihatemoney/translations/nl/LC_MESSAGES/messages.po
index d93204e8..63cec532 100644
--- a/ihatemoney/translations/nl/LC_MESSAGES/messages.po
+++ b/ihatemoney/translations/nl/LC_MESSAGES/messages.po
@@ -1,19 +1,19 @@
+
msgid ""
msgstr ""
-"Project-Id-Version: \n"
+"Project-Id-Version: \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"
"Last-Translator: Heimen Stoffels \n"
-"Language-Team: Dutch \n"
"Language: nl\n"
+"Language-Team: Dutch \n"
+"Plural-Forms: nplurals=2; plural=n != 1\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.9-dev\n"
-"Generated-By: Babel 2.7.0\n"
+"Generated-By: Babel 2.8.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@@ -29,6 +29,18 @@ msgstr "Privécode"
msgid "Email"
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"
msgstr "Project-id"
@@ -123,6 +135,15 @@ msgstr "Uitnodigingen versturen"
msgid "The email %(email)s is not valid"
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."
msgstr "Te vaak onjuist ingelogd. Probeer het later opnieuw."
@@ -158,6 +179,12 @@ msgstr "Onbekend project"
msgid "Password successfully reset."
msgstr "Wachtwoord is hersteld."
+msgid "Project successfully uploaded"
+msgstr ""
+
+msgid "Invalid JSON"
+msgstr ""
+
msgid "Project successfully deleted"
msgstr "Project is verwijderd"
@@ -169,8 +196,8 @@ msgid "Your invitations have been sent"
msgstr "Je uitnodigingen zijn verstuurd"
#, python-format
-msgid "%(member)s had been added"
-msgstr "%(member)s is toegevoegd"
+msgid "%(member)s has been added"
+msgstr ""
#, python-format
msgid "%(name)s is part of this project again"
@@ -225,9 +252,6 @@ msgstr "?"
msgid "Create a new project"
msgstr "Nieuw project aanmaken"
-msgid "Project"
-msgstr "Project"
-
msgid "Number of members"
msgstr "Aantal deelnemers"
@@ -249,6 +273,9 @@ msgstr "bewerken"
msgid "delete"
msgstr "verwijderen"
+msgid "see"
+msgstr "bekijk"
+
msgid "The Dashboard is currently deactivated."
msgstr "De overzichtspagina is momenteel uitgeschakeld."
@@ -258,6 +285,12 @@ msgstr "weet je het zeker?"
msgid "Edit project"
msgstr "Project aanpassen"
+msgid "Import JSON"
+msgstr ""
+
+msgid "Choose file"
+msgstr ""
+
msgid "Download project's data"
msgstr "Projectgegevens downloaden"
@@ -281,6 +314,9 @@ msgstr "Ben je je wachtwoord vergeten?"
msgid "Cancel"
msgstr "Annuleren"
+msgid "Privacy Settings"
+msgstr ""
+
msgid "Edit the project"
msgstr "Project bewerken"
@@ -311,6 +347,177 @@ msgstr "Uitnodigingen versturen"
msgid "Download"
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"
+" This project has history disabled. New actions won't "
+"appear below. You can enable history on the\n"
+" settings page\n"
+" "
+msgstr ""
+
+msgid ""
+"\n"
+" The table below reflects actions recorded prior to "
+"disabling project history. You can\n"
+" clear project history to remove "
+"them.\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
expenses, easily"
msgstr "Beheer eenvoudig je
gedeelde uitgaven"
@@ -360,6 +567,9 @@ msgstr "Schikken"
msgid "Statistics"
msgstr "Statistieken"
+msgid "History"
+msgstr ""
+
msgid "Settings"
msgstr "Instellingen"
@@ -417,6 +627,12 @@ msgstr "Begin met het toevoegen van deelnemers"
msgid "Add a new bill"
msgstr "Nieuwe rekening toevoegen"
+msgid "Newer bills"
+msgstr ""
+
+msgid "Older bills"
+msgstr ""
+
msgid "When?"
msgstr "Wanneer?"
@@ -443,9 +659,6 @@ msgstr "Iedereen, behalve %(excluded)s"
msgid "each"
msgstr "per persoon"
-msgid "see"
-msgstr "bekijk"
-
msgid "No bills"
msgstr "Geen rekeningen"
@@ -522,128 +735,14 @@ msgstr "Wie betaalt?"
msgid "To whom?"
msgstr "Aan wie?"
-msgid "Who?"
-msgstr "Wie?"
-
msgid "Paid"
msgstr "Betaald"
msgid "Spent"
msgstr "Uitgegeven"
-msgid "Balance"
-msgstr "Saldo"
+msgid "Expenses by Month"
+msgstr ""
-#~ msgid ""
-#~ "The project identifier is used to "
-#~ "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
expenses, easily"
-#~ msgstr "Beheer eenvoudig je gedeelde
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."
+msgid "Period"
+msgstr ""
diff --git a/ihatemoney/translations/tr/LC_MESSAGES/messages.mo b/ihatemoney/translations/tr/LC_MESSAGES/messages.mo
index 94321980..b8383048 100644
Binary files a/ihatemoney/translations/tr/LC_MESSAGES/messages.mo and b/ihatemoney/translations/tr/LC_MESSAGES/messages.mo differ
diff --git a/ihatemoney/translations/tr/LC_MESSAGES/messages.po b/ihatemoney/translations/tr/LC_MESSAGES/messages.po
index c072285c..7e2d6a36 100644
--- a/ihatemoney/translations/tr/LC_MESSAGES/messages.po
+++ b/ihatemoney/translations/tr/LC_MESSAGES/messages.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: Mesut Akcan \n"
"Language: tr\n"
@@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.7.0\n"
+"Generated-By: Babel 2.8.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@@ -31,6 +31,18 @@ msgstr "Özel kod"
msgid "Email"
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"
msgstr "Proje tanımlayıcısı"
@@ -127,6 +139,15 @@ msgstr ""
msgid "The email %(email)s is not valid"
msgstr ""
+msgid "Participant"
+msgstr ""
+
+msgid "Bill"
+msgstr ""
+
+msgid "Project"
+msgstr ""
+
msgid "Too many failed login attempts, please retry later."
msgstr ""
@@ -160,6 +181,12 @@ msgstr ""
msgid "Password successfully reset."
msgstr ""
+msgid "Project successfully uploaded"
+msgstr ""
+
+msgid "Invalid JSON"
+msgstr ""
+
msgid "Project successfully deleted"
msgstr ""
@@ -171,7 +198,7 @@ msgid "Your invitations have been sent"
msgstr ""
#, python-format
-msgid "%(member)s had been added"
+msgid "%(member)s has been added"
msgstr ""
#, python-format
@@ -225,9 +252,6 @@ msgstr ""
msgid "Create a new project"
msgstr ""
-msgid "Project"
-msgstr ""
-
msgid "Number of members"
msgstr ""
@@ -249,6 +273,9 @@ msgstr ""
msgid "delete"
msgstr ""
+msgid "see"
+msgstr ""
+
msgid "The Dashboard is currently deactivated."
msgstr ""
@@ -258,6 +285,12 @@ msgstr ""
msgid "Edit project"
msgstr ""
+msgid "Import JSON"
+msgstr ""
+
+msgid "Choose file"
+msgstr ""
+
msgid "Download project's data"
msgstr ""
@@ -279,6 +312,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Privacy Settings"
+msgstr ""
+
msgid "Edit the project"
msgstr ""
@@ -309,6 +345,177 @@ msgstr ""
msgid "Download"
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"
+" This project has history disabled. New actions won't "
+"appear below. You can enable history on the\n"
+" settings page\n"
+" "
+msgstr ""
+
+msgid ""
+"\n"
+" The table below reflects actions recorded prior to "
+"disabling project history. You can\n"
+" clear project history to remove "
+"them.\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
expenses, easily"
msgstr ""
@@ -356,6 +563,9 @@ msgstr ""
msgid "Statistics"
msgstr ""
+msgid "History"
+msgstr ""
+
msgid "Settings"
msgstr ""
@@ -413,6 +623,12 @@ msgstr ""
msgid "Add a new bill"
msgstr ""
+msgid "Newer bills"
+msgstr ""
+
+msgid "Older bills"
+msgstr ""
+
msgid "When?"
msgstr ""
@@ -439,9 +655,6 @@ msgstr ""
msgid "each"
msgstr ""
-msgid "see"
-msgstr ""
-
msgid "No bills"
msgstr ""
@@ -510,91 +723,14 @@ msgstr ""
msgid "To whom?"
msgstr ""
-msgid "Who?"
-msgstr ""
-
msgid "Paid"
msgstr ""
msgid "Spent"
msgstr ""
-msgid "Balance"
+msgid "Expenses by Month"
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
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 ""
-
+msgid "Period"
+msgstr ""
diff --git a/ihatemoney/translations/uk/LC_MESSAGES/messages.mo b/ihatemoney/translations/uk/LC_MESSAGES/messages.mo
new file mode 100644
index 00000000..699828d9
Binary files /dev/null and b/ihatemoney/translations/uk/LC_MESSAGES/messages.mo differ
diff --git a/ihatemoney/translations/uk/LC_MESSAGES/messages.po b/ihatemoney/translations/uk/LC_MESSAGES/messages.po
index 27894755..3fa6e99d 100644
--- a/ihatemoney/translations/uk/LC_MESSAGES/messages.po
+++ b/ihatemoney/translations/uk/LC_MESSAGES/messages.po
@@ -1,19 +1,20 @@
+
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: Tymofij Lytvynenko \n"
-"Language-Team: Ukrainian \n"
"Language: uk\n"
+"Language-Team: Ukrainian \n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<="
-"4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 3.10-dev\n"
+"Generated-By: Babel 2.8.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@@ -29,6 +30,18 @@ msgstr "Приватний код"
msgid "Email"
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"
msgstr "Ідентифікатор проєкту"
@@ -123,6 +136,15 @@ msgstr ""
msgid "The email %(email)s is not valid"
msgstr ""
+msgid "Participant"
+msgstr ""
+
+msgid "Bill"
+msgstr ""
+
+msgid "Project"
+msgstr ""
+
msgid "Too many failed login attempts, please retry later."
msgstr ""
@@ -156,6 +178,12 @@ msgstr ""
msgid "Password successfully reset."
msgstr ""
+msgid "Project successfully uploaded"
+msgstr ""
+
+msgid "Invalid JSON"
+msgstr ""
+
msgid "Project successfully deleted"
msgstr ""
@@ -167,7 +195,7 @@ msgid "Your invitations have been sent"
msgstr ""
#, python-format
-msgid "%(member)s had been added"
+msgid "%(member)s has been added"
msgstr ""
#, python-format
@@ -221,9 +249,6 @@ msgstr ""
msgid "Create a new project"
msgstr ""
-msgid "Project"
-msgstr ""
-
msgid "Number of members"
msgstr ""
@@ -245,6 +270,9 @@ msgstr ""
msgid "delete"
msgstr ""
+msgid "see"
+msgstr ""
+
msgid "The Dashboard is currently deactivated."
msgstr ""
@@ -254,6 +282,12 @@ msgstr ""
msgid "Edit project"
msgstr ""
+msgid "Import JSON"
+msgstr ""
+
+msgid "Choose file"
+msgstr ""
+
msgid "Download project's data"
msgstr ""
@@ -275,6 +309,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
+msgid "Privacy Settings"
+msgstr ""
+
msgid "Edit the project"
msgstr ""
@@ -305,6 +342,177 @@ msgstr ""
msgid "Download"
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"
+" This project has history disabled. New actions won't "
+"appear below. You can enable history on the\n"
+" settings page\n"
+" "
+msgstr ""
+
+msgid ""
+"\n"
+" The table below reflects actions recorded prior to "
+"disabling project history. You can\n"
+" clear project history to remove "
+"them.\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
expenses, easily"
msgstr ""
@@ -352,6 +560,9 @@ msgstr ""
msgid "Statistics"
msgstr ""
+msgid "History"
+msgstr ""
+
msgid "Settings"
msgstr ""
@@ -409,6 +620,12 @@ msgstr ""
msgid "Add a new bill"
msgstr ""
+msgid "Newer bills"
+msgstr ""
+
+msgid "Older bills"
+msgstr ""
+
msgid "When?"
msgstr ""
@@ -435,9 +652,6 @@ msgstr ""
msgid "each"
msgstr ""
-msgid "see"
-msgstr ""
-
msgid "No bills"
msgstr ""
@@ -506,14 +720,14 @@ msgstr ""
msgid "To whom?"
msgstr ""
-msgid "Who?"
-msgstr ""
-
msgid "Paid"
msgstr ""
msgid "Spent"
msgstr ""
-msgid "Balance"
+msgid "Expenses by Month"
+msgstr ""
+
+msgid "Period"
msgstr ""
diff --git a/ihatemoney/translations/zh_HANS-CN/LC_MESSAGES/messages.mo b/ihatemoney/translations/zh_HANS-CN/LC_MESSAGES/messages.mo
index 603b28c8..89f8f302 100644
Binary files a/ihatemoney/translations/zh_HANS-CN/LC_MESSAGES/messages.mo and b/ihatemoney/translations/zh_HANS-CN/LC_MESSAGES/messages.mo differ
diff --git a/ihatemoney/translations/zh_HANS-CN/LC_MESSAGES/messages.po b/ihatemoney/translations/zh_HANS-CN/LC_MESSAGES/messages.po
index 64251ec9..ba1d920d 100644
--- a/ihatemoney/translations/zh_HANS-CN/LC_MESSAGES/messages.po
+++ b/ihatemoney/translations/zh_HANS-CN/LC_MESSAGES/messages.po
@@ -1,19 +1,20 @@
+
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: Muge Niu \n"
-"Language-Team: Chinese (Simplified) \n"
-"Language: zh_HANS-CN\n"
+"Language: zh_HANS_CN\n"
+"Language-Team: Chinese (Simplified) "
+""
+"\n"
+"Plural-Forms: nplurals=1; plural=0\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.11-dev\n"
-"Generated-By: Babel 2.7.0\n"
+"Generated-By: Babel 2.8.0\n"
msgid ""
"Not a valid amount or expression. Only numbers and + - * / operators are "
@@ -29,6 +30,18 @@ msgstr "共享密钥"
msgid "Email"
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"
msgstr "账目名称"
@@ -123,6 +136,15 @@ msgstr ""
msgid "The email %(email)s is not valid"
msgstr ""
+msgid "Participant"
+msgstr ""
+
+msgid "Bill"
+msgstr ""
+
+msgid "Project"
+msgstr ""
+
msgid "Too many failed login attempts, please retry later."
msgstr ""
@@ -156,6 +178,12 @@ msgstr ""
msgid "Password successfully reset."
msgstr ""
+msgid "Project successfully uploaded"
+msgstr ""
+
+msgid "Invalid JSON"
+msgstr ""
+
msgid "Project successfully deleted"
msgstr ""
@@ -167,7 +195,7 @@ msgid "Your invitations have been sent"
msgstr ""
#, python-format
-msgid "%(member)s had been added"
+msgid "%(member)s has been added"
msgstr ""
#, python-format
@@ -221,9 +249,6 @@ msgstr "?"
msgid "Create a new project"
msgstr ""
-msgid "Project"
-msgstr ""
-
msgid "Number of members"
msgstr ""
@@ -245,6 +270,9 @@ msgstr ""
msgid "delete"
msgstr ""
+msgid "see"
+msgstr ""
+
msgid "The Dashboard is currently deactivated."
msgstr ""
@@ -254,6 +282,12 @@ msgstr ""
msgid "Edit project"
msgstr ""
+msgid "Import JSON"
+msgstr ""
+
+msgid "Choose file"
+msgstr ""
+
msgid "Download project's data"
msgstr ""
@@ -275,6 +309,9 @@ msgstr ""
msgid "Cancel"
msgstr "取消"
+msgid "Privacy Settings"
+msgstr ""
+
msgid "Edit the project"
msgstr ""
@@ -305,6 +342,177 @@ msgstr ""
msgid "Download"
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"
+" This project has history disabled. New actions won't "
+"appear below. You can enable history on the\n"
+" settings page\n"
+" "
+msgstr ""
+
+msgid ""
+"\n"
+" The table below reflects actions recorded prior to "
+"disabling project history. You can\n"
+" clear project history to remove "
+"them.\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
expenses, easily"
msgstr ""
@@ -352,6 +560,9 @@ msgstr ""
msgid "Statistics"
msgstr ""
+msgid "History"
+msgstr ""
+
msgid "Settings"
msgstr ""
@@ -409,6 +620,12 @@ msgstr ""
msgid "Add a new bill"
msgstr ""
+msgid "Newer bills"
+msgstr ""
+
+msgid "Older bills"
+msgstr ""
+
msgid "When?"
msgstr "什么时候?"
@@ -435,9 +652,6 @@ msgstr ""
msgid "each"
msgstr ""
-msgid "see"
-msgstr ""
-
msgid "No bills"
msgstr ""
@@ -506,107 +720,14 @@ msgstr ""
msgid "To whom?"
msgstr ""
-msgid "Who?"
-msgstr "谁?"
-
msgid "Paid"
msgstr ""
msgid "Spent"
msgstr ""
-msgid "Balance"
+msgid "Expenses by Month"
msgstr ""
-#~ msgid ""
-#~ "The project identifier is used to "
-#~ "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
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 ""
+msgid "Period"
+msgstr ""
diff --git a/ihatemoney/utils.py b/ihatemoney/utils.py
index 0641d1c4..c8daa567 100644
--- a/ihatemoney/utils.py
+++ b/ihatemoney/utils.py
@@ -1,19 +1,17 @@
-import re
-import os
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
+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):
@@ -99,7 +97,7 @@ def static_include(filename):
def locale_from_iso(iso_code):
- return Locale(iso_code)
+ return Locale.parse(iso_code)
def list_of_dicts2json(dict_to_convert):
diff --git a/ihatemoney/web.py b/ihatemoney/web.py
index d84908f9..8af650ad 100644
--- a/ihatemoney/web.py
+++ b/ihatemoney/web.py
@@ -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`
and `add_project_id` for a quick overview)
"""
+from datetime import datetime
+from functools import wraps
import json
import os
-from functools import wraps
from smtplib import SMTPRecipientsRefused
from dateutil.parser import parse
+from dateutil.relativedelta import relativedelta
from flask import (
- abort,
Blueprint,
+ abort,
current_app,
flash,
g,
redirect,
render_template,
request,
- session,
- url_for,
send_file,
send_from_directory,
+ session,
+ url_for,
)
from flask_babel import get_locale, gettext as _
from flask_mail import Message
@@ -42,23 +44,21 @@ from ihatemoney.forms import (
InviteForm,
MemberForm,
PasswordReminder,
- ResetPasswordForm,
ProjectForm,
- get_billform_for,
+ ResetPasswordForm,
UploadForm,
+ get_billform_for,
)
-from ihatemoney.history import get_history_queries, get_history
-from ihatemoney.models import db, Project, Person, Bill, LoggingMode
+from ihatemoney.history import get_history, get_history_queries
+from ihatemoney.models import Bill, LoggingMode, Person, Project, db
from ihatemoney.utils import (
- Redirect303,
- list_of_dicts2json,
- list_of_dicts2csv,
LoginThrottler,
+ Redirect303,
get_members,
+ list_of_dicts2csv,
+ list_of_dicts2json,
same_bill,
)
-from datetime import datetime
-from dateutil.relativedelta import relativedelta
main = Blueprint("main", __name__)
@@ -301,9 +301,7 @@ def create_project():
project=g.project.name,
)
- message_body = render_template(
- "reminder_mail.%s.j2" % get_locale().language
- )
+ message_body = render_template(f"reminder_mail.{get_locale().language}.j2")
msg = Message(
message_title, body=message_body, recipients=[project.contact_email]
@@ -337,7 +335,7 @@ def remind_password():
# get the project
project = Project.query.get(form.id.data)
# 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(
Message(
"password recovery",
@@ -521,7 +519,7 @@ def export_project(file, format):
return send_file(
file2export,
- attachment_filename="%s-%s.%s" % (g.project.id, file, format),
+ attachment_filename=f"{g.project.id}-{file}.{format}",
as_attachment=True,
)
@@ -571,7 +569,7 @@ def invite():
# send the email
message_body = render_template(
- "invitation_mail.%s.j2" % get_locale().language
+ f"invitation_mail.{get_locale().language}.j2"
)
message_title = _(
@@ -621,7 +619,7 @@ def add_member():
if form.validate():
member = form.save(g.project, Person())
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 render_template("add_member.html", form=form)
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index d6893e84..00000000
--- a/requirements.txt
+++ /dev/null
@@ -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
diff --git a/setup.cfg b/setup.cfg
index 8d334e80..50a24a41 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -11,9 +11,9 @@ license = Custom BSD Beerware
classifiers =
Programming Language :: Python
Programming Language :: Python :: 3
- Programming Language :: Python :: 3.5
Programming Language :: Python :: 3.6
Programming Language :: Python :: 3.7
+ Programming Language :: Python :: 3.8
Topic :: Internet :: WWW/HTTP
Topic :: Internet :: WWW/HTTP :: WSGI :: Application
@@ -22,29 +22,32 @@ packages = find:
include_package_data = True
zip_safe = False
install_requires =
- flask
- flask-wtf
- flask-sqlalchemy<3.0
- SQLAlchemy-Continuum
- flask-mail
- Flask-Migrate
- Flask-script
- flask-babel
- flask-restful
- jinja2
- blinker
- flask-cors
- itsdangerous
- email_validator
- debts
+ blinker==1.4
+ debts==0.5
+ email_validator==1.0.5
+ Flask-Babel==1.0.0
+ Flask-Cors==3.0.8
+ Flask-Mail==0.9.1
+ Flask-Migrate==2.5.3
+ Flask-RESTful==0.3.8
+ Flask-Script==2.0.6
+ Flask-SQLAlchemy==2.4.1
+ Flask-WTF==0.14.3
+ WTForms==2.2.1
+ Flask==1.1.2
+ itsdangerous==1.1.0
+ Jinja2==2.11.2
+ SQLAlchemy-Continuum==1.3.9
[options.extras_require]
dev =
- zest.releaser
- tox
- pytest
- flake8
- Flask-Testing
+ black==19.10b0 ; python_version >= '3.6'
+ flake8==3.7.9
+ Flask-Testing==0.8.0
+ isort==4.3.21
+ pytest==5.4.1
+ tox==3.14.6
+ zest.releaser==6.20.1
[options.entry_points]
console_scripts =
diff --git a/tox.ini b/tox.ini
index 5e6d5e42..372f60f9 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,5 @@
[tox]
-envlist = py37,py36,py35,docs,flake8,black
+envlist = py38,py37,py36,docs,flake8,black
skip_missing_interpreters = True
[testenv]
@@ -9,8 +9,7 @@ commands =
py.test --pyargs ihatemoney.tests.tests
deps =
- -rdev-requirements.txt
- -rrequirements.txt
+ -e.[dev]
# To be sure we are importing ihatemoney pkg from pip-installed version
changedir = /tmp
@@ -22,15 +21,13 @@ deps =
changedir = {toxinidir}
[testenv:black]
-commands = black --check --target-version=py34 .
-deps =
- -rdev-requirements.txt
+commands =
+ black --check --target-version=py34 .
+ isort -c -rc .
changedir = {toxinidir}
[testenv:flake8]
commands = flake8 ihatemoney
-deps =
- -rdev-requirements.txt
changedir = {toxinidir}
[flake8]
@@ -42,6 +39,6 @@ extend-ignore =
[travis]
python =
- 3.5: py35
- 3.6: py36, docs, black, flake8
+ 3.6: py36
3.7: py37
+ 3.8: py38, docs, black, flake8