mirror of
https://github.com/eitchtee/WYGIWYH.git
synced 2026-07-04 20:11:45 +02:00
Compare commits
22 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4b8ccf426d | |||
| 4805ce9e04 | |||
| 845a8d846b | |||
| 1497500c4f | |||
| 9e9e60ccec | |||
| ca14f77f41 | |||
| 0fb37a59fa | |||
| e74d9177df | |||
| 106d721279 | |||
| d0e9c05283 | |||
| 4e16831f4d | |||
| 7f5a91c11f | |||
| 009a7038c8 | |||
| 4273c541c5 | |||
| 5c4cb16a0a | |||
| 9641e169f2 | |||
| 25ff0214ab | |||
| 0f9d333834 | |||
| bb23ac6df9 | |||
| 7db0fcf097 | |||
| 02896f21ed | |||
| 5082c17d0f |
@@ -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=""
|
||||||
|
|||||||
@@ -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
@@ -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",
|
||||||
|
|||||||
@@ -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/",
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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)
|
||||||
@@ -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."
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -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))
|
||||||
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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()
|
||||||
|
|||||||
@@ -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())
|
||||||
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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?"
|
||||||
|
|||||||
@@ -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 ""
|
||||||
|
|||||||
@@ -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
@@ -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?"
|
||||||
|
|||||||
@@ -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 ""
|
||||||
|
|||||||
@@ -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 ""
|
||||||
|
|||||||
@@ -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?"
|
||||||
|
|||||||
@@ -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?"
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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?"
|
||||||
|
|||||||
@@ -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 "Редактировать пользователя"
|
||||||
|
|||||||
@@ -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 ""
|
||||||
|
|||||||
@@ -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 ""
|
||||||
|
|||||||
@@ -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 "Редагувати користувача"
|
||||||
|
|||||||
@@ -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?"
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Generated
+297
-911
File diff suppressed because it is too large
Load Diff
@@ -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"
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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" },
|
||||||
|
|||||||
Reference in New Issue
Block a user