mirror of
https://github.com/eitchtee/WYGIWYH.git
synced 2026-02-24 16:34:53 +01:00
Compare commits
75 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
48dd658627 | ||
|
|
80dbbd02f0 | ||
|
|
4b7ca61c29 | ||
|
|
b2f04ae1f9 | ||
|
|
f34d4b5e28 | ||
|
|
d2ebfbd615 | ||
|
|
812abbe488 | ||
|
|
9602a4affc | ||
|
|
bf548c0747 | ||
|
|
55ad2be08b | ||
|
|
2cd58c2464 | ||
|
|
4675ba9d56 | ||
|
|
a25c992d5c | ||
|
|
2eadfe99a5 | ||
|
|
11086a726f | ||
|
|
cd99b40b0a | ||
|
|
63aa51dc0d | ||
|
|
4708c5bc7e | ||
|
|
5a8462c050 | ||
|
|
6cac02e01f | ||
|
|
8d12ceeebb | ||
|
|
4681d3ca1d | ||
|
|
60ded03ea9 | ||
|
|
b20d137dc3 | ||
|
|
29ca6eed6c | ||
|
|
fa85303f36 | ||
|
|
a5f4f43678 | ||
|
|
d807bd5da3 | ||
|
|
85314fb749 | ||
|
|
c4d5e93a41 | ||
|
|
86f0c4365e | ||
|
|
202592b940 | ||
|
|
aea149bd13 | ||
|
|
411365f101 | ||
|
|
2008476021 | ||
|
|
53afe5b8eb | ||
|
|
6193c7a048 | ||
|
|
41f81d90d7 | ||
|
|
bf623cf16b | ||
|
|
ec213330cd | ||
|
|
7aedf524c6 | ||
|
|
04602b1964 | ||
|
|
15cfc4f300 | ||
|
|
3463c7c62c | ||
|
|
7b76c10093 | ||
|
|
7ad26a2e7b | ||
|
|
7706ca2d5f | ||
|
|
56198e93ce | ||
|
|
a74323f739 | ||
|
|
e4efde177b | ||
|
|
5871a03ee2 | ||
|
|
67af4430e1 | ||
|
|
696dcdf951 | ||
|
|
e35bad0e08 | ||
|
|
904f7cac22 | ||
|
|
ccd73963ca | ||
|
|
b5469b0413 | ||
|
|
dae848d951 | ||
|
|
45a33ad0c0 | ||
|
|
89e50b17bd | ||
|
|
ac54ba3da1 | ||
|
|
2da610f15e | ||
|
|
4ab6c4c6b6 | ||
|
|
68dbedd938 | ||
|
|
2800c53346 | ||
|
|
132547a074 | ||
|
|
61ed87dc45 | ||
|
|
96c1227c4f | ||
|
|
33f1ac1785 | ||
|
|
e9e94a8343 | ||
|
|
ba24a53853 | ||
|
|
4955fbde33 | ||
|
|
d04067a91d | ||
|
|
01333a439b | ||
|
|
d26907ea94 |
4
.github/FUNDING.yml
vendored
Normal file
4
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: eitchtee
|
||||
custom: ["https://www.paypal.com/donate/?hosted_button_id=FFWM4W9NQDMM6"]
|
||||
@@ -163,10 +163,105 @@ AUTH_USER_MODEL = "users.User"
|
||||
|
||||
LANGUAGE_CODE = "en"
|
||||
LANGUAGES = (
|
||||
("af", "Afrikaans"),
|
||||
("ar", "العربية"),
|
||||
("ar-dz", "العربية (الجزائر)"), # Algerian Arabic often uses the base name + region
|
||||
("ast", "Asturianu"),
|
||||
("az", "Azərbaycan"),
|
||||
("bg", "Български"),
|
||||
("be", "Беларуская"),
|
||||
("bn", "বাংলা"),
|
||||
("br", "Brezhoneg"),
|
||||
("bs", "Bosanski"),
|
||||
("ca", "Català"),
|
||||
("ckb", "کوردیی ناوەندی"), # Central Kurdish (Sorani)
|
||||
("cs", "Čeština"),
|
||||
("cy", "Cymraeg"),
|
||||
("da", "Dansk"),
|
||||
("de", "Deutsch"),
|
||||
("dsb", "Dolnoserbšćina"),
|
||||
("el", "Ελληνικά"),
|
||||
("en", "English"),
|
||||
("en-au", "English (Australia)"),
|
||||
("en-gb", "English (UK)"),
|
||||
("eo", "Esperanto"),
|
||||
("es", "Español"),
|
||||
("es-ar", "Español (Argentina)"),
|
||||
("es-co", "Español (Colombia)"),
|
||||
("es-mx", "Español (México)"),
|
||||
("es-ni", "Español (Nicaragua)"),
|
||||
("es-ve", "Español (Venezuela)"),
|
||||
("et", "Eesti"),
|
||||
("eu", "Euskara"),
|
||||
("fa", "فارسی"),
|
||||
("fi", "Suomi"),
|
||||
("fr", "Français"),
|
||||
("fy", "Frysk"),
|
||||
("ga", "Gaeilge"),
|
||||
("gd", "Gàidhlig"),
|
||||
("gl", "Galego"),
|
||||
("he", "עברית"),
|
||||
("hi", "हिन्दी"),
|
||||
("hr", "Hrvatski"),
|
||||
("hsb", "Hornjoserbšćina"),
|
||||
("hu", "Magyar"),
|
||||
("hy", "Հայերեն"),
|
||||
("ia", "Interlingua"),
|
||||
("id", "Bahasa Indonesia"),
|
||||
("ig", "Igbo"),
|
||||
("io", "Ido"),
|
||||
("is", "Íslenska"),
|
||||
("it", "Italiano"),
|
||||
("ja", "日本語"),
|
||||
("ka", "ქართული"),
|
||||
("kab", "Taqbaylit"),
|
||||
("kk", "Қазақша"),
|
||||
("km", "ខ្មែរ"),
|
||||
("kn", "ಕನ್ನಡ"),
|
||||
("ko", "한국어"),
|
||||
("ky", "Кыргызча"),
|
||||
("lb", "Lëtzebuergesch"),
|
||||
("lt", "Lietuvių"),
|
||||
("lv", "Latviešu"),
|
||||
("mk", "Македонски"),
|
||||
("ml", "മലയാളം"),
|
||||
("mn", "Монгол"),
|
||||
("mr", "मराठी"),
|
||||
("ms", "Bahasa Melayu"),
|
||||
("my", "မြန်မာဘာသာ"),
|
||||
("nb", "Norsk (Bokmål)"),
|
||||
("ne", "नेपाली"),
|
||||
("nl", "Nederlands"),
|
||||
("nn", "Norsk (Nynorsk)"),
|
||||
("os", "Ирон"), # Ossetic
|
||||
("pa", "ਪੰਜਾਬੀ"),
|
||||
("pl", "Polski"),
|
||||
("pt", "Português"),
|
||||
("pt-br", "Português (Brasil)"),
|
||||
("ro", "Română"),
|
||||
("ru", "Русский"),
|
||||
("sk", "Slovenčina"),
|
||||
("sl", "Slovenščina"),
|
||||
("sq", "Shqip"),
|
||||
("sr", "Српски"),
|
||||
("sr-latn", "Srpski (Latinica)"),
|
||||
("sv", "Svenska"),
|
||||
("sw", "Kiswahili"),
|
||||
("ta", "தமிழ்"),
|
||||
("te", "తెలుగు"),
|
||||
("tg", "Тоҷикӣ"),
|
||||
("th", "ไทย"),
|
||||
("tk", "Türkmençe"),
|
||||
("tr", "Türkçe"),
|
||||
("tt", "Татарча"),
|
||||
("udm", "Удмурт"),
|
||||
("ug", "ئۇيغۇرچە"),
|
||||
("uk", "Українська"),
|
||||
("ur", "اردو"),
|
||||
("uz", "Oʻzbekcha"),
|
||||
("vi", "Tiếng Việt"),
|
||||
("zh-hans", "简体中文"),
|
||||
("zh-hant", "繁體中文"),
|
||||
)
|
||||
|
||||
TIME_ZONE = os.getenv("TZ", "UTC")
|
||||
|
||||
78
app/apps/common/decorators/user.py
Normal file
78
app/apps/common/decorators/user.py
Normal file
@@ -0,0 +1,78 @@
|
||||
from functools import wraps
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import PermissionDenied
|
||||
from django.http import HttpResponse
|
||||
from django.shortcuts import redirect
|
||||
from django.urls import reverse, NoReverseMatch
|
||||
|
||||
|
||||
def is_superuser(view):
|
||||
@wraps(view)
|
||||
def _view(request, *args, **kwargs):
|
||||
if not request.user.is_superuser:
|
||||
raise PermissionDenied
|
||||
|
||||
return view(request, *args, **kwargs)
|
||||
|
||||
return _view
|
||||
|
||||
|
||||
def htmx_login_required(function=None, login_url=None):
|
||||
"""
|
||||
Decorator that checks if the user is logged in.
|
||||
|
||||
Allows overriding the default login URL.
|
||||
|
||||
If the user is not logged in:
|
||||
- If "hx-request" is present in the request header, it returns a 200 response
|
||||
with a "HX-Redirect" header containing the determined login URL (including the "next" parameter).
|
||||
- If "hx-request" is not present, it redirects to the determined login page normally.
|
||||
|
||||
Args:
|
||||
function: The view function to decorate.
|
||||
login_url: Optional. The URL or URL name to redirect to for login.
|
||||
Defaults to settings.LOGIN_URL.
|
||||
"""
|
||||
|
||||
def decorator(view_func):
|
||||
# Simplified @wraps usage - it handles necessary attribute assignments by default
|
||||
@wraps(view_func)
|
||||
def wrapped_view(request, *args, **kwargs):
|
||||
if request.user.is_authenticated:
|
||||
return view_func(request, *args, **kwargs)
|
||||
else:
|
||||
# Determine the login URL
|
||||
resolved_login_url = login_url
|
||||
if not resolved_login_url:
|
||||
resolved_login_url = settings.LOGIN_URL
|
||||
|
||||
# Try to reverse the URL name if it's not a path
|
||||
try:
|
||||
# Check if it looks like a URL path already
|
||||
if "/" not in resolved_login_url and "." not in resolved_login_url:
|
||||
login_url_path = reverse(resolved_login_url)
|
||||
else:
|
||||
login_url_path = resolved_login_url
|
||||
except NoReverseMatch:
|
||||
# If reverse fails, assume it's already a URL path
|
||||
login_url_path = resolved_login_url
|
||||
|
||||
# Construct the full redirect path with 'next' parameter
|
||||
# Ensure request.path is URL-encoded if needed, though Django usually handles this
|
||||
redirect_path = f"{login_url_path}?next={request.get_full_path()}" # Use get_full_path() to include query params
|
||||
|
||||
if request.headers.get("hx-request"):
|
||||
# For HTMX requests, return a 200 with the HX-Redirect header.
|
||||
response = HttpResponse()
|
||||
response["HX-Redirect"] = login_url_path
|
||||
return response
|
||||
else:
|
||||
# For regular requests, redirect to the login page.
|
||||
return redirect(redirect_path)
|
||||
|
||||
return wrapped_view
|
||||
|
||||
if function:
|
||||
return decorator(function)
|
||||
return decorator
|
||||
@@ -20,7 +20,15 @@ class MonthYearModelField(models.DateField):
|
||||
# Set the day to 1
|
||||
return date.replace(day=1).date()
|
||||
except ValueError:
|
||||
raise ValidationError(_("Invalid date format. Use YYYY-MM."))
|
||||
try:
|
||||
# Also accept YYYY-MM-DD format (for loaddata)
|
||||
return (
|
||||
datetime.datetime.strptime(value, "%Y-%m-%d").replace(day=1).date()
|
||||
)
|
||||
except ValueError:
|
||||
raise ValidationError(
|
||||
_("Invalid date format. Use YYYY-MM or YYYY-MM-DD.")
|
||||
)
|
||||
|
||||
def formfield(self, **kwargs):
|
||||
kwargs["widget"] = MonthYearWidget
|
||||
|
||||
@@ -49,7 +49,7 @@ async def remove_expired_sessions(timestamp=None):
|
||||
def reset_demo_data(timestamp=None):
|
||||
"""
|
||||
Wipes the database and loads fresh demo data if DEMO mode is active.
|
||||
Runs daily at 6:00 AM.
|
||||
Runs daily at 8:00 AM.
|
||||
"""
|
||||
if not settings.DEMO:
|
||||
return # Exit if not in demo mode
|
||||
@@ -59,13 +59,14 @@ def reset_demo_data(timestamp=None):
|
||||
try:
|
||||
# 1. Flush the database (wipe all data)
|
||||
logger.info("Flushing the database...")
|
||||
# Using --noinput prevents prompts. Specify database if not default.
|
||||
|
||||
management.call_command(
|
||||
"flush", "--noinput", database=DEFAULT_DB_ALIAS, verbosity=1
|
||||
)
|
||||
logger.info("Database flushed successfully.")
|
||||
|
||||
# 2. Load data from the fixture
|
||||
# TO-DO: Roll dates over based on today's date
|
||||
fixture_name = "fixtures/demo_data.json"
|
||||
logger.info(f"Loading data from fixture: {fixture_name}...")
|
||||
management.call_command(
|
||||
|
||||
@@ -15,10 +15,11 @@ from cachalot.api import invalidate
|
||||
|
||||
from apps.common.decorators.htmx import only_htmx
|
||||
from apps.transactions.models import Transaction
|
||||
from apps.common.decorators.user import htmx_login_required
|
||||
|
||||
|
||||
@only_htmx
|
||||
@login_required
|
||||
@htmx_login_required
|
||||
@require_http_methods(["GET"])
|
||||
def toasts(request):
|
||||
return render(request, "common/fragments/toasts.html")
|
||||
|
||||
@@ -10,7 +10,7 @@ from apps.currencies.utils.convert import convert
|
||||
|
||||
|
||||
def get_categories_totals(transactions_queryset, ignore_empty=False):
|
||||
# Get metrics for each category and currency in a single query
|
||||
# First get the category totals as before
|
||||
category_currency_metrics = (
|
||||
transactions_queryset.values(
|
||||
"category",
|
||||
@@ -74,9 +74,65 @@ def get_categories_totals(transactions_queryset, ignore_empty=False):
|
||||
.order_by("category__name")
|
||||
)
|
||||
|
||||
# Get tag totals within each category with currency details
|
||||
tag_metrics = transactions_queryset.values(
|
||||
"category",
|
||||
"tags",
|
||||
"tags__name",
|
||||
"account__currency",
|
||||
"account__currency__code",
|
||||
"account__currency__name",
|
||||
"account__currency__decimal_places",
|
||||
"account__currency__prefix",
|
||||
"account__currency__suffix",
|
||||
"account__currency__exchange_currency",
|
||||
).annotate(
|
||||
expense_current=Coalesce(
|
||||
Sum(
|
||||
Case(
|
||||
When(type=Transaction.Type.EXPENSE, is_paid=True, then="amount"),
|
||||
default=Value(0),
|
||||
output_field=models.DecimalField(),
|
||||
)
|
||||
),
|
||||
Decimal("0"),
|
||||
),
|
||||
expense_projected=Coalesce(
|
||||
Sum(
|
||||
Case(
|
||||
When(type=Transaction.Type.EXPENSE, is_paid=False, then="amount"),
|
||||
default=Value(0),
|
||||
output_field=models.DecimalField(),
|
||||
)
|
||||
),
|
||||
Decimal("0"),
|
||||
),
|
||||
income_current=Coalesce(
|
||||
Sum(
|
||||
Case(
|
||||
When(type=Transaction.Type.INCOME, is_paid=True, then="amount"),
|
||||
default=Value(0),
|
||||
output_field=models.DecimalField(),
|
||||
)
|
||||
),
|
||||
Decimal("0"),
|
||||
),
|
||||
income_projected=Coalesce(
|
||||
Sum(
|
||||
Case(
|
||||
When(type=Transaction.Type.INCOME, is_paid=False, then="amount"),
|
||||
default=Value(0),
|
||||
output_field=models.DecimalField(),
|
||||
)
|
||||
),
|
||||
Decimal("0"),
|
||||
),
|
||||
)
|
||||
|
||||
# Process the results to structure by category
|
||||
result = {}
|
||||
|
||||
# Process category totals first
|
||||
for metric in category_currency_metrics:
|
||||
# Skip empty categories if ignore_empty is True
|
||||
if ignore_empty and all(
|
||||
@@ -101,7 +157,11 @@ def get_categories_totals(transactions_queryset, ignore_empty=False):
|
||||
currency_id = metric["account__currency"]
|
||||
|
||||
if category_id not in result:
|
||||
result[category_id] = {"name": metric["category__name"], "currencies": {}}
|
||||
result[category_id] = {
|
||||
"name": metric["category__name"],
|
||||
"currencies": {},
|
||||
"tags": {}, # Add tags container
|
||||
}
|
||||
|
||||
# Add currency data
|
||||
currency_data = {
|
||||
@@ -162,4 +222,101 @@ def get_categories_totals(transactions_queryset, ignore_empty=False):
|
||||
|
||||
result[category_id]["currencies"][currency_id] = currency_data
|
||||
|
||||
# Process tag totals and add them to the result, including untagged
|
||||
for tag_metric in tag_metrics:
|
||||
category_id = tag_metric["category"]
|
||||
tag_id = tag_metric["tags"] # Will be None for untagged transactions
|
||||
|
||||
if category_id in result:
|
||||
# Initialize the tag container if not exists
|
||||
if "tags" not in result[category_id]:
|
||||
result[category_id]["tags"] = {}
|
||||
|
||||
# Determine if this is a tagged or untagged transaction
|
||||
tag_key = tag_id if tag_id is not None else "untagged"
|
||||
tag_name = tag_metric["tags__name"] if tag_id is not None else None
|
||||
|
||||
if tag_key not in result[category_id]["tags"]:
|
||||
result[category_id]["tags"][tag_key] = {
|
||||
"name": tag_name,
|
||||
"currencies": {},
|
||||
}
|
||||
|
||||
currency_id = tag_metric["account__currency"]
|
||||
|
||||
# Calculate tag totals
|
||||
tag_total_current = (
|
||||
tag_metric["income_current"] - tag_metric["expense_current"]
|
||||
)
|
||||
tag_total_projected = (
|
||||
tag_metric["income_projected"] - tag_metric["expense_projected"]
|
||||
)
|
||||
tag_total_income = (
|
||||
tag_metric["income_current"] + tag_metric["income_projected"]
|
||||
)
|
||||
tag_total_expense = (
|
||||
tag_metric["expense_current"] + tag_metric["expense_projected"]
|
||||
)
|
||||
tag_total_final = tag_total_current + tag_total_projected
|
||||
|
||||
tag_currency_data = {
|
||||
"currency": {
|
||||
"code": tag_metric["account__currency__code"],
|
||||
"name": tag_metric["account__currency__name"],
|
||||
"decimal_places": tag_metric["account__currency__decimal_places"],
|
||||
"prefix": tag_metric["account__currency__prefix"],
|
||||
"suffix": tag_metric["account__currency__suffix"],
|
||||
},
|
||||
"expense_current": tag_metric["expense_current"],
|
||||
"expense_projected": tag_metric["expense_projected"],
|
||||
"total_expense": tag_total_expense,
|
||||
"income_current": tag_metric["income_current"],
|
||||
"income_projected": tag_metric["income_projected"],
|
||||
"total_income": tag_total_income,
|
||||
"total_current": tag_total_current,
|
||||
"total_projected": tag_total_projected,
|
||||
"total_final": tag_total_final,
|
||||
}
|
||||
|
||||
# Add exchange currency support for tags
|
||||
if tag_metric["account__currency__exchange_currency"]:
|
||||
from_currency = Currency.objects.get(id=currency_id)
|
||||
exchange_currency = Currency.objects.get(
|
||||
id=tag_metric["account__currency__exchange_currency"]
|
||||
)
|
||||
|
||||
exchanged = {}
|
||||
for field in [
|
||||
"expense_current",
|
||||
"expense_projected",
|
||||
"income_current",
|
||||
"income_projected",
|
||||
"total_income",
|
||||
"total_expense",
|
||||
"total_current",
|
||||
"total_projected",
|
||||
"total_final",
|
||||
]:
|
||||
amount, prefix, suffix, decimal_places = convert(
|
||||
amount=tag_currency_data[field],
|
||||
from_currency=from_currency,
|
||||
to_currency=exchange_currency,
|
||||
)
|
||||
if amount is not None:
|
||||
exchanged[field] = amount
|
||||
if "currency" not in exchanged:
|
||||
exchanged["currency"] = {
|
||||
"prefix": prefix,
|
||||
"suffix": suffix,
|
||||
"decimal_places": decimal_places,
|
||||
"code": exchange_currency.code,
|
||||
"name": exchange_currency.name,
|
||||
}
|
||||
if exchanged:
|
||||
tag_currency_data["exchanged"] = exchanged
|
||||
|
||||
result[category_id]["tags"][tag_key]["currencies"][
|
||||
currency_id
|
||||
] = tag_currency_data
|
||||
|
||||
return result
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
import decimal
|
||||
import json
|
||||
from collections import defaultdict
|
||||
|
||||
from dateutil.relativedelta import relativedelta
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.db.models import Sum, Avg, F
|
||||
from django.db.models import Sum
|
||||
from django.shortcuts import render
|
||||
from django.utils import timezone
|
||||
from django.views.decorators.http import require_http_methods
|
||||
@@ -22,13 +20,13 @@ from apps.insights.utils.category_explorer import (
|
||||
get_category_sums_by_account,
|
||||
get_category_sums_by_currency,
|
||||
)
|
||||
from apps.insights.utils.category_overview import get_categories_totals
|
||||
from apps.insights.utils.sankey import (
|
||||
generate_sankey_data_by_account,
|
||||
generate_sankey_data_by_currency,
|
||||
)
|
||||
from apps.insights.utils.transactions import get_transactions
|
||||
from apps.transactions.models import TransactionCategory, Transaction
|
||||
from apps.insights.utils.category_overview import get_categories_totals
|
||||
from apps.transactions.utils.calculations import calculate_currency_totals
|
||||
|
||||
|
||||
@@ -170,6 +168,24 @@ def category_sum_by_currency(request):
|
||||
@login_required
|
||||
@require_http_methods(["GET"])
|
||||
def category_overview(request):
|
||||
if "view_type" in request.GET:
|
||||
view_type = request.GET["view_type"]
|
||||
request.session["insights_category_explorer_view_type"] = view_type
|
||||
else:
|
||||
view_type = request.session.get("insights_category_explorer_view_type", "table")
|
||||
|
||||
if "show_tags" in request.GET:
|
||||
show_tags = request.GET["show_tags"] == "on"
|
||||
request.session["insights_category_explorer_show_tags"] = show_tags
|
||||
else:
|
||||
show_tags = request.session.get("insights_category_explorer_show_tags", True)
|
||||
|
||||
if "showing" in request.GET:
|
||||
showing = request.GET["showing"]
|
||||
request.session["insights_category_explorer_showing"] = showing
|
||||
else:
|
||||
showing = request.session.get("insights_category_explorer_showing", "final")
|
||||
|
||||
# Get filtered transactions
|
||||
transactions = get_transactions(request, include_silent=True)
|
||||
|
||||
@@ -180,7 +196,12 @@ def category_overview(request):
|
||||
return render(
|
||||
request,
|
||||
"insights/fragments/category_overview/index.html",
|
||||
{"total_table": total_table},
|
||||
{
|
||||
"total_table": total_table,
|
||||
"view_type": view_type,
|
||||
"show_tags": show_tags,
|
||||
"showing": showing,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ from crispy_forms.layout import (
|
||||
Row,
|
||||
Column,
|
||||
Field,
|
||||
Div,
|
||||
)
|
||||
from django import forms
|
||||
from django.db.models import Q
|
||||
@@ -206,10 +207,21 @@ class TransactionForm(forms.ModelForm):
|
||||
else:
|
||||
self.fields["amount"].widget = ArbitraryDecimalDisplayNumberInput()
|
||||
self.helper.layout.append(
|
||||
FormActions(
|
||||
Div(
|
||||
NoClassSubmit(
|
||||
"submit", _("Add"), css_class="btn btn-outline-primary w-100"
|
||||
"submit", _("Add"), css_class="btn btn-outline-primary"
|
||||
),
|
||||
NoClassSubmit(
|
||||
"submit_and_similar",
|
||||
_("Save and add similar"),
|
||||
css_class="btn btn-outline-primary",
|
||||
),
|
||||
NoClassSubmit(
|
||||
"submit_and_another",
|
||||
_("Save and add another"),
|
||||
css_class="btn btn-outline-primary",
|
||||
),
|
||||
css_class="d-grid gap-2",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@@ -574,6 +574,7 @@ class InstallmentPlan(models.Model):
|
||||
installment_plan=self,
|
||||
installment_id=i,
|
||||
notes=self.notes if self.add_notes_to_transaction else "",
|
||||
owner=self.account.owner,
|
||||
)
|
||||
new_transaction.tags.set(self.tags.all())
|
||||
new_transaction.entities.set(self.entities.all())
|
||||
@@ -640,6 +641,7 @@ class InstallmentPlan(models.Model):
|
||||
installment_plan=self,
|
||||
installment_id=i,
|
||||
notes=self.notes if self.add_notes_to_transaction else "",
|
||||
owner=self.account.owner,
|
||||
)
|
||||
new_transaction.tags.set(self.tags.all())
|
||||
new_transaction.entities.set(self.entities.all())
|
||||
@@ -775,6 +777,7 @@ class RecurringTransaction(models.Model):
|
||||
is_paid=False,
|
||||
recurring_transaction=self,
|
||||
notes=self.notes if self.add_notes_to_transaction else "",
|
||||
owner=self.account.owner,
|
||||
)
|
||||
if self.tags.exists():
|
||||
created_transaction.tags.set(self.tags.all())
|
||||
@@ -797,12 +800,16 @@ class RecurringTransaction(models.Model):
|
||||
@classmethod
|
||||
def generate_upcoming_transactions(cls):
|
||||
today = timezone.now().date()
|
||||
recurring_transactions = cls.objects.filter(
|
||||
recurring_transactions = cls.all_objects.filter(
|
||||
Q(models.Q(end_date__isnull=True) | Q(end_date__gte=today))
|
||||
& Q(is_paused=False)
|
||||
)
|
||||
|
||||
for recurring_transaction in recurring_transactions:
|
||||
logger.info(
|
||||
f"Processing recurring transaction: {recurring_transaction.description}..."
|
||||
)
|
||||
|
||||
if recurring_transaction.last_generated_date:
|
||||
start_date = recurring_transaction.get_next_date(
|
||||
recurring_transaction.last_generated_date
|
||||
@@ -821,7 +828,10 @@ class RecurringTransaction(models.Model):
|
||||
today + (recurring_transaction.get_recurrence_delta() * 6),
|
||||
)
|
||||
|
||||
logger.info(f"End date: {end_date}")
|
||||
|
||||
while current_date <= end_date:
|
||||
logger.info(f"Creating transaction for date: {current_date}")
|
||||
recurring_transaction.create_transaction(current_date, reference_date)
|
||||
current_date = recurring_transaction.get_next_date(current_date)
|
||||
reference_date = recurring_transaction.get_next_date(reference_date)
|
||||
|
||||
@@ -43,16 +43,33 @@ def transaction_add(request):
|
||||
year=year,
|
||||
).date()
|
||||
|
||||
update = False
|
||||
|
||||
if request.method == "POST":
|
||||
form = TransactionForm(request.POST)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
messages.success(request, _("Transaction added successfully"))
|
||||
|
||||
return HttpResponse(
|
||||
status=204,
|
||||
headers={"HX-Trigger": "updated, hide_offcanvas"},
|
||||
)
|
||||
if "submit" in request.POST:
|
||||
return HttpResponse(
|
||||
status=204,
|
||||
headers={"HX-Trigger": "updated, hide_offcanvas"},
|
||||
)
|
||||
elif "submit_and_another" in request.POST:
|
||||
form = TransactionForm(
|
||||
initial={
|
||||
"date": expected_date,
|
||||
"type": transaction_type,
|
||||
},
|
||||
)
|
||||
update = True
|
||||
elif "submit_and_similar" in request.POST:
|
||||
form = TransactionForm(
|
||||
initial=request.POST.dict(),
|
||||
)
|
||||
update = True
|
||||
|
||||
else:
|
||||
form = TransactionForm(
|
||||
initial={
|
||||
@@ -61,11 +78,15 @@ def transaction_add(request):
|
||||
},
|
||||
)
|
||||
|
||||
return render(
|
||||
response = render(
|
||||
request,
|
||||
"transactions/fragments/add.html",
|
||||
{"form": form},
|
||||
)
|
||||
if update:
|
||||
response["HX-Trigger"] = "updated"
|
||||
|
||||
return response
|
||||
|
||||
|
||||
@login_required
|
||||
|
||||
@@ -2,16 +2,20 @@ from crispy_forms.bootstrap import (
|
||||
FormActions,
|
||||
)
|
||||
from crispy_forms.helper import FormHelper
|
||||
from crispy_forms.layout import Layout, Submit
|
||||
from crispy_forms.layout import Layout, Submit, Row, Column, Field, Div
|
||||
from django import forms
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.forms import (
|
||||
UsernameField,
|
||||
AuthenticationForm,
|
||||
UserCreationForm,
|
||||
)
|
||||
from django.db import transaction
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from apps.common.widgets.crispy.submit import NoClassSubmit
|
||||
from apps.users.models import UserSettings
|
||||
from apps.common.middleware.thread_local import get_current_user
|
||||
|
||||
|
||||
class LoginForm(AuthenticationForm):
|
||||
@@ -132,3 +136,269 @@ class UserSettingsForm(forms.ModelForm):
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
self.fields["language"].help_text = _(
|
||||
"This changes the language (if available) and how numbers and dates are displayed\n"
|
||||
"Consider helping translate WYGIWYH to your language at %(translation_link)s"
|
||||
) % {
|
||||
"translation_link": '<a href="https://translations.herculino.com" target="_blank">translations.herculino.com</a>'
|
||||
}
|
||||
|
||||
|
||||
class UserUpdateForm(forms.ModelForm):
|
||||
new_password1 = forms.CharField(
|
||||
label=_("New Password"),
|
||||
widget=forms.PasswordInput(attrs={"autocomplete": "new-password"}),
|
||||
required=False,
|
||||
help_text=_("Leave blank to keep the current password."),
|
||||
)
|
||||
new_password2 = forms.CharField(
|
||||
label=_("Confirm New Password"),
|
||||
widget=forms.PasswordInput(attrs={"autocomplete": "new-password"}),
|
||||
required=False,
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = get_user_model()
|
||||
# Add the administrative fields
|
||||
fields = ["first_name", "last_name", "email", "is_active", "is_superuser"]
|
||||
# Help texts can be defined here or directly in the layout/field definition
|
||||
help_texts = {
|
||||
"is_active": _(
|
||||
"Designates whether this user should be treated as active. Unselect this instead of deleting accounts."
|
||||
),
|
||||
"is_superuser": _(
|
||||
"Designates that this user has all permissions without explicitly assigning them."
|
||||
),
|
||||
}
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.instance = kwargs.get("instance") # Store instance for validation/checks
|
||||
self.requesting_user = get_current_user()
|
||||
|
||||
self.helper = FormHelper()
|
||||
self.helper.form_tag = False
|
||||
self.helper.form_method = "post"
|
||||
|
||||
# Define the layout using Crispy Forms, including the new fields
|
||||
self.helper.layout = Layout(
|
||||
Row(
|
||||
Column("first_name", css_class="form-group col-md-6"),
|
||||
Column("last_name", css_class="form-group col-md-6"),
|
||||
css_class="row",
|
||||
),
|
||||
Field("email"),
|
||||
# Group password fields (optional visual grouping)
|
||||
Div(
|
||||
Field("new_password1"),
|
||||
Field("new_password2"),
|
||||
css_class="border p-3 rounded mb-3",
|
||||
),
|
||||
# Group administrative status fields
|
||||
Div(
|
||||
Field("is_active"),
|
||||
Field("is_superuser"),
|
||||
css_class="border p-3 rounded mb-3 text-bg-secondary", # Example visual separation
|
||||
),
|
||||
)
|
||||
|
||||
if self.instance and self.instance.pk:
|
||||
self.helper.layout.append(
|
||||
FormActions(
|
||||
NoClassSubmit(
|
||||
"submit", _("Update"), css_class="btn btn-outline-primary w-100"
|
||||
),
|
||||
),
|
||||
)
|
||||
else:
|
||||
self.helper.layout.append(
|
||||
FormActions(
|
||||
NoClassSubmit(
|
||||
"submit", _("Add"), css_class="btn btn-outline-primary w-100"
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
if (
|
||||
self.requesting_user == self.instance
|
||||
or not self.requesting_user.is_superuser
|
||||
):
|
||||
self.fields["is_superuser"].disabled = True
|
||||
self.fields["is_active"].disabled = True
|
||||
|
||||
# Keep existing clean methods
|
||||
def clean_email(self):
|
||||
email = self.cleaned_data.get("email")
|
||||
# Use case-insensitive comparison for email uniqueness check
|
||||
if (
|
||||
self.instance
|
||||
and get_user_model()
|
||||
.objects.filter(email__iexact=email)
|
||||
.exclude(pk=self.instance.pk)
|
||||
.exists()
|
||||
):
|
||||
raise forms.ValidationError(
|
||||
_("This email address is already in use by another account.")
|
||||
)
|
||||
return email
|
||||
|
||||
def clean_new_password2(self):
|
||||
new_password1 = self.cleaned_data.get("new_password1")
|
||||
new_password2 = self.cleaned_data.get("new_password2")
|
||||
if new_password1 and new_password1 != new_password2:
|
||||
raise forms.ValidationError(_("The two password fields didn't match."))
|
||||
if new_password1 and not new_password2:
|
||||
raise forms.ValidationError(_("Please confirm your new password."))
|
||||
if new_password2 and not new_password1:
|
||||
raise forms.ValidationError(_("Please enter the new password first."))
|
||||
return new_password2
|
||||
|
||||
def clean(self):
|
||||
cleaned_data = super().clean()
|
||||
is_active_val = cleaned_data.get("is_active")
|
||||
is_superuser_val = cleaned_data.get("is_superuser")
|
||||
|
||||
# --- Crucial Security Check Example ---
|
||||
# Prevent the requesting user from deactivating or removing superuser status
|
||||
# from their *own* account via this form.
|
||||
if (
|
||||
self.requesting_user
|
||||
and self.instance
|
||||
and self.requesting_user.pk == self.instance.pk
|
||||
):
|
||||
# Check if 'is_active' field exists and user is trying to set it to False
|
||||
if "is_active" in self.fields and is_active_val is False:
|
||||
self.add_error(
|
||||
"is_active",
|
||||
_("You cannot deactivate your own account using this form."),
|
||||
)
|
||||
|
||||
# Check if 'is_superuser' field exists, the user *is* currently a superuser,
|
||||
# and they are trying to set it to False
|
||||
if (
|
||||
"is_superuser" in self.fields
|
||||
and self.instance.is_superuser
|
||||
and is_superuser_val is False
|
||||
):
|
||||
if get_user_model().objects.filter(is_superuser=True).count() <= 1:
|
||||
self.add_error(
|
||||
"is_superuser",
|
||||
_("Cannot remove status from the last superuser."),
|
||||
)
|
||||
else:
|
||||
self.add_error(
|
||||
"is_superuser",
|
||||
_(
|
||||
"You cannot remove your own superuser status using this form."
|
||||
),
|
||||
)
|
||||
|
||||
return cleaned_data
|
||||
|
||||
# Save method remains the same, ModelForm handles boolean fields correctly
|
||||
def save(self, commit=True):
|
||||
user = super().save(commit=False)
|
||||
new_password = self.cleaned_data.get("new_password1")
|
||||
if new_password:
|
||||
user.set_password(new_password)
|
||||
|
||||
if commit:
|
||||
user.save()
|
||||
return user
|
||||
|
||||
|
||||
class UserAddForm(UserCreationForm):
|
||||
"""
|
||||
A form for administrators to create new users.
|
||||
Includes fields for first name, last name, email, active status,
|
||||
and superuser status. Uses email as the username field.
|
||||
Inherits password handling from UserCreationForm.
|
||||
"""
|
||||
|
||||
class Meta(UserCreationForm.Meta):
|
||||
model = get_user_model()
|
||||
# Specify the fields to include. UserCreationForm automatically handles
|
||||
# 'password1' and 'password2'. We replace 'username' with 'email'.
|
||||
fields = ("email", "first_name", "last_name", "is_active", "is_superuser")
|
||||
field_classes = {
|
||||
"email": forms.EmailField
|
||||
} # Ensure email field uses EmailField validation
|
||||
help_texts = {
|
||||
"is_active": _(
|
||||
"Designates whether this user should be treated as active. Unselect this instead of deleting accounts."
|
||||
),
|
||||
"is_superuser": _(
|
||||
"Designates that this user has all permissions without explicitly assigning them."
|
||||
),
|
||||
}
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# Set is_active to True by default for new users, can be overridden by admin
|
||||
self.fields["is_active"].initial = True
|
||||
|
||||
self.helper = FormHelper()
|
||||
self.helper.form_tag = False
|
||||
self.helper.form_method = "post"
|
||||
|
||||
# Define the layout, including password fields from UserCreationForm
|
||||
self.helper.layout = Layout(
|
||||
Field("email"),
|
||||
Row(
|
||||
Column("first_name", css_class="form-group col-md-6"),
|
||||
Column("last_name", css_class="form-group col-md-6"),
|
||||
css_class="row",
|
||||
),
|
||||
# UserCreationForm provides 'password1' and 'password2' fields
|
||||
Div(
|
||||
Field("password1", autocomplete="new-password"),
|
||||
Field("password2", autocomplete="new-password"),
|
||||
css_class="border p-3 rounded mb-3",
|
||||
),
|
||||
# Administrative status fields
|
||||
Div(
|
||||
Field("is_active"),
|
||||
Field("is_superuser"),
|
||||
css_class="border p-3 rounded mb-3 text-bg-secondary",
|
||||
),
|
||||
)
|
||||
|
||||
if self.instance and self.instance.pk:
|
||||
self.helper.layout.append(
|
||||
FormActions(
|
||||
NoClassSubmit(
|
||||
"submit", _("Update"), css_class="btn btn-outline-primary w-100"
|
||||
),
|
||||
),
|
||||
)
|
||||
else:
|
||||
self.helper.layout.append(
|
||||
FormActions(
|
||||
NoClassSubmit(
|
||||
"submit", _("Add"), css_class="btn btn-outline-primary w-100"
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
def clean_email(self):
|
||||
"""Ensure email uniqueness (case-insensitive)."""
|
||||
email = self.cleaned_data.get("email")
|
||||
if email and get_user_model().objects.filter(email__iexact=email).exists():
|
||||
raise forms.ValidationError(
|
||||
_("A user with this email address already exists.")
|
||||
)
|
||||
return email
|
||||
|
||||
@transaction.atomic # Ensure user creation is atomic
|
||||
def save(self, commit=True):
|
||||
"""
|
||||
Save the user instance. UserCreationForm's save handles password hashing.
|
||||
Our Meta class ensures other fields are included.
|
||||
"""
|
||||
user = super().save(commit=False)
|
||||
|
||||
if commit:
|
||||
user.save()
|
||||
return user
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.1.8 on 2025-04-13 03:35
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('users', '0019_alter_usersettings_language'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='usersettings',
|
||||
name='language',
|
||||
field=models.CharField(choices=[('auto', 'Auto'), ('af', 'Afrikaans'), ('ar', 'العربية'), ('ar-dz', 'العربية (الجزائر)'), ('ast', 'Asturianu'), ('az', 'Azərbaycan'), ('bg', 'Български'), ('be', 'Беларуская'), ('bn', 'বাংলা'), ('br', 'Brezhoneg'), ('bs', 'Bosanski'), ('ca', 'Català'), ('ckb', 'کوردیی ناوەندی'), ('cs', 'Čeština'), ('cy', 'Cymraeg'), ('da', 'Dansk'), ('de', 'Deutsch'), ('dsb', 'Dolnoserbšćina'), ('el', 'Ελληνικά'), ('en', 'English'), ('en-au', 'English (Australia)'), ('en-gb', 'English (UK)'), ('eo', 'Esperanto'), ('es', 'Español'), ('es-ar', 'Español (Argentina)'), ('es-co', 'Español (Colombia)'), ('es-mx', 'Español (México)'), ('es-ni', 'Español (Nicaragua)'), ('es-ve', 'Español (Venezuela)'), ('et', 'Eesti'), ('eu', 'Euskara'), ('fa', 'فارسی'), ('fi', 'Suomi'), ('fr', 'Français'), ('fy', 'Frysk'), ('ga', 'Gaeilge'), ('gd', 'Gàidhlig'), ('gl', 'Galego'), ('he', 'עברית'), ('hi', 'हिन्दी'), ('hr', 'Hrvatski'), ('hsb', 'Hornjoserbšćina'), ('hu', 'Magyar'), ('hy', 'Հայերեն'), ('ia', 'Interlingua'), ('id', 'Bahasa Indonesia'), ('ig', 'Igbo'), ('io', 'Ido'), ('is', 'Íslenska'), ('it', 'Italiano'), ('ja', '日本語'), ('ka', 'ქართული'), ('kab', 'Taqbaylit'), ('kk', 'Қазақша'), ('km', 'ខ្មែរ'), ('kn', 'ಕನ್ನಡ'), ('ko', '한국어'), ('ky', 'Кыргызча'), ('lb', 'Lëtzebuergesch'), ('lt', 'Lietuvių'), ('lv', 'Latviešu'), ('mk', 'Македонски'), ('ml', 'മലയാളം'), ('mn', 'Монгол'), ('mr', 'मराठी'), ('ms', 'Bahasa Melayu'), ('my', 'မြန်မာဘာသာ'), ('nb', 'Norsk (Bokmål)'), ('ne', 'नेपाली'), ('nl', 'Nederlands'), ('nn', 'Norsk (Nynorsk)'), ('os', 'Ирон'), ('pa', 'ਪੰਜਾਬੀ'), ('pl', 'Polski'), ('pt', 'Português'), ('pt-br', 'Português (Brasil)'), ('ro', 'Română'), ('ru', 'Русский'), ('sk', 'Slovenčina'), ('sl', 'Slovenščina'), ('sq', 'Shqip'), ('sr', 'Српски'), ('sr-latn', 'Srpski (Latinica)'), ('sv', 'Svenska'), ('sw', 'Kiswahili'), ('ta', 'தமிழ்'), ('te', 'తెలుగు'), ('tg', 'Тоҷикӣ'), ('th', 'ไทย'), ('tk', 'Türkmençe'), ('tr', 'Türkçe'), ('tt', 'Татарча'), ('udm', 'Удмурт'), ('ug', 'ئۇيغۇرچە'), ('uk', 'Українська'), ('ur', 'اردو'), ('uz', 'Oʻzbekcha'), ('vi', 'Tiếng Việt'), ('zh-hans', '简体中文'), ('zh-hant', '繁體中文')], default='auto', max_length=10, verbose_name='Language'),
|
||||
),
|
||||
]
|
||||
@@ -22,4 +22,24 @@ urlpatterns = [
|
||||
views.update_settings,
|
||||
name="user_settings",
|
||||
),
|
||||
path(
|
||||
"users/",
|
||||
views.users_index,
|
||||
name="users_index",
|
||||
),
|
||||
path(
|
||||
"users/list/",
|
||||
views.users_list,
|
||||
name="users_list",
|
||||
),
|
||||
path(
|
||||
"user/add/",
|
||||
views.user_add,
|
||||
name="user_add",
|
||||
),
|
||||
path(
|
||||
"user/<int:pk>/edit/",
|
||||
views.user_edit,
|
||||
name="user_edit",
|
||||
),
|
||||
]
|
||||
|
||||
@@ -1,20 +1,26 @@
|
||||
from django.contrib import messages
|
||||
from django.contrib.auth import logout
|
||||
from django.contrib.auth import logout, get_user_model
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.contrib.auth.views import (
|
||||
LoginView,
|
||||
)
|
||||
from django.core.exceptions import PermissionDenied
|
||||
from django.http import HttpResponse
|
||||
from django.shortcuts import redirect, render
|
||||
from django.shortcuts import redirect, render, get_object_or_404
|
||||
from django.urls import reverse
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.views.decorators.http import require_http_methods
|
||||
|
||||
from apps.common.decorators.htmx import only_htmx
|
||||
from apps.common.decorators.user import is_superuser, htmx_login_required
|
||||
from apps.users.forms import (
|
||||
LoginForm,
|
||||
UserSettingsForm,
|
||||
UserUpdateForm,
|
||||
UserAddForm,
|
||||
)
|
||||
from apps.common.decorators.htmx import only_htmx
|
||||
from apps.users.models import UserSettings
|
||||
from apps.common.decorators.demo import disabled_on_demo
|
||||
|
||||
|
||||
def logout_view(request):
|
||||
@@ -22,7 +28,7 @@ def logout_view(request):
|
||||
return redirect(reverse("login"))
|
||||
|
||||
|
||||
@login_required
|
||||
@htmx_login_required
|
||||
def index(request):
|
||||
if request.user.settings.start_page == UserSettings.StartPage.MONTHLY:
|
||||
return redirect(reverse("monthly_index"))
|
||||
@@ -49,7 +55,7 @@ class UserLoginView(LoginView):
|
||||
|
||||
|
||||
@only_htmx
|
||||
@login_required
|
||||
@htmx_login_required
|
||||
def toggle_amount_visibility(request):
|
||||
user_settings, created = UserSettings.objects.get_or_create(user=request.user)
|
||||
current_hide_amounts = user_settings.hide_amounts
|
||||
@@ -70,7 +76,7 @@ def toggle_amount_visibility(request):
|
||||
|
||||
|
||||
@only_htmx
|
||||
@login_required
|
||||
@htmx_login_required
|
||||
def toggle_sound_playing(request):
|
||||
user_settings, created = UserSettings.objects.get_or_create(user=request.user)
|
||||
current_mute_sounds = user_settings.mute_sounds
|
||||
@@ -91,7 +97,7 @@ def toggle_sound_playing(request):
|
||||
|
||||
|
||||
@only_htmx
|
||||
@login_required
|
||||
@htmx_login_required
|
||||
def update_settings(request):
|
||||
user_settings = request.user.settings
|
||||
|
||||
@@ -108,3 +114,86 @@ def update_settings(request):
|
||||
form = UserSettingsForm(instance=user_settings)
|
||||
|
||||
return render(request, "users/fragments/user_settings.html", {"form": form})
|
||||
|
||||
|
||||
@htmx_login_required
|
||||
@is_superuser
|
||||
@require_http_methods(["GET"])
|
||||
def users_index(request):
|
||||
return render(
|
||||
request,
|
||||
"users/pages/index.html",
|
||||
)
|
||||
|
||||
|
||||
@only_htmx
|
||||
@htmx_login_required
|
||||
@is_superuser
|
||||
@require_http_methods(["GET"])
|
||||
def users_list(request):
|
||||
users = get_user_model().objects.all().order_by("id")
|
||||
|
||||
return render(
|
||||
request,
|
||||
"users/fragments/list.html",
|
||||
{"users": users},
|
||||
)
|
||||
|
||||
|
||||
@only_htmx
|
||||
@htmx_login_required
|
||||
@is_superuser
|
||||
@require_http_methods(["GET", "POST"])
|
||||
def user_add(request):
|
||||
if request.method == "POST":
|
||||
form = UserAddForm(request.POST)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
messages.success(request, _("Item added successfully"))
|
||||
|
||||
return HttpResponse(
|
||||
status=204,
|
||||
headers={
|
||||
"HX-Trigger": "updated, hide_offcanvas",
|
||||
},
|
||||
)
|
||||
else:
|
||||
form = UserAddForm()
|
||||
|
||||
return render(
|
||||
request,
|
||||
"users/fragments/add.html",
|
||||
{"form": form},
|
||||
)
|
||||
|
||||
|
||||
@only_htmx
|
||||
@htmx_login_required
|
||||
@disabled_on_demo
|
||||
@require_http_methods(["GET", "POST"])
|
||||
def user_edit(request, pk):
|
||||
user = get_object_or_404(get_user_model(), id=pk)
|
||||
|
||||
if not request.user.is_superuser and user != request.user:
|
||||
raise PermissionDenied
|
||||
|
||||
if request.method == "POST":
|
||||
form = UserUpdateForm(request.POST, instance=user)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
messages.success(request, _("Item updated successfully"))
|
||||
|
||||
return HttpResponse(
|
||||
status=204,
|
||||
headers={
|
||||
"HX-Trigger": "updated, hide_offcanvas",
|
||||
},
|
||||
)
|
||||
else:
|
||||
form = UserUpdateForm(instance=user)
|
||||
|
||||
return render(
|
||||
request,
|
||||
"users/fragments/edit.html",
|
||||
{"form": form, "user": user},
|
||||
)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,9 +7,9 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-03-31 05:30+0000\n"
|
||||
"PO-Revision-Date: 2025-03-30 15:07+0000\n"
|
||||
"Last-Translator: valentin-p <valentinpouget@gmail.com>\n"
|
||||
"POT-Creation-Date: 2025-04-20 18:57+0000\n"
|
||||
"PO-Revision-Date: 2025-04-13 02:40+0000\n"
|
||||
"Last-Translator: Prefill add-on <noreply-addon-prefill@weblate.org>\n"
|
||||
"Language-Team: German <https://translations.herculino.com/projects/wygiwyh/"
|
||||
"app/de/>\n"
|
||||
"Language: de\n"
|
||||
@@ -27,10 +27,11 @@ msgstr "Gruppe Name"
|
||||
#: apps/currencies/forms.py:53 apps/currencies/forms.py:91
|
||||
#: apps/currencies/forms.py:142 apps/dca/forms.py:49 apps/dca/forms.py:224
|
||||
#: apps/import_app/forms.py:34 apps/rules/forms.py:51 apps/rules/forms.py:93
|
||||
#: apps/rules/forms.py:365 apps/transactions/forms.py:202
|
||||
#: apps/transactions/forms.py:269 apps/transactions/forms.py:629
|
||||
#: apps/transactions/forms.py:672 apps/transactions/forms.py:704
|
||||
#: apps/transactions/forms.py:739 apps/transactions/forms.py:891
|
||||
#: apps/rules/forms.py:365 apps/transactions/forms.py:203
|
||||
#: apps/transactions/forms.py:281 apps/transactions/forms.py:641
|
||||
#: apps/transactions/forms.py:684 apps/transactions/forms.py:716
|
||||
#: apps/transactions/forms.py:751 apps/transactions/forms.py:903
|
||||
#: apps/users/forms.py:210 apps/users/forms.py:372
|
||||
msgid "Update"
|
||||
msgstr "Aktualisierung"
|
||||
|
||||
@@ -39,11 +40,11 @@ msgstr "Aktualisierung"
|
||||
#: apps/currencies/forms.py:99 apps/currencies/forms.py:150
|
||||
#: apps/dca/forms.py:57 apps/dca/forms.py:232 apps/import_app/forms.py:42
|
||||
#: apps/rules/forms.py:59 apps/rules/forms.py:101 apps/rules/forms.py:373
|
||||
#: apps/transactions/forms.py:187 apps/transactions/forms.py:211
|
||||
#: apps/transactions/forms.py:637 apps/transactions/forms.py:680
|
||||
#: apps/transactions/forms.py:712 apps/transactions/forms.py:747
|
||||
#: apps/transactions/forms.py:899
|
||||
#: templates/account_groups/fragments/list.html:9
|
||||
#: apps/transactions/forms.py:188 apps/transactions/forms.py:212
|
||||
#: apps/transactions/forms.py:649 apps/transactions/forms.py:692
|
||||
#: apps/transactions/forms.py:724 apps/transactions/forms.py:759
|
||||
#: apps/transactions/forms.py:911 apps/users/forms.py:218
|
||||
#: apps/users/forms.py:380 templates/account_groups/fragments/list.html:9
|
||||
#: templates/accounts/fragments/list.html:9
|
||||
#: templates/categories/fragments/list.html:9
|
||||
#: templates/currencies/fragments/list.html:9
|
||||
@@ -58,6 +59,7 @@ msgstr "Aktualisierung"
|
||||
#: templates/mini_tools/unit_price_calculator.html:162
|
||||
#: templates/recurring_transactions/fragments/list.html:9
|
||||
#: templates/rules/fragments/list.html:9 templates/tags/fragments/list.html:9
|
||||
#: templates/users/fragments/list.html:10
|
||||
msgid "Add"
|
||||
msgstr "Hinzufügen"
|
||||
|
||||
@@ -72,11 +74,12 @@ msgstr "Neuer Saldo"
|
||||
#: apps/accounts/forms.py:121 apps/dca/forms.py:85 apps/dca/forms.py:92
|
||||
#: apps/insights/forms.py:118 apps/rules/forms.py:174 apps/rules/forms.py:189
|
||||
#: apps/rules/models.py:38 apps/rules/models.py:286
|
||||
#: apps/transactions/forms.py:40 apps/transactions/forms.py:303
|
||||
#: apps/transactions/forms.py:310 apps/transactions/forms.py:510
|
||||
#: apps/transactions/forms.py:771 apps/transactions/models.py:305
|
||||
#: apps/transactions/models.py:488 apps/transactions/models.py:686
|
||||
#: templates/insights/fragments/category_overview/index.html:9
|
||||
#: apps/transactions/forms.py:41 apps/transactions/forms.py:315
|
||||
#: apps/transactions/forms.py:322 apps/transactions/forms.py:522
|
||||
#: apps/transactions/forms.py:783 apps/transactions/models.py:305
|
||||
#: apps/transactions/models.py:488 apps/transactions/models.py:688
|
||||
#: templates/insights/fragments/category_overview/index.html:63
|
||||
#: templates/insights/fragments/category_overview/index.html:420
|
||||
msgid "Category"
|
||||
msgstr "Kategorie"
|
||||
|
||||
@@ -84,12 +87,13 @@ msgstr "Kategorie"
|
||||
#: apps/export_app/forms.py:44 apps/export_app/forms.py:135
|
||||
#: apps/rules/forms.py:177 apps/rules/forms.py:186 apps/rules/models.py:39
|
||||
#: apps/rules/models.py:290 apps/transactions/filters.py:74
|
||||
#: apps/transactions/forms.py:48 apps/transactions/forms.py:319
|
||||
#: apps/transactions/forms.py:327 apps/transactions/forms.py:503
|
||||
#: apps/transactions/forms.py:764 apps/transactions/models.py:311
|
||||
#: apps/transactions/models.py:490 apps/transactions/models.py:690
|
||||
#: templates/includes/navbar.html:108 templates/tags/fragments/list.html:5
|
||||
#: templates/tags/pages/index.html:4
|
||||
#: apps/transactions/forms.py:49 apps/transactions/forms.py:331
|
||||
#: apps/transactions/forms.py:339 apps/transactions/forms.py:515
|
||||
#: apps/transactions/forms.py:776 apps/transactions/models.py:311
|
||||
#: apps/transactions/models.py:490 apps/transactions/models.py:692
|
||||
#: templates/includes/navbar.html:108
|
||||
#: templates/insights/fragments/category_overview/index.html:35
|
||||
#: templates/tags/fragments/list.html:5 templates/tags/pages/index.html:4
|
||||
msgid "Tags"
|
||||
msgstr "Tags"
|
||||
|
||||
@@ -108,6 +112,7 @@ msgstr "Tags"
|
||||
#: templates/recurring_transactions/fragments/table.html:18
|
||||
#: templates/rules/fragments/list.html:26
|
||||
#: templates/tags/fragments/table.html:16
|
||||
#: templates/users/fragments/list.html:29
|
||||
msgid "Name"
|
||||
msgstr "Name"
|
||||
|
||||
@@ -160,9 +165,9 @@ msgstr ""
|
||||
|
||||
#: apps/accounts/models.py:70 apps/rules/forms.py:166 apps/rules/forms.py:179
|
||||
#: apps/rules/models.py:30 apps/rules/models.py:242
|
||||
#: apps/transactions/forms.py:60 apps/transactions/forms.py:495
|
||||
#: apps/transactions/forms.py:756 apps/transactions/models.py:278
|
||||
#: apps/transactions/models.py:448 apps/transactions/models.py:668
|
||||
#: apps/transactions/forms.py:61 apps/transactions/forms.py:507
|
||||
#: apps/transactions/forms.py:768 apps/transactions/models.py:278
|
||||
#: apps/transactions/models.py:448 apps/transactions/models.py:670
|
||||
msgid "Account"
|
||||
msgstr "Konto"
|
||||
|
||||
@@ -286,7 +291,13 @@ msgstr "Fehler bei der Erstellung einer neuen Instanz"
|
||||
msgid "Ungrouped"
|
||||
msgstr "Ohne Gruppierung"
|
||||
|
||||
#: apps/common/fields/month_year.py:23 apps/common/fields/month_year.py:51
|
||||
#: apps/common/fields/month_year.py:30
|
||||
#, fuzzy
|
||||
#| msgid "Invalid date format. Use YYYY-MM."
|
||||
msgid "Invalid date format. Use YYYY-MM or YYYY-MM-DD."
|
||||
msgstr "Ungültiges Datumsformat. Nutze JJJJ-MM."
|
||||
|
||||
#: apps/common/fields/month_year.py:59
|
||||
msgid "Invalid date format. Use YYYY-MM."
|
||||
msgstr "Ungültiges Datumsformat. Nutze JJJJ-MM."
|
||||
|
||||
@@ -322,7 +333,7 @@ msgstr ""
|
||||
"Privat: Nur für den Besitzer und geteilte Nutzer sichtbar.<br/>Öffentlich: "
|
||||
"Sichtbar für alle Nutzer. Nur bearbeitbar durch Besitzer."
|
||||
|
||||
#: apps/common/forms.py:79 apps/users/forms.py:131
|
||||
#: apps/common/forms.py:79 apps/users/forms.py:135
|
||||
msgid "Save"
|
||||
msgstr "Speichern"
|
||||
|
||||
@@ -413,7 +424,7 @@ msgstr "Fehler"
|
||||
msgid "Info"
|
||||
msgstr "Info"
|
||||
|
||||
#: apps/common/views.py:110
|
||||
#: apps/common/views.py:111
|
||||
msgid "Cache cleared successfully"
|
||||
msgstr "Cache erfolgreich geleert"
|
||||
|
||||
@@ -451,7 +462,7 @@ msgstr "Suffix"
|
||||
|
||||
#: apps/currencies/forms.py:69 apps/dca/models.py:158 apps/rules/forms.py:169
|
||||
#: apps/rules/forms.py:182 apps/rules/models.py:33 apps/rules/models.py:254
|
||||
#: apps/transactions/forms.py:64 apps/transactions/forms.py:331
|
||||
#: apps/transactions/forms.py:65 apps/transactions/forms.py:343
|
||||
#: apps/transactions/models.py:288
|
||||
#: templates/dca/fragments/strategy/details.html:52
|
||||
#: templates/exchange_rates/fragments/table.html:10
|
||||
@@ -538,7 +549,7 @@ msgstr "Diensttyp"
|
||||
#: templates/categories/fragments/list.html:21
|
||||
#: templates/entities/fragments/list.html:21
|
||||
#: templates/recurring_transactions/fragments/list.html:21
|
||||
#: templates/tags/fragments/list.html:21
|
||||
#: templates/tags/fragments/list.html:21 templates/users/fragments/list.html:28
|
||||
msgid "Active"
|
||||
msgstr "Aktiv"
|
||||
|
||||
@@ -662,11 +673,11 @@ msgstr "Dienst erfolgreich in die Warteschlange eingereiht"
|
||||
msgid "Create transaction"
|
||||
msgstr "Erstelle Transaktion"
|
||||
|
||||
#: apps/dca/forms.py:70 apps/transactions/forms.py:278
|
||||
#: apps/dca/forms.py:70 apps/transactions/forms.py:290
|
||||
msgid "From Account"
|
||||
msgstr "Startkonto"
|
||||
|
||||
#: apps/dca/forms.py:76 apps/transactions/forms.py:283
|
||||
#: apps/dca/forms.py:76 apps/transactions/forms.py:295
|
||||
msgid "To Account"
|
||||
msgstr "Zielkonto"
|
||||
|
||||
@@ -693,7 +704,7 @@ msgstr "Verknüpfe Transaktion"
|
||||
msgid "You must provide an account."
|
||||
msgstr "Du musst ein Konto angeben."
|
||||
|
||||
#: apps/dca/forms.py:312 apps/transactions/forms.py:445
|
||||
#: apps/dca/forms.py:312 apps/transactions/forms.py:457
|
||||
msgid "From and To accounts must be different."
|
||||
msgstr "Start- und Zielkonten müssen unterschiedlich sein."
|
||||
|
||||
@@ -712,8 +723,8 @@ msgstr "Startwährung"
|
||||
|
||||
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:173
|
||||
#: apps/rules/forms.py:188 apps/rules/models.py:37 apps/rules/models.py:270
|
||||
#: apps/transactions/forms.py:347 apps/transactions/models.py:301
|
||||
#: apps/transactions/models.py:497 apps/transactions/models.py:696
|
||||
#: apps/transactions/forms.py:359 apps/transactions/models.py:301
|
||||
#: apps/transactions/models.py:497 apps/transactions/models.py:698
|
||||
msgid "Notes"
|
||||
msgstr "Notizen"
|
||||
|
||||
@@ -770,6 +781,8 @@ msgid "Entry deleted successfully"
|
||||
msgstr "Eintrag erfolgreich gelöscht"
|
||||
|
||||
#: apps/export_app/forms.py:14 apps/export_app/forms.py:131
|
||||
#: templates/includes/navbar.html:147 templates/users/fragments/list.html:6
|
||||
#: templates/users/pages/index.html:4
|
||||
msgid "Users"
|
||||
msgstr "Nutzer"
|
||||
|
||||
@@ -791,16 +804,16 @@ msgstr "Kategorien"
|
||||
#: apps/export_app/forms.py:50 apps/export_app/forms.py:136
|
||||
#: apps/rules/forms.py:178 apps/rules/forms.py:187 apps/rules/models.py:40
|
||||
#: apps/rules/models.py:282 apps/transactions/filters.py:81
|
||||
#: apps/transactions/forms.py:56 apps/transactions/forms.py:518
|
||||
#: apps/transactions/forms.py:779 apps/transactions/models.py:261
|
||||
#: apps/transactions/forms.py:57 apps/transactions/forms.py:530
|
||||
#: apps/transactions/forms.py:791 apps/transactions/models.py:261
|
||||
#: apps/transactions/models.py:316 apps/transactions/models.py:493
|
||||
#: apps/transactions/models.py:693 templates/entities/fragments/list.html:5
|
||||
#: apps/transactions/models.py:695 templates/entities/fragments/list.html:5
|
||||
#: templates/entities/pages/index.html:4 templates/includes/navbar.html:110
|
||||
msgid "Entities"
|
||||
msgstr "Entitäten"
|
||||
|
||||
#: apps/export_app/forms.py:56 apps/export_app/forms.py:140
|
||||
#: apps/transactions/models.py:730 templates/includes/navbar.html:74
|
||||
#: apps/transactions/models.py:732 templates/includes/navbar.html:74
|
||||
#: templates/recurring_transactions/fragments/list.html:5
|
||||
#: templates/recurring_transactions/pages/index.html:4
|
||||
msgid "Recurring Transactions"
|
||||
@@ -962,7 +975,9 @@ msgstr "Vorgang erfolgreich gelöscht"
|
||||
|
||||
#: apps/insights/forms.py:119 apps/insights/utils/sankey.py:36
|
||||
#: apps/insights/utils/sankey.py:167
|
||||
#: templates/insights/fragments/category_overview/index.html:18
|
||||
#: templates/insights/fragments/category_overview/index.html:73
|
||||
#: templates/insights/fragments/category_overview/index.html:285
|
||||
#: templates/insights/fragments/category_overview/index.html:314
|
||||
msgid "Uncategorized"
|
||||
msgstr "Unkategorisiert"
|
||||
|
||||
@@ -1045,7 +1060,7 @@ msgstr "Bediener"
|
||||
|
||||
#: apps/rules/forms.py:167 apps/rules/forms.py:180 apps/rules/models.py:31
|
||||
#: apps/rules/models.py:246 apps/transactions/models.py:285
|
||||
#: apps/transactions/models.py:453 apps/transactions/models.py:674
|
||||
#: apps/transactions/models.py:453 apps/transactions/models.py:676
|
||||
msgid "Type"
|
||||
msgstr "Typ"
|
||||
|
||||
@@ -1059,23 +1074,23 @@ msgid "Paid"
|
||||
msgstr "Bezahlt"
|
||||
|
||||
#: apps/rules/forms.py:170 apps/rules/forms.py:183 apps/rules/models.py:34
|
||||
#: apps/rules/models.py:258 apps/transactions/forms.py:68
|
||||
#: apps/transactions/forms.py:334 apps/transactions/forms.py:524
|
||||
#: apps/rules/models.py:258 apps/transactions/forms.py:69
|
||||
#: apps/transactions/forms.py:346 apps/transactions/forms.py:536
|
||||
#: apps/transactions/models.py:289 apps/transactions/models.py:471
|
||||
#: apps/transactions/models.py:698
|
||||
#: apps/transactions/models.py:700
|
||||
msgid "Reference Date"
|
||||
msgstr "Referenzdatum"
|
||||
|
||||
#: apps/rules/forms.py:171 apps/rules/forms.py:184 apps/rules/models.py:35
|
||||
#: apps/rules/models.py:262 apps/transactions/models.py:294
|
||||
#: apps/transactions/models.py:679 templates/insights/fragments/sankey.html:95
|
||||
#: apps/transactions/models.py:681 templates/insights/fragments/sankey.html:95
|
||||
msgid "Amount"
|
||||
msgstr "Betrag"
|
||||
|
||||
#: apps/rules/forms.py:172 apps/rules/forms.py:185 apps/rules/models.py:14
|
||||
#: apps/rules/models.py:36 apps/rules/models.py:266
|
||||
#: apps/transactions/forms.py:338 apps/transactions/models.py:299
|
||||
#: apps/transactions/models.py:455 apps/transactions/models.py:682
|
||||
#: apps/transactions/forms.py:350 apps/transactions/models.py:299
|
||||
#: apps/transactions/models.py:455 apps/transactions/models.py:684
|
||||
msgid "Description"
|
||||
msgstr "Beschreibung"
|
||||
|
||||
@@ -1220,6 +1235,7 @@ msgstr ""
|
||||
|
||||
#: apps/transactions/filters.py:24 templates/cotton/transaction/item.html:21
|
||||
#: templates/cotton/transaction/item.html:31 templates/includes/navbar.html:46
|
||||
#: templates/insights/fragments/category_overview/index.html:46
|
||||
#: templates/transactions/widgets/paid_toggle_button.html:8
|
||||
#: templates/transactions/widgets/unselectable_paid_toggle_button.html:12
|
||||
msgid "Projected"
|
||||
@@ -1253,40 +1269,48 @@ msgstr "Betrag Minimum"
|
||||
msgid "Amount max"
|
||||
msgstr "Betrag Maximum"
|
||||
|
||||
#: apps/transactions/forms.py:171
|
||||
#: apps/transactions/forms.py:172
|
||||
msgid "More"
|
||||
msgstr "Mehr"
|
||||
|
||||
#: apps/transactions/forms.py:290
|
||||
#: apps/transactions/forms.py:216
|
||||
msgid "Save and add similar"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:221
|
||||
msgid "Save and add another"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:302
|
||||
msgid "From Amount"
|
||||
msgstr "Startbetrag"
|
||||
|
||||
#: apps/transactions/forms.py:295
|
||||
#: apps/transactions/forms.py:307
|
||||
msgid "To Amount"
|
||||
msgstr "Zielbetrag"
|
||||
|
||||
#: apps/transactions/forms.py:412
|
||||
#: apps/transactions/forms.py:424
|
||||
#: templates/cotton/ui/quick_transactions_buttons.html:40
|
||||
msgid "Transfer"
|
||||
msgstr "Transfer"
|
||||
|
||||
#: apps/transactions/forms.py:658
|
||||
#: apps/transactions/forms.py:670
|
||||
msgid "Tag name"
|
||||
msgstr "Tagname"
|
||||
|
||||
#: apps/transactions/forms.py:690
|
||||
#: apps/transactions/forms.py:702
|
||||
msgid "Entity name"
|
||||
msgstr "Entitätsname"
|
||||
|
||||
#: apps/transactions/forms.py:722
|
||||
#: apps/transactions/forms.py:734
|
||||
msgid "Category name"
|
||||
msgstr "Kategoriename"
|
||||
|
||||
#: apps/transactions/forms.py:724
|
||||
#: apps/transactions/forms.py:736
|
||||
msgid "Muted categories won't count towards your monthly total"
|
||||
msgstr "Ausgeblendete Kategorien zählen nicht zu deiner Monatsübersicht"
|
||||
|
||||
#: apps/transactions/forms.py:910
|
||||
#: apps/transactions/forms.py:922
|
||||
msgid "End date should be after the start date"
|
||||
msgstr "Enddatum sollte hinter dem Startdatum liegen"
|
||||
|
||||
@@ -1339,7 +1363,7 @@ msgstr "Entität"
|
||||
#: templates/calendar_view/fragments/list.html:52
|
||||
#: templates/calendar_view/fragments/list.html:54
|
||||
#: templates/cotton/ui/quick_transactions_buttons.html:10
|
||||
#: templates/insights/fragments/category_overview/index.html:10
|
||||
#: templates/insights/fragments/category_overview/index.html:64
|
||||
#: templates/monthly_overview/fragments/monthly_summary.html:39
|
||||
msgid "Income"
|
||||
msgstr "Einnahme"
|
||||
@@ -1350,7 +1374,7 @@ msgstr "Einnahme"
|
||||
#: templates/calendar_view/fragments/list.html:56
|
||||
#: templates/calendar_view/fragments/list.html:58
|
||||
#: templates/cotton/ui/quick_transactions_buttons.html:18
|
||||
#: templates/insights/fragments/category_overview/index.html:11
|
||||
#: templates/insights/fragments/category_overview/index.html:65
|
||||
msgid "Expense"
|
||||
msgstr "Ausgabe"
|
||||
|
||||
@@ -1358,7 +1382,7 @@ msgstr "Ausgabe"
|
||||
msgid "Installment Plan"
|
||||
msgstr "Ratenzahlungs-Plan"
|
||||
|
||||
#: apps/transactions/models.py:336 apps/transactions/models.py:729
|
||||
#: apps/transactions/models.py:336 apps/transactions/models.py:731
|
||||
msgid "Recurring Transaction"
|
||||
msgstr "Wiederkehrende Transaktion"
|
||||
|
||||
@@ -1416,11 +1440,11 @@ msgid "The installment number to start counting from"
|
||||
msgstr ""
|
||||
"Die Zahl mit der bei der Zählung der Ratenzahlungen begonnen werden soll"
|
||||
|
||||
#: apps/transactions/models.py:469 apps/transactions/models.py:702
|
||||
#: apps/transactions/models.py:469 apps/transactions/models.py:704
|
||||
msgid "Start Date"
|
||||
msgstr "Startdatum"
|
||||
|
||||
#: apps/transactions/models.py:473 apps/transactions/models.py:703
|
||||
#: apps/transactions/models.py:473 apps/transactions/models.py:705
|
||||
msgid "End Date"
|
||||
msgstr "Enddatum"
|
||||
|
||||
@@ -1432,48 +1456,48 @@ msgstr "Regelmäßigkeit"
|
||||
msgid "Installment Amount"
|
||||
msgstr "Ratenzahlungs-Wert"
|
||||
|
||||
#: apps/transactions/models.py:500 apps/transactions/models.py:719
|
||||
#: apps/transactions/models.py:500 apps/transactions/models.py:721
|
||||
msgid "Add description to transactions"
|
||||
msgstr "Beschreibung zu Transaktionen hinzufügen"
|
||||
|
||||
#: apps/transactions/models.py:503 apps/transactions/models.py:722
|
||||
#: apps/transactions/models.py:503 apps/transactions/models.py:724
|
||||
msgid "Add notes to transactions"
|
||||
msgstr "Notizen zu Transaktionen hinzufügen"
|
||||
|
||||
#: apps/transactions/models.py:661
|
||||
#: apps/transactions/models.py:663
|
||||
msgid "day(s)"
|
||||
msgstr "Tag(e)"
|
||||
|
||||
#: apps/transactions/models.py:662
|
||||
#: apps/transactions/models.py:664
|
||||
msgid "week(s)"
|
||||
msgstr "Woche(n)"
|
||||
|
||||
#: apps/transactions/models.py:663
|
||||
#: apps/transactions/models.py:665
|
||||
msgid "month(s)"
|
||||
msgstr "Monat(e)"
|
||||
|
||||
#: apps/transactions/models.py:664
|
||||
#: apps/transactions/models.py:666
|
||||
msgid "year(s)"
|
||||
msgstr "Jahr(e)"
|
||||
|
||||
#: apps/transactions/models.py:666
|
||||
#: apps/transactions/models.py:668
|
||||
#: templates/recurring_transactions/fragments/list.html:24
|
||||
msgid "Paused"
|
||||
msgstr "Pausiert"
|
||||
|
||||
#: apps/transactions/models.py:705
|
||||
#: apps/transactions/models.py:707
|
||||
msgid "Recurrence Type"
|
||||
msgstr "Regelmäßigkeit"
|
||||
|
||||
#: apps/transactions/models.py:708
|
||||
#: apps/transactions/models.py:710
|
||||
msgid "Recurrence Interval"
|
||||
msgstr "Wiederholungsintervall"
|
||||
|
||||
#: apps/transactions/models.py:712
|
||||
#: apps/transactions/models.py:714
|
||||
msgid "Last Generated Date"
|
||||
msgstr "Letztes generiertes Datum"
|
||||
|
||||
#: apps/transactions/models.py:715
|
||||
#: apps/transactions/models.py:717
|
||||
msgid "Last Generated Reference Date"
|
||||
msgstr "Letztes generiertes Referenzdatum"
|
||||
|
||||
@@ -1598,35 +1622,35 @@ msgstr "Tag erfolgreich aktualisiert"
|
||||
msgid "Tag deleted successfully"
|
||||
msgstr "Tag erfolgreich gelöscht"
|
||||
|
||||
#: apps/transactions/views/transactions.py:50
|
||||
#: apps/transactions/views/transactions.py:89
|
||||
#: apps/transactions/views/transactions.py:52
|
||||
#: apps/transactions/views/transactions.py:110
|
||||
msgid "Transaction added successfully"
|
||||
msgstr "Transaktion erfolgreich hinzugefügt"
|
||||
|
||||
#: apps/transactions/views/transactions.py:123
|
||||
#: apps/transactions/views/transactions.py:144
|
||||
msgid "Transaction updated successfully"
|
||||
msgstr "Transaktion erfolgreich aktualisiert"
|
||||
|
||||
#: apps/transactions/views/transactions.py:173
|
||||
#: apps/transactions/views/transactions.py:194
|
||||
#, python-format
|
||||
msgid "%(count)s transaction updated successfully"
|
||||
msgid_plural "%(count)s transactions updated successfully"
|
||||
msgstr[0] "%(count)s Transaktion erfolgreich aktualisiert"
|
||||
msgstr[1] "%(count)s Transaktionen erfolgreich aktualisiert"
|
||||
|
||||
#: apps/transactions/views/transactions.py:209
|
||||
#: apps/transactions/views/transactions.py:230
|
||||
msgid "Transaction duplicated successfully"
|
||||
msgstr "Transaktion erfolgreich duplisiert"
|
||||
|
||||
#: apps/transactions/views/transactions.py:251
|
||||
#: apps/transactions/views/transactions.py:272
|
||||
msgid "Transaction deleted successfully"
|
||||
msgstr "Transaktion erfolgreich gelöscht"
|
||||
|
||||
#: apps/transactions/views/transactions.py:269
|
||||
#: apps/transactions/views/transactions.py:290
|
||||
msgid "Transaction restored successfully"
|
||||
msgstr "Transaktion erfolgreich wiederhergestellt"
|
||||
|
||||
#: apps/transactions/views/transactions.py:295
|
||||
#: apps/transactions/views/transactions.py:316
|
||||
msgid "Transfer added successfully"
|
||||
msgstr "Transfer erfolgreich hinzugefügt"
|
||||
|
||||
@@ -1650,40 +1674,108 @@ msgstr "Berechtigungen"
|
||||
msgid "Important dates"
|
||||
msgstr "Wichtige Daten"
|
||||
|
||||
#: apps/users/forms.py:19 apps/users/models.py:13 templates/users/login.html:19
|
||||
#: apps/users/forms.py:23 apps/users/models.py:13 templates/users/login.html:19
|
||||
msgid "E-mail"
|
||||
msgstr "E-Mail"
|
||||
|
||||
#: apps/users/forms.py:25 templates/users/login.html:20
|
||||
#: apps/users/forms.py:29 templates/users/login.html:20
|
||||
msgid "Password"
|
||||
msgstr "Passwort"
|
||||
|
||||
#: apps/users/forms.py:33
|
||||
#: apps/users/forms.py:37
|
||||
msgid "Invalid e-mail or password"
|
||||
msgstr "Ungültige E-Mail oder Passwort"
|
||||
|
||||
#: apps/users/forms.py:34
|
||||
#: apps/users/forms.py:38
|
||||
msgid "This account is deactivated"
|
||||
msgstr "Dieses Konto ist deaktiviert"
|
||||
|
||||
#: apps/users/forms.py:50 apps/users/forms.py:63 apps/users/forms.py:85
|
||||
#: apps/users/forms.py:54 apps/users/forms.py:67 apps/users/forms.py:89
|
||||
#: templates/monthly_overview/pages/overview.html:153
|
||||
#: templates/transactions/pages/transactions.html:35
|
||||
msgid "Default"
|
||||
msgstr "Standard"
|
||||
|
||||
#: apps/users/forms.py:91 apps/users/models.py:41
|
||||
#: apps/users/forms.py:95 apps/users/models.py:41
|
||||
msgid "Date Format"
|
||||
msgstr "Datumsformat"
|
||||
|
||||
#: apps/users/forms.py:96 apps/users/models.py:46
|
||||
#: apps/users/forms.py:100 apps/users/models.py:46
|
||||
msgid "Datetime Format"
|
||||
msgstr "Datums- und Zeitformat"
|
||||
|
||||
#: apps/users/forms.py:102 apps/users/models.py:49
|
||||
#: apps/users/forms.py:106 apps/users/models.py:49
|
||||
msgid "Number Format"
|
||||
msgstr "Zahlenformat"
|
||||
|
||||
#: apps/users/forms.py:141
|
||||
#, python-format
|
||||
msgid ""
|
||||
"This changes the language (if available) and how numbers and dates are "
|
||||
"displayed\n"
|
||||
"Consider helping translate WYGIWYH to your language at %(translation_link)s"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:150
|
||||
#, fuzzy
|
||||
#| msgid "Password"
|
||||
msgid "New Password"
|
||||
msgstr "Passwort"
|
||||
|
||||
#: apps/users/forms.py:153
|
||||
msgid "Leave blank to keep the current password."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:156
|
||||
msgid "Confirm New Password"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:168 apps/users/forms.py:329
|
||||
msgid ""
|
||||
"Designates whether this user should be treated as active. Unselect this "
|
||||
"instead of deleting accounts."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:171 apps/users/forms.py:332
|
||||
msgid ""
|
||||
"Designates that this user has all permissions without explicitly assigning "
|
||||
"them."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:242
|
||||
msgid "This email address is already in use by another account."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:250
|
||||
msgid "The two password fields didn't match."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:252
|
||||
msgid "Please confirm your new password."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:254
|
||||
msgid "Please enter the new password first."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:274
|
||||
msgid "You cannot deactivate your own account using this form."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:287
|
||||
msgid "Cannot remove status from the last superuser."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:293
|
||||
msgid "You cannot remove your own superuser status using this form."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:390
|
||||
#, fuzzy
|
||||
#| msgid "A value for this field already exists in the rule."
|
||||
msgid "A user with this email address already exists."
|
||||
msgstr "Ein Wert für dieses Feld existiert bereits in dieser Regel."
|
||||
|
||||
#: apps/users/models.py:27 templates/includes/navbar.html:28
|
||||
msgid "Yearly by currency"
|
||||
msgstr "Jährlich nach Währung"
|
||||
@@ -1724,26 +1816,38 @@ msgstr "Zeitzone"
|
||||
msgid "Start page"
|
||||
msgstr "Startseite"
|
||||
|
||||
#: apps/users/views.py:62
|
||||
#: apps/users/views.py:68
|
||||
msgid "Transaction amounts are now hidden"
|
||||
msgstr "Beträge sind nun versteckt"
|
||||
|
||||
#: apps/users/views.py:65
|
||||
#: apps/users/views.py:71
|
||||
msgid "Transaction amounts are now displayed"
|
||||
msgstr "Beträge werden angezeigt"
|
||||
|
||||
#: apps/users/views.py:83
|
||||
#: apps/users/views.py:89
|
||||
msgid "Sounds are now muted"
|
||||
msgstr "Sounds sind stummgeschaltet"
|
||||
|
||||
#: apps/users/views.py:86
|
||||
#: apps/users/views.py:92
|
||||
msgid "Sounds will now play"
|
||||
msgstr "Sounds werden wiedergegeben"
|
||||
|
||||
#: apps/users/views.py:102
|
||||
#: apps/users/views.py:108
|
||||
msgid "Your settings have been updated"
|
||||
msgstr "Deine Einstellungen wurden aktualisiert"
|
||||
|
||||
#: apps/users/views.py:152
|
||||
#, fuzzy
|
||||
#| msgid "Rule added successfully"
|
||||
msgid "Item added successfully"
|
||||
msgstr "Regel erfolgreich hinzugefügt"
|
||||
|
||||
#: apps/users/views.py:184
|
||||
#, fuzzy
|
||||
#| msgid "Rule updated successfully"
|
||||
msgid "Item updated successfully"
|
||||
msgstr "Regel erfolgreich aktualisiert"
|
||||
|
||||
#: templates/account_groups/fragments/add.html:5
|
||||
msgid "Add account group"
|
||||
msgstr "Kontogruppe hinzufügen"
|
||||
@@ -1766,6 +1870,7 @@ msgstr "Kontogruppe bearbeiten"
|
||||
#: templates/recurring_transactions/fragments/table.html:25
|
||||
#: templates/rules/fragments/list.html:33
|
||||
#: templates/tags/fragments/table.html:23
|
||||
#: templates/users/fragments/list.html:38
|
||||
msgid "Actions"
|
||||
msgstr "Aktionen"
|
||||
|
||||
@@ -1788,6 +1893,7 @@ msgstr "Aktionen"
|
||||
#: templates/rules/fragments/transaction_rule/view.html:47
|
||||
#: templates/rules/fragments/transaction_rule/view.html:80
|
||||
#: templates/tags/fragments/table.html:28
|
||||
#: templates/users/fragments/list.html:43
|
||||
msgid "Edit"
|
||||
msgstr "Bearbeiten"
|
||||
|
||||
@@ -2010,7 +2116,7 @@ msgid "Muted"
|
||||
msgstr "Ausgeblendet"
|
||||
|
||||
#: templates/categories/fragments/table.html:75
|
||||
#: templates/insights/fragments/category_overview/index.html:67
|
||||
#: templates/insights/fragments/category_overview/index.html:430
|
||||
msgid "No categories"
|
||||
msgstr "Keine Kategorien"
|
||||
|
||||
@@ -2472,10 +2578,11 @@ msgid "Net Worth"
|
||||
msgstr "Nettovermögen"
|
||||
|
||||
#: templates/includes/navbar.html:44
|
||||
#: templates/insights/fragments/category_overview/index.html:50
|
||||
msgid "Current"
|
||||
msgstr "Aktuell"
|
||||
|
||||
#: templates/includes/navbar.html:50
|
||||
#: templates/includes/navbar.html:50 templates/insights/pages/index.html:5
|
||||
msgid "Insights"
|
||||
msgstr "Einblicke"
|
||||
|
||||
@@ -2511,15 +2618,19 @@ msgstr "Verwaltung"
|
||||
msgid "Automation"
|
||||
msgstr "Automatisierung"
|
||||
|
||||
#: templates/includes/navbar.html:150
|
||||
#: templates/includes/navbar.html:145
|
||||
msgid "Admin"
|
||||
msgstr ""
|
||||
|
||||
#: templates/includes/navbar.html:154
|
||||
msgid "Only use this if you know what you're doing"
|
||||
msgstr "Nur benutzen, wenn du weißt was du tust"
|
||||
|
||||
#: templates/includes/navbar.html:151
|
||||
#: templates/includes/navbar.html:155
|
||||
msgid "Django Admin"
|
||||
msgstr "Django Admin"
|
||||
|
||||
#: templates/includes/navbar.html:160
|
||||
#: templates/includes/navbar.html:165
|
||||
msgid "Calculator"
|
||||
msgstr "Rechner"
|
||||
|
||||
@@ -2527,22 +2638,31 @@ msgstr "Rechner"
|
||||
msgid "Settings"
|
||||
msgstr "Einstellungen"
|
||||
|
||||
#: templates/includes/navbar/user_menu.html:41
|
||||
#: templates/includes/navbar/user_menu.html:19
|
||||
#, fuzzy
|
||||
#| msgid "Edit import profile"
|
||||
msgid "Edit profile"
|
||||
msgstr "Import-Profil bearbeiten"
|
||||
|
||||
#: templates/includes/navbar/user_menu.html:46
|
||||
msgid "Clear cache"
|
||||
msgstr "Cache leeren"
|
||||
|
||||
#: templates/includes/navbar/user_menu.html:45
|
||||
#: templates/includes/navbar/user_menu.html:50
|
||||
msgid "Logout"
|
||||
msgstr "Abmelden"
|
||||
|
||||
#: templates/includes/scripts/hyperscript/htmx_error_handler.html:8
|
||||
#, fuzzy
|
||||
msgid "Access Denied"
|
||||
msgstr ""
|
||||
msgstr "Access Denied"
|
||||
|
||||
#: templates/includes/scripts/hyperscript/htmx_error_handler.html:9
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"You do not have permission to perform this action or access this resource."
|
||||
msgstr ""
|
||||
"You do not have permission to perform this action or access this resource."
|
||||
|
||||
#: templates/includes/scripts/hyperscript/htmx_error_handler.html:18
|
||||
msgid "Something went wrong loading your data"
|
||||
@@ -2583,18 +2703,49 @@ msgstr "Einnahmen/Ausgaben nach Konto"
|
||||
msgid "Income/Expense by Currency"
|
||||
msgstr "Einnahmen/Ausgaben nach Währung"
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:12
|
||||
#: templates/insights/fragments/category_overview/index.html:14
|
||||
msgid "Table"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:24
|
||||
msgid "Bars"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:38
|
||||
msgid ""
|
||||
"Transaction amounts associated with multiple tags will be counted once for "
|
||||
"each tag"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:54
|
||||
#, fuzzy
|
||||
#| msgid "final total"
|
||||
msgid "Final total"
|
||||
msgstr "Gesamtbilanz"
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:66
|
||||
#: templates/monthly_overview/fragments/monthly_summary.html:167
|
||||
msgid "Total"
|
||||
msgstr "Gesamt"
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:166
|
||||
msgid "Untagged"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:407
|
||||
#, fuzzy
|
||||
#| msgid "final total"
|
||||
msgid "Final Total"
|
||||
msgstr "Gesamtbilanz"
|
||||
|
||||
#: templates/insights/fragments/emergency_fund.html:15
|
||||
msgid "You've spent an average of"
|
||||
msgstr "Deine Ausgaben liegen im Durchschnitt bei"
|
||||
|
||||
#: templates/insights/fragments/emergency_fund.html:23
|
||||
#, fuzzy
|
||||
msgid "on the last 12 months, at this rate you could go by"
|
||||
msgstr ""
|
||||
msgstr "on the last 12 months, at this rate you could go by"
|
||||
|
||||
#: templates/insights/fragments/emergency_fund.html:25
|
||||
msgid "months without any income."
|
||||
@@ -2632,53 +2783,53 @@ msgstr "Von"
|
||||
msgid "Percentage"
|
||||
msgstr "Prozent"
|
||||
|
||||
#: templates/insights/pages/index.html:35
|
||||
#: templates/insights/pages/index.html:37
|
||||
msgid "Month"
|
||||
msgstr "Monat"
|
||||
|
||||
#: templates/insights/pages/index.html:38
|
||||
#: templates/insights/pages/index.html:40
|
||||
#: templates/yearly_overview/pages/overview_by_account.html:61
|
||||
#: templates/yearly_overview/pages/overview_by_currency.html:63
|
||||
msgid "Year"
|
||||
msgstr "Jahr"
|
||||
|
||||
#: templates/insights/pages/index.html:43
|
||||
#: templates/insights/pages/index.html:45
|
||||
msgid "Month Range"
|
||||
msgstr "Monats-Zeitraum"
|
||||
|
||||
#: templates/insights/pages/index.html:48
|
||||
#: templates/insights/pages/index.html:50
|
||||
msgid "Year Range"
|
||||
msgstr "Jahres-Zeitraum"
|
||||
|
||||
#: templates/insights/pages/index.html:53
|
||||
#: templates/insights/pages/index.html:55
|
||||
msgid "Date Range"
|
||||
msgstr "Datums-Zeitraum"
|
||||
|
||||
#: templates/insights/pages/index.html:81
|
||||
#: templates/insights/pages/index.html:83
|
||||
msgid "Account Flow"
|
||||
msgstr "Kontofluss"
|
||||
|
||||
#: templates/insights/pages/index.html:88
|
||||
#: templates/insights/pages/index.html:90
|
||||
msgid "Currency Flow"
|
||||
msgstr "Währungsfluss"
|
||||
|
||||
#: templates/insights/pages/index.html:95
|
||||
#: templates/insights/pages/index.html:97
|
||||
msgid "Category Explorer"
|
||||
msgstr "Kategorien-Explorer"
|
||||
|
||||
#: templates/insights/pages/index.html:102
|
||||
#: templates/insights/pages/index.html:104
|
||||
msgid "Categories Overview"
|
||||
msgstr "Kategorien-Übersicht"
|
||||
|
||||
#: templates/insights/pages/index.html:109
|
||||
#: templates/insights/pages/index.html:111
|
||||
msgid "Late Transactions"
|
||||
msgstr "Verspätete Transaktionen"
|
||||
|
||||
#: templates/insights/pages/index.html:115
|
||||
#: templates/insights/pages/index.html:117
|
||||
msgid "Latest Transactions"
|
||||
msgstr "Letzte Transaktionen"
|
||||
|
||||
#: templates/insights/pages/index.html:121
|
||||
#: templates/insights/pages/index.html:123
|
||||
msgid "Emergency Fund"
|
||||
msgstr "Notfall-Budget"
|
||||
|
||||
@@ -2720,12 +2871,14 @@ msgid "No installment plans"
|
||||
msgstr "Keine Ratenzahlungs-Pläne"
|
||||
|
||||
#: templates/layouts/base.html:40
|
||||
#, fuzzy
|
||||
msgid "This is a demo!"
|
||||
msgstr ""
|
||||
msgstr "This is a demo!"
|
||||
|
||||
#: templates/layouts/base.html:40
|
||||
#, fuzzy
|
||||
msgid "Any data you add here will be wiped in 24hrs or less"
|
||||
msgstr ""
|
||||
msgstr "Any data you add here will be wiped in 24hrs or less"
|
||||
|
||||
#: templates/mini_tools/currency_converter/currency_converter.html:58
|
||||
msgid "Invert"
|
||||
@@ -3026,6 +3179,38 @@ msgstr "Gelöschte Transaktionen"
|
||||
msgid "Unchanged"
|
||||
msgstr "Unverändert"
|
||||
|
||||
#: templates/users/fragments/add.html:5
|
||||
#, fuzzy
|
||||
#| msgid "Add new"
|
||||
msgid "Add user"
|
||||
msgstr "Neue hinzufügen"
|
||||
|
||||
#: templates/users/fragments/edit.html:5
|
||||
#, fuzzy
|
||||
#| msgid "Edit category"
|
||||
msgid "Edit user"
|
||||
msgstr "Kategorie bearbeiten"
|
||||
|
||||
#: templates/users/fragments/list.html:30
|
||||
#, fuzzy
|
||||
#| msgid "E-mail"
|
||||
msgid "Email"
|
||||
msgstr "E-Mail"
|
||||
|
||||
#: templates/users/fragments/list.html:31
|
||||
msgid "Superuser"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users/fragments/list.html:51
|
||||
msgid "Impersonate"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users/fragments/list.html:80
|
||||
#, fuzzy
|
||||
#| msgid "Users"
|
||||
msgid "No users"
|
||||
msgstr "Nutzer"
|
||||
|
||||
#: templates/users/generic/hide_amounts.html:2
|
||||
msgid "Hide amounts"
|
||||
msgstr "Werte ausblenden"
|
||||
@@ -3043,18 +3228,25 @@ msgid "Show amounts"
|
||||
msgstr "Werte einblenden"
|
||||
|
||||
#: templates/users/login.html:17
|
||||
#, fuzzy
|
||||
msgid "Welcome to WYGIWYH's demo!"
|
||||
msgstr ""
|
||||
msgstr "Welcome to WYGIWYH's demo!"
|
||||
|
||||
#: templates/users/login.html:18
|
||||
#, fuzzy
|
||||
msgid "Use the credentials below to login"
|
||||
msgstr ""
|
||||
msgstr "Use the credentials below to login"
|
||||
|
||||
#: templates/yearly_overview/pages/overview_by_account.html:7
|
||||
#: templates/yearly_overview/pages/overview_by_currency.html:9
|
||||
msgid "Yearly Overview"
|
||||
msgstr "Jährliche Übersicht"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "No tags"
|
||||
#~ msgid "Show tags"
|
||||
#~ msgstr "Keine Tags"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Management"
|
||||
#~ msgid "Loan Payment"
|
||||
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-03-31 05:30+0000\n"
|
||||
"POT-Creation-Date: 2025-04-20 18:57+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -26,10 +26,11 @@ msgstr ""
|
||||
#: apps/currencies/forms.py:53 apps/currencies/forms.py:91
|
||||
#: apps/currencies/forms.py:142 apps/dca/forms.py:49 apps/dca/forms.py:224
|
||||
#: apps/import_app/forms.py:34 apps/rules/forms.py:51 apps/rules/forms.py:93
|
||||
#: apps/rules/forms.py:365 apps/transactions/forms.py:202
|
||||
#: apps/transactions/forms.py:269 apps/transactions/forms.py:629
|
||||
#: apps/transactions/forms.py:672 apps/transactions/forms.py:704
|
||||
#: apps/transactions/forms.py:739 apps/transactions/forms.py:891
|
||||
#: apps/rules/forms.py:365 apps/transactions/forms.py:203
|
||||
#: apps/transactions/forms.py:281 apps/transactions/forms.py:641
|
||||
#: apps/transactions/forms.py:684 apps/transactions/forms.py:716
|
||||
#: apps/transactions/forms.py:751 apps/transactions/forms.py:903
|
||||
#: apps/users/forms.py:210 apps/users/forms.py:372
|
||||
msgid "Update"
|
||||
msgstr ""
|
||||
|
||||
@@ -38,11 +39,11 @@ msgstr ""
|
||||
#: apps/currencies/forms.py:99 apps/currencies/forms.py:150
|
||||
#: apps/dca/forms.py:57 apps/dca/forms.py:232 apps/import_app/forms.py:42
|
||||
#: apps/rules/forms.py:59 apps/rules/forms.py:101 apps/rules/forms.py:373
|
||||
#: apps/transactions/forms.py:187 apps/transactions/forms.py:211
|
||||
#: apps/transactions/forms.py:637 apps/transactions/forms.py:680
|
||||
#: apps/transactions/forms.py:712 apps/transactions/forms.py:747
|
||||
#: apps/transactions/forms.py:899
|
||||
#: templates/account_groups/fragments/list.html:9
|
||||
#: apps/transactions/forms.py:188 apps/transactions/forms.py:212
|
||||
#: apps/transactions/forms.py:649 apps/transactions/forms.py:692
|
||||
#: apps/transactions/forms.py:724 apps/transactions/forms.py:759
|
||||
#: apps/transactions/forms.py:911 apps/users/forms.py:218
|
||||
#: apps/users/forms.py:380 templates/account_groups/fragments/list.html:9
|
||||
#: templates/accounts/fragments/list.html:9
|
||||
#: templates/categories/fragments/list.html:9
|
||||
#: templates/currencies/fragments/list.html:9
|
||||
@@ -57,6 +58,7 @@ msgstr ""
|
||||
#: templates/mini_tools/unit_price_calculator.html:162
|
||||
#: templates/recurring_transactions/fragments/list.html:9
|
||||
#: templates/rules/fragments/list.html:9 templates/tags/fragments/list.html:9
|
||||
#: templates/users/fragments/list.html:10
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
@@ -71,11 +73,12 @@ msgstr ""
|
||||
#: apps/accounts/forms.py:121 apps/dca/forms.py:85 apps/dca/forms.py:92
|
||||
#: apps/insights/forms.py:118 apps/rules/forms.py:174 apps/rules/forms.py:189
|
||||
#: apps/rules/models.py:38 apps/rules/models.py:286
|
||||
#: apps/transactions/forms.py:40 apps/transactions/forms.py:303
|
||||
#: apps/transactions/forms.py:310 apps/transactions/forms.py:510
|
||||
#: apps/transactions/forms.py:771 apps/transactions/models.py:305
|
||||
#: apps/transactions/models.py:488 apps/transactions/models.py:686
|
||||
#: templates/insights/fragments/category_overview/index.html:9
|
||||
#: apps/transactions/forms.py:41 apps/transactions/forms.py:315
|
||||
#: apps/transactions/forms.py:322 apps/transactions/forms.py:522
|
||||
#: apps/transactions/forms.py:783 apps/transactions/models.py:305
|
||||
#: apps/transactions/models.py:488 apps/transactions/models.py:688
|
||||
#: templates/insights/fragments/category_overview/index.html:63
|
||||
#: templates/insights/fragments/category_overview/index.html:420
|
||||
msgid "Category"
|
||||
msgstr ""
|
||||
|
||||
@@ -83,12 +86,13 @@ msgstr ""
|
||||
#: apps/export_app/forms.py:44 apps/export_app/forms.py:135
|
||||
#: apps/rules/forms.py:177 apps/rules/forms.py:186 apps/rules/models.py:39
|
||||
#: apps/rules/models.py:290 apps/transactions/filters.py:74
|
||||
#: apps/transactions/forms.py:48 apps/transactions/forms.py:319
|
||||
#: apps/transactions/forms.py:327 apps/transactions/forms.py:503
|
||||
#: apps/transactions/forms.py:764 apps/transactions/models.py:311
|
||||
#: apps/transactions/models.py:490 apps/transactions/models.py:690
|
||||
#: templates/includes/navbar.html:108 templates/tags/fragments/list.html:5
|
||||
#: templates/tags/pages/index.html:4
|
||||
#: apps/transactions/forms.py:49 apps/transactions/forms.py:331
|
||||
#: apps/transactions/forms.py:339 apps/transactions/forms.py:515
|
||||
#: apps/transactions/forms.py:776 apps/transactions/models.py:311
|
||||
#: apps/transactions/models.py:490 apps/transactions/models.py:692
|
||||
#: templates/includes/navbar.html:108
|
||||
#: templates/insights/fragments/category_overview/index.html:35
|
||||
#: templates/tags/fragments/list.html:5 templates/tags/pages/index.html:4
|
||||
msgid "Tags"
|
||||
msgstr ""
|
||||
|
||||
@@ -107,6 +111,7 @@ msgstr ""
|
||||
#: templates/recurring_transactions/fragments/table.html:18
|
||||
#: templates/rules/fragments/list.html:26
|
||||
#: templates/tags/fragments/table.html:16
|
||||
#: templates/users/fragments/list.html:29
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
@@ -156,9 +161,9 @@ msgstr ""
|
||||
|
||||
#: apps/accounts/models.py:70 apps/rules/forms.py:166 apps/rules/forms.py:179
|
||||
#: apps/rules/models.py:30 apps/rules/models.py:242
|
||||
#: apps/transactions/forms.py:60 apps/transactions/forms.py:495
|
||||
#: apps/transactions/forms.py:756 apps/transactions/models.py:278
|
||||
#: apps/transactions/models.py:448 apps/transactions/models.py:668
|
||||
#: apps/transactions/forms.py:61 apps/transactions/forms.py:507
|
||||
#: apps/transactions/forms.py:768 apps/transactions/models.py:278
|
||||
#: apps/transactions/models.py:448 apps/transactions/models.py:670
|
||||
msgid "Account"
|
||||
msgstr ""
|
||||
|
||||
@@ -280,7 +285,11 @@ msgstr ""
|
||||
msgid "Ungrouped"
|
||||
msgstr ""
|
||||
|
||||
#: apps/common/fields/month_year.py:23 apps/common/fields/month_year.py:51
|
||||
#: apps/common/fields/month_year.py:30
|
||||
msgid "Invalid date format. Use YYYY-MM or YYYY-MM-DD."
|
||||
msgstr ""
|
||||
|
||||
#: apps/common/fields/month_year.py:59
|
||||
msgid "Invalid date format. Use YYYY-MM."
|
||||
msgstr ""
|
||||
|
||||
@@ -312,7 +321,7 @@ msgid ""
|
||||
"owner.<br/>Public: Shown for all users. Only editable by the owner."
|
||||
msgstr ""
|
||||
|
||||
#: apps/common/forms.py:79 apps/users/forms.py:131
|
||||
#: apps/common/forms.py:79 apps/users/forms.py:135
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
|
||||
@@ -403,7 +412,7 @@ msgstr ""
|
||||
msgid "Info"
|
||||
msgstr ""
|
||||
|
||||
#: apps/common/views.py:110
|
||||
#: apps/common/views.py:111
|
||||
msgid "Cache cleared successfully"
|
||||
msgstr ""
|
||||
|
||||
@@ -441,7 +450,7 @@ msgstr ""
|
||||
|
||||
#: apps/currencies/forms.py:69 apps/dca/models.py:158 apps/rules/forms.py:169
|
||||
#: apps/rules/forms.py:182 apps/rules/models.py:33 apps/rules/models.py:254
|
||||
#: apps/transactions/forms.py:64 apps/transactions/forms.py:331
|
||||
#: apps/transactions/forms.py:65 apps/transactions/forms.py:343
|
||||
#: apps/transactions/models.py:288
|
||||
#: templates/dca/fragments/strategy/details.html:52
|
||||
#: templates/exchange_rates/fragments/table.html:10
|
||||
@@ -528,7 +537,7 @@ msgstr ""
|
||||
#: templates/categories/fragments/list.html:21
|
||||
#: templates/entities/fragments/list.html:21
|
||||
#: templates/recurring_transactions/fragments/list.html:21
|
||||
#: templates/tags/fragments/list.html:21
|
||||
#: templates/tags/fragments/list.html:21 templates/users/fragments/list.html:28
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
@@ -644,11 +653,11 @@ msgstr ""
|
||||
msgid "Create transaction"
|
||||
msgstr ""
|
||||
|
||||
#: apps/dca/forms.py:70 apps/transactions/forms.py:278
|
||||
#: apps/dca/forms.py:70 apps/transactions/forms.py:290
|
||||
msgid "From Account"
|
||||
msgstr ""
|
||||
|
||||
#: apps/dca/forms.py:76 apps/transactions/forms.py:283
|
||||
#: apps/dca/forms.py:76 apps/transactions/forms.py:295
|
||||
msgid "To Account"
|
||||
msgstr ""
|
||||
|
||||
@@ -673,7 +682,7 @@ msgstr ""
|
||||
msgid "You must provide an account."
|
||||
msgstr ""
|
||||
|
||||
#: apps/dca/forms.py:312 apps/transactions/forms.py:445
|
||||
#: apps/dca/forms.py:312 apps/transactions/forms.py:457
|
||||
msgid "From and To accounts must be different."
|
||||
msgstr ""
|
||||
|
||||
@@ -692,8 +701,8 @@ msgstr ""
|
||||
|
||||
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:173
|
||||
#: apps/rules/forms.py:188 apps/rules/models.py:37 apps/rules/models.py:270
|
||||
#: apps/transactions/forms.py:347 apps/transactions/models.py:301
|
||||
#: apps/transactions/models.py:497 apps/transactions/models.py:696
|
||||
#: apps/transactions/forms.py:359 apps/transactions/models.py:301
|
||||
#: apps/transactions/models.py:497 apps/transactions/models.py:698
|
||||
msgid "Notes"
|
||||
msgstr ""
|
||||
|
||||
@@ -750,6 +759,8 @@ msgid "Entry deleted successfully"
|
||||
msgstr ""
|
||||
|
||||
#: apps/export_app/forms.py:14 apps/export_app/forms.py:131
|
||||
#: templates/includes/navbar.html:147 templates/users/fragments/list.html:6
|
||||
#: templates/users/pages/index.html:4
|
||||
msgid "Users"
|
||||
msgstr ""
|
||||
|
||||
@@ -771,16 +782,16 @@ msgstr ""
|
||||
#: apps/export_app/forms.py:50 apps/export_app/forms.py:136
|
||||
#: apps/rules/forms.py:178 apps/rules/forms.py:187 apps/rules/models.py:40
|
||||
#: apps/rules/models.py:282 apps/transactions/filters.py:81
|
||||
#: apps/transactions/forms.py:56 apps/transactions/forms.py:518
|
||||
#: apps/transactions/forms.py:779 apps/transactions/models.py:261
|
||||
#: apps/transactions/forms.py:57 apps/transactions/forms.py:530
|
||||
#: apps/transactions/forms.py:791 apps/transactions/models.py:261
|
||||
#: apps/transactions/models.py:316 apps/transactions/models.py:493
|
||||
#: apps/transactions/models.py:693 templates/entities/fragments/list.html:5
|
||||
#: apps/transactions/models.py:695 templates/entities/fragments/list.html:5
|
||||
#: templates/entities/pages/index.html:4 templates/includes/navbar.html:110
|
||||
msgid "Entities"
|
||||
msgstr ""
|
||||
|
||||
#: apps/export_app/forms.py:56 apps/export_app/forms.py:140
|
||||
#: apps/transactions/models.py:730 templates/includes/navbar.html:74
|
||||
#: apps/transactions/models.py:732 templates/includes/navbar.html:74
|
||||
#: templates/recurring_transactions/fragments/list.html:5
|
||||
#: templates/recurring_transactions/pages/index.html:4
|
||||
msgid "Recurring Transactions"
|
||||
@@ -940,7 +951,9 @@ msgstr ""
|
||||
|
||||
#: apps/insights/forms.py:119 apps/insights/utils/sankey.py:36
|
||||
#: apps/insights/utils/sankey.py:167
|
||||
#: templates/insights/fragments/category_overview/index.html:18
|
||||
#: templates/insights/fragments/category_overview/index.html:73
|
||||
#: templates/insights/fragments/category_overview/index.html:285
|
||||
#: templates/insights/fragments/category_overview/index.html:314
|
||||
msgid "Uncategorized"
|
||||
msgstr ""
|
||||
|
||||
@@ -1023,7 +1036,7 @@ msgstr ""
|
||||
|
||||
#: apps/rules/forms.py:167 apps/rules/forms.py:180 apps/rules/models.py:31
|
||||
#: apps/rules/models.py:246 apps/transactions/models.py:285
|
||||
#: apps/transactions/models.py:453 apps/transactions/models.py:674
|
||||
#: apps/transactions/models.py:453 apps/transactions/models.py:676
|
||||
msgid "Type"
|
||||
msgstr ""
|
||||
|
||||
@@ -1037,23 +1050,23 @@ msgid "Paid"
|
||||
msgstr ""
|
||||
|
||||
#: apps/rules/forms.py:170 apps/rules/forms.py:183 apps/rules/models.py:34
|
||||
#: apps/rules/models.py:258 apps/transactions/forms.py:68
|
||||
#: apps/transactions/forms.py:334 apps/transactions/forms.py:524
|
||||
#: apps/rules/models.py:258 apps/transactions/forms.py:69
|
||||
#: apps/transactions/forms.py:346 apps/transactions/forms.py:536
|
||||
#: apps/transactions/models.py:289 apps/transactions/models.py:471
|
||||
#: apps/transactions/models.py:698
|
||||
#: apps/transactions/models.py:700
|
||||
msgid "Reference Date"
|
||||
msgstr ""
|
||||
|
||||
#: apps/rules/forms.py:171 apps/rules/forms.py:184 apps/rules/models.py:35
|
||||
#: apps/rules/models.py:262 apps/transactions/models.py:294
|
||||
#: apps/transactions/models.py:679 templates/insights/fragments/sankey.html:95
|
||||
#: apps/transactions/models.py:681 templates/insights/fragments/sankey.html:95
|
||||
msgid "Amount"
|
||||
msgstr ""
|
||||
|
||||
#: apps/rules/forms.py:172 apps/rules/forms.py:185 apps/rules/models.py:14
|
||||
#: apps/rules/models.py:36 apps/rules/models.py:266
|
||||
#: apps/transactions/forms.py:338 apps/transactions/models.py:299
|
||||
#: apps/transactions/models.py:455 apps/transactions/models.py:682
|
||||
#: apps/transactions/forms.py:350 apps/transactions/models.py:299
|
||||
#: apps/transactions/models.py:455 apps/transactions/models.py:684
|
||||
msgid "Description"
|
||||
msgstr ""
|
||||
|
||||
@@ -1191,6 +1204,7 @@ msgstr ""
|
||||
|
||||
#: apps/transactions/filters.py:24 templates/cotton/transaction/item.html:21
|
||||
#: templates/cotton/transaction/item.html:31 templates/includes/navbar.html:46
|
||||
#: templates/insights/fragments/category_overview/index.html:46
|
||||
#: templates/transactions/widgets/paid_toggle_button.html:8
|
||||
#: templates/transactions/widgets/unselectable_paid_toggle_button.html:12
|
||||
msgid "Projected"
|
||||
@@ -1224,40 +1238,48 @@ msgstr ""
|
||||
msgid "Amount max"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:171
|
||||
#: apps/transactions/forms.py:172
|
||||
msgid "More"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:290
|
||||
#: apps/transactions/forms.py:216
|
||||
msgid "Save and add similar"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:221
|
||||
msgid "Save and add another"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:302
|
||||
msgid "From Amount"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:295
|
||||
#: apps/transactions/forms.py:307
|
||||
msgid "To Amount"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:412
|
||||
#: apps/transactions/forms.py:424
|
||||
#: templates/cotton/ui/quick_transactions_buttons.html:40
|
||||
msgid "Transfer"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:658
|
||||
#: apps/transactions/forms.py:670
|
||||
msgid "Tag name"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:690
|
||||
#: apps/transactions/forms.py:702
|
||||
msgid "Entity name"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:722
|
||||
#: apps/transactions/forms.py:734
|
||||
msgid "Category name"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:724
|
||||
#: apps/transactions/forms.py:736
|
||||
msgid "Muted categories won't count towards your monthly total"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:910
|
||||
#: apps/transactions/forms.py:922
|
||||
msgid "End date should be after the start date"
|
||||
msgstr ""
|
||||
|
||||
@@ -1304,7 +1326,7 @@ msgstr ""
|
||||
#: templates/calendar_view/fragments/list.html:52
|
||||
#: templates/calendar_view/fragments/list.html:54
|
||||
#: templates/cotton/ui/quick_transactions_buttons.html:10
|
||||
#: templates/insights/fragments/category_overview/index.html:10
|
||||
#: templates/insights/fragments/category_overview/index.html:64
|
||||
#: templates/monthly_overview/fragments/monthly_summary.html:39
|
||||
msgid "Income"
|
||||
msgstr ""
|
||||
@@ -1315,7 +1337,7 @@ msgstr ""
|
||||
#: templates/calendar_view/fragments/list.html:56
|
||||
#: templates/calendar_view/fragments/list.html:58
|
||||
#: templates/cotton/ui/quick_transactions_buttons.html:18
|
||||
#: templates/insights/fragments/category_overview/index.html:11
|
||||
#: templates/insights/fragments/category_overview/index.html:65
|
||||
msgid "Expense"
|
||||
msgstr ""
|
||||
|
||||
@@ -1323,7 +1345,7 @@ msgstr ""
|
||||
msgid "Installment Plan"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/models.py:336 apps/transactions/models.py:729
|
||||
#: apps/transactions/models.py:336 apps/transactions/models.py:731
|
||||
msgid "Recurring Transaction"
|
||||
msgstr ""
|
||||
|
||||
@@ -1380,11 +1402,11 @@ msgstr ""
|
||||
msgid "The installment number to start counting from"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/models.py:469 apps/transactions/models.py:702
|
||||
#: apps/transactions/models.py:469 apps/transactions/models.py:704
|
||||
msgid "Start Date"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/models.py:473 apps/transactions/models.py:703
|
||||
#: apps/transactions/models.py:473 apps/transactions/models.py:705
|
||||
msgid "End Date"
|
||||
msgstr ""
|
||||
|
||||
@@ -1396,48 +1418,48 @@ msgstr ""
|
||||
msgid "Installment Amount"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/models.py:500 apps/transactions/models.py:719
|
||||
#: apps/transactions/models.py:500 apps/transactions/models.py:721
|
||||
msgid "Add description to transactions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/models.py:503 apps/transactions/models.py:722
|
||||
#: apps/transactions/models.py:503 apps/transactions/models.py:724
|
||||
msgid "Add notes to transactions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/models.py:661
|
||||
#: apps/transactions/models.py:663
|
||||
msgid "day(s)"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/models.py:662
|
||||
#: apps/transactions/models.py:664
|
||||
msgid "week(s)"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/models.py:663
|
||||
#: apps/transactions/models.py:665
|
||||
msgid "month(s)"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/models.py:664
|
||||
#: apps/transactions/models.py:666
|
||||
msgid "year(s)"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/models.py:666
|
||||
#: apps/transactions/models.py:668
|
||||
#: templates/recurring_transactions/fragments/list.html:24
|
||||
msgid "Paused"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/models.py:705
|
||||
#: apps/transactions/models.py:707
|
||||
msgid "Recurrence Type"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/models.py:708
|
||||
#: apps/transactions/models.py:710
|
||||
msgid "Recurrence Interval"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/models.py:712
|
||||
#: apps/transactions/models.py:714
|
||||
msgid "Last Generated Date"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/models.py:715
|
||||
#: apps/transactions/models.py:717
|
||||
msgid "Last Generated Reference Date"
|
||||
msgstr ""
|
||||
|
||||
@@ -1562,35 +1584,35 @@ msgstr ""
|
||||
msgid "Tag deleted successfully"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/views/transactions.py:50
|
||||
#: apps/transactions/views/transactions.py:89
|
||||
#: apps/transactions/views/transactions.py:52
|
||||
#: apps/transactions/views/transactions.py:110
|
||||
msgid "Transaction added successfully"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/views/transactions.py:123
|
||||
#: apps/transactions/views/transactions.py:144
|
||||
msgid "Transaction updated successfully"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/views/transactions.py:173
|
||||
#: apps/transactions/views/transactions.py:194
|
||||
#, python-format
|
||||
msgid "%(count)s transaction updated successfully"
|
||||
msgid_plural "%(count)s transactions updated successfully"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: apps/transactions/views/transactions.py:209
|
||||
#: apps/transactions/views/transactions.py:230
|
||||
msgid "Transaction duplicated successfully"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/views/transactions.py:251
|
||||
#: apps/transactions/views/transactions.py:272
|
||||
msgid "Transaction deleted successfully"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/views/transactions.py:269
|
||||
#: apps/transactions/views/transactions.py:290
|
||||
msgid "Transaction restored successfully"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/views/transactions.py:295
|
||||
#: apps/transactions/views/transactions.py:316
|
||||
msgid "Transfer added successfully"
|
||||
msgstr ""
|
||||
|
||||
@@ -1614,40 +1636,104 @@ msgstr ""
|
||||
msgid "Important dates"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:19 apps/users/models.py:13 templates/users/login.html:19
|
||||
#: apps/users/forms.py:23 apps/users/models.py:13 templates/users/login.html:19
|
||||
msgid "E-mail"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:25 templates/users/login.html:20
|
||||
#: apps/users/forms.py:29 templates/users/login.html:20
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:33
|
||||
#: apps/users/forms.py:37
|
||||
msgid "Invalid e-mail or password"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:34
|
||||
#: apps/users/forms.py:38
|
||||
msgid "This account is deactivated"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:50 apps/users/forms.py:63 apps/users/forms.py:85
|
||||
#: apps/users/forms.py:54 apps/users/forms.py:67 apps/users/forms.py:89
|
||||
#: templates/monthly_overview/pages/overview.html:153
|
||||
#: templates/transactions/pages/transactions.html:35
|
||||
msgid "Default"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:91 apps/users/models.py:41
|
||||
#: apps/users/forms.py:95 apps/users/models.py:41
|
||||
msgid "Date Format"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:96 apps/users/models.py:46
|
||||
#: apps/users/forms.py:100 apps/users/models.py:46
|
||||
msgid "Datetime Format"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:102 apps/users/models.py:49
|
||||
#: apps/users/forms.py:106 apps/users/models.py:49
|
||||
msgid "Number Format"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:141
|
||||
#, python-format
|
||||
msgid ""
|
||||
"This changes the language (if available) and how numbers and dates are "
|
||||
"displayed\n"
|
||||
"Consider helping translate WYGIWYH to your language at %(translation_link)s"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:150
|
||||
msgid "New Password"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:153
|
||||
msgid "Leave blank to keep the current password."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:156
|
||||
msgid "Confirm New Password"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:168 apps/users/forms.py:329
|
||||
msgid ""
|
||||
"Designates whether this user should be treated as active. Unselect this "
|
||||
"instead of deleting accounts."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:171 apps/users/forms.py:332
|
||||
msgid ""
|
||||
"Designates that this user has all permissions without explicitly assigning "
|
||||
"them."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:242
|
||||
msgid "This email address is already in use by another account."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:250
|
||||
msgid "The two password fields didn't match."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:252
|
||||
msgid "Please confirm your new password."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:254
|
||||
msgid "Please enter the new password first."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:274
|
||||
msgid "You cannot deactivate your own account using this form."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:287
|
||||
msgid "Cannot remove status from the last superuser."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:293
|
||||
msgid "You cannot remove your own superuser status using this form."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/forms.py:390
|
||||
msgid "A user with this email address already exists."
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/models.py:27 templates/includes/navbar.html:28
|
||||
msgid "Yearly by currency"
|
||||
msgstr ""
|
||||
@@ -1688,26 +1774,34 @@ msgstr ""
|
||||
msgid "Start page"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/views.py:62
|
||||
#: apps/users/views.py:68
|
||||
msgid "Transaction amounts are now hidden"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/views.py:65
|
||||
#: apps/users/views.py:71
|
||||
msgid "Transaction amounts are now displayed"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/views.py:83
|
||||
#: apps/users/views.py:89
|
||||
msgid "Sounds are now muted"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/views.py:86
|
||||
#: apps/users/views.py:92
|
||||
msgid "Sounds will now play"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/views.py:102
|
||||
#: apps/users/views.py:108
|
||||
msgid "Your settings have been updated"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/views.py:152
|
||||
msgid "Item added successfully"
|
||||
msgstr ""
|
||||
|
||||
#: apps/users/views.py:184
|
||||
msgid "Item updated successfully"
|
||||
msgstr ""
|
||||
|
||||
#: templates/account_groups/fragments/add.html:5
|
||||
msgid "Add account group"
|
||||
msgstr ""
|
||||
@@ -1730,6 +1824,7 @@ msgstr ""
|
||||
#: templates/recurring_transactions/fragments/table.html:25
|
||||
#: templates/rules/fragments/list.html:33
|
||||
#: templates/tags/fragments/table.html:23
|
||||
#: templates/users/fragments/list.html:38
|
||||
msgid "Actions"
|
||||
msgstr ""
|
||||
|
||||
@@ -1752,6 +1847,7 @@ msgstr ""
|
||||
#: templates/rules/fragments/transaction_rule/view.html:47
|
||||
#: templates/rules/fragments/transaction_rule/view.html:80
|
||||
#: templates/tags/fragments/table.html:28
|
||||
#: templates/users/fragments/list.html:43
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
|
||||
@@ -1974,7 +2070,7 @@ msgid "Muted"
|
||||
msgstr ""
|
||||
|
||||
#: templates/categories/fragments/table.html:75
|
||||
#: templates/insights/fragments/category_overview/index.html:67
|
||||
#: templates/insights/fragments/category_overview/index.html:430
|
||||
msgid "No categories"
|
||||
msgstr ""
|
||||
|
||||
@@ -2433,10 +2529,11 @@ msgid "Net Worth"
|
||||
msgstr ""
|
||||
|
||||
#: templates/includes/navbar.html:44
|
||||
#: templates/insights/fragments/category_overview/index.html:50
|
||||
msgid "Current"
|
||||
msgstr ""
|
||||
|
||||
#: templates/includes/navbar.html:50
|
||||
#: templates/includes/navbar.html:50 templates/insights/pages/index.html:5
|
||||
msgid "Insights"
|
||||
msgstr ""
|
||||
|
||||
@@ -2472,15 +2569,19 @@ msgstr ""
|
||||
msgid "Automation"
|
||||
msgstr ""
|
||||
|
||||
#: templates/includes/navbar.html:150
|
||||
#: templates/includes/navbar.html:145
|
||||
msgid "Admin"
|
||||
msgstr ""
|
||||
|
||||
#: templates/includes/navbar.html:154
|
||||
msgid "Only use this if you know what you're doing"
|
||||
msgstr ""
|
||||
|
||||
#: templates/includes/navbar.html:151
|
||||
#: templates/includes/navbar.html:155
|
||||
msgid "Django Admin"
|
||||
msgstr ""
|
||||
|
||||
#: templates/includes/navbar.html:160
|
||||
#: templates/includes/navbar.html:165
|
||||
msgid "Calculator"
|
||||
msgstr ""
|
||||
|
||||
@@ -2488,11 +2589,15 @@ msgstr ""
|
||||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
#: templates/includes/navbar/user_menu.html:41
|
||||
#: templates/includes/navbar/user_menu.html:19
|
||||
msgid "Edit profile"
|
||||
msgstr ""
|
||||
|
||||
#: templates/includes/navbar/user_menu.html:46
|
||||
msgid "Clear cache"
|
||||
msgstr ""
|
||||
|
||||
#: templates/includes/navbar/user_menu.html:45
|
||||
#: templates/includes/navbar/user_menu.html:50
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
|
||||
@@ -2542,11 +2647,37 @@ msgstr ""
|
||||
msgid "Income/Expense by Currency"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:12
|
||||
#: templates/insights/fragments/category_overview/index.html:14
|
||||
msgid "Table"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:24
|
||||
msgid "Bars"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:38
|
||||
msgid ""
|
||||
"Transaction amounts associated with multiple tags will be counted once for "
|
||||
"each tag"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:54
|
||||
msgid "Final total"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:66
|
||||
#: templates/monthly_overview/fragments/monthly_summary.html:167
|
||||
msgid "Total"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:166
|
||||
msgid "Untagged"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:407
|
||||
msgid "Final Total"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/emergency_fund.html:15
|
||||
msgid "You've spent an average of"
|
||||
msgstr ""
|
||||
@@ -2591,53 +2722,53 @@ msgstr ""
|
||||
msgid "Percentage"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/pages/index.html:35
|
||||
#: templates/insights/pages/index.html:37
|
||||
msgid "Month"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/pages/index.html:38
|
||||
#: templates/insights/pages/index.html:40
|
||||
#: templates/yearly_overview/pages/overview_by_account.html:61
|
||||
#: templates/yearly_overview/pages/overview_by_currency.html:63
|
||||
msgid "Year"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/pages/index.html:43
|
||||
#: templates/insights/pages/index.html:45
|
||||
msgid "Month Range"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/pages/index.html:48
|
||||
#: templates/insights/pages/index.html:50
|
||||
msgid "Year Range"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/pages/index.html:53
|
||||
#: templates/insights/pages/index.html:55
|
||||
msgid "Date Range"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/pages/index.html:81
|
||||
#: templates/insights/pages/index.html:83
|
||||
msgid "Account Flow"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/pages/index.html:88
|
||||
#: templates/insights/pages/index.html:90
|
||||
msgid "Currency Flow"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/pages/index.html:95
|
||||
#: templates/insights/pages/index.html:97
|
||||
msgid "Category Explorer"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/pages/index.html:102
|
||||
#: templates/insights/pages/index.html:104
|
||||
msgid "Categories Overview"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/pages/index.html:109
|
||||
#: templates/insights/pages/index.html:111
|
||||
msgid "Late Transactions"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/pages/index.html:115
|
||||
#: templates/insights/pages/index.html:117
|
||||
msgid "Latest Transactions"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/pages/index.html:121
|
||||
#: templates/insights/pages/index.html:123
|
||||
msgid "Emergency Fund"
|
||||
msgstr ""
|
||||
|
||||
@@ -2978,6 +3109,30 @@ msgstr ""
|
||||
msgid "Unchanged"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users/fragments/add.html:5
|
||||
msgid "Add user"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users/fragments/edit.html:5
|
||||
msgid "Edit user"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users/fragments/list.html:30
|
||||
msgid "Email"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users/fragments/list.html:31
|
||||
msgid "Superuser"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users/fragments/list.html:51
|
||||
msgid "Impersonate"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users/fragments/list.html:80
|
||||
msgid "No users"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users/generic/hide_amounts.html:2
|
||||
msgid "Hide amounts"
|
||||
msgstr ""
|
||||
|
||||
3807
app/locale/es/LC_MESSAGES/django.po
Normal file
3807
app/locale/es/LC_MESSAGES/django.po
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-03-31 05:30+0000\n"
|
||||
"PO-Revision-Date: 2025-03-13 07:05+0000\n"
|
||||
"POT-Creation-Date: 2025-04-20 18:57+0000\n"
|
||||
"PO-Revision-Date: 2025-04-14 08:16+0000\n"
|
||||
"Last-Translator: Dimitri Decrock <dj.flashpower@gmail.com>\n"
|
||||
"Language-Team: Dutch <https://translations.herculino.com/projects/wygiwyh/"
|
||||
"app/nl/>\n"
|
||||
@@ -17,7 +17,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.10.2\n"
|
||||
"X-Generator: Weblate 5.10.4\n"
|
||||
|
||||
#: apps/accounts/forms.py:24
|
||||
msgid "Group name"
|
||||
@@ -27,10 +27,11 @@ msgstr "Groepsnaam"
|
||||
#: apps/currencies/forms.py:53 apps/currencies/forms.py:91
|
||||
#: apps/currencies/forms.py:142 apps/dca/forms.py:49 apps/dca/forms.py:224
|
||||
#: apps/import_app/forms.py:34 apps/rules/forms.py:51 apps/rules/forms.py:93
|
||||
#: apps/rules/forms.py:365 apps/transactions/forms.py:202
|
||||
#: apps/transactions/forms.py:269 apps/transactions/forms.py:629
|
||||
#: apps/transactions/forms.py:672 apps/transactions/forms.py:704
|
||||
#: apps/transactions/forms.py:739 apps/transactions/forms.py:891
|
||||
#: apps/rules/forms.py:365 apps/transactions/forms.py:203
|
||||
#: apps/transactions/forms.py:281 apps/transactions/forms.py:641
|
||||
#: apps/transactions/forms.py:684 apps/transactions/forms.py:716
|
||||
#: apps/transactions/forms.py:751 apps/transactions/forms.py:903
|
||||
#: apps/users/forms.py:210 apps/users/forms.py:372
|
||||
msgid "Update"
|
||||
msgstr "Bijwerken"
|
||||
|
||||
@@ -39,11 +40,11 @@ msgstr "Bijwerken"
|
||||
#: apps/currencies/forms.py:99 apps/currencies/forms.py:150
|
||||
#: apps/dca/forms.py:57 apps/dca/forms.py:232 apps/import_app/forms.py:42
|
||||
#: apps/rules/forms.py:59 apps/rules/forms.py:101 apps/rules/forms.py:373
|
||||
#: apps/transactions/forms.py:187 apps/transactions/forms.py:211
|
||||
#: apps/transactions/forms.py:637 apps/transactions/forms.py:680
|
||||
#: apps/transactions/forms.py:712 apps/transactions/forms.py:747
|
||||
#: apps/transactions/forms.py:899
|
||||
#: templates/account_groups/fragments/list.html:9
|
||||
#: apps/transactions/forms.py:188 apps/transactions/forms.py:212
|
||||
#: apps/transactions/forms.py:649 apps/transactions/forms.py:692
|
||||
#: apps/transactions/forms.py:724 apps/transactions/forms.py:759
|
||||
#: apps/transactions/forms.py:911 apps/users/forms.py:218
|
||||
#: apps/users/forms.py:380 templates/account_groups/fragments/list.html:9
|
||||
#: templates/accounts/fragments/list.html:9
|
||||
#: templates/categories/fragments/list.html:9
|
||||
#: templates/currencies/fragments/list.html:9
|
||||
@@ -58,6 +59,7 @@ msgstr "Bijwerken"
|
||||
#: templates/mini_tools/unit_price_calculator.html:162
|
||||
#: templates/recurring_transactions/fragments/list.html:9
|
||||
#: templates/rules/fragments/list.html:9 templates/tags/fragments/list.html:9
|
||||
#: templates/users/fragments/list.html:10
|
||||
msgid "Add"
|
||||
msgstr "Toevoegen"
|
||||
|
||||
@@ -72,11 +74,12 @@ msgstr "Nieuw saldo"
|
||||
#: apps/accounts/forms.py:121 apps/dca/forms.py:85 apps/dca/forms.py:92
|
||||
#: apps/insights/forms.py:118 apps/rules/forms.py:174 apps/rules/forms.py:189
|
||||
#: apps/rules/models.py:38 apps/rules/models.py:286
|
||||
#: apps/transactions/forms.py:40 apps/transactions/forms.py:303
|
||||
#: apps/transactions/forms.py:310 apps/transactions/forms.py:510
|
||||
#: apps/transactions/forms.py:771 apps/transactions/models.py:305
|
||||
#: apps/transactions/models.py:488 apps/transactions/models.py:686
|
||||
#: templates/insights/fragments/category_overview/index.html:9
|
||||
#: apps/transactions/forms.py:41 apps/transactions/forms.py:315
|
||||
#: apps/transactions/forms.py:322 apps/transactions/forms.py:522
|
||||
#: apps/transactions/forms.py:783 apps/transactions/models.py:305
|
||||
#: apps/transactions/models.py:488 apps/transactions/models.py:688
|
||||
#: templates/insights/fragments/category_overview/index.html:63
|
||||
#: templates/insights/fragments/category_overview/index.html:420
|
||||
msgid "Category"
|
||||
msgstr "Categorie"
|
||||
|
||||
@@ -84,12 +87,13 @@ msgstr "Categorie"
|
||||
#: apps/export_app/forms.py:44 apps/export_app/forms.py:135
|
||||
#: apps/rules/forms.py:177 apps/rules/forms.py:186 apps/rules/models.py:39
|
||||
#: apps/rules/models.py:290 apps/transactions/filters.py:74
|
||||
#: apps/transactions/forms.py:48 apps/transactions/forms.py:319
|
||||
#: apps/transactions/forms.py:327 apps/transactions/forms.py:503
|
||||
#: apps/transactions/forms.py:764 apps/transactions/models.py:311
|
||||
#: apps/transactions/models.py:490 apps/transactions/models.py:690
|
||||
#: templates/includes/navbar.html:108 templates/tags/fragments/list.html:5
|
||||
#: templates/tags/pages/index.html:4
|
||||
#: apps/transactions/forms.py:49 apps/transactions/forms.py:331
|
||||
#: apps/transactions/forms.py:339 apps/transactions/forms.py:515
|
||||
#: apps/transactions/forms.py:776 apps/transactions/models.py:311
|
||||
#: apps/transactions/models.py:490 apps/transactions/models.py:692
|
||||
#: templates/includes/navbar.html:108
|
||||
#: templates/insights/fragments/category_overview/index.html:35
|
||||
#: templates/tags/fragments/list.html:5 templates/tags/pages/index.html:4
|
||||
msgid "Tags"
|
||||
msgstr "Labels"
|
||||
|
||||
@@ -108,6 +112,7 @@ msgstr "Labels"
|
||||
#: templates/recurring_transactions/fragments/table.html:18
|
||||
#: templates/rules/fragments/list.html:26
|
||||
#: templates/tags/fragments/table.html:16
|
||||
#: templates/users/fragments/list.html:29
|
||||
msgid "Name"
|
||||
msgstr "Naam"
|
||||
|
||||
@@ -161,9 +166,9 @@ msgstr ""
|
||||
|
||||
#: apps/accounts/models.py:70 apps/rules/forms.py:166 apps/rules/forms.py:179
|
||||
#: apps/rules/models.py:30 apps/rules/models.py:242
|
||||
#: apps/transactions/forms.py:60 apps/transactions/forms.py:495
|
||||
#: apps/transactions/forms.py:756 apps/transactions/models.py:278
|
||||
#: apps/transactions/models.py:448 apps/transactions/models.py:668
|
||||
#: apps/transactions/forms.py:61 apps/transactions/forms.py:507
|
||||
#: apps/transactions/forms.py:768 apps/transactions/models.py:278
|
||||
#: apps/transactions/models.py:448 apps/transactions/models.py:670
|
||||
msgid "Account"
|
||||
msgstr "Rekening"
|
||||
|
||||
@@ -286,7 +291,11 @@ msgstr "Fout bij het aanmaken van een nieuwe instantie"
|
||||
msgid "Ungrouped"
|
||||
msgstr "Niet gegroepeerd"
|
||||
|
||||
#: apps/common/fields/month_year.py:23 apps/common/fields/month_year.py:51
|
||||
#: apps/common/fields/month_year.py:30
|
||||
msgid "Invalid date format. Use YYYY-MM or YYYY-MM-DD."
|
||||
msgstr "Ongeldige datumnotatie. Gebruik JJJJ-MM of JJJJ-MM-DD."
|
||||
|
||||
#: apps/common/fields/month_year.py:59
|
||||
msgid "Invalid date format. Use YYYY-MM."
|
||||
msgstr "Ongeldige datumnotatie. Gebruik JJJJ-MM."
|
||||
|
||||
@@ -323,7 +332,7 @@ msgstr ""
|
||||
"bewerkbaar door de eigenaar.<br/>Publiek: Weergegeven voor alle gebruikers. "
|
||||
"Alleen bewerkbaar door de eigenaar."
|
||||
|
||||
#: apps/common/forms.py:79 apps/users/forms.py:131
|
||||
#: apps/common/forms.py:79 apps/users/forms.py:135
|
||||
msgid "Save"
|
||||
msgstr "Opslaan"
|
||||
|
||||
@@ -414,7 +423,7 @@ msgstr "Fout"
|
||||
msgid "Info"
|
||||
msgstr "Info"
|
||||
|
||||
#: apps/common/views.py:110
|
||||
#: apps/common/views.py:111
|
||||
msgid "Cache cleared successfully"
|
||||
msgstr "Cache succesvol gewist"
|
||||
|
||||
@@ -452,7 +461,7 @@ msgstr "Achtervoegsel"
|
||||
|
||||
#: apps/currencies/forms.py:69 apps/dca/models.py:158 apps/rules/forms.py:169
|
||||
#: apps/rules/forms.py:182 apps/rules/models.py:33 apps/rules/models.py:254
|
||||
#: apps/transactions/forms.py:64 apps/transactions/forms.py:331
|
||||
#: apps/transactions/forms.py:65 apps/transactions/forms.py:343
|
||||
#: apps/transactions/models.py:288
|
||||
#: templates/dca/fragments/strategy/details.html:52
|
||||
#: templates/exchange_rates/fragments/table.html:10
|
||||
@@ -539,7 +548,7 @@ msgstr "Soort Dienst"
|
||||
#: templates/categories/fragments/list.html:21
|
||||
#: templates/entities/fragments/list.html:21
|
||||
#: templates/recurring_transactions/fragments/list.html:21
|
||||
#: templates/tags/fragments/list.html:21
|
||||
#: templates/tags/fragments/list.html:21 templates/users/fragments/list.html:28
|
||||
msgid "Active"
|
||||
msgstr "Actief"
|
||||
|
||||
@@ -664,11 +673,11 @@ msgstr "Diensten succesvol in de wachtrij geplaatst"
|
||||
msgid "Create transaction"
|
||||
msgstr "Maak verrichtingen"
|
||||
|
||||
#: apps/dca/forms.py:70 apps/transactions/forms.py:278
|
||||
#: apps/dca/forms.py:70 apps/transactions/forms.py:290
|
||||
msgid "From Account"
|
||||
msgstr "Van rekening"
|
||||
|
||||
#: apps/dca/forms.py:76 apps/transactions/forms.py:283
|
||||
#: apps/dca/forms.py:76 apps/transactions/forms.py:295
|
||||
msgid "To Account"
|
||||
msgstr "Naar rekening"
|
||||
|
||||
@@ -694,7 +703,7 @@ msgstr "Koppel verrichting"
|
||||
msgid "You must provide an account."
|
||||
msgstr "Je moet een account opgeven."
|
||||
|
||||
#: apps/dca/forms.py:312 apps/transactions/forms.py:445
|
||||
#: apps/dca/forms.py:312 apps/transactions/forms.py:457
|
||||
msgid "From and To accounts must be different."
|
||||
msgstr "Van en Naar rekening moeten verschillend zijn."
|
||||
|
||||
@@ -713,8 +722,8 @@ msgstr "Betaal Munteenheid"
|
||||
|
||||
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:173
|
||||
#: apps/rules/forms.py:188 apps/rules/models.py:37 apps/rules/models.py:270
|
||||
#: apps/transactions/forms.py:347 apps/transactions/models.py:301
|
||||
#: apps/transactions/models.py:497 apps/transactions/models.py:696
|
||||
#: apps/transactions/forms.py:359 apps/transactions/models.py:301
|
||||
#: apps/transactions/models.py:497 apps/transactions/models.py:698
|
||||
msgid "Notes"
|
||||
msgstr "Opmerkingen"
|
||||
|
||||
@@ -771,6 +780,8 @@ msgid "Entry deleted successfully"
|
||||
msgstr "Item succesvol verwijderd"
|
||||
|
||||
#: apps/export_app/forms.py:14 apps/export_app/forms.py:131
|
||||
#: templates/includes/navbar.html:147 templates/users/fragments/list.html:6
|
||||
#: templates/users/pages/index.html:4
|
||||
msgid "Users"
|
||||
msgstr "Gebruikers"
|
||||
|
||||
@@ -792,16 +803,16 @@ msgstr "Categorieën"
|
||||
#: apps/export_app/forms.py:50 apps/export_app/forms.py:136
|
||||
#: apps/rules/forms.py:178 apps/rules/forms.py:187 apps/rules/models.py:40
|
||||
#: apps/rules/models.py:282 apps/transactions/filters.py:81
|
||||
#: apps/transactions/forms.py:56 apps/transactions/forms.py:518
|
||||
#: apps/transactions/forms.py:779 apps/transactions/models.py:261
|
||||
#: apps/transactions/forms.py:57 apps/transactions/forms.py:530
|
||||
#: apps/transactions/forms.py:791 apps/transactions/models.py:261
|
||||
#: apps/transactions/models.py:316 apps/transactions/models.py:493
|
||||
#: apps/transactions/models.py:693 templates/entities/fragments/list.html:5
|
||||
#: apps/transactions/models.py:695 templates/entities/fragments/list.html:5
|
||||
#: templates/entities/pages/index.html:4 templates/includes/navbar.html:110
|
||||
msgid "Entities"
|
||||
msgstr "Bedrijven"
|
||||
|
||||
#: apps/export_app/forms.py:56 apps/export_app/forms.py:140
|
||||
#: apps/transactions/models.py:730 templates/includes/navbar.html:74
|
||||
#: apps/transactions/models.py:732 templates/includes/navbar.html:74
|
||||
#: templates/recurring_transactions/fragments/list.html:5
|
||||
#: templates/recurring_transactions/pages/index.html:4
|
||||
msgid "Recurring Transactions"
|
||||
@@ -963,7 +974,9 @@ msgstr "Run met succes verwijderd"
|
||||
|
||||
#: apps/insights/forms.py:119 apps/insights/utils/sankey.py:36
|
||||
#: apps/insights/utils/sankey.py:167
|
||||
#: templates/insights/fragments/category_overview/index.html:18
|
||||
#: templates/insights/fragments/category_overview/index.html:73
|
||||
#: templates/insights/fragments/category_overview/index.html:285
|
||||
#: templates/insights/fragments/category_overview/index.html:314
|
||||
msgid "Uncategorized"
|
||||
msgstr "Ongecategoriseerd"
|
||||
|
||||
@@ -1046,7 +1059,7 @@ msgstr "Operator"
|
||||
|
||||
#: apps/rules/forms.py:167 apps/rules/forms.py:180 apps/rules/models.py:31
|
||||
#: apps/rules/models.py:246 apps/transactions/models.py:285
|
||||
#: apps/transactions/models.py:453 apps/transactions/models.py:674
|
||||
#: apps/transactions/models.py:453 apps/transactions/models.py:676
|
||||
msgid "Type"
|
||||
msgstr "Soort"
|
||||
|
||||
@@ -1060,23 +1073,23 @@ msgid "Paid"
|
||||
msgstr "Betaald"
|
||||
|
||||
#: apps/rules/forms.py:170 apps/rules/forms.py:183 apps/rules/models.py:34
|
||||
#: apps/rules/models.py:258 apps/transactions/forms.py:68
|
||||
#: apps/transactions/forms.py:334 apps/transactions/forms.py:524
|
||||
#: apps/rules/models.py:258 apps/transactions/forms.py:69
|
||||
#: apps/transactions/forms.py:346 apps/transactions/forms.py:536
|
||||
#: apps/transactions/models.py:289 apps/transactions/models.py:471
|
||||
#: apps/transactions/models.py:698
|
||||
#: apps/transactions/models.py:700
|
||||
msgid "Reference Date"
|
||||
msgstr "Referentiedatum"
|
||||
|
||||
#: apps/rules/forms.py:171 apps/rules/forms.py:184 apps/rules/models.py:35
|
||||
#: apps/rules/models.py:262 apps/transactions/models.py:294
|
||||
#: apps/transactions/models.py:679 templates/insights/fragments/sankey.html:95
|
||||
#: apps/transactions/models.py:681 templates/insights/fragments/sankey.html:95
|
||||
msgid "Amount"
|
||||
msgstr "Bedrag"
|
||||
|
||||
#: apps/rules/forms.py:172 apps/rules/forms.py:185 apps/rules/models.py:14
|
||||
#: apps/rules/models.py:36 apps/rules/models.py:266
|
||||
#: apps/transactions/forms.py:338 apps/transactions/models.py:299
|
||||
#: apps/transactions/models.py:455 apps/transactions/models.py:682
|
||||
#: apps/transactions/forms.py:350 apps/transactions/models.py:299
|
||||
#: apps/transactions/models.py:455 apps/transactions/models.py:684
|
||||
msgid "Description"
|
||||
msgstr "Beschrijving"
|
||||
|
||||
@@ -1216,6 +1229,7 @@ msgstr "Verrichting Bijwerken Of Maken succesvol verwijderd"
|
||||
|
||||
#: apps/transactions/filters.py:24 templates/cotton/transaction/item.html:21
|
||||
#: templates/cotton/transaction/item.html:31 templates/includes/navbar.html:46
|
||||
#: templates/insights/fragments/category_overview/index.html:46
|
||||
#: templates/transactions/widgets/paid_toggle_button.html:8
|
||||
#: templates/transactions/widgets/unselectable_paid_toggle_button.html:12
|
||||
msgid "Projected"
|
||||
@@ -1249,40 +1263,48 @@ msgstr "Minimum bedrag"
|
||||
msgid "Amount max"
|
||||
msgstr "Maximaal bedrag"
|
||||
|
||||
#: apps/transactions/forms.py:171
|
||||
#: apps/transactions/forms.py:172
|
||||
msgid "More"
|
||||
msgstr "Meer"
|
||||
|
||||
#: apps/transactions/forms.py:290
|
||||
#: apps/transactions/forms.py:216
|
||||
msgid "Save and add similar"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:221
|
||||
msgid "Save and add another"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:302
|
||||
msgid "From Amount"
|
||||
msgstr "Van Bedrag"
|
||||
|
||||
#: apps/transactions/forms.py:295
|
||||
#: apps/transactions/forms.py:307
|
||||
msgid "To Amount"
|
||||
msgstr "Naar Bedrag"
|
||||
|
||||
#: apps/transactions/forms.py:412
|
||||
#: apps/transactions/forms.py:424
|
||||
#: templates/cotton/ui/quick_transactions_buttons.html:40
|
||||
msgid "Transfer"
|
||||
msgstr "Overschrijving"
|
||||
|
||||
#: apps/transactions/forms.py:658
|
||||
#: apps/transactions/forms.py:670
|
||||
msgid "Tag name"
|
||||
msgstr "Labelnaam"
|
||||
|
||||
#: apps/transactions/forms.py:690
|
||||
#: apps/transactions/forms.py:702
|
||||
msgid "Entity name"
|
||||
msgstr "Naam van bedrijf"
|
||||
|
||||
#: apps/transactions/forms.py:722
|
||||
#: apps/transactions/forms.py:734
|
||||
msgid "Category name"
|
||||
msgstr "Naam van categorie"
|
||||
|
||||
#: apps/transactions/forms.py:724
|
||||
#: apps/transactions/forms.py:736
|
||||
msgid "Muted categories won't count towards your monthly total"
|
||||
msgstr "Gedempte categorieën tellen niet mee voor je maandtotaal"
|
||||
|
||||
#: apps/transactions/forms.py:910
|
||||
#: apps/transactions/forms.py:922
|
||||
msgid "End date should be after the start date"
|
||||
msgstr "De einddatum moet na de begindatum vallen"
|
||||
|
||||
@@ -1335,7 +1357,7 @@ msgstr "Bedrijf"
|
||||
#: templates/calendar_view/fragments/list.html:52
|
||||
#: templates/calendar_view/fragments/list.html:54
|
||||
#: templates/cotton/ui/quick_transactions_buttons.html:10
|
||||
#: templates/insights/fragments/category_overview/index.html:10
|
||||
#: templates/insights/fragments/category_overview/index.html:64
|
||||
#: templates/monthly_overview/fragments/monthly_summary.html:39
|
||||
msgid "Income"
|
||||
msgstr "Ontvangsten Transactie"
|
||||
@@ -1346,7 +1368,7 @@ msgstr "Ontvangsten Transactie"
|
||||
#: templates/calendar_view/fragments/list.html:56
|
||||
#: templates/calendar_view/fragments/list.html:58
|
||||
#: templates/cotton/ui/quick_transactions_buttons.html:18
|
||||
#: templates/insights/fragments/category_overview/index.html:11
|
||||
#: templates/insights/fragments/category_overview/index.html:65
|
||||
msgid "Expense"
|
||||
msgstr "Uitgave"
|
||||
|
||||
@@ -1354,7 +1376,7 @@ msgstr "Uitgave"
|
||||
msgid "Installment Plan"
|
||||
msgstr "Afbetalingsplan"
|
||||
|
||||
#: apps/transactions/models.py:336 apps/transactions/models.py:729
|
||||
#: apps/transactions/models.py:336 apps/transactions/models.py:731
|
||||
msgid "Recurring Transaction"
|
||||
msgstr "Terugkerende verrichting"
|
||||
|
||||
@@ -1411,11 +1433,11 @@ msgstr "Begin afbetaling"
|
||||
msgid "The installment number to start counting from"
|
||||
msgstr "Het nummer van de aflevering om mee te beginnen"
|
||||
|
||||
#: apps/transactions/models.py:469 apps/transactions/models.py:702
|
||||
#: apps/transactions/models.py:469 apps/transactions/models.py:704
|
||||
msgid "Start Date"
|
||||
msgstr "Startdatum"
|
||||
|
||||
#: apps/transactions/models.py:473 apps/transactions/models.py:703
|
||||
#: apps/transactions/models.py:473 apps/transactions/models.py:705
|
||||
msgid "End Date"
|
||||
msgstr "Einddatum"
|
||||
|
||||
@@ -1427,48 +1449,48 @@ msgstr "Terugkeerpatroon"
|
||||
msgid "Installment Amount"
|
||||
msgstr "Termijnbedrag"
|
||||
|
||||
#: apps/transactions/models.py:500 apps/transactions/models.py:719
|
||||
#: apps/transactions/models.py:500 apps/transactions/models.py:721
|
||||
msgid "Add description to transactions"
|
||||
msgstr "Beschrijving toevoegen aan verrichting"
|
||||
|
||||
#: apps/transactions/models.py:503 apps/transactions/models.py:722
|
||||
#: apps/transactions/models.py:503 apps/transactions/models.py:724
|
||||
msgid "Add notes to transactions"
|
||||
msgstr "Notities toevoegen aan verrichting"
|
||||
|
||||
#: apps/transactions/models.py:661
|
||||
#: apps/transactions/models.py:663
|
||||
msgid "day(s)"
|
||||
msgstr "dag(en)"
|
||||
|
||||
#: apps/transactions/models.py:662
|
||||
#: apps/transactions/models.py:664
|
||||
msgid "week(s)"
|
||||
msgstr "we(e)k(en)"
|
||||
|
||||
#: apps/transactions/models.py:663
|
||||
#: apps/transactions/models.py:665
|
||||
msgid "month(s)"
|
||||
msgstr "maand(en)"
|
||||
|
||||
#: apps/transactions/models.py:664
|
||||
#: apps/transactions/models.py:666
|
||||
msgid "year(s)"
|
||||
msgstr "ja(a)r(en)"
|
||||
|
||||
#: apps/transactions/models.py:666
|
||||
#: apps/transactions/models.py:668
|
||||
#: templates/recurring_transactions/fragments/list.html:24
|
||||
msgid "Paused"
|
||||
msgstr "Gepauzeerd"
|
||||
|
||||
#: apps/transactions/models.py:705
|
||||
#: apps/transactions/models.py:707
|
||||
msgid "Recurrence Type"
|
||||
msgstr "Type Terugkeerpatroon"
|
||||
|
||||
#: apps/transactions/models.py:708
|
||||
#: apps/transactions/models.py:710
|
||||
msgid "Recurrence Interval"
|
||||
msgstr "Terugkeer Interval"
|
||||
|
||||
#: apps/transactions/models.py:712
|
||||
#: apps/transactions/models.py:714
|
||||
msgid "Last Generated Date"
|
||||
msgstr "Laatste Gegenereerde Datum"
|
||||
|
||||
#: apps/transactions/models.py:715
|
||||
#: apps/transactions/models.py:717
|
||||
msgid "Last Generated Reference Date"
|
||||
msgstr "Laatste Gegenereerde Referentiedatum"
|
||||
|
||||
@@ -1593,35 +1615,35 @@ msgstr "Label succesvol bijgewerkt"
|
||||
msgid "Tag deleted successfully"
|
||||
msgstr "Label succesvol verwijderd"
|
||||
|
||||
#: apps/transactions/views/transactions.py:50
|
||||
#: apps/transactions/views/transactions.py:89
|
||||
#: apps/transactions/views/transactions.py:52
|
||||
#: apps/transactions/views/transactions.py:110
|
||||
msgid "Transaction added successfully"
|
||||
msgstr "Verrichting succesvol toegevoegd"
|
||||
|
||||
#: apps/transactions/views/transactions.py:123
|
||||
#: apps/transactions/views/transactions.py:144
|
||||
msgid "Transaction updated successfully"
|
||||
msgstr "Verrichting succesvol bijgewerkt"
|
||||
|
||||
#: apps/transactions/views/transactions.py:173
|
||||
#: apps/transactions/views/transactions.py:194
|
||||
#, python-format
|
||||
msgid "%(count)s transaction updated successfully"
|
||||
msgid_plural "%(count)s transactions updated successfully"
|
||||
msgstr[0] "%(count)s verrichting succesvol bijgewerkt"
|
||||
msgstr[1] "%(count)s verrichtingen succesvol bijgewerkt"
|
||||
|
||||
#: apps/transactions/views/transactions.py:209
|
||||
#: apps/transactions/views/transactions.py:230
|
||||
msgid "Transaction duplicated successfully"
|
||||
msgstr "Verrichting succesvol gedupliceerd"
|
||||
|
||||
#: apps/transactions/views/transactions.py:251
|
||||
#: apps/transactions/views/transactions.py:272
|
||||
msgid "Transaction deleted successfully"
|
||||
msgstr "Verrichting succesvol verwijderd"
|
||||
|
||||
#: apps/transactions/views/transactions.py:269
|
||||
#: apps/transactions/views/transactions.py:290
|
||||
msgid "Transaction restored successfully"
|
||||
msgstr "Verrichting succesvol hersteld"
|
||||
|
||||
#: apps/transactions/views/transactions.py:295
|
||||
#: apps/transactions/views/transactions.py:316
|
||||
msgid "Transfer added successfully"
|
||||
msgstr "Transactie succesvol toegevoegd"
|
||||
|
||||
@@ -1645,40 +1667,111 @@ msgstr "Rechten"
|
||||
msgid "Important dates"
|
||||
msgstr "Belangrijke datums"
|
||||
|
||||
#: apps/users/forms.py:19 apps/users/models.py:13 templates/users/login.html:19
|
||||
#: apps/users/forms.py:23 apps/users/models.py:13 templates/users/login.html:19
|
||||
msgid "E-mail"
|
||||
msgstr "E-mailadres"
|
||||
|
||||
#: apps/users/forms.py:25 templates/users/login.html:20
|
||||
#: apps/users/forms.py:29 templates/users/login.html:20
|
||||
msgid "Password"
|
||||
msgstr "Wachtwoord"
|
||||
|
||||
#: apps/users/forms.py:33
|
||||
#: apps/users/forms.py:37
|
||||
msgid "Invalid e-mail or password"
|
||||
msgstr "Ongeldig e-mailadres of wachtwoord"
|
||||
|
||||
#: apps/users/forms.py:34
|
||||
#: apps/users/forms.py:38
|
||||
msgid "This account is deactivated"
|
||||
msgstr "Deze gebruiker is gedeactiveerd"
|
||||
|
||||
#: apps/users/forms.py:50 apps/users/forms.py:63 apps/users/forms.py:85
|
||||
#: apps/users/forms.py:54 apps/users/forms.py:67 apps/users/forms.py:89
|
||||
#: templates/monthly_overview/pages/overview.html:153
|
||||
#: templates/transactions/pages/transactions.html:35
|
||||
msgid "Default"
|
||||
msgstr "Standaard"
|
||||
|
||||
#: apps/users/forms.py:91 apps/users/models.py:41
|
||||
#: apps/users/forms.py:95 apps/users/models.py:41
|
||||
msgid "Date Format"
|
||||
msgstr "Datumnotatie"
|
||||
|
||||
#: apps/users/forms.py:96 apps/users/models.py:46
|
||||
#: apps/users/forms.py:100 apps/users/models.py:46
|
||||
msgid "Datetime Format"
|
||||
msgstr "Tijdsnotatie"
|
||||
|
||||
#: apps/users/forms.py:102 apps/users/models.py:49
|
||||
#: apps/users/forms.py:106 apps/users/models.py:49
|
||||
msgid "Number Format"
|
||||
msgstr "Schrijfwijze Nummers"
|
||||
|
||||
#: apps/users/forms.py:141
|
||||
#, python-format
|
||||
msgid ""
|
||||
"This changes the language (if available) and how numbers and dates are "
|
||||
"displayed\n"
|
||||
"Consider helping translate WYGIWYH to your language at %(translation_link)s"
|
||||
msgstr ""
|
||||
"Dit verandert de taal (indien beschikbaar) en hoe getallen en datums worden "
|
||||
"weergegeven\n"
|
||||
"Overweeg om WYGIWYH te helpen vertalen naar jouw taal op %(translation_link)s"
|
||||
|
||||
#: apps/users/forms.py:150
|
||||
msgid "New Password"
|
||||
msgstr "Nieuw Wachtwoord"
|
||||
|
||||
#: apps/users/forms.py:153
|
||||
msgid "Leave blank to keep the current password."
|
||||
msgstr "Laat leeg om het huidige wachtwoord te behouden."
|
||||
|
||||
#: apps/users/forms.py:156
|
||||
msgid "Confirm New Password"
|
||||
msgstr "Bevestig Nieuw Wachtwoord"
|
||||
|
||||
#: apps/users/forms.py:168 apps/users/forms.py:329
|
||||
msgid ""
|
||||
"Designates whether this user should be treated as active. Unselect this "
|
||||
"instead of deleting accounts."
|
||||
msgstr ""
|
||||
"Geeft aan of deze gebruiker als actief moet worden behandeld. Deselecteer "
|
||||
"dit in plaats van accounts te verwijderen."
|
||||
|
||||
#: apps/users/forms.py:171 apps/users/forms.py:332
|
||||
msgid ""
|
||||
"Designates that this user has all permissions without explicitly assigning "
|
||||
"them."
|
||||
msgstr ""
|
||||
"Geeft aan dat deze gebruiker alle rechten heeft zonder ze expliciet toe te "
|
||||
"kennen."
|
||||
|
||||
#: apps/users/forms.py:242
|
||||
msgid "This email address is already in use by another account."
|
||||
msgstr "Dit e-mailadres wordt al gebruikt door een ander account."
|
||||
|
||||
#: apps/users/forms.py:250
|
||||
msgid "The two password fields didn't match."
|
||||
msgstr "De twee wachtwoordvelden komen niet overeen."
|
||||
|
||||
#: apps/users/forms.py:252
|
||||
msgid "Please confirm your new password."
|
||||
msgstr "Bevestig je nieuwe wachtwoord."
|
||||
|
||||
#: apps/users/forms.py:254
|
||||
msgid "Please enter the new password first."
|
||||
msgstr "Geef eerst het nieuwe wachtwoord op."
|
||||
|
||||
#: apps/users/forms.py:274
|
||||
msgid "You cannot deactivate your own account using this form."
|
||||
msgstr "Je kunt je eigen account niet deactiveren met dit formulier."
|
||||
|
||||
#: apps/users/forms.py:287
|
||||
msgid "Cannot remove status from the last superuser."
|
||||
msgstr "Kan de status van de laatste Hoofdadmin niet verwijderen."
|
||||
|
||||
#: apps/users/forms.py:293
|
||||
msgid "You cannot remove your own superuser status using this form."
|
||||
msgstr "Je kunt je eigen hoofdadminrechten niet verwijderen met dit formulier."
|
||||
|
||||
#: apps/users/forms.py:390
|
||||
msgid "A user with this email address already exists."
|
||||
msgstr "Er bestaat al een gebruiker met dit e-mailadres."
|
||||
|
||||
#: apps/users/models.py:27 templates/includes/navbar.html:28
|
||||
msgid "Yearly by currency"
|
||||
msgstr "Jaarlijks per munteenheid"
|
||||
@@ -1719,26 +1812,34 @@ msgstr "Tijdszone"
|
||||
msgid "Start page"
|
||||
msgstr "Startpagina"
|
||||
|
||||
#: apps/users/views.py:62
|
||||
#: apps/users/views.py:68
|
||||
msgid "Transaction amounts are now hidden"
|
||||
msgstr "Verrichtingsbedragen worden nu verborgen"
|
||||
|
||||
#: apps/users/views.py:65
|
||||
#: apps/users/views.py:71
|
||||
msgid "Transaction amounts are now displayed"
|
||||
msgstr "Verrichtingsbedragen worden nu weergegeven"
|
||||
|
||||
#: apps/users/views.py:83
|
||||
#: apps/users/views.py:89
|
||||
msgid "Sounds are now muted"
|
||||
msgstr "De Geluiden zijn nu gedempt"
|
||||
|
||||
#: apps/users/views.py:86
|
||||
#: apps/users/views.py:92
|
||||
msgid "Sounds will now play"
|
||||
msgstr "De geluiden worden nu afgespeeld"
|
||||
|
||||
#: apps/users/views.py:102
|
||||
#: apps/users/views.py:108
|
||||
msgid "Your settings have been updated"
|
||||
msgstr "Jouw instellingen zijn bijgewerkt"
|
||||
|
||||
#: apps/users/views.py:152
|
||||
msgid "Item added successfully"
|
||||
msgstr "Item succesvol toegevoegd"
|
||||
|
||||
#: apps/users/views.py:184
|
||||
msgid "Item updated successfully"
|
||||
msgstr "Item succesvol bijgewerkt"
|
||||
|
||||
#: templates/account_groups/fragments/add.html:5
|
||||
msgid "Add account group"
|
||||
msgstr "Rekeningsgroep toevoegen"
|
||||
@@ -1761,6 +1862,7 @@ msgstr "Rekeningsgroep bewerken"
|
||||
#: templates/recurring_transactions/fragments/table.html:25
|
||||
#: templates/rules/fragments/list.html:33
|
||||
#: templates/tags/fragments/table.html:23
|
||||
#: templates/users/fragments/list.html:38
|
||||
msgid "Actions"
|
||||
msgstr "Acties"
|
||||
|
||||
@@ -1783,6 +1885,7 @@ msgstr "Acties"
|
||||
#: templates/rules/fragments/transaction_rule/view.html:47
|
||||
#: templates/rules/fragments/transaction_rule/view.html:80
|
||||
#: templates/tags/fragments/table.html:28
|
||||
#: templates/users/fragments/list.html:43
|
||||
msgid "Edit"
|
||||
msgstr "Bewerken"
|
||||
|
||||
@@ -2005,7 +2108,7 @@ msgid "Muted"
|
||||
msgstr "Gedempt"
|
||||
|
||||
#: templates/categories/fragments/table.html:75
|
||||
#: templates/insights/fragments/category_overview/index.html:67
|
||||
#: templates/insights/fragments/category_overview/index.html:430
|
||||
msgid "No categories"
|
||||
msgstr "Geen categorieën"
|
||||
|
||||
@@ -2465,10 +2568,11 @@ msgid "Net Worth"
|
||||
msgstr "Netto Waarde"
|
||||
|
||||
#: templates/includes/navbar.html:44
|
||||
#: templates/insights/fragments/category_overview/index.html:50
|
||||
msgid "Current"
|
||||
msgstr "Huidige"
|
||||
|
||||
#: templates/includes/navbar.html:50
|
||||
#: templates/includes/navbar.html:50 templates/insights/pages/index.html:5
|
||||
msgid "Insights"
|
||||
msgstr "Inzichten"
|
||||
|
||||
@@ -2504,15 +2608,19 @@ msgstr "Beheer"
|
||||
msgid "Automation"
|
||||
msgstr "Automatisatie"
|
||||
|
||||
#: templates/includes/navbar.html:150
|
||||
#: templates/includes/navbar.html:145
|
||||
msgid "Admin"
|
||||
msgstr "Admin"
|
||||
|
||||
#: templates/includes/navbar.html:154
|
||||
msgid "Only use this if you know what you're doing"
|
||||
msgstr "Gebruik dit alleen als je weet wat je doet"
|
||||
|
||||
#: templates/includes/navbar.html:151
|
||||
#: templates/includes/navbar.html:155
|
||||
msgid "Django Admin"
|
||||
msgstr "Django Beheerder"
|
||||
|
||||
#: templates/includes/navbar.html:160
|
||||
#: templates/includes/navbar.html:165
|
||||
msgid "Calculator"
|
||||
msgstr "Rekenmachine"
|
||||
|
||||
@@ -2520,22 +2628,28 @@ msgstr "Rekenmachine"
|
||||
msgid "Settings"
|
||||
msgstr "Instellingen"
|
||||
|
||||
#: templates/includes/navbar/user_menu.html:41
|
||||
#: templates/includes/navbar/user_menu.html:19
|
||||
msgid "Edit profile"
|
||||
msgstr "Profiel bewerken"
|
||||
|
||||
#: templates/includes/navbar/user_menu.html:46
|
||||
msgid "Clear cache"
|
||||
msgstr "Leegmaken"
|
||||
|
||||
#: templates/includes/navbar/user_menu.html:45
|
||||
#: templates/includes/navbar/user_menu.html:50
|
||||
msgid "Logout"
|
||||
msgstr "Uitloggen"
|
||||
|
||||
#: templates/includes/scripts/hyperscript/htmx_error_handler.html:8
|
||||
msgid "Access Denied"
|
||||
msgstr ""
|
||||
msgstr "Toegang geweigerd"
|
||||
|
||||
#: templates/includes/scripts/hyperscript/htmx_error_handler.html:9
|
||||
msgid ""
|
||||
"You do not have permission to perform this action or access this resource."
|
||||
msgstr ""
|
||||
"Je hebt geen toestemming om deze actie uit te voeren of toegang te krijgen "
|
||||
"tot deze bron."
|
||||
|
||||
#: templates/includes/scripts/hyperscript/htmx_error_handler.html:18
|
||||
msgid "Something went wrong loading your data"
|
||||
@@ -2576,11 +2690,39 @@ msgstr "Inkomsten/uitgaven per rekening"
|
||||
msgid "Income/Expense by Currency"
|
||||
msgstr "Inkomsten/uitgaven per Munteenheid"
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:12
|
||||
#: templates/insights/fragments/category_overview/index.html:14
|
||||
msgid "Table"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:24
|
||||
msgid "Bars"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:38
|
||||
msgid ""
|
||||
"Transaction amounts associated with multiple tags will be counted once for "
|
||||
"each tag"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:54
|
||||
#, fuzzy
|
||||
#| msgid "final total"
|
||||
msgid "Final total"
|
||||
msgstr "eindtotaal"
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:66
|
||||
#: templates/monthly_overview/fragments/monthly_summary.html:167
|
||||
msgid "Total"
|
||||
msgstr "Totaal"
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:166
|
||||
msgid "Untagged"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:407
|
||||
msgid "Final Total"
|
||||
msgstr "Eindtotaal"
|
||||
|
||||
#: templates/insights/fragments/emergency_fund.html:15
|
||||
msgid "You've spent an average of"
|
||||
msgstr "Je bestede gemiddeld"
|
||||
@@ -2625,53 +2767,53 @@ msgstr "Van"
|
||||
msgid "Percentage"
|
||||
msgstr "Percentage"
|
||||
|
||||
#: templates/insights/pages/index.html:35
|
||||
#: templates/insights/pages/index.html:37
|
||||
msgid "Month"
|
||||
msgstr "Maand"
|
||||
|
||||
#: templates/insights/pages/index.html:38
|
||||
#: templates/insights/pages/index.html:40
|
||||
#: templates/yearly_overview/pages/overview_by_account.html:61
|
||||
#: templates/yearly_overview/pages/overview_by_currency.html:63
|
||||
msgid "Year"
|
||||
msgstr "Jaar"
|
||||
|
||||
#: templates/insights/pages/index.html:43
|
||||
#: templates/insights/pages/index.html:45
|
||||
msgid "Month Range"
|
||||
msgstr "Maand Bereik"
|
||||
|
||||
#: templates/insights/pages/index.html:48
|
||||
#: templates/insights/pages/index.html:50
|
||||
msgid "Year Range"
|
||||
msgstr "Jaar Bereik"
|
||||
|
||||
#: templates/insights/pages/index.html:53
|
||||
#: templates/insights/pages/index.html:55
|
||||
msgid "Date Range"
|
||||
msgstr "Datum Bereik"
|
||||
|
||||
#: templates/insights/pages/index.html:81
|
||||
#: templates/insights/pages/index.html:83
|
||||
msgid "Account Flow"
|
||||
msgstr "Rekeningstroom"
|
||||
|
||||
#: templates/insights/pages/index.html:88
|
||||
#: templates/insights/pages/index.html:90
|
||||
msgid "Currency Flow"
|
||||
msgstr "Geldstroom"
|
||||
|
||||
#: templates/insights/pages/index.html:95
|
||||
#: templates/insights/pages/index.html:97
|
||||
msgid "Category Explorer"
|
||||
msgstr "Categorie Verkenner"
|
||||
|
||||
#: templates/insights/pages/index.html:102
|
||||
#: templates/insights/pages/index.html:104
|
||||
msgid "Categories Overview"
|
||||
msgstr "Categorieën Overzicht"
|
||||
|
||||
#: templates/insights/pages/index.html:109
|
||||
#: templates/insights/pages/index.html:111
|
||||
msgid "Late Transactions"
|
||||
msgstr "Betalingsachterstanden"
|
||||
|
||||
#: templates/insights/pages/index.html:115
|
||||
#: templates/insights/pages/index.html:117
|
||||
msgid "Latest Transactions"
|
||||
msgstr "Laatste Verrichtingen"
|
||||
|
||||
#: templates/insights/pages/index.html:121
|
||||
#: templates/insights/pages/index.html:123
|
||||
msgid "Emergency Fund"
|
||||
msgstr "Noodfonds"
|
||||
|
||||
@@ -2714,11 +2856,12 @@ msgstr "Geen afbetalingsplannen"
|
||||
|
||||
#: templates/layouts/base.html:40
|
||||
msgid "This is a demo!"
|
||||
msgstr ""
|
||||
msgstr "Dit is een demo!"
|
||||
|
||||
#: templates/layouts/base.html:40
|
||||
msgid "Any data you add here will be wiped in 24hrs or less"
|
||||
msgstr ""
|
||||
"Alle gegevens die je hier toevoegt, worden binnen 24 uur of minder gewist"
|
||||
|
||||
#: templates/mini_tools/currency_converter/currency_converter.html:58
|
||||
msgid "Invert"
|
||||
@@ -3020,6 +3163,30 @@ msgstr "Verwijderde verrichtingen"
|
||||
msgid "Unchanged"
|
||||
msgstr "Ongewijzigd"
|
||||
|
||||
#: templates/users/fragments/add.html:5
|
||||
msgid "Add user"
|
||||
msgstr "Gebruiker toevoegen"
|
||||
|
||||
#: templates/users/fragments/edit.html:5
|
||||
msgid "Edit user"
|
||||
msgstr "Gebruiker bewerken"
|
||||
|
||||
#: templates/users/fragments/list.html:30
|
||||
msgid "Email"
|
||||
msgstr "E-mailadres"
|
||||
|
||||
#: templates/users/fragments/list.html:31
|
||||
msgid "Superuser"
|
||||
msgstr "Hoofdadmin"
|
||||
|
||||
#: templates/users/fragments/list.html:51
|
||||
msgid "Impersonate"
|
||||
msgstr "Doe je voor als"
|
||||
|
||||
#: templates/users/fragments/list.html:80
|
||||
msgid "No users"
|
||||
msgstr "Geen gebruikers"
|
||||
|
||||
#: templates/users/generic/hide_amounts.html:2
|
||||
msgid "Hide amounts"
|
||||
msgstr "Bedragen verbergen"
|
||||
@@ -3038,17 +3205,22 @@ msgstr "Bedragen tonen"
|
||||
|
||||
#: templates/users/login.html:17
|
||||
msgid "Welcome to WYGIWYH's demo!"
|
||||
msgstr ""
|
||||
msgstr "Welkom bij de demo van WYGIWYH!"
|
||||
|
||||
#: templates/users/login.html:18
|
||||
msgid "Use the credentials below to login"
|
||||
msgstr ""
|
||||
msgstr "Gebruik de onderstaande gegevens om in te loggen"
|
||||
|
||||
#: templates/yearly_overview/pages/overview_by_account.html:7
|
||||
#: templates/yearly_overview/pages/overview_by_currency.html:9
|
||||
msgid "Yearly Overview"
|
||||
msgstr "Jaaroverzicht"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "No tags"
|
||||
#~ msgid "Show tags"
|
||||
#~ msgstr "Geen labels"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "From Amount"
|
||||
#~ msgid "Principal Amount"
|
||||
|
||||
3451
app/locale/pt/LC_MESSAGES/django.po
Normal file
3451
app/locale/pt/LC_MESSAGES/django.po
Normal file
File diff suppressed because it is too large
Load Diff
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-03-31 05:30+0000\n"
|
||||
"PO-Revision-Date: 2025-03-31 05:38+0000\n"
|
||||
"POT-Creation-Date: 2025-04-20 18:57+0000\n"
|
||||
"PO-Revision-Date: 2025-04-13 23:16+0000\n"
|
||||
"Last-Translator: Herculino Trotta <netotrotta@gmail.com>\n"
|
||||
"Language-Team: Portuguese (Brazil) <https://translations.herculino.com/"
|
||||
"projects/wygiwyh/app/pt_BR/>\n"
|
||||
@@ -27,10 +27,11 @@ msgstr "Nome do grupo"
|
||||
#: apps/currencies/forms.py:53 apps/currencies/forms.py:91
|
||||
#: apps/currencies/forms.py:142 apps/dca/forms.py:49 apps/dca/forms.py:224
|
||||
#: apps/import_app/forms.py:34 apps/rules/forms.py:51 apps/rules/forms.py:93
|
||||
#: apps/rules/forms.py:365 apps/transactions/forms.py:202
|
||||
#: apps/transactions/forms.py:269 apps/transactions/forms.py:629
|
||||
#: apps/transactions/forms.py:672 apps/transactions/forms.py:704
|
||||
#: apps/transactions/forms.py:739 apps/transactions/forms.py:891
|
||||
#: apps/rules/forms.py:365 apps/transactions/forms.py:203
|
||||
#: apps/transactions/forms.py:281 apps/transactions/forms.py:641
|
||||
#: apps/transactions/forms.py:684 apps/transactions/forms.py:716
|
||||
#: apps/transactions/forms.py:751 apps/transactions/forms.py:903
|
||||
#: apps/users/forms.py:210 apps/users/forms.py:372
|
||||
msgid "Update"
|
||||
msgstr "Atualizar"
|
||||
|
||||
@@ -39,11 +40,11 @@ msgstr "Atualizar"
|
||||
#: apps/currencies/forms.py:99 apps/currencies/forms.py:150
|
||||
#: apps/dca/forms.py:57 apps/dca/forms.py:232 apps/import_app/forms.py:42
|
||||
#: apps/rules/forms.py:59 apps/rules/forms.py:101 apps/rules/forms.py:373
|
||||
#: apps/transactions/forms.py:187 apps/transactions/forms.py:211
|
||||
#: apps/transactions/forms.py:637 apps/transactions/forms.py:680
|
||||
#: apps/transactions/forms.py:712 apps/transactions/forms.py:747
|
||||
#: apps/transactions/forms.py:899
|
||||
#: templates/account_groups/fragments/list.html:9
|
||||
#: apps/transactions/forms.py:188 apps/transactions/forms.py:212
|
||||
#: apps/transactions/forms.py:649 apps/transactions/forms.py:692
|
||||
#: apps/transactions/forms.py:724 apps/transactions/forms.py:759
|
||||
#: apps/transactions/forms.py:911 apps/users/forms.py:218
|
||||
#: apps/users/forms.py:380 templates/account_groups/fragments/list.html:9
|
||||
#: templates/accounts/fragments/list.html:9
|
||||
#: templates/categories/fragments/list.html:9
|
||||
#: templates/currencies/fragments/list.html:9
|
||||
@@ -58,6 +59,7 @@ msgstr "Atualizar"
|
||||
#: templates/mini_tools/unit_price_calculator.html:162
|
||||
#: templates/recurring_transactions/fragments/list.html:9
|
||||
#: templates/rules/fragments/list.html:9 templates/tags/fragments/list.html:9
|
||||
#: templates/users/fragments/list.html:10
|
||||
msgid "Add"
|
||||
msgstr "Adicionar"
|
||||
|
||||
@@ -72,11 +74,12 @@ msgstr "Novo saldo"
|
||||
#: apps/accounts/forms.py:121 apps/dca/forms.py:85 apps/dca/forms.py:92
|
||||
#: apps/insights/forms.py:118 apps/rules/forms.py:174 apps/rules/forms.py:189
|
||||
#: apps/rules/models.py:38 apps/rules/models.py:286
|
||||
#: apps/transactions/forms.py:40 apps/transactions/forms.py:303
|
||||
#: apps/transactions/forms.py:310 apps/transactions/forms.py:510
|
||||
#: apps/transactions/forms.py:771 apps/transactions/models.py:305
|
||||
#: apps/transactions/models.py:488 apps/transactions/models.py:686
|
||||
#: templates/insights/fragments/category_overview/index.html:9
|
||||
#: apps/transactions/forms.py:41 apps/transactions/forms.py:315
|
||||
#: apps/transactions/forms.py:322 apps/transactions/forms.py:522
|
||||
#: apps/transactions/forms.py:783 apps/transactions/models.py:305
|
||||
#: apps/transactions/models.py:488 apps/transactions/models.py:688
|
||||
#: templates/insights/fragments/category_overview/index.html:63
|
||||
#: templates/insights/fragments/category_overview/index.html:420
|
||||
msgid "Category"
|
||||
msgstr "Categoria"
|
||||
|
||||
@@ -84,12 +87,13 @@ msgstr "Categoria"
|
||||
#: apps/export_app/forms.py:44 apps/export_app/forms.py:135
|
||||
#: apps/rules/forms.py:177 apps/rules/forms.py:186 apps/rules/models.py:39
|
||||
#: apps/rules/models.py:290 apps/transactions/filters.py:74
|
||||
#: apps/transactions/forms.py:48 apps/transactions/forms.py:319
|
||||
#: apps/transactions/forms.py:327 apps/transactions/forms.py:503
|
||||
#: apps/transactions/forms.py:764 apps/transactions/models.py:311
|
||||
#: apps/transactions/models.py:490 apps/transactions/models.py:690
|
||||
#: templates/includes/navbar.html:108 templates/tags/fragments/list.html:5
|
||||
#: templates/tags/pages/index.html:4
|
||||
#: apps/transactions/forms.py:49 apps/transactions/forms.py:331
|
||||
#: apps/transactions/forms.py:339 apps/transactions/forms.py:515
|
||||
#: apps/transactions/forms.py:776 apps/transactions/models.py:311
|
||||
#: apps/transactions/models.py:490 apps/transactions/models.py:692
|
||||
#: templates/includes/navbar.html:108
|
||||
#: templates/insights/fragments/category_overview/index.html:35
|
||||
#: templates/tags/fragments/list.html:5 templates/tags/pages/index.html:4
|
||||
msgid "Tags"
|
||||
msgstr "Tags"
|
||||
|
||||
@@ -108,6 +112,7 @@ msgstr "Tags"
|
||||
#: templates/recurring_transactions/fragments/table.html:18
|
||||
#: templates/rules/fragments/list.html:26
|
||||
#: templates/tags/fragments/table.html:16
|
||||
#: templates/users/fragments/list.html:29
|
||||
msgid "Name"
|
||||
msgstr "Nome"
|
||||
|
||||
@@ -160,9 +165,9 @@ msgstr ""
|
||||
|
||||
#: apps/accounts/models.py:70 apps/rules/forms.py:166 apps/rules/forms.py:179
|
||||
#: apps/rules/models.py:30 apps/rules/models.py:242
|
||||
#: apps/transactions/forms.py:60 apps/transactions/forms.py:495
|
||||
#: apps/transactions/forms.py:756 apps/transactions/models.py:278
|
||||
#: apps/transactions/models.py:448 apps/transactions/models.py:668
|
||||
#: apps/transactions/forms.py:61 apps/transactions/forms.py:507
|
||||
#: apps/transactions/forms.py:768 apps/transactions/models.py:278
|
||||
#: apps/transactions/models.py:448 apps/transactions/models.py:670
|
||||
msgid "Account"
|
||||
msgstr "Conta"
|
||||
|
||||
@@ -284,7 +289,11 @@ msgstr "Erro criando nova instância"
|
||||
msgid "Ungrouped"
|
||||
msgstr "Não agrupado"
|
||||
|
||||
#: apps/common/fields/month_year.py:23 apps/common/fields/month_year.py:51
|
||||
#: apps/common/fields/month_year.py:30
|
||||
msgid "Invalid date format. Use YYYY-MM or YYYY-MM-DD."
|
||||
msgstr "Formato de data inválido. Use AAAA-MM ou AAAA-MM-DD."
|
||||
|
||||
#: apps/common/fields/month_year.py:59
|
||||
msgid "Invalid date format. Use YYYY-MM."
|
||||
msgstr "Formato de data inválido. Use AAAA-MM."
|
||||
|
||||
@@ -321,7 +330,7 @@ msgstr ""
|
||||
"Somente editável pelo proprietário.<br/>Público: Exibido para todos os "
|
||||
"usuários. Somente editável pelo proprietário."
|
||||
|
||||
#: apps/common/forms.py:79 apps/users/forms.py:131
|
||||
#: apps/common/forms.py:79 apps/users/forms.py:135
|
||||
msgid "Save"
|
||||
msgstr "Salvar"
|
||||
|
||||
@@ -412,7 +421,7 @@ msgstr "Erro"
|
||||
msgid "Info"
|
||||
msgstr "Informação"
|
||||
|
||||
#: apps/common/views.py:110
|
||||
#: apps/common/views.py:111
|
||||
msgid "Cache cleared successfully"
|
||||
msgstr "Cache limpo com sucesso"
|
||||
|
||||
@@ -450,7 +459,7 @@ msgstr "Sufixo"
|
||||
|
||||
#: apps/currencies/forms.py:69 apps/dca/models.py:158 apps/rules/forms.py:169
|
||||
#: apps/rules/forms.py:182 apps/rules/models.py:33 apps/rules/models.py:254
|
||||
#: apps/transactions/forms.py:64 apps/transactions/forms.py:331
|
||||
#: apps/transactions/forms.py:65 apps/transactions/forms.py:343
|
||||
#: apps/transactions/models.py:288
|
||||
#: templates/dca/fragments/strategy/details.html:52
|
||||
#: templates/exchange_rates/fragments/table.html:10
|
||||
@@ -537,7 +546,7 @@ msgstr "Tipo de Serviço"
|
||||
#: templates/categories/fragments/list.html:21
|
||||
#: templates/entities/fragments/list.html:21
|
||||
#: templates/recurring_transactions/fragments/list.html:21
|
||||
#: templates/tags/fragments/list.html:21
|
||||
#: templates/tags/fragments/list.html:21 templates/users/fragments/list.html:28
|
||||
msgid "Active"
|
||||
msgstr "Ativo"
|
||||
|
||||
@@ -663,11 +672,11 @@ msgstr "Serviços marcados para execução com sucesso"
|
||||
msgid "Create transaction"
|
||||
msgstr "Criar transação"
|
||||
|
||||
#: apps/dca/forms.py:70 apps/transactions/forms.py:278
|
||||
#: apps/dca/forms.py:70 apps/transactions/forms.py:290
|
||||
msgid "From Account"
|
||||
msgstr "Conta de origem"
|
||||
|
||||
#: apps/dca/forms.py:76 apps/transactions/forms.py:283
|
||||
#: apps/dca/forms.py:76 apps/transactions/forms.py:295
|
||||
msgid "To Account"
|
||||
msgstr "Conta de destino"
|
||||
|
||||
@@ -692,7 +701,7 @@ msgstr "Conectar transação"
|
||||
msgid "You must provide an account."
|
||||
msgstr "Você deve informar uma conta."
|
||||
|
||||
#: apps/dca/forms.py:312 apps/transactions/forms.py:445
|
||||
#: apps/dca/forms.py:312 apps/transactions/forms.py:457
|
||||
msgid "From and To accounts must be different."
|
||||
msgstr "As contas De e Para devem ser diferentes."
|
||||
|
||||
@@ -711,8 +720,8 @@ msgstr "Moeda de pagamento"
|
||||
|
||||
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:173
|
||||
#: apps/rules/forms.py:188 apps/rules/models.py:37 apps/rules/models.py:270
|
||||
#: apps/transactions/forms.py:347 apps/transactions/models.py:301
|
||||
#: apps/transactions/models.py:497 apps/transactions/models.py:696
|
||||
#: apps/transactions/forms.py:359 apps/transactions/models.py:301
|
||||
#: apps/transactions/models.py:497 apps/transactions/models.py:698
|
||||
msgid "Notes"
|
||||
msgstr "Notas"
|
||||
|
||||
@@ -769,6 +778,8 @@ msgid "Entry deleted successfully"
|
||||
msgstr "Entrada apagada com sucesso"
|
||||
|
||||
#: apps/export_app/forms.py:14 apps/export_app/forms.py:131
|
||||
#: templates/includes/navbar.html:147 templates/users/fragments/list.html:6
|
||||
#: templates/users/pages/index.html:4
|
||||
msgid "Users"
|
||||
msgstr "Usuários"
|
||||
|
||||
@@ -790,16 +801,16 @@ msgstr "Categorias"
|
||||
#: apps/export_app/forms.py:50 apps/export_app/forms.py:136
|
||||
#: apps/rules/forms.py:178 apps/rules/forms.py:187 apps/rules/models.py:40
|
||||
#: apps/rules/models.py:282 apps/transactions/filters.py:81
|
||||
#: apps/transactions/forms.py:56 apps/transactions/forms.py:518
|
||||
#: apps/transactions/forms.py:779 apps/transactions/models.py:261
|
||||
#: apps/transactions/forms.py:57 apps/transactions/forms.py:530
|
||||
#: apps/transactions/forms.py:791 apps/transactions/models.py:261
|
||||
#: apps/transactions/models.py:316 apps/transactions/models.py:493
|
||||
#: apps/transactions/models.py:693 templates/entities/fragments/list.html:5
|
||||
#: apps/transactions/models.py:695 templates/entities/fragments/list.html:5
|
||||
#: templates/entities/pages/index.html:4 templates/includes/navbar.html:110
|
||||
msgid "Entities"
|
||||
msgstr "Entidades"
|
||||
|
||||
#: apps/export_app/forms.py:56 apps/export_app/forms.py:140
|
||||
#: apps/transactions/models.py:730 templates/includes/navbar.html:74
|
||||
#: apps/transactions/models.py:732 templates/includes/navbar.html:74
|
||||
#: templates/recurring_transactions/fragments/list.html:5
|
||||
#: templates/recurring_transactions/pages/index.html:4
|
||||
msgid "Recurring Transactions"
|
||||
@@ -949,7 +960,7 @@ msgstr "Importação atualizada com sucesso"
|
||||
|
||||
#: apps/import_app/views.py:130
|
||||
msgid "Import Profile deleted successfully"
|
||||
msgstr "Importação apagada com sucesso"
|
||||
msgstr "Perfil de Importação apagado com sucesso"
|
||||
|
||||
#: apps/import_app/views.py:195
|
||||
msgid "Import Run queued successfully"
|
||||
@@ -961,7 +972,9 @@ msgstr "Importação apagada com sucesso"
|
||||
|
||||
#: apps/insights/forms.py:119 apps/insights/utils/sankey.py:36
|
||||
#: apps/insights/utils/sankey.py:167
|
||||
#: templates/insights/fragments/category_overview/index.html:18
|
||||
#: templates/insights/fragments/category_overview/index.html:73
|
||||
#: templates/insights/fragments/category_overview/index.html:285
|
||||
#: templates/insights/fragments/category_overview/index.html:314
|
||||
msgid "Uncategorized"
|
||||
msgstr "Sem categoria"
|
||||
|
||||
@@ -1044,7 +1057,7 @@ msgstr "Operador"
|
||||
|
||||
#: apps/rules/forms.py:167 apps/rules/forms.py:180 apps/rules/models.py:31
|
||||
#: apps/rules/models.py:246 apps/transactions/models.py:285
|
||||
#: apps/transactions/models.py:453 apps/transactions/models.py:674
|
||||
#: apps/transactions/models.py:453 apps/transactions/models.py:676
|
||||
msgid "Type"
|
||||
msgstr "Tipo"
|
||||
|
||||
@@ -1058,23 +1071,23 @@ msgid "Paid"
|
||||
msgstr "Pago"
|
||||
|
||||
#: apps/rules/forms.py:170 apps/rules/forms.py:183 apps/rules/models.py:34
|
||||
#: apps/rules/models.py:258 apps/transactions/forms.py:68
|
||||
#: apps/transactions/forms.py:334 apps/transactions/forms.py:524
|
||||
#: apps/rules/models.py:258 apps/transactions/forms.py:69
|
||||
#: apps/transactions/forms.py:346 apps/transactions/forms.py:536
|
||||
#: apps/transactions/models.py:289 apps/transactions/models.py:471
|
||||
#: apps/transactions/models.py:698
|
||||
#: apps/transactions/models.py:700
|
||||
msgid "Reference Date"
|
||||
msgstr "Data de Referência"
|
||||
|
||||
#: apps/rules/forms.py:171 apps/rules/forms.py:184 apps/rules/models.py:35
|
||||
#: apps/rules/models.py:262 apps/transactions/models.py:294
|
||||
#: apps/transactions/models.py:679 templates/insights/fragments/sankey.html:95
|
||||
#: apps/transactions/models.py:681 templates/insights/fragments/sankey.html:95
|
||||
msgid "Amount"
|
||||
msgstr "Quantia"
|
||||
|
||||
#: apps/rules/forms.py:172 apps/rules/forms.py:185 apps/rules/models.py:14
|
||||
#: apps/rules/models.py:36 apps/rules/models.py:266
|
||||
#: apps/transactions/forms.py:338 apps/transactions/models.py:299
|
||||
#: apps/transactions/models.py:455 apps/transactions/models.py:682
|
||||
#: apps/transactions/forms.py:350 apps/transactions/models.py:299
|
||||
#: apps/transactions/models.py:455 apps/transactions/models.py:684
|
||||
msgid "Description"
|
||||
msgstr "Descrição"
|
||||
|
||||
@@ -1214,6 +1227,7 @@ msgstr "Ação Atualizar ou Criar Transação apagada com sucesso"
|
||||
|
||||
#: apps/transactions/filters.py:24 templates/cotton/transaction/item.html:21
|
||||
#: templates/cotton/transaction/item.html:31 templates/includes/navbar.html:46
|
||||
#: templates/insights/fragments/category_overview/index.html:46
|
||||
#: templates/transactions/widgets/paid_toggle_button.html:8
|
||||
#: templates/transactions/widgets/unselectable_paid_toggle_button.html:12
|
||||
msgid "Projected"
|
||||
@@ -1247,40 +1261,48 @@ msgstr "Quantia miníma"
|
||||
msgid "Amount max"
|
||||
msgstr "Quantia máxima"
|
||||
|
||||
#: apps/transactions/forms.py:171
|
||||
#: apps/transactions/forms.py:172
|
||||
msgid "More"
|
||||
msgstr "Mais"
|
||||
|
||||
#: apps/transactions/forms.py:290
|
||||
#: apps/transactions/forms.py:216
|
||||
msgid "Save and add similar"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:221
|
||||
msgid "Save and add another"
|
||||
msgstr ""
|
||||
|
||||
#: apps/transactions/forms.py:302
|
||||
msgid "From Amount"
|
||||
msgstr "Quantia de origem"
|
||||
|
||||
#: apps/transactions/forms.py:295
|
||||
#: apps/transactions/forms.py:307
|
||||
msgid "To Amount"
|
||||
msgstr "Quantia de destino"
|
||||
|
||||
#: apps/transactions/forms.py:412
|
||||
#: apps/transactions/forms.py:424
|
||||
#: templates/cotton/ui/quick_transactions_buttons.html:40
|
||||
msgid "Transfer"
|
||||
msgstr "Transferir"
|
||||
|
||||
#: apps/transactions/forms.py:658
|
||||
#: apps/transactions/forms.py:670
|
||||
msgid "Tag name"
|
||||
msgstr "Nome da Tag"
|
||||
|
||||
#: apps/transactions/forms.py:690
|
||||
#: apps/transactions/forms.py:702
|
||||
msgid "Entity name"
|
||||
msgstr "Nome da entidade"
|
||||
|
||||
#: apps/transactions/forms.py:722
|
||||
#: apps/transactions/forms.py:734
|
||||
msgid "Category name"
|
||||
msgstr "Nome da Categoria"
|
||||
|
||||
#: apps/transactions/forms.py:724
|
||||
#: apps/transactions/forms.py:736
|
||||
msgid "Muted categories won't count towards your monthly total"
|
||||
msgstr "As categorias silenciadas não serão contabilizadas em seu total mensal"
|
||||
|
||||
#: apps/transactions/forms.py:910
|
||||
#: apps/transactions/forms.py:922
|
||||
msgid "End date should be after the start date"
|
||||
msgstr "Data final deve ser após data inicial"
|
||||
|
||||
@@ -1332,7 +1354,7 @@ msgstr "Entidade"
|
||||
#: templates/calendar_view/fragments/list.html:52
|
||||
#: templates/calendar_view/fragments/list.html:54
|
||||
#: templates/cotton/ui/quick_transactions_buttons.html:10
|
||||
#: templates/insights/fragments/category_overview/index.html:10
|
||||
#: templates/insights/fragments/category_overview/index.html:64
|
||||
#: templates/monthly_overview/fragments/monthly_summary.html:39
|
||||
msgid "Income"
|
||||
msgstr "Renda"
|
||||
@@ -1343,7 +1365,7 @@ msgstr "Renda"
|
||||
#: templates/calendar_view/fragments/list.html:56
|
||||
#: templates/calendar_view/fragments/list.html:58
|
||||
#: templates/cotton/ui/quick_transactions_buttons.html:18
|
||||
#: templates/insights/fragments/category_overview/index.html:11
|
||||
#: templates/insights/fragments/category_overview/index.html:65
|
||||
msgid "Expense"
|
||||
msgstr "Despesa"
|
||||
|
||||
@@ -1351,7 +1373,7 @@ msgstr "Despesa"
|
||||
msgid "Installment Plan"
|
||||
msgstr "Parcelamento"
|
||||
|
||||
#: apps/transactions/models.py:336 apps/transactions/models.py:729
|
||||
#: apps/transactions/models.py:336 apps/transactions/models.py:731
|
||||
msgid "Recurring Transaction"
|
||||
msgstr "Transação Recorrente"
|
||||
|
||||
@@ -1408,11 +1430,11 @@ msgstr "Parcela inicial"
|
||||
msgid "The installment number to start counting from"
|
||||
msgstr "O número da parcela a partir do qual se inicia a contagem"
|
||||
|
||||
#: apps/transactions/models.py:469 apps/transactions/models.py:702
|
||||
#: apps/transactions/models.py:469 apps/transactions/models.py:704
|
||||
msgid "Start Date"
|
||||
msgstr "Data de Início"
|
||||
|
||||
#: apps/transactions/models.py:473 apps/transactions/models.py:703
|
||||
#: apps/transactions/models.py:473 apps/transactions/models.py:705
|
||||
msgid "End Date"
|
||||
msgstr "Data Final"
|
||||
|
||||
@@ -1424,48 +1446,48 @@ msgstr "Recorrência"
|
||||
msgid "Installment Amount"
|
||||
msgstr "Valor da Parcela"
|
||||
|
||||
#: apps/transactions/models.py:500 apps/transactions/models.py:719
|
||||
#: apps/transactions/models.py:500 apps/transactions/models.py:721
|
||||
msgid "Add description to transactions"
|
||||
msgstr "Adicionar descrição às transações"
|
||||
|
||||
#: apps/transactions/models.py:503 apps/transactions/models.py:722
|
||||
#: apps/transactions/models.py:503 apps/transactions/models.py:724
|
||||
msgid "Add notes to transactions"
|
||||
msgstr "Adicionar notas às transações"
|
||||
|
||||
#: apps/transactions/models.py:661
|
||||
#: apps/transactions/models.py:663
|
||||
msgid "day(s)"
|
||||
msgstr "dia(s)"
|
||||
|
||||
#: apps/transactions/models.py:662
|
||||
#: apps/transactions/models.py:664
|
||||
msgid "week(s)"
|
||||
msgstr "semana(s)"
|
||||
|
||||
#: apps/transactions/models.py:663
|
||||
#: apps/transactions/models.py:665
|
||||
msgid "month(s)"
|
||||
msgstr "mês(es)"
|
||||
|
||||
#: apps/transactions/models.py:664
|
||||
#: apps/transactions/models.py:666
|
||||
msgid "year(s)"
|
||||
msgstr "ano(s)"
|
||||
|
||||
#: apps/transactions/models.py:666
|
||||
#: apps/transactions/models.py:668
|
||||
#: templates/recurring_transactions/fragments/list.html:24
|
||||
msgid "Paused"
|
||||
msgstr "Pausado"
|
||||
|
||||
#: apps/transactions/models.py:705
|
||||
#: apps/transactions/models.py:707
|
||||
msgid "Recurrence Type"
|
||||
msgstr "Tipo de recorrência"
|
||||
|
||||
#: apps/transactions/models.py:708
|
||||
#: apps/transactions/models.py:710
|
||||
msgid "Recurrence Interval"
|
||||
msgstr "Intervalo de recorrência"
|
||||
|
||||
#: apps/transactions/models.py:712
|
||||
#: apps/transactions/models.py:714
|
||||
msgid "Last Generated Date"
|
||||
msgstr "Última data gerada"
|
||||
|
||||
#: apps/transactions/models.py:715
|
||||
#: apps/transactions/models.py:717
|
||||
msgid "Last Generated Reference Date"
|
||||
msgstr "Última data de referência gerada"
|
||||
|
||||
@@ -1590,35 +1612,35 @@ msgstr "Tag atualizada com sucesso"
|
||||
msgid "Tag deleted successfully"
|
||||
msgstr "Tag apagada com sucesso"
|
||||
|
||||
#: apps/transactions/views/transactions.py:50
|
||||
#: apps/transactions/views/transactions.py:89
|
||||
#: apps/transactions/views/transactions.py:52
|
||||
#: apps/transactions/views/transactions.py:110
|
||||
msgid "Transaction added successfully"
|
||||
msgstr "Transação adicionada com sucesso"
|
||||
|
||||
#: apps/transactions/views/transactions.py:123
|
||||
#: apps/transactions/views/transactions.py:144
|
||||
msgid "Transaction updated successfully"
|
||||
msgstr "Transação atualizada com sucesso"
|
||||
|
||||
#: apps/transactions/views/transactions.py:173
|
||||
#: apps/transactions/views/transactions.py:194
|
||||
#, python-format
|
||||
msgid "%(count)s transaction updated successfully"
|
||||
msgid_plural "%(count)s transactions updated successfully"
|
||||
msgstr[0] "%(count)s transação atualizada com sucesso"
|
||||
msgstr[1] "%(count)s transações atualizadas com sucesso"
|
||||
|
||||
#: apps/transactions/views/transactions.py:209
|
||||
#: apps/transactions/views/transactions.py:230
|
||||
msgid "Transaction duplicated successfully"
|
||||
msgstr "Transação duplicada com sucesso"
|
||||
|
||||
#: apps/transactions/views/transactions.py:251
|
||||
#: apps/transactions/views/transactions.py:272
|
||||
msgid "Transaction deleted successfully"
|
||||
msgstr "Transação apagada com sucesso"
|
||||
|
||||
#: apps/transactions/views/transactions.py:269
|
||||
#: apps/transactions/views/transactions.py:290
|
||||
msgid "Transaction restored successfully"
|
||||
msgstr "Transação restaurada com sucesso"
|
||||
|
||||
#: apps/transactions/views/transactions.py:295
|
||||
#: apps/transactions/views/transactions.py:316
|
||||
msgid "Transfer added successfully"
|
||||
msgstr "Transferência adicionada com sucesso"
|
||||
|
||||
@@ -1642,40 +1664,113 @@ msgstr "Permissões"
|
||||
msgid "Important dates"
|
||||
msgstr "Datas importantes"
|
||||
|
||||
#: apps/users/forms.py:19 apps/users/models.py:13 templates/users/login.html:19
|
||||
#: apps/users/forms.py:23 apps/users/models.py:13 templates/users/login.html:19
|
||||
msgid "E-mail"
|
||||
msgstr "E-mail"
|
||||
|
||||
#: apps/users/forms.py:25 templates/users/login.html:20
|
||||
#: apps/users/forms.py:29 templates/users/login.html:20
|
||||
msgid "Password"
|
||||
msgstr "Senha"
|
||||
|
||||
#: apps/users/forms.py:33
|
||||
#: apps/users/forms.py:37
|
||||
msgid "Invalid e-mail or password"
|
||||
msgstr "E-mail ou senha inválidos"
|
||||
|
||||
#: apps/users/forms.py:34
|
||||
#: apps/users/forms.py:38
|
||||
msgid "This account is deactivated"
|
||||
msgstr "Essa conta está desativada"
|
||||
|
||||
#: apps/users/forms.py:50 apps/users/forms.py:63 apps/users/forms.py:85
|
||||
#: apps/users/forms.py:54 apps/users/forms.py:67 apps/users/forms.py:89
|
||||
#: templates/monthly_overview/pages/overview.html:153
|
||||
#: templates/transactions/pages/transactions.html:35
|
||||
msgid "Default"
|
||||
msgstr "Padrão"
|
||||
|
||||
#: apps/users/forms.py:91 apps/users/models.py:41
|
||||
#: apps/users/forms.py:95 apps/users/models.py:41
|
||||
msgid "Date Format"
|
||||
msgstr "Formato de Data"
|
||||
|
||||
#: apps/users/forms.py:96 apps/users/models.py:46
|
||||
#: apps/users/forms.py:100 apps/users/models.py:46
|
||||
msgid "Datetime Format"
|
||||
msgstr "Formato de Data e Hora"
|
||||
|
||||
#: apps/users/forms.py:102 apps/users/models.py:49
|
||||
#: apps/users/forms.py:106 apps/users/models.py:49
|
||||
msgid "Number Format"
|
||||
msgstr "Formato de Número"
|
||||
|
||||
#: apps/users/forms.py:141
|
||||
#, python-format
|
||||
msgid ""
|
||||
"This changes the language (if available) and how numbers and dates are "
|
||||
"displayed\n"
|
||||
"Consider helping translate WYGIWYH to your language at %(translation_link)s"
|
||||
msgstr ""
|
||||
"Isso altera o idioma (se disponível) e a forma como os números e as datas "
|
||||
"são exibidos\n"
|
||||
"Considere ajudar a traduzir WYGIWYH para seu idioma em %(translation_link)s"
|
||||
|
||||
#: apps/users/forms.py:150
|
||||
msgid "New Password"
|
||||
msgstr "Nova senha"
|
||||
|
||||
#: apps/users/forms.py:153
|
||||
msgid "Leave blank to keep the current password."
|
||||
msgstr "Deixe em branco para usar a senha atual."
|
||||
|
||||
#: apps/users/forms.py:156
|
||||
msgid "Confirm New Password"
|
||||
msgstr "Confirmar nova senha"
|
||||
|
||||
#: apps/users/forms.py:168 apps/users/forms.py:329
|
||||
msgid ""
|
||||
"Designates whether this user should be treated as active. Unselect this "
|
||||
"instead of deleting accounts."
|
||||
msgstr ""
|
||||
"Designa se esse usuário deve ser tratado como ativo. Desmarque essa opção em "
|
||||
"vez de excluir usuários."
|
||||
|
||||
#: apps/users/forms.py:171 apps/users/forms.py:332
|
||||
msgid ""
|
||||
"Designates that this user has all permissions without explicitly assigning "
|
||||
"them."
|
||||
msgstr ""
|
||||
"Designa que esse usuário tem todas as permissões sem atribuí-las "
|
||||
"explicitamente."
|
||||
|
||||
#: apps/users/forms.py:242
|
||||
msgid "This email address is already in use by another account."
|
||||
msgstr "Esse endereço de e-mail já está sendo usado por outra conta."
|
||||
|
||||
#: apps/users/forms.py:250
|
||||
msgid "The two password fields didn't match."
|
||||
msgstr "Os dois campos de senha não coincidem."
|
||||
|
||||
#: apps/users/forms.py:252
|
||||
msgid "Please confirm your new password."
|
||||
msgstr "Confirme sua nova senha."
|
||||
|
||||
#: apps/users/forms.py:254
|
||||
msgid "Please enter the new password first."
|
||||
msgstr "Digite a nova senha primeiro."
|
||||
|
||||
#: apps/users/forms.py:274
|
||||
msgid "You cannot deactivate your own account using this form."
|
||||
msgstr "Não é possível desativar sua própria conta usando esse formulário."
|
||||
|
||||
#: apps/users/forms.py:287
|
||||
msgid "Cannot remove status from the last superuser."
|
||||
msgstr "Não é possível remover o status do último superusuário."
|
||||
|
||||
#: apps/users/forms.py:293
|
||||
msgid "You cannot remove your own superuser status using this form."
|
||||
msgstr ""
|
||||
"Não é possível remover seu próprio status de superusuário usando esse "
|
||||
"formulário."
|
||||
|
||||
#: apps/users/forms.py:390
|
||||
msgid "A user with this email address already exists."
|
||||
msgstr "Já existe um usuário com esse endereço de e-mail."
|
||||
|
||||
#: apps/users/models.py:27 templates/includes/navbar.html:28
|
||||
msgid "Yearly by currency"
|
||||
msgstr "Anual por moeda"
|
||||
@@ -1716,26 +1811,34 @@ msgstr "Fuso horário"
|
||||
msgid "Start page"
|
||||
msgstr "Página inicial"
|
||||
|
||||
#: apps/users/views.py:62
|
||||
#: apps/users/views.py:68
|
||||
msgid "Transaction amounts are now hidden"
|
||||
msgstr "Os valores das transações agora estão ocultos"
|
||||
|
||||
#: apps/users/views.py:65
|
||||
#: apps/users/views.py:71
|
||||
msgid "Transaction amounts are now displayed"
|
||||
msgstr "Os valores das transações agora estão sendo exibidos"
|
||||
|
||||
#: apps/users/views.py:83
|
||||
#: apps/users/views.py:89
|
||||
msgid "Sounds are now muted"
|
||||
msgstr "Os sons agora estão silenciados"
|
||||
|
||||
#: apps/users/views.py:86
|
||||
#: apps/users/views.py:92
|
||||
msgid "Sounds will now play"
|
||||
msgstr "Os sons agora serão reproduzidos"
|
||||
|
||||
#: apps/users/views.py:102
|
||||
#: apps/users/views.py:108
|
||||
msgid "Your settings have been updated"
|
||||
msgstr "Suas configurações foram atualizadas"
|
||||
|
||||
#: apps/users/views.py:152
|
||||
msgid "Item added successfully"
|
||||
msgstr "Item adicionado com sucesso"
|
||||
|
||||
#: apps/users/views.py:184
|
||||
msgid "Item updated successfully"
|
||||
msgstr "Item atualizado com sucesso"
|
||||
|
||||
#: templates/account_groups/fragments/add.html:5
|
||||
msgid "Add account group"
|
||||
msgstr "Adicionar grupo de conta"
|
||||
@@ -1758,6 +1861,7 @@ msgstr "Editar grupo de conta"
|
||||
#: templates/recurring_transactions/fragments/table.html:25
|
||||
#: templates/rules/fragments/list.html:33
|
||||
#: templates/tags/fragments/table.html:23
|
||||
#: templates/users/fragments/list.html:38
|
||||
msgid "Actions"
|
||||
msgstr "Ações"
|
||||
|
||||
@@ -1780,6 +1884,7 @@ msgstr "Ações"
|
||||
#: templates/rules/fragments/transaction_rule/view.html:47
|
||||
#: templates/rules/fragments/transaction_rule/view.html:80
|
||||
#: templates/tags/fragments/table.html:28
|
||||
#: templates/users/fragments/list.html:43
|
||||
msgid "Edit"
|
||||
msgstr "Editar"
|
||||
|
||||
@@ -2002,7 +2107,7 @@ msgid "Muted"
|
||||
msgstr "Silenciada"
|
||||
|
||||
#: templates/categories/fragments/table.html:75
|
||||
#: templates/insights/fragments/category_overview/index.html:67
|
||||
#: templates/insights/fragments/category_overview/index.html:430
|
||||
msgid "No categories"
|
||||
msgstr "Nenhum categoria"
|
||||
|
||||
@@ -2464,10 +2569,11 @@ msgid "Net Worth"
|
||||
msgstr "Patrimônio"
|
||||
|
||||
#: templates/includes/navbar.html:44
|
||||
#: templates/insights/fragments/category_overview/index.html:50
|
||||
msgid "Current"
|
||||
msgstr "Atual"
|
||||
|
||||
#: templates/includes/navbar.html:50
|
||||
#: templates/includes/navbar.html:50 templates/insights/pages/index.html:5
|
||||
msgid "Insights"
|
||||
msgstr "Insights"
|
||||
|
||||
@@ -2503,15 +2609,19 @@ msgstr "Gerenciar"
|
||||
msgid "Automation"
|
||||
msgstr "Automação"
|
||||
|
||||
#: templates/includes/navbar.html:150
|
||||
#: templates/includes/navbar.html:145
|
||||
msgid "Admin"
|
||||
msgstr "Admin"
|
||||
|
||||
#: templates/includes/navbar.html:154
|
||||
msgid "Only use this if you know what you're doing"
|
||||
msgstr "Só use isso se você souber o que está fazendo"
|
||||
|
||||
#: templates/includes/navbar.html:151
|
||||
#: templates/includes/navbar.html:155
|
||||
msgid "Django Admin"
|
||||
msgstr "Django Admin"
|
||||
|
||||
#: templates/includes/navbar.html:160
|
||||
#: templates/includes/navbar.html:165
|
||||
msgid "Calculator"
|
||||
msgstr "Calculadora"
|
||||
|
||||
@@ -2519,11 +2629,15 @@ msgstr "Calculadora"
|
||||
msgid "Settings"
|
||||
msgstr "Configurações"
|
||||
|
||||
#: templates/includes/navbar/user_menu.html:41
|
||||
#: templates/includes/navbar/user_menu.html:19
|
||||
msgid "Edit profile"
|
||||
msgstr "Editar perfil"
|
||||
|
||||
#: templates/includes/navbar/user_menu.html:46
|
||||
msgid "Clear cache"
|
||||
msgstr "Limpar cache"
|
||||
|
||||
#: templates/includes/navbar/user_menu.html:45
|
||||
#: templates/includes/navbar/user_menu.html:50
|
||||
msgid "Logout"
|
||||
msgstr "Sair"
|
||||
|
||||
@@ -2534,7 +2648,8 @@ msgstr "Acesso Negado"
|
||||
#: templates/includes/scripts/hyperscript/htmx_error_handler.html:9
|
||||
msgid ""
|
||||
"You do not have permission to perform this action or access this resource."
|
||||
msgstr "Você não tem permissão para executar essa ação ou acessar esse recurso."
|
||||
msgstr ""
|
||||
"Você não tem permissão para executar essa ação ou acessar esse recurso."
|
||||
|
||||
#: templates/includes/scripts/hyperscript/htmx_error_handler.html:18
|
||||
msgid "Something went wrong loading your data"
|
||||
@@ -2574,11 +2689,39 @@ msgstr "Gasto/Despesa por Conta"
|
||||
msgid "Income/Expense by Currency"
|
||||
msgstr "Gasto/Despesa por Moeda"
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:12
|
||||
#: templates/insights/fragments/category_overview/index.html:14
|
||||
msgid "Table"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:24
|
||||
msgid "Bars"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:38
|
||||
msgid ""
|
||||
"Transaction amounts associated with multiple tags will be counted once for "
|
||||
"each tag"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:54
|
||||
#, fuzzy
|
||||
#| msgid "final total"
|
||||
msgid "Final total"
|
||||
msgstr "total final"
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:66
|
||||
#: templates/monthly_overview/fragments/monthly_summary.html:167
|
||||
msgid "Total"
|
||||
msgstr "Total"
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:166
|
||||
msgid "Untagged"
|
||||
msgstr ""
|
||||
|
||||
#: templates/insights/fragments/category_overview/index.html:407
|
||||
msgid "Final Total"
|
||||
msgstr "Total Final"
|
||||
|
||||
#: templates/insights/fragments/emergency_fund.html:15
|
||||
msgid "You've spent an average of"
|
||||
msgstr "Você gastou em média"
|
||||
@@ -2623,53 +2766,53 @@ msgstr "De"
|
||||
msgid "Percentage"
|
||||
msgstr "Porcentagem"
|
||||
|
||||
#: templates/insights/pages/index.html:35
|
||||
#: templates/insights/pages/index.html:37
|
||||
msgid "Month"
|
||||
msgstr "Mês"
|
||||
|
||||
#: templates/insights/pages/index.html:38
|
||||
#: templates/insights/pages/index.html:40
|
||||
#: templates/yearly_overview/pages/overview_by_account.html:61
|
||||
#: templates/yearly_overview/pages/overview_by_currency.html:63
|
||||
msgid "Year"
|
||||
msgstr "Ano"
|
||||
|
||||
#: templates/insights/pages/index.html:43
|
||||
#: templates/insights/pages/index.html:45
|
||||
msgid "Month Range"
|
||||
msgstr "Intervalo de Mês"
|
||||
|
||||
#: templates/insights/pages/index.html:48
|
||||
#: templates/insights/pages/index.html:50
|
||||
msgid "Year Range"
|
||||
msgstr "Intervalo de Ano"
|
||||
|
||||
#: templates/insights/pages/index.html:53
|
||||
#: templates/insights/pages/index.html:55
|
||||
msgid "Date Range"
|
||||
msgstr "Intervalo de Data"
|
||||
|
||||
#: templates/insights/pages/index.html:81
|
||||
#: templates/insights/pages/index.html:83
|
||||
msgid "Account Flow"
|
||||
msgstr "Fluxo de Conta"
|
||||
|
||||
#: templates/insights/pages/index.html:88
|
||||
#: templates/insights/pages/index.html:90
|
||||
msgid "Currency Flow"
|
||||
msgstr "Fluxo de Moeda"
|
||||
|
||||
#: templates/insights/pages/index.html:95
|
||||
#: templates/insights/pages/index.html:97
|
||||
msgid "Category Explorer"
|
||||
msgstr "Explorador de Categoria"
|
||||
|
||||
#: templates/insights/pages/index.html:102
|
||||
#: templates/insights/pages/index.html:104
|
||||
msgid "Categories Overview"
|
||||
msgstr "Visão geral das categorias"
|
||||
|
||||
#: templates/insights/pages/index.html:109
|
||||
#: templates/insights/pages/index.html:111
|
||||
msgid "Late Transactions"
|
||||
msgstr "Transações Atrasadas"
|
||||
|
||||
#: templates/insights/pages/index.html:115
|
||||
#: templates/insights/pages/index.html:117
|
||||
msgid "Latest Transactions"
|
||||
msgstr "Últimas Transações"
|
||||
|
||||
#: templates/insights/pages/index.html:121
|
||||
#: templates/insights/pages/index.html:123
|
||||
msgid "Emergency Fund"
|
||||
msgstr "Reserva de Emergência"
|
||||
|
||||
@@ -3016,6 +3159,30 @@ msgstr "Transações apagadas"
|
||||
msgid "Unchanged"
|
||||
msgstr "Inalterado"
|
||||
|
||||
#: templates/users/fragments/add.html:5
|
||||
msgid "Add user"
|
||||
msgstr "Adicionar usuário"
|
||||
|
||||
#: templates/users/fragments/edit.html:5
|
||||
msgid "Edit user"
|
||||
msgstr "Editar usuário"
|
||||
|
||||
#: templates/users/fragments/list.html:30
|
||||
msgid "Email"
|
||||
msgstr "Email"
|
||||
|
||||
#: templates/users/fragments/list.html:31
|
||||
msgid "Superuser"
|
||||
msgstr "Superusuário"
|
||||
|
||||
#: templates/users/fragments/list.html:51
|
||||
msgid "Impersonate"
|
||||
msgstr "Personificar"
|
||||
|
||||
#: templates/users/fragments/list.html:80
|
||||
msgid "No users"
|
||||
msgstr "Nenhum usuário"
|
||||
|
||||
#: templates/users/generic/hide_amounts.html:2
|
||||
msgid "Hide amounts"
|
||||
msgstr "Esconder valores"
|
||||
@@ -3045,6 +3212,11 @@ msgstr "Use as credenciais abaixo para fazer login"
|
||||
msgid "Yearly Overview"
|
||||
msgstr "Visão Anual"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "No tags"
|
||||
#~ msgid "Show tags"
|
||||
#~ msgstr "Nenhuma tag"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "From Amount"
|
||||
#~ msgid "Principal Amount"
|
||||
|
||||
3164
app/locale/sv/LC_MESSAGES/django.po
Normal file
3164
app/locale/sv/LC_MESSAGES/django.po
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,8 @@
|
||||
{% spaceless %}
|
||||
{% load i18n %}
|
||||
<span class="tw-text-xs text-white-50 mx-1"
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-title="{{ content }}">
|
||||
<i class="fa-solid fa-circle-question fa-fw"></i>
|
||||
<i class="{% if not icon %}fa-solid fa-circle-question{% else %}{{ icon }}{% endif %} fa-fw"></i>
|
||||
</span>
|
||||
{% endspaceless %}
|
||||
@@ -3,7 +3,7 @@
|
||||
{% if icon %}<i class="{{ icon }}"></i>{% else %}<span class="fw-bold">{{ title.0 }}</span>{% endif %}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h5 class="tw-text-{{ color }}-400 fw-bold tw-mr-[50px]" {{ attrs }}>{{ title }}{% if help_text %}{% include 'includes/help_icon.html' with content=help_text %}{% endif %}</h5>
|
||||
<h5 class="tw-text-{{ color }}-400 fw-bold tw-mr-[50px]" {{ attrs }}>{{ title }}{% if help_text %}<c-ui.help-icon :content="help_text" icon=""></c-ui.help-icon>{% endif %}</h5>
|
||||
{{ slot }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
{% load i18n %}
|
||||
<div class="progress-stacked">
|
||||
<div class="progress position-relative" role="progressbar" aria-label="{% trans 'Projected Income' %} ({{ percentage.percentages.income_projected|floatformat:2 }}%)" aria-valuenow="{{ percentage.percentages.expense_projected|floatformat:0 }}" aria-valuemin="0" aria-valuemax="100" style="width: {{ percentage.percentages.income_projected|floatformat:0 }}%">
|
||||
<div class="progress position-relative" role="progressbar" aria-label="{% trans 'Projected Income' %} ({{ percentage.percentages.income_projected|floatformat:2 }}%)" aria-valuenow="{{ percentage.percentages.expense_projected|floatformat:0 }}" aria-valuemin="0" aria-valuemax="100" style="width: {{ percentage.percentages.income_projected|floatformat:"2u" }}%">
|
||||
<div class="progress-bar progress-bar-striped !tw-bg-green-300"
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="{% trans 'Projected Income' %} ({{ percentage.percentages.income_projected|floatformat:2 }}%)">
|
||||
</div>
|
||||
</div>
|
||||
<div class="progress position-relative" role="progressbar" aria-label="{% trans 'Current Income' %} ({{ percentage.percentages.income_current|floatformat:2 }}%)" aria-valuenow="{{ percentage.percentages.expense_projected|floatformat:0 }}" aria-valuemin="0" aria-valuemax="100" style="width: {{ percentage.percentages.income_current|floatformat:0 }}%">
|
||||
<div class="progress position-relative" role="progressbar" aria-label="{% trans 'Current Income' %} ({{ percentage.percentages.income_current|floatformat:2 }}%)" aria-valuenow="{{ percentage.percentages.expense_projected|floatformat:0 }}" aria-valuemin="0" aria-valuemax="100" style="width: {{ percentage.percentages.income_current|floatformat:"2u" }}%">
|
||||
<div class="progress-bar !tw-bg-green-400"
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="{% trans 'Current Income' %} ({{ p.percentages.income_current|floatformat:2 }}%)">
|
||||
</div>
|
||||
</div>
|
||||
<div class="progress position-relative" role="progressbar" aria-label="{% trans 'Projected Expenses' %} ({{ percentage.percentages.expense_projected|floatformat:2 }}%)" aria-valuenow="{{ percentage.percentages.expense_projected|floatformat:0 }}" aria-valuemin="0" aria-valuemax="100" style="width: {{ percentage.percentages.expense_projected|floatformat:0 }}%">
|
||||
<div class="progress position-relative" role="progressbar" aria-label="{% trans 'Projected Expenses' %} ({{ percentage.percentages.expense_projected|floatformat:2 }}%)" aria-valuenow="{{ percentage.percentages.expense_projected|floatformat:0 }}" aria-valuemin="0" aria-valuemax="100" style="width: {{ percentage.percentages.expense_projected|floatformat:"2u" }}%">
|
||||
<div class="progress-bar progress-bar-striped !tw-bg-red-300"
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="{% trans 'Projected Expenses' %} ({{ percentage.percentages.expense_projected|floatformat:2 }}%)">
|
||||
</div>
|
||||
</div>
|
||||
<div class="progress position-relative" role="progressbar" aria-label="{% trans 'Current Expenses' %} ({{ percentage.percentages.expense_current|floatformat:2 }}%)" aria-valuenow="{{ percentage.percentages.expense_projected|floatformat:0 }}" aria-valuemin="0" aria-valuemax="100" style="width: {{ percentage.percentages.expense_current|floatformat:0 }}%">
|
||||
<div class="progress position-relative" role="progressbar" aria-label="{% trans 'Current Expenses' %} ({{ percentage.percentages.expense_current|floatformat:2 }}%)" aria-valuenow="{{ percentage.percentages.expense_projected|floatformat:0 }}" aria-valuemin="0" aria-valuemax="100" style="width: {{ percentage.percentages.expense_current|floatformat:"2u" }}%">
|
||||
<div class="progress-bar !tw-bg-red-400"
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
</ul>
|
||||
</li>
|
||||
<li class="nav-item dropdown">
|
||||
<a class="nav-link dropdown-toggle {% active_link views='tags_index||entities_index||categories_index||accounts_index||account_groups_index||currencies_index||exchange_rates_index||rules_index||import_profiles_index||automatic_exchange_rates_index||export_index' %}"
|
||||
<a class="nav-link dropdown-toggle {% active_link views='tags_index||entities_index||categories_index||accounts_index||account_groups_index||currencies_index||exchange_rates_index||rules_index||import_profiles_index||automatic_exchange_rates_index||export_index||users_index' %}"
|
||||
href="#" role="button"
|
||||
data-bs-toggle="dropdown"
|
||||
aria-expanded="false">
|
||||
@@ -138,9 +138,13 @@
|
||||
{% endif %}
|
||||
<li><a class="dropdown-item {% active_link views='automatic_exchange_rates_index' %}"
|
||||
href="{% url 'automatic_exchange_rates_index' %}">{% translate 'Automatic Exchange Rates' %}</a></li>
|
||||
{% if user.is_superuser %}
|
||||
<li>
|
||||
<hr class="dropdown-divider">
|
||||
</li>
|
||||
<li><h6 class="dropdown-header">{% trans 'Admin' %}</h6></li>
|
||||
<li><a class="dropdown-item {% active_link views='users_index' %}"
|
||||
href="{% url 'users_index' %}">{% translate 'Users' %}</a></li>
|
||||
<li>
|
||||
<a class="dropdown-item"
|
||||
href="{% url 'admin:index' %}"
|
||||
@@ -151,6 +155,7 @@
|
||||
{% translate 'Django Admin' %}
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
@@ -12,6 +12,11 @@
|
||||
hx-target="#generic-offcanvas"
|
||||
role="button">
|
||||
<i class="fa-solid fa-gear me-2 fa-fw"></i>{% translate 'Settings' %}</a></li>
|
||||
<li><a class="dropdown-item"
|
||||
hx-get="{% url 'user_edit' pk=request.user.id %}"
|
||||
hx-target="#generic-offcanvas"
|
||||
role="button">
|
||||
<i class="fa-solid fa-user me-2 fa-fw"></i>{% translate 'Edit profile' %}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
{% spaceless %}
|
||||
<li>
|
||||
|
||||
@@ -1,68 +1,431 @@
|
||||
{% load i18n %}
|
||||
|
||||
<div hx-get="{% url 'category_overview' %}" hx-trigger="updated from:window" class="show-loading" hx-swap="outerHTML" hx-include="#picker-form, #picker-type">
|
||||
{% if total_table %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">{% trans 'Category' %}</th>
|
||||
<th scope="col">{% trans 'Income' %}</th>
|
||||
<th scope="col">{% trans 'Expense' %}</th>
|
||||
<th scope="col">{% trans 'Total' %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for category in total_table.values %}
|
||||
<tr>
|
||||
<th>{% if category.name %}{{ category.name }}{% else %}{% trans 'Uncategorized' %}{% endif %}</th>
|
||||
<td>
|
||||
{% for currency in category.currencies.values %}
|
||||
{% if currency.total_income != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.total_income"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="green"></c-amount.display>
|
||||
{% else %}
|
||||
<div>-</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</td>
|
||||
<td>
|
||||
{% for currency in category.currencies.values %}
|
||||
{% if currency.total_expense != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.total_expense"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="red"></c-amount.display>
|
||||
{% else %}
|
||||
<div>-</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</td>
|
||||
<td>
|
||||
{% for currency in category.currencies.values %}
|
||||
{% if currency.total_final != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.total_final"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="{% if currency.total_final < 0 %}red{% else %}green{% endif %}"></c-amount.display>
|
||||
{% else %}
|
||||
<div>-</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<div hx-get="{% url 'category_overview' %}" hx-trigger="updated from:window" class="show-loading" hx-swap="outerHTML"
|
||||
hx-include="#picker-form, #picker-type, #view-type, #show-tags, #showing">
|
||||
<div class="h-100 text-center mb-4">
|
||||
<div class="btn-group gap-3" role="group" id="view-type" _="on change trigger updated">
|
||||
<input type="radio" class="btn-check"
|
||||
name="view_type"
|
||||
id="table-view"
|
||||
autocomplete="off"
|
||||
value="table"
|
||||
{% if view_type == "table" %}checked{% endif %}>
|
||||
<label class="btn btn-outline-primary rounded-5" for="table-view"><i
|
||||
class="fa-solid fa-table fa-fw me-2"></i>{% trans 'Table' %}</label>
|
||||
|
||||
<input type="radio"
|
||||
class="btn-check"
|
||||
name="view_type"
|
||||
id="bars-view"
|
||||
autocomplete="off"
|
||||
value="bars"
|
||||
{% if view_type == "bars" %}checked{% endif %}>
|
||||
<label class="btn btn-outline-primary rounded-5" for="bars-view"><i
|
||||
class="fa-solid fa-chart-bar fa-fw me-2"></i>{% trans 'Bars' %}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-3 mb-1 d-flex flex-column flex-md-row justify-content-between">
|
||||
<div class="form-check form-switch" id="show-tags">
|
||||
{% if view_type == 'table' %}
|
||||
<input type="hidden" name="show_tags" value="off">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="show-tags-switch" name="show_tags"
|
||||
_="on change trigger updated" {% if show_tags %}checked{% endif %}>
|
||||
{% spaceless %}
|
||||
<label class="form-check-label" for="show-tags-switch">
|
||||
{% trans 'Tags' %}
|
||||
</label>
|
||||
<c-ui.help-icon
|
||||
content="{% trans 'Transaction amounts associated with multiple tags will be counted once for each tag' %}"
|
||||
icon="fa-solid fa-circle-exclamation"></c-ui.help-icon>
|
||||
{% endspaceless %}
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="btn-group btn-group-sm" role="group" id="showing" _="on change trigger updated">
|
||||
<input type="radio" class="btn-check" name="showing" id="showing-projected" autocomplete="off"
|
||||
value="projected" {% if showing == 'projected' %}checked{% endif %}>
|
||||
<label class="btn btn-outline-primary" for="showing-projected">{% trans "Projected" %}</label>
|
||||
|
||||
<input type="radio" class="btn-check" name="showing" id="showing-current" autocomplete="off" value="current"
|
||||
{% if showing == 'current' %}checked{% endif %}>
|
||||
<label class="btn btn-outline-primary" for="showing-current">{% trans "Current" %}</label>
|
||||
|
||||
<input type="radio" class="btn-check" name="showing" id="showing-final" autocomplete="off" value="final"
|
||||
{% if showing == 'final' %}checked{% endif %}>
|
||||
<label class="btn btn-outline-primary" for="showing-final">{% trans "Final total" %}</label>
|
||||
</div>
|
||||
</div>
|
||||
{% if total_table %}
|
||||
{% if view_type == "table" %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-hover table-bordered align-middle">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">{% trans 'Category' %}</th>
|
||||
<th scope="col">{% trans 'Income' %}</th>
|
||||
<th scope="col">{% trans 'Expense' %}</th>
|
||||
<th scope="col">{% trans 'Total' %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="table-group-divider">
|
||||
{% for category in total_table.values %}
|
||||
<!-- Category row -->
|
||||
<tr class="table-group-header">
|
||||
<th>{% if category.name %}{{ category.name }}{% else %}{% trans 'Uncategorized' %}{% endif %}</th>
|
||||
<td> {# income #}
|
||||
{% for currency in category.currencies.values %}
|
||||
{% if showing == 'current' and currency.income_current != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.income_current"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="green"></c-amount.display>
|
||||
{% elif showing == 'projected' and currency.income_projected != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.income_projected"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="green"></c-amount.display>
|
||||
{% elif showing == 'final' and currency.total_income != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.total_income"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="green"></c-amount.display>
|
||||
{% else %}
|
||||
<div>-</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</td>
|
||||
<td> {# expenses #}
|
||||
{% for currency in category.currencies.values %}
|
||||
{% if showing == 'current' and currency.expense_current != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.expense_current"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="red"></c-amount.display>
|
||||
{% elif showing == 'projected' and currency.expense_projected != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.expense_projected"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="red"></c-amount.display>
|
||||
{% elif showing == 'final' and currency.total_expense != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.total_expense"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="red"></c-amount.display>
|
||||
{% else %}
|
||||
<div>-</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</td>
|
||||
<td> {# total #}
|
||||
{% for currency in category.currencies.values %}
|
||||
{% if showing == 'current' and currency.total_current != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.total_current"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="{% if currency.total_final < 0 %}red{% else %}green{% endif %}"></c-amount.display>
|
||||
{% elif showing == 'projected' and currency.total_projected != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.total_projected"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="{% if currency.total_final < 0 %}red{% else %}green{% endif %}"></c-amount.display>
|
||||
{% elif showing == 'final' and currency.total_final != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.total_final"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="{% if currency.total_final < 0 %}red{% else %}green{% endif %}"></c-amount.display>
|
||||
{% else %}
|
||||
<div>-</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Tag rows -->
|
||||
{% if show_tags %}
|
||||
{% for tag_id, tag in category.tags.items %}
|
||||
{% if tag.name or not tag.name and category.tags.values|length > 1 %}
|
||||
<tr class="table-row-nested">
|
||||
<td class="ps-4">
|
||||
<i class="fa-solid fa-hashtag fa-fw me-2 text-muted"></i>{% if tag.name %}{{ tag.name }}{% else %}{% trans 'Untagged' %}{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% for currency in tag.currencies.values %}
|
||||
{% if showing == 'current' and currency.income_current != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.income_current"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="green"></c-amount.display>
|
||||
{% elif showing == 'projected' and currency.income_projected != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.income_projected"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="green"></c-amount.display>
|
||||
{% elif showing == 'final' and currency.total_income != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.total_income"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="green"></c-amount.display>
|
||||
{% else %}
|
||||
<div>-</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</td>
|
||||
<td>
|
||||
{% for currency in tag.currencies.values %}
|
||||
{% if showing == 'current' and currency.expense_current != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.expense_current"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="red"></c-amount.display>
|
||||
{% elif showing == 'projected' and currency.expense_projected != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.expense_projected"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="red"></c-amount.display>
|
||||
{% elif showing == 'final' and currency.total_expense != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.total_expense"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="red"></c-amount.display>
|
||||
{% else %}
|
||||
<div>-</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</td>
|
||||
<td>
|
||||
{% for currency in tag.currencies.values %}
|
||||
{% if showing == 'current' and currency.total_current != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.total_current"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="{% if currency.total_final < 0 %}red{% else %}green{% endif %}"></c-amount.display>
|
||||
{% elif showing == 'projected' and currency.total_projected != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.total_projected"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="{% if currency.total_final < 0 %}red{% else %}green{% endif %}"></c-amount.display>
|
||||
{% elif showing == 'final' and currency.total_final != 0 %}
|
||||
<c-amount.display
|
||||
:amount="currency.total_final"
|
||||
:prefix="currency.currency.prefix"
|
||||
:suffix="currency.currency.suffix"
|
||||
:decimal_places="currency.currency.decimal_places"
|
||||
color="{% if currency.total_final < 0 %}red{% else %}green{% endif %}"></c-amount.display>
|
||||
{% else %}
|
||||
<div>-</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
{% elif view_type == "bars" %}
|
||||
<div>
|
||||
<div class="chart-container" _="init call setupChart() end" style="position: relative; height:78vh; width:100%">
|
||||
<canvas id="categoryChart"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{ total_table|json_script:"categoryOverviewData" }}
|
||||
{{ showing|json_script:"showingString" }}
|
||||
|
||||
<script>
|
||||
function setupChart() {
|
||||
var rawData = JSON.parse(document.getElementById('categoryOverviewData').textContent);
|
||||
var showing_string = JSON.parse(document.getElementById('showingString').textContent);
|
||||
console.log(showing_string)
|
||||
|
||||
// --- Dynamic Data Processing ---
|
||||
var categories = [];
|
||||
var currencyDetails = {}; // Stores details like { BRL: {code: 'BRL', name: 'Real', ...}, ... }
|
||||
var currencyData = {}; // Stores data arrays like { BRL: [val1, null, val3,...], ... }
|
||||
|
||||
// Pass 1: Collect categories and currency details
|
||||
Object.values(rawData).forEach(cat => {
|
||||
var categoryName = cat.name === null ? "{% trans 'Uncategorized' %}" : cat.name;
|
||||
if (!categories.includes(categoryName)) {
|
||||
categories.push(categoryName);
|
||||
}
|
||||
if (cat.currencies) {
|
||||
Object.values(cat.currencies).forEach(curr => {
|
||||
var details = curr.currency;
|
||||
if (details && details.code && !currencyDetails[details.code]) {
|
||||
var decimals = parseInt(details.decimal_places, 10);
|
||||
currencyDetails[details.code] = {
|
||||
code: details.code,
|
||||
name: details.name || details.code,
|
||||
prefix: details.prefix || '',
|
||||
suffix: details.suffix || '',
|
||||
// Ensure decimal_places is a non-negative integer
|
||||
decimal_places: !isNaN(decimals) && decimals >= 0 ? decimals : 2
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Initialize data structure for each currency with nulls
|
||||
Object.keys(currencyDetails).forEach(code => {
|
||||
currencyData[code] = new Array(categories.length).fill(null);
|
||||
});
|
||||
|
||||
// Pass 2: Populate data arrays (store all valid numbers now)
|
||||
Object.values(rawData).forEach(cat => {
|
||||
var categoryName = cat.name === null ? "{% trans 'Uncategorized' %}" : cat.name;
|
||||
var catIndex = categories.indexOf(categoryName);
|
||||
if (catIndex === -1) return;
|
||||
|
||||
if (cat.currencies) {
|
||||
Object.values(cat.currencies).forEach(curr => {
|
||||
var code = curr.currency?.code;
|
||||
if (code && currencyData[code]) {
|
||||
if (showing_string == 'current') {
|
||||
var value = parseFloat(curr.total_current);
|
||||
} else if (showing_string == 'projected') {
|
||||
var value = parseFloat(curr.total_projected);
|
||||
} else {
|
||||
var value = parseFloat(curr.total_final);
|
||||
}
|
||||
|
||||
// Store the number if it's valid, otherwise keep null
|
||||
currencyData[code][catIndex] = !isNaN(value) ? value : null;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// --- Dynamic Chart Configuration ---
|
||||
var datasets = Object.keys(currencyDetails).map((code, index) => {
|
||||
return {
|
||||
label: currencyDetails[code].name, // Use currency name for the legend label
|
||||
data: currencyData[code],
|
||||
currencyCode: code, // Store code for easy lookup in tooltip
|
||||
borderWidth: 1
|
||||
};
|
||||
});
|
||||
|
||||
new Chart(document.getElementById('categoryChart'),
|
||||
{
|
||||
type: 'bar',
|
||||
data: {
|
||||
labels: categories,
|
||||
datasets: datasets
|
||||
},
|
||||
options: {
|
||||
indexAxis: 'y',
|
||||
responsive: true,
|
||||
interaction: {
|
||||
intersect: false,
|
||||
mode: 'nearest',
|
||||
axis: "y"
|
||||
},
|
||||
maintainAspectRatio: false,
|
||||
plugins: {
|
||||
title: {
|
||||
display: false
|
||||
},
|
||||
tooltip: {
|
||||
callbacks: {
|
||||
label: function (context) {
|
||||
const dataset = context.dataset;
|
||||
const currencyCode = dataset.currencyCode;
|
||||
const details = currencyDetails[currencyCode];
|
||||
const value = context.parsed.x; // Use 'x' because indexAxis is 'y'
|
||||
|
||||
if (value === null || value === undefined || !details) {
|
||||
// Display the category name if the value is null/undefined
|
||||
return null;
|
||||
}
|
||||
|
||||
let formattedValue = '';
|
||||
try {
|
||||
// Use Intl.NumberFormat for ALL values, configured with locale and exact decimal places
|
||||
formattedValue = new Intl.NumberFormat(undefined, {
|
||||
minimumFractionDigits: details.decimal_places,
|
||||
maximumFractionDigits: details.decimal_places,
|
||||
// Do NOT use style: 'currency' here, as we add prefix/suffix manually
|
||||
}).format(value);
|
||||
} catch (e) {
|
||||
formattedValue = value.toFixed(details.decimal_places);
|
||||
}
|
||||
|
||||
// Return label with currency name and formatted value including prefix/suffix
|
||||
return `${details.prefix}${formattedValue}${details.suffix}`;
|
||||
}
|
||||
}
|
||||
},
|
||||
legend: {
|
||||
position: 'top',
|
||||
}
|
||||
},
|
||||
scales: {
|
||||
x: {
|
||||
stacked: true,
|
||||
type: 'linear',
|
||||
title: {
|
||||
display: true,
|
||||
text: '{% trans 'Final Total' %}'
|
||||
},
|
||||
ticks: {
|
||||
// Format ticks using the detected locale
|
||||
callback: function (value, index, ticks) {
|
||||
return value.toLocaleString();
|
||||
}
|
||||
}
|
||||
},
|
||||
y: {
|
||||
stacked: true,
|
||||
title: {
|
||||
display: false,
|
||||
text: '{% trans 'Category' %}'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<c-msg.empty title="{% translate "No categories" %}"></c-msg.empty>
|
||||
{% endif %}
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
{% load crispy_forms_tags %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{% translate 'Insights' %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container-fluid">
|
||||
<div class="row my-3 h-100">
|
||||
|
||||
11
app/templates/users/fragments/add.html
Normal file
11
app/templates/users/fragments/add.html
Normal file
@@ -0,0 +1,11 @@
|
||||
{% extends 'extends/offcanvas.html' %}
|
||||
{% load i18n %}
|
||||
{% load crispy_forms_tags %}
|
||||
|
||||
{% block title %}{% translate 'Add user' %}{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<form hx-post="{% url 'user_add' %}" hx-target="#generic-offcanvas" novalidate>
|
||||
{% crispy form %}
|
||||
</form>
|
||||
{% endblock %}
|
||||
11
app/templates/users/fragments/edit.html
Normal file
11
app/templates/users/fragments/edit.html
Normal file
@@ -0,0 +1,11 @@
|
||||
{% extends 'extends/offcanvas.html' %}
|
||||
{% load i18n %}
|
||||
{% load crispy_forms_tags %}
|
||||
|
||||
{% block title %}{% translate 'Edit user' %}{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<form hx-post="{% url 'user_edit' pk=user.id %}" hx-target="#generic-offcanvas" novalidate>
|
||||
{% crispy form %}
|
||||
</form>
|
||||
{% endblock %}
|
||||
85
app/templates/users/fragments/list.html
Normal file
85
app/templates/users/fragments/list.html
Normal file
@@ -0,0 +1,85 @@
|
||||
{% load hijack %}
|
||||
{% load i18n %}
|
||||
<div class="container px-md-3 py-3 column-gap-5">
|
||||
<div class="tw-text-3xl fw-bold font-monospace tw-w-full mb-3">
|
||||
{% spaceless %}
|
||||
<div>{% translate 'Users' %}<span>
|
||||
<a class="text-decoration-none tw-text-2xl p-1 category-action"
|
||||
role="button"
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-title="{% translate "Add" %}"
|
||||
hx-get="{% url 'user_add' %}"
|
||||
hx-target="#generic-offcanvas">
|
||||
<i class="fa-solid fa-circle-plus fa-fw"></i></a>
|
||||
</span></div>
|
||||
{% endspaceless %}
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div id="tags-table">
|
||||
{% if users %}
|
||||
<div class="table-responsive">
|
||||
<c-config.search></c-config.search>
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" class="col-auto"></th>
|
||||
<th scope="col" class="col">{% translate 'Active' %}</th>
|
||||
<th scope="col" class="col">{% translate 'Name' %}</th>
|
||||
<th scope="col" class="col">{% translate 'Email' %}</th>
|
||||
<th scope="col" class="col">{% translate 'Superuser' %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for user in users %}
|
||||
<tr class="tag">
|
||||
<td class="col-auto">
|
||||
<div class="btn-group" role="group" aria-label="{% translate 'Actions' %}">
|
||||
<a class="btn btn-secondary btn-sm"
|
||||
role="button"
|
||||
hx-swap="innerHTML"
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-title="{% translate "Edit" %}"
|
||||
hx-get="{% url 'user_edit' pk=user.id %}"
|
||||
hx-target="#generic-offcanvas">
|
||||
<i class="fa-solid fa-pencil fa-fw"></i></a>
|
||||
{% if request.user|can_hijack:user and request.user != user %}
|
||||
<a class="btn btn-info btn-sm"
|
||||
role="button"
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-title="{% translate "Impersonate" %}"
|
||||
hx-post="{% url 'hijack:acquire' %}"
|
||||
hx-vals='{"user_pk":"{{user.id}}"}'
|
||||
hx-swap="none"
|
||||
_="on htmx:afterRequest(event) from me
|
||||
if event.detail.successful
|
||||
go to url '/'">
|
||||
<i class="fa-solid fa-mask fa-fw"></i></a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</td>
|
||||
<td class="col">
|
||||
{% if user.is_active %}
|
||||
<i class="fa-solid fa-solid fa-check text-success"></i>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="col">{{ user.first_name }} {{ user.last_name }}</td>
|
||||
<td class="col">{{ user.email }}</td>
|
||||
<td class="col">
|
||||
{% if user.is_superuser %}
|
||||
<i class="fa-solid fa-solid fa-check text-success"></i>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<c-msg.empty title="{% translate "No users" %}" remove-padding></c-msg.empty>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
8
app/templates/users/pages/index.html
Normal file
8
app/templates/users/pages/index.html
Normal file
@@ -0,0 +1,8 @@
|
||||
{% extends "layouts/base.html" %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{% translate 'Users' %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div hx-get="{% url 'users_list' %}" hx-trigger="load, updated from:window" class="show-loading"></div>
|
||||
{% endblock %}
|
||||
@@ -6,6 +6,7 @@ window.TomSelect = function createDynamicTomSelect(element) {
|
||||
// Basic configuration
|
||||
const config = {
|
||||
plugins: {},
|
||||
maxOptions: null,
|
||||
|
||||
// Extract 'create' option from data attribute
|
||||
create: element.dataset.create === 'true',
|
||||
|
||||
@@ -1,32 +1,32 @@
|
||||
Django~=5.1
|
||||
psycopg[binary]==3.2.3
|
||||
python-webpack-boilerplate==1.0.3
|
||||
psycopg[binary]==3.2.6
|
||||
python-webpack-boilerplate==1.0.4
|
||||
django-crispy-forms==2.3
|
||||
crispy-bootstrap5==2024.10
|
||||
django-browser-reload==1.12.1
|
||||
django-hijack==3.4.5
|
||||
django-filter==24.3
|
||||
django-debug-toolbar==4.3.0
|
||||
django-cachalot~=2.6.3
|
||||
django-cotton~=1.2.1
|
||||
crispy-bootstrap5==2025.4
|
||||
django-browser-reload==1.18.0
|
||||
django-hijack==3.7.1
|
||||
django-filter==25.1
|
||||
django-debug-toolbar==4.4.6
|
||||
django-cachalot~=2.7.0
|
||||
django-cotton~=1.5.2
|
||||
django-pwa~=2.0.1
|
||||
djangorestframework~=3.15.2
|
||||
drf-spectacular~=0.27.2
|
||||
django-import-export~=4.3.5
|
||||
djangorestframework~=3.16.0
|
||||
drf-spectacular~=0.28.0
|
||||
django-import-export~=4.3.7
|
||||
|
||||
gunicorn==23.0.0
|
||||
whitenoise[brotli]==6.6.0
|
||||
whitenoise[brotli]==6.9.0
|
||||
|
||||
watchfiles==0.24.0 # https://github.com/samuelcolvin/watchfiles
|
||||
procrastinate[django]~=2.14
|
||||
procrastinate[django]~=2.15.1
|
||||
|
||||
requests~=2.32.3
|
||||
|
||||
pytz~=2024.2
|
||||
pytz
|
||||
python-dateutil~=2.9.0.post0
|
||||
simpleeval~=1.0.0
|
||||
pydantic~=2.10.5
|
||||
simpleeval~=1.0.3
|
||||
pydantic~=2.11.3
|
||||
PyYAML~=6.0.2
|
||||
mistune~=3.1.1
|
||||
openpyxl~=3.1
|
||||
xlrd~=2.0
|
||||
mistune~=3.1.3
|
||||
openpyxl~=3.1.5
|
||||
xlrd~=2.0.1
|
||||
|
||||
Reference in New Issue
Block a user