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

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

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

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

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

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

View file

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

View file

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

View file

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

14
SECURITY.md Normal file
View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

File diff suppressed because it is too large Load diff

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

23
tox.ini
View file

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