Compare commits

..

22 Commits

Author SHA1 Message Date
eitchtee 4b8ccf426d chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-07-04 15:39:07 +00:00
Herculino Trotta 4805ce9e04 Merge pull request #557 from obervinov/obervinov/app-owned-oauth-api-tokens
feat(api): add API tokens and OAuth2 client support for external integrations
2026-07-04 12:38:44 -03:00
Herculino Trotta 845a8d846b Merge pull request #556 from eitchtee/dependabot/uv/cryptography-48.0.1
build(deps): bump cryptography from 48.0.0 to 48.0.1
2026-07-04 12:38:02 -03:00
Herculino Trotta 1497500c4f Merge pull request #559 from eitchtee/weblate
Translations update from Weblate
2026-07-04 12:37:46 -03:00
obervinov 9e9e60ccec fix: copy the raw API token from the input value
The copy button passed the token through Django's escapejs filter into the
hyperscript writeText() call, which turns every "-" into -. hyperscript
does not decode \u escapes, so any token containing "-" (common with
token_urlsafe) was copied corrupted and failed auth on paste. Copy from the
input's value instead, which holds the unescaped raw token.
2026-06-30 01:02:54 +04:00
obervinov ca14f77f41 test: cover demo-mode block on revoked-token delete
Parity with the existing demo-mode tests for token create/revoke.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 00:00:10 +04:00
obervinov 0fb37a59fa feat: add delete button for revoked API tokens
Revoked tokens previously stayed in the list with no way to remove them.
Adds a delete action (hard delete, scoped to the owner, gated behind
demo mode) shown on revoked rows, alongside the existing revoke action on
active ones.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 23:55:38 +04:00
sorcierwax e74d9177df locale(French): update translation
Currently translated at 100.0% (739 of 739 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/fr/
2026-06-27 21:57:19 +00:00
Herculino Trotta 106d721279 feat: add demo mode tests to ensure API is disabled on it 2026-06-27 18:02:31 -03:00
Herculino Trotta d0e9c05283 feat: disable oauth and token creation while on demo mode 2026-06-27 18:02:03 -03:00
sorcierwax 4e16831f4d locale(French): update translation
Currently translated at 97.1% (718 of 739 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/fr/
2026-06-27 20:57:19 +00:00
Herculino Trotta 7f5a91c11f fix: wrong Guam timezone string 2026-06-27 17:56:24 -03:00
Herculino Trotta 009a7038c8 style: improve api token box look 2026-06-27 17:56:05 -03:00
obervinov 4273c541c5 Add API tokens and OAuth2 client support for external integrations
- Personal API tokens (model, user-settings UI, admin, management command,
  DRF auth class) for non-interactive API access from automations like n8n.
  Raw token shown once; only a SHA-256 hash is stored; last_used_at writes
  are throttled.
- OAuth2 authorization server via django-oauth-toolkit with authorization
  server metadata and optional, off-by-default Dynamic Client Registration
  (RFC 7591), so remote OAuth/MCP clients can authenticate and self-register.
- Tests for token auth, DCR gating and the management commands, plus
  .env.example and README documentation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 19:15:31 +04:00
dependabot[bot] 5c4cb16a0a build(deps): bump cryptography from 48.0.0 to 48.0.1
Bumps [cryptography](https://github.com/pyca/cryptography) from 48.0.0 to 48.0.1.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/48.0.0...48.0.1)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 48.0.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-17 01:11:02 +00:00
Herculino Trotta 9641e169f2 Merge pull request #554 from eitchtee/dependabot/npm_and_yarn/frontend/multi-f57e1e291f
build(deps): bump esbuild and vite in /frontend
2026-06-12 23:42:06 -03:00
Herculino Trotta 25ff0214ab Merge pull request #555 from eitchtee/feat/tom-select-improvements
feat(tom-select): clear input after picking on a multi-item select
2026-06-12 23:38:31 -03:00
Herculino Trotta 0f9d333834 Merge pull request #553 from eitchtee/weblate
Translations update from Weblate
2026-06-12 23:37:59 -03:00
dependabot[bot] bb23ac6df9 build(deps): bump esbuild and vite in /frontend
Removes [esbuild](https://github.com/evanw/esbuild). It's no longer used after updating ancestor dependency [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite). These dependencies need to be updated together.


Removes `esbuild`

Updates `vite` from 7.3.2 to 8.0.16
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.16/packages/vite)

---
updated-dependencies:
- dependency-name: esbuild
  dependency-version:
  dependency-type: indirect
- dependency-name: vite
  dependency-version: 8.0.16
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-12 23:11:26 +00:00
Pawel Augustyn 7db0fcf097 locale(Polish): update translation
Currently translated at 73.8% (546 of 739 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/pl/
2026-06-08 07:57:18 +00:00
Pawel Augustyn 02896f21ed locale(Polish): update translation
Currently translated at 73.8% (546 of 739 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/pl/
2026-06-08 06:57:18 +00:00
Pawel Augustyn 5082c17d0f locale(Polish): update translation
Currently translated at 73.7% (545 of 739 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/pl/
2026-06-08 05:57:18 +00:00
43 changed files with 5698 additions and 1940 deletions
+18
View File
@@ -38,3 +38,21 @@ TASK_WORKERS=1 # This only work if you're using the single container option. Inc
#OIDC_CLIENT_SECRET="" #OIDC_CLIENT_SECRET=""
#OIDC_SERVER_URL="" #OIDC_SERVER_URL=""
#OIDC_ALLOW_SIGNUP=true #OIDC_ALLOW_SIGNUP=true
# Personal access tokens. How often (seconds) a token's last_used_at is rewritten.
#API_TOKEN_LAST_USED_UPDATE_INTERVAL=600
# MCP OAuth Application. Uncomment to auto-create/update the OAuth client
# used by remote MCP integrations after migrations complete.
#MCP_OAUTH_CLIENT_NAME="WYGIWYH MCP"
#MCP_OAUTH_CLIENT_ID="mcp-wygiwyh"
#MCP_OAUTH_CLIENT_SECRET="<INSERT A SAFE SECRET HERE>"
#MCP_OAUTH_REDIRECT_URIS="http://127.0.0.1:8765/callback"
#MCP_OAUTH_SKIP_AUTHORIZATION=false
# Dynamic Client Registration (RFC 7591). Disabled by default because an open
# registration endpoint lets anyone create OAuth applications. Enable only if
# remote MCP clients must self-register, and optionally require an initial
# access token (sent as "Authorization: Bearer <token>" on /oauth/register/).
#OAUTH2_DCR_ENABLED=false
#OAUTH2_DCR_INITIAL_ACCESS_TOKEN=""
+43
View File
@@ -182,6 +182,49 @@ When configuring your OIDC provider, you will need to provide a callback URL (al
Replace `https://your.wygiwyh.domain` with the actual URL where your WYGIWYH instance is accessible. And `<OIDC_CLIENT_NAME>` with the slugfied value set in OIDC_CLIENT_NAME or the default `openid-connect` if you haven't set this variable. Replace `https://your.wygiwyh.domain` with the actual URL where your WYGIWYH instance is accessible. And `<OIDC_CLIENT_NAME>` with the slugfied value set in OIDC_CLIENT_NAME or the default `openid-connect` if you haven't set this variable.
### API Tokens for n8n and other automations
If you need a stable non-browser credential for automations such as `n8n`, WYGIWYH can also issue its own user-bound API tokens. This avoids Keycloak login flows and can be used directly against `/api/`.
Create a token from the container or application shell:
```bash
python manage.py create_api_token you@example.com --name n8n
```
Optional expiration:
```bash
python manage.py create_api_token you@example.com --name n8n --expires-in-days 90
```
The command prints the raw token **once**. Store it in your secret manager and use it like this:
```bash
curl -H "Authorization: Token wygiwyh_pat_<key>.<secret>" \
https://your.wygiwyh.domain/api/accounts/
```
Recommended usage for automation is a dedicated WYGIWYH user such as `n8n@...`, so API ownership and audit trails stay separate from your interactive account.
### MCP OAuth Application Bootstrap
If you want WYGIWYH to act as the OAuth authorization server for a remote MCP server, you can let the container create or update the OAuth application automatically on startup.
Set these environment variables:
| Variable | Description |
|---|---|
| `MCP_OAUTH_CLIENT_NAME` | Optional display name for the OAuth client. Defaults to `WYGIWYH MCP`. |
| `MCP_OAUTH_CLIENT_ID` | Client ID that will be created or updated in `django-oauth-toolkit`. |
| `MCP_OAUTH_CLIENT_SECRET` | Client secret for that OAuth application. |
| `MCP_OAUTH_REDIRECT_URIS` | Space-separated redirect URIs allowed for the MCP OAuth client. |
| `MCP_OAUTH_SKIP_AUTHORIZATION` | Set to `true` to bypass the consent screen. Defaults to `false`. |
When these variables are present, startup runs `python manage.py setup_oauth` after migrations and keeps the OAuth application in sync without needing a manual Django admin step.
WYGIWYH also exposes OAuth Dynamic Client Registration at `/.well-known/oauth-authorization-server` via `registration_endpoint`, so MCP clients that support RFC 7591 can self-register instead of relying on a pre-created `MCP_OAUTH_CLIENT_ID` / `MCP_OAUTH_CLIENT_SECRET`. The current implementation supports `authorization_code` + PKCE clients using `none`, `client_secret_basic`, or `client_secret_post` token endpoint auth methods.
# How it works # How it works
Check out our [Wiki](https://github.com/eitchtee/WYGIWYH/wiki) for more information. Check out our [Wiki](https://github.com/eitchtee/WYGIWYH/wiki) for more information.
+33 -2
View File
@@ -72,6 +72,7 @@ INSTALLED_APPS = [
"rest_framework", "rest_framework",
"rest_framework.authtoken", "rest_framework.authtoken",
"drf_spectacular", "drf_spectacular",
"oauth2_provider",
"django_cotton", "django_cotton",
"apps.rules.apps.RulesConfig", "apps.rules.apps.RulesConfig",
"apps.calendar_view.apps.CalendarViewConfig", "apps.calendar_view.apps.CalendarViewConfig",
@@ -344,6 +345,11 @@ DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
LOGIN_REDIRECT_URL = "/" LOGIN_REDIRECT_URL = "/"
LOGIN_URL = "/login/" LOGIN_URL = "/login/"
LOGOUT_REDIRECT_URL = "/login/" LOGOUT_REDIRECT_URL = "/login/"
# Public base URL advertised in OAuth metadata. Falls back to the first entry
# of the existing space-separated URL env var, then to the request host.
PUBLIC_BASE_URL = (
os.getenv("PUBLIC_BASE_URL", "") or os.getenv("URL", "").split(" ")[0]
).rstrip("/")
# Allauth settings # Allauth settings
AUTHENTICATION_BACKENDS = [ AUTHENTICATION_BACKENDS = [
@@ -382,6 +388,12 @@ SOCIALACCOUNT_EMAIL_AUTHENTICATION_AUTO_CONNECT = True
ACCOUNT_ADAPTER = "allauth.account.adapter.DefaultAccountAdapter" ACCOUNT_ADAPTER = "allauth.account.adapter.DefaultAccountAdapter"
SOCIALACCOUNT_ADAPTER = "apps.users.adapters.AutoConnectSocialAccountAdapter" SOCIALACCOUNT_ADAPTER = "apps.users.adapters.AutoConnectSocialAccountAdapter"
# Personal access tokens. last_used_at is only rewritten once per interval to
# avoid a database write on every authenticated request.
API_TOKEN_LAST_USED_UPDATE_INTERVAL = int(
os.getenv("API_TOKEN_LAST_USED_UPDATE_INTERVAL", "600")
)
# CRISPY FORMS # CRISPY FORMS
CRISPY_ALLOWED_TEMPLATE_PACKS = [ CRISPY_ALLOWED_TEMPLATE_PACKS = [
"crispy_forms/pure_text", "crispy_forms/pure_text",
@@ -446,14 +458,33 @@ REST_FRAMEWORK = {
"rest_framework.filters.OrderingFilter", "rest_framework.filters.OrderingFilter",
], ],
"DEFAULT_AUTHENTICATION_CLASSES": [ "DEFAULT_AUTHENTICATION_CLASSES": [
"rest_framework.authentication.BasicAuthentication", "oauth2_provider.contrib.rest_framework.OAuth2Authentication",
"rest_framework.authentication.SessionAuthentication", "apps.api.authentication.APITokenAuthentication",
"rest_framework.authentication.TokenAuthentication", "rest_framework.authentication.TokenAuthentication",
"rest_framework.authentication.SessionAuthentication",
"rest_framework.authentication.BasicAuthentication",
], ],
"DEFAULT_PAGINATION_CLASS": "apps.api.custom.pagination.CustomPageNumberPagination", "DEFAULT_PAGINATION_CLASS": "apps.api.custom.pagination.CustomPageNumberPagination",
"DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema", "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
} }
OAUTH2_PROVIDER = {
"PKCE_REQUIRED": True,
"ACCESS_TOKEN_EXPIRE_SECONDS": int(
os.getenv("OAUTH2_ACCESS_TOKEN_EXPIRE_SECONDS", "3600")
),
"SCOPES": {
"mcp": "Access WYGIWYH from MCP clients.",
},
}
# Dynamic Client Registration (RFC 7591). Disabled by default: an open
# registration endpoint lets anyone create OAuth applications. Enable it only
# when remote MCP clients must self-register, and optionally require an initial
# access token presented as `Authorization: Bearer <token>`.
OAUTH2_DCR_ENABLED = os.getenv("OAUTH2_DCR_ENABLED", "false").lower() == "true"
OAUTH2_DCR_INITIAL_ACCESS_TOKEN = os.getenv("OAUTH2_DCR_INITIAL_ACCESS_TOKEN", "")
SPECTACULAR_SETTINGS = { SPECTACULAR_SETTINGS = {
"TITLE": "WYGIWYH API", "TITLE": "WYGIWYH API",
"DESCRIPTION": "A no-frills expense tracker", "DESCRIPTION": "A no-frills expense tracker",
+37
View File
@@ -22,6 +22,29 @@ from drf_spectacular.views import (
SpectacularSwaggerView, SpectacularSwaggerView,
) )
from allauth.socialaccount.providers.openid_connect.views import login, callback from allauth.socialaccount.providers.openid_connect.views import login, callback
from apps.common.decorators.demo import disabled_on_demo
from apps.common.oauth_views import (
authorization_server_metadata,
dynamic_client_registration,
)
from oauth2_provider import urls as _dot_urls
def _decorate_included(patterns, decorator):
"""Apply ``decorator`` to every view callback inside an included URLconf.
django.urls does not support decorating ``include()`` directly, so we wrap
each URLPattern's callback here. The OAuth2 endpoints issue credentials, so
gate them behind the same DEMO-mode guard used elsewhere.
"""
wrapped = []
for pattern in patterns:
pattern.callback = decorator(pattern.callback)
wrapped.append(pattern)
return wrapped
_oauth_patterns = _decorate_included(_dot_urls.urlpatterns, disabled_on_demo)
urlpatterns = [ urlpatterns = [
@@ -39,6 +62,20 @@ urlpatterns = [
name="swagger-ui", name="swagger-ui",
), ),
path("auth/", include("allauth.urls")), # allauth urls path("auth/", include("allauth.urls")), # allauth urls
path(
"oauth/",
include((_oauth_patterns, _dot_urls.app_name), namespace="oauth2_provider"),
),
path(
".well-known/oauth-authorization-server",
disabled_on_demo(authorization_server_metadata),
name="oauth-authorization-server-metadata",
),
path(
"oauth/register/",
disabled_on_demo(dynamic_client_registration),
name="oauth-dynamic-client-registration",
),
# path("auth/oidc/<str:provider_id>/login/", login, name="openid_connect_login"), # path("auth/oidc/<str:provider_id>/login/", login, name="openid_connect_login"),
# path( # path(
# "auth/oidc/<str:provider_id>/login/callback/", # "auth/oidc/<str:provider_id>/login/callback/",
+64
View File
@@ -0,0 +1,64 @@
from datetime import timedelta
from django.conf import settings
from django.utils import timezone
from rest_framework.authentication import BaseAuthentication, get_authorization_header
from rest_framework.exceptions import AuthenticationFailed
from apps.users.models import APIToken
class APITokenAuthentication(BaseAuthentication):
keyword = "Token"
def authenticate(self, request):
auth = get_authorization_header(request).split()
if not auth or auth[0].lower() != self.keyword.lower().encode():
return None
if len(auth) != 2:
raise AuthenticationFailed("Invalid API token header.")
try:
raw_token = auth[1].decode("utf-8")
except UnicodeDecodeError as exc:
raise AuthenticationFailed("Invalid API token header.") from exc
# Only claim tokens carrying our prefix; otherwise return None so the
# request falls through to other authenticators (e.g. DRF's built-in
# TokenAuthentication, which shares the "Token" keyword).
if not raw_token.startswith(APIToken.TOKEN_PREFIX):
return None
try:
token_key, token_secret = APIToken.parse_raw_token(raw_token)
except ValueError as exc:
raise AuthenticationFailed("Invalid API token.") from exc
token = APIToken.objects.select_related("user").filter(token_key=token_key).first()
if token is None or not token.check_secret(token_secret):
raise AuthenticationFailed("Invalid API token.")
if token.revoked_at is not None:
raise AuthenticationFailed("API token has been revoked.")
if token.is_expired():
raise AuthenticationFailed("API token has expired.")
if not token.user.is_active:
raise AuthenticationFailed("User account is disabled.")
self._touch_last_used(token)
return (token.user, token)
@staticmethod
def _touch_last_used(token):
# Avoid a write on every request: only refresh once per interval.
now = timezone.now()
interval = settings.API_TOKEN_LAST_USED_UPDATE_INTERVAL
if (
token.last_used_at is None
or (now - token.last_used_at) >= timedelta(seconds=interval)
):
token.last_used_at = now
token.save(update_fields=["last_used_at"])
def authenticate_header(self, request):
return self.keyword
+109
View File
@@ -0,0 +1,109 @@
from datetime import timedelta
from django.contrib.auth import get_user_model
from django.test import RequestFactory, TestCase, override_settings
from django.utils import timezone
from rest_framework.exceptions import AuthenticationFailed
from apps.api.authentication import APITokenAuthentication
from apps.users.models import APIToken
class APITokenAuthenticationTests(TestCase):
def setUp(self):
self.factory = RequestFactory()
self.authentication = APITokenAuthentication()
self.user = get_user_model().objects.create_user(
email="automation@example.com",
password="test-password",
)
def test_returns_none_without_token_header(self):
request = self.factory.get("/api/accounts/")
self.assertIsNone(self.authentication.authenticate(request))
def test_authenticates_valid_api_token(self):
token, raw_token = APIToken.objects.create_token(user=self.user, name="n8n")
request = self.factory.get(
"/api/accounts/",
HTTP_AUTHORIZATION=f"Token {raw_token}",
)
authenticated_user, authenticated_token = self.authentication.authenticate(request)
self.assertEqual(authenticated_user, self.user)
self.assertEqual(authenticated_token.pk, token.pk)
token.refresh_from_db()
self.assertIsNotNone(token.last_used_at)
def test_rejects_expired_api_token(self):
token, raw_token = APIToken.objects.create_token(user=self.user, name="n8n")
token.expires_at = timezone.now() - timedelta(minutes=1)
token.save(update_fields=["expires_at"])
request = self.factory.get(
"/api/accounts/",
HTTP_AUTHORIZATION=f"Token {raw_token}",
)
with self.assertRaisesRegex(AuthenticationFailed, "expired"):
self.authentication.authenticate(request)
def test_rejects_revoked_api_token(self):
token, raw_token = APIToken.objects.create_token(user=self.user, name="n8n")
token.revoked_at = timezone.now()
token.save(update_fields=["revoked_at"])
request = self.factory.get(
"/api/accounts/",
HTTP_AUTHORIZATION=f"Token {raw_token}",
)
with self.assertRaisesRegex(AuthenticationFailed, "revoked"):
self.authentication.authenticate(request)
def test_stores_secret_as_sha256_not_raw(self):
token, raw_token = APIToken.objects.create_token(user=self.user, name="n8n")
_key, secret = APIToken.parse_raw_token(raw_token)
self.assertNotIn(secret, token.token_hash)
self.assertEqual(len(token.token_hash), 64)
self.assertTrue(token.check_secret(secret))
def test_falls_through_for_non_prefixed_token(self):
request = self.factory.get(
"/api/accounts/",
HTTP_AUTHORIZATION="Token deadbeefdeadbeefdeadbeef",
)
# Not our prefix: return None so another authenticator can handle it.
self.assertIsNone(self.authentication.authenticate(request))
@override_settings(API_TOKEN_LAST_USED_UPDATE_INTERVAL=600)
def test_last_used_at_is_throttled_within_interval(self):
token, raw_token = APIToken.objects.create_token(user=self.user, name="n8n")
request = self.factory.get(
"/api/accounts/",
HTTP_AUTHORIZATION=f"Token {raw_token}",
)
self.authentication.authenticate(request)
token.refresh_from_db()
first_used = token.last_used_at
self.assertIsNotNone(first_used)
self.authentication.authenticate(request)
token.refresh_from_db()
self.assertEqual(token.last_used_at, first_used)
@override_settings(API_TOKEN_LAST_USED_UPDATE_INTERVAL=0)
def test_last_used_at_updates_after_interval(self):
token, raw_token = APIToken.objects.create_token(user=self.user, name="n8n")
token.last_used_at = timezone.now() - timedelta(minutes=5)
token.save(update_fields=["last_used_at"])
stale = token.last_used_at
request = self.factory.get(
"/api/accounts/",
HTTP_AUTHORIZATION=f"Token {raw_token}",
)
self.authentication.authenticate(request)
token.refresh_from_db()
self.assertGreater(token.last_used_at, stale)
+166
View File
@@ -0,0 +1,166 @@
from datetime import timedelta
from django.contrib.auth import get_user_model
from django.test import TestCase, override_settings
from django.urls import reverse
from django.utils import timezone
from oauth2_provider.models import get_access_token_model, get_application_model
from apps.users.models import APIToken
User = get_user_model()
Application = get_application_model()
AccessToken = get_access_token_model()
@override_settings(DEMO=True)
class DemoModeAPITests(TestCase):
"""The DEMO-mode gate (apps.api.permissions.NotInDemoMode) must reject
API access regardless of the authentication method used, including the
PAT and OAuth2 backends introduced for MCP integrations."""
def setUp(self):
self.user = User.objects.create_user(
email="demo@example.com",
password="test-password",
)
def test_pat_cannot_access_api_in_demo_mode(self):
_token, raw_token = APIToken.objects.create_token(
user=self.user, name="n8n"
)
response = self.client.get(
"/api/accounts/",
HTTP_AUTHORIZATION=f"Token {raw_token}",
)
self.assertEqual(response.status_code, 403)
def test_oauth_access_token_cannot_access_api_in_demo_mode(self):
app = Application.objects.create(
name="Test Client",
client_type=Application.CLIENT_CONFIDENTIAL,
authorization_grant_type=Application.GRANT_AUTHORIZATION_CODE,
redirect_uris="http://127.0.0.1:8765/callback",
client_secret="secret",
)
access_token = AccessToken.objects.create(
user=self.user,
scope="mcp",
expires=timezone.now() + timedelta(hours=1),
token="demo-oauth-access-token-xyz",
application=app,
)
response = self.client.get(
"/api/accounts/",
HTTP_AUTHORIZATION=f"Bearer {access_token.token}",
)
self.assertEqual(response.status_code, 403)
def test_superuser_pat_can_access_api_in_demo_mode(self):
admin = User.objects.create_superuser(
email="admin@example.com",
password="test-password",
)
_token, raw_token = APIToken.objects.create_token(
user=admin, name="admin"
)
response = self.client.get(
"/api/accounts/",
HTTP_AUTHORIZATION=f"Token {raw_token}",
)
# NotInDemoMode grants superusers access in DEMO mode; the request is
# authenticated by the PAT, so the API responds normally (never 403).
self.assertNotEqual(response.status_code, 403)
@override_settings(DEMO=True)
class DemoModeOAuthEndpointTests(TestCase):
"""OAuth2 issuance and discovery endpoints must be disabled in DEMO mode
so demo tenants cannot obtain (or even discover) credentials."""
def setUp(self):
self.user = User.objects.create_user(
email="demo@example.com",
password="test-password",
)
def test_oauth_authorize_rejects_non_superuser_in_demo_mode(self):
self.client.force_login(self.user)
response = self.client.get(reverse("oauth2_provider:authorize"))
self.assertEqual(response.status_code, 403)
def test_oauth_token_rejects_non_superuser_in_demo_mode(self):
self.client.force_login(self.user)
response = self.client.post(reverse("oauth2_provider:token"))
self.assertEqual(response.status_code, 403)
def test_oauth_authorization_server_metadata_rejects_in_demo_mode(self):
response = self.client.get(reverse("oauth-authorization-server-metadata"))
self.assertEqual(response.status_code, 403)
def test_oauth_dynamic_client_registration_rejects_in_demo_mode(self):
response = self.client.post(
reverse("oauth-dynamic-client-registration"),
data="{}",
content_type="application/json",
)
self.assertEqual(response.status_code, 403)
@override_settings(DEMO=True)
class DemoModeAPITokenViewsTests(TestCase):
"""The PAT management UI must be disabled in DEMO mode just like the
other mutating user views."""
def setUp(self):
self.user = User.objects.create_user(
email="demo@example.com",
password="test-password",
)
self.client.force_login(self.user)
self.htmx_headers = {"HTTP_HX_REQUEST": "true"}
def test_cannot_create_api_token_from_ui_in_demo_mode(self):
response = self.client.post(
reverse("user_api_token_add"),
{"name": "n8n", "expires_in_days": "30"},
**self.htmx_headers,
)
self.assertEqual(response.status_code, 403)
self.assertEqual(APIToken.objects.count(), 0)
def test_cannot_revoke_api_token_from_ui_in_demo_mode(self):
token, _ = APIToken.objects.create_token(user=self.user, name="n8n")
response = self.client.delete(
reverse("user_api_token_revoke", kwargs={"token_id": token.id}),
**self.htmx_headers,
)
self.assertEqual(response.status_code, 403)
token.refresh_from_db()
self.assertIsNone(token.revoked_at)
def test_cannot_delete_api_token_from_ui_in_demo_mode(self):
token, _ = APIToken.objects.create_token(user=self.user, name="n8n")
response = self.client.delete(
reverse("user_api_token_delete", kwargs={"token_id": token.id}),
**self.htmx_headers,
)
self.assertEqual(response.status_code, 403)
self.assertTrue(APIToken.objects.filter(id=token.id).exists())
@@ -0,0 +1,58 @@
from datetime import timedelta
from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand, CommandError
from django.utils import timezone
from apps.users.models import APIToken
class Command(BaseCommand):
help = "Creates a hashed API token for a WYGIWYH user and prints the raw token once."
def add_arguments(self, parser):
parser.add_argument("email", help="WYGIWYH user email that will own this token.")
parser.add_argument(
"--name",
default="n8n",
help="Human-readable token name. Defaults to 'n8n'.",
)
parser.add_argument(
"--expires-in-days",
type=int,
default=None,
help="Optional token lifetime in whole days.",
)
def handle(self, *args, **options):
email = options["email"].strip()
name = options["name"].strip()
expires_in_days = options["expires_in_days"]
if not email:
raise CommandError("Email is required.")
if not name:
raise CommandError("Token name cannot be empty.")
if expires_in_days is not None and expires_in_days <= 0:
raise CommandError("--expires-in-days must be greater than zero.")
user = get_user_model().objects.filter(email__iexact=email).first()
if user is None:
raise CommandError(f"No WYGIWYH user exists for '{email}'.")
expires_at = None
if expires_in_days is not None:
expires_at = timezone.now() + timedelta(days=expires_in_days)
token, raw_token = APIToken.objects.create_token(
user=user,
name=name,
expires_at=expires_at,
)
self.stdout.write(
self.style.SUCCESS(
f"Created API token '{token.name}' for {user.email} ({token.token_key})."
)
)
self.stdout.write(raw_token)
@@ -0,0 +1,129 @@
import os
from django.contrib.auth.hashers import check_password
from django.core.exceptions import ValidationError
from django.core.management.base import BaseCommand, CommandError
from oauth2_provider.models import get_application_model
Application = get_application_model()
def _get_env(name: str) -> str:
return os.getenv(name, "").strip()
def _get_bool_env(name: str, default: bool = False) -> bool:
raw = _get_env(name)
if not raw:
return default
return raw.lower() in {"1", "true", "yes", "on"}
class Command(BaseCommand):
help = (
"Creates or updates the OAuth application used by MCP clients when "
"MCP_OAUTH_CLIENT_* environment variables are configured."
)
def handle(self, *args, **options):
client_id = _get_env("MCP_OAUTH_CLIENT_ID")
client_secret = _get_env("MCP_OAUTH_CLIENT_SECRET")
redirect_uris = " ".join(_get_env("MCP_OAUTH_REDIRECT_URIS").split())
name = _get_env("MCP_OAUTH_CLIENT_NAME") or "WYGIWYH MCP"
skip_authorization = _get_bool_env("MCP_OAUTH_SKIP_AUTHORIZATION", default=False)
if not any([client_id, client_secret, redirect_uris]):
self.stdout.write(
self.style.NOTICE(
"MCP OAuth client env vars are not set. Skipping OAuth application setup."
)
)
return
missing = []
if not client_id:
missing.append("MCP_OAUTH_CLIENT_ID")
if not client_secret:
missing.append("MCP_OAUTH_CLIENT_SECRET")
if not redirect_uris:
missing.append("MCP_OAUTH_REDIRECT_URIS")
if missing:
raise CommandError(
"Missing required MCP OAuth settings: " + ", ".join(missing)
)
application, created = Application.objects.get_or_create(
client_id=client_id,
defaults={
"name": name,
"client_type": Application.CLIENT_CONFIDENTIAL,
"authorization_grant_type": Application.GRANT_AUTHORIZATION_CODE,
"redirect_uris": redirect_uris,
"skip_authorization": skip_authorization,
"client_secret": client_secret,
"hash_client_secret": True,
},
)
updated_fields = []
if application.name != name:
application.name = name
updated_fields.append("name")
if application.client_type != Application.CLIENT_CONFIDENTIAL:
application.client_type = Application.CLIENT_CONFIDENTIAL
updated_fields.append("client_type")
if (
application.authorization_grant_type
!= Application.GRANT_AUTHORIZATION_CODE
):
application.authorization_grant_type = Application.GRANT_AUTHORIZATION_CODE
updated_fields.append("authorization_grant_type")
if application.redirect_uris != redirect_uris:
application.redirect_uris = redirect_uris
updated_fields.append("redirect_uris")
if application.skip_authorization != skip_authorization:
application.skip_authorization = skip_authorization
updated_fields.append("skip_authorization")
if application.hash_client_secret is not True:
application.hash_client_secret = True
updated_fields.append("hash_client_secret")
if not application.client_secret or not check_password(
client_secret,
application.client_secret,
):
application.client_secret = client_secret
updated_fields.append("client_secret")
try:
application.full_clean()
except ValidationError as exc:
errors = "; ".join(
f"{field}: {', '.join(messages)}"
for field, messages in exc.message_dict.items()
)
raise CommandError(f"Invalid MCP OAuth application settings: {errors}") from exc
if created:
application.save()
self.stdout.write(
self.style.SUCCESS(
f"Created MCP OAuth application '{application.client_id}'."
)
)
return
if updated_fields:
application.save(update_fields=updated_fields)
self.stdout.write(
self.style.SUCCESS(
f"Updated MCP OAuth application '{application.client_id}'."
)
)
return
self.stdout.write(
self.style.SUCCESS(
f"MCP OAuth application '{application.client_id}' is already up to date."
)
)
+253
View File
@@ -0,0 +1,253 @@
import hmac
import json
import time
from secrets import token_urlsafe
from django.conf import settings
from django.core.exceptions import ValidationError
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from oauth2_provider.models import get_application_model
Application = get_application_model()
SUPPORTED_TOKEN_ENDPOINT_AUTH_METHODS = {
"none": Application.CLIENT_PUBLIC,
"client_secret_basic": Application.CLIENT_CONFIDENTIAL,
"client_secret_post": Application.CLIENT_CONFIDENTIAL,
}
SUPPORTED_GRANT_TYPES = {"authorization_code", "refresh_token"}
SUPPORTED_RESPONSE_TYPES = {"code"}
def _base_url(request):
return settings.PUBLIC_BASE_URL or request.build_absolute_uri("/").rstrip("/")
def _json_error(error, error_description, status=400):
response = JsonResponse(
{"error": error, "error_description": error_description},
status=status,
)
response["Cache-Control"] = "no-store"
response["Pragma"] = "no-cache"
return response
def _set_no_store_headers(response):
response["Cache-Control"] = "no-store"
response["Pragma"] = "no-cache"
return response
def _parse_json_request_body(request):
try:
payload = json.loads(request.body.decode("utf-8"))
except (UnicodeDecodeError, json.JSONDecodeError) as exc:
raise ValueError("Request body must be valid JSON.") from exc
if not isinstance(payload, dict):
raise ValueError("Request body must be a JSON object.")
return payload
def _get_string_list(payload, field_name, *, required=False, default=None):
value = payload.get(field_name, default)
if value is None:
if required:
raise ValueError(f"'{field_name}' is required.")
return None
if not isinstance(value, list) or not value:
raise ValueError(f"'{field_name}' must be a non-empty array of strings.")
normalized = []
for item in value:
if not isinstance(item, str) or not item.strip():
raise ValueError(f"'{field_name}' must contain only non-empty strings.")
normalized.append(item.strip())
return normalized
def _get_supported_scopes():
return set(settings.OAUTH2_PROVIDER.get("SCOPES", {}).keys())
def _dcr_initial_access_token_ok(request):
"""Validate the optional RFC 7591 initial access token, if one is configured."""
expected = settings.OAUTH2_DCR_INITIAL_ACCESS_TOKEN
if not expected:
return True
header = request.META.get("HTTP_AUTHORIZATION", "")
scheme, _, value = header.partition(" ")
if scheme.lower() != "bearer" or not value:
return False
return hmac.compare_digest(value, expected)
@require_http_methods(["GET"])
def authorization_server_metadata(request):
base_url = _base_url(request)
metadata = {
"issuer": base_url,
"authorization_endpoint": f"{base_url}/oauth/authorize/",
"token_endpoint": f"{base_url}/oauth/token/",
"revocation_endpoint": f"{base_url}/oauth/revoke_token/",
"introspection_endpoint": f"{base_url}/oauth/introspect/",
"scopes_supported": sorted(settings.OAUTH2_PROVIDER["SCOPES"].keys()),
"response_types_supported": ["code"],
"grant_types_supported": ["authorization_code", "refresh_token"],
"token_endpoint_auth_methods_supported": [
"none",
"client_secret_basic",
"client_secret_post",
],
"code_challenge_methods_supported": ["S256"],
}
# Only advertise registration when DCR is actually enabled.
if settings.OAUTH2_DCR_ENABLED:
metadata["registration_endpoint"] = f"{base_url}/oauth/register/"
return JsonResponse(metadata)
@csrf_exempt
@require_http_methods(["POST"])
def dynamic_client_registration(request):
if not settings.OAUTH2_DCR_ENABLED:
return _json_error(
"not_found",
"Dynamic client registration is disabled.",
status=404,
)
if not _dcr_initial_access_token_ok(request):
return _json_error(
"invalid_token",
"A valid initial access token is required to register a client.",
status=401,
)
try:
payload = _parse_json_request_body(request)
redirect_uris = _get_string_list(payload, "redirect_uris", required=True)
grant_types = _get_string_list(
payload,
"grant_types",
default=["authorization_code"],
)
response_types = _get_string_list(
payload,
"response_types",
default=["code"],
)
except ValueError as exc:
return _json_error("invalid_client_metadata", str(exc))
unsupported_grant_types = sorted(set(grant_types) - SUPPORTED_GRANT_TYPES)
if unsupported_grant_types:
return _json_error(
"invalid_client_metadata",
"Unsupported grant_types: " + ", ".join(unsupported_grant_types),
)
if "authorization_code" not in grant_types:
return _json_error(
"invalid_client_metadata",
"grant_types must include 'authorization_code'.",
)
unsupported_response_types = sorted(set(response_types) - SUPPORTED_RESPONSE_TYPES)
if unsupported_response_types:
return _json_error(
"invalid_client_metadata",
"Unsupported response_types: "
+ ", ".join(unsupported_response_types),
)
if "code" not in response_types:
return _json_error(
"invalid_client_metadata",
"response_types must include 'code'.",
)
token_endpoint_auth_method = payload.get(
"token_endpoint_auth_method",
"client_secret_basic",
)
if token_endpoint_auth_method not in SUPPORTED_TOKEN_ENDPOINT_AUTH_METHODS:
return _json_error(
"invalid_client_metadata",
"Unsupported token_endpoint_auth_method: "
+ token_endpoint_auth_method,
)
supported_scopes = _get_supported_scopes()
raw_scope = payload.get("scope", "mcp")
if not isinstance(raw_scope, str):
return _json_error(
"invalid_client_metadata",
"'scope' must be a space-delimited string.",
)
requested_scope = raw_scope.strip() or "mcp"
requested_scopes = set(requested_scope.split())
unsupported_scopes = sorted(requested_scopes - supported_scopes)
if unsupported_scopes:
return _json_error(
"invalid_client_metadata",
"Unsupported scope values: " + ", ".join(unsupported_scopes),
)
client_name = str(payload.get("client_name", "Dynamic MCP Client")).strip()
if not client_name:
client_name = "Dynamic MCP Client"
client_secret = None
client_type = SUPPORTED_TOKEN_ENDPOINT_AUTH_METHODS[token_endpoint_auth_method]
if client_type == Application.CLIENT_CONFIDENTIAL:
client_secret = token_urlsafe(48)
application = Application(
name=client_name,
client_type=client_type,
authorization_grant_type=Application.GRANT_AUTHORIZATION_CODE,
redirect_uris=" ".join(redirect_uris),
skip_authorization=False,
hash_client_secret=True,
client_secret=client_secret or "",
)
try:
application.full_clean()
except ValidationError as exc:
errors = []
for field, messages in exc.message_dict.items():
errors.extend(f"{field}: {message}" for message in messages)
return _json_error(
"invalid_client_metadata",
"; ".join(errors),
)
application.save()
response_payload = {
"client_id": application.client_id,
"client_id_issued_at": int(time.time()),
"client_name": client_name,
"redirect_uris": redirect_uris,
# Report what was actually provisioned, not the raw request echo. The app
# is created with the authorization_code grant; refresh_token is implicit
# to that grant in django-oauth-toolkit rather than a separate capability.
"grant_types": sorted(set(grant_types) & SUPPORTED_GRANT_TYPES),
"response_types": sorted(set(response_types) & SUPPORTED_RESPONSE_TYPES),
"scope": " ".join(sorted(requested_scopes)),
"token_endpoint_auth_method": token_endpoint_auth_method,
}
if client_secret is not None:
response_payload["client_secret"] = client_secret
response_payload["client_secret_expires_at"] = 0
return _set_no_store_headers(JsonResponse(response_payload, status=201))
+298
View File
@@ -0,0 +1,298 @@
import os
import json
from io import StringIO
from unittest.mock import patch
from django.contrib.auth import get_user_model
from django.contrib.auth.hashers import check_password
from django.core.management import call_command
from django.test import SimpleTestCase, TestCase, override_settings
from django.utils import timezone
from django.urls import reverse
from oauth2_provider.models import get_application_model
from apps.users.models import APIToken
Application = get_application_model()
@override_settings(
PUBLIC_BASE_URL="https://wygiwyh.example.com",
SECRET_KEY="test-secret-key",
OAUTH2_PROVIDER={"SCOPES": {"mcp": "Access WYGIWYH from MCP clients."}},
)
class AuthorizationServerMetadataTests(SimpleTestCase):
@override_settings(OAUTH2_DCR_ENABLED=True)
def test_returns_oauth_authorization_server_metadata(self):
response = self.client.get(reverse("oauth-authorization-server-metadata"))
self.assertEqual(response.status_code, 200)
self.assertEqual(response.json()["issuer"], "https://wygiwyh.example.com")
self.assertEqual(
response.json()["authorization_endpoint"],
"https://wygiwyh.example.com/oauth/authorize/",
)
self.assertEqual(
response.json()["registration_endpoint"],
"https://wygiwyh.example.com/oauth/register/",
)
self.assertEqual(response.json()["scopes_supported"], ["mcp"])
self.assertIn("none", response.json()["token_endpoint_auth_methods_supported"])
@override_settings(OAUTH2_DCR_ENABLED=False)
def test_omits_registration_endpoint_when_dcr_disabled(self):
response = self.client.get(reverse("oauth-authorization-server-metadata"))
self.assertEqual(response.status_code, 200)
self.assertNotIn("registration_endpoint", response.json())
@override_settings(
PUBLIC_BASE_URL="https://wygiwyh.example.com",
SECRET_KEY="test-secret-key",
OAUTH2_PROVIDER={"SCOPES": {"mcp": "Access WYGIWYH from MCP clients."}},
OAUTH2_DCR_ENABLED=True,
OAUTH2_DCR_INITIAL_ACCESS_TOKEN="",
)
class DynamicClientRegistrationTests(TestCase):
def test_registers_public_client_for_pkce_flow(self):
response = self.client.post(
reverse("oauth-dynamic-client-registration"),
data=json.dumps(
{
"client_name": "Copilot MCP",
"redirect_uris": ["http://127.0.0.1:8765/callback"],
"grant_types": ["authorization_code", "refresh_token"],
"response_types": ["code"],
"scope": "mcp",
"token_endpoint_auth_method": "none",
}
),
content_type="application/json",
)
self.assertEqual(response.status_code, 201)
payload = response.json()
self.assertEqual(payload["client_name"], "Copilot MCP")
self.assertEqual(
payload["redirect_uris"],
["http://127.0.0.1:8765/callback"],
)
self.assertEqual(
payload["grant_types"],
["authorization_code", "refresh_token"],
)
self.assertEqual(payload["response_types"], ["code"])
self.assertEqual(payload["scope"], "mcp")
self.assertEqual(payload["token_endpoint_auth_method"], "none")
self.assertNotIn("client_secret", payload)
application = Application.objects.get(client_id=payload["client_id"])
self.assertEqual(application.name, "Copilot MCP")
self.assertEqual(application.client_type, Application.CLIENT_PUBLIC)
self.assertEqual(
application.authorization_grant_type,
Application.GRANT_AUTHORIZATION_CODE,
)
self.assertEqual(
application.redirect_uris,
"http://127.0.0.1:8765/callback",
)
def test_registers_confidential_client_with_generated_secret(self):
response = self.client.post(
reverse("oauth-dynamic-client-registration"),
data=json.dumps(
{
"client_name": "Confidential MCP",
"redirect_uris": ["http://127.0.0.1:8765/callback"],
"token_endpoint_auth_method": "client_secret_basic",
}
),
content_type="application/json",
)
self.assertEqual(response.status_code, 201)
payload = response.json()
self.assertEqual(payload["token_endpoint_auth_method"], "client_secret_basic")
self.assertEqual(payload["scope"], "mcp")
self.assertEqual(payload["client_secret_expires_at"], 0)
self.assertTrue(payload["client_secret"])
application = Application.objects.get(client_id=payload["client_id"])
self.assertEqual(application.client_type, Application.CLIENT_CONFIDENTIAL)
self.assertTrue(check_password(payload["client_secret"], application.client_secret))
def test_rejects_unsupported_token_auth_method(self):
response = self.client.post(
reverse("oauth-dynamic-client-registration"),
data=json.dumps(
{
"redirect_uris": ["http://127.0.0.1:8765/callback"],
"token_endpoint_auth_method": "private_key_jwt",
}
),
content_type="application/json",
)
self.assertEqual(response.status_code, 400)
self.assertEqual(response.json()["error"], "invalid_client_metadata")
self.assertIn("token_endpoint_auth_method", response.json()["error_description"])
def test_rejects_missing_redirect_uris(self):
response = self.client.post(
reverse("oauth-dynamic-client-registration"),
data=json.dumps({"client_name": "No redirect"}),
content_type="application/json",
)
self.assertEqual(response.status_code, 400)
self.assertEqual(response.json()["error"], "invalid_client_metadata")
self.assertIn("redirect_uris", response.json()["error_description"])
@override_settings(OAUTH2_DCR_ENABLED=False)
def test_returns_404_when_dcr_disabled(self):
response = self.client.post(
reverse("oauth-dynamic-client-registration"),
data=json.dumps({"redirect_uris": ["http://127.0.0.1:8765/callback"]}),
content_type="application/json",
)
self.assertEqual(response.status_code, 404)
self.assertEqual(Application.objects.count(), 0)
@override_settings(
PUBLIC_BASE_URL="https://wygiwyh.example.com",
SECRET_KEY="test-secret-key",
OAUTH2_PROVIDER={"SCOPES": {"mcp": "Access WYGIWYH from MCP clients."}},
OAUTH2_DCR_ENABLED=True,
OAUTH2_DCR_INITIAL_ACCESS_TOKEN="s3cret-iat",
)
class DynamicClientRegistrationInitialAccessTokenTests(TestCase):
def test_rejects_registration_without_initial_access_token(self):
response = self.client.post(
reverse("oauth-dynamic-client-registration"),
data=json.dumps({"redirect_uris": ["http://127.0.0.1:8765/callback"]}),
content_type="application/json",
)
self.assertEqual(response.status_code, 401)
self.assertEqual(response.json()["error"], "invalid_token")
self.assertEqual(Application.objects.count(), 0)
def test_allows_registration_with_initial_access_token(self):
response = self.client.post(
reverse("oauth-dynamic-client-registration"),
data=json.dumps(
{
"redirect_uris": ["http://127.0.0.1:8765/callback"],
"token_endpoint_auth_method": "none",
}
),
content_type="application/json",
HTTP_AUTHORIZATION="Bearer s3cret-iat",
)
self.assertEqual(response.status_code, 201)
self.assertEqual(Application.objects.count(), 1)
class SetupOAuthCommandTests(TestCase):
@patch.dict(
os.environ,
{
"MCP_OAUTH_CLIENT_ID": "mcp-wygiwyh",
"MCP_OAUTH_CLIENT_SECRET": "super-secret",
"MCP_OAUTH_REDIRECT_URIS": "http://127.0.0.1:8765/callback",
},
clear=False,
)
def test_creates_mcp_oauth_application(self):
call_command("setup_oauth")
application = Application.objects.get(client_id="mcp-wygiwyh")
self.assertEqual(application.name, "WYGIWYH MCP")
self.assertEqual(application.client_type, Application.CLIENT_CONFIDENTIAL)
self.assertEqual(
application.authorization_grant_type,
Application.GRANT_AUTHORIZATION_CODE,
)
self.assertEqual(
application.redirect_uris,
"http://127.0.0.1:8765/callback",
)
self.assertFalse(application.skip_authorization)
self.assertTrue(check_password("super-secret", application.client_secret))
@patch.dict(
os.environ,
{
"MCP_OAUTH_CLIENT_ID": "mcp-wygiwyh",
"MCP_OAUTH_CLIENT_SECRET": "new-secret",
"MCP_OAUTH_REDIRECT_URIS": "http://127.0.0.1:8765/callback http://localhost:8765/callback",
"MCP_OAUTH_CLIENT_NAME": "WYGIWYH MCP Production",
"MCP_OAUTH_SKIP_AUTHORIZATION": "true",
},
clear=False,
)
def test_updates_existing_mcp_oauth_application(self):
Application.objects.create(
client_id="mcp-wygiwyh",
client_secret="old-secret",
name="Old Name",
client_type=Application.CLIENT_CONFIDENTIAL,
authorization_grant_type=Application.GRANT_AUTHORIZATION_CODE,
redirect_uris="http://127.0.0.1:8765/callback",
skip_authorization=False,
)
call_command("setup_oauth")
application = Application.objects.get(client_id="mcp-wygiwyh")
self.assertEqual(application.name, "WYGIWYH MCP Production")
self.assertEqual(
application.redirect_uris,
"http://127.0.0.1:8765/callback http://localhost:8765/callback",
)
self.assertTrue(application.skip_authorization)
self.assertTrue(check_password("new-secret", application.client_secret))
class CreateAPITokenCommandTests(TestCase):
def setUp(self):
self.user = get_user_model().objects.create_user(
email="n8n@example.com",
password="test-password",
)
def test_creates_hashed_api_token_and_prints_raw_value(self):
stdout = StringIO()
call_command(
"create_api_token",
self.user.email,
"--name",
"n8n sync",
stdout=stdout,
)
token = APIToken.objects.get(user=self.user, name="n8n sync")
lines = [line.strip() for line in stdout.getvalue().splitlines() if line.strip()]
raw_token = lines[-1]
self.assertTrue(raw_token.startswith(APIToken.TOKEN_PREFIX))
self.assertNotEqual(token.token_hash, raw_token)
self.assertTrue(token.check_secret(APIToken.parse_raw_token(raw_token)[1]))
def test_supports_expiring_tokens(self):
call_command(
"create_api_token",
self.user.email,
"--expires-in-days",
"7",
)
token = APIToken.objects.get(user=self.user)
self.assertIsNotNone(token.expires_at)
self.assertGreater(token.expires_at, timezone.now())
+37 -1
View File
@@ -4,13 +4,19 @@ from django.contrib.auth.forms import (
UserCreationForm, UserCreationForm,
AdminPasswordChangeForm, AdminPasswordChangeForm,
) )
from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.contrib import admin from django.contrib import admin
from django.contrib.auth.admin import GroupAdmin as BaseGroupAdmin from django.contrib.auth.admin import GroupAdmin as BaseGroupAdmin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from apps.users.models import User, UserSettings from apps.users.models import APIToken, User, UserSettings
@admin.action(description=_("Revoke selected API tokens"))
def revoke_api_tokens(modeladmin, request, queryset):
queryset.update(revoked_at=timezone.now())
admin.site.unregister(Group) admin.site.unregister(Group)
@@ -77,3 +83,33 @@ class GroupAdmin(BaseGroupAdmin, ModelAdmin):
admin.site.register(UserSettings) admin.site.register(UserSettings)
@admin.register(APIToken)
class APITokenAdmin(admin.ModelAdmin):
actions = [revoke_api_tokens]
list_display = (
"name",
"user",
"token_key",
"created_at",
"last_used_at",
"expires_at",
"revoked_at",
)
search_fields = ("name", "user__email", "token_key")
# Never expose the secret hash in the form; it must not be editable.
exclude = ("token_hash",)
readonly_fields = (
"user",
"name",
"token_key",
"created_at",
"updated_at",
"last_used_at",
"expires_at",
"revoked_at",
)
def has_add_permission(self, request):
return False
+50
View File
@@ -1,4 +1,7 @@
from datetime import timedelta
from apps.common.middleware.thread_local import get_current_user from apps.common.middleware.thread_local import get_current_user
from apps.users.models import APIToken
from apps.common.widgets.crispy.submit import NoClassSubmit from apps.common.widgets.crispy.submit import NoClassSubmit
from apps.common.widgets.tom_select import TomSelect from apps.common.widgets.tom_select import TomSelect
from apps.users.models import UserSettings from apps.users.models import UserSettings
@@ -16,6 +19,7 @@ from django.contrib.auth.forms import (
UsernameField, UsernameField,
) )
from django.db import transaction from django.db import transaction
from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@@ -427,3 +431,49 @@ class UserAddForm(UserCreationForm):
if commit: if commit:
user.save() user.save()
return user return user
class APITokenCreateForm(forms.Form):
name = forms.CharField(
max_length=255,
label=_("Token name"),
help_text=_(
"Use a descriptive name such as n8n, Home Assistant, or backup job."
),
)
expires_in_days = forms.IntegerField(
required=False,
min_value=1,
label=_("Expires in days"),
help_text=_("Leave empty for a non-expiring token."),
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_tag = False
self.helper.form_method = "post"
self.helper.layout = Layout(
"name",
"expires_in_days",
FormActions(
NoClassSubmit(
"submit",
_("Create token"),
css_class="btn btn-primary",
),
),
)
def save(self, user):
expires_in_days = self.cleaned_data.get("expires_in_days")
expires_at = None
if expires_in_days:
expires_at = timezone.now() + timedelta(days=expires_in_days)
return APIToken.objects.create_token(
user=user,
name=self.cleaned_data["name"],
expires_at=expires_at,
)
@@ -0,0 +1,36 @@
# Generated by Django 5.2.15 on 2026-06-24 09:21
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0025_alter_usersettings_default_account'),
]
operations = [
migrations.CreateModel(
name='APIToken',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, verbose_name='Name')),
('token_key', models.CharField(db_index=True, max_length=16, unique=True, verbose_name='Token key')),
('token_hash', models.CharField(max_length=255, verbose_name='Token hash')),
('last_used_at', models.DateTimeField(blank=True, null=True, verbose_name='Last used at')),
('expires_at', models.DateTimeField(blank=True, null=True, verbose_name='Expires at')),
('revoked_at', models.DateTimeField(blank=True, null=True, verbose_name='Revoked at')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created at')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated at')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='api_tokens', to=settings.AUTH_USER_MODEL, verbose_name='User')),
],
options={
'verbose_name': 'API token',
'verbose_name_plural': 'API tokens',
'ordering': ['-created_at'],
'indexes': [models.Index(fields=['user', 'revoked_at'], name='users_apito_user_id_73edec_idx'), models.Index(fields=['expires_at'], name='users_apito_expires_2b737c_idx')],
},
),
]
File diff suppressed because one or more lines are too long
+119 -2
View File
@@ -1,9 +1,14 @@
import hashlib
import hmac
import secrets
import pytz import pytz
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.models import AbstractUser, Group from django.contrib.auth.models import AbstractUser, Group
from django.core.validators import MaxValueValidator, MinValueValidator from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models from django.db import IntegrityError, models, transaction
from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from apps.users.managers import UserManager from apps.users.managers import UserManager
@@ -410,7 +415,7 @@ timezones = [
("Pacific/Galapagos", "Pacific/Galapagos"), ("Pacific/Galapagos", "Pacific/Galapagos"),
("Pacific/Gambier", "Pacific/Gambier"), ("Pacific/Gambier", "Pacific/Gambier"),
("Pacific/Guadalcanal", "Pacific/Guadalcanal"), ("Pacific/Guadalcanal", "Pacific/Guadalcanal"),
("P2025-06-29T01:43:14.671389745Z acific/Guam", "Pacific/Guam"), ("Pacific/Guam", "Pacific/Guam"),
("Pacific/Honolulu", "Pacific/Honolulu"), ("Pacific/Honolulu", "Pacific/Honolulu"),
("Pacific/Kanton", "Pacific/Kanton"), ("Pacific/Kanton", "Pacific/Kanton"),
("Pacific/Kiritimati", "Pacific/Kiritimati"), ("Pacific/Kiritimati", "Pacific/Kiritimati"),
@@ -524,3 +529,115 @@ class UserSettings(models.Model):
def clean(self): def clean(self):
super().clean() super().clean()
class APITokenManager(models.Manager):
def create_token(self, *, user, name: str, expires_at=None):
token_secret = secrets.token_urlsafe(32)
token_hash = self.model.hash_secret(token_secret)
# token_key is unique; the pre-check in generate_token_key still leaves a
# tiny race window under concurrency, so retry on the unique-constraint
# violation with a fresh key instead of failing the request.
last_error = None
for _ in range(5):
token = self.model(
user=user,
name=name,
token_key=self.model.generate_token_key(),
token_hash=token_hash,
expires_at=expires_at,
)
token.full_clean()
try:
with transaction.atomic():
token.save()
except IntegrityError as exc:
last_error = exc
continue
return token, token.build_raw_token(token_secret)
raise last_error
class APIToken(models.Model):
TOKEN_PREFIX = "wygiwyh_pat_"
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name="api_tokens",
verbose_name=_("User"),
)
name = models.CharField(max_length=255, verbose_name=_("Name"))
token_key = models.CharField(
max_length=16,
unique=True,
db_index=True,
verbose_name=_("Token key"),
)
token_hash = models.CharField(max_length=255, verbose_name=_("Token hash"))
last_used_at = models.DateTimeField(
null=True,
blank=True,
verbose_name=_("Last used at"),
)
expires_at = models.DateTimeField(
null=True,
blank=True,
verbose_name=_("Expires at"),
)
revoked_at = models.DateTimeField(
null=True,
blank=True,
verbose_name=_("Revoked at"),
)
created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created at"))
updated_at = models.DateTimeField(auto_now=True, verbose_name=_("Updated at"))
objects = APITokenManager()
class Meta:
indexes = [
models.Index(fields=["user", "revoked_at"]),
models.Index(fields=["expires_at"]),
]
ordering = ["-created_at"]
verbose_name = _("API token")
verbose_name_plural = _("API tokens")
def __str__(self):
return f"{self.user} / {self.name}"
@classmethod
def generate_token_key(cls) -> str:
while True:
candidate = secrets.token_hex(8)
if not cls.objects.filter(token_key=candidate).exists():
return candidate
@classmethod
def parse_raw_token(cls, raw_token: str):
if not raw_token.startswith(cls.TOKEN_PREFIX):
raise ValueError("Token is missing the expected prefix.")
payload = raw_token.removeprefix(cls.TOKEN_PREFIX)
token_key, separator, token_secret = payload.partition(".")
if not separator or not token_key or not token_secret:
raise ValueError("Token is malformed.")
return token_key, token_secret
def build_raw_token(self, token_secret: str) -> str:
return f"{self.TOKEN_PREFIX}{self.token_key}.{token_secret}"
@staticmethod
def hash_secret(token_secret: str) -> str:
# The secret is a 256-bit random value (secrets.token_urlsafe(32)), so a
# single SHA-256 is sufficient and avoids a slow KDF on every request.
return hashlib.sha256(token_secret.encode("utf-8")).hexdigest()
def check_secret(self, raw_secret: str) -> bool:
return hmac.compare_digest(self.token_hash, self.hash_secret(raw_secret))
def is_expired(self) -> bool:
return self.expires_at is not None and self.expires_at <= timezone.now()
+73
View File
@@ -0,0 +1,73 @@
from django.contrib.auth import get_user_model
from django.test import TestCase
from django.urls import reverse
from django.utils import timezone
from apps.users.models import APIToken
class UserAPITokenViewsTests(TestCase):
def setUp(self):
self.user = get_user_model().objects.create_user(
email="user@example.com",
password="test-password",
)
self.client.force_login(self.user)
self.htmx_headers = {"HTTP_HX_REQUEST": "true"}
def test_user_settings_renders_api_token_section(self):
response = self.client.get(reverse("user_settings"), **self.htmx_headers)
self.assertContains(response, "API Tokens")
self.assertContains(response, reverse("user_api_token_add"))
def test_can_create_api_token_from_ui(self):
response = self.client.post(
reverse("user_api_token_add"),
{"name": "n8n", "expires_in_days": "30"},
**self.htmx_headers,
)
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Copy this token now")
self.assertEqual(APIToken.objects.filter(user=self.user, name="n8n").count(), 1)
def test_can_revoke_own_api_token(self):
token, _ = APIToken.objects.create_token(user=self.user, name="n8n")
response = self.client.delete(
reverse("user_api_token_revoke", kwargs={"token_id": token.id}),
**self.htmx_headers,
)
self.assertEqual(response.status_code, 200)
token.refresh_from_db()
self.assertIsNotNone(token.revoked_at)
self.assertContains(response, "Revoked")
def test_can_delete_revoked_api_token(self):
token, _ = APIToken.objects.create_token(user=self.user, name="n8n")
token.revoked_at = timezone.now()
token.save(update_fields=["revoked_at"])
response = self.client.delete(
reverse("user_api_token_delete", kwargs={"token_id": token.id}),
**self.htmx_headers,
)
self.assertEqual(response.status_code, 200)
self.assertFalse(APIToken.objects.filter(id=token.id).exists())
def test_cannot_delete_other_users_api_token(self):
other = get_user_model().objects.create_user(
email="other@example.com", password="test-password"
)
token, _ = APIToken.objects.create_token(user=other, name="theirs")
response = self.client.delete(
reverse("user_api_token_delete", kwargs={"token_id": token.id}),
**self.htmx_headers,
)
self.assertEqual(response.status_code, 404)
self.assertTrue(APIToken.objects.filter(id=token.id).exists())
+15
View File
@@ -32,6 +32,21 @@ urlpatterns = [
views.update_settings, views.update_settings,
name="user_settings", name="user_settings",
), ),
path(
"user/api-tokens/add/",
views.api_token_add,
name="user_api_token_add",
),
path(
"user/api-tokens/<int:token_id>/revoke/",
views.api_token_revoke,
name="user_api_token_revoke",
),
path(
"user/api-tokens/<int:token_id>/delete/",
views.api_token_delete,
name="user_api_token_delete",
),
path( path(
"users/", "users/",
views.users_index, views.users_index,
+66 -2
View File
@@ -2,12 +2,13 @@ from apps.common.decorators.demo import disabled_on_demo
from apps.common.decorators.htmx import only_htmx from apps.common.decorators.htmx import only_htmx
from apps.common.decorators.user import htmx_login_required, is_superuser from apps.common.decorators.user import htmx_login_required, is_superuser
from apps.users.forms import ( from apps.users.forms import (
APITokenCreateForm,
LoginForm, LoginForm,
UserAddForm, UserAddForm,
UserSettingsForm, UserSettingsForm,
UserUpdateForm, UserUpdateForm,
) )
from apps.users.models import UserSettings from apps.users.models import APIToken, UserSettings
from django.contrib import messages from django.contrib import messages
from django.contrib.auth import get_user_model, logout from django.contrib.auth import get_user_model, logout
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
@@ -18,6 +19,7 @@ from django.core.exceptions import PermissionDenied
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import get_object_or_404, redirect, render from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse from django.urls import reverse
from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views.decorators.http import require_http_methods from django.views.decorators.http import require_http_methods
@@ -112,7 +114,69 @@ def update_settings(request):
else: else:
form = UserSettingsForm(instance=user_settings) form = UserSettingsForm(instance=user_settings)
return render(request, "users/fragments/user_settings.html", {"form": form}) return render(
request,
"users/fragments/user_settings.html",
{
"form": form,
"api_token_form": APITokenCreateForm(),
"api_tokens": request.user.api_tokens.all(),
},
)
def _render_api_tokens(request, *, form=None, raw_token=None):
return render(
request,
"users/fragments/api_tokens.html",
{
"api_token_form": form or APITokenCreateForm(),
"api_tokens": request.user.api_tokens.all(),
"raw_token": raw_token,
},
)
@only_htmx
@htmx_login_required
@disabled_on_demo
@require_http_methods(["POST"])
def api_token_add(request):
form = APITokenCreateForm(request.POST)
if form.is_valid():
_token, raw_token = form.save(user=request.user)
messages.success(request, _("API token created successfully"))
return _render_api_tokens(
request,
form=APITokenCreateForm(),
raw_token=raw_token,
)
return _render_api_tokens(request, form=form)
@only_htmx
@htmx_login_required
@disabled_on_demo
@require_http_methods(["DELETE"])
def api_token_revoke(request, token_id):
token = get_object_or_404(APIToken, id=token_id, user=request.user)
if token.revoked_at is None:
token.revoked_at = timezone.now()
token.save(update_fields=["revoked_at"])
messages.success(request, _("API token revoked successfully"))
return _render_api_tokens(request)
@only_htmx
@htmx_login_required
@disabled_on_demo
@require_http_methods(["DELETE"])
def api_token_delete(request, token_id):
token = get_object_or_404(APIToken, id=token_id, user=request.user)
token.delete()
messages.success(request, _("API token deleted successfully"))
return _render_api_tokens(request)
@only_htmx @only_htmx
+242 -60
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-06 08:15+0000\n" "POT-Creation-Date: 2026-07-04 15:39+0000\n"
"PO-Revision-Date: 2026-04-09 11:24+0000\n" "PO-Revision-Date: 2026-04-09 11:24+0000\n"
"Last-Translator: LordTimothyHKIT <tim.hofstetter@hkit.ch>\n" "Last-Translator: LordTimothyHKIT <tim.hofstetter@hkit.ch>\n"
"Language-Team: German <https://translations.herculino.com/projects/wygiwyh/" "Language-Team: German <https://translations.herculino.com/projects/wygiwyh/"
@@ -31,8 +31,8 @@ msgstr "Gruppe Name"
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536 #: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919 #: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978 #: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:242 #: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:400 #: apps/users/forms.py:404
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5 #: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128 #: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update" msgid "Update"
@@ -47,7 +47,7 @@ msgstr "Aktualisierung"
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886 #: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953 #: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134 #: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:248 apps/users/forms.py:406 #: apps/users/forms.py:252 apps/users/forms.py:410
#: templates/mini_tools/unit_price_calculator.html:168 #: templates/mini_tools/unit_price_calculator.html:168
msgid "Add" msgid "Add"
msgstr "Hinzufügen" msgstr "Hinzufügen"
@@ -99,7 +99,7 @@ msgstr "Tags"
#: apps/import_app/models.py:14 apps/rules/models.py:13 #: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248 #: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057 #: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: templates/account_groups/fragments/list.html:22 #: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22 #: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17 #: templates/categories/fragments/table.html:17
#: templates/currencies/fragments/list.html:23 #: templates/currencies/fragments/list.html:23
@@ -356,7 +356,7 @@ msgstr ""
"Privat: Nur für den Besitzer und geteilte Nutzer sichtbar.<br/>Öffentlich: " "Privat: Nur für den Besitzer und geteilte Nutzer sichtbar.<br/>Öffentlich: "
"Sichtbar für alle Nutzer. Nur bearbeitbar durch Besitzer." "Sichtbar für alle Nutzer. Nur bearbeitbar durch Besitzer."
#: apps/common/forms.py:76 apps/users/forms.py:169 #: apps/common/forms.py:76 apps/users/forms.py:173
msgid "Save" msgid "Save"
msgstr "Speichern" msgstr "Speichern"
@@ -542,8 +542,8 @@ msgstr "Umrechnungskurs"
msgid "Date and Time" msgid "Date and Time"
msgstr "Datum und Uhrzeit" msgstr "Datum und Uhrzeit"
#: apps/currencies/models.py:78 apps/users/models.py:12 #: apps/currencies/models.py:78 apps/users/models.py:17
#: apps/users/models.py:497 #: apps/users/models.py:502
msgid "Auto" msgid "Auto"
msgstr "Automatisch" msgstr "Automatisch"
@@ -584,7 +584,9 @@ msgstr "Diensttyp"
#: templates/entities/fragments/list.html:16 #: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16 #: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16 #: templates/recurring_transactions/fragments/list.html:16
#: templates/tags/fragments/list.html:16 templates/users/fragments/list.html:25 #: templates/tags/fragments/list.html:16
#: templates/users/fragments/api_tokens.html:54
#: templates/users/fragments/list.html:25
msgid "Active" msgid "Active"
msgstr "Aktiv" msgstr "Aktiv"
@@ -1618,7 +1620,7 @@ msgstr "Tranksaktionstags"
msgid "Yearly" msgid "Yearly"
msgstr "Jährlich" msgstr "Jährlich"
#: apps/transactions/models.py:596 apps/users/models.py:464 #: apps/transactions/models.py:596 apps/users/models.py:469
#: templates/includes/sidebar.html:51 #: templates/includes/sidebar.html:51
msgid "Monthly" msgid "Monthly"
msgstr "Monatlich" msgstr "Monatlich"
@@ -1810,11 +1812,11 @@ msgid "Installment Plan deleted successfully"
msgstr "Ratenzahlungs-Plan erfolgreich gelöscht" msgstr "Ratenzahlungs-Plan erfolgreich gelöscht"
#: apps/transactions/views/quick_transactions.py:45 #: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:188 #: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:252
msgid "Item added successfully" msgid "Item added successfully"
msgstr "Objekt erfolgreich hinzugefügt" msgstr "Objekt erfolgreich hinzugefügt"
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:220 #: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:284
msgid "Item updated successfully" msgid "Item updated successfully"
msgstr "Objekt erfolgreich aktualisiert" msgstr "Objekt erfolgreich aktualisiert"
@@ -1903,44 +1905,48 @@ msgstr "Transaktion erfolgreich wiederhergestellt"
msgid "Transfer added successfully" msgid "Transfer added successfully"
msgstr "Transfer erfolgreich hinzugefügt" msgstr "Transfer erfolgreich hinzugefügt"
#: apps/users/admin.py:22 templates/users/fragments/user_settings.html:5 #: apps/users/admin.py:17
msgid "Revoke selected API tokens"
msgstr ""
#: apps/users/admin.py:28 templates/users/fragments/user_settings.html:5
msgid "User Settings" msgid "User Settings"
msgstr "Nutzereinstellungen" msgstr "Nutzereinstellungen"
#: apps/users/admin.py:23 #: apps/users/admin.py:29
msgid "User Setting" msgid "User Setting"
msgstr "Nutzereinstellung" msgstr "Nutzereinstellung"
#: apps/users/admin.py:48 #: apps/users/admin.py:54
msgid "Personal info" msgid "Personal info"
msgstr "Persönliche Daten" msgstr "Persönliche Daten"
#: apps/users/admin.py:50 #: apps/users/admin.py:56
msgid "Permissions" msgid "Permissions"
msgstr "Berechtigungen" msgstr "Berechtigungen"
#: apps/users/admin.py:61 #: apps/users/admin.py:67
msgid "Important dates" msgid "Important dates"
msgstr "Wichtige Daten" msgstr "Wichtige Daten"
#: apps/users/forms.py:24 apps/users/forms.py:28 apps/users/models.py:451 #: apps/users/forms.py:28 apps/users/forms.py:32 apps/users/models.py:456
#: templates/users/login.html:18 #: templates/users/login.html:18
msgid "E-mail" msgid "E-mail"
msgstr "E-Mail" msgstr "E-Mail"
#: apps/users/forms.py:35 apps/users/forms.py:40 templates/users/login.html:19 #: apps/users/forms.py:39 apps/users/forms.py:44 templates/users/login.html:19
msgid "Password" msgid "Password"
msgstr "Passwort" msgstr "Passwort"
#: apps/users/forms.py:47 #: apps/users/forms.py:51
msgid "Invalid e-mail or password" msgid "Invalid e-mail or password"
msgstr "Ungültige E-Mail oder Passwort" msgstr "Ungültige E-Mail oder Passwort"
#: apps/users/forms.py:48 #: apps/users/forms.py:52
msgid "This account is deactivated" msgid "This account is deactivated"
msgstr "Dieses Konto ist deaktiviert" msgstr "Dieses Konto ist deaktiviert"
#: apps/users/forms.py:64 apps/users/forms.py:77 apps/users/forms.py:99 #: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98 #: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245 #: templates/monthly_overview/pages/overview.html:245
#: templates/transactions/pages/transactions.html:47 #: templates/transactions/pages/transactions.html:47
@@ -1948,23 +1954,23 @@ msgstr "Dieses Konto ist deaktiviert"
msgid "Default" msgid "Default"
msgstr "Standard" msgstr "Standard"
#: apps/users/forms.py:107 apps/users/models.py:484 #: apps/users/forms.py:111 apps/users/models.py:489
msgid "Date Format" msgid "Date Format"
msgstr "Datumsformat" msgstr "Datumsformat"
#: apps/users/forms.py:112 apps/users/models.py:489 #: apps/users/forms.py:116 apps/users/models.py:494
msgid "Datetime Format" msgid "Datetime Format"
msgstr "Datums- und Zeitformat" msgstr "Datums- und Zeitformat"
#: apps/users/forms.py:118 apps/users/models.py:492 #: apps/users/forms.py:122 apps/users/models.py:497
msgid "Number Format" msgid "Number Format"
msgstr "Zahlenformat" msgstr "Zahlenformat"
#: apps/users/forms.py:125 #: apps/users/forms.py:129
msgid "Default Account" msgid "Default Account"
msgstr "Standart Konto" msgstr "Standart Konto"
#: apps/users/forms.py:174 #: apps/users/forms.py:178
#, python-format #, python-format
msgid "" msgid ""
"This changes the language (if available) and how numbers and dates are " "This changes the language (if available) and how numbers and dates are "
@@ -1975,25 +1981,25 @@ msgstr ""
"angezeigt werden.\n" "angezeigt werden.\n"
"Hilf mit WYGIWYH in deine Sprache zu übersetzten: %(translation_link)s" "Hilf mit WYGIWYH in deine Sprache zu übersetzten: %(translation_link)s"
#: apps/users/forms.py:183 #: apps/users/forms.py:187
msgid "New Password" msgid "New Password"
msgstr "Neues Passwort" msgstr "Neues Passwort"
#: apps/users/forms.py:186 #: apps/users/forms.py:190
msgid "Leave blank to keep the current password." msgid "Leave blank to keep the current password."
msgstr "Leer lassen um Passwort zu belassen." msgstr "Leer lassen um Passwort zu belassen."
#: apps/users/forms.py:189 #: apps/users/forms.py:193
msgid "Confirm New Password" msgid "Confirm New Password"
msgstr "Bestätige das neue Passwort" msgstr "Bestätige das neue Passwort"
#: apps/users/forms.py:201 apps/users/forms.py:358 #: apps/users/forms.py:205 apps/users/forms.py:362
msgid "" msgid ""
"Designates whether this user should be treated as active. Unselect this " "Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts." "instead of deleting accounts."
msgstr "Abwählen um den Nutzer zu deaktivieren. Besser als gleich zu löschen." msgstr "Abwählen um den Nutzer zu deaktivieren. Besser als gleich zu löschen."
#: apps/users/forms.py:204 apps/users/forms.py:361 #: apps/users/forms.py:208 apps/users/forms.py:365
msgid "" msgid ""
"Designates that this user has all permissions without explicitly assigning " "Designates that this user has all permissions without explicitly assigning "
"them." "them."
@@ -2001,83 +2007,107 @@ msgstr ""
"Anwählen damit der Nutzer alle Berechtigungen hat, ohne diese explizit " "Anwählen damit der Nutzer alle Berechtigungen hat, ohne diese explizit "
"hinzuzufügen." "hinzuzufügen."
#: apps/users/forms.py:271 #: apps/users/forms.py:275
msgid "This email address is already in use by another account." msgid "This email address is already in use by another account."
msgstr "Diese E-Mail-Adresse wird bereits von jemand anders benutzt." msgstr "Diese E-Mail-Adresse wird bereits von jemand anders benutzt."
#: apps/users/forms.py:279 #: apps/users/forms.py:283
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "Die eingegebenen Passwörter stimmen nicht überein." msgstr "Die eingegebenen Passwörter stimmen nicht überein."
#: apps/users/forms.py:281 #: apps/users/forms.py:285
msgid "Please confirm your new password." msgid "Please confirm your new password."
msgstr "Bitte bestätige dein neues Passwort." msgstr "Bitte bestätige dein neues Passwort."
#: apps/users/forms.py:283 #: apps/users/forms.py:287
msgid "Please enter the new password first." msgid "Please enter the new password first."
msgstr "Bitte gebe erst dein neues Passwort ein." msgstr "Bitte gebe erst dein neues Passwort ein."
#: apps/users/forms.py:303 #: apps/users/forms.py:307
msgid "You cannot deactivate your own account using this form." msgid "You cannot deactivate your own account using this form."
msgstr "Du kannst deinen Nutzer nicht hier deaktivieren." msgstr "Du kannst deinen Nutzer nicht hier deaktivieren."
#: apps/users/forms.py:316 #: apps/users/forms.py:320
msgid "Cannot remove status from the last superuser." msgid "Cannot remove status from the last superuser."
msgstr "Sie können die Adminberechtigungen nicht vom letzten Admin entfernen." msgstr "Sie können die Adminberechtigungen nicht vom letzten Admin entfernen."
#: apps/users/forms.py:322 #: apps/users/forms.py:326
msgid "You cannot remove your own superuser status using this form." msgid "You cannot remove your own superuser status using this form."
msgstr "Du kannst deinen eigenen Superuser-Status nicht hier entfernen." msgstr "Du kannst deinen eigenen Superuser-Status nicht hier entfernen."
#: apps/users/forms.py:415 #: apps/users/forms.py:419
msgid "A user with this email address already exists." msgid "A user with this email address already exists."
msgstr "Ein Benutzer mit dieser E-Mail-Adresse existiert bereits." msgstr "Ein Benutzer mit dieser E-Mail-Adresse existiert bereits."
#: apps/users/models.py:465 #: apps/users/forms.py:439
#, fuzzy
#| msgid "Tag name"
msgid "Token name"
msgstr "Tagname"
#: apps/users/forms.py:441
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
#, fuzzy
#| msgid "Create transaction"
msgid "Create token"
msgstr "Erstelle Transaktion"
#: apps/users/models.py:470
msgid "Yearly by currency" msgid "Yearly by currency"
msgstr "Jährlich nach Währung" msgstr "Jährlich nach Währung"
#: apps/users/models.py:466 #: apps/users/models.py:471
msgid "Yearly by account" msgid "Yearly by account"
msgstr "Jährlich nach Konto" msgstr "Jährlich nach Konto"
#: apps/users/models.py:467 templates/net_worth/net_worth.html:9 #: apps/users/models.py:472 templates/net_worth/net_worth.html:9
msgid "Current Net Worth" msgid "Current Net Worth"
msgstr "Aktuelles Nettovermögen" msgstr "Aktuelles Nettovermögen"
#: apps/users/models.py:468 templates/net_worth/net_worth.html:11 #: apps/users/models.py:473 templates/net_worth/net_worth.html:11
msgid "Projected Net Worth" msgid "Projected Net Worth"
msgstr "Erwartetes Nettovermögen" msgstr "Erwartetes Nettovermögen"
#: apps/users/models.py:469 #: apps/users/models.py:474
msgid "All Transactions" msgid "All Transactions"
msgstr "Alle Transaktionen" msgstr "Alle Transaktionen"
#: apps/users/models.py:470 templates/includes/sidebar.html:63 #: apps/users/models.py:475 templates/includes/sidebar.html:63
msgid "Calendar" msgid "Calendar"
msgstr "Kalender" msgstr "Kalender"
#: apps/users/models.py:480 #: apps/users/models.py:485
msgid "Volume" msgid "Volume"
msgstr "Lautstärke" msgstr "Lautstärke"
#: apps/users/models.py:499 #: apps/users/models.py:504
msgid "Language" msgid "Language"
msgstr "Sprache" msgstr "Sprache"
#: apps/users/models.py:505 #: apps/users/models.py:510
msgid "Time Zone" msgid "Time Zone"
msgstr "Zeitzone" msgstr "Zeitzone"
#: apps/users/models.py:511 #: apps/users/models.py:516
msgid "Start page" msgid "Start page"
msgstr "Startseite" msgstr "Startseite"
#: apps/users/models.py:516 #: apps/users/models.py:521
msgid "Default account" msgid "Default account"
msgstr "Standartkonto" msgstr "Standartkonto"
#: apps/users/models.py:517 #: apps/users/models.py:522
#, fuzzy #, fuzzy
#| msgid "" #| msgid ""
#| "Deactivated tags won't be able to be selected when creating new " #| "Deactivated tags won't be able to be selected when creating new "
@@ -2087,26 +2117,94 @@ msgstr ""
"Deaktivierte Tags können bei der Erstellung neuer Transaktionen nicht " "Deaktivierte Tags können bei der Erstellung neuer Transaktionen nicht "
"ausgewählt werden" "ausgewählt werden"
#: apps/users/views.py:67 #: apps/users/models.py:570
#, fuzzy
#| msgid "Users"
msgid "User"
msgstr "Nutzer"
#: apps/users/models.py:577
msgid "Token key"
msgstr ""
#: apps/users/models.py:579
msgid "Token hash"
msgstr ""
#: apps/users/models.py:583
#, fuzzy
#| msgid "Last Generated Date"
msgid "Last used at"
msgstr "Letztes generiertes Datum"
#: apps/users/models.py:588
msgid "Expires at"
msgstr ""
#: apps/users/models.py:593
msgid "Revoked at"
msgstr ""
#: apps/users/models.py:595
#, fuzzy
#| msgid "Create transaction"
msgid "Created at"
msgstr "Erstelle Transaktion"
#: apps/users/models.py:596
#, fuzzy
#| msgid "Update"
msgid "Updated at"
msgstr "Aktualisierung"
#: apps/users/models.py:606
#, fuzzy
#| msgid "API Key"
msgid "API token"
msgstr "API-Schlüssel"
#: apps/users/models.py:607
msgid "API tokens"
msgstr ""
#: apps/users/views.py:69
msgid "Transaction amounts are now hidden" msgid "Transaction amounts are now hidden"
msgstr "Beträge sind nun versteckt" msgstr "Beträge sind nun versteckt"
#: apps/users/views.py:70 #: apps/users/views.py:72
msgid "Transaction amounts are now displayed" msgid "Transaction amounts are now displayed"
msgstr "Beträge werden angezeigt" msgstr "Beträge werden angezeigt"
#: apps/users/views.py:88 #: apps/users/views.py:90
msgid "Sounds are now muted" msgid "Sounds are now muted"
msgstr "Sounds sind stummgeschaltet" msgstr "Sounds sind stummgeschaltet"
#: apps/users/views.py:91 #: apps/users/views.py:93
msgid "Sounds will now play" msgid "Sounds will now play"
msgstr "Sounds werden wiedergegeben" msgstr "Sounds werden wiedergegeben"
#: apps/users/views.py:107 #: apps/users/views.py:109
msgid "Your settings have been updated" msgid "Your settings have been updated"
msgstr "Deine Einstellungen wurden aktualisiert" msgstr "Deine Einstellungen wurden aktualisiert"
#: apps/users/views.py:148
#, fuzzy
#| msgid "Action updated successfully"
msgid "API token created successfully"
msgstr "Aktion erfolgreich aktualisiert"
#: apps/users/views.py:167
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token revoked successfully"
msgstr "Aktion erfolgreich gelöscht"
#: apps/users/views.py:178
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token deleted successfully"
msgstr "Aktion erfolgreich gelöscht"
#: templates/account_groups/fragments/add.html:5 #: templates/account_groups/fragments/add.html:5
msgid "Add account group" msgid "Add account group"
msgstr "Kontogruppe hinzufügen" msgstr "Kontogruppe hinzufügen"
@@ -2204,6 +2302,7 @@ msgstr "Teilen"
#: templates/rules/fragments/transaction_rule/view.html:92 #: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133 #: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51 #: templates/tags/fragments/table.html:51
#: templates/users/fragments/api_tokens.html:93
msgid "Delete" msgid "Delete"
msgstr "Löschen" msgstr "Löschen"
@@ -2281,6 +2380,7 @@ msgstr "Dies kann nicht rückgängig gemacht werden!"
#: templates/rules/fragments/transaction_rule/view.html:98 #: templates/rules/fragments/transaction_rule/view.html:98
#: templates/tags/fragments/table.html:57 #: templates/tags/fragments/table.html:57
#: templates/transactions/fragments/attachments.html:22 #: templates/transactions/fragments/attachments.html:22
#: templates/users/fragments/api_tokens.html:101
msgid "Yes, delete it!" msgid "Yes, delete it!"
msgstr "Ja, löschen!" msgstr "Ja, löschen!"
@@ -3314,6 +3414,10 @@ msgstr "Keine Ratenzahlungs-Pläne"
msgid "This is a demo!" msgid "This is a demo!"
msgstr "Dies ist eine Demo!" msgstr "Dies ist eine Demo!"
#: templates/layouts/base.html:37
msgid "Any data you add here will be wiped in 24hrs or less"
msgstr "Jegliche Eingaben hier werden innerhalb von 24 Stunden gelöscht"
#: templates/mini_tools/currency_converter/currency_converter.html:57 #: templates/mini_tools/currency_converter/currency_converter.html:57
msgid "Invert" msgid "Invert"
msgstr "Invertieren" msgstr "Invertieren"
@@ -3707,6 +3811,87 @@ msgstr "Unverändert"
msgid "Add user" msgid "Add user"
msgstr "Neue hinzufügen" msgstr "Neue hinzufügen"
#: templates/users/fragments/api_tokens.html:5
msgid "API Tokens"
msgstr ""
#: templates/users/fragments/api_tokens.html:7
msgid ""
"Use these tokens for automations such as n8n. The raw token is shown only "
"once after creation."
msgstr ""
#: templates/users/fragments/api_tokens.html:14
msgid "Copy this token now"
msgstr ""
#: templates/users/fragments/api_tokens.html:16
msgid "It will not be shown again after this response."
msgstr ""
#: templates/users/fragments/api_tokens.html:31
msgid "Copy"
msgstr ""
#: templates/users/fragments/api_tokens.html:52
msgid "Revoked"
msgstr ""
#: templates/users/fragments/api_tokens.html:59
#, python-format
msgid "Created %(created)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:62
#, python-format
msgid "last used %(used)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:64
msgid "never used"
msgstr ""
#: templates/users/fragments/api_tokens.html:68
#, python-format
msgid "expires %(expires)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:70
msgid "no expiry"
msgstr ""
#: templates/users/fragments/api_tokens.html:78
msgid "Revoke"
msgstr ""
#: templates/users/fragments/api_tokens.html:84
msgid "Revoke token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:85
msgid "This token will stop working immediately."
msgstr ""
#: templates/users/fragments/api_tokens.html:86
#, fuzzy
#| msgid "Yes, refresh it!"
msgid "Yes, revoke it!"
msgstr "Ja, aktualisieren!"
#: templates/users/fragments/api_tokens.html:99
#, fuzzy
#| msgid "Deleted At"
msgid "Delete token?"
msgstr "Gelöscht am"
#: templates/users/fragments/api_tokens.html:100
msgid "This permanently removes the token from the list. It cannot be undone."
msgstr ""
#: templates/users/fragments/api_tokens.html:114
msgid "No API tokens"
msgstr ""
#: templates/users/fragments/edit.html:5 #: templates/users/fragments/edit.html:5
#, fuzzy #, fuzzy
#| msgid "Edit category" #| msgid "Edit category"
@@ -3767,9 +3952,6 @@ msgstr "endet mit"
msgid "Yearly Overview" msgid "Yearly Overview"
msgstr "Jährliche Übersicht" msgstr "Jährliche Übersicht"
#~ msgid "Any data you add here will be wiped in 24hrs or less"
#~ msgstr "Jegliche Eingaben hier werden innerhalb von 24 Stunden gelöscht"
#, fuzzy #, fuzzy
#~| msgid "Are you sure?" #~| msgid "Are you sure?"
#~ msgid " Are you sure?" #~ msgid " Are you sure?"
+218 -57
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-06 08:15+0000\n" "POT-Creation-Date: 2026-07-04 15:39+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -30,8 +30,8 @@ msgstr ""
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536 #: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919 #: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978 #: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:242 #: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:400 #: apps/users/forms.py:404
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5 #: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128 #: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update" msgid "Update"
@@ -46,7 +46,7 @@ msgstr ""
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886 #: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953 #: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134 #: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:248 apps/users/forms.py:406 #: apps/users/forms.py:252 apps/users/forms.py:410
#: templates/mini_tools/unit_price_calculator.html:168 #: templates/mini_tools/unit_price_calculator.html:168
msgid "Add" msgid "Add"
msgstr "" msgstr ""
@@ -98,7 +98,7 @@ msgstr ""
#: apps/import_app/models.py:14 apps/rules/models.py:13 #: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248 #: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057 #: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: templates/account_groups/fragments/list.html:22 #: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22 #: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17 #: templates/categories/fragments/table.html:17
#: templates/currencies/fragments/list.html:23 #: templates/currencies/fragments/list.html:23
@@ -344,7 +344,7 @@ msgid ""
"owner.<br/>Public: Shown for all users. Only editable by the owner." "owner.<br/>Public: Shown for all users. Only editable by the owner."
msgstr "" msgstr ""
#: apps/common/forms.py:76 apps/users/forms.py:169 #: apps/common/forms.py:76 apps/users/forms.py:173
msgid "Save" msgid "Save"
msgstr "" msgstr ""
@@ -530,8 +530,8 @@ msgstr ""
msgid "Date and Time" msgid "Date and Time"
msgstr "" msgstr ""
#: apps/currencies/models.py:78 apps/users/models.py:12 #: apps/currencies/models.py:78 apps/users/models.py:17
#: apps/users/models.py:497 #: apps/users/models.py:502
msgid "Auto" msgid "Auto"
msgstr "" msgstr ""
@@ -572,7 +572,9 @@ msgstr ""
#: templates/entities/fragments/list.html:16 #: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16 #: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16 #: templates/recurring_transactions/fragments/list.html:16
#: templates/tags/fragments/list.html:16 templates/users/fragments/list.html:25 #: templates/tags/fragments/list.html:16
#: templates/users/fragments/api_tokens.html:54
#: templates/users/fragments/list.html:25
msgid "Active" msgid "Active"
msgstr "" msgstr ""
@@ -1564,7 +1566,7 @@ msgstr ""
msgid "Yearly" msgid "Yearly"
msgstr "" msgstr ""
#: apps/transactions/models.py:596 apps/users/models.py:464 #: apps/transactions/models.py:596 apps/users/models.py:469
#: templates/includes/sidebar.html:51 #: templates/includes/sidebar.html:51
msgid "Monthly" msgid "Monthly"
msgstr "" msgstr ""
@@ -1755,11 +1757,11 @@ msgid "Installment Plan deleted successfully"
msgstr "" msgstr ""
#: apps/transactions/views/quick_transactions.py:45 #: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:188 #: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:252
msgid "Item added successfully" msgid "Item added successfully"
msgstr "" msgstr ""
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:220 #: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:284
msgid "Item updated successfully" msgid "Item updated successfully"
msgstr "" msgstr ""
@@ -1844,44 +1846,48 @@ msgstr ""
msgid "Transfer added successfully" msgid "Transfer added successfully"
msgstr "" msgstr ""
#: apps/users/admin.py:22 templates/users/fragments/user_settings.html:5 #: apps/users/admin.py:17
msgid "Revoke selected API tokens"
msgstr ""
#: apps/users/admin.py:28 templates/users/fragments/user_settings.html:5
msgid "User Settings" msgid "User Settings"
msgstr "" msgstr ""
#: apps/users/admin.py:23 #: apps/users/admin.py:29
msgid "User Setting" msgid "User Setting"
msgstr "" msgstr ""
#: apps/users/admin.py:48 #: apps/users/admin.py:54
msgid "Personal info" msgid "Personal info"
msgstr "" msgstr ""
#: apps/users/admin.py:50 #: apps/users/admin.py:56
msgid "Permissions" msgid "Permissions"
msgstr "" msgstr ""
#: apps/users/admin.py:61 #: apps/users/admin.py:67
msgid "Important dates" msgid "Important dates"
msgstr "" msgstr ""
#: apps/users/forms.py:24 apps/users/forms.py:28 apps/users/models.py:451 #: apps/users/forms.py:28 apps/users/forms.py:32 apps/users/models.py:456
#: templates/users/login.html:18 #: templates/users/login.html:18
msgid "E-mail" msgid "E-mail"
msgstr "" msgstr ""
#: apps/users/forms.py:35 apps/users/forms.py:40 templates/users/login.html:19 #: apps/users/forms.py:39 apps/users/forms.py:44 templates/users/login.html:19
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: apps/users/forms.py:47 #: apps/users/forms.py:51
msgid "Invalid e-mail or password" msgid "Invalid e-mail or password"
msgstr "" msgstr ""
#: apps/users/forms.py:48 #: apps/users/forms.py:52
msgid "This account is deactivated" msgid "This account is deactivated"
msgstr "" msgstr ""
#: apps/users/forms.py:64 apps/users/forms.py:77 apps/users/forms.py:99 #: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98 #: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245 #: templates/monthly_overview/pages/overview.html:245
#: templates/transactions/pages/transactions.html:47 #: templates/transactions/pages/transactions.html:47
@@ -1889,23 +1895,23 @@ msgstr ""
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: apps/users/forms.py:107 apps/users/models.py:484 #: apps/users/forms.py:111 apps/users/models.py:489
msgid "Date Format" msgid "Date Format"
msgstr "" msgstr ""
#: apps/users/forms.py:112 apps/users/models.py:489 #: apps/users/forms.py:116 apps/users/models.py:494
msgid "Datetime Format" msgid "Datetime Format"
msgstr "" msgstr ""
#: apps/users/forms.py:118 apps/users/models.py:492 #: apps/users/forms.py:122 apps/users/models.py:497
msgid "Number Format" msgid "Number Format"
msgstr "" msgstr ""
#: apps/users/forms.py:125 #: apps/users/forms.py:129
msgid "Default Account" msgid "Default Account"
msgstr "" msgstr ""
#: apps/users/forms.py:174 #: apps/users/forms.py:178
#, python-format #, python-format
msgid "" msgid ""
"This changes the language (if available) and how numbers and dates are " "This changes the language (if available) and how numbers and dates are "
@@ -1913,130 +1919,202 @@ msgid ""
"Consider helping translate WYGIWYH to your language at %(translation_link)s" "Consider helping translate WYGIWYH to your language at %(translation_link)s"
msgstr "" msgstr ""
#: apps/users/forms.py:183 #: apps/users/forms.py:187
msgid "New Password" msgid "New Password"
msgstr "" msgstr ""
#: apps/users/forms.py:186 #: apps/users/forms.py:190
msgid "Leave blank to keep the current password." msgid "Leave blank to keep the current password."
msgstr "" msgstr ""
#: apps/users/forms.py:189 #: apps/users/forms.py:193
msgid "Confirm New Password" msgid "Confirm New Password"
msgstr "" msgstr ""
#: apps/users/forms.py:201 apps/users/forms.py:358 #: apps/users/forms.py:205 apps/users/forms.py:362
msgid "" msgid ""
"Designates whether this user should be treated as active. Unselect this " "Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts." "instead of deleting accounts."
msgstr "" msgstr ""
#: apps/users/forms.py:204 apps/users/forms.py:361 #: apps/users/forms.py:208 apps/users/forms.py:365
msgid "" msgid ""
"Designates that this user has all permissions without explicitly assigning " "Designates that this user has all permissions without explicitly assigning "
"them." "them."
msgstr "" msgstr ""
#: apps/users/forms.py:271 #: apps/users/forms.py:275
msgid "This email address is already in use by another account." msgid "This email address is already in use by another account."
msgstr "" msgstr ""
#: apps/users/forms.py:279 #: apps/users/forms.py:283
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "" msgstr ""
#: apps/users/forms.py:281 #: apps/users/forms.py:285
msgid "Please confirm your new password." msgid "Please confirm your new password."
msgstr "" msgstr ""
#: apps/users/forms.py:283 #: apps/users/forms.py:287
msgid "Please enter the new password first." msgid "Please enter the new password first."
msgstr "" msgstr ""
#: apps/users/forms.py:303 #: apps/users/forms.py:307
msgid "You cannot deactivate your own account using this form." msgid "You cannot deactivate your own account using this form."
msgstr "" msgstr ""
#: apps/users/forms.py:316 #: apps/users/forms.py:320
msgid "Cannot remove status from the last superuser." msgid "Cannot remove status from the last superuser."
msgstr "" msgstr ""
#: apps/users/forms.py:322 #: apps/users/forms.py:326
msgid "You cannot remove your own superuser status using this form." msgid "You cannot remove your own superuser status using this form."
msgstr "" msgstr ""
#: apps/users/forms.py:415 #: apps/users/forms.py:419
msgid "A user with this email address already exists." msgid "A user with this email address already exists."
msgstr "" msgstr ""
#: apps/users/models.py:465 #: apps/users/forms.py:439
msgid "Token name"
msgstr ""
#: apps/users/forms.py:441
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
msgid "Create token"
msgstr ""
#: apps/users/models.py:470
msgid "Yearly by currency" msgid "Yearly by currency"
msgstr "" msgstr ""
#: apps/users/models.py:466 #: apps/users/models.py:471
msgid "Yearly by account" msgid "Yearly by account"
msgstr "" msgstr ""
#: apps/users/models.py:467 templates/net_worth/net_worth.html:9 #: apps/users/models.py:472 templates/net_worth/net_worth.html:9
msgid "Current Net Worth" msgid "Current Net Worth"
msgstr "" msgstr ""
#: apps/users/models.py:468 templates/net_worth/net_worth.html:11 #: apps/users/models.py:473 templates/net_worth/net_worth.html:11
msgid "Projected Net Worth" msgid "Projected Net Worth"
msgstr "" msgstr ""
#: apps/users/models.py:469 #: apps/users/models.py:474
msgid "All Transactions" msgid "All Transactions"
msgstr "" msgstr ""
#: apps/users/models.py:470 templates/includes/sidebar.html:63 #: apps/users/models.py:475 templates/includes/sidebar.html:63
msgid "Calendar" msgid "Calendar"
msgstr "" msgstr ""
#: apps/users/models.py:480 #: apps/users/models.py:485
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: apps/users/models.py:499 #: apps/users/models.py:504
msgid "Language" msgid "Language"
msgstr "" msgstr ""
#: apps/users/models.py:505 #: apps/users/models.py:510
msgid "Time Zone" msgid "Time Zone"
msgstr "" msgstr ""
#: apps/users/models.py:511 #: apps/users/models.py:516
msgid "Start page" msgid "Start page"
msgstr "" msgstr ""
#: apps/users/models.py:516 #: apps/users/models.py:521
msgid "Default account" msgid "Default account"
msgstr "" msgstr ""
#: apps/users/models.py:517 #: apps/users/models.py:522
msgid "Selects the account by default when creating new transactions" msgid "Selects the account by default when creating new transactions"
msgstr "" msgstr ""
#: apps/users/views.py:67 #: apps/users/models.py:570
msgid "User"
msgstr ""
#: apps/users/models.py:577
msgid "Token key"
msgstr ""
#: apps/users/models.py:579
msgid "Token hash"
msgstr ""
#: apps/users/models.py:583
msgid "Last used at"
msgstr ""
#: apps/users/models.py:588
msgid "Expires at"
msgstr ""
#: apps/users/models.py:593
msgid "Revoked at"
msgstr ""
#: apps/users/models.py:595
msgid "Created at"
msgstr ""
#: apps/users/models.py:596
msgid "Updated at"
msgstr ""
#: apps/users/models.py:606
msgid "API token"
msgstr ""
#: apps/users/models.py:607
msgid "API tokens"
msgstr ""
#: apps/users/views.py:69
msgid "Transaction amounts are now hidden" msgid "Transaction amounts are now hidden"
msgstr "" msgstr ""
#: apps/users/views.py:70 #: apps/users/views.py:72
msgid "Transaction amounts are now displayed" msgid "Transaction amounts are now displayed"
msgstr "" msgstr ""
#: apps/users/views.py:88 #: apps/users/views.py:90
msgid "Sounds are now muted" msgid "Sounds are now muted"
msgstr "" msgstr ""
#: apps/users/views.py:91 #: apps/users/views.py:93
msgid "Sounds will now play" msgid "Sounds will now play"
msgstr "" msgstr ""
#: apps/users/views.py:107 #: apps/users/views.py:109
msgid "Your settings have been updated" msgid "Your settings have been updated"
msgstr "" msgstr ""
#: apps/users/views.py:148
msgid "API token created successfully"
msgstr ""
#: apps/users/views.py:167
msgid "API token revoked successfully"
msgstr ""
#: apps/users/views.py:178
msgid "API token deleted successfully"
msgstr ""
#: templates/account_groups/fragments/add.html:5 #: templates/account_groups/fragments/add.html:5
msgid "Add account group" msgid "Add account group"
msgstr "" msgstr ""
@@ -2134,6 +2212,7 @@ msgstr ""
#: templates/rules/fragments/transaction_rule/view.html:92 #: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133 #: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51 #: templates/tags/fragments/table.html:51
#: templates/users/fragments/api_tokens.html:93
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
@@ -2211,6 +2290,7 @@ msgstr ""
#: templates/rules/fragments/transaction_rule/view.html:98 #: templates/rules/fragments/transaction_rule/view.html:98
#: templates/tags/fragments/table.html:57 #: templates/tags/fragments/table.html:57
#: templates/transactions/fragments/attachments.html:22 #: templates/transactions/fragments/attachments.html:22
#: templates/users/fragments/api_tokens.html:101
msgid "Yes, delete it!" msgid "Yes, delete it!"
msgstr "" msgstr ""
@@ -3206,6 +3286,10 @@ msgstr ""
msgid "This is a demo!" msgid "This is a demo!"
msgstr "" msgstr ""
#: templates/layouts/base.html:37
msgid "Any data you add here will be wiped in 24hrs or less"
msgstr ""
#: templates/mini_tools/currency_converter/currency_converter.html:57 #: templates/mini_tools/currency_converter/currency_converter.html:57
msgid "Invert" msgid "Invert"
msgstr "" msgstr ""
@@ -3578,6 +3662,83 @@ msgstr ""
msgid "Add user" msgid "Add user"
msgstr "" msgstr ""
#: templates/users/fragments/api_tokens.html:5
msgid "API Tokens"
msgstr ""
#: templates/users/fragments/api_tokens.html:7
msgid ""
"Use these tokens for automations such as n8n. The raw token is shown only "
"once after creation."
msgstr ""
#: templates/users/fragments/api_tokens.html:14
msgid "Copy this token now"
msgstr ""
#: templates/users/fragments/api_tokens.html:16
msgid "It will not be shown again after this response."
msgstr ""
#: templates/users/fragments/api_tokens.html:31
msgid "Copy"
msgstr ""
#: templates/users/fragments/api_tokens.html:52
msgid "Revoked"
msgstr ""
#: templates/users/fragments/api_tokens.html:59
#, python-format
msgid "Created %(created)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:62
#, python-format
msgid "last used %(used)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:64
msgid "never used"
msgstr ""
#: templates/users/fragments/api_tokens.html:68
#, python-format
msgid "expires %(expires)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:70
msgid "no expiry"
msgstr ""
#: templates/users/fragments/api_tokens.html:78
msgid "Revoke"
msgstr ""
#: templates/users/fragments/api_tokens.html:84
msgid "Revoke token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:85
msgid "This token will stop working immediately."
msgstr ""
#: templates/users/fragments/api_tokens.html:86
msgid "Yes, revoke it!"
msgstr ""
#: templates/users/fragments/api_tokens.html:99
msgid "Delete token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:100
msgid "This permanently removes the token from the list. It cannot be undone."
msgstr ""
#: templates/users/fragments/api_tokens.html:114
msgid "No API tokens"
msgstr ""
#: templates/users/fragments/edit.html:5 #: templates/users/fragments/edit.html:5
msgid "Edit user" msgid "Edit user"
msgstr "" msgstr ""
+242 -60
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-06 08:15+0000\n" "POT-Creation-Date: 2026-07-04 15:39+0000\n"
"PO-Revision-Date: 2026-02-24 01:24+0000\n" "PO-Revision-Date: 2026-02-24 01:24+0000\n"
"Last-Translator: Juan David Afanador <juanafanador07@gmail.com>\n" "Last-Translator: Juan David Afanador <juanafanador07@gmail.com>\n"
"Language-Team: Spanish <https://translations.herculino.com/projects/wygiwyh/" "Language-Team: Spanish <https://translations.herculino.com/projects/wygiwyh/"
@@ -31,8 +31,8 @@ msgstr "Nombre del Grupo"
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536 #: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919 #: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978 #: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:242 #: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:400 #: apps/users/forms.py:404
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5 #: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128 #: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update" msgid "Update"
@@ -47,7 +47,7 @@ msgstr "Actualizar"
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886 #: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953 #: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134 #: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:248 apps/users/forms.py:406 #: apps/users/forms.py:252 apps/users/forms.py:410
#: templates/mini_tools/unit_price_calculator.html:168 #: templates/mini_tools/unit_price_calculator.html:168
msgid "Add" msgid "Add"
msgstr "Agregar" msgstr "Agregar"
@@ -99,7 +99,7 @@ msgstr "Etiquetas"
#: apps/import_app/models.py:14 apps/rules/models.py:13 #: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248 #: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057 #: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: templates/account_groups/fragments/list.html:22 #: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22 #: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17 #: templates/categories/fragments/table.html:17
#: templates/currencies/fragments/list.html:23 #: templates/currencies/fragments/list.html:23
@@ -353,7 +353,7 @@ msgstr ""
"compartido. Solo el propietario puede editarlo.<br/>Público: Visible para " "compartido. Solo el propietario puede editarlo.<br/>Público: Visible para "
"todos los usuarios. Solo el propietario puede editarlo." "todos los usuarios. Solo el propietario puede editarlo."
#: apps/common/forms.py:76 apps/users/forms.py:169 #: apps/common/forms.py:76 apps/users/forms.py:173
msgid "Save" msgid "Save"
msgstr "Guardar" msgstr "Guardar"
@@ -539,8 +539,8 @@ msgstr "Tasa de cambio"
msgid "Date and Time" msgid "Date and Time"
msgstr "Fecha y Hora" msgstr "Fecha y Hora"
#: apps/currencies/models.py:78 apps/users/models.py:12 #: apps/currencies/models.py:78 apps/users/models.py:17
#: apps/users/models.py:497 #: apps/users/models.py:502
msgid "Auto" msgid "Auto"
msgstr "Automático" msgstr "Automático"
@@ -581,7 +581,9 @@ msgstr "Tipo de Servicio"
#: templates/entities/fragments/list.html:16 #: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16 #: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16 #: templates/recurring_transactions/fragments/list.html:16
#: templates/tags/fragments/list.html:16 templates/users/fragments/list.html:25 #: templates/tags/fragments/list.html:16
#: templates/users/fragments/api_tokens.html:54
#: templates/users/fragments/list.html:25
msgid "Active" msgid "Active"
msgstr "Activo" msgstr "Activo"
@@ -1608,7 +1610,7 @@ msgstr "Etiquetas de Transacción"
msgid "Yearly" msgid "Yearly"
msgstr "Anual" msgstr "Anual"
#: apps/transactions/models.py:596 apps/users/models.py:464 #: apps/transactions/models.py:596 apps/users/models.py:469
#: templates/includes/sidebar.html:51 #: templates/includes/sidebar.html:51
msgid "Monthly" msgid "Monthly"
msgstr "Mensual" msgstr "Mensual"
@@ -1799,11 +1801,11 @@ msgid "Installment Plan deleted successfully"
msgstr "Plan de cuotas eliminado con éxito" msgstr "Plan de cuotas eliminado con éxito"
#: apps/transactions/views/quick_transactions.py:45 #: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:188 #: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:252
msgid "Item added successfully" msgid "Item added successfully"
msgstr "Ítem agregado con éxito" msgstr "Ítem agregado con éxito"
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:220 #: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:284
msgid "Item updated successfully" msgid "Item updated successfully"
msgstr "Ítem actualizado con éxito" msgstr "Ítem actualizado con éxito"
@@ -1892,44 +1894,48 @@ msgstr "Transacción restaurada exitosamente"
msgid "Transfer added successfully" msgid "Transfer added successfully"
msgstr "Transferencia añadida exitosamente" msgstr "Transferencia añadida exitosamente"
#: apps/users/admin.py:22 templates/users/fragments/user_settings.html:5 #: apps/users/admin.py:17
msgid "Revoke selected API tokens"
msgstr ""
#: apps/users/admin.py:28 templates/users/fragments/user_settings.html:5
msgid "User Settings" msgid "User Settings"
msgstr "Configuraciones de Usuario" msgstr "Configuraciones de Usuario"
#: apps/users/admin.py:23 #: apps/users/admin.py:29
msgid "User Setting" msgid "User Setting"
msgstr "Configuración de Usuario" msgstr "Configuración de Usuario"
#: apps/users/admin.py:48 #: apps/users/admin.py:54
msgid "Personal info" msgid "Personal info"
msgstr "Información Personal" msgstr "Información Personal"
#: apps/users/admin.py:50 #: apps/users/admin.py:56
msgid "Permissions" msgid "Permissions"
msgstr "Permisos" msgstr "Permisos"
#: apps/users/admin.py:61 #: apps/users/admin.py:67
msgid "Important dates" msgid "Important dates"
msgstr "Fechas Importantes" msgstr "Fechas Importantes"
#: apps/users/forms.py:24 apps/users/forms.py:28 apps/users/models.py:451 #: apps/users/forms.py:28 apps/users/forms.py:32 apps/users/models.py:456
#: templates/users/login.html:18 #: templates/users/login.html:18
msgid "E-mail" msgid "E-mail"
msgstr "Correo Electrónico" msgstr "Correo Electrónico"
#: apps/users/forms.py:35 apps/users/forms.py:40 templates/users/login.html:19 #: apps/users/forms.py:39 apps/users/forms.py:44 templates/users/login.html:19
msgid "Password" msgid "Password"
msgstr "Contraseña" msgstr "Contraseña"
#: apps/users/forms.py:47 #: apps/users/forms.py:51
msgid "Invalid e-mail or password" msgid "Invalid e-mail or password"
msgstr "Correo o contraseña no válidos" msgstr "Correo o contraseña no válidos"
#: apps/users/forms.py:48 #: apps/users/forms.py:52
msgid "This account is deactivated" msgid "This account is deactivated"
msgstr "Esta cuenta está desactivada" msgstr "Esta cuenta está desactivada"
#: apps/users/forms.py:64 apps/users/forms.py:77 apps/users/forms.py:99 #: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98 #: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245 #: templates/monthly_overview/pages/overview.html:245
#: templates/transactions/pages/transactions.html:47 #: templates/transactions/pages/transactions.html:47
@@ -1937,23 +1943,23 @@ msgstr "Esta cuenta está desactivada"
msgid "Default" msgid "Default"
msgstr "Por Defecto" msgstr "Por Defecto"
#: apps/users/forms.py:107 apps/users/models.py:484 #: apps/users/forms.py:111 apps/users/models.py:489
msgid "Date Format" msgid "Date Format"
msgstr "Formato de Fecha" msgstr "Formato de Fecha"
#: apps/users/forms.py:112 apps/users/models.py:489 #: apps/users/forms.py:116 apps/users/models.py:494
msgid "Datetime Format" msgid "Datetime Format"
msgstr "Formato de Fecha y Hora" msgstr "Formato de Fecha y Hora"
#: apps/users/forms.py:118 apps/users/models.py:492 #: apps/users/forms.py:122 apps/users/models.py:497
msgid "Number Format" msgid "Number Format"
msgstr "Formato de Número" msgstr "Formato de Número"
#: apps/users/forms.py:125 #: apps/users/forms.py:129
msgid "Default Account" msgid "Default Account"
msgstr "Cuenta por Defecto" msgstr "Cuenta por Defecto"
#: apps/users/forms.py:174 #: apps/users/forms.py:178
#, python-format #, python-format
msgid "" msgid ""
"This changes the language (if available) and how numbers and dates are " "This changes the language (if available) and how numbers and dates are "
@@ -1964,19 +1970,19 @@ msgstr ""
"y las fechas\n" "y las fechas\n"
"Ayude a traducir WYGIWYH a su idioma en %(translation_link)s" "Ayude a traducir WYGIWYH a su idioma en %(translation_link)s"
#: apps/users/forms.py:183 #: apps/users/forms.py:187
msgid "New Password" msgid "New Password"
msgstr "Nueva Contraseña" msgstr "Nueva Contraseña"
#: apps/users/forms.py:186 #: apps/users/forms.py:190
msgid "Leave blank to keep the current password." msgid "Leave blank to keep the current password."
msgstr "Deje en blanco para mantener la contraseña actual." msgstr "Deje en blanco para mantener la contraseña actual."
#: apps/users/forms.py:189 #: apps/users/forms.py:193
msgid "Confirm New Password" msgid "Confirm New Password"
msgstr "Confirmar nueva contraseña" msgstr "Confirmar nueva contraseña"
#: apps/users/forms.py:201 apps/users/forms.py:358 #: apps/users/forms.py:205 apps/users/forms.py:362
msgid "" msgid ""
"Designates whether this user should be treated as active. Unselect this " "Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts." "instead of deleting accounts."
@@ -1984,7 +1990,7 @@ msgstr ""
"Establece si este usuario debe ser tratado como activo. Desmarque esta " "Establece si este usuario debe ser tratado como activo. Desmarque esta "
"opción en lugar de borrar cuentas." "opción en lugar de borrar cuentas."
#: apps/users/forms.py:204 apps/users/forms.py:361 #: apps/users/forms.py:208 apps/users/forms.py:365
msgid "" msgid ""
"Designates that this user has all permissions without explicitly assigning " "Designates that this user has all permissions without explicitly assigning "
"them." "them."
@@ -1992,107 +1998,199 @@ msgstr ""
"Establece que este usuario tiene todos los permisos sin asignárselos " "Establece que este usuario tiene todos los permisos sin asignárselos "
"expresamente." "expresamente."
#: apps/users/forms.py:271 #: apps/users/forms.py:275
msgid "This email address is already in use by another account." msgid "This email address is already in use by another account."
msgstr "Esta dirección de correo es usada por otra cuenta." msgstr "Esta dirección de correo es usada por otra cuenta."
#: apps/users/forms.py:279 #: apps/users/forms.py:283
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "Los dos campos de contraseñas no coinciden." msgstr "Los dos campos de contraseñas no coinciden."
#: apps/users/forms.py:281 #: apps/users/forms.py:285
msgid "Please confirm your new password." msgid "Please confirm your new password."
msgstr "Por favor, confirme su nueva contraseña." msgstr "Por favor, confirme su nueva contraseña."
#: apps/users/forms.py:283 #: apps/users/forms.py:287
msgid "Please enter the new password first." msgid "Please enter the new password first."
msgstr "Por favor, introduzca su nueva contraseña." msgstr "Por favor, introduzca su nueva contraseña."
#: apps/users/forms.py:303 #: apps/users/forms.py:307
msgid "You cannot deactivate your own account using this form." msgid "You cannot deactivate your own account using this form."
msgstr "No puede desactivar su propia cuenta usando este formulario." msgstr "No puede desactivar su propia cuenta usando este formulario."
#: apps/users/forms.py:316 #: apps/users/forms.py:320
msgid "Cannot remove status from the last superuser." msgid "Cannot remove status from the last superuser."
msgstr "No se puede eliminar el estado del último superusuario." msgstr "No se puede eliminar el estado del último superusuario."
#: apps/users/forms.py:322 #: apps/users/forms.py:326
msgid "You cannot remove your own superuser status using this form." msgid "You cannot remove your own superuser status using this form."
msgstr "" msgstr ""
"No puedes eliminar tu propio estado de superusuario usando este formulario." "No puedes eliminar tu propio estado de superusuario usando este formulario."
#: apps/users/forms.py:415 #: apps/users/forms.py:419
msgid "A user with this email address already exists." msgid "A user with this email address already exists."
msgstr "Ya existe un usuario con este correo." msgstr "Ya existe un usuario con este correo."
#: apps/users/models.py:465 #: apps/users/forms.py:439
#, fuzzy
#| msgid "Tag name"
msgid "Token name"
msgstr "Nombre de etiqueta"
#: apps/users/forms.py:441
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
#, fuzzy
#| msgid "Create transaction"
msgid "Create token"
msgstr "Crear transacción"
#: apps/users/models.py:470
msgid "Yearly by currency" msgid "Yearly by currency"
msgstr "Anual por moneda" msgstr "Anual por moneda"
#: apps/users/models.py:466 #: apps/users/models.py:471
msgid "Yearly by account" msgid "Yearly by account"
msgstr "Anual por cuenta" msgstr "Anual por cuenta"
#: apps/users/models.py:467 templates/net_worth/net_worth.html:9 #: apps/users/models.py:472 templates/net_worth/net_worth.html:9
msgid "Current Net Worth" msgid "Current Net Worth"
msgstr "Patrimonio Neto Actual" msgstr "Patrimonio Neto Actual"
#: apps/users/models.py:468 templates/net_worth/net_worth.html:11 #: apps/users/models.py:473 templates/net_worth/net_worth.html:11
msgid "Projected Net Worth" msgid "Projected Net Worth"
msgstr "Patrimonio Neto Proyectado" msgstr "Patrimonio Neto Proyectado"
#: apps/users/models.py:469 #: apps/users/models.py:474
msgid "All Transactions" msgid "All Transactions"
msgstr "Todas las Transacciones" msgstr "Todas las Transacciones"
#: apps/users/models.py:470 templates/includes/sidebar.html:63 #: apps/users/models.py:475 templates/includes/sidebar.html:63
msgid "Calendar" msgid "Calendar"
msgstr "Calendario" msgstr "Calendario"
#: apps/users/models.py:480 #: apps/users/models.py:485
msgid "Volume" msgid "Volume"
msgstr "Volumen" msgstr "Volumen"
#: apps/users/models.py:499 #: apps/users/models.py:504
msgid "Language" msgid "Language"
msgstr "Idioma" msgstr "Idioma"
#: apps/users/models.py:505 #: apps/users/models.py:510
msgid "Time Zone" msgid "Time Zone"
msgstr "Zona Horaria" msgstr "Zona Horaria"
#: apps/users/models.py:511 #: apps/users/models.py:516
msgid "Start page" msgid "Start page"
msgstr "Página de Inicio" msgstr "Página de Inicio"
#: apps/users/models.py:516 #: apps/users/models.py:521
msgid "Default account" msgid "Default account"
msgstr "Cuenta por Defecto" msgstr "Cuenta por Defecto"
#: apps/users/models.py:517 #: apps/users/models.py:522
msgid "Selects the account by default when creating new transactions" msgid "Selects the account by default when creating new transactions"
msgstr "Usa la cuenta como predeterminada al crear nuevas transacciones" msgstr "Usa la cuenta como predeterminada al crear nuevas transacciones"
#: apps/users/views.py:67 #: apps/users/models.py:570
#, fuzzy
#| msgid "Users"
msgid "User"
msgstr "Usuarios"
#: apps/users/models.py:577
msgid "Token key"
msgstr ""
#: apps/users/models.py:579
msgid "Token hash"
msgstr ""
#: apps/users/models.py:583
#, fuzzy
#| msgid "Last Generated Date"
msgid "Last used at"
msgstr "Última Fecha Generada"
#: apps/users/models.py:588
msgid "Expires at"
msgstr ""
#: apps/users/models.py:593
msgid "Revoked at"
msgstr ""
#: apps/users/models.py:595
#, fuzzy
#| msgid "Create"
msgid "Created at"
msgstr "Crear"
#: apps/users/models.py:596
#, fuzzy
#| msgid "Update"
msgid "Updated at"
msgstr "Actualizar"
#: apps/users/models.py:606
#, fuzzy
#| msgid "API Key"
msgid "API token"
msgstr "Clave API"
#: apps/users/models.py:607
msgid "API tokens"
msgstr ""
#: apps/users/views.py:69
msgid "Transaction amounts are now hidden" msgid "Transaction amounts are now hidden"
msgstr "Los montos de las transacciones ahora están ocultos" msgstr "Los montos de las transacciones ahora están ocultos"
#: apps/users/views.py:70 #: apps/users/views.py:72
msgid "Transaction amounts are now displayed" msgid "Transaction amounts are now displayed"
msgstr "Los montos de las transacciones ahora son visibles" msgstr "Los montos de las transacciones ahora son visibles"
#: apps/users/views.py:88 #: apps/users/views.py:90
msgid "Sounds are now muted" msgid "Sounds are now muted"
msgstr "Los sonidos ahora están silenciados" msgstr "Los sonidos ahora están silenciados"
#: apps/users/views.py:91 #: apps/users/views.py:93
msgid "Sounds will now play" msgid "Sounds will now play"
msgstr "Los sonidos se han activado" msgstr "Los sonidos se han activado"
#: apps/users/views.py:107 #: apps/users/views.py:109
msgid "Your settings have been updated" msgid "Your settings have been updated"
msgstr "Tus ajustes han sido actualizados" msgstr "Tus ajustes han sido actualizados"
#: apps/users/views.py:148
#, fuzzy
#| msgid "Action updated successfully"
msgid "API token created successfully"
msgstr "Acción actualizada con éxito"
#: apps/users/views.py:167
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token revoked successfully"
msgstr "Acción eliminada con éxito"
#: apps/users/views.py:178
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token deleted successfully"
msgstr "Acción eliminada con éxito"
#: templates/account_groups/fragments/add.html:5 #: templates/account_groups/fragments/add.html:5
msgid "Add account group" msgid "Add account group"
msgstr "Agregar grupo de cuentas" msgstr "Agregar grupo de cuentas"
@@ -2190,6 +2288,7 @@ msgstr "Compartir"
#: templates/rules/fragments/transaction_rule/view.html:92 #: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133 #: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51 #: templates/tags/fragments/table.html:51
#: templates/users/fragments/api_tokens.html:93
msgid "Delete" msgid "Delete"
msgstr "Borrar" msgstr "Borrar"
@@ -2267,6 +2366,7 @@ msgstr "¡No podrás revertir esto!"
#: templates/rules/fragments/transaction_rule/view.html:98 #: templates/rules/fragments/transaction_rule/view.html:98
#: templates/tags/fragments/table.html:57 #: templates/tags/fragments/table.html:57
#: templates/transactions/fragments/attachments.html:22 #: templates/transactions/fragments/attachments.html:22
#: templates/users/fragments/api_tokens.html:101
msgid "Yes, delete it!" msgid "Yes, delete it!"
msgstr "¡Sí, bórralo!" msgstr "¡Sí, bórralo!"
@@ -3270,6 +3370,10 @@ msgstr "Sin planes de cuotas"
msgid "This is a demo!" msgid "This is a demo!"
msgstr "¡Esto es una demostración!" msgstr "¡Esto es una demostración!"
#: templates/layouts/base.html:37
msgid "Any data you add here will be wiped in 24hrs or less"
msgstr "Los datos que agregues aquí serán borrados en 24 horas o menos"
#: templates/mini_tools/currency_converter/currency_converter.html:57 #: templates/mini_tools/currency_converter/currency_converter.html:57
msgid "Invert" msgid "Invert"
msgstr "Intercambiar" msgstr "Intercambiar"
@@ -3650,6 +3754,87 @@ msgstr "Sin cambios"
msgid "Add user" msgid "Add user"
msgstr "Agregar usuario" msgstr "Agregar usuario"
#: templates/users/fragments/api_tokens.html:5
msgid "API Tokens"
msgstr ""
#: templates/users/fragments/api_tokens.html:7
msgid ""
"Use these tokens for automations such as n8n. The raw token is shown only "
"once after creation."
msgstr ""
#: templates/users/fragments/api_tokens.html:14
msgid "Copy this token now"
msgstr ""
#: templates/users/fragments/api_tokens.html:16
msgid "It will not be shown again after this response."
msgstr ""
#: templates/users/fragments/api_tokens.html:31
msgid "Copy"
msgstr ""
#: templates/users/fragments/api_tokens.html:52
msgid "Revoked"
msgstr ""
#: templates/users/fragments/api_tokens.html:59
#, python-format
msgid "Created %(created)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:62
#, python-format
msgid "last used %(used)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:64
msgid "never used"
msgstr ""
#: templates/users/fragments/api_tokens.html:68
#, python-format
msgid "expires %(expires)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:70
msgid "no expiry"
msgstr ""
#: templates/users/fragments/api_tokens.html:78
msgid "Revoke"
msgstr ""
#: templates/users/fragments/api_tokens.html:84
msgid "Revoke token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:85
msgid "This token will stop working immediately."
msgstr ""
#: templates/users/fragments/api_tokens.html:86
#, fuzzy
#| msgid "Yes, refresh it!"
msgid "Yes, revoke it!"
msgstr "¡Sí, actualízalo!"
#: templates/users/fragments/api_tokens.html:99
#, fuzzy
#| msgid "Deleted At"
msgid "Delete token?"
msgstr "Eliminado en"
#: templates/users/fragments/api_tokens.html:100
msgid "This permanently removes the token from the list. It cannot be undone."
msgstr ""
#: templates/users/fragments/api_tokens.html:114
msgid "No API tokens"
msgstr ""
#: templates/users/fragments/edit.html:5 #: templates/users/fragments/edit.html:5
msgid "Edit user" msgid "Edit user"
msgstr "Editar usuario" msgstr "Editar usuario"
@@ -3702,9 +3887,6 @@ msgstr "Iniciar sesión con"
msgid "Yearly Overview" msgid "Yearly Overview"
msgstr "Resumen Anual" msgstr "Resumen Anual"
#~ msgid "Any data you add here will be wiped in 24hrs or less"
#~ msgstr "Los datos que agregues aquí serán borrados en 24 horas o menos"
#, fuzzy #, fuzzy
#~| msgid "Are you sure?" #~| msgid "Are you sure?"
#~ msgid " Are you sure?" #~ msgid " Are you sure?"
+272 -116
View File
@@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-06 08:15+0000\n" "POT-Creation-Date: 2026-07-04 15:39+0000\n"
"PO-Revision-Date: 2026-02-23 08:24+0000\n" "PO-Revision-Date: 2026-06-27 21:57+0000\n"
"Last-Translator: Erwan Colin <zephone@protonmail.com>\n" "Last-Translator: sorcierwax <freakywax@gmail.com>\n"
"Language-Team: French <https://translations.herculino.com/projects/wygiwyh/" "Language-Team: French <https://translations.herculino.com/projects/wygiwyh/"
"app/fr/>\n" "app/fr/>\n"
"Language: fr\n" "Language: fr\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.15.2\n" "X-Generator: Weblate 2026.6.1\n"
#: apps/accounts/forms.py:24 #: apps/accounts/forms.py:24
msgid "Group name" msgid "Group name"
@@ -31,8 +31,8 @@ msgstr "Nom du groupe"
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536 #: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919 #: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978 #: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:242 #: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:400 #: apps/users/forms.py:404
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5 #: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128 #: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update" msgid "Update"
@@ -47,7 +47,7 @@ msgstr "Mise à jour"
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886 #: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953 #: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134 #: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:248 apps/users/forms.py:406 #: apps/users/forms.py:252 apps/users/forms.py:410
#: templates/mini_tools/unit_price_calculator.html:168 #: templates/mini_tools/unit_price_calculator.html:168
msgid "Add" msgid "Add"
msgstr "Ajouter" msgstr "Ajouter"
@@ -99,7 +99,7 @@ msgstr "Etiquettes"
#: apps/import_app/models.py:14 apps/rules/models.py:13 #: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248 #: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057 #: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: templates/account_groups/fragments/list.html:22 #: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22 #: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17 #: templates/categories/fragments/table.html:17
#: templates/currencies/fragments/list.html:23 #: templates/currencies/fragments/list.html:23
@@ -351,11 +351,11 @@ msgid ""
"Private: Only shown for the owner and shared users. Only editable by the " "Private: Only shown for the owner and shared users. Only editable by the "
"owner.<br/>Public: Shown for all users. Only editable by the owner." "owner.<br/>Public: Shown for all users. Only editable by the owner."
msgstr "" msgstr ""
"Privé : Visible uniquement pour le propriétaire et les utilisateurs " "Privé : Visible uniquement pour le propriétaire et les utilisateurs "
"partagés. Seulement modifiable par le propriétaire.<br/> Publique : Visible " "partagés. Seulement modifiable par le propriétaire.<br/> Publique : Visible "
"par tous. Seulement modifiable par le propriétaire." "par tous. Seulement modifiable par le propriétaire."
#: apps/common/forms.py:76 apps/users/forms.py:169 #: apps/common/forms.py:76 apps/users/forms.py:173
msgid "Save" msgid "Save"
msgstr "Sauvegarder" msgstr "Sauvegarder"
@@ -541,8 +541,8 @@ msgstr "Taux de change"
msgid "Date and Time" msgid "Date and Time"
msgstr "Date et Heure" msgstr "Date et Heure"
#: apps/currencies/models.py:78 apps/users/models.py:12 #: apps/currencies/models.py:78 apps/users/models.py:17
#: apps/users/models.py:497 #: apps/users/models.py:502
msgid "Auto" msgid "Auto"
msgstr "Auto" msgstr "Auto"
@@ -583,7 +583,9 @@ msgstr "Type de Service"
#: templates/entities/fragments/list.html:16 #: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16 #: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16 #: templates/recurring_transactions/fragments/list.html:16
#: templates/tags/fragments/list.html:16 templates/users/fragments/list.html:25 #: templates/tags/fragments/list.html:16
#: templates/users/fragments/api_tokens.html:54
#: templates/users/fragments/list.html:25
msgid "Active" msgid "Active"
msgstr "Actif" msgstr "Actif"
@@ -1420,19 +1422,19 @@ msgstr "Enregistrer et ajouter un autre"
#: apps/transactions/forms.py:270 templates/cotton/transaction/item.html:158 #: apps/transactions/forms.py:270 templates/cotton/transaction/item.html:158
#: templates/transactions/fragments/attachments.html:4 #: templates/transactions/fragments/attachments.html:4
#, fuzzy
#| msgid "Installments"
msgid "Attachments" msgid "Attachments"
msgstr "Paiements en plusieurs fois" msgstr "Fichiers attachés"
#: apps/transactions/forms.py:271 #: apps/transactions/forms.py:271
msgid "" msgid ""
"Files are private and only visible to users with access to this transaction." "Files are private and only visible to users with access to this transaction."
msgstr "" msgstr ""
"Les fichiers sont privés et visibles uniquement pour les utilisateurs "
"autorisés à voir cette transaction."
#: apps/transactions/forms.py:282 #: apps/transactions/forms.py:282
msgid "Upload" msgid "Upload"
msgstr "" msgstr "Envoi"
#: apps/transactions/forms.py:351 apps/transactions/forms.py:623 #: apps/transactions/forms.py:351 apps/transactions/forms.py:623
msgid "Muted transactions won't be displayed on monthly summaries" msgid "Muted transactions won't be displayed on monthly summaries"
@@ -1571,46 +1573,38 @@ msgid "No description"
msgstr "Pas de description" msgstr "Pas de description"
#: apps/transactions/models.py:549 #: apps/transactions/models.py:549
#, fuzzy
#| msgid "ZIP File"
msgid "File" msgid "File"
msgstr "Fichier ZIP" msgstr "Fichier"
#: apps/transactions/models.py:551 #: apps/transactions/models.py:551
msgid "Original Name" msgid "Original Name"
msgstr "" msgstr "Nom initial"
#: apps/transactions/models.py:553 #: apps/transactions/models.py:553
#, fuzzy
#| msgid "Content"
msgid "Content Type" msgid "Content Type"
msgstr "Contenu" msgstr "Type de contenu"
#: apps/transactions/models.py:555 #: apps/transactions/models.py:555
msgid "Size" msgid "Size"
msgstr "" msgstr "Taille"
#: apps/transactions/models.py:560 #: apps/transactions/models.py:560
msgid "Uploaded By" msgid "Uploaded By"
msgstr "" msgstr "Envoyer par"
#: apps/transactions/models.py:565 #: apps/transactions/models.py:565
#, fuzzy
#| msgid "Transactions on"
msgid "Transaction Attachment" msgid "Transaction Attachment"
msgstr "Transactions du" msgstr "Fichiers de la transaction"
#: apps/transactions/models.py:566 #: apps/transactions/models.py:566
#, fuzzy
#| msgid "Transaction Tags"
msgid "Transaction Attachments" msgid "Transaction Attachments"
msgstr "Etiquettes de transaction" msgstr "Fichiers de transactions"
#: apps/transactions/models.py:595 templates/includes/sidebar.html:57 #: apps/transactions/models.py:595 templates/includes/sidebar.html:57
msgid "Yearly" msgid "Yearly"
msgstr "Annuel" msgstr "Annuel"
#: apps/transactions/models.py:596 apps/users/models.py:464 #: apps/transactions/models.py:596 apps/users/models.py:469
#: templates/includes/sidebar.html:51 #: templates/includes/sidebar.html:51
msgid "Monthly" msgid "Monthly"
msgstr "Mensuel" msgstr "Mensuel"
@@ -1801,11 +1795,11 @@ msgid "Installment Plan deleted successfully"
msgstr "Paiement en plusieurs fois supprimé avec succès" msgstr "Paiement en plusieurs fois supprimé avec succès"
#: apps/transactions/views/quick_transactions.py:45 #: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:188 #: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:252
msgid "Item added successfully" msgid "Item added successfully"
msgstr "Item ajouté avec succès" msgstr "Item ajouté avec succès"
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:220 #: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:284
msgid "Item updated successfully" msgid "Item updated successfully"
msgstr "Item mis à jour avec succès" msgstr "Item mis à jour avec succès"
@@ -1856,16 +1850,12 @@ msgid "Tag deleted successfully"
msgstr "Etiquette supprimée avec succès" msgstr "Etiquette supprimée avec succès"
#: apps/transactions/views/transactions.py:59 #: apps/transactions/views/transactions.py:59
#, fuzzy
#| msgid "Account updated successfully"
msgid "Attachment uploaded successfully" msgid "Attachment uploaded successfully"
msgstr "Compte mis à jour avec succès" msgstr "Fichier téléchargé avec succès"
#: apps/transactions/views/transactions.py:110 #: apps/transactions/views/transactions.py:110
#, fuzzy
#| msgid "Account deleted successfully"
msgid "Attachment deleted successfully" msgid "Attachment deleted successfully"
msgstr "Compte supprimé avec succès" msgstr "Fichier supprimé avec succès"
#: apps/transactions/views/transactions.py:350 #: apps/transactions/views/transactions.py:350
msgid "Transaction updated successfully" msgid "Transaction updated successfully"
@@ -1894,44 +1884,48 @@ msgstr "Transaction restaurée avec succès"
msgid "Transfer added successfully" msgid "Transfer added successfully"
msgstr "Virement ajouté avec succès" msgstr "Virement ajouté avec succès"
#: apps/users/admin.py:22 templates/users/fragments/user_settings.html:5 #: apps/users/admin.py:17
msgid "Revoke selected API tokens"
msgstr ""
#: apps/users/admin.py:28 templates/users/fragments/user_settings.html:5
msgid "User Settings" msgid "User Settings"
msgstr "Paramètres utilisateur" msgstr "Paramètres utilisateur"
#: apps/users/admin.py:23 #: apps/users/admin.py:29
msgid "User Setting" msgid "User Setting"
msgstr "Paramètre utilisateur" msgstr "Paramètre utilisateur"
#: apps/users/admin.py:48 #: apps/users/admin.py:54
msgid "Personal info" msgid "Personal info"
msgstr "Informations personnelles" msgstr "Informations personnelles"
#: apps/users/admin.py:50 #: apps/users/admin.py:56
msgid "Permissions" msgid "Permissions"
msgstr "Permissions" msgstr "Permissions"
#: apps/users/admin.py:61 #: apps/users/admin.py:67
msgid "Important dates" msgid "Important dates"
msgstr "Dates importantes" msgstr "Dates importantes"
#: apps/users/forms.py:24 apps/users/forms.py:28 apps/users/models.py:451 #: apps/users/forms.py:28 apps/users/forms.py:32 apps/users/models.py:456
#: templates/users/login.html:18 #: templates/users/login.html:18
msgid "E-mail" msgid "E-mail"
msgstr "E-mail" msgstr "E-mail"
#: apps/users/forms.py:35 apps/users/forms.py:40 templates/users/login.html:19 #: apps/users/forms.py:39 apps/users/forms.py:44 templates/users/login.html:19
msgid "Password" msgid "Password"
msgstr "Mot de passe" msgstr "Mot de passe"
#: apps/users/forms.py:47 #: apps/users/forms.py:51
msgid "Invalid e-mail or password" msgid "Invalid e-mail or password"
msgstr "E-mail ou mot de passe invalide" msgstr "E-mail ou mot de passe invalide"
#: apps/users/forms.py:48 #: apps/users/forms.py:52
msgid "This account is deactivated" msgid "This account is deactivated"
msgstr "Ce compte est désactivé" msgstr "Ce compte est désactivé"
#: apps/users/forms.py:64 apps/users/forms.py:77 apps/users/forms.py:99 #: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98 #: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245 #: templates/monthly_overview/pages/overview.html:245
#: templates/transactions/pages/transactions.html:47 #: templates/transactions/pages/transactions.html:47
@@ -1939,25 +1933,23 @@ msgstr "Ce compte est désactivé"
msgid "Default" msgid "Default"
msgstr "Par défaut" msgstr "Par défaut"
#: apps/users/forms.py:107 apps/users/models.py:484 #: apps/users/forms.py:111 apps/users/models.py:489
msgid "Date Format" msgid "Date Format"
msgstr "Format de date" msgstr "Format de date"
#: apps/users/forms.py:112 apps/users/models.py:489 #: apps/users/forms.py:116 apps/users/models.py:494
msgid "Datetime Format" msgid "Datetime Format"
msgstr "Format de l'heure" msgstr "Format de l'heure"
#: apps/users/forms.py:118 apps/users/models.py:492 #: apps/users/forms.py:122 apps/users/models.py:497
msgid "Number Format" msgid "Number Format"
msgstr "Format numérique" msgstr "Format numérique"
#: apps/users/forms.py:125 #: apps/users/forms.py:129
#, fuzzy
#| msgid "Target Accounts"
msgid "Default Account" msgid "Default Account"
msgstr "Comptes cibles" msgstr "Compte par défaut"
#: apps/users/forms.py:174 #: apps/users/forms.py:178
#, python-format #, python-format
msgid "" msgid ""
"This changes the language (if available) and how numbers and dates are " "This changes the language (if available) and how numbers and dates are "
@@ -1969,19 +1961,19 @@ msgstr ""
"Considérez d'aider à la traduction de WYGIWYH dans votre langue sur " "Considérez d'aider à la traduction de WYGIWYH dans votre langue sur "
"%(translation_link)s" "%(translation_link)s"
#: apps/users/forms.py:183 #: apps/users/forms.py:187
msgid "New Password" msgid "New Password"
msgstr "Nouveau mot de passe" msgstr "Nouveau mot de passe"
#: apps/users/forms.py:186 #: apps/users/forms.py:190
msgid "Leave blank to keep the current password." msgid "Leave blank to keep the current password."
msgstr "Laisser vide pour garder le mot de passe actuel." msgstr "Laisser vide pour garder le mot de passe actuel."
#: apps/users/forms.py:189 #: apps/users/forms.py:193
msgid "Confirm New Password" msgid "Confirm New Password"
msgstr "Confirmer le nouveau mot de passe" msgstr "Confirmer le nouveau mot de passe"
#: apps/users/forms.py:201 apps/users/forms.py:358 #: apps/users/forms.py:205 apps/users/forms.py:362
msgid "" msgid ""
"Designates whether this user should be treated as active. Unselect this " "Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts." "instead of deleting accounts."
@@ -1989,7 +1981,7 @@ msgstr ""
"Indique si cet utilisateur doit être traité comme actif. Désélectionnez ceci " "Indique si cet utilisateur doit être traité comme actif. Désélectionnez ceci "
"plutôt que supprimer des comptes." "plutôt que supprimer des comptes."
#: apps/users/forms.py:204 apps/users/forms.py:361 #: apps/users/forms.py:208 apps/users/forms.py:365
msgid "" msgid ""
"Designates that this user has all permissions without explicitly assigning " "Designates that this user has all permissions without explicitly assigning "
"them." "them."
@@ -1997,119 +1989,205 @@ msgstr ""
"Définir que cet utilisateur a toutes les permissions sans les assigner " "Définir que cet utilisateur a toutes les permissions sans les assigner "
"explicitement." "explicitement."
#: apps/users/forms.py:271 #: apps/users/forms.py:275
msgid "This email address is already in use by another account." msgid "This email address is already in use by another account."
msgstr "" msgstr ""
"Cette adresse email est déjà utiliser dans un autre compte utilisateur." "Cette adresse email est déjà utiliser dans un autre compte utilisateur."
#: apps/users/forms.py:279 #: apps/users/forms.py:283
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "Les deux mot de passe ne correspondent pas." msgstr "Les deux mot de passe ne correspondent pas."
#: apps/users/forms.py:281 #: apps/users/forms.py:285
msgid "Please confirm your new password." msgid "Please confirm your new password."
msgstr "Merci de confirmer votre mot de passe." msgstr "Merci de confirmer votre mot de passe."
#: apps/users/forms.py:283 #: apps/users/forms.py:287
msgid "Please enter the new password first." msgid "Please enter the new password first."
msgstr "Merci d'indiquer d'abord le nouveau mot de passe." msgstr "Merci d'indiquer d'abord le nouveau mot de passe."
#: apps/users/forms.py:303 #: apps/users/forms.py:307
msgid "You cannot deactivate your own account using this form." msgid "You cannot deactivate your own account using this form."
msgstr "" msgstr ""
"Vous ne pouvez pas désactiver votre propre compte utilisateur avec ce " "Vous ne pouvez pas désactiver votre propre compte utilisateur avec ce "
"formulaire." "formulaire."
#: apps/users/forms.py:316 #: apps/users/forms.py:320
msgid "Cannot remove status from the last superuser." msgid "Cannot remove status from the last superuser."
msgstr "Impossible de supprimer le statut du dernier super utilisateur." msgstr "Impossible de supprimer le statut du dernier super utilisateur."
#: apps/users/forms.py:322 #: apps/users/forms.py:326
msgid "You cannot remove your own superuser status using this form." msgid "You cannot remove your own superuser status using this form."
msgstr "" msgstr ""
"Vous ne pouvez pas supprimer votre propre statut de super utilisateur via ce " "Vous ne pouvez pas supprimer votre propre statut de super utilisateur via ce "
"formulaire." "formulaire."
#: apps/users/forms.py:415 #: apps/users/forms.py:419
msgid "A user with this email address already exists." msgid "A user with this email address already exists."
msgstr "Un utilisateur avec cette adresse email existe déjà." msgstr "Un utilisateur avec cette adresse email existe déjà."
#: apps/users/models.py:465 #: apps/users/forms.py:439
#, fuzzy
#| msgid "Tag name"
msgid "Token name"
msgstr "Libellé de l'étiquette"
#: apps/users/forms.py:441
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
#, fuzzy
#| msgid "Create transaction"
msgid "Create token"
msgstr "Créer une transaction"
#: apps/users/models.py:470
msgid "Yearly by currency" msgid "Yearly by currency"
msgstr "Annuel par devise" msgstr "Annuel par devise"
#: apps/users/models.py:466 #: apps/users/models.py:471
msgid "Yearly by account" msgid "Yearly by account"
msgstr "Annuel par comptes" msgstr "Annuel par comptes"
#: apps/users/models.py:467 templates/net_worth/net_worth.html:9 #: apps/users/models.py:472 templates/net_worth/net_worth.html:9
msgid "Current Net Worth" msgid "Current Net Worth"
msgstr "Valeur nette actuelle" msgstr "Valeur nette actuelle"
#: apps/users/models.py:468 templates/net_worth/net_worth.html:11 #: apps/users/models.py:473 templates/net_worth/net_worth.html:11
msgid "Projected Net Worth" msgid "Projected Net Worth"
msgstr "Valeur nette prévisionnelle" msgstr "Valeur nette prévisionnelle"
#: apps/users/models.py:469 #: apps/users/models.py:474
msgid "All Transactions" msgid "All Transactions"
msgstr "Toutes les transactions" msgstr "Toutes les transactions"
#: apps/users/models.py:470 templates/includes/sidebar.html:63 #: apps/users/models.py:475 templates/includes/sidebar.html:63
msgid "Calendar" msgid "Calendar"
msgstr "Calendrier" msgstr "Calendrier"
#: apps/users/models.py:480 #: apps/users/models.py:485
msgid "Volume" msgid "Volume"
msgstr "Volume" msgstr "Volume"
#: apps/users/models.py:499 #: apps/users/models.py:504
msgid "Language" msgid "Language"
msgstr "Langage" msgstr "Langage"
#: apps/users/models.py:505 #: apps/users/models.py:510
msgid "Time Zone" msgid "Time Zone"
msgstr "Fuseau horaire" msgstr "Fuseau horaire"
#: apps/users/models.py:511 #: apps/users/models.py:516
msgid "Start page" msgid "Start page"
msgstr "Page d'accueil" msgstr "Page d'accueil"
#: apps/users/models.py:516 #: apps/users/models.py:521
#, fuzzy
#| msgid "Asset account"
msgid "Default account" msgid "Default account"
msgstr "Compte d'actif" msgstr "Compte par défaut"
#: apps/users/models.py:517 #: apps/users/models.py:522
#, fuzzy
#| msgid ""
#| "Deactivated tags won't be able to be selected when creating new "
#| "transactions"
msgid "Selects the account by default when creating new transactions" msgid "Selects the account by default when creating new transactions"
msgstr "" msgstr ""
"Les étiquettes désactivées ne pourront pas être sélectionnées lors de la " "Sélectionner le compte par défaut lors de la création de nouvelles "
"création de nouvelles transactions" "transactions"
#: apps/users/views.py:67 #: apps/users/models.py:570
#, fuzzy
#| msgid "Users"
msgid "User"
msgstr "Utilisateurs"
#: apps/users/models.py:577
msgid "Token key"
msgstr ""
#: apps/users/models.py:579
msgid "Token hash"
msgstr ""
#: apps/users/models.py:583
#, fuzzy
#| msgid "Last Generated Date"
msgid "Last used at"
msgstr "Dernière date générée"
#: apps/users/models.py:588
msgid "Expires at"
msgstr ""
#: apps/users/models.py:593
msgid "Revoked at"
msgstr ""
#: apps/users/models.py:595
#, fuzzy
#| msgid "Create"
msgid "Created at"
msgstr "Créer"
#: apps/users/models.py:596
#, fuzzy
#| msgid "Update"
msgid "Updated at"
msgstr "Mise à jour"
#: apps/users/models.py:606
#, fuzzy
#| msgid "API Key"
msgid "API token"
msgstr "Clé API"
#: apps/users/models.py:607
msgid "API tokens"
msgstr ""
#: apps/users/views.py:69
msgid "Transaction amounts are now hidden" msgid "Transaction amounts are now hidden"
msgstr "Les montants des transactions sont maintenant masqués" msgstr "Les montants des transactions sont maintenant masqués"
#: apps/users/views.py:70 #: apps/users/views.py:72
msgid "Transaction amounts are now displayed" msgid "Transaction amounts are now displayed"
msgstr "Les montants des transactions sont maintenant affichés" msgstr "Les montants des transactions sont maintenant affichés"
#: apps/users/views.py:88 #: apps/users/views.py:90
msgid "Sounds are now muted" msgid "Sounds are now muted"
msgstr "Les sons sont désactivés" msgstr "Les sons sont désactivés"
#: apps/users/views.py:91 #: apps/users/views.py:93
msgid "Sounds will now play" msgid "Sounds will now play"
msgstr "Les sons sont activés" msgstr "Les sons sont activés"
#: apps/users/views.py:107 #: apps/users/views.py:109
msgid "Your settings have been updated" msgid "Your settings have been updated"
msgstr "Vos réglages ont été mis à jour" msgstr "Vos réglages ont été mis à jour"
#: apps/users/views.py:148
#, fuzzy
#| msgid "Action updated successfully"
msgid "API token created successfully"
msgstr "Action mis à jour avec succès"
#: apps/users/views.py:167
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token revoked successfully"
msgstr "Action supprimée avec succès"
#: apps/users/views.py:178
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token deleted successfully"
msgstr "Action supprimée avec succès"
#: templates/account_groups/fragments/add.html:5 #: templates/account_groups/fragments/add.html:5
msgid "Add account group" msgid "Add account group"
msgstr "Ajouter un groupe de comptes" msgstr "Ajouter un groupe de comptes"
@@ -2207,6 +2285,7 @@ msgstr "Partager"
#: templates/rules/fragments/transaction_rule/view.html:92 #: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133 #: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51 #: templates/tags/fragments/table.html:51
#: templates/users/fragments/api_tokens.html:93
msgid "Delete" msgid "Delete"
msgstr "Supprimer" msgstr "Supprimer"
@@ -2284,6 +2363,7 @@ msgstr "Cette opération est irréversible, vous ne pourrez pas l'annuler !"
#: templates/rules/fragments/transaction_rule/view.html:98 #: templates/rules/fragments/transaction_rule/view.html:98
#: templates/tags/fragments/table.html:57 #: templates/tags/fragments/table.html:57
#: templates/transactions/fragments/attachments.html:22 #: templates/transactions/fragments/attachments.html:22
#: templates/users/fragments/api_tokens.html:101
msgid "Yes, delete it!" msgid "Yes, delete it!"
msgstr "Oui, supprime !" msgstr "Oui, supprime !"
@@ -2944,7 +3024,7 @@ msgstr ""
#: templates/includes/scripts/hyperscript/htmx_error_handler.html:24 #: templates/includes/scripts/hyperscript/htmx_error_handler.html:24
msgid "Reload" msgid "Reload"
msgstr "" msgstr "Recharger"
#: templates/includes/scripts/hyperscript/swal.html:13 #: templates/includes/scripts/hyperscript/swal.html:13
msgid "Cancel" msgid "Cancel"
@@ -2956,17 +3036,15 @@ msgstr "Confirmer"
#: templates/includes/scripts/pull_to_refresh_i18n.html:4 #: templates/includes/scripts/pull_to_refresh_i18n.html:4
msgid "Pull down to refresh" msgid "Pull down to refresh"
msgstr "" msgstr "Tirer vers le bas pour raffraichir"
#: templates/includes/scripts/pull_to_refresh_i18n.html:5 #: templates/includes/scripts/pull_to_refresh_i18n.html:5
msgid "Release to refresh" msgid "Release to refresh"
msgstr "" msgstr "Lâcher pour raffraichir"
#: templates/includes/scripts/pull_to_refresh_i18n.html:6 #: templates/includes/scripts/pull_to_refresh_i18n.html:6
#, fuzzy
#| msgid "Refresh"
msgid "Refreshing" msgid "Refreshing"
msgstr "Rafraichir" msgstr "Rafraichissement"
#: templates/includes/sidebar.html:69 templates/insights/pages/index.html:5 #: templates/includes/sidebar.html:69 templates/insights/pages/index.html:5
msgid "Insights" msgid "Insights"
@@ -3295,6 +3373,10 @@ msgstr "Aucuns paiements en plusieurs fois"
msgid "This is a demo!" msgid "This is a demo!"
msgstr "C'est une démo !" msgstr "C'est une démo !"
#: templates/layouts/base.html:37
msgid "Any data you add here will be wiped in 24hrs or less"
msgstr "Toutes les données ajoutées ici seront purgées dans les 24 heures"
#: templates/mini_tools/currency_converter/currency_converter.html:57 #: templates/mini_tools/currency_converter/currency_converter.html:57
msgid "Invert" msgid "Invert"
msgstr "Inverser" msgstr "Inverser"
@@ -3622,23 +3704,19 @@ msgstr "Ajouter un paiement en plusieurs fois"
#: templates/transactions/fragments/attachments.html:20 #: templates/transactions/fragments/attachments.html:20
msgid "Delete this attachment?" msgid "Delete this attachment?"
msgstr "" msgstr "Supprimer le fichier attaché ?"
#: templates/transactions/fragments/attachments.html:21 #: templates/transactions/fragments/attachments.html:21
msgid "This file will be removed from the transaction." msgid "This file will be removed from the transaction."
msgstr "" msgstr "Ce fichier va être supprimer de cette transaction."
#: templates/transactions/fragments/attachments.html:30 #: templates/transactions/fragments/attachments.html:30
#, fuzzy
#| msgid "No presets yet"
msgid "No attachments yet" msgid "No attachments yet"
msgstr "Pas encore de préréglages" msgstr "Pas encore de fichiers attachés"
#: templates/transactions/fragments/attachments_manage.html:5 #: templates/transactions/fragments/attachments_manage.html:5
#, fuzzy
#| msgid "Transaction Tags"
msgid "Transaction attachments" msgid "Transaction attachments"
msgstr "Etiquettes de transaction" msgstr "Fichiers de transactions"
#: templates/transactions/fragments/bulk_edit.html:5 #: templates/transactions/fragments/bulk_edit.html:5
msgid "Bulk Editing" msgid "Bulk Editing"
@@ -3678,6 +3756,87 @@ msgstr "Identique"
msgid "Add user" msgid "Add user"
msgstr "Ajouter un nouvel utilisateur" msgstr "Ajouter un nouvel utilisateur"
#: templates/users/fragments/api_tokens.html:5
msgid "API Tokens"
msgstr ""
#: templates/users/fragments/api_tokens.html:7
msgid ""
"Use these tokens for automations such as n8n. The raw token is shown only "
"once after creation."
msgstr ""
#: templates/users/fragments/api_tokens.html:14
msgid "Copy this token now"
msgstr ""
#: templates/users/fragments/api_tokens.html:16
msgid "It will not be shown again after this response."
msgstr ""
#: templates/users/fragments/api_tokens.html:31
msgid "Copy"
msgstr ""
#: templates/users/fragments/api_tokens.html:52
msgid "Revoked"
msgstr ""
#: templates/users/fragments/api_tokens.html:59
#, python-format
msgid "Created %(created)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:62
#, python-format
msgid "last used %(used)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:64
msgid "never used"
msgstr ""
#: templates/users/fragments/api_tokens.html:68
#, python-format
msgid "expires %(expires)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:70
msgid "no expiry"
msgstr ""
#: templates/users/fragments/api_tokens.html:78
msgid "Revoke"
msgstr ""
#: templates/users/fragments/api_tokens.html:84
msgid "Revoke token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:85
msgid "This token will stop working immediately."
msgstr ""
#: templates/users/fragments/api_tokens.html:86
#, fuzzy
#| msgid "Yes, refresh it!"
msgid "Yes, revoke it!"
msgstr "Oui, mets à jour !"
#: templates/users/fragments/api_tokens.html:99
#, fuzzy
#| msgid "Deleted At"
msgid "Delete token?"
msgstr "Supprimé à"
#: templates/users/fragments/api_tokens.html:100
msgid "This permanently removes the token from the list. It cannot be undone."
msgstr ""
#: templates/users/fragments/api_tokens.html:114
msgid "No API tokens"
msgstr ""
#: templates/users/fragments/edit.html:5 #: templates/users/fragments/edit.html:5
msgid "Edit user" msgid "Edit user"
msgstr "Modifier l'utilisateur" msgstr "Modifier l'utilisateur"
@@ -3730,9 +3889,6 @@ msgstr "Se connecter avec"
msgid "Yearly Overview" msgid "Yearly Overview"
msgstr "Aperçu annuel" msgstr "Aperçu annuel"
#~ msgid "Any data you add here will be wiped in 24hrs or less"
#~ msgstr "Toutes les données ajoutées ici seront purgées dans les 24 heures"
#, fuzzy #, fuzzy
#~| msgid "Are you sure?" #~| msgid "Are you sure?"
#~ msgid " Are you sure?" #~ msgid " Are you sure?"
+232 -57
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-06 08:15+0000\n" "POT-Creation-Date: 2026-07-04 15:39+0000\n"
"PO-Revision-Date: 2026-01-10 03:09+0000\n" "PO-Revision-Date: 2026-01-10 03:09+0000\n"
"Last-Translator: Herculino Trotta <netotrotta@gmail.com>\n" "Last-Translator: Herculino Trotta <netotrotta@gmail.com>\n"
"Language-Team: Hungarian <https://translations.herculino.com/projects/" "Language-Team: Hungarian <https://translations.herculino.com/projects/"
@@ -31,8 +31,8 @@ msgstr "Csoport neve"
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536 #: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919 #: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978 #: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:242 #: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:400 #: apps/users/forms.py:404
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5 #: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128 #: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update" msgid "Update"
@@ -47,7 +47,7 @@ msgstr "Frissítés"
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886 #: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953 #: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134 #: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:248 apps/users/forms.py:406 #: apps/users/forms.py:252 apps/users/forms.py:410
#: templates/mini_tools/unit_price_calculator.html:168 #: templates/mini_tools/unit_price_calculator.html:168
msgid "Add" msgid "Add"
msgstr "Hozzáadás" msgstr "Hozzáadás"
@@ -99,7 +99,7 @@ msgstr "Címkék"
#: apps/import_app/models.py:14 apps/rules/models.py:13 #: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248 #: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057 #: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: templates/account_groups/fragments/list.html:22 #: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22 #: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17 #: templates/categories/fragments/table.html:17
#: templates/currencies/fragments/list.html:23 #: templates/currencies/fragments/list.html:23
@@ -350,7 +350,7 @@ msgid ""
"owner.<br/>Public: Shown for all users. Only editable by the owner." "owner.<br/>Public: Shown for all users. Only editable by the owner."
msgstr "" msgstr ""
#: apps/common/forms.py:76 apps/users/forms.py:169 #: apps/common/forms.py:76 apps/users/forms.py:173
msgid "Save" msgid "Save"
msgstr "Mentés" msgstr "Mentés"
@@ -536,8 +536,8 @@ msgstr "Átváltási ráta"
msgid "Date and Time" msgid "Date and Time"
msgstr "Dátum és idő" msgstr "Dátum és idő"
#: apps/currencies/models.py:78 apps/users/models.py:12 #: apps/currencies/models.py:78 apps/users/models.py:17
#: apps/users/models.py:497 #: apps/users/models.py:502
msgid "Auto" msgid "Auto"
msgstr "Automata" msgstr "Automata"
@@ -578,7 +578,9 @@ msgstr "Szolgáltatás típusa"
#: templates/entities/fragments/list.html:16 #: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16 #: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16 #: templates/recurring_transactions/fragments/list.html:16
#: templates/tags/fragments/list.html:16 templates/users/fragments/list.html:25 #: templates/tags/fragments/list.html:16
#: templates/users/fragments/api_tokens.html:54
#: templates/users/fragments/list.html:25
msgid "Active" msgid "Active"
msgstr "Aktív" msgstr "Aktív"
@@ -1578,7 +1580,7 @@ msgstr "Tranzakciós szabályok"
msgid "Yearly" msgid "Yearly"
msgstr "Éves" msgstr "Éves"
#: apps/transactions/models.py:596 apps/users/models.py:464 #: apps/transactions/models.py:596 apps/users/models.py:469
#: templates/includes/sidebar.html:51 #: templates/includes/sidebar.html:51
msgid "Monthly" msgid "Monthly"
msgstr "Havi" msgstr "Havi"
@@ -1769,11 +1771,11 @@ msgid "Installment Plan deleted successfully"
msgstr "" msgstr ""
#: apps/transactions/views/quick_transactions.py:45 #: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:188 #: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:252
msgid "Item added successfully" msgid "Item added successfully"
msgstr "" msgstr ""
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:220 #: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:284
msgid "Item updated successfully" msgid "Item updated successfully"
msgstr "" msgstr ""
@@ -1862,44 +1864,48 @@ msgstr ""
msgid "Transfer added successfully" msgid "Transfer added successfully"
msgstr "" msgstr ""
#: apps/users/admin.py:22 templates/users/fragments/user_settings.html:5 #: apps/users/admin.py:17
msgid "Revoke selected API tokens"
msgstr ""
#: apps/users/admin.py:28 templates/users/fragments/user_settings.html:5
msgid "User Settings" msgid "User Settings"
msgstr "" msgstr ""
#: apps/users/admin.py:23 #: apps/users/admin.py:29
msgid "User Setting" msgid "User Setting"
msgstr "" msgstr ""
#: apps/users/admin.py:48 #: apps/users/admin.py:54
msgid "Personal info" msgid "Personal info"
msgstr "" msgstr ""
#: apps/users/admin.py:50 #: apps/users/admin.py:56
msgid "Permissions" msgid "Permissions"
msgstr "" msgstr ""
#: apps/users/admin.py:61 #: apps/users/admin.py:67
msgid "Important dates" msgid "Important dates"
msgstr "" msgstr ""
#: apps/users/forms.py:24 apps/users/forms.py:28 apps/users/models.py:451 #: apps/users/forms.py:28 apps/users/forms.py:32 apps/users/models.py:456
#: templates/users/login.html:18 #: templates/users/login.html:18
msgid "E-mail" msgid "E-mail"
msgstr "" msgstr ""
#: apps/users/forms.py:35 apps/users/forms.py:40 templates/users/login.html:19 #: apps/users/forms.py:39 apps/users/forms.py:44 templates/users/login.html:19
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: apps/users/forms.py:47 #: apps/users/forms.py:51
msgid "Invalid e-mail or password" msgid "Invalid e-mail or password"
msgstr "" msgstr ""
#: apps/users/forms.py:48 #: apps/users/forms.py:52
msgid "This account is deactivated" msgid "This account is deactivated"
msgstr "" msgstr ""
#: apps/users/forms.py:64 apps/users/forms.py:77 apps/users/forms.py:99 #: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98 #: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245 #: templates/monthly_overview/pages/overview.html:245
#: templates/transactions/pages/transactions.html:47 #: templates/transactions/pages/transactions.html:47
@@ -1907,25 +1913,25 @@ msgstr ""
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: apps/users/forms.py:107 apps/users/models.py:484 #: apps/users/forms.py:111 apps/users/models.py:489
msgid "Date Format" msgid "Date Format"
msgstr "" msgstr ""
#: apps/users/forms.py:112 apps/users/models.py:489 #: apps/users/forms.py:116 apps/users/models.py:494
msgid "Datetime Format" msgid "Datetime Format"
msgstr "" msgstr ""
#: apps/users/forms.py:118 apps/users/models.py:492 #: apps/users/forms.py:122 apps/users/models.py:497
msgid "Number Format" msgid "Number Format"
msgstr "" msgstr ""
#: apps/users/forms.py:125 #: apps/users/forms.py:129
#, fuzzy #, fuzzy
#| msgid "Target Accounts" #| msgid "Target Accounts"
msgid "Default Account" msgid "Default Account"
msgstr "Cél számlák" msgstr "Cél számlák"
#: apps/users/forms.py:174 #: apps/users/forms.py:178
#, python-format #, python-format
msgid "" msgid ""
"This changes the language (if available) and how numbers and dates are " "This changes the language (if available) and how numbers and dates are "
@@ -1933,132 +1939,218 @@ msgid ""
"Consider helping translate WYGIWYH to your language at %(translation_link)s" "Consider helping translate WYGIWYH to your language at %(translation_link)s"
msgstr "" msgstr ""
#: apps/users/forms.py:183 #: apps/users/forms.py:187
msgid "New Password" msgid "New Password"
msgstr "" msgstr ""
#: apps/users/forms.py:186 #: apps/users/forms.py:190
msgid "Leave blank to keep the current password." msgid "Leave blank to keep the current password."
msgstr "" msgstr ""
#: apps/users/forms.py:189 #: apps/users/forms.py:193
msgid "Confirm New Password" msgid "Confirm New Password"
msgstr "" msgstr ""
#: apps/users/forms.py:201 apps/users/forms.py:358 #: apps/users/forms.py:205 apps/users/forms.py:362
msgid "" msgid ""
"Designates whether this user should be treated as active. Unselect this " "Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts." "instead of deleting accounts."
msgstr "" msgstr ""
#: apps/users/forms.py:204 apps/users/forms.py:361 #: apps/users/forms.py:208 apps/users/forms.py:365
msgid "" msgid ""
"Designates that this user has all permissions without explicitly assigning " "Designates that this user has all permissions without explicitly assigning "
"them." "them."
msgstr "" msgstr ""
#: apps/users/forms.py:271 #: apps/users/forms.py:275
msgid "This email address is already in use by another account." msgid "This email address is already in use by another account."
msgstr "" msgstr ""
#: apps/users/forms.py:279 #: apps/users/forms.py:283
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "" msgstr ""
#: apps/users/forms.py:281 #: apps/users/forms.py:285
msgid "Please confirm your new password." msgid "Please confirm your new password."
msgstr "" msgstr ""
#: apps/users/forms.py:283 #: apps/users/forms.py:287
msgid "Please enter the new password first." msgid "Please enter the new password first."
msgstr "" msgstr ""
#: apps/users/forms.py:303 #: apps/users/forms.py:307
msgid "You cannot deactivate your own account using this form." msgid "You cannot deactivate your own account using this form."
msgstr "" msgstr ""
#: apps/users/forms.py:316 #: apps/users/forms.py:320
msgid "Cannot remove status from the last superuser." msgid "Cannot remove status from the last superuser."
msgstr "" msgstr ""
#: apps/users/forms.py:322 #: apps/users/forms.py:326
msgid "You cannot remove your own superuser status using this form." msgid "You cannot remove your own superuser status using this form."
msgstr "" msgstr ""
#: apps/users/forms.py:415 #: apps/users/forms.py:419
msgid "A user with this email address already exists." msgid "A user with this email address already exists."
msgstr "" msgstr ""
#: apps/users/models.py:465 #: apps/users/forms.py:439
#, fuzzy
#| msgid "File name"
msgid "Token name"
msgstr "Fájlnév"
#: apps/users/forms.py:441
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
msgid "Create token"
msgstr ""
#: apps/users/models.py:470
msgid "Yearly by currency" msgid "Yearly by currency"
msgstr "" msgstr ""
#: apps/users/models.py:466 #: apps/users/models.py:471
msgid "Yearly by account" msgid "Yearly by account"
msgstr "" msgstr ""
#: apps/users/models.py:467 templates/net_worth/net_worth.html:9 #: apps/users/models.py:472 templates/net_worth/net_worth.html:9
msgid "Current Net Worth" msgid "Current Net Worth"
msgstr "" msgstr ""
#: apps/users/models.py:468 templates/net_worth/net_worth.html:11 #: apps/users/models.py:473 templates/net_worth/net_worth.html:11
msgid "Projected Net Worth" msgid "Projected Net Worth"
msgstr "Várható nettó vagyon" msgstr "Várható nettó vagyon"
#: apps/users/models.py:469 #: apps/users/models.py:474
msgid "All Transactions" msgid "All Transactions"
msgstr "" msgstr ""
#: apps/users/models.py:470 templates/includes/sidebar.html:63 #: apps/users/models.py:475 templates/includes/sidebar.html:63
msgid "Calendar" msgid "Calendar"
msgstr "Naptár" msgstr "Naptár"
#: apps/users/models.py:480 #: apps/users/models.py:485
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: apps/users/models.py:499 #: apps/users/models.py:504
msgid "Language" msgid "Language"
msgstr "" msgstr ""
#: apps/users/models.py:505 #: apps/users/models.py:510
msgid "Time Zone" msgid "Time Zone"
msgstr "" msgstr ""
#: apps/users/models.py:511 #: apps/users/models.py:516
msgid "Start page" msgid "Start page"
msgstr "" msgstr ""
#: apps/users/models.py:516 #: apps/users/models.py:521
#, fuzzy #, fuzzy
#| msgid "Asset account" #| msgid "Asset account"
msgid "Default account" msgid "Default account"
msgstr "Eszközszámla" msgstr "Eszközszámla"
#: apps/users/models.py:517 #: apps/users/models.py:522
msgid "Selects the account by default when creating new transactions" msgid "Selects the account by default when creating new transactions"
msgstr "" msgstr ""
#: apps/users/views.py:67 #: apps/users/models.py:570
#, fuzzy
#| msgid "Users"
msgid "User"
msgstr "Felhasználók"
#: apps/users/models.py:577
msgid "Token key"
msgstr ""
#: apps/users/models.py:579
msgid "Token hash"
msgstr ""
#: apps/users/models.py:583
msgid "Last used at"
msgstr ""
#: apps/users/models.py:588
msgid "Expires at"
msgstr ""
#: apps/users/models.py:593
msgid "Revoked at"
msgstr ""
#: apps/users/models.py:595
msgid "Created at"
msgstr ""
#: apps/users/models.py:596
#, fuzzy
#| msgid "Update"
msgid "Updated at"
msgstr "Frissítés"
#: apps/users/models.py:606
#, fuzzy
#| msgid "API Key"
msgid "API token"
msgstr "API kulcs"
#: apps/users/models.py:607
msgid "API tokens"
msgstr ""
#: apps/users/views.py:69
msgid "Transaction amounts are now hidden" msgid "Transaction amounts are now hidden"
msgstr "" msgstr ""
#: apps/users/views.py:70 #: apps/users/views.py:72
msgid "Transaction amounts are now displayed" msgid "Transaction amounts are now displayed"
msgstr "" msgstr ""
#: apps/users/views.py:88 #: apps/users/views.py:90
msgid "Sounds are now muted" msgid "Sounds are now muted"
msgstr "" msgstr ""
#: apps/users/views.py:91 #: apps/users/views.py:93
msgid "Sounds will now play" msgid "Sounds will now play"
msgstr "" msgstr ""
#: apps/users/views.py:107 #: apps/users/views.py:109
msgid "Your settings have been updated" msgid "Your settings have been updated"
msgstr "" msgstr ""
#: apps/users/views.py:148
#, fuzzy
#| msgid "Account updated successfully"
msgid "API token created successfully"
msgstr "A számla módosítása sikeres volt"
#: apps/users/views.py:167
#, fuzzy
#| msgid "Account deleted successfully"
msgid "API token revoked successfully"
msgstr "A számla törlésre került"
#: apps/users/views.py:178
#, fuzzy
#| msgid "Account deleted successfully"
msgid "API token deleted successfully"
msgstr "A számla törlésre került"
#: templates/account_groups/fragments/add.html:5 #: templates/account_groups/fragments/add.html:5
msgid "Add account group" msgid "Add account group"
msgstr "" msgstr ""
@@ -2156,6 +2248,7 @@ msgstr ""
#: templates/rules/fragments/transaction_rule/view.html:92 #: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133 #: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51 #: templates/tags/fragments/table.html:51
#: templates/users/fragments/api_tokens.html:93
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
@@ -2233,6 +2326,7 @@ msgstr ""
#: templates/rules/fragments/transaction_rule/view.html:98 #: templates/rules/fragments/transaction_rule/view.html:98
#: templates/tags/fragments/table.html:57 #: templates/tags/fragments/table.html:57
#: templates/transactions/fragments/attachments.html:22 #: templates/transactions/fragments/attachments.html:22
#: templates/users/fragments/api_tokens.html:101
msgid "Yes, delete it!" msgid "Yes, delete it!"
msgstr "" msgstr ""
@@ -3230,6 +3324,10 @@ msgstr ""
msgid "This is a demo!" msgid "This is a demo!"
msgstr "" msgstr ""
#: templates/layouts/base.html:37
msgid "Any data you add here will be wiped in 24hrs or less"
msgstr ""
#: templates/mini_tools/currency_converter/currency_converter.html:57 #: templates/mini_tools/currency_converter/currency_converter.html:57
msgid "Invert" msgid "Invert"
msgstr "" msgstr ""
@@ -3604,6 +3702,83 @@ msgstr ""
msgid "Add user" msgid "Add user"
msgstr "" msgstr ""
#: templates/users/fragments/api_tokens.html:5
msgid "API Tokens"
msgstr ""
#: templates/users/fragments/api_tokens.html:7
msgid ""
"Use these tokens for automations such as n8n. The raw token is shown only "
"once after creation."
msgstr ""
#: templates/users/fragments/api_tokens.html:14
msgid "Copy this token now"
msgstr ""
#: templates/users/fragments/api_tokens.html:16
msgid "It will not be shown again after this response."
msgstr ""
#: templates/users/fragments/api_tokens.html:31
msgid "Copy"
msgstr ""
#: templates/users/fragments/api_tokens.html:52
msgid "Revoked"
msgstr ""
#: templates/users/fragments/api_tokens.html:59
#, python-format
msgid "Created %(created)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:62
#, python-format
msgid "last used %(used)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:64
msgid "never used"
msgstr ""
#: templates/users/fragments/api_tokens.html:68
#, python-format
msgid "expires %(expires)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:70
msgid "no expiry"
msgstr ""
#: templates/users/fragments/api_tokens.html:78
msgid "Revoke"
msgstr ""
#: templates/users/fragments/api_tokens.html:84
msgid "Revoke token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:85
msgid "This token will stop working immediately."
msgstr ""
#: templates/users/fragments/api_tokens.html:86
msgid "Yes, revoke it!"
msgstr ""
#: templates/users/fragments/api_tokens.html:99
msgid "Delete token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:100
msgid "This permanently removes the token from the list. It cannot be undone."
msgstr ""
#: templates/users/fragments/api_tokens.html:114
msgid "No API tokens"
msgstr ""
#: templates/users/fragments/edit.html:5 #: templates/users/fragments/edit.html:5
msgid "Edit user" msgid "Edit user"
msgstr "" msgstr ""
+218 -57
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-06 08:15+0000\n" "POT-Creation-Date: 2026-07-04 15:39+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: none\n" "Language-Team: none\n"
@@ -29,8 +29,8 @@ msgstr ""
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536 #: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919 #: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978 #: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:242 #: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:400 #: apps/users/forms.py:404
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5 #: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128 #: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update" msgid "Update"
@@ -45,7 +45,7 @@ msgstr ""
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886 #: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953 #: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134 #: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:248 apps/users/forms.py:406 #: apps/users/forms.py:252 apps/users/forms.py:410
#: templates/mini_tools/unit_price_calculator.html:168 #: templates/mini_tools/unit_price_calculator.html:168
msgid "Add" msgid "Add"
msgstr "" msgstr ""
@@ -97,7 +97,7 @@ msgstr ""
#: apps/import_app/models.py:14 apps/rules/models.py:13 #: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248 #: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057 #: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: templates/account_groups/fragments/list.html:22 #: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22 #: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17 #: templates/categories/fragments/table.html:17
#: templates/currencies/fragments/list.html:23 #: templates/currencies/fragments/list.html:23
@@ -343,7 +343,7 @@ msgid ""
"owner.<br/>Public: Shown for all users. Only editable by the owner." "owner.<br/>Public: Shown for all users. Only editable by the owner."
msgstr "" msgstr ""
#: apps/common/forms.py:76 apps/users/forms.py:169 #: apps/common/forms.py:76 apps/users/forms.py:173
msgid "Save" msgid "Save"
msgstr "" msgstr ""
@@ -529,8 +529,8 @@ msgstr ""
msgid "Date and Time" msgid "Date and Time"
msgstr "" msgstr ""
#: apps/currencies/models.py:78 apps/users/models.py:12 #: apps/currencies/models.py:78 apps/users/models.py:17
#: apps/users/models.py:497 #: apps/users/models.py:502
msgid "Auto" msgid "Auto"
msgstr "" msgstr ""
@@ -571,7 +571,9 @@ msgstr ""
#: templates/entities/fragments/list.html:16 #: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16 #: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16 #: templates/recurring_transactions/fragments/list.html:16
#: templates/tags/fragments/list.html:16 templates/users/fragments/list.html:25 #: templates/tags/fragments/list.html:16
#: templates/users/fragments/api_tokens.html:54
#: templates/users/fragments/list.html:25
msgid "Active" msgid "Active"
msgstr "" msgstr ""
@@ -1563,7 +1565,7 @@ msgstr ""
msgid "Yearly" msgid "Yearly"
msgstr "" msgstr ""
#: apps/transactions/models.py:596 apps/users/models.py:464 #: apps/transactions/models.py:596 apps/users/models.py:469
#: templates/includes/sidebar.html:51 #: templates/includes/sidebar.html:51
msgid "Monthly" msgid "Monthly"
msgstr "" msgstr ""
@@ -1754,11 +1756,11 @@ msgid "Installment Plan deleted successfully"
msgstr "" msgstr ""
#: apps/transactions/views/quick_transactions.py:45 #: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:188 #: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:252
msgid "Item added successfully" msgid "Item added successfully"
msgstr "" msgstr ""
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:220 #: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:284
msgid "Item updated successfully" msgid "Item updated successfully"
msgstr "" msgstr ""
@@ -1843,44 +1845,48 @@ msgstr ""
msgid "Transfer added successfully" msgid "Transfer added successfully"
msgstr "" msgstr ""
#: apps/users/admin.py:22 templates/users/fragments/user_settings.html:5 #: apps/users/admin.py:17
msgid "Revoke selected API tokens"
msgstr ""
#: apps/users/admin.py:28 templates/users/fragments/user_settings.html:5
msgid "User Settings" msgid "User Settings"
msgstr "" msgstr ""
#: apps/users/admin.py:23 #: apps/users/admin.py:29
msgid "User Setting" msgid "User Setting"
msgstr "" msgstr ""
#: apps/users/admin.py:48 #: apps/users/admin.py:54
msgid "Personal info" msgid "Personal info"
msgstr "" msgstr ""
#: apps/users/admin.py:50 #: apps/users/admin.py:56
msgid "Permissions" msgid "Permissions"
msgstr "" msgstr ""
#: apps/users/admin.py:61 #: apps/users/admin.py:67
msgid "Important dates" msgid "Important dates"
msgstr "" msgstr ""
#: apps/users/forms.py:24 apps/users/forms.py:28 apps/users/models.py:451 #: apps/users/forms.py:28 apps/users/forms.py:32 apps/users/models.py:456
#: templates/users/login.html:18 #: templates/users/login.html:18
msgid "E-mail" msgid "E-mail"
msgstr "" msgstr ""
#: apps/users/forms.py:35 apps/users/forms.py:40 templates/users/login.html:19 #: apps/users/forms.py:39 apps/users/forms.py:44 templates/users/login.html:19
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: apps/users/forms.py:47 #: apps/users/forms.py:51
msgid "Invalid e-mail or password" msgid "Invalid e-mail or password"
msgstr "" msgstr ""
#: apps/users/forms.py:48 #: apps/users/forms.py:52
msgid "This account is deactivated" msgid "This account is deactivated"
msgstr "" msgstr ""
#: apps/users/forms.py:64 apps/users/forms.py:77 apps/users/forms.py:99 #: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98 #: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245 #: templates/monthly_overview/pages/overview.html:245
#: templates/transactions/pages/transactions.html:47 #: templates/transactions/pages/transactions.html:47
@@ -1888,23 +1894,23 @@ msgstr ""
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: apps/users/forms.py:107 apps/users/models.py:484 #: apps/users/forms.py:111 apps/users/models.py:489
msgid "Date Format" msgid "Date Format"
msgstr "" msgstr ""
#: apps/users/forms.py:112 apps/users/models.py:489 #: apps/users/forms.py:116 apps/users/models.py:494
msgid "Datetime Format" msgid "Datetime Format"
msgstr "" msgstr ""
#: apps/users/forms.py:118 apps/users/models.py:492 #: apps/users/forms.py:122 apps/users/models.py:497
msgid "Number Format" msgid "Number Format"
msgstr "" msgstr ""
#: apps/users/forms.py:125 #: apps/users/forms.py:129
msgid "Default Account" msgid "Default Account"
msgstr "" msgstr ""
#: apps/users/forms.py:174 #: apps/users/forms.py:178
#, python-format #, python-format
msgid "" msgid ""
"This changes the language (if available) and how numbers and dates are " "This changes the language (if available) and how numbers and dates are "
@@ -1912,130 +1918,202 @@ msgid ""
"Consider helping translate WYGIWYH to your language at %(translation_link)s" "Consider helping translate WYGIWYH to your language at %(translation_link)s"
msgstr "" msgstr ""
#: apps/users/forms.py:183 #: apps/users/forms.py:187
msgid "New Password" msgid "New Password"
msgstr "" msgstr ""
#: apps/users/forms.py:186 #: apps/users/forms.py:190
msgid "Leave blank to keep the current password." msgid "Leave blank to keep the current password."
msgstr "" msgstr ""
#: apps/users/forms.py:189 #: apps/users/forms.py:193
msgid "Confirm New Password" msgid "Confirm New Password"
msgstr "" msgstr ""
#: apps/users/forms.py:201 apps/users/forms.py:358 #: apps/users/forms.py:205 apps/users/forms.py:362
msgid "" msgid ""
"Designates whether this user should be treated as active. Unselect this " "Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts." "instead of deleting accounts."
msgstr "" msgstr ""
#: apps/users/forms.py:204 apps/users/forms.py:361 #: apps/users/forms.py:208 apps/users/forms.py:365
msgid "" msgid ""
"Designates that this user has all permissions without explicitly assigning " "Designates that this user has all permissions without explicitly assigning "
"them." "them."
msgstr "" msgstr ""
#: apps/users/forms.py:271 #: apps/users/forms.py:275
msgid "This email address is already in use by another account." msgid "This email address is already in use by another account."
msgstr "" msgstr ""
#: apps/users/forms.py:279 #: apps/users/forms.py:283
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "" msgstr ""
#: apps/users/forms.py:281 #: apps/users/forms.py:285
msgid "Please confirm your new password." msgid "Please confirm your new password."
msgstr "" msgstr ""
#: apps/users/forms.py:283 #: apps/users/forms.py:287
msgid "Please enter the new password first." msgid "Please enter the new password first."
msgstr "" msgstr ""
#: apps/users/forms.py:303 #: apps/users/forms.py:307
msgid "You cannot deactivate your own account using this form." msgid "You cannot deactivate your own account using this form."
msgstr "" msgstr ""
#: apps/users/forms.py:316 #: apps/users/forms.py:320
msgid "Cannot remove status from the last superuser." msgid "Cannot remove status from the last superuser."
msgstr "" msgstr ""
#: apps/users/forms.py:322 #: apps/users/forms.py:326
msgid "You cannot remove your own superuser status using this form." msgid "You cannot remove your own superuser status using this form."
msgstr "" msgstr ""
#: apps/users/forms.py:415 #: apps/users/forms.py:419
msgid "A user with this email address already exists." msgid "A user with this email address already exists."
msgstr "" msgstr ""
#: apps/users/models.py:465 #: apps/users/forms.py:439
msgid "Token name"
msgstr ""
#: apps/users/forms.py:441
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
msgid "Create token"
msgstr ""
#: apps/users/models.py:470
msgid "Yearly by currency" msgid "Yearly by currency"
msgstr "" msgstr ""
#: apps/users/models.py:466 #: apps/users/models.py:471
msgid "Yearly by account" msgid "Yearly by account"
msgstr "" msgstr ""
#: apps/users/models.py:467 templates/net_worth/net_worth.html:9 #: apps/users/models.py:472 templates/net_worth/net_worth.html:9
msgid "Current Net Worth" msgid "Current Net Worth"
msgstr "" msgstr ""
#: apps/users/models.py:468 templates/net_worth/net_worth.html:11 #: apps/users/models.py:473 templates/net_worth/net_worth.html:11
msgid "Projected Net Worth" msgid "Projected Net Worth"
msgstr "" msgstr ""
#: apps/users/models.py:469 #: apps/users/models.py:474
msgid "All Transactions" msgid "All Transactions"
msgstr "" msgstr ""
#: apps/users/models.py:470 templates/includes/sidebar.html:63 #: apps/users/models.py:475 templates/includes/sidebar.html:63
msgid "Calendar" msgid "Calendar"
msgstr "" msgstr ""
#: apps/users/models.py:480 #: apps/users/models.py:485
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: apps/users/models.py:499 #: apps/users/models.py:504
msgid "Language" msgid "Language"
msgstr "" msgstr ""
#: apps/users/models.py:505 #: apps/users/models.py:510
msgid "Time Zone" msgid "Time Zone"
msgstr "" msgstr ""
#: apps/users/models.py:511 #: apps/users/models.py:516
msgid "Start page" msgid "Start page"
msgstr "" msgstr ""
#: apps/users/models.py:516 #: apps/users/models.py:521
msgid "Default account" msgid "Default account"
msgstr "" msgstr ""
#: apps/users/models.py:517 #: apps/users/models.py:522
msgid "Selects the account by default when creating new transactions" msgid "Selects the account by default when creating new transactions"
msgstr "" msgstr ""
#: apps/users/views.py:67 #: apps/users/models.py:570
msgid "User"
msgstr ""
#: apps/users/models.py:577
msgid "Token key"
msgstr ""
#: apps/users/models.py:579
msgid "Token hash"
msgstr ""
#: apps/users/models.py:583
msgid "Last used at"
msgstr ""
#: apps/users/models.py:588
msgid "Expires at"
msgstr ""
#: apps/users/models.py:593
msgid "Revoked at"
msgstr ""
#: apps/users/models.py:595
msgid "Created at"
msgstr ""
#: apps/users/models.py:596
msgid "Updated at"
msgstr ""
#: apps/users/models.py:606
msgid "API token"
msgstr ""
#: apps/users/models.py:607
msgid "API tokens"
msgstr ""
#: apps/users/views.py:69
msgid "Transaction amounts are now hidden" msgid "Transaction amounts are now hidden"
msgstr "" msgstr ""
#: apps/users/views.py:70 #: apps/users/views.py:72
msgid "Transaction amounts are now displayed" msgid "Transaction amounts are now displayed"
msgstr "" msgstr ""
#: apps/users/views.py:88 #: apps/users/views.py:90
msgid "Sounds are now muted" msgid "Sounds are now muted"
msgstr "" msgstr ""
#: apps/users/views.py:91 #: apps/users/views.py:93
msgid "Sounds will now play" msgid "Sounds will now play"
msgstr "" msgstr ""
#: apps/users/views.py:107 #: apps/users/views.py:109
msgid "Your settings have been updated" msgid "Your settings have been updated"
msgstr "" msgstr ""
#: apps/users/views.py:148
msgid "API token created successfully"
msgstr ""
#: apps/users/views.py:167
msgid "API token revoked successfully"
msgstr ""
#: apps/users/views.py:178
msgid "API token deleted successfully"
msgstr ""
#: templates/account_groups/fragments/add.html:5 #: templates/account_groups/fragments/add.html:5
msgid "Add account group" msgid "Add account group"
msgstr "" msgstr ""
@@ -2133,6 +2211,7 @@ msgstr ""
#: templates/rules/fragments/transaction_rule/view.html:92 #: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133 #: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51 #: templates/tags/fragments/table.html:51
#: templates/users/fragments/api_tokens.html:93
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
@@ -2210,6 +2289,7 @@ msgstr ""
#: templates/rules/fragments/transaction_rule/view.html:98 #: templates/rules/fragments/transaction_rule/view.html:98
#: templates/tags/fragments/table.html:57 #: templates/tags/fragments/table.html:57
#: templates/transactions/fragments/attachments.html:22 #: templates/transactions/fragments/attachments.html:22
#: templates/users/fragments/api_tokens.html:101
msgid "Yes, delete it!" msgid "Yes, delete it!"
msgstr "" msgstr ""
@@ -3204,6 +3284,10 @@ msgstr ""
msgid "This is a demo!" msgid "This is a demo!"
msgstr "" msgstr ""
#: templates/layouts/base.html:37
msgid "Any data you add here will be wiped in 24hrs or less"
msgstr ""
#: templates/mini_tools/currency_converter/currency_converter.html:57 #: templates/mini_tools/currency_converter/currency_converter.html:57
msgid "Invert" msgid "Invert"
msgstr "" msgstr ""
@@ -3576,6 +3660,83 @@ msgstr ""
msgid "Add user" msgid "Add user"
msgstr "" msgstr ""
#: templates/users/fragments/api_tokens.html:5
msgid "API Tokens"
msgstr ""
#: templates/users/fragments/api_tokens.html:7
msgid ""
"Use these tokens for automations such as n8n. The raw token is shown only "
"once after creation."
msgstr ""
#: templates/users/fragments/api_tokens.html:14
msgid "Copy this token now"
msgstr ""
#: templates/users/fragments/api_tokens.html:16
msgid "It will not be shown again after this response."
msgstr ""
#: templates/users/fragments/api_tokens.html:31
msgid "Copy"
msgstr ""
#: templates/users/fragments/api_tokens.html:52
msgid "Revoked"
msgstr ""
#: templates/users/fragments/api_tokens.html:59
#, python-format
msgid "Created %(created)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:62
#, python-format
msgid "last used %(used)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:64
msgid "never used"
msgstr ""
#: templates/users/fragments/api_tokens.html:68
#, python-format
msgid "expires %(expires)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:70
msgid "no expiry"
msgstr ""
#: templates/users/fragments/api_tokens.html:78
msgid "Revoke"
msgstr ""
#: templates/users/fragments/api_tokens.html:84
msgid "Revoke token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:85
msgid "This token will stop working immediately."
msgstr ""
#: templates/users/fragments/api_tokens.html:86
msgid "Yes, revoke it!"
msgstr ""
#: templates/users/fragments/api_tokens.html:99
msgid "Delete token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:100
msgid "This permanently removes the token from the list. It cannot be undone."
msgstr ""
#: templates/users/fragments/api_tokens.html:114
msgid "No API tokens"
msgstr ""
#: templates/users/fragments/edit.html:5 #: templates/users/fragments/edit.html:5
msgid "Edit user" msgid "Edit user"
msgstr "" msgstr ""
+242 -61
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-06 08:15+0000\n" "POT-Creation-Date: 2026-07-04 15:39+0000\n"
"PO-Revision-Date: 2025-12-28 22:24+0000\n" "PO-Revision-Date: 2025-12-28 22:24+0000\n"
"Last-Translator: icovada <federico.tabbo@networktocode.com>\n" "Last-Translator: icovada <federico.tabbo@networktocode.com>\n"
"Language-Team: Italian <https://translations.herculino.com/projects/wygiwyh/" "Language-Team: Italian <https://translations.herculino.com/projects/wygiwyh/"
@@ -31,8 +31,8 @@ msgstr "Nome del gruppo"
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536 #: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919 #: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978 #: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:242 #: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:400 #: apps/users/forms.py:404
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5 #: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128 #: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update" msgid "Update"
@@ -47,7 +47,7 @@ msgstr "Aggiorna"
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886 #: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953 #: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134 #: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:248 apps/users/forms.py:406 #: apps/users/forms.py:252 apps/users/forms.py:410
#: templates/mini_tools/unit_price_calculator.html:168 #: templates/mini_tools/unit_price_calculator.html:168
msgid "Add" msgid "Add"
msgstr "Aggiungi" msgstr "Aggiungi"
@@ -99,7 +99,7 @@ msgstr "Tag"
#: apps/import_app/models.py:14 apps/rules/models.py:13 #: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248 #: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057 #: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: templates/account_groups/fragments/list.html:22 #: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22 #: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17 #: templates/categories/fragments/table.html:17
#: templates/currencies/fragments/list.html:23 #: templates/currencies/fragments/list.html:23
@@ -355,7 +355,7 @@ msgstr ""
"Modificabile solo dal proprietario.<br/>Pubblico: visibile da tutti gli " "Modificabile solo dal proprietario.<br/>Pubblico: visibile da tutti gli "
"utenti. Modificabile solo dal proprietario." "utenti. Modificabile solo dal proprietario."
#: apps/common/forms.py:76 apps/users/forms.py:169 #: apps/common/forms.py:76 apps/users/forms.py:173
msgid "Save" msgid "Save"
msgstr "Salva" msgstr "Salva"
@@ -541,8 +541,8 @@ msgstr "Cambio valuta"
msgid "Date and Time" msgid "Date and Time"
msgstr "Data e ora" msgstr "Data e ora"
#: apps/currencies/models.py:78 apps/users/models.py:12 #: apps/currencies/models.py:78 apps/users/models.py:17
#: apps/users/models.py:497 #: apps/users/models.py:502
msgid "Auto" msgid "Auto"
msgstr "Automatico" msgstr "Automatico"
@@ -583,7 +583,9 @@ msgstr "Tipo di servizio"
#: templates/entities/fragments/list.html:16 #: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16 #: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16 #: templates/recurring_transactions/fragments/list.html:16
#: templates/tags/fragments/list.html:16 templates/users/fragments/list.html:25 #: templates/tags/fragments/list.html:16
#: templates/users/fragments/api_tokens.html:54
#: templates/users/fragments/list.html:25
msgid "Active" msgid "Active"
msgstr "Attivo" msgstr "Attivo"
@@ -1611,7 +1613,7 @@ msgstr "Tag di transazione"
msgid "Yearly" msgid "Yearly"
msgstr "Annuale" msgstr "Annuale"
#: apps/transactions/models.py:596 apps/users/models.py:464 #: apps/transactions/models.py:596 apps/users/models.py:469
#: templates/includes/sidebar.html:51 #: templates/includes/sidebar.html:51
msgid "Monthly" msgid "Monthly"
msgstr "Mensile" msgstr "Mensile"
@@ -1802,11 +1804,11 @@ msgid "Installment Plan deleted successfully"
msgstr "Piano di rateizzazione eliminato correttamente" msgstr "Piano di rateizzazione eliminato correttamente"
#: apps/transactions/views/quick_transactions.py:45 #: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:188 #: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:252
msgid "Item added successfully" msgid "Item added successfully"
msgstr "Elemento aggiunto con successo" msgstr "Elemento aggiunto con successo"
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:220 #: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:284
msgid "Item updated successfully" msgid "Item updated successfully"
msgstr "Elemento aggiornato con successo" msgstr "Elemento aggiornato con successo"
@@ -1895,44 +1897,48 @@ msgstr "Transazione ripristinata con successo"
msgid "Transfer added successfully" msgid "Transfer added successfully"
msgstr "Trasferimento aggiunto con successo" msgstr "Trasferimento aggiunto con successo"
#: apps/users/admin.py:22 templates/users/fragments/user_settings.html:5 #: apps/users/admin.py:17
msgid "Revoke selected API tokens"
msgstr ""
#: apps/users/admin.py:28 templates/users/fragments/user_settings.html:5
msgid "User Settings" msgid "User Settings"
msgstr "Impostazioni utente" msgstr "Impostazioni utente"
#: apps/users/admin.py:23 #: apps/users/admin.py:29
msgid "User Setting" msgid "User Setting"
msgstr "Impostazione utente" msgstr "Impostazione utente"
#: apps/users/admin.py:48 #: apps/users/admin.py:54
msgid "Personal info" msgid "Personal info"
msgstr "Informazioni personali" msgstr "Informazioni personali"
#: apps/users/admin.py:50 #: apps/users/admin.py:56
msgid "Permissions" msgid "Permissions"
msgstr "Permessi" msgstr "Permessi"
#: apps/users/admin.py:61 #: apps/users/admin.py:67
msgid "Important dates" msgid "Important dates"
msgstr "Date importanti" msgstr "Date importanti"
#: apps/users/forms.py:24 apps/users/forms.py:28 apps/users/models.py:451 #: apps/users/forms.py:28 apps/users/forms.py:32 apps/users/models.py:456
#: templates/users/login.html:18 #: templates/users/login.html:18
msgid "E-mail" msgid "E-mail"
msgstr "E-mail" msgstr "E-mail"
#: apps/users/forms.py:35 apps/users/forms.py:40 templates/users/login.html:19 #: apps/users/forms.py:39 apps/users/forms.py:44 templates/users/login.html:19
msgid "Password" msgid "Password"
msgstr "Password" msgstr "Password"
#: apps/users/forms.py:47 #: apps/users/forms.py:51
msgid "Invalid e-mail or password" msgid "Invalid e-mail or password"
msgstr "E-mail o password non valide" msgstr "E-mail o password non valide"
#: apps/users/forms.py:48 #: apps/users/forms.py:52
msgid "This account is deactivated" msgid "This account is deactivated"
msgstr "Questo account è disattivato" msgstr "Questo account è disattivato"
#: apps/users/forms.py:64 apps/users/forms.py:77 apps/users/forms.py:99 #: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98 #: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245 #: templates/monthly_overview/pages/overview.html:245
#: templates/transactions/pages/transactions.html:47 #: templates/transactions/pages/transactions.html:47
@@ -1940,25 +1946,25 @@ msgstr "Questo account è disattivato"
msgid "Default" msgid "Default"
msgstr "Predefinito" msgstr "Predefinito"
#: apps/users/forms.py:107 apps/users/models.py:484 #: apps/users/forms.py:111 apps/users/models.py:489
msgid "Date Format" msgid "Date Format"
msgstr "Formato data" msgstr "Formato data"
#: apps/users/forms.py:112 apps/users/models.py:489 #: apps/users/forms.py:116 apps/users/models.py:494
msgid "Datetime Format" msgid "Datetime Format"
msgstr "Formato data e ora" msgstr "Formato data e ora"
#: apps/users/forms.py:118 apps/users/models.py:492 #: apps/users/forms.py:122 apps/users/models.py:497
msgid "Number Format" msgid "Number Format"
msgstr "Formato numerico" msgstr "Formato numerico"
#: apps/users/forms.py:125 #: apps/users/forms.py:129
#, fuzzy #, fuzzy
#| msgid "Target Accounts" #| msgid "Target Accounts"
msgid "Default Account" msgid "Default Account"
msgstr "Conti target" msgstr "Conti target"
#: apps/users/forms.py:174 #: apps/users/forms.py:178
#, python-format #, python-format
msgid "" msgid ""
"This changes the language (if available) and how numbers and dates are " "This changes the language (if available) and how numbers and dates are "
@@ -1970,19 +1976,19 @@ msgstr ""
"Considera la possibilità di contribuire alla traduzione di WYGIWYH nella tua " "Considera la possibilità di contribuire alla traduzione di WYGIWYH nella tua "
"lingua su %(translation_link)s" "lingua su %(translation_link)s"
#: apps/users/forms.py:183 #: apps/users/forms.py:187
msgid "New Password" msgid "New Password"
msgstr "Nuova Password" msgstr "Nuova Password"
#: apps/users/forms.py:186 #: apps/users/forms.py:190
msgid "Leave blank to keep the current password." msgid "Leave blank to keep the current password."
msgstr "Lascia vuoto per mantenere la password attuale." msgstr "Lascia vuoto per mantenere la password attuale."
#: apps/users/forms.py:189 #: apps/users/forms.py:193
msgid "Confirm New Password" msgid "Confirm New Password"
msgstr "Conferma nuova password" msgstr "Conferma nuova password"
#: apps/users/forms.py:201 apps/users/forms.py:358 #: apps/users/forms.py:205 apps/users/forms.py:362
msgid "" msgid ""
"Designates whether this user should be treated as active. Unselect this " "Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts." "instead of deleting accounts."
@@ -1990,7 +1996,7 @@ msgstr ""
"Indica se questo utente deve essere considerato attivo. Deseleziona questa " "Indica se questo utente deve essere considerato attivo. Deseleziona questa "
"opzione invece di eliminare gli account." "opzione invece di eliminare gli account."
#: apps/users/forms.py:204 apps/users/forms.py:361 #: apps/users/forms.py:208 apps/users/forms.py:365
msgid "" msgid ""
"Designates that this user has all permissions without explicitly assigning " "Designates that this user has all permissions without explicitly assigning "
"them." "them."
@@ -1998,87 +2004,111 @@ msgstr ""
"Indica che questo utente ha tutte le autorizzazioni senza assegnarle " "Indica che questo utente ha tutte le autorizzazioni senza assegnarle "
"esplicitamente." "esplicitamente."
#: apps/users/forms.py:271 #: apps/users/forms.py:275
msgid "This email address is already in use by another account." msgid "This email address is already in use by another account."
msgstr "Questo indirizzo email è già utilizzato da un altro account." msgstr "Questo indirizzo email è già utilizzato da un altro account."
#: apps/users/forms.py:279 #: apps/users/forms.py:283
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "I due campi password non corrispondono." msgstr "I due campi password non corrispondono."
#: apps/users/forms.py:281 #: apps/users/forms.py:285
msgid "Please confirm your new password." msgid "Please confirm your new password."
msgstr "Conferma la nuova password." msgstr "Conferma la nuova password."
#: apps/users/forms.py:283 #: apps/users/forms.py:287
msgid "Please enter the new password first." msgid "Please enter the new password first."
msgstr "Inserisci prima la nuova password." msgstr "Inserisci prima la nuova password."
#: apps/users/forms.py:303 #: apps/users/forms.py:307
msgid "You cannot deactivate your own account using this form." msgid "You cannot deactivate your own account using this form."
msgstr "Non è possibile disattivare il proprio account tramite questo modulo." msgstr "Non è possibile disattivare il proprio account tramite questo modulo."
#: apps/users/forms.py:316 #: apps/users/forms.py:320
msgid "Cannot remove status from the last superuser." msgid "Cannot remove status from the last superuser."
msgstr "Impossibile rimuovere lo stato dall'ultimo superutente." msgstr "Impossibile rimuovere lo stato dall'ultimo superutente."
#: apps/users/forms.py:322 #: apps/users/forms.py:326
msgid "You cannot remove your own superuser status using this form." msgid "You cannot remove your own superuser status using this form."
msgstr "" msgstr ""
"Non è possibile rimuovere il proprio stato di superutente tramite questo " "Non è possibile rimuovere il proprio stato di superutente tramite questo "
"modulo." "modulo."
#: apps/users/forms.py:415 #: apps/users/forms.py:419
msgid "A user with this email address already exists." msgid "A user with this email address already exists."
msgstr "Esiste già un utente con questo indirizzo email." msgstr "Esiste già un utente con questo indirizzo email."
#: apps/users/models.py:465 #: apps/users/forms.py:439
#, fuzzy
#| msgid "Tag name"
msgid "Token name"
msgstr "Nome tag"
#: apps/users/forms.py:441
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
#, fuzzy
#| msgid "Create transaction"
msgid "Create token"
msgstr "Crea transazione"
#: apps/users/models.py:470
msgid "Yearly by currency" msgid "Yearly by currency"
msgstr "Annuale per valuta" msgstr "Annuale per valuta"
#: apps/users/models.py:466 #: apps/users/models.py:471
msgid "Yearly by account" msgid "Yearly by account"
msgstr "Annuale per conto" msgstr "Annuale per conto"
#: apps/users/models.py:467 templates/net_worth/net_worth.html:9 #: apps/users/models.py:472 templates/net_worth/net_worth.html:9
msgid "Current Net Worth" msgid "Current Net Worth"
msgstr "Patrimonio netto attuale" msgstr "Patrimonio netto attuale"
#: apps/users/models.py:468 templates/net_worth/net_worth.html:11 #: apps/users/models.py:473 templates/net_worth/net_worth.html:11
msgid "Projected Net Worth" msgid "Projected Net Worth"
msgstr "Patrimonio netto previsto" msgstr "Patrimonio netto previsto"
#: apps/users/models.py:469 #: apps/users/models.py:474
msgid "All Transactions" msgid "All Transactions"
msgstr "Tutte le transazioni" msgstr "Tutte le transazioni"
#: apps/users/models.py:470 templates/includes/sidebar.html:63 #: apps/users/models.py:475 templates/includes/sidebar.html:63
msgid "Calendar" msgid "Calendar"
msgstr "Calendario" msgstr "Calendario"
#: apps/users/models.py:480 #: apps/users/models.py:485
msgid "Volume" msgid "Volume"
msgstr "Volume" msgstr "Volume"
#: apps/users/models.py:499 #: apps/users/models.py:504
msgid "Language" msgid "Language"
msgstr "Lingua" msgstr "Lingua"
#: apps/users/models.py:505 #: apps/users/models.py:510
msgid "Time Zone" msgid "Time Zone"
msgstr "Fuso orario" msgstr "Fuso orario"
#: apps/users/models.py:511 #: apps/users/models.py:516
msgid "Start page" msgid "Start page"
msgstr "Pagina iniziale" msgstr "Pagina iniziale"
#: apps/users/models.py:516 #: apps/users/models.py:521
#, fuzzy #, fuzzy
#| msgid "Asset account" #| msgid "Asset account"
msgid "Default account" msgid "Default account"
msgstr "Conto patrimoniale" msgstr "Conto patrimoniale"
#: apps/users/models.py:517 #: apps/users/models.py:522
#, fuzzy #, fuzzy
#| msgid "" #| msgid ""
#| "Deactivated tags won't be able to be selected when creating new " #| "Deactivated tags won't be able to be selected when creating new "
@@ -2088,26 +2118,94 @@ msgstr ""
"I tag disattivati non potranno essere selezionati durante la creazione di " "I tag disattivati non potranno essere selezionati durante la creazione di "
"nuove transazioni" "nuove transazioni"
#: apps/users/views.py:67 #: apps/users/models.py:570
#, fuzzy
#| msgid "Users"
msgid "User"
msgstr "Utenti"
#: apps/users/models.py:577
msgid "Token key"
msgstr ""
#: apps/users/models.py:579
msgid "Token hash"
msgstr ""
#: apps/users/models.py:583
#, fuzzy
#| msgid "Last Generated Date"
msgid "Last used at"
msgstr "Data dell'ultima generazione"
#: apps/users/models.py:588
msgid "Expires at"
msgstr ""
#: apps/users/models.py:593
msgid "Revoked at"
msgstr ""
#: apps/users/models.py:595
#, fuzzy
#| msgid "Create"
msgid "Created at"
msgstr "Crea"
#: apps/users/models.py:596
#, fuzzy
#| msgid "Update"
msgid "Updated at"
msgstr "Aggiorna"
#: apps/users/models.py:606
#, fuzzy
#| msgid "API Key"
msgid "API token"
msgstr "Chiave API"
#: apps/users/models.py:607
msgid "API tokens"
msgstr ""
#: apps/users/views.py:69
msgid "Transaction amounts are now hidden" msgid "Transaction amounts are now hidden"
msgstr "Gli importi delle transazioni sono nascosti" msgstr "Gli importi delle transazioni sono nascosti"
#: apps/users/views.py:70 #: apps/users/views.py:72
msgid "Transaction amounts are now displayed" msgid "Transaction amounts are now displayed"
msgstr "Gli importi delle transazioni sono visibili" msgstr "Gli importi delle transazioni sono visibili"
#: apps/users/views.py:88 #: apps/users/views.py:90
msgid "Sounds are now muted" msgid "Sounds are now muted"
msgstr "I suoni sono disattivati" msgstr "I suoni sono disattivati"
#: apps/users/views.py:91 #: apps/users/views.py:93
msgid "Sounds will now play" msgid "Sounds will now play"
msgstr "I suoni verranno riprodotti" msgstr "I suoni verranno riprodotti"
#: apps/users/views.py:107 #: apps/users/views.py:109
msgid "Your settings have been updated" msgid "Your settings have been updated"
msgstr "Le tue impostazioni sono state aggiornate" msgstr "Le tue impostazioni sono state aggiornate"
#: apps/users/views.py:148
#, fuzzy
#| msgid "Action updated successfully"
msgid "API token created successfully"
msgstr "Azione aggiornata con successo"
#: apps/users/views.py:167
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token revoked successfully"
msgstr "Azione eliminata con successo"
#: apps/users/views.py:178
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token deleted successfully"
msgstr "Azione eliminata con successo"
#: templates/account_groups/fragments/add.html:5 #: templates/account_groups/fragments/add.html:5
msgid "Add account group" msgid "Add account group"
msgstr "Aggiungi gruppo conti" msgstr "Aggiungi gruppo conti"
@@ -2205,6 +2303,7 @@ msgstr "Condividi"
#: templates/rules/fragments/transaction_rule/view.html:92 #: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133 #: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51 #: templates/tags/fragments/table.html:51
#: templates/users/fragments/api_tokens.html:93
msgid "Delete" msgid "Delete"
msgstr "Elimina" msgstr "Elimina"
@@ -2282,6 +2381,7 @@ msgstr "Non sarà possibile annullare questa operazione!"
#: templates/rules/fragments/transaction_rule/view.html:98 #: templates/rules/fragments/transaction_rule/view.html:98
#: templates/tags/fragments/table.html:57 #: templates/tags/fragments/table.html:57
#: templates/transactions/fragments/attachments.html:22 #: templates/transactions/fragments/attachments.html:22
#: templates/users/fragments/api_tokens.html:101
msgid "Yes, delete it!" msgid "Yes, delete it!"
msgstr "Sì, cancellalo!" msgstr "Sì, cancellalo!"
@@ -3307,6 +3407,10 @@ msgstr "Nessun piano di rateizzazione"
msgid "This is a demo!" msgid "This is a demo!"
msgstr "Questa è una demo!" msgstr "Questa è una demo!"
#: templates/layouts/base.html:37
msgid "Any data you add here will be wiped in 24hrs or less"
msgstr "Tutti i dati che aggiungi qui verranno cancellati entro 24 ore o meno"
#: templates/mini_tools/currency_converter/currency_converter.html:57 #: templates/mini_tools/currency_converter/currency_converter.html:57
msgid "Invert" msgid "Invert"
msgstr "Investi" msgstr "Investi"
@@ -3688,6 +3792,87 @@ msgstr "Nessun cambio"
msgid "Add user" msgid "Add user"
msgstr "Aggiungi utente" msgstr "Aggiungi utente"
#: templates/users/fragments/api_tokens.html:5
msgid "API Tokens"
msgstr ""
#: templates/users/fragments/api_tokens.html:7
msgid ""
"Use these tokens for automations such as n8n. The raw token is shown only "
"once after creation."
msgstr ""
#: templates/users/fragments/api_tokens.html:14
msgid "Copy this token now"
msgstr ""
#: templates/users/fragments/api_tokens.html:16
msgid "It will not be shown again after this response."
msgstr ""
#: templates/users/fragments/api_tokens.html:31
msgid "Copy"
msgstr ""
#: templates/users/fragments/api_tokens.html:52
msgid "Revoked"
msgstr ""
#: templates/users/fragments/api_tokens.html:59
#, python-format
msgid "Created %(created)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:62
#, python-format
msgid "last used %(used)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:64
msgid "never used"
msgstr ""
#: templates/users/fragments/api_tokens.html:68
#, python-format
msgid "expires %(expires)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:70
msgid "no expiry"
msgstr ""
#: templates/users/fragments/api_tokens.html:78
msgid "Revoke"
msgstr ""
#: templates/users/fragments/api_tokens.html:84
msgid "Revoke token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:85
msgid "This token will stop working immediately."
msgstr ""
#: templates/users/fragments/api_tokens.html:86
#, fuzzy
#| msgid "Yes, refresh it!"
msgid "Yes, revoke it!"
msgstr "Sì, aggiornalo!"
#: templates/users/fragments/api_tokens.html:99
#, fuzzy
#| msgid "Deleted At"
msgid "Delete token?"
msgstr "Eliminato alle"
#: templates/users/fragments/api_tokens.html:100
msgid "This permanently removes the token from the list. It cannot be undone."
msgstr ""
#: templates/users/fragments/api_tokens.html:114
msgid "No API tokens"
msgstr ""
#: templates/users/fragments/edit.html:5 #: templates/users/fragments/edit.html:5
msgid "Edit user" msgid "Edit user"
msgstr "Modifica utente" msgstr "Modifica utente"
@@ -3740,10 +3925,6 @@ msgstr "Accedi con"
msgid "Yearly Overview" msgid "Yearly Overview"
msgstr "Panoramica annuale" msgstr "Panoramica annuale"
#~ msgid "Any data you add here will be wiped in 24hrs or less"
#~ msgstr ""
#~ "Tutti i dati che aggiungi qui verranno cancellati entro 24 ore o meno"
#, fuzzy #, fuzzy
#~| msgid "Are you sure?" #~| msgid "Are you sure?"
#~ msgid " Are you sure?" #~ msgid " Are you sure?"
+243 -61
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-06 08:15+0000\n" "POT-Creation-Date: 2026-07-04 15:39+0000\n"
"PO-Revision-Date: 2026-06-07 08:57+0000\n" "PO-Revision-Date: 2026-06-07 08:57+0000\n"
"Last-Translator: Dimitri Decrock <dj.flashpower@gmail.com>\n" "Last-Translator: Dimitri Decrock <dj.flashpower@gmail.com>\n"
"Language-Team: Dutch <https://translations.herculino.com/projects/wygiwyh/" "Language-Team: Dutch <https://translations.herculino.com/projects/wygiwyh/"
@@ -31,8 +31,8 @@ msgstr "Groepsnaam"
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536 #: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919 #: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978 #: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:242 #: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:400 #: apps/users/forms.py:404
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5 #: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128 #: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update" msgid "Update"
@@ -47,7 +47,7 @@ msgstr "Bijwerken"
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886 #: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953 #: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134 #: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:248 apps/users/forms.py:406 #: apps/users/forms.py:252 apps/users/forms.py:410
#: templates/mini_tools/unit_price_calculator.html:168 #: templates/mini_tools/unit_price_calculator.html:168
msgid "Add" msgid "Add"
msgstr "Toevoegen" msgstr "Toevoegen"
@@ -99,7 +99,7 @@ msgstr "Labels"
#: apps/import_app/models.py:14 apps/rules/models.py:13 #: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248 #: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057 #: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: templates/account_groups/fragments/list.html:22 #: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22 #: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17 #: templates/categories/fragments/table.html:17
#: templates/currencies/fragments/list.html:23 #: templates/currencies/fragments/list.html:23
@@ -355,7 +355,7 @@ msgstr ""
"bewerkbaar door de eigenaar.<br/>Publiek: Weergegeven voor alle gebruikers. " "bewerkbaar door de eigenaar.<br/>Publiek: Weergegeven voor alle gebruikers. "
"Alleen bewerkbaar door de eigenaar." "Alleen bewerkbaar door de eigenaar."
#: apps/common/forms.py:76 apps/users/forms.py:169 #: apps/common/forms.py:76 apps/users/forms.py:173
msgid "Save" msgid "Save"
msgstr "Opslaan" msgstr "Opslaan"
@@ -541,8 +541,8 @@ msgstr "Wisselkoers"
msgid "Date and Time" msgid "Date and Time"
msgstr "Datum en Tijd" msgstr "Datum en Tijd"
#: apps/currencies/models.py:78 apps/users/models.py:12 #: apps/currencies/models.py:78 apps/users/models.py:17
#: apps/users/models.py:497 #: apps/users/models.py:502
msgid "Auto" msgid "Auto"
msgstr "Automatisch" msgstr "Automatisch"
@@ -583,7 +583,9 @@ msgstr "Soort Dienst"
#: templates/entities/fragments/list.html:16 #: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16 #: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16 #: templates/recurring_transactions/fragments/list.html:16
#: templates/tags/fragments/list.html:16 templates/users/fragments/list.html:25 #: templates/tags/fragments/list.html:16
#: templates/users/fragments/api_tokens.html:54
#: templates/users/fragments/list.html:25
msgid "Active" msgid "Active"
msgstr "Actief" msgstr "Actief"
@@ -1599,7 +1601,7 @@ msgstr "Transactiebijlages"
msgid "Yearly" msgid "Yearly"
msgstr "Jaarlijks" msgstr "Jaarlijks"
#: apps/transactions/models.py:596 apps/users/models.py:464 #: apps/transactions/models.py:596 apps/users/models.py:469
#: templates/includes/sidebar.html:51 #: templates/includes/sidebar.html:51
msgid "Monthly" msgid "Monthly"
msgstr "Maandelijks" msgstr "Maandelijks"
@@ -1790,11 +1792,11 @@ msgid "Installment Plan deleted successfully"
msgstr "Afbetalingsplan succesvol verwijderd" msgstr "Afbetalingsplan succesvol verwijderd"
#: apps/transactions/views/quick_transactions.py:45 #: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:188 #: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:252
msgid "Item added successfully" msgid "Item added successfully"
msgstr "Item succesvol toegevoegd" msgstr "Item succesvol toegevoegd"
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:220 #: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:284
msgid "Item updated successfully" msgid "Item updated successfully"
msgstr "Item succesvol bijgewerkt" msgstr "Item succesvol bijgewerkt"
@@ -1879,44 +1881,48 @@ msgstr "Verrichting succesvol hersteld"
msgid "Transfer added successfully" msgid "Transfer added successfully"
msgstr "Transactie succesvol toegevoegd" msgstr "Transactie succesvol toegevoegd"
#: apps/users/admin.py:22 templates/users/fragments/user_settings.html:5 #: apps/users/admin.py:17
msgid "Revoke selected API tokens"
msgstr ""
#: apps/users/admin.py:28 templates/users/fragments/user_settings.html:5
msgid "User Settings" msgid "User Settings"
msgstr "Gebruikersinstellingen" msgstr "Gebruikersinstellingen"
#: apps/users/admin.py:23 #: apps/users/admin.py:29
msgid "User Setting" msgid "User Setting"
msgstr "Gebruikersinstelling" msgstr "Gebruikersinstelling"
#: apps/users/admin.py:48 #: apps/users/admin.py:54
msgid "Personal info" msgid "Personal info"
msgstr "Persoonlijke gegevens" msgstr "Persoonlijke gegevens"
#: apps/users/admin.py:50 #: apps/users/admin.py:56
msgid "Permissions" msgid "Permissions"
msgstr "Rechten" msgstr "Rechten"
#: apps/users/admin.py:61 #: apps/users/admin.py:67
msgid "Important dates" msgid "Important dates"
msgstr "Belangrijke datums" msgstr "Belangrijke datums"
#: apps/users/forms.py:24 apps/users/forms.py:28 apps/users/models.py:451 #: apps/users/forms.py:28 apps/users/forms.py:32 apps/users/models.py:456
#: templates/users/login.html:18 #: templates/users/login.html:18
msgid "E-mail" msgid "E-mail"
msgstr "E-mailadres" msgstr "E-mailadres"
#: apps/users/forms.py:35 apps/users/forms.py:40 templates/users/login.html:19 #: apps/users/forms.py:39 apps/users/forms.py:44 templates/users/login.html:19
msgid "Password" msgid "Password"
msgstr "Wachtwoord" msgstr "Wachtwoord"
#: apps/users/forms.py:47 #: apps/users/forms.py:51
msgid "Invalid e-mail or password" msgid "Invalid e-mail or password"
msgstr "Ongeldig e-mailadres of wachtwoord" msgstr "Ongeldig e-mailadres of wachtwoord"
#: apps/users/forms.py:48 #: apps/users/forms.py:52
msgid "This account is deactivated" msgid "This account is deactivated"
msgstr "Deze gebruiker is gedeactiveerd" msgstr "Deze gebruiker is gedeactiveerd"
#: apps/users/forms.py:64 apps/users/forms.py:77 apps/users/forms.py:99 #: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98 #: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245 #: templates/monthly_overview/pages/overview.html:245
#: templates/transactions/pages/transactions.html:47 #: templates/transactions/pages/transactions.html:47
@@ -1924,23 +1930,23 @@ msgstr "Deze gebruiker is gedeactiveerd"
msgid "Default" msgid "Default"
msgstr "Standaard" msgstr "Standaard"
#: apps/users/forms.py:107 apps/users/models.py:484 #: apps/users/forms.py:111 apps/users/models.py:489
msgid "Date Format" msgid "Date Format"
msgstr "Datumnotatie" msgstr "Datumnotatie"
#: apps/users/forms.py:112 apps/users/models.py:489 #: apps/users/forms.py:116 apps/users/models.py:494
msgid "Datetime Format" msgid "Datetime Format"
msgstr "Tijdsnotatie" msgstr "Tijdsnotatie"
#: apps/users/forms.py:118 apps/users/models.py:492 #: apps/users/forms.py:122 apps/users/models.py:497
msgid "Number Format" msgid "Number Format"
msgstr "Schrijfwijze Nummers" msgstr "Schrijfwijze Nummers"
#: apps/users/forms.py:125 #: apps/users/forms.py:129
msgid "Default Account" msgid "Default Account"
msgstr "Standaard Rekening" msgstr "Standaard Rekening"
#: apps/users/forms.py:174 #: apps/users/forms.py:178
#, python-format #, python-format
msgid "" msgid ""
"This changes the language (if available) and how numbers and dates are " "This changes the language (if available) and how numbers and dates are "
@@ -1951,19 +1957,19 @@ msgstr ""
"weergegeven\n" "weergegeven\n"
"Overweeg om WYGIWYH te helpen vertalen naar jouw taal op %(translation_link)s" "Overweeg om WYGIWYH te helpen vertalen naar jouw taal op %(translation_link)s"
#: apps/users/forms.py:183 #: apps/users/forms.py:187
msgid "New Password" msgid "New Password"
msgstr "Nieuw Wachtwoord" msgstr "Nieuw Wachtwoord"
#: apps/users/forms.py:186 #: apps/users/forms.py:190
msgid "Leave blank to keep the current password." msgid "Leave blank to keep the current password."
msgstr "Laat leeg om het huidige wachtwoord te behouden." msgstr "Laat leeg om het huidige wachtwoord te behouden."
#: apps/users/forms.py:189 #: apps/users/forms.py:193
msgid "Confirm New Password" msgid "Confirm New Password"
msgstr "Bevestig Nieuw Wachtwoord" msgstr "Bevestig Nieuw Wachtwoord"
#: apps/users/forms.py:201 apps/users/forms.py:358 #: apps/users/forms.py:205 apps/users/forms.py:362
msgid "" msgid ""
"Designates whether this user should be treated as active. Unselect this " "Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts." "instead of deleting accounts."
@@ -1971,7 +1977,7 @@ msgstr ""
"Geeft aan of deze gebruiker als actief moet worden behandeld. Deselecteer " "Geeft aan of deze gebruiker als actief moet worden behandeld. Deselecteer "
"dit in plaats van accounts te verwijderen." "dit in plaats van accounts te verwijderen."
#: apps/users/forms.py:204 apps/users/forms.py:361 #: apps/users/forms.py:208 apps/users/forms.py:365
msgid "" msgid ""
"Designates that this user has all permissions without explicitly assigning " "Designates that this user has all permissions without explicitly assigning "
"them." "them."
@@ -1979,107 +1985,199 @@ msgstr ""
"Geeft aan dat deze gebruiker alle rechten heeft zonder ze expliciet toe te " "Geeft aan dat deze gebruiker alle rechten heeft zonder ze expliciet toe te "
"kennen." "kennen."
#: apps/users/forms.py:271 #: apps/users/forms.py:275
msgid "This email address is already in use by another account." msgid "This email address is already in use by another account."
msgstr "Dit e-mailadres wordt al gebruikt door een ander account." msgstr "Dit e-mailadres wordt al gebruikt door een ander account."
#: apps/users/forms.py:279 #: apps/users/forms.py:283
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "De twee wachtwoordvelden komen niet overeen." msgstr "De twee wachtwoordvelden komen niet overeen."
#: apps/users/forms.py:281 #: apps/users/forms.py:285
msgid "Please confirm your new password." msgid "Please confirm your new password."
msgstr "Bevestig je nieuwe wachtwoord." msgstr "Bevestig je nieuwe wachtwoord."
#: apps/users/forms.py:283 #: apps/users/forms.py:287
msgid "Please enter the new password first." msgid "Please enter the new password first."
msgstr "Geef eerst het nieuwe wachtwoord op." msgstr "Geef eerst het nieuwe wachtwoord op."
#: apps/users/forms.py:303 #: apps/users/forms.py:307
msgid "You cannot deactivate your own account using this form." msgid "You cannot deactivate your own account using this form."
msgstr "Je kunt je eigen account niet deactiveren met dit formulier." msgstr "Je kunt je eigen account niet deactiveren met dit formulier."
#: apps/users/forms.py:316 #: apps/users/forms.py:320
msgid "Cannot remove status from the last superuser." msgid "Cannot remove status from the last superuser."
msgstr "Kan de status van de laatste Hoofdadmin niet verwijderen." msgstr "Kan de status van de laatste Hoofdadmin niet verwijderen."
#: apps/users/forms.py:322 #: apps/users/forms.py:326
msgid "You cannot remove your own superuser status using this form." msgid "You cannot remove your own superuser status using this form."
msgstr "Je kunt je eigen hoofdadminrechten niet verwijderen met dit formulier." msgstr "Je kunt je eigen hoofdadminrechten niet verwijderen met dit formulier."
#: apps/users/forms.py:415 #: apps/users/forms.py:419
msgid "A user with this email address already exists." msgid "A user with this email address already exists."
msgstr "Er bestaat al een gebruiker met dit e-mailadres." msgstr "Er bestaat al een gebruiker met dit e-mailadres."
#: apps/users/models.py:465 #: apps/users/forms.py:439
#, fuzzy
#| msgid "Tag name"
msgid "Token name"
msgstr "Labelnaam"
#: apps/users/forms.py:441
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
#, fuzzy
#| msgid "Create transaction"
msgid "Create token"
msgstr "Maak verrichtingen"
#: apps/users/models.py:470
msgid "Yearly by currency" msgid "Yearly by currency"
msgstr "Jaarlijks per munteenheid" msgstr "Jaarlijks per munteenheid"
#: apps/users/models.py:466 #: apps/users/models.py:471
msgid "Yearly by account" msgid "Yearly by account"
msgstr "Jaarlijks per rekening" msgstr "Jaarlijks per rekening"
#: apps/users/models.py:467 templates/net_worth/net_worth.html:9 #: apps/users/models.py:472 templates/net_worth/net_worth.html:9
msgid "Current Net Worth" msgid "Current Net Worth"
msgstr "Huidige Nettowaarde" msgstr "Huidige Nettowaarde"
#: apps/users/models.py:468 templates/net_worth/net_worth.html:11 #: apps/users/models.py:473 templates/net_worth/net_worth.html:11
msgid "Projected Net Worth" msgid "Projected Net Worth"
msgstr "Verwachte Nettowaarde" msgstr "Verwachte Nettowaarde"
#: apps/users/models.py:469 #: apps/users/models.py:474
msgid "All Transactions" msgid "All Transactions"
msgstr "Alle Verrichtingen" msgstr "Alle Verrichtingen"
#: apps/users/models.py:470 templates/includes/sidebar.html:63 #: apps/users/models.py:475 templates/includes/sidebar.html:63
msgid "Calendar" msgid "Calendar"
msgstr "Kalender" msgstr "Kalender"
#: apps/users/models.py:480 #: apps/users/models.py:485
msgid "Volume" msgid "Volume"
msgstr "Volume" msgstr "Volume"
#: apps/users/models.py:499 #: apps/users/models.py:504
msgid "Language" msgid "Language"
msgstr "Taal" msgstr "Taal"
#: apps/users/models.py:505 #: apps/users/models.py:510
msgid "Time Zone" msgid "Time Zone"
msgstr "Tijdszone" msgstr "Tijdszone"
#: apps/users/models.py:511 #: apps/users/models.py:516
msgid "Start page" msgid "Start page"
msgstr "Startpagina" msgstr "Startpagina"
#: apps/users/models.py:516 #: apps/users/models.py:521
msgid "Default account" msgid "Default account"
msgstr "Standaard rekening" msgstr "Standaard rekening"
#: apps/users/models.py:517 #: apps/users/models.py:522
msgid "Selects the account by default when creating new transactions" msgid "Selects the account by default when creating new transactions"
msgstr "" msgstr ""
"Selecteer het account automatisch bij het maken van nieuwe verrichtingen" "Selecteer het account automatisch bij het maken van nieuwe verrichtingen"
#: apps/users/views.py:67 #: apps/users/models.py:570
#, fuzzy
#| msgid "Users"
msgid "User"
msgstr "Gebruikers"
#: apps/users/models.py:577
msgid "Token key"
msgstr ""
#: apps/users/models.py:579
msgid "Token hash"
msgstr ""
#: apps/users/models.py:583
#, fuzzy
#| msgid "Last Generated Date"
msgid "Last used at"
msgstr "Laatste Gegenereerde Datum"
#: apps/users/models.py:588
msgid "Expires at"
msgstr ""
#: apps/users/models.py:593
msgid "Revoked at"
msgstr ""
#: apps/users/models.py:595
#, fuzzy
#| msgid "Create"
msgid "Created at"
msgstr "Aanmaken"
#: apps/users/models.py:596
#, fuzzy
#| msgid "Update"
msgid "Updated at"
msgstr "Bijwerken"
#: apps/users/models.py:606
#, fuzzy
#| msgid "API Key"
msgid "API token"
msgstr "API Sleutel"
#: apps/users/models.py:607
msgid "API tokens"
msgstr ""
#: apps/users/views.py:69
msgid "Transaction amounts are now hidden" msgid "Transaction amounts are now hidden"
msgstr "Verrichtingsbedragen worden nu verborgen" msgstr "Verrichtingsbedragen worden nu verborgen"
#: apps/users/views.py:70 #: apps/users/views.py:72
msgid "Transaction amounts are now displayed" msgid "Transaction amounts are now displayed"
msgstr "Verrichtingsbedragen worden nu weergegeven" msgstr "Verrichtingsbedragen worden nu weergegeven"
#: apps/users/views.py:88 #: apps/users/views.py:90
msgid "Sounds are now muted" msgid "Sounds are now muted"
msgstr "De Geluiden zijn nu gedempt" msgstr "De Geluiden zijn nu gedempt"
#: apps/users/views.py:91 #: apps/users/views.py:93
msgid "Sounds will now play" msgid "Sounds will now play"
msgstr "De geluiden worden nu afgespeeld" msgstr "De geluiden worden nu afgespeeld"
#: apps/users/views.py:107 #: apps/users/views.py:109
msgid "Your settings have been updated" msgid "Your settings have been updated"
msgstr "Jouw instellingen zijn bijgewerkt" msgstr "Jouw instellingen zijn bijgewerkt"
#: apps/users/views.py:148
#, fuzzy
#| msgid "Action updated successfully"
msgid "API token created successfully"
msgstr "Actie succesvol bijgewerkt"
#: apps/users/views.py:167
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token revoked successfully"
msgstr "Actie succesvol verwijderd"
#: apps/users/views.py:178
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token deleted successfully"
msgstr "Actie succesvol verwijderd"
#: templates/account_groups/fragments/add.html:5 #: templates/account_groups/fragments/add.html:5
msgid "Add account group" msgid "Add account group"
msgstr "Rekeningsgroep toevoegen" msgstr "Rekeningsgroep toevoegen"
@@ -2177,6 +2275,7 @@ msgstr "Deel"
#: templates/rules/fragments/transaction_rule/view.html:92 #: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133 #: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51 #: templates/tags/fragments/table.html:51
#: templates/users/fragments/api_tokens.html:93
msgid "Delete" msgid "Delete"
msgstr "Verwijderen" msgstr "Verwijderen"
@@ -2254,6 +2353,7 @@ msgstr "Je kunt dit niet meer terugdraaien!"
#: templates/rules/fragments/transaction_rule/view.html:98 #: templates/rules/fragments/transaction_rule/view.html:98
#: templates/tags/fragments/table.html:57 #: templates/tags/fragments/table.html:57
#: templates/transactions/fragments/attachments.html:22 #: templates/transactions/fragments/attachments.html:22
#: templates/users/fragments/api_tokens.html:101
msgid "Yes, delete it!" msgid "Yes, delete it!"
msgstr "Ja, verwijder het!" msgstr "Ja, verwijder het!"
@@ -3258,6 +3358,11 @@ msgstr "Geen afbetalingsplannen"
msgid "This is a demo!" msgid "This is a demo!"
msgstr "Dit is een demo!" msgstr "Dit is een demo!"
#: templates/layouts/base.html:37
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:57 #: templates/mini_tools/currency_converter/currency_converter.html:57
msgid "Invert" msgid "Invert"
msgstr "Omdraaien" msgstr "Omdraaien"
@@ -3636,6 +3741,87 @@ msgstr "Ongewijzigd"
msgid "Add user" msgid "Add user"
msgstr "Gebruiker toevoegen" msgstr "Gebruiker toevoegen"
#: templates/users/fragments/api_tokens.html:5
msgid "API Tokens"
msgstr ""
#: templates/users/fragments/api_tokens.html:7
msgid ""
"Use these tokens for automations such as n8n. The raw token is shown only "
"once after creation."
msgstr ""
#: templates/users/fragments/api_tokens.html:14
msgid "Copy this token now"
msgstr ""
#: templates/users/fragments/api_tokens.html:16
msgid "It will not be shown again after this response."
msgstr ""
#: templates/users/fragments/api_tokens.html:31
msgid "Copy"
msgstr ""
#: templates/users/fragments/api_tokens.html:52
msgid "Revoked"
msgstr ""
#: templates/users/fragments/api_tokens.html:59
#, python-format
msgid "Created %(created)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:62
#, python-format
msgid "last used %(used)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:64
msgid "never used"
msgstr ""
#: templates/users/fragments/api_tokens.html:68
#, python-format
msgid "expires %(expires)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:70
msgid "no expiry"
msgstr ""
#: templates/users/fragments/api_tokens.html:78
msgid "Revoke"
msgstr ""
#: templates/users/fragments/api_tokens.html:84
msgid "Revoke token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:85
msgid "This token will stop working immediately."
msgstr ""
#: templates/users/fragments/api_tokens.html:86
#, fuzzy
#| msgid "Yes, refresh it!"
msgid "Yes, revoke it!"
msgstr "Ja, vernieuw het!"
#: templates/users/fragments/api_tokens.html:99
#, fuzzy
#| msgid "Deleted At"
msgid "Delete token?"
msgstr "Verwijderd Op"
#: templates/users/fragments/api_tokens.html:100
msgid "This permanently removes the token from the list. It cannot be undone."
msgstr ""
#: templates/users/fragments/api_tokens.html:114
msgid "No API tokens"
msgstr ""
#: templates/users/fragments/edit.html:5 #: templates/users/fragments/edit.html:5
msgid "Edit user" msgid "Edit user"
msgstr "Gebruiker bewerken" msgstr "Gebruiker bewerken"
@@ -3688,10 +3874,6 @@ msgstr "Aanmelden met"
msgid "Yearly Overview" msgid "Yearly Overview"
msgstr "Jaaroverzicht" msgstr "Jaaroverzicht"
#~ 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"
#~ msgid " Are you sure?" #~ msgid " Are you sure?"
#~ msgstr " Weet je het zeker?" #~ msgstr " Weet je het zeker?"
+263 -90
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-06 08:15+0000\n" "POT-Creation-Date: 2026-07-04 15:39+0000\n"
"PO-Revision-Date: 2026-02-18 11:24+0000\n" "PO-Revision-Date: 2026-06-08 07:57+0000\n"
"Last-Translator: Pawel Augustyn <pawelaugustyn15@gmail.com>\n" "Last-Translator: Pawel Augustyn <pawelaugustyn15@gmail.com>\n"
"Language-Team: Polish <https://translations.herculino.com/projects/wygiwyh/" "Language-Team: Polish <https://translations.herculino.com/projects/wygiwyh/"
"app/pl/>\n" "app/pl/>\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n" "|| n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.15.2\n" "X-Generator: Weblate 2026.6\n"
#: apps/accounts/forms.py:24 #: apps/accounts/forms.py:24
msgid "Group name" msgid "Group name"
@@ -32,8 +32,8 @@ msgstr "Nazwa grupy"
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536 #: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919 #: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978 #: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:242 #: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:400 #: apps/users/forms.py:404
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5 #: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128 #: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update" msgid "Update"
@@ -48,7 +48,7 @@ msgstr "Aktualizuj"
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886 #: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953 #: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134 #: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:248 apps/users/forms.py:406 #: apps/users/forms.py:252 apps/users/forms.py:410
#: templates/mini_tools/unit_price_calculator.html:168 #: templates/mini_tools/unit_price_calculator.html:168
msgid "Add" msgid "Add"
msgstr "Dodaj" msgstr "Dodaj"
@@ -100,7 +100,7 @@ msgstr "Tagi"
#: apps/import_app/models.py:14 apps/rules/models.py:13 #: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248 #: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057 #: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: templates/account_groups/fragments/list.html:22 #: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22 #: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17 #: templates/categories/fragments/table.html:17
#: templates/currencies/fragments/list.html:23 #: templates/currencies/fragments/list.html:23
@@ -359,7 +359,7 @@ msgstr ""
"udostępnione. Tylko właściciel może dokonywać zmian.<br />Publiczny: " "udostępnione. Tylko właściciel może dokonywać zmian.<br />Publiczny: "
"Widoczne dla wszystkich. Tylko właściciel może dokonywać zmian." "Widoczne dla wszystkich. Tylko właściciel może dokonywać zmian."
#: apps/common/forms.py:76 apps/users/forms.py:169 #: apps/common/forms.py:76 apps/users/forms.py:173
msgid "Save" msgid "Save"
msgstr "Zapisz" msgstr "Zapisz"
@@ -551,8 +551,8 @@ msgstr "Kurs wymiany"
msgid "Date and Time" msgid "Date and Time"
msgstr "Data i godzina" msgstr "Data i godzina"
#: apps/currencies/models.py:78 apps/users/models.py:12 #: apps/currencies/models.py:78 apps/users/models.py:17
#: apps/users/models.py:497 #: apps/users/models.py:502
msgid "Auto" msgid "Auto"
msgstr "Automatycznie" msgstr "Automatycznie"
@@ -593,7 +593,9 @@ msgstr "Typ serwisu"
#: templates/entities/fragments/list.html:16 #: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16 #: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16 #: templates/recurring_transactions/fragments/list.html:16
#: templates/tags/fragments/list.html:16 templates/users/fragments/list.html:25 #: templates/tags/fragments/list.html:16
#: templates/users/fragments/api_tokens.html:54
#: templates/users/fragments/list.html:25
msgid "Active" msgid "Active"
msgstr "Aktywny" msgstr "Aktywny"
@@ -1424,7 +1426,7 @@ msgstr "Zapisz i dodaj kolejne"
#: apps/transactions/forms.py:270 templates/cotton/transaction/item.html:158 #: apps/transactions/forms.py:270 templates/cotton/transaction/item.html:158
#: templates/transactions/fragments/attachments.html:4 #: templates/transactions/fragments/attachments.html:4
msgid "Attachments" msgid "Attachments"
msgstr "" msgstr "Załączniki"
#: apps/transactions/forms.py:271 #: apps/transactions/forms.py:271
msgid "" msgid ""
@@ -1596,22 +1598,18 @@ msgid "Uploaded By"
msgstr "" msgstr ""
#: apps/transactions/models.py:565 #: apps/transactions/models.py:565
#, fuzzy
#| msgid "Transactions on"
msgid "Transaction Attachment" msgid "Transaction Attachment"
msgstr "Transakcje z dnia" msgstr "Załącznik transakcji"
#: apps/transactions/models.py:566 #: apps/transactions/models.py:566
#, fuzzy
#| msgid "Transaction Tags"
msgid "Transaction Attachments" msgid "Transaction Attachments"
msgstr "Tagi transakcji" msgstr "Załączniki transakcji"
#: apps/transactions/models.py:595 templates/includes/sidebar.html:57 #: apps/transactions/models.py:595 templates/includes/sidebar.html:57
msgid "Yearly" msgid "Yearly"
msgstr "Rocznie" msgstr "Rocznie"
#: apps/transactions/models.py:596 apps/users/models.py:464 #: apps/transactions/models.py:596 apps/users/models.py:469
#: templates/includes/sidebar.html:51 #: templates/includes/sidebar.html:51
msgid "Monthly" msgid "Monthly"
msgstr "Miesięcznie" msgstr "Miesięcznie"
@@ -1638,15 +1636,15 @@ msgstr ""
#: apps/transactions/models.py:622 apps/transactions/models.py:857 #: apps/transactions/models.py:622 apps/transactions/models.py:857
msgid "Start Date" msgid "Start Date"
msgstr "" msgstr "Data startowa"
#: apps/transactions/models.py:626 apps/transactions/models.py:858 #: apps/transactions/models.py:626 apps/transactions/models.py:858
msgid "End Date" msgid "End Date"
msgstr "" msgstr "Data końcowa"
#: apps/transactions/models.py:631 #: apps/transactions/models.py:631
msgid "Recurrence" msgid "Recurrence"
msgstr "" msgstr "Zlecenie stałe"
#: apps/transactions/models.py:634 #: apps/transactions/models.py:634
msgid "Installment Amount" msgid "Installment Amount"
@@ -1683,15 +1681,15 @@ msgstr "Zapauzowane"
#: apps/transactions/models.py:860 #: apps/transactions/models.py:860
msgid "Recurrence Type" msgid "Recurrence Type"
msgstr "" msgstr "Typ powtarzania"
#: apps/transactions/models.py:863 #: apps/transactions/models.py:863
msgid "Recurrence Interval" msgid "Recurrence Interval"
msgstr "" msgstr "Co ile powtarzać"
#: apps/transactions/models.py:866 #: apps/transactions/models.py:866
msgid "Keep at most" msgid "Keep at most"
msgstr "" msgstr "Zachowuj co najwyżej"
#: apps/transactions/models.py:870 #: apps/transactions/models.py:870
msgid "Last Generated Date" msgid "Last Generated Date"
@@ -1807,11 +1805,11 @@ msgid "Installment Plan deleted successfully"
msgstr "Usunięto plan ratalny" msgstr "Usunięto plan ratalny"
#: apps/transactions/views/quick_transactions.py:45 #: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:188 #: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:252
msgid "Item added successfully" msgid "Item added successfully"
msgstr "Pomyślnie dodano" msgstr "Pomyślnie dodano"
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:220 #: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:284
msgid "Item updated successfully" msgid "Item updated successfully"
msgstr "Pomyślnie zaktualizowano" msgstr "Pomyślnie zaktualizowano"
@@ -1862,16 +1860,12 @@ msgid "Tag deleted successfully"
msgstr "Usunięto tag" msgstr "Usunięto tag"
#: apps/transactions/views/transactions.py:59 #: apps/transactions/views/transactions.py:59
#, fuzzy
#| msgid "Account updated successfully"
msgid "Attachment uploaded successfully" msgid "Attachment uploaded successfully"
msgstr "Konto zaktualizowane" msgstr "Pomyślnie dodano załącznik"
#: apps/transactions/views/transactions.py:110 #: apps/transactions/views/transactions.py:110
#, fuzzy
#| msgid "Account deleted successfully"
msgid "Attachment deleted successfully" msgid "Attachment deleted successfully"
msgstr "Usunięto konto" msgstr "Usunięto załącznik"
#: apps/transactions/views/transactions.py:350 #: apps/transactions/views/transactions.py:350
msgid "Transaction updated successfully" msgid "Transaction updated successfully"
@@ -1901,44 +1895,48 @@ msgstr "Odtworzono transakcję"
msgid "Transfer added successfully" msgid "Transfer added successfully"
msgstr "Dodano przelew" msgstr "Dodano przelew"
#: apps/users/admin.py:22 templates/users/fragments/user_settings.html:5 #: apps/users/admin.py:17
msgid "Revoke selected API tokens"
msgstr ""
#: apps/users/admin.py:28 templates/users/fragments/user_settings.html:5
msgid "User Settings" msgid "User Settings"
msgstr "Ustawienia użytkownika" msgstr "Ustawienia użytkownika"
#: apps/users/admin.py:23 #: apps/users/admin.py:29
msgid "User Setting" msgid "User Setting"
msgstr "Ustawienie użytkownika" msgstr "Ustawienie użytkownika"
#: apps/users/admin.py:48 #: apps/users/admin.py:54
msgid "Personal info" msgid "Personal info"
msgstr "Dane personalne" msgstr "Dane personalne"
#: apps/users/admin.py:50 #: apps/users/admin.py:56
msgid "Permissions" msgid "Permissions"
msgstr "Uprawnienia" msgstr "Uprawnienia"
#: apps/users/admin.py:61 #: apps/users/admin.py:67
msgid "Important dates" msgid "Important dates"
msgstr "Ważne daty" msgstr "Ważne daty"
#: apps/users/forms.py:24 apps/users/forms.py:28 apps/users/models.py:451 #: apps/users/forms.py:28 apps/users/forms.py:32 apps/users/models.py:456
#: templates/users/login.html:18 #: templates/users/login.html:18
msgid "E-mail" msgid "E-mail"
msgstr "E-mail" msgstr "E-mail"
#: apps/users/forms.py:35 apps/users/forms.py:40 templates/users/login.html:19 #: apps/users/forms.py:39 apps/users/forms.py:44 templates/users/login.html:19
msgid "Password" msgid "Password"
msgstr "Hasło" msgstr "Hasło"
#: apps/users/forms.py:47 #: apps/users/forms.py:51
msgid "Invalid e-mail or password" msgid "Invalid e-mail or password"
msgstr "Niepoprawny e-mail lub hasło" msgstr "Niepoprawny e-mail lub hasło"
#: apps/users/forms.py:48 #: apps/users/forms.py:52
msgid "This account is deactivated" msgid "This account is deactivated"
msgstr "To konto jest nieaktywne" msgstr "To konto jest nieaktywne"
#: apps/users/forms.py:64 apps/users/forms.py:77 apps/users/forms.py:99 #: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98 #: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245 #: templates/monthly_overview/pages/overview.html:245
#: templates/transactions/pages/transactions.html:47 #: templates/transactions/pages/transactions.html:47
@@ -1946,23 +1944,23 @@ msgstr "To konto jest nieaktywne"
msgid "Default" msgid "Default"
msgstr "Domyślne" msgstr "Domyślne"
#: apps/users/forms.py:107 apps/users/models.py:484 #: apps/users/forms.py:111 apps/users/models.py:489
msgid "Date Format" msgid "Date Format"
msgstr "Format daty" msgstr "Format daty"
#: apps/users/forms.py:112 apps/users/models.py:489 #: apps/users/forms.py:116 apps/users/models.py:494
msgid "Datetime Format" msgid "Datetime Format"
msgstr "Format daty i czasu" msgstr "Format daty i czasu"
#: apps/users/forms.py:118 apps/users/models.py:492 #: apps/users/forms.py:122 apps/users/models.py:497
msgid "Number Format" msgid "Number Format"
msgstr "Format liczb" msgstr "Format liczb"
#: apps/users/forms.py:125 #: apps/users/forms.py:129
msgid "Default Account" msgid "Default Account"
msgstr "Konto główne/domyślne" msgstr "Konto główne/domyślne"
#: apps/users/forms.py:174 #: apps/users/forms.py:178
#, python-format #, python-format
msgid "" msgid ""
"This changes the language (if available) and how numbers and dates are " "This changes the language (if available) and how numbers and dates are "
@@ -1974,19 +1972,19 @@ msgstr ""
"Rozważ wsparcie tłumaczenia WYGIWYH dla Twojego języka na " "Rozważ wsparcie tłumaczenia WYGIWYH dla Twojego języka na "
"%(translation_link)s" "%(translation_link)s"
#: apps/users/forms.py:183 #: apps/users/forms.py:187
msgid "New Password" msgid "New Password"
msgstr "Nowe hasło" msgstr "Nowe hasło"
#: apps/users/forms.py:186 #: apps/users/forms.py:190
msgid "Leave blank to keep the current password." msgid "Leave blank to keep the current password."
msgstr "Pozostaw puste by zachować obecne hasło." msgstr "Pozostaw puste by zachować obecne hasło."
#: apps/users/forms.py:189 #: apps/users/forms.py:193
msgid "Confirm New Password" msgid "Confirm New Password"
msgstr "Potwierdź nowe hasło" msgstr "Potwierdź nowe hasło"
#: apps/users/forms.py:201 apps/users/forms.py:358 #: apps/users/forms.py:205 apps/users/forms.py:362
msgid "" msgid ""
"Designates whether this user should be treated as active. Unselect this " "Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts." "instead of deleting accounts."
@@ -1994,7 +1992,7 @@ msgstr ""
"Określa czy ten użytkownik powinien być aktywny. Odznacz tę opcję zamiast " "Określa czy ten użytkownik powinien być aktywny. Odznacz tę opcję zamiast "
"kasować konta." "kasować konta."
#: apps/users/forms.py:204 apps/users/forms.py:361 #: apps/users/forms.py:208 apps/users/forms.py:365
msgid "" msgid ""
"Designates that this user has all permissions without explicitly assigning " "Designates that this user has all permissions without explicitly assigning "
"them." "them."
@@ -2002,106 +2000,196 @@ msgstr ""
"Określa czy ten użytkownik posiada wszystkie uprawnienia bez jawnego ich " "Określa czy ten użytkownik posiada wszystkie uprawnienia bez jawnego ich "
"przypisania." "przypisania."
#: apps/users/forms.py:271 #: apps/users/forms.py:275
msgid "This email address is already in use by another account." msgid "This email address is already in use by another account."
msgstr "Ten adres e-mail jest już zajęty przez innego użytkownika." msgstr "Ten adres e-mail jest już zajęty przez innego użytkownika."
#: apps/users/forms.py:279 #: apps/users/forms.py:283
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "Hasła różnią się." msgstr "Hasła różnią się."
#: apps/users/forms.py:281 #: apps/users/forms.py:285
msgid "Please confirm your new password." msgid "Please confirm your new password."
msgstr "Potwierdź nowe hasło." msgstr "Potwierdź nowe hasło."
#: apps/users/forms.py:283 #: apps/users/forms.py:287
msgid "Please enter the new password first." msgid "Please enter the new password first."
msgstr "Wpisz najpierw nowe hasło." msgstr "Wpisz najpierw nowe hasło."
#: apps/users/forms.py:303 #: apps/users/forms.py:307
msgid "You cannot deactivate your own account using this form." msgid "You cannot deactivate your own account using this form."
msgstr "Nie możesz dezaktywować własnego konta przy użyciu tego formularza." msgstr "Nie możesz dezaktywować własnego konta przy użyciu tego formularza."
#: apps/users/forms.py:316 #: apps/users/forms.py:320
msgid "Cannot remove status from the last superuser." msgid "Cannot remove status from the last superuser."
msgstr "Nie można usunąć statusu ostatniemu superuserowi." msgstr "Nie można usunąć statusu ostatniemu superuserowi."
#: apps/users/forms.py:322 #: apps/users/forms.py:326
msgid "You cannot remove your own superuser status using this form." msgid "You cannot remove your own superuser status using this form."
msgstr "Nie możesz usunąć uprawnień superusera samemu sobie." msgstr "Nie możesz usunąć uprawnień superusera samemu sobie."
#: apps/users/forms.py:415 #: apps/users/forms.py:419
msgid "A user with this email address already exists." msgid "A user with this email address already exists."
msgstr "Użytkownik z tym adresem e-mail już istnieje." msgstr "Użytkownik z tym adresem e-mail już istnieje."
#: apps/users/models.py:465 #: apps/users/forms.py:439
#, fuzzy
#| msgid "Tag name"
msgid "Token name"
msgstr "Nazwa taga"
#: apps/users/forms.py:441
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
#, fuzzy
#| msgid "Create transaction"
msgid "Create token"
msgstr "Stwórz transakcję"
#: apps/users/models.py:470
msgid "Yearly by currency" msgid "Yearly by currency"
msgstr "Podsumowanie roczne wg waluty" msgstr "Podsumowanie roczne wg waluty"
#: apps/users/models.py:466 #: apps/users/models.py:471
msgid "Yearly by account" msgid "Yearly by account"
msgstr "Podsumowanie roczne wg kont" msgstr "Podsumowanie roczne wg kont"
#: apps/users/models.py:467 templates/net_worth/net_worth.html:9 #: apps/users/models.py:472 templates/net_worth/net_worth.html:9
msgid "Current Net Worth" msgid "Current Net Worth"
msgstr "Obecne aktywa" msgstr "Obecne aktywa"
#: apps/users/models.py:468 templates/net_worth/net_worth.html:11 #: apps/users/models.py:473 templates/net_worth/net_worth.html:11
msgid "Projected Net Worth" msgid "Projected Net Worth"
msgstr "Przewidywane aktywa" msgstr "Przewidywane aktywa"
#: apps/users/models.py:469 #: apps/users/models.py:474
msgid "All Transactions" msgid "All Transactions"
msgstr "Wszystkie transakcje" msgstr "Wszystkie transakcje"
#: apps/users/models.py:470 templates/includes/sidebar.html:63 #: apps/users/models.py:475 templates/includes/sidebar.html:63
msgid "Calendar" msgid "Calendar"
msgstr "Kalendarz" msgstr "Kalendarz"
#: apps/users/models.py:480 #: apps/users/models.py:485
msgid "Volume" msgid "Volume"
msgstr "Głośność" msgstr "Głośność"
#: apps/users/models.py:499 #: apps/users/models.py:504
msgid "Language" msgid "Language"
msgstr "Język" msgstr "Język"
#: apps/users/models.py:505 #: apps/users/models.py:510
msgid "Time Zone" msgid "Time Zone"
msgstr "Strefa czasowa" msgstr "Strefa czasowa"
#: apps/users/models.py:511 #: apps/users/models.py:516
msgid "Start page" msgid "Start page"
msgstr "Strona startowa" msgstr "Strona startowa"
#: apps/users/models.py:516 #: apps/users/models.py:521
msgid "Default account" msgid "Default account"
msgstr "Konto domyślne/główne" msgstr "Konto domyślne/główne"
#: apps/users/models.py:517 #: apps/users/models.py:522
msgid "Selects the account by default when creating new transactions" msgid "Selects the account by default when creating new transactions"
msgstr "Domyślnie wybierz konto przy tworzeniu nowych transakcji" msgstr "Domyślnie wybierz konto przy tworzeniu nowych transakcji"
#: apps/users/views.py:67 #: apps/users/models.py:570
#, fuzzy
#| msgid "Users"
msgid "User"
msgstr "Użytkownicy"
#: apps/users/models.py:577
msgid "Token key"
msgstr ""
#: apps/users/models.py:579
msgid "Token hash"
msgstr ""
#: apps/users/models.py:583
msgid "Last used at"
msgstr ""
#: apps/users/models.py:588
msgid "Expires at"
msgstr ""
#: apps/users/models.py:593
msgid "Revoked at"
msgstr ""
#: apps/users/models.py:595
#, fuzzy
#| msgid "Create transaction"
msgid "Created at"
msgstr "Stwórz transakcję"
#: apps/users/models.py:596
#, fuzzy
#| msgid "Update"
msgid "Updated at"
msgstr "Aktualizuj"
#: apps/users/models.py:606
#, fuzzy
#| msgid "API Key"
msgid "API token"
msgstr "Klucz API"
#: apps/users/models.py:607
msgid "API tokens"
msgstr ""
#: apps/users/views.py:69
msgid "Transaction amounts are now hidden" msgid "Transaction amounts are now hidden"
msgstr "Kwoty transakcji są od teraz ukryte" msgstr "Kwoty transakcji są od teraz ukryte"
#: apps/users/views.py:70 #: apps/users/views.py:72
msgid "Transaction amounts are now displayed" msgid "Transaction amounts are now displayed"
msgstr "Kwoty transakcji są od teraz widoczne" msgstr "Kwoty transakcji są od teraz widoczne"
#: apps/users/views.py:88 #: apps/users/views.py:90
msgid "Sounds are now muted" msgid "Sounds are now muted"
msgstr "Dźwięki wyciszone" msgstr "Dźwięki wyciszone"
#: apps/users/views.py:91 #: apps/users/views.py:93
msgid "Sounds will now play" msgid "Sounds will now play"
msgstr "Dźwięki będą teraz odtwarzane" msgstr "Dźwięki będą teraz odtwarzane"
#: apps/users/views.py:107 #: apps/users/views.py:109
msgid "Your settings have been updated" msgid "Your settings have been updated"
msgstr "Zapisano ustawienia" msgstr "Zapisano ustawienia"
#: apps/users/views.py:148
#, fuzzy
#| msgid "Action updated successfully"
msgid "API token created successfully"
msgstr "Zaktualizowano akcję"
#: apps/users/views.py:167
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token revoked successfully"
msgstr "Usunięto akcję"
#: apps/users/views.py:178
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token deleted successfully"
msgstr "Usunięto akcję"
#: templates/account_groups/fragments/add.html:5 #: templates/account_groups/fragments/add.html:5
msgid "Add account group" msgid "Add account group"
msgstr "Dodaj grupę kont" msgstr "Dodaj grupę kont"
@@ -2199,6 +2287,7 @@ msgstr "Udostępnij"
#: templates/rules/fragments/transaction_rule/view.html:92 #: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133 #: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51 #: templates/tags/fragments/table.html:51
#: templates/users/fragments/api_tokens.html:93
msgid "Delete" msgid "Delete"
msgstr "Usuń" msgstr "Usuń"
@@ -2276,6 +2365,7 @@ msgstr "Tej akcji nie da się odwrócić!"
#: templates/rules/fragments/transaction_rule/view.html:98 #: templates/rules/fragments/transaction_rule/view.html:98
#: templates/tags/fragments/table.html:57 #: templates/tags/fragments/table.html:57
#: templates/transactions/fragments/attachments.html:22 #: templates/transactions/fragments/attachments.html:22
#: templates/users/fragments/api_tokens.html:101
msgid "Yes, delete it!" msgid "Yes, delete it!"
msgstr "Tak, usuń!" msgstr "Tak, usuń!"
@@ -2448,7 +2538,7 @@ msgstr ""
#: templates/cotton/transaction/item.html:227 #: templates/cotton/transaction/item.html:227
#: templates/cotton/ui/transactions_action_bar.html:78 #: templates/cotton/ui/transactions_action_bar.html:78
msgid "Duplicate" msgid "Duplicate"
msgstr "" msgstr "Zduplikuj"
#: templates/cotton/ui/account_card.html:10 #: templates/cotton/ui/account_card.html:10
#: templates/cotton/ui/currency_card.html:10 #: templates/cotton/ui/currency_card.html:10
@@ -2563,7 +2653,7 @@ msgstr ""
#: templates/cotton/ui/quick_transactions_buttons.html:32 #: templates/cotton/ui/quick_transactions_buttons.html:32
#: templates/cotton/ui/transactions_fab.html:35 #: templates/cotton/ui/transactions_fab.html:35
msgid "Recurring" msgid "Recurring"
msgstr "" msgstr "Zlecenie stałe"
#: templates/cotton/ui/quick_transactions_buttons.html:47 #: templates/cotton/ui/quick_transactions_buttons.html:47
#: templates/cotton/ui/transactions_fab.html:52 #: templates/cotton/ui/transactions_fab.html:52
@@ -3275,6 +3365,10 @@ msgstr "Brak planów ratalnych"
msgid "This is a demo!" msgid "This is a demo!"
msgstr "" msgstr ""
#: templates/layouts/base.html:37
msgid "Any data you add here will be wiped in 24hrs or less"
msgstr ""
#: templates/mini_tools/currency_converter/currency_converter.html:57 #: templates/mini_tools/currency_converter/currency_converter.html:57
msgid "Invert" msgid "Invert"
msgstr "Zamień" msgstr "Zamień"
@@ -3414,11 +3508,11 @@ msgstr "To usunie tę rzecz"
#: templates/recurring_transactions/fragments/add.html:5 #: templates/recurring_transactions/fragments/add.html:5
msgid "Add recurring transaction" msgid "Add recurring transaction"
msgstr "" msgstr "Dodaj zlecenie stałe"
#: templates/recurring_transactions/fragments/edit.html:5 #: templates/recurring_transactions/fragments/edit.html:5
msgid "Edit recurring transaction" msgid "Edit recurring transaction"
msgstr "" msgstr "Edytuj zlecenie stałe"
#: templates/recurring_transactions/fragments/table.html:46 #: templates/recurring_transactions/fragments/table.html:46
msgid "Unpause" msgid "Unpause"
@@ -3461,10 +3555,12 @@ msgstr ""
#: templates/recurring_transactions/fragments/table.html:93 #: templates/recurring_transactions/fragments/table.html:93
msgid "This will delete the recurrence and all transactions associated with it" msgid "This will delete the recurrence and all transactions associated with it"
msgstr "" msgstr ""
"Ta akcja spowoduje usunięcie zlecenia stałego i wszystkich powiązanych z nim "
"transakcji"
#: templates/recurring_transactions/fragments/table.html:121 #: templates/recurring_transactions/fragments/table.html:121
msgid "No recurring transactions" msgid "No recurring transactions"
msgstr "" msgstr "Brak zleceń stałych"
#: templates/rules/fragments/list.html:34 #: templates/rules/fragments/list.html:34
msgid "View" msgid "View"
@@ -3595,23 +3691,19 @@ msgstr ""
#: templates/transactions/fragments/attachments.html:20 #: templates/transactions/fragments/attachments.html:20
msgid "Delete this attachment?" msgid "Delete this attachment?"
msgstr "" msgstr "Czy chcesz usunąć ten załącznik?"
#: templates/transactions/fragments/attachments.html:21 #: templates/transactions/fragments/attachments.html:21
msgid "This file will be removed from the transaction." msgid "This file will be removed from the transaction."
msgstr "" msgstr ""
#: templates/transactions/fragments/attachments.html:30 #: templates/transactions/fragments/attachments.html:30
#, fuzzy
#| msgid "No runs yet"
msgid "No attachments yet" msgid "No attachments yet"
msgstr "Brak zleconych importów" msgstr "Brak załączników"
#: templates/transactions/fragments/attachments_manage.html:5 #: templates/transactions/fragments/attachments_manage.html:5
#, fuzzy
#| msgid "Transaction Tags"
msgid "Transaction attachments" msgid "Transaction attachments"
msgstr "Tagi transakcji" msgstr "Załączniki transakcji"
#: templates/transactions/fragments/bulk_edit.html:5 #: templates/transactions/fragments/bulk_edit.html:5
msgid "Bulk Editing" msgid "Bulk Editing"
@@ -3651,6 +3743,87 @@ msgstr ""
msgid "Add user" msgid "Add user"
msgstr "" msgstr ""
#: templates/users/fragments/api_tokens.html:5
msgid "API Tokens"
msgstr ""
#: templates/users/fragments/api_tokens.html:7
msgid ""
"Use these tokens for automations such as n8n. The raw token is shown only "
"once after creation."
msgstr ""
#: templates/users/fragments/api_tokens.html:14
msgid "Copy this token now"
msgstr ""
#: templates/users/fragments/api_tokens.html:16
msgid "It will not be shown again after this response."
msgstr ""
#: templates/users/fragments/api_tokens.html:31
msgid "Copy"
msgstr ""
#: templates/users/fragments/api_tokens.html:52
msgid "Revoked"
msgstr ""
#: templates/users/fragments/api_tokens.html:59
#, python-format
msgid "Created %(created)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:62
#, python-format
msgid "last used %(used)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:64
msgid "never used"
msgstr ""
#: templates/users/fragments/api_tokens.html:68
#, python-format
msgid "expires %(expires)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:70
msgid "no expiry"
msgstr ""
#: templates/users/fragments/api_tokens.html:78
msgid "Revoke"
msgstr ""
#: templates/users/fragments/api_tokens.html:84
msgid "Revoke token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:85
msgid "This token will stop working immediately."
msgstr ""
#: templates/users/fragments/api_tokens.html:86
#, fuzzy
#| msgid "Yes, delete it!"
msgid "Yes, revoke it!"
msgstr "Tak, usuń!"
#: templates/users/fragments/api_tokens.html:99
#, fuzzy
#| msgid "Delete"
msgid "Delete token?"
msgstr "Usuń"
#: templates/users/fragments/api_tokens.html:100
msgid "This permanently removes the token from the list. It cannot be undone."
msgstr ""
#: templates/users/fragments/api_tokens.html:114
msgid "No API tokens"
msgstr ""
#: templates/users/fragments/edit.html:5 #: templates/users/fragments/edit.html:5
msgid "Edit user" msgid "Edit user"
msgstr "Edytuj użytkownika" msgstr "Edytuj użytkownika"
+243 -61
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-06 08:15+0000\n" "POT-Creation-Date: 2026-07-04 15:39+0000\n"
"PO-Revision-Date: 2026-06-07 14:57+0000\n" "PO-Revision-Date: 2026-06-07 14:57+0000\n"
"Last-Translator: Herculino Trotta <netotrotta@gmail.com>\n" "Last-Translator: Herculino Trotta <netotrotta@gmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://translations.herculino.com/" "Language-Team: Portuguese (Brazil) <https://translations.herculino.com/"
@@ -31,8 +31,8 @@ msgstr "Nome do grupo"
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536 #: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919 #: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978 #: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:242 #: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:400 #: apps/users/forms.py:404
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5 #: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128 #: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update" msgid "Update"
@@ -47,7 +47,7 @@ msgstr "Atualizar"
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886 #: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953 #: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134 #: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:248 apps/users/forms.py:406 #: apps/users/forms.py:252 apps/users/forms.py:410
#: templates/mini_tools/unit_price_calculator.html:168 #: templates/mini_tools/unit_price_calculator.html:168
msgid "Add" msgid "Add"
msgstr "Adicionar" msgstr "Adicionar"
@@ -99,7 +99,7 @@ msgstr "Tags"
#: apps/import_app/models.py:14 apps/rules/models.py:13 #: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248 #: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057 #: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: templates/account_groups/fragments/list.html:22 #: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22 #: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17 #: templates/categories/fragments/table.html:17
#: templates/currencies/fragments/list.html:23 #: templates/currencies/fragments/list.html:23
@@ -353,7 +353,7 @@ msgstr ""
"Somente editável pelo proprietário.<br/>Público: Exibido para todos os " "Somente editável pelo proprietário.<br/>Público: Exibido para todos os "
"usuários. Somente editável pelo proprietário." "usuários. Somente editável pelo proprietário."
#: apps/common/forms.py:76 apps/users/forms.py:169 #: apps/common/forms.py:76 apps/users/forms.py:173
msgid "Save" msgid "Save"
msgstr "Salvar" msgstr "Salvar"
@@ -539,8 +539,8 @@ msgstr "Taxa de Câmbio"
msgid "Date and Time" msgid "Date and Time"
msgstr "Data e Tempo" msgstr "Data e Tempo"
#: apps/currencies/models.py:78 apps/users/models.py:12 #: apps/currencies/models.py:78 apps/users/models.py:17
#: apps/users/models.py:497 #: apps/users/models.py:502
msgid "Auto" msgid "Auto"
msgstr "Automático" msgstr "Automático"
@@ -581,7 +581,9 @@ msgstr "Tipo de Serviço"
#: templates/entities/fragments/list.html:16 #: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16 #: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16 #: templates/recurring_transactions/fragments/list.html:16
#: templates/tags/fragments/list.html:16 templates/users/fragments/list.html:25 #: templates/tags/fragments/list.html:16
#: templates/users/fragments/api_tokens.html:54
#: templates/users/fragments/list.html:25
msgid "Active" msgid "Active"
msgstr "Ativo" msgstr "Ativo"
@@ -1596,7 +1598,7 @@ msgstr "Anexo de transações"
msgid "Yearly" msgid "Yearly"
msgstr "Anual" msgstr "Anual"
#: apps/transactions/models.py:596 apps/users/models.py:464 #: apps/transactions/models.py:596 apps/users/models.py:469
#: templates/includes/sidebar.html:51 #: templates/includes/sidebar.html:51
msgid "Monthly" msgid "Monthly"
msgstr "Mensal" msgstr "Mensal"
@@ -1787,11 +1789,11 @@ msgid "Installment Plan deleted successfully"
msgstr "Parcelamento apagado com sucesso" msgstr "Parcelamento apagado com sucesso"
#: apps/transactions/views/quick_transactions.py:45 #: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:188 #: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:252
msgid "Item added successfully" msgid "Item added successfully"
msgstr "Item adicionado com sucesso" msgstr "Item adicionado com sucesso"
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:220 #: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:284
msgid "Item updated successfully" msgid "Item updated successfully"
msgstr "Item atualizado com sucesso" msgstr "Item atualizado com sucesso"
@@ -1876,44 +1878,48 @@ msgstr "Transação restaurada com sucesso"
msgid "Transfer added successfully" msgid "Transfer added successfully"
msgstr "Transferência adicionada com sucesso" msgstr "Transferência adicionada com sucesso"
#: apps/users/admin.py:22 templates/users/fragments/user_settings.html:5 #: apps/users/admin.py:17
msgid "Revoke selected API tokens"
msgstr ""
#: apps/users/admin.py:28 templates/users/fragments/user_settings.html:5
msgid "User Settings" msgid "User Settings"
msgstr "Configurações do Usuário" msgstr "Configurações do Usuário"
#: apps/users/admin.py:23 #: apps/users/admin.py:29
msgid "User Setting" msgid "User Setting"
msgstr "Configuração do Usuário" msgstr "Configuração do Usuário"
#: apps/users/admin.py:48 #: apps/users/admin.py:54
msgid "Personal info" msgid "Personal info"
msgstr "Dados pessoais" msgstr "Dados pessoais"
#: apps/users/admin.py:50 #: apps/users/admin.py:56
msgid "Permissions" msgid "Permissions"
msgstr "Permissões" msgstr "Permissões"
#: apps/users/admin.py:61 #: apps/users/admin.py:67
msgid "Important dates" msgid "Important dates"
msgstr "Datas importantes" msgstr "Datas importantes"
#: apps/users/forms.py:24 apps/users/forms.py:28 apps/users/models.py:451 #: apps/users/forms.py:28 apps/users/forms.py:32 apps/users/models.py:456
#: templates/users/login.html:18 #: templates/users/login.html:18
msgid "E-mail" msgid "E-mail"
msgstr "E-mail" msgstr "E-mail"
#: apps/users/forms.py:35 apps/users/forms.py:40 templates/users/login.html:19 #: apps/users/forms.py:39 apps/users/forms.py:44 templates/users/login.html:19
msgid "Password" msgid "Password"
msgstr "Senha" msgstr "Senha"
#: apps/users/forms.py:47 #: apps/users/forms.py:51
msgid "Invalid e-mail or password" msgid "Invalid e-mail or password"
msgstr "E-mail ou senha inválidos" msgstr "E-mail ou senha inválidos"
#: apps/users/forms.py:48 #: apps/users/forms.py:52
msgid "This account is deactivated" msgid "This account is deactivated"
msgstr "Essa conta está desativada" msgstr "Essa conta está desativada"
#: apps/users/forms.py:64 apps/users/forms.py:77 apps/users/forms.py:99 #: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98 #: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245 #: templates/monthly_overview/pages/overview.html:245
#: templates/transactions/pages/transactions.html:47 #: templates/transactions/pages/transactions.html:47
@@ -1921,23 +1927,23 @@ msgstr "Essa conta está desativada"
msgid "Default" msgid "Default"
msgstr "Padrão" msgstr "Padrão"
#: apps/users/forms.py:107 apps/users/models.py:484 #: apps/users/forms.py:111 apps/users/models.py:489
msgid "Date Format" msgid "Date Format"
msgstr "Formato de Data" msgstr "Formato de Data"
#: apps/users/forms.py:112 apps/users/models.py:489 #: apps/users/forms.py:116 apps/users/models.py:494
msgid "Datetime Format" msgid "Datetime Format"
msgstr "Formato de Data e Hora" msgstr "Formato de Data e Hora"
#: apps/users/forms.py:118 apps/users/models.py:492 #: apps/users/forms.py:122 apps/users/models.py:497
msgid "Number Format" msgid "Number Format"
msgstr "Formato de Número" msgstr "Formato de Número"
#: apps/users/forms.py:125 #: apps/users/forms.py:129
msgid "Default Account" msgid "Default Account"
msgstr "Conta Padrão" msgstr "Conta Padrão"
#: apps/users/forms.py:174 #: apps/users/forms.py:178
#, python-format #, python-format
msgid "" msgid ""
"This changes the language (if available) and how numbers and dates are " "This changes the language (if available) and how numbers and dates are "
@@ -1948,19 +1954,19 @@ msgstr ""
"são exibidos\n" "são exibidos\n"
"Considere ajudar a traduzir WYGIWYH para seu idioma em %(translation_link)s" "Considere ajudar a traduzir WYGIWYH para seu idioma em %(translation_link)s"
#: apps/users/forms.py:183 #: apps/users/forms.py:187
msgid "New Password" msgid "New Password"
msgstr "Nova senha" msgstr "Nova senha"
#: apps/users/forms.py:186 #: apps/users/forms.py:190
msgid "Leave blank to keep the current password." msgid "Leave blank to keep the current password."
msgstr "Deixe em branco para usar a senha atual." msgstr "Deixe em branco para usar a senha atual."
#: apps/users/forms.py:189 #: apps/users/forms.py:193
msgid "Confirm New Password" msgid "Confirm New Password"
msgstr "Confirmar nova senha" msgstr "Confirmar nova senha"
#: apps/users/forms.py:201 apps/users/forms.py:358 #: apps/users/forms.py:205 apps/users/forms.py:362
msgid "" msgid ""
"Designates whether this user should be treated as active. Unselect this " "Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts." "instead of deleting accounts."
@@ -1968,7 +1974,7 @@ msgstr ""
"Designa se esse usuário deve ser tratado como ativo. Desmarque essa opção em " "Designa se esse usuário deve ser tratado como ativo. Desmarque essa opção em "
"vez de excluir usuários." "vez de excluir usuários."
#: apps/users/forms.py:204 apps/users/forms.py:361 #: apps/users/forms.py:208 apps/users/forms.py:365
msgid "" msgid ""
"Designates that this user has all permissions without explicitly assigning " "Designates that this user has all permissions without explicitly assigning "
"them." "them."
@@ -1976,108 +1982,200 @@ msgstr ""
"Designa que esse usuário tem todas as permissões sem atribuí-las " "Designa que esse usuário tem todas as permissões sem atribuí-las "
"explicitamente." "explicitamente."
#: apps/users/forms.py:271 #: apps/users/forms.py:275
msgid "This email address is already in use by another account." 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." msgstr "Esse endereço de e-mail já está sendo usado por outra conta."
#: apps/users/forms.py:279 #: apps/users/forms.py:283
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "Os dois campos de senha não coincidem." msgstr "Os dois campos de senha não coincidem."
#: apps/users/forms.py:281 #: apps/users/forms.py:285
msgid "Please confirm your new password." msgid "Please confirm your new password."
msgstr "Confirme sua nova senha." msgstr "Confirme sua nova senha."
#: apps/users/forms.py:283 #: apps/users/forms.py:287
msgid "Please enter the new password first." msgid "Please enter the new password first."
msgstr "Digite a nova senha primeiro." msgstr "Digite a nova senha primeiro."
#: apps/users/forms.py:303 #: apps/users/forms.py:307
msgid "You cannot deactivate your own account using this form." msgid "You cannot deactivate your own account using this form."
msgstr "Não é possível desativar sua própria conta usando esse formulário." msgstr "Não é possível desativar sua própria conta usando esse formulário."
#: apps/users/forms.py:316 #: apps/users/forms.py:320
msgid "Cannot remove status from the last superuser." msgid "Cannot remove status from the last superuser."
msgstr "Não é possível remover o status do último superusuário." msgstr "Não é possível remover o status do último superusuário."
#: apps/users/forms.py:322 #: apps/users/forms.py:326
msgid "You cannot remove your own superuser status using this form." msgid "You cannot remove your own superuser status using this form."
msgstr "" msgstr ""
"Não é possível remover seu próprio status de superusuário usando esse " "Não é possível remover seu próprio status de superusuário usando esse "
"formulário." "formulário."
#: apps/users/forms.py:415 #: apps/users/forms.py:419
msgid "A user with this email address already exists." msgid "A user with this email address already exists."
msgstr "Já existe um usuário com esse endereço de e-mail." msgstr "Já existe um usuário com esse endereço de e-mail."
#: apps/users/models.py:465 #: apps/users/forms.py:439
#, fuzzy
#| msgid "Tag name"
msgid "Token name"
msgstr "Nome da Tag"
#: apps/users/forms.py:441
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
#, fuzzy
#| msgid "Create transaction"
msgid "Create token"
msgstr "Criar transação"
#: apps/users/models.py:470
msgid "Yearly by currency" msgid "Yearly by currency"
msgstr "Anual por moeda" msgstr "Anual por moeda"
#: apps/users/models.py:466 #: apps/users/models.py:471
msgid "Yearly by account" msgid "Yearly by account"
msgstr "Anual por conta" msgstr "Anual por conta"
#: apps/users/models.py:467 templates/net_worth/net_worth.html:9 #: apps/users/models.py:472 templates/net_worth/net_worth.html:9
msgid "Current Net Worth" msgid "Current Net Worth"
msgstr "Patrimônio Atual" msgstr "Patrimônio Atual"
#: apps/users/models.py:468 templates/net_worth/net_worth.html:11 #: apps/users/models.py:473 templates/net_worth/net_worth.html:11
msgid "Projected Net Worth" msgid "Projected Net Worth"
msgstr "Patrimônio Previsto" msgstr "Patrimônio Previsto"
#: apps/users/models.py:469 #: apps/users/models.py:474
msgid "All Transactions" msgid "All Transactions"
msgstr "Todas as transações" msgstr "Todas as transações"
#: apps/users/models.py:470 templates/includes/sidebar.html:63 #: apps/users/models.py:475 templates/includes/sidebar.html:63
msgid "Calendar" msgid "Calendar"
msgstr "Calendário" msgstr "Calendário"
#: apps/users/models.py:480 #: apps/users/models.py:485
msgid "Volume" msgid "Volume"
msgstr "Volume" msgstr "Volume"
#: apps/users/models.py:499 #: apps/users/models.py:504
msgid "Language" msgid "Language"
msgstr "Linguagem" msgstr "Linguagem"
#: apps/users/models.py:505 #: apps/users/models.py:510
msgid "Time Zone" msgid "Time Zone"
msgstr "Fuso horário" msgstr "Fuso horário"
#: apps/users/models.py:511 #: apps/users/models.py:516
msgid "Start page" msgid "Start page"
msgstr "Página inicial" msgstr "Página inicial"
#: apps/users/models.py:516 #: apps/users/models.py:521
msgid "Default account" msgid "Default account"
msgstr "Conta Padrão" msgstr "Conta Padrão"
#: apps/users/models.py:517 #: apps/users/models.py:522
msgid "Selects the account by default when creating new transactions" msgid "Selects the account by default when creating new transactions"
msgstr "Seleciona a conta por padrão ao criar novas transações" msgstr "Seleciona a conta por padrão ao criar novas transações"
#: apps/users/views.py:67 #: apps/users/models.py:570
#, fuzzy
#| msgid "Users"
msgid "User"
msgstr "Usuários"
#: apps/users/models.py:577
msgid "Token key"
msgstr ""
#: apps/users/models.py:579
msgid "Token hash"
msgstr ""
#: apps/users/models.py:583
#, fuzzy
#| msgid "Last Generated Date"
msgid "Last used at"
msgstr "Última data gerada"
#: apps/users/models.py:588
msgid "Expires at"
msgstr ""
#: apps/users/models.py:593
msgid "Revoked at"
msgstr ""
#: apps/users/models.py:595
#, fuzzy
#| msgid "Create"
msgid "Created at"
msgstr "Criar"
#: apps/users/models.py:596
#, fuzzy
#| msgid "Update"
msgid "Updated at"
msgstr "Atualizar"
#: apps/users/models.py:606
#, fuzzy
#| msgid "API Key"
msgid "API token"
msgstr "Chave de API"
#: apps/users/models.py:607
msgid "API tokens"
msgstr ""
#: apps/users/views.py:69
msgid "Transaction amounts are now hidden" msgid "Transaction amounts are now hidden"
msgstr "Os valores das transações agora estão ocultos" msgstr "Os valores das transações agora estão ocultos"
#: apps/users/views.py:70 #: apps/users/views.py:72
msgid "Transaction amounts are now displayed" msgid "Transaction amounts are now displayed"
msgstr "Os valores das transações agora estão sendo exibidos" msgstr "Os valores das transações agora estão sendo exibidos"
#: apps/users/views.py:88 #: apps/users/views.py:90
msgid "Sounds are now muted" msgid "Sounds are now muted"
msgstr "Os sons agora estão silenciados" msgstr "Os sons agora estão silenciados"
#: apps/users/views.py:91 #: apps/users/views.py:93
msgid "Sounds will now play" msgid "Sounds will now play"
msgstr "Os sons agora serão reproduzidos" msgstr "Os sons agora serão reproduzidos"
#: apps/users/views.py:107 #: apps/users/views.py:109
msgid "Your settings have been updated" msgid "Your settings have been updated"
msgstr "Suas configurações foram atualizadas" msgstr "Suas configurações foram atualizadas"
#: apps/users/views.py:148
#, fuzzy
#| msgid "Action updated successfully"
msgid "API token created successfully"
msgstr "Ação atualizada com sucesso"
#: apps/users/views.py:167
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token revoked successfully"
msgstr "Ação apagada com sucesso"
#: apps/users/views.py:178
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token deleted successfully"
msgstr "Ação apagada com sucesso"
#: templates/account_groups/fragments/add.html:5 #: templates/account_groups/fragments/add.html:5
msgid "Add account group" msgid "Add account group"
msgstr "Adicionar grupo de conta" msgstr "Adicionar grupo de conta"
@@ -2175,6 +2273,7 @@ msgstr "Compartilhar"
#: templates/rules/fragments/transaction_rule/view.html:92 #: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133 #: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51 #: templates/tags/fragments/table.html:51
#: templates/users/fragments/api_tokens.html:93
msgid "Delete" msgid "Delete"
msgstr "Apagar" msgstr "Apagar"
@@ -2252,6 +2351,7 @@ msgstr "Você não será capaz de reverter isso!"
#: templates/rules/fragments/transaction_rule/view.html:98 #: templates/rules/fragments/transaction_rule/view.html:98
#: templates/tags/fragments/table.html:57 #: templates/tags/fragments/table.html:57
#: templates/transactions/fragments/attachments.html:22 #: templates/transactions/fragments/attachments.html:22
#: templates/users/fragments/api_tokens.html:101
msgid "Yes, delete it!" msgid "Yes, delete it!"
msgstr "Sim, apague!" msgstr "Sim, apague!"
@@ -3256,6 +3356,11 @@ msgstr "Nenhum parcelamento"
msgid "This is a demo!" msgid "This is a demo!"
msgstr "Isto é uma demonstração!" msgstr "Isto é uma demonstração!"
#: templates/layouts/base.html:37
msgid "Any data you add here will be wiped in 24hrs or less"
msgstr ""
"Todos os dados que você adicionar aqui serão apagados em 24 horas ou menos"
#: templates/mini_tools/currency_converter/currency_converter.html:57 #: templates/mini_tools/currency_converter/currency_converter.html:57
msgid "Invert" msgid "Invert"
msgstr "Inverter" msgstr "Inverter"
@@ -3631,6 +3736,87 @@ msgstr "Inalterado"
msgid "Add user" msgid "Add user"
msgstr "Adicionar usuário" msgstr "Adicionar usuário"
#: templates/users/fragments/api_tokens.html:5
msgid "API Tokens"
msgstr ""
#: templates/users/fragments/api_tokens.html:7
msgid ""
"Use these tokens for automations such as n8n. The raw token is shown only "
"once after creation."
msgstr ""
#: templates/users/fragments/api_tokens.html:14
msgid "Copy this token now"
msgstr ""
#: templates/users/fragments/api_tokens.html:16
msgid "It will not be shown again after this response."
msgstr ""
#: templates/users/fragments/api_tokens.html:31
msgid "Copy"
msgstr ""
#: templates/users/fragments/api_tokens.html:52
msgid "Revoked"
msgstr ""
#: templates/users/fragments/api_tokens.html:59
#, python-format
msgid "Created %(created)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:62
#, python-format
msgid "last used %(used)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:64
msgid "never used"
msgstr ""
#: templates/users/fragments/api_tokens.html:68
#, python-format
msgid "expires %(expires)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:70
msgid "no expiry"
msgstr ""
#: templates/users/fragments/api_tokens.html:78
msgid "Revoke"
msgstr ""
#: templates/users/fragments/api_tokens.html:84
msgid "Revoke token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:85
msgid "This token will stop working immediately."
msgstr ""
#: templates/users/fragments/api_tokens.html:86
#, fuzzy
#| msgid "Yes, refresh it!"
msgid "Yes, revoke it!"
msgstr "Sim, atualize!"
#: templates/users/fragments/api_tokens.html:99
#, fuzzy
#| msgid "Deleted At"
msgid "Delete token?"
msgstr "Apagado Em"
#: templates/users/fragments/api_tokens.html:100
msgid "This permanently removes the token from the list. It cannot be undone."
msgstr ""
#: templates/users/fragments/api_tokens.html:114
msgid "No API tokens"
msgstr ""
#: templates/users/fragments/edit.html:5 #: templates/users/fragments/edit.html:5
msgid "Edit user" msgid "Edit user"
msgstr "Editar usuário" msgstr "Editar usuário"
@@ -3683,10 +3869,6 @@ msgstr "Login com"
msgid "Yearly Overview" msgid "Yearly Overview"
msgstr "Visão Anual" msgstr "Visão Anual"
#~ msgid "Any data you add here will be wiped in 24hrs or less"
#~ msgstr ""
#~ "Todos os dados que você adicionar aqui serão apagados em 24 horas ou menos"
#, fuzzy #, fuzzy
#~| msgid "Are you sure?" #~| msgid "Are you sure?"
#~ msgid " Are you sure?" #~ msgid " Are you sure?"
+240 -57
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-06 08:15+0000\n" "POT-Creation-Date: 2026-07-04 15:39+0000\n"
"PO-Revision-Date: 2026-05-01 07:24+0000\n" "PO-Revision-Date: 2026-05-01 07:24+0000\n"
"Last-Translator: masttera <mail.masttera@gmail.com>\n" "Last-Translator: masttera <mail.masttera@gmail.com>\n"
"Language-Team: Russian <https://translations.herculino.com/projects/wygiwyh/" "Language-Team: Russian <https://translations.herculino.com/projects/wygiwyh/"
@@ -32,8 +32,8 @@ msgstr "Имя группы"
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536 #: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919 #: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978 #: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:242 #: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:400 #: apps/users/forms.py:404
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5 #: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128 #: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update" msgid "Update"
@@ -48,7 +48,7 @@ msgstr "Обновить"
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886 #: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953 #: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134 #: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:248 apps/users/forms.py:406 #: apps/users/forms.py:252 apps/users/forms.py:410
#: templates/mini_tools/unit_price_calculator.html:168 #: templates/mini_tools/unit_price_calculator.html:168
msgid "Add" msgid "Add"
msgstr "Добавить" msgstr "Добавить"
@@ -100,7 +100,7 @@ msgstr "Тэг"
#: apps/import_app/models.py:14 apps/rules/models.py:13 #: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248 #: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057 #: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: templates/account_groups/fragments/list.html:22 #: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22 #: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17 #: templates/categories/fragments/table.html:17
#: templates/currencies/fragments/list.html:23 #: templates/currencies/fragments/list.html:23
@@ -357,7 +357,7 @@ msgstr ""
"быть изменено только владельцем<br/>Публичный: Отображается для всех " "быть изменено только владельцем<br/>Публичный: Отображается для всех "
"пользователей. Может быть изменено только владельцем." "пользователей. Может быть изменено только владельцем."
#: apps/common/forms.py:76 apps/users/forms.py:169 #: apps/common/forms.py:76 apps/users/forms.py:173
msgid "Save" msgid "Save"
msgstr "Сохранить" msgstr "Сохранить"
@@ -549,8 +549,8 @@ msgstr "Обменный курс"
msgid "Date and Time" msgid "Date and Time"
msgstr "Дата и время" msgstr "Дата и время"
#: apps/currencies/models.py:78 apps/users/models.py:12 #: apps/currencies/models.py:78 apps/users/models.py:17
#: apps/users/models.py:497 #: apps/users/models.py:502
msgid "Auto" msgid "Auto"
msgstr "Авто" msgstr "Авто"
@@ -591,7 +591,9 @@ msgstr "Тип услуги"
#: templates/entities/fragments/list.html:16 #: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16 #: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16 #: templates/recurring_transactions/fragments/list.html:16
#: templates/tags/fragments/list.html:16 templates/users/fragments/list.html:25 #: templates/tags/fragments/list.html:16
#: templates/users/fragments/api_tokens.html:54
#: templates/users/fragments/list.html:25
msgid "Active" msgid "Active"
msgstr "Активный" msgstr "Активный"
@@ -1612,7 +1614,7 @@ msgstr "Теги транзакций"
msgid "Yearly" msgid "Yearly"
msgstr "Ежегодно" msgstr "Ежегодно"
#: apps/transactions/models.py:596 apps/users/models.py:464 #: apps/transactions/models.py:596 apps/users/models.py:469
#: templates/includes/sidebar.html:51 #: templates/includes/sidebar.html:51
msgid "Monthly" msgid "Monthly"
msgstr "Ежемесячно" msgstr "Ежемесячно"
@@ -1803,11 +1805,11 @@ msgid "Installment Plan deleted successfully"
msgstr "План рассрочки успешно удален" msgstr "План рассрочки успешно удален"
#: apps/transactions/views/quick_transactions.py:45 #: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:188 #: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:252
msgid "Item added successfully" msgid "Item added successfully"
msgstr "Элемент успешно добавлен" msgstr "Элемент успешно добавлен"
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:220 #: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:284
msgid "Item updated successfully" msgid "Item updated successfully"
msgstr "Элемент успешно обновлен" msgstr "Элемент успешно обновлен"
@@ -1896,44 +1898,48 @@ msgstr "Транзакция успешно восстановлена"
msgid "Transfer added successfully" msgid "Transfer added successfully"
msgstr "Перевод успешно добавлен" msgstr "Перевод успешно добавлен"
#: apps/users/admin.py:22 templates/users/fragments/user_settings.html:5 #: apps/users/admin.py:17
msgid "Revoke selected API tokens"
msgstr ""
#: apps/users/admin.py:28 templates/users/fragments/user_settings.html:5
msgid "User Settings" msgid "User Settings"
msgstr "Пользовательские настройки" msgstr "Пользовательские настройки"
#: apps/users/admin.py:23 #: apps/users/admin.py:29
msgid "User Setting" msgid "User Setting"
msgstr "Настройки пользователя" msgstr "Настройки пользователя"
#: apps/users/admin.py:48 #: apps/users/admin.py:54
msgid "Personal info" msgid "Personal info"
msgstr "Персональная информация" msgstr "Персональная информация"
#: apps/users/admin.py:50 #: apps/users/admin.py:56
msgid "Permissions" msgid "Permissions"
msgstr "Разрешения" msgstr "Разрешения"
#: apps/users/admin.py:61 #: apps/users/admin.py:67
msgid "Important dates" msgid "Important dates"
msgstr "" msgstr ""
#: apps/users/forms.py:24 apps/users/forms.py:28 apps/users/models.py:451 #: apps/users/forms.py:28 apps/users/forms.py:32 apps/users/models.py:456
#: templates/users/login.html:18 #: templates/users/login.html:18
msgid "E-mail" msgid "E-mail"
msgstr "E-mail" msgstr "E-mail"
#: apps/users/forms.py:35 apps/users/forms.py:40 templates/users/login.html:19 #: apps/users/forms.py:39 apps/users/forms.py:44 templates/users/login.html:19
msgid "Password" msgid "Password"
msgstr "Пароль" msgstr "Пароль"
#: apps/users/forms.py:47 #: apps/users/forms.py:51
msgid "Invalid e-mail or password" msgid "Invalid e-mail or password"
msgstr "Неверный адрес электронной почты или пароль" msgstr "Неверный адрес электронной почты или пароль"
#: apps/users/forms.py:48 #: apps/users/forms.py:52
msgid "This account is deactivated" msgid "This account is deactivated"
msgstr "Этот аккаунт деактивирован" msgstr "Этот аккаунт деактивирован"
#: apps/users/forms.py:64 apps/users/forms.py:77 apps/users/forms.py:99 #: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98 #: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245 #: templates/monthly_overview/pages/overview.html:245
#: templates/transactions/pages/transactions.html:47 #: templates/transactions/pages/transactions.html:47
@@ -1941,23 +1947,23 @@ msgstr "Этот аккаунт деактивирован"
msgid "Default" msgid "Default"
msgstr "По умолчанию" msgstr "По умолчанию"
#: apps/users/forms.py:107 apps/users/models.py:484 #: apps/users/forms.py:111 apps/users/models.py:489
msgid "Date Format" msgid "Date Format"
msgstr "Формат даты" msgstr "Формат даты"
#: apps/users/forms.py:112 apps/users/models.py:489 #: apps/users/forms.py:116 apps/users/models.py:494
msgid "Datetime Format" msgid "Datetime Format"
msgstr "Формат даты и времени" msgstr "Формат даты и времени"
#: apps/users/forms.py:118 apps/users/models.py:492 #: apps/users/forms.py:122 apps/users/models.py:497
msgid "Number Format" msgid "Number Format"
msgstr "Формат чисел" msgstr "Формат чисел"
#: apps/users/forms.py:125 #: apps/users/forms.py:129
msgid "Default Account" msgid "Default Account"
msgstr "Учетная запись по умолчанию" msgstr "Учетная запись по умолчанию"
#: apps/users/forms.py:174 #: apps/users/forms.py:178
#, python-format #, python-format
msgid "" msgid ""
"This changes the language (if available) and how numbers and dates are " "This changes the language (if available) and how numbers and dates are "
@@ -1968,132 +1974,222 @@ msgstr ""
"Пожалуйста, рассмотрите возможность помочь перевести WYGIWYH на ваш язык по " "Пожалуйста, рассмотрите возможность помочь перевести WYGIWYH на ваш язык по "
"ссылке %(translation_link)s" "ссылке %(translation_link)s"
#: apps/users/forms.py:183 #: apps/users/forms.py:187
msgid "New Password" msgid "New Password"
msgstr "Новый пароль" msgstr "Новый пароль"
#: apps/users/forms.py:186 #: apps/users/forms.py:190
msgid "Leave blank to keep the current password." msgid "Leave blank to keep the current password."
msgstr "Оставьте поле пустым, чтобы сохранить текущий пароль." msgstr "Оставьте поле пустым, чтобы сохранить текущий пароль."
#: apps/users/forms.py:189 #: apps/users/forms.py:193
msgid "Confirm New Password" msgid "Confirm New Password"
msgstr "Подтвердите новый пароль" msgstr "Подтвердите новый пароль"
#: apps/users/forms.py:201 apps/users/forms.py:358 #: apps/users/forms.py:205 apps/users/forms.py:362
msgid "" msgid ""
"Designates whether this user should be treated as active. Unselect this " "Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts." "instead of deleting accounts."
msgstr "" msgstr ""
#: apps/users/forms.py:204 apps/users/forms.py:361 #: apps/users/forms.py:208 apps/users/forms.py:365
msgid "" msgid ""
"Designates that this user has all permissions without explicitly assigning " "Designates that this user has all permissions without explicitly assigning "
"them." "them."
msgstr "" msgstr ""
#: apps/users/forms.py:271 #: apps/users/forms.py:275
msgid "This email address is already in use by another account." msgid "This email address is already in use by another account."
msgstr "Этот адрес электронной почты уже используется другим аккаунтом." msgstr "Этот адрес электронной почты уже используется другим аккаунтом."
#: apps/users/forms.py:279 #: apps/users/forms.py:283
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "Поля ввода пароля не совпадали." msgstr "Поля ввода пароля не совпадали."
#: apps/users/forms.py:281 #: apps/users/forms.py:285
msgid "Please confirm your new password." msgid "Please confirm your new password."
msgstr "Пожалуйста, подтвердите свой новый пароль." msgstr "Пожалуйста, подтвердите свой новый пароль."
#: apps/users/forms.py:283 #: apps/users/forms.py:287
msgid "Please enter the new password first." msgid "Please enter the new password first."
msgstr "Пожалуйста, сначала введите новый пароль." msgstr "Пожалуйста, сначала введите новый пароль."
#: apps/users/forms.py:303 #: apps/users/forms.py:307
msgid "You cannot deactivate your own account using this form." msgid "You cannot deactivate your own account using this form."
msgstr "" msgstr ""
#: apps/users/forms.py:316 #: apps/users/forms.py:320
msgid "Cannot remove status from the last superuser." msgid "Cannot remove status from the last superuser."
msgstr "" msgstr ""
#: apps/users/forms.py:322 #: apps/users/forms.py:326
msgid "You cannot remove your own superuser status using this form." msgid "You cannot remove your own superuser status using this form."
msgstr "" msgstr ""
#: apps/users/forms.py:415 #: apps/users/forms.py:419
msgid "A user with this email address already exists." msgid "A user with this email address already exists."
msgstr "Пользователь с таким адресом электронной почты уже существует." msgstr "Пользователь с таким адресом электронной почты уже существует."
#: apps/users/models.py:465 #: apps/users/forms.py:439
#, fuzzy
#| msgid "Tag name"
msgid "Token name"
msgstr "Название тега"
#: apps/users/forms.py:441
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
#, fuzzy
#| msgid "Create transaction"
msgid "Create token"
msgstr "Создать транзакцию"
#: apps/users/models.py:470
msgid "Yearly by currency" msgid "Yearly by currency"
msgstr "Ежегодно по валютам" msgstr "Ежегодно по валютам"
#: apps/users/models.py:466 #: apps/users/models.py:471
msgid "Yearly by account" msgid "Yearly by account"
msgstr "Ежегодно по счетам" msgstr "Ежегодно по счетам"
#: apps/users/models.py:467 templates/net_worth/net_worth.html:9 #: apps/users/models.py:472 templates/net_worth/net_worth.html:9
msgid "Current Net Worth" msgid "Current Net Worth"
msgstr "Текущее состояние" msgstr "Текущее состояние"
#: apps/users/models.py:468 templates/net_worth/net_worth.html:11 #: apps/users/models.py:473 templates/net_worth/net_worth.html:11
msgid "Projected Net Worth" msgid "Projected Net Worth"
msgstr "Прогнозируемый чистый капитал" msgstr "Прогнозируемый чистый капитал"
#: apps/users/models.py:469 #: apps/users/models.py:474
msgid "All Transactions" msgid "All Transactions"
msgstr "Все транзакции" msgstr "Все транзакции"
#: apps/users/models.py:470 templates/includes/sidebar.html:63 #: apps/users/models.py:475 templates/includes/sidebar.html:63
msgid "Calendar" msgid "Calendar"
msgstr "Календарь" msgstr "Календарь"
#: apps/users/models.py:480 #: apps/users/models.py:485
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: apps/users/models.py:499 #: apps/users/models.py:504
msgid "Language" msgid "Language"
msgstr "Язык" msgstr "Язык"
#: apps/users/models.py:505 #: apps/users/models.py:510
msgid "Time Zone" msgid "Time Zone"
msgstr "Часовой пояс" msgstr "Часовой пояс"
#: apps/users/models.py:511 #: apps/users/models.py:516
msgid "Start page" msgid "Start page"
msgstr "Начальная страница" msgstr "Начальная страница"
#: apps/users/models.py:516 #: apps/users/models.py:521
msgid "Default account" msgid "Default account"
msgstr "Выбор счета по умолчанию" msgstr "Выбор счета по умолчанию"
#: apps/users/models.py:517 #: apps/users/models.py:522
msgid "Selects the account by default when creating new transactions" msgid "Selects the account by default when creating new transactions"
msgstr "" msgstr ""
"При создании транзакций по умолчанию выбирается соответствующая учетная " "При создании транзакций по умолчанию выбирается соответствующая учетная "
"запись" "запись"
#: apps/users/views.py:67 #: apps/users/models.py:570
#, fuzzy
#| msgid "Users"
msgid "User"
msgstr "Пользователи"
#: apps/users/models.py:577
msgid "Token key"
msgstr ""
#: apps/users/models.py:579
msgid "Token hash"
msgstr ""
#: apps/users/models.py:583
msgid "Last used at"
msgstr ""
#: apps/users/models.py:588
msgid "Expires at"
msgstr ""
#: apps/users/models.py:593
msgid "Revoked at"
msgstr ""
#: apps/users/models.py:595
#, fuzzy
#| msgid "Create"
msgid "Created at"
msgstr "Создать"
#: apps/users/models.py:596
#, fuzzy
#| msgid "Update"
msgid "Updated at"
msgstr "Обновить"
#: apps/users/models.py:606
#, fuzzy
#| msgid "API Key"
msgid "API token"
msgstr "API ключ"
#: apps/users/models.py:607
msgid "API tokens"
msgstr ""
#: apps/users/views.py:69
msgid "Transaction amounts are now hidden" msgid "Transaction amounts are now hidden"
msgstr "Суммы транзакций теперь скрыты" msgstr "Суммы транзакций теперь скрыты"
#: apps/users/views.py:70 #: apps/users/views.py:72
msgid "Transaction amounts are now displayed" msgid "Transaction amounts are now displayed"
msgstr "Суммы транзакций теперь отображаются" msgstr "Суммы транзакций теперь отображаются"
#: apps/users/views.py:88 #: apps/users/views.py:90
msgid "Sounds are now muted" msgid "Sounds are now muted"
msgstr "Звуки теперь отключены" msgstr "Звуки теперь отключены"
#: apps/users/views.py:91 #: apps/users/views.py:93
msgid "Sounds will now play" msgid "Sounds will now play"
msgstr "Звуки теперь включены" msgstr "Звуки теперь включены"
#: apps/users/views.py:107 #: apps/users/views.py:109
msgid "Your settings have been updated" msgid "Your settings have been updated"
msgstr "Ваши настройки обновлены" msgstr "Ваши настройки обновлены"
#: apps/users/views.py:148
#, fuzzy
#| msgid "Action updated successfully"
msgid "API token created successfully"
msgstr "Действие успешно обновлено"
#: apps/users/views.py:167
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token revoked successfully"
msgstr "Действие успешно удалено"
#: apps/users/views.py:178
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token deleted successfully"
msgstr "Действие успешно удалено"
#: templates/account_groups/fragments/add.html:5 #: templates/account_groups/fragments/add.html:5
msgid "Add account group" msgid "Add account group"
msgstr "Добавить группу учетных записей" msgstr "Добавить группу учетных записей"
@@ -2191,6 +2287,7 @@ msgstr "Поделиться"
#: templates/rules/fragments/transaction_rule/view.html:92 #: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133 #: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51 #: templates/tags/fragments/table.html:51
#: templates/users/fragments/api_tokens.html:93
msgid "Delete" msgid "Delete"
msgstr "Удалить" msgstr "Удалить"
@@ -2268,6 +2365,7 @@ msgstr "Вы не сможете отменить это!"
#: templates/rules/fragments/transaction_rule/view.html:98 #: templates/rules/fragments/transaction_rule/view.html:98
#: templates/tags/fragments/table.html:57 #: templates/tags/fragments/table.html:57
#: templates/transactions/fragments/attachments.html:22 #: templates/transactions/fragments/attachments.html:22
#: templates/users/fragments/api_tokens.html:101
msgid "Yes, delete it!" msgid "Yes, delete it!"
msgstr "Да, удалите это!" msgstr "Да, удалите это!"
@@ -3263,6 +3361,10 @@ msgstr ""
msgid "This is a demo!" msgid "This is a demo!"
msgstr "Это демо-версия!" msgstr "Это демо-версия!"
#: templates/layouts/base.html:37
msgid "Any data you add here will be wiped in 24hrs or less"
msgstr ""
#: templates/mini_tools/currency_converter/currency_converter.html:57 #: templates/mini_tools/currency_converter/currency_converter.html:57
msgid "Invert" msgid "Invert"
msgstr "" msgstr ""
@@ -3641,6 +3743,87 @@ msgstr "Без изменений"
msgid "Add user" msgid "Add user"
msgstr "Добавить пользователя" msgstr "Добавить пользователя"
#: templates/users/fragments/api_tokens.html:5
msgid "API Tokens"
msgstr ""
#: templates/users/fragments/api_tokens.html:7
msgid ""
"Use these tokens for automations such as n8n. The raw token is shown only "
"once after creation."
msgstr ""
#: templates/users/fragments/api_tokens.html:14
msgid "Copy this token now"
msgstr ""
#: templates/users/fragments/api_tokens.html:16
msgid "It will not be shown again after this response."
msgstr ""
#: templates/users/fragments/api_tokens.html:31
msgid "Copy"
msgstr ""
#: templates/users/fragments/api_tokens.html:52
msgid "Revoked"
msgstr ""
#: templates/users/fragments/api_tokens.html:59
#, python-format
msgid "Created %(created)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:62
#, python-format
msgid "last used %(used)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:64
msgid "never used"
msgstr ""
#: templates/users/fragments/api_tokens.html:68
#, python-format
msgid "expires %(expires)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:70
msgid "no expiry"
msgstr ""
#: templates/users/fragments/api_tokens.html:78
msgid "Revoke"
msgstr ""
#: templates/users/fragments/api_tokens.html:84
msgid "Revoke token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:85
msgid "This token will stop working immediately."
msgstr ""
#: templates/users/fragments/api_tokens.html:86
#, fuzzy
#| msgid "Yes, delete it!"
msgid "Yes, revoke it!"
msgstr "Да, удалите это!"
#: templates/users/fragments/api_tokens.html:99
#, fuzzy
#| msgid "Delete"
msgid "Delete token?"
msgstr "Удалить"
#: templates/users/fragments/api_tokens.html:100
msgid "This permanently removes the token from the list. It cannot be undone."
msgstr ""
#: templates/users/fragments/api_tokens.html:114
msgid "No API tokens"
msgstr ""
#: templates/users/fragments/edit.html:5 #: templates/users/fragments/edit.html:5
msgid "Edit user" msgid "Edit user"
msgstr "Редактировать пользователя" msgstr "Редактировать пользователя"
+220 -57
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-06 08:15+0000\n" "POT-Creation-Date: 2026-07-04 15:39+0000\n"
"PO-Revision-Date: 2025-04-14 06:16+0000\n" "PO-Revision-Date: 2025-04-14 06:16+0000\n"
"Last-Translator: Emil <emil.bjorkroth@gmail.com>\n" "Last-Translator: Emil <emil.bjorkroth@gmail.com>\n"
"Language-Team: Swedish <https://translations.herculino.com/projects/wygiwyh/" "Language-Team: Swedish <https://translations.herculino.com/projects/wygiwyh/"
@@ -31,8 +31,8 @@ msgstr ""
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536 #: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919 #: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978 #: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:242 #: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:400 #: apps/users/forms.py:404
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5 #: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128 #: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update" msgid "Update"
@@ -47,7 +47,7 @@ msgstr "Uppdatera"
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886 #: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953 #: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134 #: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:248 apps/users/forms.py:406 #: apps/users/forms.py:252 apps/users/forms.py:410
#: templates/mini_tools/unit_price_calculator.html:168 #: templates/mini_tools/unit_price_calculator.html:168
msgid "Add" msgid "Add"
msgstr "" msgstr ""
@@ -99,7 +99,7 @@ msgstr ""
#: apps/import_app/models.py:14 apps/rules/models.py:13 #: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248 #: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057 #: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: templates/account_groups/fragments/list.html:22 #: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22 #: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17 #: templates/categories/fragments/table.html:17
#: templates/currencies/fragments/list.html:23 #: templates/currencies/fragments/list.html:23
@@ -345,7 +345,7 @@ msgid ""
"owner.<br/>Public: Shown for all users. Only editable by the owner." "owner.<br/>Public: Shown for all users. Only editable by the owner."
msgstr "" msgstr ""
#: apps/common/forms.py:76 apps/users/forms.py:169 #: apps/common/forms.py:76 apps/users/forms.py:173
msgid "Save" msgid "Save"
msgstr "" msgstr ""
@@ -531,8 +531,8 @@ msgstr ""
msgid "Date and Time" msgid "Date and Time"
msgstr "" msgstr ""
#: apps/currencies/models.py:78 apps/users/models.py:12 #: apps/currencies/models.py:78 apps/users/models.py:17
#: apps/users/models.py:497 #: apps/users/models.py:502
msgid "Auto" msgid "Auto"
msgstr "" msgstr ""
@@ -573,7 +573,9 @@ msgstr ""
#: templates/entities/fragments/list.html:16 #: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16 #: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16 #: templates/recurring_transactions/fragments/list.html:16
#: templates/tags/fragments/list.html:16 templates/users/fragments/list.html:25 #: templates/tags/fragments/list.html:16
#: templates/users/fragments/api_tokens.html:54
#: templates/users/fragments/list.html:25
msgid "Active" msgid "Active"
msgstr "" msgstr ""
@@ -1565,7 +1567,7 @@ msgstr ""
msgid "Yearly" msgid "Yearly"
msgstr "" msgstr ""
#: apps/transactions/models.py:596 apps/users/models.py:464 #: apps/transactions/models.py:596 apps/users/models.py:469
#: templates/includes/sidebar.html:51 #: templates/includes/sidebar.html:51
msgid "Monthly" msgid "Monthly"
msgstr "" msgstr ""
@@ -1756,11 +1758,11 @@ msgid "Installment Plan deleted successfully"
msgstr "" msgstr ""
#: apps/transactions/views/quick_transactions.py:45 #: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:188 #: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:252
msgid "Item added successfully" msgid "Item added successfully"
msgstr "" msgstr ""
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:220 #: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:284
msgid "Item updated successfully" msgid "Item updated successfully"
msgstr "" msgstr ""
@@ -1845,44 +1847,48 @@ msgstr ""
msgid "Transfer added successfully" msgid "Transfer added successfully"
msgstr "" msgstr ""
#: apps/users/admin.py:22 templates/users/fragments/user_settings.html:5 #: apps/users/admin.py:17
msgid "Revoke selected API tokens"
msgstr ""
#: apps/users/admin.py:28 templates/users/fragments/user_settings.html:5
msgid "User Settings" msgid "User Settings"
msgstr "" msgstr ""
#: apps/users/admin.py:23 #: apps/users/admin.py:29
msgid "User Setting" msgid "User Setting"
msgstr "" msgstr ""
#: apps/users/admin.py:48 #: apps/users/admin.py:54
msgid "Personal info" msgid "Personal info"
msgstr "" msgstr ""
#: apps/users/admin.py:50 #: apps/users/admin.py:56
msgid "Permissions" msgid "Permissions"
msgstr "" msgstr ""
#: apps/users/admin.py:61 #: apps/users/admin.py:67
msgid "Important dates" msgid "Important dates"
msgstr "" msgstr ""
#: apps/users/forms.py:24 apps/users/forms.py:28 apps/users/models.py:451 #: apps/users/forms.py:28 apps/users/forms.py:32 apps/users/models.py:456
#: templates/users/login.html:18 #: templates/users/login.html:18
msgid "E-mail" msgid "E-mail"
msgstr "" msgstr ""
#: apps/users/forms.py:35 apps/users/forms.py:40 templates/users/login.html:19 #: apps/users/forms.py:39 apps/users/forms.py:44 templates/users/login.html:19
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: apps/users/forms.py:47 #: apps/users/forms.py:51
msgid "Invalid e-mail or password" msgid "Invalid e-mail or password"
msgstr "" msgstr ""
#: apps/users/forms.py:48 #: apps/users/forms.py:52
msgid "This account is deactivated" msgid "This account is deactivated"
msgstr "" msgstr ""
#: apps/users/forms.py:64 apps/users/forms.py:77 apps/users/forms.py:99 #: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98 #: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245 #: templates/monthly_overview/pages/overview.html:245
#: templates/transactions/pages/transactions.html:47 #: templates/transactions/pages/transactions.html:47
@@ -1890,23 +1896,23 @@ msgstr ""
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: apps/users/forms.py:107 apps/users/models.py:484 #: apps/users/forms.py:111 apps/users/models.py:489
msgid "Date Format" msgid "Date Format"
msgstr "" msgstr ""
#: apps/users/forms.py:112 apps/users/models.py:489 #: apps/users/forms.py:116 apps/users/models.py:494
msgid "Datetime Format" msgid "Datetime Format"
msgstr "" msgstr ""
#: apps/users/forms.py:118 apps/users/models.py:492 #: apps/users/forms.py:122 apps/users/models.py:497
msgid "Number Format" msgid "Number Format"
msgstr "" msgstr ""
#: apps/users/forms.py:125 #: apps/users/forms.py:129
msgid "Default Account" msgid "Default Account"
msgstr "" msgstr ""
#: apps/users/forms.py:174 #: apps/users/forms.py:178
#, python-format #, python-format
msgid "" msgid ""
"This changes the language (if available) and how numbers and dates are " "This changes the language (if available) and how numbers and dates are "
@@ -1914,130 +1920,204 @@ msgid ""
"Consider helping translate WYGIWYH to your language at %(translation_link)s" "Consider helping translate WYGIWYH to your language at %(translation_link)s"
msgstr "" msgstr ""
#: apps/users/forms.py:183 #: apps/users/forms.py:187
msgid "New Password" msgid "New Password"
msgstr "" msgstr ""
#: apps/users/forms.py:186 #: apps/users/forms.py:190
msgid "Leave blank to keep the current password." msgid "Leave blank to keep the current password."
msgstr "" msgstr ""
#: apps/users/forms.py:189 #: apps/users/forms.py:193
msgid "Confirm New Password" msgid "Confirm New Password"
msgstr "" msgstr ""
#: apps/users/forms.py:201 apps/users/forms.py:358 #: apps/users/forms.py:205 apps/users/forms.py:362
msgid "" msgid ""
"Designates whether this user should be treated as active. Unselect this " "Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts." "instead of deleting accounts."
msgstr "" msgstr ""
#: apps/users/forms.py:204 apps/users/forms.py:361 #: apps/users/forms.py:208 apps/users/forms.py:365
msgid "" msgid ""
"Designates that this user has all permissions without explicitly assigning " "Designates that this user has all permissions without explicitly assigning "
"them." "them."
msgstr "" msgstr ""
#: apps/users/forms.py:271 #: apps/users/forms.py:275
msgid "This email address is already in use by another account." msgid "This email address is already in use by another account."
msgstr "" msgstr ""
#: apps/users/forms.py:279 #: apps/users/forms.py:283
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "" msgstr ""
#: apps/users/forms.py:281 #: apps/users/forms.py:285
msgid "Please confirm your new password." msgid "Please confirm your new password."
msgstr "" msgstr ""
#: apps/users/forms.py:283 #: apps/users/forms.py:287
msgid "Please enter the new password first." msgid "Please enter the new password first."
msgstr "" msgstr ""
#: apps/users/forms.py:303 #: apps/users/forms.py:307
msgid "You cannot deactivate your own account using this form." msgid "You cannot deactivate your own account using this form."
msgstr "" msgstr ""
#: apps/users/forms.py:316 #: apps/users/forms.py:320
msgid "Cannot remove status from the last superuser." msgid "Cannot remove status from the last superuser."
msgstr "" msgstr ""
#: apps/users/forms.py:322 #: apps/users/forms.py:326
msgid "You cannot remove your own superuser status using this form." msgid "You cannot remove your own superuser status using this form."
msgstr "" msgstr ""
#: apps/users/forms.py:415 #: apps/users/forms.py:419
msgid "A user with this email address already exists." msgid "A user with this email address already exists."
msgstr "" msgstr ""
#: apps/users/models.py:465 #: apps/users/forms.py:439
msgid "Token name"
msgstr ""
#: apps/users/forms.py:441
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
msgid "Create token"
msgstr ""
#: apps/users/models.py:470
msgid "Yearly by currency" msgid "Yearly by currency"
msgstr "" msgstr ""
#: apps/users/models.py:466 #: apps/users/models.py:471
msgid "Yearly by account" msgid "Yearly by account"
msgstr "" msgstr ""
#: apps/users/models.py:467 templates/net_worth/net_worth.html:9 #: apps/users/models.py:472 templates/net_worth/net_worth.html:9
msgid "Current Net Worth" msgid "Current Net Worth"
msgstr "" msgstr ""
#: apps/users/models.py:468 templates/net_worth/net_worth.html:11 #: apps/users/models.py:473 templates/net_worth/net_worth.html:11
msgid "Projected Net Worth" msgid "Projected Net Worth"
msgstr "" msgstr ""
#: apps/users/models.py:469 #: apps/users/models.py:474
msgid "All Transactions" msgid "All Transactions"
msgstr "" msgstr ""
#: apps/users/models.py:470 templates/includes/sidebar.html:63 #: apps/users/models.py:475 templates/includes/sidebar.html:63
msgid "Calendar" msgid "Calendar"
msgstr "" msgstr ""
#: apps/users/models.py:480 #: apps/users/models.py:485
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: apps/users/models.py:499 #: apps/users/models.py:504
msgid "Language" msgid "Language"
msgstr "" msgstr ""
#: apps/users/models.py:505 #: apps/users/models.py:510
msgid "Time Zone" msgid "Time Zone"
msgstr "" msgstr ""
#: apps/users/models.py:511 #: apps/users/models.py:516
msgid "Start page" msgid "Start page"
msgstr "" msgstr ""
#: apps/users/models.py:516 #: apps/users/models.py:521
msgid "Default account" msgid "Default account"
msgstr "" msgstr ""
#: apps/users/models.py:517 #: apps/users/models.py:522
msgid "Selects the account by default when creating new transactions" msgid "Selects the account by default when creating new transactions"
msgstr "" msgstr ""
#: apps/users/views.py:67 #: apps/users/models.py:570
msgid "User"
msgstr ""
#: apps/users/models.py:577
msgid "Token key"
msgstr ""
#: apps/users/models.py:579
msgid "Token hash"
msgstr ""
#: apps/users/models.py:583
msgid "Last used at"
msgstr ""
#: apps/users/models.py:588
msgid "Expires at"
msgstr ""
#: apps/users/models.py:593
msgid "Revoked at"
msgstr ""
#: apps/users/models.py:595
msgid "Created at"
msgstr ""
#: apps/users/models.py:596
#, fuzzy
#| msgid "Update"
msgid "Updated at"
msgstr "Uppdatera"
#: apps/users/models.py:606
msgid "API token"
msgstr ""
#: apps/users/models.py:607
msgid "API tokens"
msgstr ""
#: apps/users/views.py:69
msgid "Transaction amounts are now hidden" msgid "Transaction amounts are now hidden"
msgstr "" msgstr ""
#: apps/users/views.py:70 #: apps/users/views.py:72
msgid "Transaction amounts are now displayed" msgid "Transaction amounts are now displayed"
msgstr "" msgstr ""
#: apps/users/views.py:88 #: apps/users/views.py:90
msgid "Sounds are now muted" msgid "Sounds are now muted"
msgstr "" msgstr ""
#: apps/users/views.py:91 #: apps/users/views.py:93
msgid "Sounds will now play" msgid "Sounds will now play"
msgstr "" msgstr ""
#: apps/users/views.py:107 #: apps/users/views.py:109
msgid "Your settings have been updated" msgid "Your settings have been updated"
msgstr "" msgstr ""
#: apps/users/views.py:148
msgid "API token created successfully"
msgstr ""
#: apps/users/views.py:167
msgid "API token revoked successfully"
msgstr ""
#: apps/users/views.py:178
msgid "API token deleted successfully"
msgstr ""
#: templates/account_groups/fragments/add.html:5 #: templates/account_groups/fragments/add.html:5
msgid "Add account group" msgid "Add account group"
msgstr "" msgstr ""
@@ -2135,6 +2215,7 @@ msgstr ""
#: templates/rules/fragments/transaction_rule/view.html:92 #: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133 #: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51 #: templates/tags/fragments/table.html:51
#: templates/users/fragments/api_tokens.html:93
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
@@ -2212,6 +2293,7 @@ msgstr ""
#: templates/rules/fragments/transaction_rule/view.html:98 #: templates/rules/fragments/transaction_rule/view.html:98
#: templates/tags/fragments/table.html:57 #: templates/tags/fragments/table.html:57
#: templates/transactions/fragments/attachments.html:22 #: templates/transactions/fragments/attachments.html:22
#: templates/users/fragments/api_tokens.html:101
msgid "Yes, delete it!" msgid "Yes, delete it!"
msgstr "" msgstr ""
@@ -3207,6 +3289,10 @@ msgstr ""
msgid "This is a demo!" msgid "This is a demo!"
msgstr "" msgstr ""
#: templates/layouts/base.html:37
msgid "Any data you add here will be wiped in 24hrs or less"
msgstr ""
#: templates/mini_tools/currency_converter/currency_converter.html:57 #: templates/mini_tools/currency_converter/currency_converter.html:57
msgid "Invert" msgid "Invert"
msgstr "" msgstr ""
@@ -3579,6 +3665,83 @@ msgstr ""
msgid "Add user" msgid "Add user"
msgstr "" msgstr ""
#: templates/users/fragments/api_tokens.html:5
msgid "API Tokens"
msgstr ""
#: templates/users/fragments/api_tokens.html:7
msgid ""
"Use these tokens for automations such as n8n. The raw token is shown only "
"once after creation."
msgstr ""
#: templates/users/fragments/api_tokens.html:14
msgid "Copy this token now"
msgstr ""
#: templates/users/fragments/api_tokens.html:16
msgid "It will not be shown again after this response."
msgstr ""
#: templates/users/fragments/api_tokens.html:31
msgid "Copy"
msgstr ""
#: templates/users/fragments/api_tokens.html:52
msgid "Revoked"
msgstr ""
#: templates/users/fragments/api_tokens.html:59
#, python-format
msgid "Created %(created)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:62
#, python-format
msgid "last used %(used)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:64
msgid "never used"
msgstr ""
#: templates/users/fragments/api_tokens.html:68
#, python-format
msgid "expires %(expires)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:70
msgid "no expiry"
msgstr ""
#: templates/users/fragments/api_tokens.html:78
msgid "Revoke"
msgstr ""
#: templates/users/fragments/api_tokens.html:84
msgid "Revoke token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:85
msgid "This token will stop working immediately."
msgstr ""
#: templates/users/fragments/api_tokens.html:86
msgid "Yes, revoke it!"
msgstr ""
#: templates/users/fragments/api_tokens.html:99
msgid "Delete token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:100
msgid "This permanently removes the token from the list. It cannot be undone."
msgstr ""
#: templates/users/fragments/api_tokens.html:114
msgid "No API tokens"
msgstr ""
#: templates/users/fragments/edit.html:5 #: templates/users/fragments/edit.html:5
msgid "Edit user" msgid "Edit user"
msgstr "" msgstr ""
+220 -57
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-06 08:15+0000\n" "POT-Creation-Date: 2026-07-04 15:39+0000\n"
"PO-Revision-Date: 2026-01-18 19:24+0000\n" "PO-Revision-Date: 2026-01-18 19:24+0000\n"
"Last-Translator: Ebrahim Tayabali <ebrahimhakimuddin@gmail.com>\n" "Last-Translator: Ebrahim Tayabali <ebrahimhakimuddin@gmail.com>\n"
"Language-Team: Swahili <https://translations.herculino.com/projects/wygiwyh/" "Language-Team: Swahili <https://translations.herculino.com/projects/wygiwyh/"
@@ -31,8 +31,8 @@ msgstr "Jina La Kundi"
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536 #: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919 #: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978 #: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:242 #: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:400 #: apps/users/forms.py:404
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5 #: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128 #: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update" msgid "Update"
@@ -47,7 +47,7 @@ msgstr ""
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886 #: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953 #: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134 #: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:248 apps/users/forms.py:406 #: apps/users/forms.py:252 apps/users/forms.py:410
#: templates/mini_tools/unit_price_calculator.html:168 #: templates/mini_tools/unit_price_calculator.html:168
#, fuzzy #, fuzzy
msgid "Add" msgid "Add"
@@ -100,7 +100,7 @@ msgstr ""
#: apps/import_app/models.py:14 apps/rules/models.py:13 #: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248 #: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057 #: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: templates/account_groups/fragments/list.html:22 #: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22 #: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17 #: templates/categories/fragments/table.html:17
#: templates/currencies/fragments/list.html:23 #: templates/currencies/fragments/list.html:23
@@ -349,7 +349,7 @@ msgid ""
"owner.<br/>Public: Shown for all users. Only editable by the owner." "owner.<br/>Public: Shown for all users. Only editable by the owner."
msgstr "" msgstr ""
#: apps/common/forms.py:76 apps/users/forms.py:169 #: apps/common/forms.py:76 apps/users/forms.py:173
msgid "Save" msgid "Save"
msgstr "" msgstr ""
@@ -535,8 +535,8 @@ msgstr ""
msgid "Date and Time" msgid "Date and Time"
msgstr "" msgstr ""
#: apps/currencies/models.py:78 apps/users/models.py:12 #: apps/currencies/models.py:78 apps/users/models.py:17
#: apps/users/models.py:497 #: apps/users/models.py:502
msgid "Auto" msgid "Auto"
msgstr "" msgstr ""
@@ -577,7 +577,9 @@ msgstr ""
#: templates/entities/fragments/list.html:16 #: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16 #: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16 #: templates/recurring_transactions/fragments/list.html:16
#: templates/tags/fragments/list.html:16 templates/users/fragments/list.html:25 #: templates/tags/fragments/list.html:16
#: templates/users/fragments/api_tokens.html:54
#: templates/users/fragments/list.html:25
msgid "Active" msgid "Active"
msgstr "" msgstr ""
@@ -1569,7 +1571,7 @@ msgstr ""
msgid "Yearly" msgid "Yearly"
msgstr "" msgstr ""
#: apps/transactions/models.py:596 apps/users/models.py:464 #: apps/transactions/models.py:596 apps/users/models.py:469
#: templates/includes/sidebar.html:51 #: templates/includes/sidebar.html:51
msgid "Monthly" msgid "Monthly"
msgstr "" msgstr ""
@@ -1760,11 +1762,11 @@ msgid "Installment Plan deleted successfully"
msgstr "" msgstr ""
#: apps/transactions/views/quick_transactions.py:45 #: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:188 #: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:252
msgid "Item added successfully" msgid "Item added successfully"
msgstr "" msgstr ""
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:220 #: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:284
msgid "Item updated successfully" msgid "Item updated successfully"
msgstr "" msgstr ""
@@ -1849,44 +1851,48 @@ msgstr ""
msgid "Transfer added successfully" msgid "Transfer added successfully"
msgstr "" msgstr ""
#: apps/users/admin.py:22 templates/users/fragments/user_settings.html:5 #: apps/users/admin.py:17
msgid "Revoke selected API tokens"
msgstr ""
#: apps/users/admin.py:28 templates/users/fragments/user_settings.html:5
msgid "User Settings" msgid "User Settings"
msgstr "" msgstr ""
#: apps/users/admin.py:23 #: apps/users/admin.py:29
msgid "User Setting" msgid "User Setting"
msgstr "" msgstr ""
#: apps/users/admin.py:48 #: apps/users/admin.py:54
msgid "Personal info" msgid "Personal info"
msgstr "" msgstr ""
#: apps/users/admin.py:50 #: apps/users/admin.py:56
msgid "Permissions" msgid "Permissions"
msgstr "" msgstr ""
#: apps/users/admin.py:61 #: apps/users/admin.py:67
msgid "Important dates" msgid "Important dates"
msgstr "" msgstr ""
#: apps/users/forms.py:24 apps/users/forms.py:28 apps/users/models.py:451 #: apps/users/forms.py:28 apps/users/forms.py:32 apps/users/models.py:456
#: templates/users/login.html:18 #: templates/users/login.html:18
msgid "E-mail" msgid "E-mail"
msgstr "" msgstr ""
#: apps/users/forms.py:35 apps/users/forms.py:40 templates/users/login.html:19 #: apps/users/forms.py:39 apps/users/forms.py:44 templates/users/login.html:19
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: apps/users/forms.py:47 #: apps/users/forms.py:51
msgid "Invalid e-mail or password" msgid "Invalid e-mail or password"
msgstr "" msgstr ""
#: apps/users/forms.py:48 #: apps/users/forms.py:52
msgid "This account is deactivated" msgid "This account is deactivated"
msgstr "" msgstr ""
#: apps/users/forms.py:64 apps/users/forms.py:77 apps/users/forms.py:99 #: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98 #: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245 #: templates/monthly_overview/pages/overview.html:245
#: templates/transactions/pages/transactions.html:47 #: templates/transactions/pages/transactions.html:47
@@ -1894,25 +1900,25 @@ msgstr ""
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: apps/users/forms.py:107 apps/users/models.py:484 #: apps/users/forms.py:111 apps/users/models.py:489
msgid "Date Format" msgid "Date Format"
msgstr "" msgstr ""
#: apps/users/forms.py:112 apps/users/models.py:489 #: apps/users/forms.py:116 apps/users/models.py:494
msgid "Datetime Format" msgid "Datetime Format"
msgstr "" msgstr ""
#: apps/users/forms.py:118 apps/users/models.py:492 #: apps/users/forms.py:122 apps/users/models.py:497
msgid "Number Format" msgid "Number Format"
msgstr "" msgstr ""
#: apps/users/forms.py:125 #: apps/users/forms.py:129
#, fuzzy #, fuzzy
#| msgid "Asset account" #| msgid "Asset account"
msgid "Default Account" msgid "Default Account"
msgstr "Akaunti ya Mali" msgstr "Akaunti ya Mali"
#: apps/users/forms.py:174 #: apps/users/forms.py:178
#, python-format #, python-format
msgid "" msgid ""
"This changes the language (if available) and how numbers and dates are " "This changes the language (if available) and how numbers and dates are "
@@ -1920,132 +1926,206 @@ msgid ""
"Consider helping translate WYGIWYH to your language at %(translation_link)s" "Consider helping translate WYGIWYH to your language at %(translation_link)s"
msgstr "" msgstr ""
#: apps/users/forms.py:183 #: apps/users/forms.py:187
msgid "New Password" msgid "New Password"
msgstr "" msgstr ""
#: apps/users/forms.py:186 #: apps/users/forms.py:190
msgid "Leave blank to keep the current password." msgid "Leave blank to keep the current password."
msgstr "" msgstr ""
#: apps/users/forms.py:189 #: apps/users/forms.py:193
msgid "Confirm New Password" msgid "Confirm New Password"
msgstr "" msgstr ""
#: apps/users/forms.py:201 apps/users/forms.py:358 #: apps/users/forms.py:205 apps/users/forms.py:362
msgid "" msgid ""
"Designates whether this user should be treated as active. Unselect this " "Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts." "instead of deleting accounts."
msgstr "" msgstr ""
#: apps/users/forms.py:204 apps/users/forms.py:361 #: apps/users/forms.py:208 apps/users/forms.py:365
msgid "" msgid ""
"Designates that this user has all permissions without explicitly assigning " "Designates that this user has all permissions without explicitly assigning "
"them." "them."
msgstr "" msgstr ""
#: apps/users/forms.py:271 #: apps/users/forms.py:275
msgid "This email address is already in use by another account." msgid "This email address is already in use by another account."
msgstr "" msgstr ""
#: apps/users/forms.py:279 #: apps/users/forms.py:283
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "" msgstr ""
#: apps/users/forms.py:281 #: apps/users/forms.py:285
msgid "Please confirm your new password." msgid "Please confirm your new password."
msgstr "" msgstr ""
#: apps/users/forms.py:283 #: apps/users/forms.py:287
msgid "Please enter the new password first." msgid "Please enter the new password first."
msgstr "" msgstr ""
#: apps/users/forms.py:303 #: apps/users/forms.py:307
msgid "You cannot deactivate your own account using this form." msgid "You cannot deactivate your own account using this form."
msgstr "" msgstr ""
#: apps/users/forms.py:316 #: apps/users/forms.py:320
msgid "Cannot remove status from the last superuser." msgid "Cannot remove status from the last superuser."
msgstr "" msgstr ""
#: apps/users/forms.py:322 #: apps/users/forms.py:326
msgid "You cannot remove your own superuser status using this form." msgid "You cannot remove your own superuser status using this form."
msgstr "" msgstr ""
#: apps/users/forms.py:415 #: apps/users/forms.py:419
msgid "A user with this email address already exists." msgid "A user with this email address already exists."
msgstr "" msgstr ""
#: apps/users/models.py:465 #: apps/users/forms.py:439
#, fuzzy
#| msgid "Group name"
msgid "Token name"
msgstr "Jina La Kundi"
#: apps/users/forms.py:441
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
msgid "Create token"
msgstr ""
#: apps/users/models.py:470
msgid "Yearly by currency" msgid "Yearly by currency"
msgstr "" msgstr ""
#: apps/users/models.py:466 #: apps/users/models.py:471
msgid "Yearly by account" msgid "Yearly by account"
msgstr "" msgstr ""
#: apps/users/models.py:467 templates/net_worth/net_worth.html:9 #: apps/users/models.py:472 templates/net_worth/net_worth.html:9
msgid "Current Net Worth" msgid "Current Net Worth"
msgstr "" msgstr ""
#: apps/users/models.py:468 templates/net_worth/net_worth.html:11 #: apps/users/models.py:473 templates/net_worth/net_worth.html:11
msgid "Projected Net Worth" msgid "Projected Net Worth"
msgstr "" msgstr ""
#: apps/users/models.py:469 #: apps/users/models.py:474
msgid "All Transactions" msgid "All Transactions"
msgstr "" msgstr ""
#: apps/users/models.py:470 templates/includes/sidebar.html:63 #: apps/users/models.py:475 templates/includes/sidebar.html:63
msgid "Calendar" msgid "Calendar"
msgstr "" msgstr ""
#: apps/users/models.py:480 #: apps/users/models.py:485
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: apps/users/models.py:499 #: apps/users/models.py:504
msgid "Language" msgid "Language"
msgstr "" msgstr ""
#: apps/users/models.py:505 #: apps/users/models.py:510
msgid "Time Zone" msgid "Time Zone"
msgstr "" msgstr ""
#: apps/users/models.py:511 #: apps/users/models.py:516
msgid "Start page" msgid "Start page"
msgstr "" msgstr ""
#: apps/users/models.py:516 #: apps/users/models.py:521
#, fuzzy #, fuzzy
#| msgid "Asset account" #| msgid "Asset account"
msgid "Default account" msgid "Default account"
msgstr "Akaunti ya Mali" msgstr "Akaunti ya Mali"
#: apps/users/models.py:517 #: apps/users/models.py:522
msgid "Selects the account by default when creating new transactions" msgid "Selects the account by default when creating new transactions"
msgstr "" msgstr ""
#: apps/users/views.py:67 #: apps/users/models.py:570
msgid "User"
msgstr ""
#: apps/users/models.py:577
msgid "Token key"
msgstr ""
#: apps/users/models.py:579
msgid "Token hash"
msgstr ""
#: apps/users/models.py:583
msgid "Last used at"
msgstr ""
#: apps/users/models.py:588
msgid "Expires at"
msgstr ""
#: apps/users/models.py:593
msgid "Revoked at"
msgstr ""
#: apps/users/models.py:595
msgid "Created at"
msgstr ""
#: apps/users/models.py:596
msgid "Updated at"
msgstr ""
#: apps/users/models.py:606
msgid "API token"
msgstr ""
#: apps/users/models.py:607
msgid "API tokens"
msgstr ""
#: apps/users/views.py:69
msgid "Transaction amounts are now hidden" msgid "Transaction amounts are now hidden"
msgstr "" msgstr ""
#: apps/users/views.py:70 #: apps/users/views.py:72
msgid "Transaction amounts are now displayed" msgid "Transaction amounts are now displayed"
msgstr "" msgstr ""
#: apps/users/views.py:88 #: apps/users/views.py:90
msgid "Sounds are now muted" msgid "Sounds are now muted"
msgstr "" msgstr ""
#: apps/users/views.py:91 #: apps/users/views.py:93
msgid "Sounds will now play" msgid "Sounds will now play"
msgstr "" msgstr ""
#: apps/users/views.py:107 #: apps/users/views.py:109
msgid "Your settings have been updated" msgid "Your settings have been updated"
msgstr "" msgstr ""
#: apps/users/views.py:148
msgid "API token created successfully"
msgstr ""
#: apps/users/views.py:167
msgid "API token revoked successfully"
msgstr ""
#: apps/users/views.py:178
msgid "API token deleted successfully"
msgstr ""
#: templates/account_groups/fragments/add.html:5 #: templates/account_groups/fragments/add.html:5
msgid "Add account group" msgid "Add account group"
msgstr "" msgstr ""
@@ -2143,6 +2223,7 @@ msgstr ""
#: templates/rules/fragments/transaction_rule/view.html:92 #: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133 #: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51 #: templates/tags/fragments/table.html:51
#: templates/users/fragments/api_tokens.html:93
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
@@ -2220,6 +2301,7 @@ msgstr ""
#: templates/rules/fragments/transaction_rule/view.html:98 #: templates/rules/fragments/transaction_rule/view.html:98
#: templates/tags/fragments/table.html:57 #: templates/tags/fragments/table.html:57
#: templates/transactions/fragments/attachments.html:22 #: templates/transactions/fragments/attachments.html:22
#: templates/users/fragments/api_tokens.html:101
msgid "Yes, delete it!" msgid "Yes, delete it!"
msgstr "" msgstr ""
@@ -3215,6 +3297,10 @@ msgstr ""
msgid "This is a demo!" msgid "This is a demo!"
msgstr "" msgstr ""
#: templates/layouts/base.html:37
msgid "Any data you add here will be wiped in 24hrs or less"
msgstr ""
#: templates/mini_tools/currency_converter/currency_converter.html:57 #: templates/mini_tools/currency_converter/currency_converter.html:57
msgid "Invert" msgid "Invert"
msgstr "" msgstr ""
@@ -3587,6 +3673,83 @@ msgstr ""
msgid "Add user" msgid "Add user"
msgstr "" msgstr ""
#: templates/users/fragments/api_tokens.html:5
msgid "API Tokens"
msgstr ""
#: templates/users/fragments/api_tokens.html:7
msgid ""
"Use these tokens for automations such as n8n. The raw token is shown only "
"once after creation."
msgstr ""
#: templates/users/fragments/api_tokens.html:14
msgid "Copy this token now"
msgstr ""
#: templates/users/fragments/api_tokens.html:16
msgid "It will not be shown again after this response."
msgstr ""
#: templates/users/fragments/api_tokens.html:31
msgid "Copy"
msgstr ""
#: templates/users/fragments/api_tokens.html:52
msgid "Revoked"
msgstr ""
#: templates/users/fragments/api_tokens.html:59
#, python-format
msgid "Created %(created)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:62
#, python-format
msgid "last used %(used)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:64
msgid "never used"
msgstr ""
#: templates/users/fragments/api_tokens.html:68
#, python-format
msgid "expires %(expires)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:70
msgid "no expiry"
msgstr ""
#: templates/users/fragments/api_tokens.html:78
msgid "Revoke"
msgstr ""
#: templates/users/fragments/api_tokens.html:84
msgid "Revoke token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:85
msgid "This token will stop working immediately."
msgstr ""
#: templates/users/fragments/api_tokens.html:86
msgid "Yes, revoke it!"
msgstr ""
#: templates/users/fragments/api_tokens.html:99
msgid "Delete token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:100
msgid "This permanently removes the token from the list. It cannot be undone."
msgstr ""
#: templates/users/fragments/api_tokens.html:114
msgid "No API tokens"
msgstr ""
#: templates/users/fragments/edit.html:5 #: templates/users/fragments/edit.html:5
msgid "Edit user" msgid "Edit user"
msgstr "" msgstr ""
+236 -57
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-06 08:15+0000\n" "POT-Creation-Date: 2026-07-04 15:39+0000\n"
"PO-Revision-Date: 2025-11-01 01:17+0000\n" "PO-Revision-Date: 2025-11-01 01:17+0000\n"
"Last-Translator: mlystopad <mlystopadt@gmail.com>\n" "Last-Translator: mlystopad <mlystopadt@gmail.com>\n"
"Language-Team: Ukrainian <https://translations.herculino.com/projects/" "Language-Team: Ukrainian <https://translations.herculino.com/projects/"
@@ -32,8 +32,8 @@ msgstr "Назва групи"
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536 #: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919 #: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978 #: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:242 #: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:400 #: apps/users/forms.py:404
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5 #: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128 #: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update" msgid "Update"
@@ -48,7 +48,7 @@ msgstr "Оновлення"
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886 #: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953 #: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134 #: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:248 apps/users/forms.py:406 #: apps/users/forms.py:252 apps/users/forms.py:410
#: templates/mini_tools/unit_price_calculator.html:168 #: templates/mini_tools/unit_price_calculator.html:168
msgid "Add" msgid "Add"
msgstr "Додати" msgstr "Додати"
@@ -100,7 +100,7 @@ msgstr "Мітки"
#: apps/import_app/models.py:14 apps/rules/models.py:13 #: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248 #: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057 #: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: templates/account_groups/fragments/list.html:22 #: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22 #: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17 #: templates/categories/fragments/table.html:17
#: templates/currencies/fragments/list.html:23 #: templates/currencies/fragments/list.html:23
@@ -357,7 +357,7 @@ msgstr ""
"доступом. Редагувати може лише власник.<br/> Public: Відображається для всіх " "доступом. Редагувати може лише власник.<br/> Public: Відображається для всіх "
"користувачів. Редагувати може лише власник." "користувачів. Редагувати може лише власник."
#: apps/common/forms.py:76 apps/users/forms.py:169 #: apps/common/forms.py:76 apps/users/forms.py:173
msgid "Save" msgid "Save"
msgstr "Зберегти" msgstr "Зберегти"
@@ -549,8 +549,8 @@ msgstr "Обмінний курс"
msgid "Date and Time" msgid "Date and Time"
msgstr "Дата і час" msgstr "Дата і час"
#: apps/currencies/models.py:78 apps/users/models.py:12 #: apps/currencies/models.py:78 apps/users/models.py:17
#: apps/users/models.py:497 #: apps/users/models.py:502
msgid "Auto" msgid "Auto"
msgstr "Авто" msgstr "Авто"
@@ -591,7 +591,9 @@ msgstr "Тип сервісу"
#: templates/entities/fragments/list.html:16 #: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16 #: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16 #: templates/recurring_transactions/fragments/list.html:16
#: templates/tags/fragments/list.html:16 templates/users/fragments/list.html:25 #: templates/tags/fragments/list.html:16
#: templates/users/fragments/api_tokens.html:54
#: templates/users/fragments/list.html:25
msgid "Active" msgid "Active"
msgstr "Активний" msgstr "Активний"
@@ -1607,7 +1609,7 @@ msgstr "Правила транзакцій"
msgid "Yearly" msgid "Yearly"
msgstr "" msgstr ""
#: apps/transactions/models.py:596 apps/users/models.py:464 #: apps/transactions/models.py:596 apps/users/models.py:469
#: templates/includes/sidebar.html:51 #: templates/includes/sidebar.html:51
msgid "Monthly" msgid "Monthly"
msgstr "" msgstr ""
@@ -1798,11 +1800,11 @@ msgid "Installment Plan deleted successfully"
msgstr "" msgstr ""
#: apps/transactions/views/quick_transactions.py:45 #: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:188 #: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:252
msgid "Item added successfully" msgid "Item added successfully"
msgstr "" msgstr ""
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:220 #: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:284
msgid "Item updated successfully" msgid "Item updated successfully"
msgstr "" msgstr ""
@@ -1893,44 +1895,48 @@ msgstr ""
msgid "Transfer added successfully" msgid "Transfer added successfully"
msgstr "" msgstr ""
#: apps/users/admin.py:22 templates/users/fragments/user_settings.html:5 #: apps/users/admin.py:17
msgid "Revoke selected API tokens"
msgstr ""
#: apps/users/admin.py:28 templates/users/fragments/user_settings.html:5
msgid "User Settings" msgid "User Settings"
msgstr "" msgstr ""
#: apps/users/admin.py:23 #: apps/users/admin.py:29
msgid "User Setting" msgid "User Setting"
msgstr "" msgstr ""
#: apps/users/admin.py:48 #: apps/users/admin.py:54
msgid "Personal info" msgid "Personal info"
msgstr "" msgstr ""
#: apps/users/admin.py:50 #: apps/users/admin.py:56
msgid "Permissions" msgid "Permissions"
msgstr "" msgstr ""
#: apps/users/admin.py:61 #: apps/users/admin.py:67
msgid "Important dates" msgid "Important dates"
msgstr "" msgstr ""
#: apps/users/forms.py:24 apps/users/forms.py:28 apps/users/models.py:451 #: apps/users/forms.py:28 apps/users/forms.py:32 apps/users/models.py:456
#: templates/users/login.html:18 #: templates/users/login.html:18
msgid "E-mail" msgid "E-mail"
msgstr "" msgstr ""
#: apps/users/forms.py:35 apps/users/forms.py:40 templates/users/login.html:19 #: apps/users/forms.py:39 apps/users/forms.py:44 templates/users/login.html:19
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: apps/users/forms.py:47 #: apps/users/forms.py:51
msgid "Invalid e-mail or password" msgid "Invalid e-mail or password"
msgstr "" msgstr ""
#: apps/users/forms.py:48 #: apps/users/forms.py:52
msgid "This account is deactivated" msgid "This account is deactivated"
msgstr "" msgstr ""
#: apps/users/forms.py:64 apps/users/forms.py:77 apps/users/forms.py:99 #: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98 #: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245 #: templates/monthly_overview/pages/overview.html:245
#: templates/transactions/pages/transactions.html:47 #: templates/transactions/pages/transactions.html:47
@@ -1938,25 +1944,25 @@ msgstr ""
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: apps/users/forms.py:107 apps/users/models.py:484 #: apps/users/forms.py:111 apps/users/models.py:489
msgid "Date Format" msgid "Date Format"
msgstr "" msgstr ""
#: apps/users/forms.py:112 apps/users/models.py:489 #: apps/users/forms.py:116 apps/users/models.py:494
msgid "Datetime Format" msgid "Datetime Format"
msgstr "" msgstr ""
#: apps/users/forms.py:118 apps/users/models.py:492 #: apps/users/forms.py:122 apps/users/models.py:497
msgid "Number Format" msgid "Number Format"
msgstr "" msgstr ""
#: apps/users/forms.py:125 #: apps/users/forms.py:129
#, fuzzy #, fuzzy
#| msgid "Target Accounts" #| msgid "Target Accounts"
msgid "Default Account" msgid "Default Account"
msgstr "Цільові Рахунки" msgstr "Цільові Рахунки"
#: apps/users/forms.py:174 #: apps/users/forms.py:178
#, python-format #, python-format
msgid "" msgid ""
"This changes the language (if available) and how numbers and dates are " "This changes the language (if available) and how numbers and dates are "
@@ -1964,131 +1970,221 @@ msgid ""
"Consider helping translate WYGIWYH to your language at %(translation_link)s" "Consider helping translate WYGIWYH to your language at %(translation_link)s"
msgstr "" msgstr ""
#: apps/users/forms.py:183 #: apps/users/forms.py:187
msgid "New Password" msgid "New Password"
msgstr "" msgstr ""
#: apps/users/forms.py:186 #: apps/users/forms.py:190
msgid "Leave blank to keep the current password." msgid "Leave blank to keep the current password."
msgstr "" msgstr ""
#: apps/users/forms.py:189 #: apps/users/forms.py:193
msgid "Confirm New Password" msgid "Confirm New Password"
msgstr "" msgstr ""
#: apps/users/forms.py:201 apps/users/forms.py:358 #: apps/users/forms.py:205 apps/users/forms.py:362
msgid "" msgid ""
"Designates whether this user should be treated as active. Unselect this " "Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts." "instead of deleting accounts."
msgstr "" msgstr ""
#: apps/users/forms.py:204 apps/users/forms.py:361 #: apps/users/forms.py:208 apps/users/forms.py:365
msgid "" msgid ""
"Designates that this user has all permissions without explicitly assigning " "Designates that this user has all permissions without explicitly assigning "
"them." "them."
msgstr "" msgstr ""
#: apps/users/forms.py:271 #: apps/users/forms.py:275
msgid "This email address is already in use by another account." msgid "This email address is already in use by another account."
msgstr "" msgstr ""
#: apps/users/forms.py:279 #: apps/users/forms.py:283
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "" msgstr ""
#: apps/users/forms.py:281 #: apps/users/forms.py:285
msgid "Please confirm your new password." msgid "Please confirm your new password."
msgstr "" msgstr ""
#: apps/users/forms.py:283 #: apps/users/forms.py:287
msgid "Please enter the new password first." msgid "Please enter the new password first."
msgstr "" msgstr ""
#: apps/users/forms.py:303 #: apps/users/forms.py:307
msgid "You cannot deactivate your own account using this form." msgid "You cannot deactivate your own account using this form."
msgstr "" msgstr ""
#: apps/users/forms.py:316 #: apps/users/forms.py:320
msgid "Cannot remove status from the last superuser." msgid "Cannot remove status from the last superuser."
msgstr "" msgstr ""
#: apps/users/forms.py:322 #: apps/users/forms.py:326
msgid "You cannot remove your own superuser status using this form." msgid "You cannot remove your own superuser status using this form."
msgstr "" msgstr ""
#: apps/users/forms.py:415 #: apps/users/forms.py:419
msgid "A user with this email address already exists." msgid "A user with this email address already exists."
msgstr "" msgstr ""
#: apps/users/models.py:465 #: apps/users/forms.py:439
#, fuzzy
#| msgid "Group name"
msgid "Token name"
msgstr "Назва групи"
#: apps/users/forms.py:441
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
#, fuzzy
#| msgid "Create transaction"
msgid "Create token"
msgstr "Створити транзакцію"
#: apps/users/models.py:470
msgid "Yearly by currency" msgid "Yearly by currency"
msgstr "" msgstr ""
#: apps/users/models.py:466 #: apps/users/models.py:471
msgid "Yearly by account" msgid "Yearly by account"
msgstr "" msgstr ""
#: apps/users/models.py:467 templates/net_worth/net_worth.html:9 #: apps/users/models.py:472 templates/net_worth/net_worth.html:9
msgid "Current Net Worth" msgid "Current Net Worth"
msgstr "" msgstr ""
#: apps/users/models.py:468 templates/net_worth/net_worth.html:11 #: apps/users/models.py:473 templates/net_worth/net_worth.html:11
msgid "Projected Net Worth" msgid "Projected Net Worth"
msgstr "" msgstr ""
#: apps/users/models.py:469 #: apps/users/models.py:474
msgid "All Transactions" msgid "All Transactions"
msgstr "" msgstr ""
#: apps/users/models.py:470 templates/includes/sidebar.html:63 #: apps/users/models.py:475 templates/includes/sidebar.html:63
msgid "Calendar" msgid "Calendar"
msgstr "" msgstr ""
#: apps/users/models.py:480 #: apps/users/models.py:485
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: apps/users/models.py:499 #: apps/users/models.py:504
msgid "Language" msgid "Language"
msgstr "" msgstr ""
#: apps/users/models.py:505 #: apps/users/models.py:510
msgid "Time Zone" msgid "Time Zone"
msgstr "" msgstr ""
#: apps/users/models.py:511 #: apps/users/models.py:516
msgid "Start page" msgid "Start page"
msgstr "" msgstr ""
#: apps/users/models.py:516 #: apps/users/models.py:521
#, fuzzy #, fuzzy
msgid "Default account" msgid "Default account"
msgstr "Рахунок активу" msgstr "Рахунок активу"
#: apps/users/models.py:517 #: apps/users/models.py:522
msgid "Selects the account by default when creating new transactions" msgid "Selects the account by default when creating new transactions"
msgstr "" msgstr ""
#: apps/users/views.py:67 #: apps/users/models.py:570
#, fuzzy
#| msgid "Users"
msgid "User"
msgstr "Користувачі"
#: apps/users/models.py:577
msgid "Token key"
msgstr ""
#: apps/users/models.py:579
msgid "Token hash"
msgstr ""
#: apps/users/models.py:583
msgid "Last used at"
msgstr ""
#: apps/users/models.py:588
msgid "Expires at"
msgstr ""
#: apps/users/models.py:593
msgid "Revoked at"
msgstr ""
#: apps/users/models.py:595
#, fuzzy
#| msgid "Create transaction"
msgid "Created at"
msgstr "Створити транзакцію"
#: apps/users/models.py:596
#, fuzzy
#| msgid "Update"
msgid "Updated at"
msgstr "Оновлення"
#: apps/users/models.py:606
#, fuzzy
#| msgid "API Key"
msgid "API token"
msgstr "Ключ API"
#: apps/users/models.py:607
msgid "API tokens"
msgstr ""
#: apps/users/views.py:69
msgid "Transaction amounts are now hidden" msgid "Transaction amounts are now hidden"
msgstr "" msgstr ""
#: apps/users/views.py:70 #: apps/users/views.py:72
msgid "Transaction amounts are now displayed" msgid "Transaction amounts are now displayed"
msgstr "" msgstr ""
#: apps/users/views.py:88 #: apps/users/views.py:90
msgid "Sounds are now muted" msgid "Sounds are now muted"
msgstr "" msgstr ""
#: apps/users/views.py:91 #: apps/users/views.py:93
msgid "Sounds will now play" msgid "Sounds will now play"
msgstr "" msgstr ""
#: apps/users/views.py:107 #: apps/users/views.py:109
msgid "Your settings have been updated" msgid "Your settings have been updated"
msgstr "" msgstr ""
#: apps/users/views.py:148
#, fuzzy
#| msgid "Account deleted successfully"
msgid "API token created successfully"
msgstr "Рахунок успішно видалено"
#: apps/users/views.py:167
#, fuzzy
#| msgid "Account deleted successfully"
msgid "API token revoked successfully"
msgstr "Рахунок успішно видалено"
#: apps/users/views.py:178
#, fuzzy
#| msgid "Account deleted successfully"
msgid "API token deleted successfully"
msgstr "Рахунок успішно видалено"
#: templates/account_groups/fragments/add.html:5 #: templates/account_groups/fragments/add.html:5
msgid "Add account group" msgid "Add account group"
msgstr "" msgstr ""
@@ -2186,6 +2282,7 @@ msgstr ""
#: templates/rules/fragments/transaction_rule/view.html:92 #: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133 #: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51 #: templates/tags/fragments/table.html:51
#: templates/users/fragments/api_tokens.html:93
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
@@ -2263,6 +2360,7 @@ msgstr ""
#: templates/rules/fragments/transaction_rule/view.html:98 #: templates/rules/fragments/transaction_rule/view.html:98
#: templates/tags/fragments/table.html:57 #: templates/tags/fragments/table.html:57
#: templates/transactions/fragments/attachments.html:22 #: templates/transactions/fragments/attachments.html:22
#: templates/users/fragments/api_tokens.html:101
msgid "Yes, delete it!" msgid "Yes, delete it!"
msgstr "" msgstr ""
@@ -3267,6 +3365,10 @@ msgstr ""
msgid "This is a demo!" msgid "This is a demo!"
msgstr "" msgstr ""
#: templates/layouts/base.html:37
msgid "Any data you add here will be wiped in 24hrs or less"
msgstr ""
#: templates/mini_tools/currency_converter/currency_converter.html:57 #: templates/mini_tools/currency_converter/currency_converter.html:57
msgid "Invert" msgid "Invert"
msgstr "" msgstr ""
@@ -3641,6 +3743,83 @@ msgstr ""
msgid "Add user" msgid "Add user"
msgstr "Додати користувача" msgstr "Додати користувача"
#: templates/users/fragments/api_tokens.html:5
msgid "API Tokens"
msgstr ""
#: templates/users/fragments/api_tokens.html:7
msgid ""
"Use these tokens for automations such as n8n. The raw token is shown only "
"once after creation."
msgstr ""
#: templates/users/fragments/api_tokens.html:14
msgid "Copy this token now"
msgstr ""
#: templates/users/fragments/api_tokens.html:16
msgid "It will not be shown again after this response."
msgstr ""
#: templates/users/fragments/api_tokens.html:31
msgid "Copy"
msgstr ""
#: templates/users/fragments/api_tokens.html:52
msgid "Revoked"
msgstr ""
#: templates/users/fragments/api_tokens.html:59
#, python-format
msgid "Created %(created)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:62
#, python-format
msgid "last used %(used)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:64
msgid "never used"
msgstr ""
#: templates/users/fragments/api_tokens.html:68
#, python-format
msgid "expires %(expires)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:70
msgid "no expiry"
msgstr ""
#: templates/users/fragments/api_tokens.html:78
msgid "Revoke"
msgstr ""
#: templates/users/fragments/api_tokens.html:84
msgid "Revoke token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:85
msgid "This token will stop working immediately."
msgstr ""
#: templates/users/fragments/api_tokens.html:86
msgid "Yes, revoke it!"
msgstr ""
#: templates/users/fragments/api_tokens.html:99
msgid "Delete token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:100
msgid "This permanently removes the token from the list. It cannot be undone."
msgstr ""
#: templates/users/fragments/api_tokens.html:114
msgid "No API tokens"
msgstr ""
#: templates/users/fragments/edit.html:5 #: templates/users/fragments/edit.html:5
msgid "Edit user" msgid "Edit user"
msgstr "Редагувати користувача" msgstr "Редагувати користувача"
+242 -60
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-06 08:15+0000\n" "POT-Creation-Date: 2026-07-04 15:39+0000\n"
"PO-Revision-Date: 2025-10-08 16:17+0000\n" "PO-Revision-Date: 2025-10-08 16:17+0000\n"
"Last-Translator: doody <doodykimo@gmail.com>\n" "Last-Translator: doody <doodykimo@gmail.com>\n"
"Language-Team: Chinese (Traditional Han script) <https://translations." "Language-Team: Chinese (Traditional Han script) <https://translations."
@@ -31,8 +31,8 @@ msgstr "群組名稱"
#: apps/transactions/forms.py:417 apps/transactions/forms.py:536 #: apps/transactions/forms.py:417 apps/transactions/forms.py:536
#: apps/transactions/forms.py:880 apps/transactions/forms.py:919 #: apps/transactions/forms.py:880 apps/transactions/forms.py:919
#: apps/transactions/forms.py:947 apps/transactions/forms.py:978 #: apps/transactions/forms.py:947 apps/transactions/forms.py:978
#: apps/transactions/forms.py:1128 apps/users/forms.py:242 #: apps/transactions/forms.py:1128 apps/users/forms.py:246
#: apps/users/forms.py:400 #: apps/users/forms.py:404
#: templates/rules/fragments/transaction_rule/dry_run/updated.html:5 #: templates/rules/fragments/transaction_rule/dry_run/updated.html:5
#: templates/rules/fragments/transaction_rule/view.html:128 #: templates/rules/fragments/transaction_rule/view.html:128
msgid "Update" msgid "Update"
@@ -47,7 +47,7 @@ msgstr "更新"
#: apps/transactions/forms.py:424 apps/transactions/forms.py:886 #: apps/transactions/forms.py:424 apps/transactions/forms.py:886
#: apps/transactions/forms.py:925 apps/transactions/forms.py:953 #: apps/transactions/forms.py:925 apps/transactions/forms.py:953
#: apps/transactions/forms.py:984 apps/transactions/forms.py:1134 #: apps/transactions/forms.py:984 apps/transactions/forms.py:1134
#: apps/users/forms.py:248 apps/users/forms.py:406 #: apps/users/forms.py:252 apps/users/forms.py:410
#: templates/mini_tools/unit_price_calculator.html:168 #: templates/mini_tools/unit_price_calculator.html:168
msgid "Add" msgid "Add"
msgstr "新增" msgstr "新增"
@@ -99,7 +99,7 @@ msgstr "標籤"
#: apps/import_app/models.py:14 apps/rules/models.py:13 #: apps/import_app/models.py:14 apps/rules/models.py:13
#: apps/transactions/models.py:223 apps/transactions/models.py:248 #: apps/transactions/models.py:223 apps/transactions/models.py:248
#: apps/transactions/models.py:272 apps/transactions/models.py:1057 #: apps/transactions/models.py:272 apps/transactions/models.py:1057
#: templates/account_groups/fragments/list.html:22 #: apps/users/models.py:572 templates/account_groups/fragments/list.html:22
#: templates/accounts/fragments/list.html:22 #: templates/accounts/fragments/list.html:22
#: templates/categories/fragments/table.html:17 #: templates/categories/fragments/table.html:17
#: templates/currencies/fragments/list.html:23 #: templates/currencies/fragments/list.html:23
@@ -349,7 +349,7 @@ msgstr ""
"私人:只會顯示給擁有者或著已分享的使用者。只有擁有者可以編輯這個選項。<br/>公" "私人:只會顯示給擁有者或著已分享的使用者。只有擁有者可以編輯這個選項。<br/>公"
"開:所有使用者都可以看到。只有擁有者可以編輯這個選項。" "開:所有使用者都可以看到。只有擁有者可以編輯這個選項。"
#: apps/common/forms.py:76 apps/users/forms.py:169 #: apps/common/forms.py:76 apps/users/forms.py:173
msgid "Save" msgid "Save"
msgstr "儲存" msgstr "儲存"
@@ -529,8 +529,8 @@ msgstr "換算匯率"
msgid "Date and Time" msgid "Date and Time"
msgstr "日期和時間" msgstr "日期和時間"
#: apps/currencies/models.py:78 apps/users/models.py:12 #: apps/currencies/models.py:78 apps/users/models.py:17
#: apps/users/models.py:497 #: apps/users/models.py:502
msgid "Auto" msgid "Auto"
msgstr "自動" msgstr "自動"
@@ -571,7 +571,9 @@ msgstr "服務類型"
#: templates/entities/fragments/list.html:16 #: templates/entities/fragments/list.html:16
#: templates/installment_plans/fragments/list.html:16 #: templates/installment_plans/fragments/list.html:16
#: templates/recurring_transactions/fragments/list.html:16 #: templates/recurring_transactions/fragments/list.html:16
#: templates/tags/fragments/list.html:16 templates/users/fragments/list.html:25 #: templates/tags/fragments/list.html:16
#: templates/users/fragments/api_tokens.html:54
#: templates/users/fragments/list.html:25
msgid "Active" msgid "Active"
msgstr "啟用" msgstr "啟用"
@@ -1577,7 +1579,7 @@ msgstr "交易標籤"
msgid "Yearly" msgid "Yearly"
msgstr "年" msgstr "年"
#: apps/transactions/models.py:596 apps/users/models.py:464 #: apps/transactions/models.py:596 apps/users/models.py:469
#: templates/includes/sidebar.html:51 #: templates/includes/sidebar.html:51
msgid "Monthly" msgid "Monthly"
msgstr "月" msgstr "月"
@@ -1763,11 +1765,11 @@ msgid "Installment Plan deleted successfully"
msgstr "成功刪除分期付款計劃" msgstr "成功刪除分期付款計劃"
#: apps/transactions/views/quick_transactions.py:45 #: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:188 #: apps/transactions/views/quick_transactions.py:224 apps/users/views.py:252
msgid "Item added successfully" msgid "Item added successfully"
msgstr "成功新增項目" msgstr "成功新增項目"
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:220 #: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:284
msgid "Item updated successfully" msgid "Item updated successfully"
msgstr "成功更新項目" msgstr "成功更新項目"
@@ -1855,44 +1857,48 @@ msgstr "成功復原交易"
msgid "Transfer added successfully" msgid "Transfer added successfully"
msgstr "成功新增轉帳" msgstr "成功新增轉帳"
#: apps/users/admin.py:22 templates/users/fragments/user_settings.html:5 #: apps/users/admin.py:17
msgid "Revoke selected API tokens"
msgstr ""
#: apps/users/admin.py:28 templates/users/fragments/user_settings.html:5
msgid "User Settings" msgid "User Settings"
msgstr "使用者設定" msgstr "使用者設定"
#: apps/users/admin.py:23 #: apps/users/admin.py:29
msgid "User Setting" msgid "User Setting"
msgstr "使用者設定" msgstr "使用者設定"
#: apps/users/admin.py:48 #: apps/users/admin.py:54
msgid "Personal info" msgid "Personal info"
msgstr "個人資訊" msgstr "個人資訊"
#: apps/users/admin.py:50 #: apps/users/admin.py:56
msgid "Permissions" msgid "Permissions"
msgstr "權限" msgstr "權限"
#: apps/users/admin.py:61 #: apps/users/admin.py:67
msgid "Important dates" msgid "Important dates"
msgstr "重要的日子" msgstr "重要的日子"
#: apps/users/forms.py:24 apps/users/forms.py:28 apps/users/models.py:451 #: apps/users/forms.py:28 apps/users/forms.py:32 apps/users/models.py:456
#: templates/users/login.html:18 #: templates/users/login.html:18
msgid "E-mail" msgid "E-mail"
msgstr "電子郵件" msgstr "電子郵件"
#: apps/users/forms.py:35 apps/users/forms.py:40 templates/users/login.html:19 #: apps/users/forms.py:39 apps/users/forms.py:44 templates/users/login.html:19
msgid "Password" msgid "Password"
msgstr "密碼" msgstr "密碼"
#: apps/users/forms.py:47 #: apps/users/forms.py:51
msgid "Invalid e-mail or password" msgid "Invalid e-mail or password"
msgstr "無效的電子郵件或著密碼" msgstr "無效的電子郵件或著密碼"
#: apps/users/forms.py:48 #: apps/users/forms.py:52
msgid "This account is deactivated" msgid "This account is deactivated"
msgstr "這個帳號已經被停用" msgstr "這個帳號已經被停用"
#: apps/users/forms.py:64 apps/users/forms.py:77 apps/users/forms.py:99 #: apps/users/forms.py:68 apps/users/forms.py:81 apps/users/forms.py:103
#: templates/monthly_overview/pages/overview.html:98 #: templates/monthly_overview/pages/overview.html:98
#: templates/monthly_overview/pages/overview.html:245 #: templates/monthly_overview/pages/overview.html:245
#: templates/transactions/pages/transactions.html:47 #: templates/transactions/pages/transactions.html:47
@@ -1900,25 +1906,25 @@ msgstr "這個帳號已經被停用"
msgid "Default" msgid "Default"
msgstr "預設" msgstr "預設"
#: apps/users/forms.py:107 apps/users/models.py:484 #: apps/users/forms.py:111 apps/users/models.py:489
msgid "Date Format" msgid "Date Format"
msgstr "日期格式" msgstr "日期格式"
#: apps/users/forms.py:112 apps/users/models.py:489 #: apps/users/forms.py:116 apps/users/models.py:494
msgid "Datetime Format" msgid "Datetime Format"
msgstr "日期時間格式" msgstr "日期時間格式"
#: apps/users/forms.py:118 apps/users/models.py:492 #: apps/users/forms.py:122 apps/users/models.py:497
msgid "Number Format" msgid "Number Format"
msgstr "數字格式" msgstr "數字格式"
#: apps/users/forms.py:125 #: apps/users/forms.py:129
#, fuzzy #, fuzzy
#| msgid "Target Accounts" #| msgid "Target Accounts"
msgid "Default Account" msgid "Default Account"
msgstr "目標帳戶" msgstr "目標帳戶"
#: apps/users/forms.py:174 #: apps/users/forms.py:178
#, python-format #, python-format
msgid "" msgid ""
"This changes the language (if available) and how numbers and dates are " "This changes the language (if available) and how numbers and dates are "
@@ -1928,109 +1934,133 @@ msgstr ""
"這會改變語言(如果支援的話)以及數字和日期的顯示方式\n" "這會改變語言(如果支援的話)以及數字和日期的顯示方式\n"
"若您有興趣也可以到%(translation_link)s幫助WYGIWYH進行翻譯" "若您有興趣也可以到%(translation_link)s幫助WYGIWYH進行翻譯"
#: apps/users/forms.py:183 #: apps/users/forms.py:187
msgid "New Password" msgid "New Password"
msgstr "新密碼" msgstr "新密碼"
#: apps/users/forms.py:186 #: apps/users/forms.py:190
msgid "Leave blank to keep the current password." msgid "Leave blank to keep the current password."
msgstr "若不想改變密碼請留白。" msgstr "若不想改變密碼請留白。"
#: apps/users/forms.py:189 #: apps/users/forms.py:193
msgid "Confirm New Password" msgid "Confirm New Password"
msgstr "確認新密碼" msgstr "確認新密碼"
#: apps/users/forms.py:201 apps/users/forms.py:358 #: apps/users/forms.py:205 apps/users/forms.py:362
msgid "" msgid ""
"Designates whether this user should be treated as active. Unselect this " "Designates whether this user should be treated as active. Unselect this "
"instead of deleting accounts." "instead of deleting accounts."
msgstr "指定這個使用者是否為啟用狀態,如果沒有選擇的話帳號將無法使用。" msgstr "指定這個使用者是否為啟用狀態,如果沒有選擇的話帳號將無法使用。"
#: apps/users/forms.py:204 apps/users/forms.py:361 #: apps/users/forms.py:208 apps/users/forms.py:365
msgid "" msgid ""
"Designates that this user has all permissions without explicitly assigning " "Designates that this user has all permissions without explicitly assigning "
"them." "them."
msgstr "指定這個使用者是否擁有全部的權限。" msgstr "指定這個使用者是否擁有全部的權限。"
#: apps/users/forms.py:271 #: apps/users/forms.py:275
msgid "This email address is already in use by another account." msgid "This email address is already in use by another account."
msgstr "這個email已經被另一個帳號使用。" msgstr "這個email已經被另一個帳號使用。"
#: apps/users/forms.py:279 #: apps/users/forms.py:283
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "兩個密碼欄位的內容不符。" msgstr "兩個密碼欄位的內容不符。"
#: apps/users/forms.py:281 #: apps/users/forms.py:285
msgid "Please confirm your new password." msgid "Please confirm your new password."
msgstr "請確認你的新密碼。" msgstr "請確認你的新密碼。"
#: apps/users/forms.py:283 #: apps/users/forms.py:287
msgid "Please enter the new password first." msgid "Please enter the new password first."
msgstr "請先輸入新的密碼。" msgstr "請先輸入新的密碼。"
#: apps/users/forms.py:303 #: apps/users/forms.py:307
msgid "You cannot deactivate your own account using this form." msgid "You cannot deactivate your own account using this form."
msgstr "無法透過這個頁面停止自己的帳號。" msgstr "無法透過這個頁面停止自己的帳號。"
#: apps/users/forms.py:316 #: apps/users/forms.py:320
msgid "Cannot remove status from the last superuser." msgid "Cannot remove status from the last superuser."
msgstr "最後一位超級使用者無法移除這個權限。" msgstr "最後一位超級使用者無法移除這個權限。"
#: apps/users/forms.py:322 #: apps/users/forms.py:326
msgid "You cannot remove your own superuser status using this form." msgid "You cannot remove your own superuser status using this form."
msgstr "無法使用這個頁面移除自己的超級使用者權限。" msgstr "無法使用這個頁面移除自己的超級使用者權限。"
#: apps/users/forms.py:415 #: apps/users/forms.py:419
msgid "A user with this email address already exists." msgid "A user with this email address already exists."
msgstr "這個電子郵件的使用者已經存在。" msgstr "這個電子郵件的使用者已經存在。"
#: apps/users/models.py:465 #: apps/users/forms.py:439
#, fuzzy
#| msgid "Tag name"
msgid "Token name"
msgstr "標籤名稱"
#: apps/users/forms.py:441
msgid "Use a descriptive name such as n8n, Home Assistant, or backup job."
msgstr ""
#: apps/users/forms.py:447
msgid "Expires in days"
msgstr ""
#: apps/users/forms.py:448
msgid "Leave empty for a non-expiring token."
msgstr ""
#: apps/users/forms.py:463
#, fuzzy
#| msgid "Create transaction"
msgid "Create token"
msgstr "建立交易"
#: apps/users/models.py:470
msgid "Yearly by currency" msgid "Yearly by currency"
msgstr "以貨幣排序的年報" msgstr "以貨幣排序的年報"
#: apps/users/models.py:466 #: apps/users/models.py:471
msgid "Yearly by account" msgid "Yearly by account"
msgstr "以帳戶為主的年報" msgstr "以帳戶為主的年報"
#: apps/users/models.py:467 templates/net_worth/net_worth.html:9 #: apps/users/models.py:472 templates/net_worth/net_worth.html:9
msgid "Current Net Worth" msgid "Current Net Worth"
msgstr "目前的淨資產" msgstr "目前的淨資產"
#: apps/users/models.py:468 templates/net_worth/net_worth.html:11 #: apps/users/models.py:473 templates/net_worth/net_worth.html:11
msgid "Projected Net Worth" msgid "Projected Net Worth"
msgstr "預期的淨資產" msgstr "預期的淨資產"
#: apps/users/models.py:469 #: apps/users/models.py:474
msgid "All Transactions" msgid "All Transactions"
msgstr "全部的交易" msgstr "全部的交易"
#: apps/users/models.py:470 templates/includes/sidebar.html:63 #: apps/users/models.py:475 templates/includes/sidebar.html:63
msgid "Calendar" msgid "Calendar"
msgstr "行事曆" msgstr "行事曆"
#: apps/users/models.py:480 #: apps/users/models.py:485
msgid "Volume" msgid "Volume"
msgstr "音量" msgstr "音量"
#: apps/users/models.py:499 #: apps/users/models.py:504
msgid "Language" msgid "Language"
msgstr "語言" msgstr "語言"
#: apps/users/models.py:505 #: apps/users/models.py:510
msgid "Time Zone" msgid "Time Zone"
msgstr "時區" msgstr "時區"
#: apps/users/models.py:511 #: apps/users/models.py:516
msgid "Start page" msgid "Start page"
msgstr "起始頁面" msgstr "起始頁面"
#: apps/users/models.py:516 #: apps/users/models.py:521
#, fuzzy #, fuzzy
#| msgid "Asset account" #| msgid "Asset account"
msgid "Default account" msgid "Default account"
msgstr "資產帳戶" msgstr "資產帳戶"
#: apps/users/models.py:517 #: apps/users/models.py:522
#, fuzzy #, fuzzy
#| msgid "" #| msgid ""
#| "Deactivated tags won't be able to be selected when creating new " #| "Deactivated tags won't be able to be selected when creating new "
@@ -2038,26 +2068,94 @@ msgstr "資產帳戶"
msgid "Selects the account by default when creating new transactions" msgid "Selects the account by default when creating new transactions"
msgstr "新增交易的時候無法選擇停用的標籤" msgstr "新增交易的時候無法選擇停用的標籤"
#: apps/users/views.py:67 #: apps/users/models.py:570
#, fuzzy
#| msgid "Users"
msgid "User"
msgstr "使用者"
#: apps/users/models.py:577
msgid "Token key"
msgstr ""
#: apps/users/models.py:579
msgid "Token hash"
msgstr ""
#: apps/users/models.py:583
#, fuzzy
#| msgid "Last Generated Date"
msgid "Last used at"
msgstr "最後產生的日期"
#: apps/users/models.py:588
msgid "Expires at"
msgstr ""
#: apps/users/models.py:593
msgid "Revoked at"
msgstr ""
#: apps/users/models.py:595
#, fuzzy
#| msgid "Create"
msgid "Created at"
msgstr "建立"
#: apps/users/models.py:596
#, fuzzy
#| msgid "Update"
msgid "Updated at"
msgstr "更新"
#: apps/users/models.py:606
#, fuzzy
#| msgid "API Key"
msgid "API token"
msgstr "API金鑰"
#: apps/users/models.py:607
msgid "API tokens"
msgstr ""
#: apps/users/views.py:69
msgid "Transaction amounts are now hidden" msgid "Transaction amounts are now hidden"
msgstr "已隱藏交易金額" msgstr "已隱藏交易金額"
#: apps/users/views.py:70 #: apps/users/views.py:72
msgid "Transaction amounts are now displayed" msgid "Transaction amounts are now displayed"
msgstr "已顯示交易金額" msgstr "已顯示交易金額"
#: apps/users/views.py:88 #: apps/users/views.py:90
msgid "Sounds are now muted" msgid "Sounds are now muted"
msgstr "音效已調整為靜音" msgstr "音效已調整為靜音"
#: apps/users/views.py:91 #: apps/users/views.py:93
msgid "Sounds will now play" msgid "Sounds will now play"
msgstr "音效已恢復播放" msgstr "音效已恢復播放"
#: apps/users/views.py:107 #: apps/users/views.py:109
msgid "Your settings have been updated" msgid "Your settings have been updated"
msgstr "您的設定已經更新" msgstr "您的設定已經更新"
#: apps/users/views.py:148
#, fuzzy
#| msgid "Action updated successfully"
msgid "API token created successfully"
msgstr "成功更新行為"
#: apps/users/views.py:167
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token revoked successfully"
msgstr "成功刪除行為"
#: apps/users/views.py:178
#, fuzzy
#| msgid "Action deleted successfully"
msgid "API token deleted successfully"
msgstr "成功刪除行為"
#: templates/account_groups/fragments/add.html:5 #: templates/account_groups/fragments/add.html:5
msgid "Add account group" msgid "Add account group"
msgstr "新增帳戶組" msgstr "新增帳戶組"
@@ -2155,6 +2253,7 @@ msgstr "分享"
#: templates/rules/fragments/transaction_rule/view.html:92 #: templates/rules/fragments/transaction_rule/view.html:92
#: templates/rules/fragments/transaction_rule/view.html:133 #: templates/rules/fragments/transaction_rule/view.html:133
#: templates/tags/fragments/table.html:51 #: templates/tags/fragments/table.html:51
#: templates/users/fragments/api_tokens.html:93
msgid "Delete" msgid "Delete"
msgstr "刪除" msgstr "刪除"
@@ -2232,6 +2331,7 @@ msgstr "您將無法復原這個行為!"
#: templates/rules/fragments/transaction_rule/view.html:98 #: templates/rules/fragments/transaction_rule/view.html:98
#: templates/tags/fragments/table.html:57 #: templates/tags/fragments/table.html:57
#: templates/transactions/fragments/attachments.html:22 #: templates/transactions/fragments/attachments.html:22
#: templates/users/fragments/api_tokens.html:101
msgid "Yes, delete it!" msgid "Yes, delete it!"
msgstr "確認,刪除它!" msgstr "確認,刪除它!"
@@ -3250,6 +3350,10 @@ msgstr "沒有分期付款計劃"
msgid "This is a demo!" msgid "This is a demo!"
msgstr "這是展示!" msgstr "這是展示!"
#: templates/layouts/base.html:37
msgid "Any data you add here will be wiped in 24hrs or less"
msgstr "任何新增的資料都會在24小時內被刪除"
#: templates/mini_tools/currency_converter/currency_converter.html:57 #: templates/mini_tools/currency_converter/currency_converter.html:57
msgid "Invert" msgid "Invert"
msgstr "交換" msgstr "交換"
@@ -3628,6 +3732,87 @@ msgstr "未變更"
msgid "Add user" msgid "Add user"
msgstr "新增使用者" msgstr "新增使用者"
#: templates/users/fragments/api_tokens.html:5
msgid "API Tokens"
msgstr ""
#: templates/users/fragments/api_tokens.html:7
msgid ""
"Use these tokens for automations such as n8n. The raw token is shown only "
"once after creation."
msgstr ""
#: templates/users/fragments/api_tokens.html:14
msgid "Copy this token now"
msgstr ""
#: templates/users/fragments/api_tokens.html:16
msgid "It will not be shown again after this response."
msgstr ""
#: templates/users/fragments/api_tokens.html:31
msgid "Copy"
msgstr ""
#: templates/users/fragments/api_tokens.html:52
msgid "Revoked"
msgstr ""
#: templates/users/fragments/api_tokens.html:59
#, python-format
msgid "Created %(created)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:62
#, python-format
msgid "last used %(used)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:64
msgid "never used"
msgstr ""
#: templates/users/fragments/api_tokens.html:68
#, python-format
msgid "expires %(expires)s"
msgstr ""
#: templates/users/fragments/api_tokens.html:70
msgid "no expiry"
msgstr ""
#: templates/users/fragments/api_tokens.html:78
msgid "Revoke"
msgstr ""
#: templates/users/fragments/api_tokens.html:84
msgid "Revoke token?"
msgstr ""
#: templates/users/fragments/api_tokens.html:85
msgid "This token will stop working immediately."
msgstr ""
#: templates/users/fragments/api_tokens.html:86
#, fuzzy
#| msgid "Yes, refresh it!"
msgid "Yes, revoke it!"
msgstr "確定,重新整理!"
#: templates/users/fragments/api_tokens.html:99
#, fuzzy
#| msgid "Deleted At"
msgid "Delete token?"
msgstr "刪除時間"
#: templates/users/fragments/api_tokens.html:100
msgid "This permanently removes the token from the list. It cannot be undone."
msgstr ""
#: templates/users/fragments/api_tokens.html:114
msgid "No API tokens"
msgstr ""
#: templates/users/fragments/edit.html:5 #: templates/users/fragments/edit.html:5
msgid "Edit user" msgid "Edit user"
msgstr "編輯使用者" msgstr "編輯使用者"
@@ -3680,9 +3865,6 @@ msgstr "登入"
msgid "Yearly Overview" msgid "Yearly Overview"
msgstr "年份總覽" msgstr "年份總覽"
#~ msgid "Any data you add here will be wiped in 24hrs or less"
#~ msgstr "任何新增的資料都會在24小時內被刪除"
#, fuzzy #, fuzzy
#~| msgid "Are you sure?" #~| msgid "Are you sure?"
#~ msgid " Are you sure?" #~ msgid " Are you sure?"
+1 -2
View File
@@ -34,8 +34,7 @@
{% if demo_mode %} {% if demo_mode %}
<div class="px-3 m-0" id="demo-mode-alert" hx-preserve> <div class="px-3 m-0" id="demo-mode-alert" hx-preserve>
<div class="alert alert-warning my-3 relative" role="alert"> <div class="alert alert-warning my-3 relative" role="alert">
<strong>{% trans "This is a demo!" %}</strong> {% trans "Any data you add here will be wiped in 24hrs or less" <strong>{% trans "This is a demo!" %}</strong>{% trans "Any data you add here will be wiped in 24hrs or less" %}
%}
<button type="button" class="btn btn-sm btn-ghost absolute right-2 top-1/2 -translate-y-1/2" <button type="button" class="btn btn-sm btn-ghost absolute right-2 top-1/2 -translate-y-1/2"
onclick="this.parentElement.style.display='none'" aria-label="Close"></button> onclick="this.parentElement.style.display='none'" aria-label="Close"></button>
</div> </div>
@@ -0,0 +1,116 @@
{% load crispy_forms_tags %}
{% load i18n %}
<div class="mb-3">
<div class="text-lg font-bold font-mono">{% translate "API Tokens" %}</div>
<p class="text-sm opacity-70">
{% translate "Use these tokens for automations such as n8n. The raw token is shown only once after creation." %}
</p>
</div>
{% if raw_token %}
<div class="bg-primary-content p-3 rounded-box">
<div class="w-full">
<div class="font-semibold mb-1">{% translate "Copy this token now" %}</div>
<p class="text-sm opacity-80 mb-3">
{% translate "It will not be shown again after this response." %}
</p>
<div class="join w-full">
<input id="raw-token-value"
type="text"
readonly
value="{{ raw_token }}"
class="input input-sm join-item w-full"
_="on focus call me.select()" />
<button type="button"
class="btn btn-sm btn-secondary join-item"
_="on click call navigator.clipboard.writeText(#raw-token-value.value)
then put 'Copied!' into me
then wait 1.5s
then put 'Copy' into me">
{% translate "Copy" %}
</button>
</div>
</div>
</div>
{% endif %}
<form hx-post="{% url 'user_api_token_add' %}" hx-target="#api-token-settings" hx-swap="innerHTML" novalidate>
{% crispy api_token_form %}
</form>
{% if api_tokens %}
<div class="overflow-x-auto mt-4">
<table class="table table-zebra">
<tbody>
{% for token in api_tokens %}
<tr>
<td>
<div class="flex items-center gap-2 flex-wrap">
<span class="font-medium font-mono">{{ token.name }}</span>
{% if token.revoked_at %}
<span class="badge badge-sm badge-ghost">{% translate "Revoked" %}</span>
{% else %}
<span class="badge badge-sm badge-success">{% translate "Active" %}</span>
{% endif %}
</div>
<div class="text-xs opacity-60 font-mono break-all mt-1">{{ token.token_key }}</div>
<div class="text-xs opacity-60">
{% blocktranslate with created=token.created_at|date:"Y-m-d" %}Created {{ created }}{% endblocktranslate %}
·
{% if token.last_used_at %}
{% blocktranslate with used=token.last_used_at|date:"Y-m-d H:i" %}last used {{ used }}{% endblocktranslate %}
{% else %}
{% translate "never used" %}
{% endif %}
·
{% if token.expires_at %}
{% blocktranslate with expires=token.expires_at|date:"Y-m-d" %}expires {{ expires }}{% endblocktranslate %}
{% else %}
{% translate "no expiry" %}
{% endif %}
</div>
</td>
<td class="table-col-auto text-right align-top">
{% if not token.revoked_at %}
<a class="btn btn-error btn-sm"
role="button"
data-tippy-content="{% translate 'Revoke' %}"
hx-delete="{% url 'user_api_token_revoke' token_id=token.id %}"
hx-target="#api-token-settings"
hx-swap="innerHTML"
hx-trigger="confirmed"
data-bypass-on-ctrl="true"
data-title="{% translate 'Revoke token?' %}"
data-text="{% translate 'This token will stop working immediately.' %}"
data-confirm-text="{% translate 'Yes, revoke it!' %}"
_="install prompt_swal">
<i class="fa-solid fa-ban fa-fw"></i>
</a>
{% else %}
<a class="btn btn-error btn-sm"
role="button"
data-tippy-content="{% translate 'Delete' %}"
hx-delete="{% url 'user_api_token_delete' token_id=token.id %}"
hx-target="#api-token-settings"
hx-swap="innerHTML"
hx-trigger="confirmed"
data-bypass-on-ctrl="true"
data-title="{% translate 'Delete token?' %}"
data-text="{% translate 'This permanently removes the token from the list. It cannot be undone.' %}"
data-confirm-text="{% translate 'Yes, delete it!' %}"
_="install prompt_swal">
<i class="fa-solid fa-trash fa-fw"></i>
</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<div class="mt-4">
<c-msg.empty title="{% translate "No API tokens" %}" remove-padding></c-msg.empty>
</div>
{% endif %}
@@ -8,4 +8,8 @@
<form hx-post="{% url 'user_settings' %}" hx-target="#generic-offcanvas" novalidate> <form hx-post="{% url 'user_settings' %}" hx-target="#generic-offcanvas" novalidate>
{% crispy form %} {% crispy form %}
</form> </form>
<div class="divider my-6"></div>
<div id="api-token-settings">
{% include "users/fragments/api_tokens.html" %}
</div>
{% endblock %} {% endblock %}
+1
View File
@@ -15,5 +15,6 @@ python manage.py migrate
touch /tmp/migrations_complete touch /tmp/migrations_complete
python manage.py setup_users python manage.py setup_users
python manage.py setup_oauth
exec python manage.py runserver 0.0.0.0:$INTERNAL_PORT exec python manage.py runserver 0.0.0.0:$INTERNAL_PORT
+1
View File
@@ -16,5 +16,6 @@ python manage.py migrate
touch /tmp/migrations_complete touch /tmp/migrations_complete
python manage.py setup_users python manage.py setup_users
python manage.py setup_oauth
exec gunicorn WYGIWYH.wsgi:application --bind 0.0.0.0:$INTERNAL_PORT --timeout 600 exec gunicorn WYGIWYH.wsgi:application --bind 0.0.0.0:$INTERNAL_PORT --timeout 600
+297 -911
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -42,7 +42,7 @@
"tippy.js": "^6.3.7", "tippy.js": "^6.3.7",
"tom-select": "^2.6.1", "tom-select": "^2.6.1",
"tw-bootstrap-grid": "^1.4.0", "tw-bootstrap-grid": "^1.4.0",
"vite": "7.3.2" "vite": "8.0.16"
}, },
"resolutions": { "resolutions": {
"rollup": "npm:@rollup/wasm-node" "rollup": "npm:@rollup/wasm-node"
+1
View File
@@ -16,6 +16,7 @@ dependencies = [
"django-filter==25.2", "django-filter==25.2",
"django-hijack==3.7.8", "django-hijack==3.7.8",
"django-import-export~=4.4.1", "django-import-export~=4.4.1",
"django-oauth-toolkit~=3.0.1",
"django-pwa~=2.0.1", "django-pwa~=2.0.1",
"django-vite==3.1.0", "django-vite==3.1.0",
"djangorestframework~=3.17.1", "djangorestframework~=3.17.1",
Generated
+80 -50
View File
@@ -285,61 +285,61 @@ wheels = [
[[package]] [[package]]
name = "cryptography" name = "cryptography"
version = "48.0.0" version = "48.0.1"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, { name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/9f/a9/db8f313fdcd85d767d4973515e1db101f9c71f95fced83233de224673757/cryptography-48.0.0.tar.gz", hash = "sha256:5c3932f4436d1cccb036cb0eaef46e6e2db91035166f1ad6505c3c9d5a635920", size = 832984, upload-time = "2026-05-04T22:59:38.133Z" } sdist = { url = "https://files.pythonhosted.org/packages/12/45/870e7f4bef50e5f53b9f51d4428aee5290eedf58ba443f16b1ebb7ab8e66/cryptography-48.0.1.tar.gz", hash = "sha256:266f4ee051abb2f725b74ef8072b521ce1feacf685a3364fa6a6b45548db791a", size = 832989, upload-time = "2026-06-09T22:32:31.8Z" }
wheels = [ wheels = [
{ url = "https://files.pythonhosted.org/packages/df/3d/01f6dd9190170a5a241e0e98c2d04be3664a9e6f5b9b872cde63aff1c3dd/cryptography-48.0.0-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:0c558d2cdffd8f4bbb30fc7134c74d2ca9a476f830bb053074498fbc86f41ed6", size = 8001587, upload-time = "2026-05-04T22:57:36.803Z" }, { url = "https://files.pythonhosted.org/packages/1b/bc/ee4137cbbe105652c0ee4252792b78fc8e7afa4b8e61d9d5dc05a7f45731/cryptography-48.0.1-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:3e4a1a3232eef2e6c732827d5722db29a0cc8b27af2a4d865b094cf954be9ca1", size = 8008324, upload-time = "2026-06-09T22:31:00.702Z" },
{ url = "https://files.pythonhosted.org/packages/b2/6e/e90527eef33f309beb811cf7c982c3aeffcce8e3edb178baa4ca3ae4a6fa/cryptography-48.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f5333311663ea94f75dd408665686aaf426563556bb5283554a3539177e03b8c", size = 4690433, upload-time = "2026-05-04T22:57:40.373Z" }, { url = "https://files.pythonhosted.org/packages/d5/85/6379d42181bfc713094f081360fc5784d6c816b599d45e7f082502d173ce/cryptography-48.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:32143b24adb918f078134e1e230f1eb8cc04886b92c28b5f0041aaf3e5699225", size = 4696243, upload-time = "2026-06-09T22:32:33.446Z" },
{ url = "https://files.pythonhosted.org/packages/90/04/673510ed51ddff56575f306cf1617d80411ee76831ccd3097599140efdfe/cryptography-48.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7995ef305d7165c3f11ae07f2517e5a4f1d5c18da1376a0a9ed496336b69e5f3", size = 4710620, upload-time = "2026-05-04T22:57:42.935Z" }, { url = "https://files.pythonhosted.org/packages/9c/87/c85d147b53323c7eb4d850920c8901377323c2a0ff8d79c262d4fee89aa2/cryptography-48.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0d27a5696721ef7a672b8c810f6aded391058e0b9486e63e6d93baf765da691", size = 4713235, upload-time = "2026-06-09T22:31:40.141Z" },
{ url = "https://files.pythonhosted.org/packages/14/d5/e9c4ef932c8d800490c34d8bd589d64a31d5890e27ec9e9ad532be893294/cryptography-48.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:40ba1f85eaa6959837b1d51c9767e230e14612eea4ef110ee8854ada22da1bf5", size = 4696283, upload-time = "2026-05-04T22:57:45.294Z" }, { url = "https://files.pythonhosted.org/packages/79/58/67cbf8cf1ee7c54b439ca07bbecf8362c07afc11a3724fea70f745784add/cryptography-48.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:eb86ce1af36fe65041b6db9a8bb064ee621a7e5fded0f80d475ec243477cd242", size = 4702323, upload-time = "2026-06-09T22:31:42.191Z" },
{ url = "https://files.pythonhosted.org/packages/0c/29/174b9dfb60b12d59ecfc6cfa04bc88c21b42a54f01b8aae09bb6e51e4c7f/cryptography-48.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:369a6348999f94bbd53435c894377b20ab95f25a9065c283570e70150d8abc3c", size = 5296573, upload-time = "2026-05-04T22:57:47.933Z" }, { url = "https://files.pythonhosted.org/packages/89/c6/24266ac10c47f6cd2a865f4446062b466da1d1f10b27189eac00e61bf0c9/cryptography-48.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:b024e784ad6c077ee0147b35ea9cbfc1e34e1fd4c1dcca214c2794d73a12df08", size = 5300085, upload-time = "2026-06-09T22:31:58.703Z" },
{ url = "https://files.pythonhosted.org/packages/95/38/0d29a6fd7d0d1373f0c0c88a04ba20e359b257753ac497564cd660fc1d55/cryptography-48.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a0e692c683f4df67815a2d258b324e66f4738bd7a96a218c826dce4f4bd05d8f", size = 4743677, upload-time = "2026-05-04T22:57:50.067Z" }, { url = "https://files.pythonhosted.org/packages/d2/bb/cc4b78784f97efc8c5874c2a9743708d172be6663024b34a0467885ae0c8/cryptography-48.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3752f2dbc8f07a30aad2932c986cea495b03bb554887828225da104f732852b6", size = 4746137, upload-time = "2026-06-09T22:31:31.01Z" },
{ url = "https://files.pythonhosted.org/packages/30/be/eef653013d5c63b6a490529e0316f9ac14a37602965d4903efed1399f32b/cryptography-48.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:18349bbc56f4743c8b12dc32e2bccb2cf83ee8b69a3bba74ef8ae857e26b3d25", size = 4330808, upload-time = "2026-05-04T22:57:52.301Z" }, { url = "https://files.pythonhosted.org/packages/1f/52/0c44de3f5267f8fbe8e835138017522a333436166e406f0db9b9e6e3033f/cryptography-48.0.1-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:bd81490cd5801d755cf97bb68ac191f14b708470b1c7cf4580f669b9c9264cd8", size = 4333867, upload-time = "2026-06-09T22:32:28.096Z" },
{ url = "https://files.pythonhosted.org/packages/84/9e/500463e87abb7a0a0f9f256ec21123ecde0a7b5541a15e840ea54551fd81/cryptography-48.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e8eac43dfca5c4cccc6dad9a80504436fca53bb9bc3100a2386d730fbe6b602", size = 4695941, upload-time = "2026-05-04T22:57:54.603Z" }, { url = "https://files.pythonhosted.org/packages/9a/2e/772d7adbfa931537bc401640b7cac9976bff689bda187833e5d63b428e49/cryptography-48.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:66fd0771e7b9c6dcd44cf1120690d2338d16d72795cf40cae2786a39eba65429", size = 4701805, upload-time = "2026-06-09T22:31:38.284Z" },
{ url = "https://files.pythonhosted.org/packages/e3/dc/7303087450c2ec9e7fbb750e17c2abfbc658f23cbd0e54009509b7cc4091/cryptography-48.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9ccdac7d40688ecb5a3b4a604b8a88c8002e3442d6c60aead1db2a89a041560c", size = 5252579, upload-time = "2026-05-04T22:57:57.207Z" }, { url = "https://files.pythonhosted.org/packages/f8/a3/b06844f303873493c963caf581c04df31c7035e0c1b0f02c4814d319ec80/cryptography-48.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:3fd2ca57062b241c856670b073487d2e86c4637937ca5601e48f97bf8e11fc8f", size = 5258461, upload-time = "2026-06-09T22:31:04.187Z" },
{ url = "https://files.pythonhosted.org/packages/d0/c0/7101d3b7215edcdc90c45da544961fd8ed2d6448f77577460fa75a8443f7/cryptography-48.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:bd72e68b06bb1e96913f97dd4901119bc17f39d4586a5adf2d3e47bc2b9d58b5", size = 4743326, upload-time = "2026-05-04T22:57:59.535Z" }, { url = "https://files.pythonhosted.org/packages/9f/13/8b765e2e12b07c74941caadb9d1c8fdc006c4dfbf2b8f2d610519758954d/cryptography-48.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:0ee6ea481db1ab889cba043ec1eda17bb9c1ea79db6722f779c3667f9f70322f", size = 4745488, upload-time = "2026-06-09T22:32:30.07Z" },
{ url = "https://files.pythonhosted.org/packages/ac/d8/5b833bad13016f562ab9d063d68199a4bd121d18458e439515601d3357ec/cryptography-48.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:59baa2cb386c4f0b9905bd6eb4c2a79a69a128408fd31d32ca4d7102d4156321", size = 4826672, upload-time = "2026-05-04T22:58:01.996Z" }, { url = "https://files.pythonhosted.org/packages/2e/aa/48972bce55049b32a94f4907eda4d75fa385aad8a39506cc2fc72196ecf0/cryptography-48.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f2ceef93cb096aa3c4cc4b5c94ca6131f9196d28c64d6111533402a9b2054d41", size = 4830256, upload-time = "2026-06-09T22:31:43.868Z" },
{ url = "https://files.pythonhosted.org/packages/98/e1/7074eb8bf3c135558c73fc2bcf0f5633f912e6fb87e868a55c454080ef09/cryptography-48.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9249e3cd978541d665967ac2cb2787fd6a62bddf1e75b3e347a594d7dacf4f74", size = 4972574, upload-time = "2026-05-04T22:58:03.968Z" }, { url = "https://files.pythonhosted.org/packages/47/a2/e5079a032fb85cf6005046ca92bbd78b0c82dad2b5751ab8c311659da06f/cryptography-48.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9bd3f92d76217892b15df84ca256c2c113d386fdda7a7d8691aeeced976507c6", size = 4979117, upload-time = "2026-06-09T22:31:05.845Z" },
{ url = "https://files.pythonhosted.org/packages/04/70/e5a1b41d325f797f39427aa44ef8baf0be500065ab6d8e10369d850d4a4f/cryptography-48.0.0-cp311-abi3-win32.whl", hash = "sha256:9c459db21422be75e2809370b829a87eb37f74cd785fc4aa9ea1e5f43b47cda4", size = 3294868, upload-time = "2026-05-04T22:58:06.467Z" }, { url = "https://files.pythonhosted.org/packages/b7/a0/8f50cae9c74e718ed769d63ed5c74bd0ea830c9550a74629cebd1b9c7bc7/cryptography-48.0.1-cp311-abi3-win32.whl", hash = "sha256:b9a32b876490d66c8bcc9963ef220199569748434ab01a9d6aaeabf88e7f5158", size = 3304154, upload-time = "2026-06-09T22:32:16.845Z" },
{ url = "https://files.pythonhosted.org/packages/f4/ac/8ac51b4a5fc5932eb7ee5c517ba7dc8cd834f0048962b6b352f00f41ebf9/cryptography-48.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:5b012212e08b8dd5edc78ef54da83dd9892fd9105323b3993eff6bea65dc21d7", size = 3817107, upload-time = "2026-05-04T22:58:08.845Z" }, { url = "https://files.pythonhosted.org/packages/c5/69/0572c77dbace6fef72f33755bd52ea399c71367250d366237f8691826b9e/cryptography-48.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:39489bfca54c7a1f6b297efcd8bc608ab92d16c4ca631b0cad4da46724588b24", size = 3817138, upload-time = "2026-06-09T22:32:00.388Z" },
{ url = "https://files.pythonhosted.org/packages/6b/84/70e3feea9feea87fd7cbe77efb2712ae1e3e6edf10749dc6e95f4e60e455/cryptography-48.0.0-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:3cb07a3ed6431663cd321ea8a000a1314c74211f823e4177fefa2255e057d1ec", size = 7986556, upload-time = "2026-05-04T22:58:11.172Z" }, { url = "https://files.pythonhosted.org/packages/42/06/3e768b4c3bc78201583fa35a0e18f640dd782ff41afba88f8545481a8874/cryptography-48.0.1-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:f817adc181390bd54f2f700107a7419040fb7c1bdf2fc26f36551a06a68c3345", size = 7989830, upload-time = "2026-06-09T22:31:07.8Z" },
{ url = "https://files.pythonhosted.org/packages/89/6e/18e07a618bb5442ba10cf4df16e99c071365528aa570dfcb8c02e25a303b/cryptography-48.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8c7378637d7d88016fa6791c159f698b3d3eed28ebf844ac36b9dc04a14dae18", size = 4684776, upload-time = "2026-05-04T22:58:13.712Z" }, { url = "https://files.pythonhosted.org/packages/8a/13/6476736484b94041110c8340a3eb63962fea4975baea8cb4a512adb44d4d/cryptography-48.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d5d30989c6917b478b5817902e85fddaea2261efa8648383d965381ccb9e1ac4", size = 4689201, upload-time = "2026-06-09T22:31:09.745Z" },
{ url = "https://files.pythonhosted.org/packages/be/6a/4ea3b4c6c6759794d5ee2103c304a5076dc4b19ae1f9fe47dba439e159e9/cryptography-48.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc90c0b39b2e3c65ef52c804b72e3c58f8a04ab2a1871272798e5f9572c17d20", size = 4698121, upload-time = "2026-05-04T22:58:16.448Z" }, { url = "https://files.pythonhosted.org/packages/79/62/65a87f34d2a431546e2509b85d55e8c90df86d668f6731da64d538512ac2/cryptography-48.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:df637c05205ea7c1d7fbcbe54bbfea648a52951155f997af13d895d0ecc96991", size = 4702822, upload-time = "2026-06-09T22:32:24.409Z" },
{ url = "https://files.pythonhosted.org/packages/2f/59/6ff6ad6cae03bb887da2a5860b2c9805f8dac969ef01ce563336c49bd1d1/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:76341972e1eff8b4bea859f09c0d3e64b96ce931b084f9b9b7db8ef364c30eff", size = 4690042, upload-time = "2026-05-04T22:58:18.544Z" }, { url = "https://files.pythonhosted.org/packages/7f/59/810b5204b0a9b10f4b6bc06bd551a8b609803cd931806bc3b71884b225e5/cryptography-48.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:869c3b8a53bfe27147832df48b32adadf558249d50e76cb3769d40e986b13265", size = 4694875, upload-time = "2026-06-09T22:32:08.737Z" },
{ url = "https://files.pythonhosted.org/packages/ca/b4/fc334ed8cfd705aca282fe4d8f5ae64a8e0f74932e9feecb344610cf6e4d/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:55b7718303bf06a5753dcdccf2f3945cf18ad7bffde41b61226e4db31ab89a9c", size = 5282526, upload-time = "2026-05-04T22:58:20.75Z" }, { url = "https://files.pythonhosted.org/packages/24/dc/d8ca05ffea724eec6d232ea6f18e74c269eb6bdfdcc9bfba689790d1325f/cryptography-48.0.1-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:e361afba8918070d376df76f408a4f67fec0ee9cff81a99e48fe9a233ef59e17", size = 5290385, upload-time = "2026-06-09T22:31:15.212Z" },
{ url = "https://files.pythonhosted.org/packages/11/08/9f8c5386cc4cd90d8255c7cdd0f5baf459a08502a09de30dc51f553d38dc/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:a64697c641c7b1b2178e573cbc31c7c6684cd56883a478d75143dbb7118036db", size = 4733116, upload-time = "2026-05-04T22:58:23.627Z" }, { url = "https://files.pythonhosted.org/packages/03/8c/3be6cb4da181f5bb6c19cf560c2359d60644a6b5fc5b57854e528f47b296/cryptography-48.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:d069066deead00ac7f090be101be875a06855908f7ec004c27b8fefb4acfb411", size = 4737082, upload-time = "2026-06-09T22:32:22.66Z" },
{ url = "https://files.pythonhosted.org/packages/b8/77/99307d7574045699f8805aa500fa0fb83422d115b5400a064ddd306d7750/cryptography-48.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:561215ea3879cb1cbbf272867e2efda62476f240fb58c64de6b393ae19246741", size = 4316030, upload-time = "2026-05-04T22:58:25.581Z" }, { url = "https://files.pythonhosted.org/packages/aa/f6/d5f60a5a1434dbfd949e227fd0065d194c7e6b6ac526b17f5c06152b8231/cryptography-48.0.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:09f73a725d582cef64b91281a322cd798d14a33b2b6f2b7ad9531dc336d84c02", size = 4325328, upload-time = "2026-06-09T22:32:10.777Z" },
{ url = "https://files.pythonhosted.org/packages/fd/36/a608b98337af3cb2aff4818e406649d30572b7031918b04c87d979495348/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ad64688338ed4bc1a6618076ba75fd7194a5f1797ac60b47afe926285adb3166", size = 4689640, upload-time = "2026-05-04T22:58:27.747Z" }, { url = "https://files.pythonhosted.org/packages/17/b7/ba75dd947a14b6ad907b01ae8f6b5b348cdd1b48142f0063dee9e20c1d9d/cryptography-48.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:15254441469dd6bf027039453288e2072124f8b6603563f5d759e1c9b69273fa", size = 4694530, upload-time = "2026-06-09T22:31:53.105Z" },
{ url = "https://files.pythonhosted.org/packages/dd/a6/825010a291b4438aecc1f568bc428189fc1175515223632477c07dc0a6df/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:906cbf0670286c6e0044156bc7d4af9cbb0ef6db9f73e52c3ec56ba6bdde5336", size = 5237657, upload-time = "2026-05-04T22:58:29.848Z" }, { url = "https://files.pythonhosted.org/packages/62/29/50d6b9e8aff12d8b67afaeb3569335e32dc83a5723e3bbded24fdac9f809/cryptography-48.0.1-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:8ace4507d1e6533c125f4fac754f8bb8b6a74c08e92179dabd7e16571a3efbf3", size = 5245046, upload-time = "2026-06-09T22:31:25.774Z" },
{ url = "https://files.pythonhosted.org/packages/b9/09/4e76a09b4caa29aad535ddc806f5d4c5d01885bd978bd984fbc6ca032cae/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:ea8990436d914540a40ab24b6a77c0969695ed52f4a4874c5137ccf7045a7057", size = 4732362, upload-time = "2026-05-04T22:58:32.009Z" }, { url = "https://files.pythonhosted.org/packages/9f/04/618f4115cfc0add0838c82507aa18a346089428da8653ad38b3ff36f5cb3/cryptography-48.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:b4e391975f038e66432328639620a4aff2d307513b004f1ca06d6225bced815c", size = 4736660, upload-time = "2026-06-09T22:32:12.676Z" },
{ url = "https://files.pythonhosted.org/packages/18/78/444fa04a77d0cb95f417dda20d450e13c56ba8e5220fc892a1658f44f882/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c18684a7f0cc9a3cb60328f496b8e3372def7c5d2df39ac267878b05565aaaae", size = 4819580, upload-time = "2026-05-04T22:58:34.254Z" }, { url = "https://files.pythonhosted.org/packages/24/9c/06e062462a0de28a3b3911322eded4c16deb9f441b1b7575d3dc59488ab5/cryptography-48.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42fcd8e26fe555d9b3577a135f5091fefa0aa4e99129c23fb56787a1bd4ada72", size = 4822229, upload-time = "2026-06-09T22:31:17.062Z" },
{ url = "https://files.pythonhosted.org/packages/38/85/ea67067c70a1fd4be2c63d35eeed82658023021affccc7b17705f8527dd2/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9be5aafa5736574f8f15f262adc81b2a9869e2cfe9014d52a44633905b40d52c", size = 4963283, upload-time = "2026-05-04T22:58:36.376Z" }, { url = "https://files.pythonhosted.org/packages/f4/be/0561971eaaee4b8a0e7d5113c536921063ab91aaf23278ac374eaf881e11/cryptography-48.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1400da5e32a43253392277eac7490a60e497d810a63dd5608d71bbd7af507c9", size = 4966364, upload-time = "2026-06-09T22:31:32.842Z" },
{ url = "https://files.pythonhosted.org/packages/75/54/cc6d0f3deac3e81c7f847e8a189a12b6cdd65059b43dad25d4316abd849a/cryptography-48.0.0-cp314-cp314t-win32.whl", hash = "sha256:c17dfe85494deaeddc5ce251aebd1d60bbe6afc8b62071bb0b469431a000124f", size = 3270954, upload-time = "2026-05-04T22:58:38.791Z" }, { url = "https://files.pythonhosted.org/packages/a4/27/728c77876f12b000820b69ae490f3c4083775e79e07827e9e60be07ad209/cryptography-48.0.1-cp314-cp314t-win32.whl", hash = "sha256:0df56b056bc17c1b7d6821dfa65216e62bd232d8ab05eb3db44e71d235651471", size = 3278498, upload-time = "2026-06-09T22:31:29.154Z" },
{ url = "https://files.pythonhosted.org/packages/49/67/cc947e288c0758a4e5473d1dcb743037ab7785541265a969240b8885441a/cryptography-48.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27241b1dc9962e056062a8eef1991d02c3a24569c95975bd2322a8a52c6e5e12", size = 3797313, upload-time = "2026-05-04T22:58:40.746Z" }, { url = "https://files.pythonhosted.org/packages/06/e3/79a612c6d7b1e6ee0edd43633d53035bec2cfb78c82b76f7864f39e36f34/cryptography-48.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:9de21387aa95e2a895823d0745b430bed4f33503ba9ab5e0b5311f33e37d66d2", size = 3798790, upload-time = "2026-06-09T22:31:56.697Z" },
{ url = "https://files.pythonhosted.org/packages/f2/63/61d4a4e1c6b6bab6ce1e213cd36a24c415d90e76d78c5eb8577c5541d2e8/cryptography-48.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:58d00498e8933e4a194f3076aee1b4a97dfec1a6da444535755822fe5d8b0b86", size = 7983482, upload-time = "2026-05-04T22:58:43.769Z" }, { url = "https://files.pythonhosted.org/packages/ca/6c/00fa2a95997164c8b2072ce327c23d4ab20809ccc323ea5fab91e53a4bba/cryptography-48.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:4fdc69f8e4316bcf0c8c8ec1f26f285d12e8142d88d96c876a59a03be3f6ae67", size = 7987408, upload-time = "2026-06-09T22:32:20.777Z" },
{ url = "https://files.pythonhosted.org/packages/d5/ac/f5b5995b87770c693e2596559ffafe195b4033a57f14a82268a2842953f3/cryptography-48.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:614d0949f4790582d2cc25553abd09dd723025f0c0e7c67376a1d77196743d6e", size = 4683266, upload-time = "2026-05-04T22:58:46.064Z" }, { url = "https://files.pythonhosted.org/packages/b0/d9/45f309a7e4e5f3f8f121d6d3be9e94024a7726ec598d6e08ae04edb2f04d/cryptography-48.0.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48fe40804d4caa2288f24e70ca8c64c42dd826da0ad7e4f1b41b2128d679e6c8", size = 4690196, upload-time = "2026-06-09T22:31:54.74Z" },
{ url = "https://files.pythonhosted.org/packages/ec/c6/8b14f67e18338fbc4adb76f66c001f5c3610b3e2d1837f268f47a347dbbb/cryptography-48.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ce4bfae76319a532a2dc68f82cc32f5676ee792a983187dac07183690e5c66f", size = 4696228, upload-time = "2026-05-04T22:58:48.22Z" }, { url = "https://files.pythonhosted.org/packages/5f/9f/a1bc8bcc798811b8527eb374bbccf30a3f3e806829d967118222bf1125eb/cryptography-48.0.1-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:86be3b1b0b6bf09482fb50a979c508d2950ed95f5621ec77f4e385962006b83a", size = 4696782, upload-time = "2026-06-09T22:31:45.615Z" },
{ url = "https://files.pythonhosted.org/packages/ea/73/f808fbae9514bd91b47875b003f13e284c8c6bdfd904b7944e803937eec1/cryptography-48.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:2eb992bbd4661238c5a397594c83f5b4dc2bc5b848c365c8f991b6780efcc5c7", size = 4689097, upload-time = "2026-05-04T22:58:50.9Z" }, { url = "https://files.pythonhosted.org/packages/66/c2/81a4fb4e4373c500bb526bc337ac5719dd31dd15b970b84a238168c6aa08/cryptography-48.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4ab0a343c807bbcd90c971cd1ecf072937cd01847a9e002bef88fb47ac6be577", size = 4696618, upload-time = "2026-06-09T22:31:11.564Z" },
{ url = "https://files.pythonhosted.org/packages/93/01/d86632d7d28db8ae83221995752eeb6639ffb374c2d22955648cf8d52797/cryptography-48.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:22a5cb272895dce158b2cacdfdc3debd299019659f42947dbdac6f32d68fe832", size = 5283582, upload-time = "2026-05-04T22:58:53.017Z" }, { url = "https://files.pythonhosted.org/packages/e5/0b/aa68b221dde92d09cb29a024ede17550ee21e77a404e59fc093c82bb51e1/cryptography-48.0.1-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9621de99d2da096006b629979efd8ae7eb2d8b822488d0c89ee4000c306c59b1", size = 5289970, upload-time = "2026-06-09T22:31:20.368Z" },
{ url = "https://files.pythonhosted.org/packages/02/e1/50edc7a50334807cc4791fc4a0ce7468b4a1416d9138eab358bfc9a3d70b/cryptography-48.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2b4d59804e8408e2fea7d1fbaf218e5ec984325221db76e6a241a9abd6cdd95c", size = 4730479, upload-time = "2026-05-04T22:58:55.611Z" }, { url = "https://files.pythonhosted.org/packages/78/13/fba657f958d2af66ea959a4ba01212632089249d34af1ae48054136344d7/cryptography-48.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:88c852a0ae366e262e5a1744b685e6a433dc8788dd2a277e418bf4904203609d", size = 4731873, upload-time = "2026-06-09T22:31:22.253Z" },
{ url = "https://files.pythonhosted.org/packages/6f/af/99a582b1b1641ff5911ac559beb45097cf79efd4ead4657f578ef1af2d47/cryptography-48.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:984a20b0f62a26f48a3396c72e4bc34c66e356d356bf370053066b3b6d54634a", size = 4326481, upload-time = "2026-05-04T22:58:57.607Z" }, { url = "https://files.pythonhosted.org/packages/4c/4c/9a964756d24a26b3e34dfcb16f961b89838786e6700b635b0d1e3adff4b6/cryptography-48.0.1-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:43c5835e2cb98c8733d86f57d6fc879b613f5c3478607281c3e36daffc6dd8a6", size = 4330804, upload-time = "2026-06-09T22:31:36.56Z" },
{ url = "https://files.pythonhosted.org/packages/90/ee/89aa26a06ef0a7d7611788ffd571a7c50e368cc6a4d5eef8b4884e866edb/cryptography-48.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5a5ed8fde7a1d09376ca0b40e68cd59c69fe23b1f9768bd5824f54681626032a", size = 4688713, upload-time = "2026-05-04T22:59:00.077Z" }, { url = "https://files.pythonhosted.org/packages/4b/0f/a10f3a6eb12950a10e3a874070283aa2dd5875b2bfd15fad8a3e17b3f13e/cryptography-48.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:fe0180af5bf9236518a087e35bf2d9a347d5f5f51e63c579d683ddff424e3d46", size = 4696217, upload-time = "2026-06-09T22:31:13.351Z" },
{ url = "https://files.pythonhosted.org/packages/70/ba/bcb1b0bb7a33d4c7c0c4d4c7874b4a62ae4f56113a5f4baefa362dfb1f0f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:8cd666227ef7af430aa5914a9910e0ddd703e75f039cef0825cd0da71b6b711a", size = 5238165, upload-time = "2026-05-04T22:59:02.317Z" }, { url = "https://files.pythonhosted.org/packages/f3/6f/5cd12f951165ea73ef85266775d97e4c763b2474ccfd816dd69d3a18d6f8/cryptography-48.0.1-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:b7a2d1a937a738a881737cec135a38bb61470589b17515b9f73f571d0ae10401", size = 5245252, upload-time = "2026-06-09T22:32:02.193Z" },
{ url = "https://files.pythonhosted.org/packages/c9/70/ca4003b1ce5ca3dc3186ada51908c8a9b9ff7d5cab83cc0d43ee14ec144f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9071196d81abc88b3516ac8cdfad32e2b66dd4a5393a8e68a961e9161ddc6239", size = 4729947, upload-time = "2026-05-04T22:59:05.255Z" }, { url = "https://files.pythonhosted.org/packages/68/ab/8aaa12e4516ec4464033ab79b6f3b592bd5a92102467c4ace8a0d970203f/cryptography-48.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:b74ca3b8e5ecdd833bf6a002ca41b4793bb27fb8f1c06ffaf2643c9e9140e31b", size = 4731388, upload-time = "2026-06-09T22:32:04.019Z" },
{ url = "https://files.pythonhosted.org/packages/44/a0/4ec7cf774207905aef1a8d11c3750d5a1db805eb380ee4e16df317870128/cryptography-48.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1e2d54c8be6152856a36f0882ab231e70f8ec7f14e93cf87db8a2ed056bf160c", size = 4822059, upload-time = "2026-05-04T22:59:07.802Z" }, { url = "https://files.pythonhosted.org/packages/1b/24/50027ea4dca85ec1f40688f3c24fb32ccacd520583c9592c3cc95628e6fb/cryptography-48.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2c37f2461406063b417837f5f3daab668652acd82423efcd7f0a9f04be972de1", size = 4824186, upload-time = "2026-06-09T22:32:18.707Z" },
{ url = "https://files.pythonhosted.org/packages/1e/75/a2e55f99c16fcac7b5d6c1eb19ad8e00799854d6be5ca845f9259eae1681/cryptography-48.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5da777e32ffed6f85a7b2b3f7c5cbc88c146bfcd0a1d7baf5fcc6c52ee35dd4", size = 4960575, upload-time = "2026-05-04T22:59:09.851Z" }, { url = "https://files.pythonhosted.org/packages/52/41/04cb5eb17085ade6f50cc611fb657df6a0f5885350de8764ece89c050197/cryptography-48.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:86fe77abb1bd87afb251d4d02ada7ecf53a32cee9b67d976abb2e45a13297475", size = 4964539, upload-time = "2026-06-09T22:31:18.793Z" },
{ url = "https://files.pythonhosted.org/packages/b8/23/6e6f32143ab5d8b36ca848a502c4bcd477ae75b9e1677e3530d669062578/cryptography-48.0.0-cp39-abi3-win32.whl", hash = "sha256:77a2ccbbe917f6710e05ba9adaa25fb5075620bf3ea6fb751997875aff4ae4bd", size = 3279117, upload-time = "2026-05-04T22:59:12.019Z" }, { url = "https://files.pythonhosted.org/packages/36/bf/ed70785c496e89d7e73b7cda2d21f2447fd6d4e821714b8d04ff217fed92/cryptography-48.0.1-cp39-abi3-win32.whl", hash = "sha256:6b2c0c3e6ccf3ade7750f836ef3ee36eea250cc467d45c256895573ac08cc6f1", size = 3282307, upload-time = "2026-06-09T22:30:53.162Z" },
{ url = "https://files.pythonhosted.org/packages/9d/9a/0fea98a70cf1749d41d738836f6349d97945f7c89433a259a6c2642eefeb/cryptography-48.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:16cd65b9330583e4619939b3a3843eec1e6e789744bb01e7c7e2e62e33c239c8", size = 3792100, upload-time = "2026-05-04T22:59:14.884Z" }, { url = "https://files.pythonhosted.org/packages/b3/ff/371ea7d252656ee1eb6d83eeeef3d1d0c6baf1d6497687d081ea03814670/cryptography-48.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:9a49ca6c81417f6a5edb50375a60cccdd70fa0a91a5211829dbea74eba94d2ac", size = 3793408, upload-time = "2026-06-09T22:32:15.191Z" },
{ url = "https://files.pythonhosted.org/packages/be/d2/024b5e06be9d44cb021fb0e1a03d34d63989cf56a0fe62f3dfbab695b9b4/cryptography-48.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:84cf79f0dc8b36ac5da873481716e87aef31fcfa0444f9e1d8b4b2cece142855", size = 3950391, upload-time = "2026-05-04T22:59:17.415Z" }, { url = "https://files.pythonhosted.org/packages/a9/d3/eb4e394e587341fdad09a09101fa76478ead3a78b0ad63e55c22f0d75c02/cryptography-48.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:08a597acce1ff37f347400087776599e2348a3a8bc53b44120e463cd274efe4a", size = 3951747, upload-time = "2026-06-09T22:31:23.871Z" },
{ url = "https://files.pythonhosted.org/packages/bc/17/3861e17c56fa0fd37491a14a8673fdb77c57fc5693cafe745ea8b06dba75/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:fdfef35d751d510fcef5252703621574364fec16418c4a1e5e1055248401054b", size = 4637126, upload-time = "2026-05-04T22:59:20.197Z" }, { url = "https://files.pythonhosted.org/packages/e0/4a/3f43451b4f858bfceaaaffc649e6e787e8d4fb332a1d443af39ab02cc8f1/cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:735824ec41b7f74a7c45fb1591349333e4c696cb6c044e5f46356e560143e4cd", size = 4641226, upload-time = "2026-06-09T22:31:02.532Z" },
{ url = "https://files.pythonhosted.org/packages/f0/0a/7e226dbff530f21480727eb764973a7bff2b912f8e15cd4f129e71b56d1d/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:0890f502ddf7d9c6426129c3f49f5c0a39278ed7cd6322c8755ffca6ee675a13", size = 4667270, upload-time = "2026-05-04T22:59:22.647Z" }, { url = "https://files.pythonhosted.org/packages/73/4e/855584c2c23b09e4ce2d3b9c30e983e679cd60b068c513c6bbdb91e11782/cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:92a46e1d638daa264ba2971c0b0489c9409787943efae4d60ffda3d091ef832c", size = 4668958, upload-time = "2026-06-09T22:32:06.213Z" },
{ url = "https://files.pythonhosted.org/packages/3b/f2/5a72274ca9f1b2a8b44a662ee0bf1b435909deb473d6f97bcd035bcdbc71/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:ecde28a596bead48b0cfd2a1b4416c3d43074c2d785e3a398d7ec1fc4d0f7fbb", size = 4636797, upload-time = "2026-05-04T22:59:24.912Z" }, { url = "https://files.pythonhosted.org/packages/42/3b/d35750e41d803d1e516fd6d6011f065424924da7af1748cef4cc9cb3ede1/cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:7e234ac052af99f2700826a5c29ea99d9c1b1f80341cde62d11c8154dc8e0bd9", size = 4640793, upload-time = "2026-06-09T22:32:26.331Z" },
{ url = "https://files.pythonhosted.org/packages/b4/e1/48cedb2fe63626e91ded1edad159e2a4fb8b6906c4425eb7749673077ce7/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:4defde8685ae324a9eb9d818717e93b4638ef67070ac9bc15b8ca85f63048355", size = 4666800, upload-time = "2026-05-04T22:59:27.474Z" }, { url = "https://files.pythonhosted.org/packages/ca/aa/cdb7181fe865285e87e96825aaab239400f1de0c3bfba9bd9769b79f1a92/cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:33842cf0888951cef5bc7ac724ab844a42044c1727b967b7f8997289a0464f92", size = 4668505, upload-time = "2026-06-09T22:31:27.534Z" },
{ url = "https://files.pythonhosted.org/packages/a2/ca/7e8365deec19afb2b2c7be7c1c0aa8f99633b54e90c570999acda93260fc/cryptography-48.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:db63bf618e5dea46c07de12e900fe1cdd2541e6dc9dbae772a70b7d4d4765f6a", size = 3739536, upload-time = "2026-05-04T22:59:29.61Z" }, { url = "https://files.pythonhosted.org/packages/5d/8c/ce3823c06c2804f194f9e64f0d67fa3f4094a39f2bb1a990cd03603af8fc/cryptography-48.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6184ca7b174f28d7c703f1290d4b297217c45355f77a98f67e9b7f14549ac54a", size = 3742204, upload-time = "2026-06-09T22:31:34.773Z" },
] ]
[[package]] [[package]]
@@ -485,6 +485,21 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/91/d1/110aeb2acffea56d4222861b5678c2643f0bda00081e40d687077348bb7c/django_import_export-4.4.1-py3-none-any.whl", hash = "sha256:8be2782e505ae303ccb02070a1b4c528995922126fca9ee449eb28666835dd4b", size = 157691, upload-time = "2026-05-05T12:42:42.554Z" }, { url = "https://files.pythonhosted.org/packages/91/d1/110aeb2acffea56d4222861b5678c2643f0bda00081e40d687077348bb7c/django_import_export-4.4.1-py3-none-any.whl", hash = "sha256:8be2782e505ae303ccb02070a1b4c528995922126fca9ee449eb28666835dd4b", size = 157691, upload-time = "2026-05-05T12:42:42.554Z" },
] ]
[[package]]
name = "django-oauth-toolkit"
version = "3.0.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "django" },
{ name = "jwcrypto" },
{ name = "oauthlib" },
{ name = "requests" },
]
sdist = { url = "https://files.pythonhosted.org/packages/fa/d3/d7628a7a4899bf5aafc9c1ec121c507470b37a247f7628acae6e0f78e0d6/django_oauth_toolkit-3.0.1.tar.gz", hash = "sha256:7200e4a9fb229b145a6d808cbf0423b6d69a87f68557437733eec3c0cf71db02", size = 99816, upload-time = "2024-09-07T14:07:57.124Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/7d/40/e556bc19ba65356fe5f0e48ca01c50e81f7c630042fa7411b6ab428ecf68/django_oauth_toolkit-3.0.1-py3-none-any.whl", hash = "sha256:3ef00b062a284f2031b0732b32dc899e3bbf0eac221bbb1cffcb50b8932e55ed", size = 77299, upload-time = "2024-09-07T14:08:43.225Z" },
]
[[package]] [[package]]
name = "django-pwa" name = "django-pwa"
version = "2.0.1" version = "2.0.1"
@@ -604,6 +619,19 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" },
] ]
[[package]]
name = "jwcrypto"
version = "1.5.7"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cryptography" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/8c/90/f065668004d22715c1940d6e88e4c3afc8ee16d5664e4478d2c8fd23a250/jwcrypto-1.5.7.tar.gz", hash = "sha256:70204d7cca406eda8c82352e3c41ba2d946610dafd19e54403f0a1f4f18633c6", size = 89535, upload-time = "2026-04-07T00:35:36.116Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/72/24/fb7da4d6613de7001feaf540d4b5969c6b5a1c42839043b0196cb13aa057/jwcrypto-1.5.7-py3-none-any.whl", hash = "sha256:729463fefe28b6de5cf1ebfda3e94f1a1b41d2799148ef98a01cb9678ebe2bb0", size = 94799, upload-time = "2026-04-07T00:35:35.085Z" },
]
[[package]] [[package]]
name = "mistune" name = "mistune"
version = "3.2.1" version = "3.2.1"
@@ -1349,6 +1377,7 @@ dependencies = [
{ name = "django-filter" }, { name = "django-filter" },
{ name = "django-hijack" }, { name = "django-hijack" },
{ name = "django-import-export" }, { name = "django-import-export" },
{ name = "django-oauth-toolkit" },
{ name = "django-pwa" }, { name = "django-pwa" },
{ name = "django-vite" }, { name = "django-vite" },
{ name = "djangorestframework" }, { name = "djangorestframework" },
@@ -1382,6 +1411,7 @@ requires-dist = [
{ name = "django-filter", specifier = "==25.2" }, { name = "django-filter", specifier = "==25.2" },
{ name = "django-hijack", specifier = "==3.7.8" }, { name = "django-hijack", specifier = "==3.7.8" },
{ name = "django-import-export", specifier = "~=4.4.1" }, { name = "django-import-export", specifier = "~=4.4.1" },
{ name = "django-oauth-toolkit", specifier = "~=3.0.1" },
{ name = "django-pwa", specifier = "~=2.0.1" }, { name = "django-pwa", specifier = "~=2.0.1" },
{ name = "django-vite", specifier = "==3.1.0" }, { name = "django-vite", specifier = "==3.1.0" },
{ name = "djangorestframework", specifier = "~=3.17.1" }, { name = "djangorestframework", specifier = "~=3.17.1" },