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