Merge branch 'master' into master

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

3
.gitignore vendored
View file

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

13
.isort.cfg Normal file
View file

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

View file

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

View file

@ -9,7 +9,7 @@ This document describes changes between each past release.
- Add support for espanol latino america (es_419)
- 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)
==================

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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
<https://ihatemoney.readthedocs.io/en/latest/contributing.html>`_ page.
Translation status
==================
.. image:: https://hosted.weblate.org/widgets/i-hate-money/-/i-hate-money/multi-blue.svg
:target: https://hosted.weblate.org/engage/i-hate-money/?utm_source=widget
:alt: Translation status for each language

View file

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

View file

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

View file

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

View file

@ -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.

View file

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

View file

@ -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):

View file

@ -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")

View file

View file

@ -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"]

View file

@ -1,29 +1,27 @@
from datetime import datetime
from re import match
import email_validator
from flask import request
from flask_babel import lazy_gettext as _
from flask_wtf.file import FileAllowed, FileField, FileRequired
from flask_wtf.form import FlaskForm
from 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):

View file

@ -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__]

View file

@ -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__))

View file

@ -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"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily"
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 ""

View file

@ -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:

View file

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

View file

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

View file

@ -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 "<Project %s>" % self.name
return f"<Project {self.name}>"
class Person(db.Model):
@ -385,7 +381,7 @@ class Person(db.Model):
return self.name
def __repr__(self):
return "<Person %s for project %s>" % (self.name, self.project.name)
return f"<Person {self.name} for project {self.project.name}>"
# We need to manually define a join table for m2m relations
@ -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 "<Bill of %s from %s for %s>" % (
self.amount,
self.payer,
", ".join([o.name for o in self.owers]),
return (
f"<Bill of {self.amount} from {self.payer} for "
f"{', '.join([o.name for o in self.owers])}>"
)

View file

@ -38,7 +38,7 @@ from sqlalchemy_continuum import Operation
from sqlalchemy_continuum.builder import Builder
from sqlalchemy_continuum.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):

View file

@ -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."""

View file

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

View file

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

View file

@ -1,26 +1,22 @@
# coding: utf8
import base64
from collections import defaultdict
import datetime
import io
import json
import os
from time import sleep
import unittest
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("<td> -- </td>"), 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("<td> -- </td>"), 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("<td> -- </td>", 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("<td> -- </td>"), 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("<td> -- </td>"), 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):

Binary file not shown.

View file

@ -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"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily"
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 ""

View file

@ -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 <flolilo@mailbox.org>\n"
"Language-Team: German <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/de/>\n"
"Language: de\n"
"Language-Team: German <https://hosted.weblate.org/projects/i-hate-money/i"
"-hate-money/de/>\n"
"Plural-Forms: nplurals=2; plural=n != 1\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-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"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily"
msgstr "Verwalten deine geteilten <br />Ausgaben ganz einfach"
@ -343,8 +556,9 @@ msgid ""
"This access code will be sent to your friends. It is stored as-is by the "
"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 ""

View file

@ -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"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily"
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 <br>expenses, easily"
#~ msgstr ""
#~ msgid "Log to an existing project"
#~ msgstr ""
#~ msgid "log in"
#~ msgstr ""
#~ msgid "or create a new one"
#~ msgstr ""
#~ msgid "let's get started"
#~ msgstr ""
#~ msgid "options"
#~ msgstr ""
#~ msgid "Project settings"
#~ msgstr ""
#~ msgid "This is a free software"
#~ msgstr ""
#~ msgid "Invite people to join this project!"
#~ msgstr ""
#~ msgid "Added on"
#~ msgstr ""
#~ msgid "Nothing to list yet. You probably want to"
#~ msgstr ""
#~ msgid ""
#~ "Specify a (comma separated) list of "
#~ "email adresses you want to notify "
#~ "about the\n"
#~ "creation of this budget management "
#~ "project and we will send them an"
#~ " email for you."
#~ msgstr ""
#~ msgid ""
#~ "If you prefer, you can share the project identifier and the shared\n"
#~ "password by other communication means. "
#~ "Or even directly share the following "
#~ "link:"
#~ msgstr ""
#~ msgid "A link to reset your password has been sent to your email."
#~ msgstr ""
msgid "Period"
msgstr ""

View file

@ -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 <diegocaraballo84@gmail.com>\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"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily"
msgstr "Gestione sus gastos compartidos <br />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"

View file

@ -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 <alexis@notmyidea.org>\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 <hubscher.remy@gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/fr/>\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 daccè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 "Lemail %(email)s est invalide"
msgid "Participant"
msgstr "Participant"
msgid "Bill"
msgstr "Facture"
msgid "Project"
msgstr "Projet"
msgid "Too many failed login attempts, please retry later."
msgstr "Trop d'échecs dauthentification 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 "cest 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 daccè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 lenregistrement des adresses IP"
msgid "Enabled IP Address Recording"
msgstr "Activer l'enregistrement des adresses IP"
msgid "History Settings Changed"
msgstr "Paramètres d'historique modifiés"
msgid "changed"
msgstr "modifié"
msgid "from"
msgstr "du"
msgid "to"
msgstr "au"
msgid "Confirm Remove IP Adresses"
msgstr "Confirmer la suppression des adresses IP"
msgid ""
"Are you sure you want to delete all recorded IP addresses from this "
"project?\n"
" The rest of the project history will be unaffected. This "
"action cannot be undone."
msgstr ""
"Êtes-vous sur de vouloir supprimer toutes les adresses IP enregistrées pour "
"ce projet ?\n"
"Le reste de l'historique ne sera pas affecté. Cette action n'est pas "
"réversible."
msgid "Close"
msgstr "Fermer"
msgid "Confirm Delete"
msgstr "Confirmer la suppression"
msgid "Delete Confirmation"
msgstr "Confirmation de suppression"
msgid ""
"Are you sure you want to erase all history for this project? This action "
"cannot be undone."
msgstr ""
"Êtes-vous sur de vouloir supprimer tout l'historique du projet ? Cette "
"action n'est pas réversible."
msgid "Added"
msgstr "Ajouté"
msgid "Removed"
msgstr "Supprimé"
msgid "and"
msgstr "et"
msgid "owers list"
msgstr "Liste des débiteurs"
msgid "Who?"
msgstr "Qui ?"
msgid "Balance"
msgstr "Solde"
#, python-format
msgid ""
"\n"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
"\n"
" <i>L'historique de ce projet a été désactivé. Les nouvelles "
"actions n'apparaîtront pas ci-dessous. Vous pouvez réactiver l'historique"
" du projet dans les </i>\n"
" <a href=\"%(url)s\">paramètres du projet</a>\n"
" "
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
"\n"
" <i>Le tableau ci-dessous liste les actions enregistrées avant"
" la désactivation de l'historique du projet. Vous pouvez\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> cliquer ici pour"
" les supprimer.</i></p>\n"
" "
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
"Certaines entrées de l'historique contiennent une adresse IP, bien que ce"
" projet ait désactivé l'enregistrement des adresses IP. "
msgid "Delete stored IP addresses"
msgstr "Supprimer toutes les adresses IP enregistrées"
msgid "No history to erase"
msgstr "Aucun historique à supprimer"
msgid "Clear Project History"
msgstr "Supprimer les entrées de l'historique du projet"
msgid "No IP Addresses to erase"
msgstr "Aucune adresse IP à supprimer"
msgid "Delete Stored IP Addresses"
msgstr "Supprimer les adresses IP enregistrées"
msgid "Time"
msgstr "Heure"
msgid "Event"
msgstr "Évènement"
msgid "IP address recording can be enabled on the settings page"
msgstr ""
"L'enregistrement des adresses IP peut-être activé dans les paramètres de "
"la page"
msgid "IP address recording can be disabled on the settings page"
msgstr ""
"L'enregistrement des adresses IP peut-être désactivé dans les paramètres "
"de la page"
msgid "From IP"
msgstr "Depuis l'IP"
msgid "added"
msgstr "ajouté"
msgid "Project private code changed"
msgstr "Le mot de passe du projet a été modifié"
msgid "Project renamed to"
msgstr "Le projet a été renommé"
msgid "Project contact email changed to"
msgstr "L'adresse email de contact du projet a été modifié en"
msgid "Project settings modified"
msgstr "Les paramètres du projet ont été modifiés"
msgid "deactivated"
msgstr "désactivé"
msgid "reactivated"
msgstr "réactivé"
msgid "renamed to"
msgstr "renommé en"
msgid "External link changed to"
msgstr "Le lien d'accès a été modifié en"
msgid "Amount"
msgstr "Montant"
msgid "modified"
msgstr "modifié"
msgid "removed"
msgstr "supprimé"
msgid "changed in a unknown way"
msgstr "modifié d'une manière inconnue"
msgid "Nothing to list"
msgstr "Rien à afficher"
msgid "Someone probably cleared the project history."
msgstr "Quelqu'un a probablement vidé l'historique du projet."
msgid "Manage your shared <br />expenses, easily"
msgstr "Gérez vos dépenses <br />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 dhistorisation"
#~ msgid "changed"
#~ msgstr "modifié"
#~ msgid "from"
#~ msgstr "depuis"
#~ msgid "to"
#~ msgstr "vers"
#~ msgid "Confirm Remove IP Adresses"
#~ msgstr "Confirmer la suppression des adresses IP"
#~ msgid ""
#~ "Are you sure you want to delete"
#~ " all recorded IP addresses from this"
#~ " project?\n"
#~ " The rest of the project"
#~ " history will be unaffected. This "
#~ "action cannot be undone."
#~ msgstr ""
#~ "Êtes vous sûr de supprimer toutes "
#~ "les adresses IP enregistrées dans ce "
#~ "projet ?\n"
#~ "Le reste de lhistorique du projet "
#~ "restera inchangé. Cette action est "
#~ "irréversible."
#~ msgid "Close"
#~ msgstr "Fermer"
#~ msgid "Confirm Delete"
#~ msgstr "Confirmer la suppression"
#~ msgid "Delete Confirmation"
#~ msgstr "Confirmation de suppression"
#~ msgid ""
#~ "Are you sure you want to erase "
#~ "all history for this project? This "
#~ "action cannot be undone."
#~ msgstr ""
#~ "Êtes vous sûr de supprimer la "
#~ "totalité de lhistorique de ce projet"
#~ " ? Cette action est irréversible."

Binary file not shown.

View file

@ -1,24 +1,26 @@
msgid ""
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 <fauzi.padlaw@gmail.com>\n"
"Language-Team: Indonesian <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/id/>\n"
"Language: id\n"
"Language-Team: Indonesian <https://hosted.weblate.org/projects/i-hate-"
"money/i-hate-money/id/>\n"
"Plural-Forms: nplurals=1; plural=0\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-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"
@ -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"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily"
msgstr "Atur pembagian harga <br />Anda, dengan mudah"
@ -343,8 +552,8 @@ msgid ""
"This access code will be sent to your friends. It is stored as-is by the "
"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"
@ -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 ""

View file

@ -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 <epost@anotheragency.no>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/"
"i-hate-money/i-hate-money/nb_NO/>\n"
"Language: nb_NO\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/i"
"-hate-money/i-hate-money/nb_NO/>\n"
"Plural-Forms: nplurals=2; plural=n != 1\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 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"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily"
msgstr "Håndter delte <br />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"

View file

@ -1,19 +1,19 @@
msgid ""
msgstr ""
"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 <vistausss@outlook.com>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/nl/>\n"
"Language: nl\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/i-hate-money/i"
"-hate-money/nl/>\n"
"Plural-Forms: nplurals=2; plural=n != 1\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 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"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily"
msgstr "Beheer eenvoudig je <br />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 <br>expenses, easily"
#~ msgstr "Beheer eenvoudig je gedeelde <br>uitgaven"
#~ msgid "Log to an existing project"
#~ msgstr "Log in op een bestaand project"
#~ msgid "log in"
#~ msgstr "inloggen"
#~ msgid "or create a new one"
#~ msgstr "of creëer een nieuwe"
#~ msgid "let's get started"
#~ msgstr "aan de slag"
#~ msgid "options"
#~ msgstr "opties"
#~ msgid "Project settings"
#~ msgstr "Projectinstellingen"
#~ msgid "This is a free software"
#~ msgstr "Dit is vrije software"
#~ msgid "Invite people to join this project!"
#~ msgstr "Nodig mensen uit voor dit project!"
#~ msgid "Added on"
#~ msgstr "Toegevoegd op"
#~ msgid "Nothing to list yet. You probably want to"
#~ msgstr "Er kan nog geen opsomming worden gemaakt. Voeg"
#~ msgid ""
#~ "Specify a (comma separated) list of "
#~ "email adresses you want to notify "
#~ "about the\n"
#~ "creation of this budget management "
#~ "project and we will send them an"
#~ " email for you."
#~ msgstr ""
#~ "Geef een kommagescheiden lijst van "
#~ "e-mailadressen op. Deze mensen worden op"
#~ " de\n"
#~ "hoogte gebracht van het bestaan van "
#~ "dit project en wij sturen hen een"
#~ " e-mail."
#~ msgid ""
#~ "If you prefer, you can share the project identifier and the shared\n"
#~ "password by other communication means. "
#~ "Or even directly share the following "
#~ "link:"
#~ msgstr ""
#~ "Als je wilt, dan kun je de project-id en het gedeelde wachtwoord\n"
#~ "delen via andere kanalen. Of deel gewoon de volgende link:"
#~ msgid "A link to reset your password has been sent to your email."
#~ msgstr ""
#~ "Er is een link met "
#~ "wachtwoordherstelinstructies naar je e-mailadres "
#~ "verstuurd."
msgid "Period"
msgstr ""

View file

@ -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 <makcan@gmail.com>\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"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily"
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 <br>expenses, easily"
#~ msgstr ""
#~ msgid "Log to an existing project"
#~ msgstr ""
#~ msgid "log in"
#~ msgstr ""
#~ msgid "or create a new one"
#~ msgstr ""
#~ msgid "let's get started"
#~ msgstr ""
#~ msgid "options"
#~ msgstr ""
#~ msgid "Project settings"
#~ msgstr ""
#~ msgid "This is a free software"
#~ msgstr ""
#~ msgid "Invite people to join this project!"
#~ msgstr ""
#~ msgid "Added on"
#~ msgstr ""
#~ msgid "Nothing to list yet. You probably want to"
#~ msgstr ""
#~ msgid ""
#~ "Specify a (comma separated) list of "
#~ "email adresses you want to notify "
#~ "about the\n"
#~ "creation of this budget management "
#~ "project and we will send them an"
#~ " email for you."
#~ msgstr ""
#~ msgid ""
#~ "If you prefer, you can share the project identifier and the shared\n"
#~ "password by other communication means. "
#~ "Or even directly share the following "
#~ "link:"
#~ msgstr ""
#~ msgid "A link to reset your password has been sent to your email."
#~ msgstr ""
msgid "Period"
msgstr ""

Binary file not shown.

View file

@ -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 <till.svit@gmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/i-hate-money/"
"i-hate-money/uk/>\n"
"Language: uk\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/i-hate-"
"money/i-hate-money/uk/>\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n"
"MIME-Version: 1.0\n"
"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"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily"
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 ""

View file

@ -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 <mugeniu12138@gmail.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"i-hate-money/i-hate-money/zh_Hans/>\n"
"Language: zh_HANS-CN\n"
"Language: zh_HANS_CN\n"
"Language-Team: Chinese (Simplified) "
"<https://hosted.weblate.org/projects/i-hate-money/i-hate-money/zh_Hans/>"
"\n"
"Plural-Forms: nplurals=1; plural=0\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 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"
" <i>This project has history disabled. New actions won't "
"appear below. You can enable history on the</i>\n"
" <a href=\"%(url)s\">settings page</a>\n"
" "
msgstr ""
msgid ""
"\n"
" <i>The table below reflects actions recorded prior to "
"disabling project history. You can\n"
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
"data-target=\"#confirm-erase\">clear project history</a> to remove "
"them.</i></p>\n"
" "
msgstr ""
msgid ""
"Some entries below contain IP addresses, even though this project has IP "
"recording disabled. "
msgstr ""
msgid "Delete stored IP addresses"
msgstr ""
msgid "No history to erase"
msgstr ""
msgid "Clear Project History"
msgstr ""
msgid "No IP Addresses to erase"
msgstr ""
msgid "Delete Stored IP Addresses"
msgstr ""
msgid "Time"
msgstr ""
msgid "Event"
msgstr ""
msgid "IP address recording can be enabled on the settings page"
msgstr ""
msgid "IP address recording can be disabled on the settings page"
msgstr ""
msgid "From IP"
msgstr ""
msgid "added"
msgstr ""
msgid "Project private code changed"
msgstr ""
msgid "Project renamed to"
msgstr ""
msgid "Project contact email changed to"
msgstr ""
msgid "Project settings modified"
msgstr ""
msgid "deactivated"
msgstr ""
msgid "reactivated"
msgstr ""
msgid "renamed to"
msgstr ""
msgid "External link changed to"
msgstr ""
msgid "Amount"
msgstr ""
msgid "modified"
msgstr ""
msgid "removed"
msgstr ""
msgid "changed in a unknown way"
msgstr ""
msgid "Nothing to list"
msgstr ""
msgid "Someone probably cleared the project history."
msgstr ""
msgid "Manage your shared <br />expenses, easily"
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 <br>expenses, easily"
#~ msgstr ""
#~ msgid "Log to an existing project"
#~ msgstr ""
#~ msgid "log in"
#~ msgstr ""
#~ msgid "or create a new one"
#~ msgstr ""
#~ msgid "let's get started"
#~ msgstr ""
#~ msgid "options"
#~ msgstr ""
#~ msgid "Project settings"
#~ msgstr ""
#~ msgid "This is a free software"
#~ msgstr ""
#~ msgid "Invite people to join this project!"
#~ msgstr ""
#~ msgid "Added on"
#~ msgstr ""
#~ msgid "Nothing to list yet. You probably want to"
#~ msgstr ""
#~ msgid ""
#~ "Specify a (comma separated) list of "
#~ "email adresses you want to notify "
#~ "about the\n"
#~ "creation of this budget management "
#~ "project and we will send them an"
#~ " email for you."
#~ msgstr ""
#~ msgid ""
#~ "If you prefer, you can share the project identifier and the shared\n"
#~ "password by other communication means. "
#~ "Or even directly share the following "
#~ "link:"
#~ msgstr ""
#~ msgid "A link to reset your password has been sent to your email."
#~ msgstr ""
msgid "Period"
msgstr ""

View file

@ -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):

View file

@ -8,25 +8,27 @@ Basically, this blueprint takes care of the authentication and provides
some shortcuts to make your life better when coding (see `pull_project`
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)

View file

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

View file

@ -11,9 +11,9 @@ license = Custom BSD Beerware
classifiers =
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 =

17
tox.ini
View file

@ -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