Compare commits

..

70 Commits

Author SHA1 Message Date
Ariel Rin
af872caaaa Translate django.po in es [Manual Sync]
77% of minimum 50% translated source file: 'django.po'
on 'es'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2026-01-21 05:40:08 +00:00
Ariel Rin
bca4f7e2f4 Translate django.po in de [Manual Sync]
99% of minimum 50% translated source file: 'django.po'
on 'de'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2026-01-21 05:39:56 +00:00
Ariel Rin
b5075089f0 Translate django.po in pl_PL [Manual Sync]
87% of minimum 50% translated source file: 'django.po'
on 'pl_PL'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2026-01-21 05:39:43 +00:00
Ariel Rin
8228209383 Translate django.po in ko_KR [Manual Sync]
88% of minimum 50% translated source file: 'django.po'
on 'ko_KR'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2026-01-21 05:39:30 +00:00
Ariel Rin
88ef2138ca Translate django.po in ja [Manual Sync]
88% of minimum 50% translated source file: 'django.po'
on 'ja'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2026-01-21 05:39:17 +00:00
Ariel Rin
44bae0162a Translate django.po in ru [Manual Sync]
79% of minimum 50% translated source file: 'django.po'
on 'ru'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2026-01-21 05:39:07 +00:00
Ariel Rin
190ef15c2c Translate django.po in it_IT [Manual Sync]
87% of minimum 50% translated source file: 'django.po'
on 'it_IT'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2026-01-21 05:38:51 +00:00
Ariel Rin
2615b76762 Translate django.po in uk [Manual Sync]
92% of minimum 50% translated source file: 'django.po'
on 'uk'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2026-01-21 05:38:39 +00:00
Ariel Rin
4e36ed77a1 Translate django.po in fr_FR [Manual Sync]
88% of minimum 50% translated source file: 'django.po'
on 'fr_FR'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2026-01-21 05:38:27 +00:00
Ariel Rin
49c748b46e Translate django.po in zh-Hans [Manual Sync]
64% of minimum 50% translated source file: 'django.po'
on 'zh-Hans'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2026-01-21 05:38:19 +00:00
Ariel Rin
4104555f55 Translate django.po in de
100% translated source file: 'django.po'
on 'de'.
2026-01-09 13:19:32 +00:00
Ariel Rin
e46c9b66f1 Translate django.po in de
99% of minimum 50% translated source file: 'django.po'
on 'de'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2025-11-13 01:26:21 +00:00
Ariel Rin
1a5ff48ae7 Translate django.po in ko_KR
88% of minimum 50% translated source file: 'django.po'
on 'ko_KR'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2025-11-13 01:26:08 +00:00
Ariel Rin
528febf678 Translate django.po in uk
92% of minimum 50% translated source file: 'django.po'
on 'uk'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2025-11-13 01:26:01 +00:00
Ariel Rin
4e16140d03 Translate django.po in it_IT
87% of minimum 50% translated source file: 'django.po'
on 'it_IT'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2025-11-13 01:25:50 +00:00
Ariel Rin
14c5aecd59 Translate django.po in es
77% of minimum 50% translated source file: 'django.po'
on 'es'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2025-11-13 01:25:42 +00:00
Ariel Rin
b78c778e4e Translate django.po in pl_PL
88% of minimum 50% translated source file: 'django.po'
on 'pl_PL'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2025-11-13 01:25:35 +00:00
Ariel Rin
724fa99ef4 Translate django.po in zh-Hans
64% of minimum 50% translated source file: 'django.po'
on 'zh-Hans'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2025-11-13 01:25:24 +00:00
Ariel Rin
e02e31ba34 Translate django.po in ja
88% of minimum 50% translated source file: 'django.po'
on 'ja'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2025-11-13 01:25:15 +00:00
Ariel Rin
30ab2f95e4 Translate django.po in fr_FR
88% of minimum 50% translated source file: 'django.po'
on 'fr_FR'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2025-11-13 01:25:04 +00:00
Ariel Rin
086dc9e5eb Translate django.po in ru
79% of minimum 50% translated source file: 'django.po'
on 'ru'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2025-11-13 01:24:56 +00:00
Joel Falknau
c679ec0646 Version Bump 4.11.1 2025-11-13 10:24:14 +10:00
Joel Falknau
69a51bb08a update pre-commit 2025-11-13 10:17:23 +10:00
Ariel Rin
442c893c39 Merge branch 'master' into 'master'
Edit manager.py

See merge request allianceauth/allianceauth!1778
2025-11-03 10:33:00 +00:00
salartarium
33df15f882 Edit manager.py 2025-11-02 05:52:03 +00:00
Ariel Rin
5d56f0a66c Merge branch 'limit-max-python-version' into 'master'
[CHANGE] Limit max. Python version to what we test for

See merge request allianceauth/allianceauth!1773
2025-10-29 10:41:46 +00:00
Ariel Rin
0fbdbf3a8d Merge branch 'sidebar-total-notification-counter' into 'master'
Sidebar total notification counter

See merge request allianceauth/allianceauth!1774
2025-10-29 10:31:51 +00:00
Ariel Rin
5291bf6896 Merge branch 'translation-fixes' into 'master'
[FIX] Django `makemessages` is ignoring f-strings for translations now

See merge request allianceauth/allianceauth!1772
2025-10-29 00:23:39 +00:00
Ariel Rin
bd6c0fede5 Merge branch 'fix-directories' into 'master'
[HOTFIX] Directories

See merge request allianceauth/allianceauth!1775
2025-10-29 00:23:04 +00:00
Peter Pfeufer
23fe1703c3 [FIX] Directories 2025-10-28 22:33:33 +01:00
Peter Pfeufer
9139b0da56 [CHANGE] JS filename to better reflect what it is for 2025-10-28 09:41:33 +01:00
Peter Pfeufer
80145b313f [ADD] Total notification counter to sidebar 2025-10-28 09:38:20 +01:00
Peter Pfeufer
e96bdd12f9 [CHANGE] Limit max. Python version to what we test for 2025-10-27 11:23:03 +01:00
Joel Falknau
513b7b88f4 another trixie runner, not available to python 3.8 2025-10-27 20:08:15 +10:00
Joel Falknau
5e3fc5c1cb i dont understand this behaviour but okay fine 2025-10-27 19:51:29 +10:00
Ariel Rin
d3069db046 Merge branch 'srp_allow-missing-trailling-slash' into 'master'
SRP - Allow zkillboard links without a trailling slash to be pasted without errors

See merge request allianceauth/allianceauth!1771
2025-10-26 06:26:48 +00:00
Ariel Rin
24863eaf9e Merge branch 'srp_diplay-errors' into 'master'
SRP - Display form errors

See merge request allianceauth/allianceauth!1770
2025-10-26 06:25:27 +00:00
Joel Falknau
d138bd61c5 py38 not available on debian trixie 2025-10-26 12:45:49 +10:00
Joel Falknau
bff20ddd5d remove deprecated future 2025-10-26 11:25:06 +10:00
Joel Falknau
493e694410 update precommit 2025-10-26 11:24:57 +10:00
Peter Pfeufer
8c41d9da58 [FIX] Django makemessages is ignoring f-strings for translations now 2025-10-25 11:14:41 +02:00
Joel Falknau
9e0358a3ce bump test images to trixie 2025-10-25 18:39:24 +10:00
T'rahk Rokym
19bb6856a2 Allow zkillboard links without a trailling slash to be pasted without errors 2025-10-18 00:02:29 +02:00
T'rahk Rokym
9751315b97 Cleaner error display applied to any bootstrap_form in allianceauth
Credit to @ppfeufer for the code snipet
2025-10-17 23:15:42 +02:00
Joel Falknau
99df847e1f Version Bump 4.11.0 (again) 2025-10-17 16:00:45 +10:00
Joel Falknau
60ba82c653 Merge branch 'master' of gitlab.com:allianceauth/allianceauth 2025-10-17 14:38:34 +10:00
Joel Falknau
bd7f13358a Version Bump 4.11.0 2025-10-17 14:37:45 +10:00
Joel Falknau
4edd0fab9e update precommit 2025-10-17 14:34:56 +10:00
Ariel Rin
fced909b4d Merge branch 'translations_7f31a07ccd4e4a66b1dd7b6bc2dbddb5' into 'master'
Updates for project Alliance Auth

See merge request allianceauth/allianceauth!1764
2025-10-17 04:28:59 +00:00
Ariel Rin
e2b96da460 Updates for project Alliance Auth 2025-10-17 04:28:59 +00:00
Ariel Rin
ecd27b823e Merge branch 'supervisor-env-variables' into 'master'
[ADD] Environment variables to supervisor config

See merge request allianceauth/allianceauth!1739
2025-10-17 04:20:22 +00:00
Ariel Rin
dae4afddb1 Merge branch 'hide-menu' into 'master'
[ADD] User setting to keep the sidebar menu minimized

See merge request allianceauth/allianceauth!1769
2025-10-17 04:20:10 +00:00
Peter Pfeufer
d507663316 [CHANGE] Hide setting on mobile devices to avoid confusion 2025-10-15 10:54:44 +02:00
Peter Pfeufer
67081ab465 [ADD] Device detection and always minimize the sidebar on mobile 2025-10-15 10:40:44 +02:00
Peter Pfeufer
bce90344f8 [CHANGE] Always minimize when not authenticated
We have no user settings here, so keep it minimized on public pages.
2025-10-15 09:45:15 +02:00
Peter Pfeufer
29c6fa292a [REMOVE] JS local storage usage
To make it an actual choice through the setting
2025-10-15 09:42:07 +02:00
Peter Pfeufer
295361a541 [ADD] User setting to keep the sidebar menu minimized 2025-10-15 01:13:42 +02:00
Ariel Rin
92a1bd40a3 Merge branch 'inline-js-overhaul' into 'master'
[CHANGE] InlineJS overhaul

See merge request allianceauth/allianceauth!1766
2025-10-10 09:54:36 +00:00
Ariel Rin
b8bbd0d1c1 Merge branch 'fix-deprecated-utcnow' into 'master'
[FIX] Calls to deprecated `utcnow` method of `datetime.datetime`

See merge request allianceauth/allianceauth!1767
2025-10-10 09:52:45 +00:00
Peter Pfeufer
b7a6c9379a Merge remote-tracking branch 'origin/fix-deprecated-utcnow' into fix-deprecated-utcnow 2025-09-27 07:51:53 +02:00
Peter Pfeufer
e5f3a67919 [FIX] Calls to deprecated utcnow method of datetime.datetime
datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).

```python
@classmethod
@deprecated("Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.UTC)")
def utcnow(cls) -> Self
```
2025-09-27 07:51:46 +02:00
Ariel Rin
58cc4b84dd Merge branch 'codeowners' into 'master'
[ADD] CODEOWNERS file

See merge request allianceauth/allianceauth!1765
2025-09-26 23:37:55 +00:00
Ariel Rin
331dc7d4d0 Merge branch 'limit-bcrypt-version' into 'master'
[CHANGE] Temporarily limit `bcyrpt` to below v5.0.0

See merge request allianceauth/allianceauth!1768
2025-09-26 23:32:56 +00:00
Peter Pfeufer
01991b78c9 [CHANGE] Temporarily limit bcyrpt to below v5.0.0
See: https://gitlab.com/allianceauth/allianceauth/-/issues/1436
2025-09-26 17:47:50 +02:00
Peter Pfeufer
466113e6cb [FIX] Calls to deprecated utcnow method of datetime.datetime
datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).

```python
@classmethod
@deprecated("Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.UTC)")
def utcnow(cls) -> Self
```
2025-09-26 17:20:40 +02:00
Peter Pfeufer
b1f5aad9f9 [CHANGE] Move inline JS into $(document).ready(()) block 2025-09-25 09:38:20 +02:00
Peter Pfeufer
464016ac05 [CHANGE] Move task queue update JS into its own file 2025-09-25 09:14:03 +02:00
Peter Pfeufer
cc76f09a6e [CHANGE Move sidebar collapse JS into its own file 2025-09-25 08:11:17 +02:00
Peter Pfeufer
a7f6a74211 [ADD] CODEOWNERS file
See: https://docs.gitlab.com/user/project/codeowners/
2025-09-24 08:53:28 +02:00
Peter Pfeufer
d67ab108a0 [ADD] Environment variables to supervisor config 2025-08-10 12:59:56 +02:00
54 changed files with 4170 additions and 2781 deletions

View File

@@ -25,7 +25,7 @@ before_script:
pre-commit-check: pre-commit-check:
<<: *only-default <<: *only-default
stage: pre-commit stage: pre-commit
image: python:3.11-bookworm image: python:3.11-trixie
# variables: # variables:
# PRE_COMMIT_HOME: ${CI_PROJECT_DIR}/.cache/pre-commit # PRE_COMMIT_HOME: ${CI_PROJECT_DIR}/.cache/pre-commit
# cache: # cache:
@@ -65,7 +65,7 @@ test-3.8-core:
test-3.9-core: test-3.9-core:
<<: *only-default <<: *only-default
image: python:3.9-bookworm image: python:3.9-trixie
script: script:
- tox -e py39-core - tox -e py39-core
artifacts: artifacts:
@@ -77,7 +77,7 @@ test-3.9-core:
test-3.10-core: test-3.10-core:
<<: *only-default <<: *only-default
image: python:3.10-bookworm image: python:3.10-trixie
script: script:
- tox -e py310-core - tox -e py310-core
artifacts: artifacts:
@@ -89,7 +89,7 @@ test-3.10-core:
test-3.11-core: test-3.11-core:
<<: *only-default <<: *only-default
image: python:3.11-bookworm image: python:3.11-trixie
script: script:
- tox -e py311-core - tox -e py311-core
artifacts: artifacts:
@@ -101,7 +101,7 @@ test-3.11-core:
test-3.12-core: test-3.12-core:
<<: *only-default <<: *only-default
image: python:3.12-bookworm image: python:3.12-trixie
script: script:
- tox -e py312-core - tox -e py312-core
artifacts: artifacts:
@@ -125,7 +125,7 @@ test-3.8-all:
test-3.9-all: test-3.9-all:
<<: *only-default <<: *only-default
image: python:3.9-bookworm image: python:3.9-trixie
script: script:
- tox -e py39-all - tox -e py39-all
artifacts: artifacts:
@@ -137,7 +137,7 @@ test-3.9-all:
test-3.10-all: test-3.10-all:
<<: *only-default <<: *only-default
image: python:3.10-bookworm image: python:3.10-trixie
script: script:
- tox -e py310-all - tox -e py310-all
artifacts: artifacts:
@@ -149,7 +149,7 @@ test-3.10-all:
test-3.11-all: test-3.11-all:
<<: *only-default <<: *only-default
image: python:3.11-bookworm image: python:3.11-trixie
script: script:
- tox -e py311-all - tox -e py311-all
artifacts: artifacts:
@@ -162,7 +162,7 @@ test-3.11-all:
test-3.12-all: test-3.12-all:
<<: *only-default <<: *only-default
image: python:3.12-bookworm image: python:3.12-trixie
script: script:
- tox -e py312-all - tox -e py312-all
artifacts: artifacts:
@@ -174,7 +174,7 @@ test-3.12-all:
build-test: build-test:
stage: test stage: test
image: python:3.11-bookworm image: python:3.11-trixie
before_script: before_script:
- python -m pip install --upgrade pip - python -m pip install --upgrade pip
@@ -193,13 +193,13 @@ build-test:
test-docs: test-docs:
<<: *only-default <<: *only-default
image: python:3.11-bookworm image: python:3.11-trixie
script: script:
- tox -e docs - tox -e docs
deploy_production: deploy_production:
stage: deploy stage: deploy
image: python:3.11-bookworm image: python:3.11-trixie
before_script: before_script:
- python -m pip install --upgrade pip - python -m pip install --upgrade pip

View File

@@ -25,19 +25,19 @@ exclude: |
repos: repos:
# Code Upgrades # Code Upgrades
- repo: https://github.com/asottile/pyupgrade - repo: https://github.com/asottile/pyupgrade
rev: v3.20.0 rev: v3.21.1
hooks: hooks:
- id: pyupgrade - id: pyupgrade
args: [--py38-plus] args: [--py38-plus]
- repo: https://github.com/adamchainz/django-upgrade - repo: https://github.com/adamchainz/django-upgrade
rev: 1.25.0 rev: 1.29.1
hooks: hooks:
- id: django-upgrade - id: django-upgrade
args: [--target-version=4.2] args: [--target-version=4.2]
# Formatting # Formatting
- repo: https://github.com/pre-commit/pre-commit-hooks - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0 rev: v6.0.0
hooks: hooks:
# Identify invalid files # Identify invalid files
- id: check-ast - id: check-ast
@@ -55,8 +55,6 @@ repos:
# - id: check-docstring-first # - id: check-docstring-first
- id: debug-statements - id: debug-statements
# - id: requirements-txt-fixer # - id: requirements-txt-fixer
- id: fix-encoding-pragma
args: [--remove]
- id: fix-byte-order-marker - id: fix-byte-order-marker
# General quality checks # General quality checks
- id: mixed-line-ending - id: mixed-line-ending
@@ -66,7 +64,7 @@ repos:
- id: check-executables-have-shebangs - id: check-executables-have-shebangs
- id: end-of-file-fixer - id: end-of-file-fixer
- repo: https://github.com/editorconfig-checker/editorconfig-checker.python - repo: https://github.com/editorconfig-checker/editorconfig-checker.python
rev: 3.2.1 rev: 3.4.1
hooks: hooks:
- id: editorconfig-checker - id: editorconfig-checker
- repo: https://github.com/igorshubovych/markdownlint-cli - repo: https://github.com/igorshubovych/markdownlint-cli
@@ -78,7 +76,7 @@ repos:
- --disable=MD013 - --disable=MD013
# Infrastructure # Infrastructure
- repo: https://github.com/tox-dev/pyproject-fmt - repo: https://github.com/tox-dev/pyproject-fmt
rev: v2.6.0 rev: v2.11.1
hooks: hooks:
- id: pyproject-fmt - id: pyproject-fmt
name: pyproject.toml formatter name: pyproject.toml formatter
@@ -86,7 +84,7 @@ repos:
args: args:
- --indent=4 - --indent=4
additional_dependencies: additional_dependencies:
- tox==4.24.1 # https://github.com/tox-dev/tox/releases/latest - tox==4.32.0 # https://github.com/tox-dev/tox/releases/latest
- repo: https://github.com/abravalheri/validate-pyproject - repo: https://github.com/abravalheri/validate-pyproject
rev: v0.24.1 rev: v0.24.1
hooks: hooks:

1
CODEOWNERS Normal file
View File

@@ -0,0 +1 @@
* @allianceauth

View File

@@ -5,7 +5,7 @@ manage online service access.
# This will make sure the app is always imported when # This will make sure the app is always imported when
# Django starts so that shared_task will use this app. # Django starts so that shared_task will use this app.
__version__ = '4.10.0' __version__ = '4.11.1'
__title__ = 'Alliance Auth' __title__ = 'Alliance Auth'
__title_useragent__ = 'AllianceAuth' __title_useragent__ = 'AllianceAuth'
__url__ = 'https://gitlab.com/allianceauth/allianceauth' __url__ = 'https://gitlab.com/allianceauth/allianceauth'

View File

@@ -52,4 +52,10 @@ class UserSettingsMiddleware(MiddlewareMixin):
except Exception as e: except Exception as e:
logger.exception(e) logger.exception(e)
# Minimize Menu
try:
request.session["MINIMIZE_SIDEBAR"] = request.user.profile.minimize_sidebar
except Exception as e:
pass # We don't care that an anonymous user has no profile (not logged in)
return response return response

View File

@@ -0,0 +1,22 @@
# Generated by Django 4.2.25 on 2025-10-14 22:02
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("authentication", "0024_alter_userprofile_language"),
]
operations = [
migrations.AddField(
model_name="userprofile",
name="minimize_sidebar",
field=models.BooleanField(
default=False,
help_text="Keep the sidebar menu minimized",
verbose_name="Minimize Sidebar Menu",
),
),
]

View File

@@ -97,7 +97,8 @@ class UserProfile(models.Model):
on_delete=models.SET_DEFAULT, on_delete=models.SET_DEFAULT,
default=get_guest_state_pk) default=get_guest_state_pk)
language = models.CharField( language = models.CharField(
_("Language"), max_length=10, _("Language"),
max_length=10,
choices=Language.choices, choices=Language.choices,
blank=True, blank=True,
default='') default='')
@@ -112,6 +113,12 @@ class UserProfile(models.Model):
null=True, null=True,
help_text="Bootstrap 5 Themes from https://bootswatch.com/ or Community Apps" help_text="Bootstrap 5 Themes from https://bootswatch.com/ or Community Apps"
) )
minimize_sidebar = models.BooleanField(
_("Minimize Sidebar Menu"),
default=False,
help_text=_("Keep the sidebar menu minimized")
)
def assign_state(self, state=None, commit=True): def assign_state(self, state=None, commit=True):
if not state: if not state:

View File

@@ -27,7 +27,7 @@ def dashboard_results(hours: int) -> _TaskCounts:
my_earliest = events.first_event(earliest=earliest) my_earliest = events.first_event(earliest=earliest)
return [my_earliest] if my_earliest else [] return [my_earliest] if my_earliest else []
earliest = dt.datetime.utcnow() - dt.timedelta(hours=hours) earliest = dt.datetime.now(dt.timezone.utc) - dt.timedelta(hours=hours)
earliest_events = [] earliest_events = []
succeeded_count = succeeded_tasks.count(earliest=earliest) succeeded_count = succeeded_tasks.count(earliest=earliest)
earliest_events += earliest_if_exists(succeeded_tasks, earliest) earliest_events += earliest_if_exists(succeeded_tasks, earliest)

View File

@@ -42,7 +42,7 @@ class EventSeries:
- event_time: timestamp of event. Will use current time if not specified. - event_time: timestamp of event. Will use current time if not specified.
""" """
if not event_time: if not event_time:
event_time = dt.datetime.utcnow() event_time = dt.datetime.now(dt.timezone.utc)
my_id = self._redis.incr(self._key_counter) my_id = self._redis.incr(self._key_counter)
self._redis.zadd(self._key_sorted_set, {my_id: event_time.timestamp()}) self._redis.zadd(self._key_sorted_set, {my_id: event_time.timestamp()})

View File

@@ -88,6 +88,7 @@ class TestUserSettingsMiddlewareLoginFlow(TestCase):
self.request.LANGUAGE_CODE = 'en' self.request.LANGUAGE_CODE = 'en'
self.request.user.profile.language = 'de' self.request.user.profile.language = 'de'
self.request.user.profile.night_mode = True self.request.user.profile.night_mode = True
self.request.user.profile.minimize_sidebar = False
self.request.user.is_anonymous = False self.request.user.is_anonymous = False
self.response = Mock() self.response = Mock()
self.response.content = 'hello world' self.response.content = 'hello world'
@@ -173,3 +174,26 @@ class TestUserSettingsMiddlewareLoginFlow(TestCase):
self.response self.response
) )
self.assertEqual(self.request.session["NIGHT_MODE"], True) self.assertEqual(self.request.session["NIGHT_MODE"], True)
def test_middleware_set_mimimize_sidebar(self):
"""
tests the middleware will always set minimize_sidebar to False (default)
"""
response = self.middleware.process_response(
self.request,
self.response
)
self.assertEqual(self.request.session["MINIMIZE_SIDEBAR"], False)
def test_middleware_minimize_sidebar_when_set(self):
"""
tests the middleware will set mimimize_sidebar to True from DB
"""
self.request.user.profile.minimize_sidebar = True
response = self.middleware.process_response(
self.request,
self.response
)
self.assertEqual(self.request.session["MINIMIZE_SIDEBAR"], True)

View File

@@ -13,6 +13,7 @@ class StartProject(BaseStartProject):
parser.add_argument('--celery', help='The path to the celery executable.') parser.add_argument('--celery', help='The path to the celery executable.')
parser.add_argument('--gunicorn', help='The path to the gunicorn executable.') parser.add_argument('--gunicorn', help='The path to the gunicorn executable.')
parser.add_argument('--memmon', help='The path to the memmon executable.') parser.add_argument('--memmon', help='The path to the memmon executable.')
parser.add_argument('--venv_directory', help='The path to the virtual environment directory.')
def create_project(parser, options, args): def create_project(parser, options, args):
@@ -27,7 +28,7 @@ def create_project(parser, options, args):
allianceauth_path = os.path.dirname(allianceauth.__file__) allianceauth_path = os.path.dirname(allianceauth.__file__)
template_path = os.path.join(allianceauth_path, 'project_template') template_path = os.path.join(allianceauth_path, 'project_template')
# Determine locations of commands to render supervisor cond # Determine locations of commands to render supervisor configuration
command_options = { command_options = {
'template': template_path, 'template': template_path,
'python': shutil.which('python'), 'python': shutil.which('python'),
@@ -35,6 +36,7 @@ def create_project(parser, options, args):
'celery': shutil.which('celery'), 'celery': shutil.which('celery'),
'memmon': shutil.which('memmon'), 'memmon': shutil.which('memmon'),
'extensions': ['py', 'conf', 'json'], 'extensions': ['py', 'conf', 'json'],
'venv_directory': os.getenv('VIRTUAL_ENV'),
} }
# Strip 'start' out of the arguments, leaving project name (and optionally destination dir) # Strip 'start' out of the arguments, leaving project name (and optionally destination dir)

View File

@@ -320,8 +320,8 @@ def click_fatlink_view(request, token, fat_hash=None):
messages.warning( messages.warning(
request, request,
_( _(
f"Cannot register the fleet participation for {character.character_name}. The character needs to be online." "Cannot register the fleet participation for {character_name}. The character needs to be online."
), ).format(character_name=character.character_name)
) )
return redirect('fatlink:view') return redirect('fatlink:view')

View File

@@ -47,6 +47,12 @@
/* Side Navigation /* Side Navigation
------------------------------------------------------------------------------------- */ ------------------------------------------------------------------------------------- */
@media all { @media all {
.sidemenu-total-notifications-badge {
position: absolute;
left: 28px;
font-size: 42.5% !important;
}
#sidebar > div { #sidebar > div {
width: 325px; width: 325px;
} }

View File

@@ -11,7 +11,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: 2025-06-19 20:23+1000\n" "POT-Creation-Date: 2025-09-21 13:44+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Tomas Skarecky <t.skarecky@gmail.com>, 2024\n" "Last-Translator: Tomas Skarecky <t.skarecky@gmail.com>, 2024\n"
"Language-Team: Czech (Czech Republic) (https://app.transifex.com/alliance-auth/teams/107430/cs_CZ/)\n" "Language-Team: Czech (Czech Republic) (https://app.transifex.com/alliance-auth/teams/107430/cs_CZ/)\n"
@@ -62,7 +62,7 @@ msgstr ""
"přístupem:%s" "přístupem:%s"
#: allianceauth/authentication/models.py:72 #: allianceauth/authentication/models.py:72
#: allianceauth/project_template/project_name/settings/base.py:106 #: allianceauth/project_template/project_name/settings/base.py:104
msgid "English" msgid "English"
msgstr "Angličtina" msgstr "Angličtina"
@@ -71,57 +71,57 @@ msgid "Czech"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:74 #: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:108 #: allianceauth/project_template/project_name/settings/base.py:106
msgid "German" msgid "German"
msgstr "Němčina" msgstr "Němčina"
#: allianceauth/authentication/models.py:75 #: allianceauth/authentication/models.py:75
#: allianceauth/project_template/project_name/settings/base.py:109 #: allianceauth/project_template/project_name/settings/base.py:107
msgid "Spanish" msgid "Spanish"
msgstr "Španělština" msgstr "Španělština"
#: allianceauth/authentication/models.py:76 #: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:110 #: allianceauth/project_template/project_name/settings/base.py:108
msgid "Italian" msgid "Italian"
msgstr "Italština" msgstr "Italština"
#: allianceauth/authentication/models.py:77 #: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:111 #: allianceauth/project_template/project_name/settings/base.py:109
msgid "Japanese" msgid "Japanese"
msgstr "Japonština" msgstr "Japonština"
#: allianceauth/authentication/models.py:78 #: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:112 #: allianceauth/project_template/project_name/settings/base.py:110
msgid "Korean" msgid "Korean"
msgstr "Korejština" msgstr "Korejština"
#: allianceauth/authentication/models.py:79 #: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:113 #: allianceauth/project_template/project_name/settings/base.py:111
msgid "French" msgid "French"
msgstr "Francouzština" msgstr "Francouzština"
#: allianceauth/authentication/models.py:80 #: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:116 #: allianceauth/project_template/project_name/settings/base.py:114
msgid "Russian" msgid "Russian"
msgstr "Ruština" msgstr "Ruština"
#: allianceauth/authentication/models.py:81 #: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:114 #: allianceauth/project_template/project_name/settings/base.py:112
msgid "Dutch" msgid "Dutch"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:82 #: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:115 #: allianceauth/project_template/project_name/settings/base.py:113
msgid "Polish" msgid "Polish"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:83 #: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:117 #: allianceauth/project_template/project_name/settings/base.py:115
msgid "Ukrainian" msgid "Ukrainian"
msgstr "Ukrajinština" msgstr "Ukrajinština"
#: allianceauth/authentication/models.py:84 #: allianceauth/authentication/models.py:84
#: allianceauth/project_template/project_name/settings/base.py:118 #: allianceauth/project_template/project_name/settings/base.py:116
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "" msgstr ""
@@ -166,14 +166,12 @@ msgstr "Postavy"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:11 #: allianceauth/authentication/templates/authentication/dashboard_characters.html:11
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:12 #: allianceauth/authentication/templates/authentication/dashboard_characters.html:12
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:4 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:4
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:6
msgid "Add Character" msgid "Add Character"
msgstr "Přidat postavu" msgstr "Přidat postavu"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14 #: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:15 #: allianceauth/authentication/templates/authentication/dashboard_characters.html:15
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:10 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:8
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:12
msgid "Change Main" msgid "Change Main"
msgstr "Změnit postavu" msgstr "Změnit postavu"
@@ -230,8 +228,8 @@ msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/management.html:168 #: allianceauth/hrapplications/templates/hrapplications/management.html:168
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:35 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:35
#: allianceauth/hrapplications/templates/hrapplications/view.html:94 #: allianceauth/hrapplications/templates/hrapplications/view.html:94
#: allianceauth/srp/templates/srp/data.html:83 #: allianceauth/srp/templates/srp/data.html:81
#: allianceauth/srp/templates/srp/management.html:53 #: allianceauth/srp/templates/srp/management.html:51
msgid "Actions" msgid "Actions"
msgstr "Akce" msgstr "Akce"
@@ -282,7 +280,7 @@ msgstr "Registrace"
msgid "Invalid or expired activation link." msgid "Invalid or expired activation link."
msgstr "Nevalidní, nebo expirovaný aktivační odkaz." msgstr "Nevalidní, nebo expirovaný aktivační odkaz."
#: allianceauth/authentication/views.py:158 #: allianceauth/authentication/views.py:159
#, python-format #, python-format
msgid "" msgid ""
"Cannot change main character to %(char)s: character owned by a different " "Cannot change main character to %(char)s: character owned by a different "
@@ -290,22 +288,22 @@ msgid ""
msgstr "" msgstr ""
"Není možné změnit hlavní postavu na %(char)s: postava patří pod jiný účet." "Není možné změnit hlavní postavu na %(char)s: postava patří pod jiný účet."
#: allianceauth/authentication/views.py:165 #: allianceauth/authentication/views.py:166
#, python-format #, python-format
msgid "Changed main character to %s" msgid "Changed main character to %s"
msgstr "Hlavní postava změněna na %s" msgstr "Hlavní postava změněna na %s"
#: allianceauth/authentication/views.py:179 #: allianceauth/authentication/views.py:180
#, python-format #, python-format
msgid "Added %(name)s to your account." msgid "Added %(name)s to your account."
msgstr "%(name)spřidána k vačenu účtu" msgstr "%(name)spřidána k vačenu účtu"
#: allianceauth/authentication/views.py:181 #: allianceauth/authentication/views.py:182
#, python-format #, python-format
msgid "Failed to add %(name)s to your account: they already have an account." msgid "Failed to add %(name)s to your account: they already have an account."
msgstr "Přidání %(name)sk vašemu účtu se nezdařilo: již mají účet" msgstr "Přidání %(name)sk vašemu účtu se nezdařilo: již mají účet"
#: allianceauth/authentication/views.py:226 #: allianceauth/authentication/views.py:227
msgid "" msgid ""
"Unable to authenticate as the selected character. Please log in with the " "Unable to authenticate as the selected character. Please log in with the "
"main character associated with this account." "main character associated with this account."
@@ -313,11 +311,11 @@ msgstr ""
"Není možné váš ověřit pomocí vybrané postavu. Prosím přihlaste se pomocí " "Není možné váš ověřit pomocí vybrané postavu. Prosím přihlaste se pomocí "
"hlavní postavy spojené s tímto účtem." "hlavní postavy spojené s tímto účtem."
#: allianceauth/authentication/views.py:293 #: allianceauth/authentication/views.py:294
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "Registrační token expiroval" msgstr "Registrační token expiroval"
#: allianceauth/authentication/views.py:354 #: allianceauth/authentication/views.py:355
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
@@ -325,11 +323,11 @@ msgstr ""
"Byl vám odeslán potvrzovací email. Otevřete prosím odkaz pro potvrzení " "Byl vám odeslán potvrzovací email. Otevřete prosím odkaz pro potvrzení "
"emailové adresy. " "emailové adresy. "
#: allianceauth/authentication/views.py:360 #: allianceauth/authentication/views.py:361
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "Emailová adresa potvrzena. Přihlaste se prosím." msgstr "Emailová adresa potvrzena. Přihlaste se prosím."
#: allianceauth/authentication/views.py:366 #: allianceauth/authentication/views.py:367
msgid "Registration of new accounts is not allowed at this time." msgid "Registration of new accounts is not allowed at this time."
msgstr "Momentálně není povolena registrace nových účtů." msgstr "Momentálně není povolena registrace nových účtů."
@@ -346,11 +344,11 @@ msgstr ""
msgid "Corporations" msgid "Corporations"
msgstr "Korporace" msgstr "Korporace"
#: allianceauth/corputils/templates/corputils/base.html:35 #: allianceauth/corputils/templates/corputils/base.html:31
msgid "Add corporation" msgid "Add corporation"
msgstr "Přidat korporaci" msgstr "Přidat korporaci"
#: allianceauth/corputils/templates/corputils/base.html:51 #: allianceauth/corputils/templates/corputils/base.html:47
msgid "Search all corporations..." msgid "Search all corporations..."
msgstr "Vyhledat všechny korporace" msgstr "Vyhledat všechny korporace"
@@ -498,7 +496,7 @@ msgid "Fleet Activity Tracking"
msgstr "" msgstr ""
#: allianceauth/fleetactivitytracking/forms.py:6 allianceauth/srp/form.py:8 #: allianceauth/fleetactivitytracking/forms.py:6 allianceauth/srp/form.py:8
#: allianceauth/srp/templates/srp/management.html:44 #: allianceauth/srp/templates/srp/management.html:42
msgid "Fleet Name" msgid "Fleet Name"
msgstr "Jméno flotily" msgstr "Jméno flotily"
@@ -988,7 +986,7 @@ msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/management.html:123 #: allianceauth/hrapplications/templates/hrapplications/management.html:123
#: allianceauth/hrapplications/templates/hrapplications/management.html:167 #: allianceauth/hrapplications/templates/hrapplications/management.html:167
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:34 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:34
#: allianceauth/srp/templates/srp/data.html:81 #: allianceauth/srp/templates/srp/data.html:79
msgid "Status" msgid "Status"
msgstr "" msgstr ""
@@ -1001,7 +999,7 @@ msgid "Hidden"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:15 #: allianceauth/templates/allianceauth/admin-status/overview.html:53
msgid "Open" msgid "Open"
msgstr "" msgstr ""
@@ -1046,17 +1044,9 @@ msgstr ""
msgid "Leave" msgid "Leave"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:74 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:73
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:89 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:88
#: allianceauth/hrapplications/templates/hrapplications/management.html:46 msgid "Request pending"
#: allianceauth/hrapplications/templates/hrapplications/management.html:95
#: allianceauth/hrapplications/templates/hrapplications/management.html:138
#: allianceauth/hrapplications/templates/hrapplications/management.html:182
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:46
#: allianceauth/hrapplications/templates/hrapplications/view.html:25
#: allianceauth/srp/templates/srp/data.html:120
#: allianceauth/srp/templates/srp/management.html:87
msgid "Pending"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:80 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:80
@@ -1067,7 +1057,11 @@ msgstr ""
msgid "Request" msgid "Request"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:99 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:93
msgid "Retract"
msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:103
msgid "No groups available." msgid "No groups available."
msgstr "" msgstr ""
@@ -1196,6 +1190,19 @@ msgstr ""
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:438
msgid "You cannot retract that request"
msgstr ""
#: allianceauth/groupmanagement/views.py:450
#, python-format
msgid "Retracted application to group %(group)s."
msgstr ""
#: allianceauth/groupmanagement/views.py:458
msgid "You have no open request for that group."
msgstr ""
#: allianceauth/hrapplications/apps.py:8 #: allianceauth/hrapplications/apps.py:8
msgid "HR Applications" msgid "HR Applications"
msgstr "" msgstr ""
@@ -1266,12 +1273,23 @@ msgstr ""
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/management.html:46
#: allianceauth/hrapplications/templates/hrapplications/management.html:95
#: allianceauth/hrapplications/templates/hrapplications/management.html:138
#: allianceauth/hrapplications/templates/hrapplications/management.html:182
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:46
#: allianceauth/hrapplications/templates/hrapplications/view.html:25
#: allianceauth/srp/templates/srp/data.html:118
#: allianceauth/srp/templates/srp/management.html:85
msgid "Pending"
msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/management.html:48 #: allianceauth/hrapplications/templates/hrapplications/management.html:48
#: allianceauth/hrapplications/templates/hrapplications/management.html:141 #: allianceauth/hrapplications/templates/hrapplications/management.html:141
#: allianceauth/hrapplications/templates/hrapplications/management.html:185 #: allianceauth/hrapplications/templates/hrapplications/management.html:185
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:48 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:48
#: allianceauth/hrapplications/templates/hrapplications/view.html:21 #: allianceauth/hrapplications/templates/hrapplications/view.html:21
#: allianceauth/srp/templates/srp/data.html:112 #: allianceauth/srp/templates/srp/data.html:110
msgid "Approved" msgid "Approved"
msgstr "" msgstr ""
@@ -1279,7 +1297,7 @@ msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/management.html:143 #: allianceauth/hrapplications/templates/hrapplications/management.html:143
#: allianceauth/hrapplications/templates/hrapplications/management.html:187 #: allianceauth/hrapplications/templates/hrapplications/management.html:187
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:50 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:50
#: allianceauth/srp/templates/srp/data.html:116 #: allianceauth/srp/templates/srp/data.html:114
msgid "Rejected" msgid "Rejected"
msgstr "" msgstr ""
@@ -1514,8 +1532,8 @@ msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:155 #: allianceauth/menu/templates/menu/menu-user.html:155
#: allianceauth/menu/templates/menu/menu-user.html:158 #: allianceauth/menu/templates/menu/menu-user.html:158
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:13
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:14
msgid "Sign In" msgid "Sign In"
msgstr "" msgstr ""
@@ -1543,11 +1561,11 @@ msgstr ""
msgid "Read" msgid "Read"
msgstr "" msgstr ""
#: allianceauth/notifications/templates/notifications/list.html:32 #: allianceauth/notifications/templates/notifications/list.html:31
msgid "Mark all notifications as read" msgid "Mark all notifications as read"
msgstr "" msgstr ""
#: allianceauth/notifications/templates/notifications/list.html:38 #: allianceauth/notifications/templates/notifications/list.html:35
msgid "Delete all read notifications" msgid "Delete all read notifications"
msgstr "" msgstr ""
@@ -1612,12 +1630,12 @@ msgid "Operation Type"
msgstr "" msgstr ""
#: allianceauth/optimer/form.py:17 #: allianceauth/optimer/form.py:17
#: allianceauth/srp/templates/srp/management.html:47 #: allianceauth/srp/templates/srp/management.html:45
msgid "Fleet Commander" msgid "Fleet Commander"
msgstr "" msgstr ""
#: allianceauth/optimer/form.py:22 allianceauth/srp/form.py:14 #: allianceauth/optimer/form.py:22 allianceauth/srp/form.py:14
#: allianceauth/srp/templates/srp/data.html:72 #: allianceauth/srp/templates/srp/data.html:70
msgid "Additional Info" msgid "Additional Info"
msgstr "" msgstr ""
@@ -1626,7 +1644,7 @@ msgid "(Optional) Describe the operation with a couple of short words."
msgstr "" msgstr ""
#: allianceauth/optimer/templates/optimer/add.html:8 #: allianceauth/optimer/templates/optimer/add.html:8
#: allianceauth/optimer/templates/optimer/management.html:18 #: allianceauth/optimer/templates/optimer/management.html:16
msgid "Create Operation" msgid "Create Operation"
msgstr "" msgstr ""
@@ -1675,26 +1693,26 @@ msgstr ""
msgid "Fleet Operation Management" msgid "Fleet Operation Management"
msgstr "" msgstr ""
#: allianceauth/optimer/templates/optimer/management.html:28 #: allianceauth/optimer/templates/optimer/management.html:26
#: allianceauth/timerboard/templates/timerboard/view.html:32 #: allianceauth/timerboard/templates/timerboard/view.html:30
msgid "Current EVE time:" msgid "Current EVE time:"
msgstr "" msgstr ""
#: allianceauth/optimer/templates/optimer/management.html:36 #: allianceauth/optimer/templates/optimer/management.html:34
msgid "Next Fleet Operations" msgid "Next Fleet Operations"
msgstr "" msgstr ""
#: allianceauth/optimer/templates/optimer/management.html:44 #: allianceauth/optimer/templates/optimer/management.html:42
#: allianceauth/timerboard/templates/timerboard/view.html:63 #: allianceauth/timerboard/templates/timerboard/view.html:61
msgid "No upcoming timers." msgid "No upcoming timers."
msgstr "" msgstr ""
#: allianceauth/optimer/templates/optimer/management.html:52 #: allianceauth/optimer/templates/optimer/management.html:50
msgid "Past Fleet Operations" msgid "Past Fleet Operations"
msgstr "" msgstr ""
#: allianceauth/optimer/templates/optimer/management.html:60 #: allianceauth/optimer/templates/optimer/management.html:58
#: allianceauth/timerboard/templates/timerboard/view.html:81 #: allianceauth/timerboard/templates/timerboard/view.html:79
msgid "No past timers." msgid "No past timers."
msgstr "" msgstr ""
@@ -2262,7 +2280,7 @@ msgid "Enabled"
msgstr "" msgstr ""
#: allianceauth/services/templates/services/service_status.html:7 #: allianceauth/services/templates/services/service_status.html:7
#: allianceauth/srp/templates/srp/management.html:78 #: allianceauth/srp/templates/srp/management.html:76
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""
@@ -2300,12 +2318,12 @@ msgid "Ship Replacement"
msgstr "" msgstr ""
#: allianceauth/srp/form.py:9 #: allianceauth/srp/form.py:9
#: allianceauth/srp/templates/srp/management.html:45 #: allianceauth/srp/templates/srp/management.html:43
msgid "Fleet Time" msgid "Fleet Time"
msgstr "" msgstr ""
#: allianceauth/srp/form.py:10 #: allianceauth/srp/form.py:10
#: allianceauth/srp/templates/srp/management.html:46 #: allianceauth/srp/templates/srp/management.html:44
msgid "Fleet Doctrine" msgid "Fleet Doctrine"
msgstr "" msgstr ""
@@ -2354,7 +2372,7 @@ msgid "Give this link to the line members."
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:8 #: allianceauth/srp/templates/srp/data.html:8
#: allianceauth/srp/templates/srp/data.html:39 #: allianceauth/srp/templates/srp/data.html:37
msgid "SRP Fleet Data" msgid "SRP Fleet Data"
msgstr "" msgstr ""
@@ -2362,64 +2380,64 @@ msgstr ""
msgid "View Fleets" msgid "View Fleets"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:26 #: allianceauth/srp/templates/srp/data.html:24
msgid "Mark Incomplete" msgid "Mark Incomplete"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:30 #: allianceauth/srp/templates/srp/data.html:28
msgid "Mark Completed" msgid "Mark Completed"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:48 #: allianceauth/srp/templates/srp/data.html:46
#: allianceauth/srp/templates/srp/data.html:142 #: allianceauth/srp/templates/srp/data.html:140
msgid "Total Losses:" msgid "Total Losses:"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:49 #: allianceauth/srp/templates/srp/data.html:47
#: allianceauth/srp/templates/srp/data.html:143 #: allianceauth/srp/templates/srp/data.html:141
#: allianceauth/srp/templates/srp/management.html:36 #: allianceauth/srp/templates/srp/management.html:34
msgid "Total ISK Cost:" msgid "Total ISK Cost:"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:60 #: allianceauth/srp/templates/srp/data.html:58
#: allianceauth/srp/templates/srp/data.html:154 #: allianceauth/srp/templates/srp/data.html:152
msgid "Are you sure you want to delete SRP requests?" msgid "Are you sure you want to delete SRP requests?"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:70 #: allianceauth/srp/templates/srp/data.html:68
msgid "Pilot Name" msgid "Pilot Name"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:71 #: allianceauth/srp/templates/srp/data.html:69
msgid "Killboard Link" msgid "Killboard Link"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:73 #: allianceauth/srp/templates/srp/data.html:71
msgid "Ship Type" msgid "Ship Type"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:74 #: allianceauth/srp/templates/srp/data.html:72
msgid "Killboard Loss Amt" msgid "Killboard Loss Amt"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:76 #: allianceauth/srp/templates/srp/data.html:74
msgid "SRP ISK Cost" msgid "SRP ISK Cost"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:77 #: allianceauth/srp/templates/srp/data.html:75
msgid "Click value to edit Enter to save & next ESC to cancel" msgid "Click value to edit Enter to save & next ESC to cancel"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:80 #: allianceauth/srp/templates/srp/data.html:78
msgid "Post Time" msgid "Post Time"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:102 #: allianceauth/srp/templates/srp/data.html:100
#: allianceauth/srp/templates/srp/management.html:70 #: allianceauth/srp/templates/srp/management.html:68
msgid "Link" msgid "Link"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:163 #: allianceauth/srp/templates/srp/data.html:161
msgid "No SRP requests for this fleet." msgid "No SRP requests for this fleet."
msgstr "" msgstr ""
@@ -2431,39 +2449,39 @@ msgstr ""
msgid "View All" msgid "View All"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/management.html:27 #: allianceauth/srp/templates/srp/management.html:25
msgid "Add SRP Fleet" msgid "Add SRP Fleet"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/management.html:48 #: allianceauth/srp/templates/srp/management.html:46
msgid "Fleet AAR" msgid "Fleet AAR"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/management.html:49 #: allianceauth/srp/templates/srp/management.html:47
msgid "Fleet SRP Code" msgid "Fleet SRP Code"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/management.html:50 #: allianceauth/srp/templates/srp/management.html:48
msgid "Fleet ISK Cost" msgid "Fleet ISK Cost"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/management.html:51 #: allianceauth/srp/templates/srp/management.html:49
msgid "SRP Status" msgid "SRP Status"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/management.html:52 #: allianceauth/srp/templates/srp/management.html:50
msgid "Pending Requests" msgid "Pending Requests"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/management.html:91 #: allianceauth/srp/templates/srp/management.html:89
msgid "Completed" msgid "Completed"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/management.html:108 #: allianceauth/srp/templates/srp/management.html:106
msgid "Are you sure you want to delete this SRP code and its contents?" msgid "Are you sure you want to delete this SRP code and its contents?"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/management.html:129 #: allianceauth/srp/templates/srp/management.html:127
msgid "No SRP fleets created." msgid "No SRP fleets created."
msgstr "" msgstr ""
@@ -2599,67 +2617,120 @@ msgstr ""
msgid "Your Server received an ESI error response code of " msgid "Your Server received an ESI error response code of "
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:8 #: allianceauth/templates/allianceauth/admin-status/overview.html:11
msgid "Alliance Auth Notifications" msgid "second"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:20 #: allianceauth/templates/allianceauth/admin-status/overview.html:12
msgid "No notifications at this time" msgid "seconds"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:29 #: allianceauth/templates/allianceauth/admin-status/overview.html:13
msgid "Powered by GitLab" msgid "minute"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:35 #: allianceauth/templates/allianceauth/admin-status/overview.html:14
msgid "Support Discord" msgid "minutes"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:49 #: allianceauth/templates/allianceauth/admin-status/overview.html:15
#: allianceauth/templates/allianceauth/admin-status/overview.html:53 msgid "hour"
msgid "Software Version"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:56 #: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Current" msgid "hours"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:63 #: allianceauth/templates/allianceauth/admin-status/overview.html:17
msgid "Latest Stable" msgid "N/A"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:68 #: allianceauth/templates/allianceauth/admin-status/overview.html:18
msgid "Update available" msgid "ERROR"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:76 #: allianceauth/templates/allianceauth/admin-status/overview.html:19
msgid "Latest Pre-Release"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:81
msgid "Pre-Release available"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
msgid "Task Queue"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:96
#, python-format
msgid ""
"\n"
" Status of %(total)s processed tasks • last %(latest)s\n"
" "
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:112
msgid "running" msgid "running"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:113 #: allianceauth/templates/allianceauth/admin-status/overview.html:20
msgid "queued" msgid "queued"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:21
msgid "succeeded"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:22
msgid "retried"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:23
msgid "failed"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:29
msgid "Debug mode"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:34
msgid ""
"Debug mode is currently turned on!<br>Make sure to turn it off as soon as "
"you are finished testing."
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:46
msgid "Alliance Auth Notifications"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:58
msgid "No notifications at this time"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Powered by GitLab"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:73
msgid "Support Discord"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:87
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
msgid "Software Version"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:94
msgid "Current"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:101
msgid "Latest Stable"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:106
msgid "Update available"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:114
msgid "Latest Pre-Release"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:119
msgid "Pre-Release available"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:129
msgid "Task Queue"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:134
msgid ""
"\n"
" Status of <span id=\"total-task-count\">?</span> processed tasks • last <span id=\"celery-uptime\">?</span>\n"
" "
msgstr ""
#: allianceauth/templates/allianceauth/top-menu-admin.html:19 #: allianceauth/templates/allianceauth/top-menu-admin.html:19
msgid "AA Documentation" msgid "AA Documentation"
msgstr "" msgstr ""
@@ -2883,7 +2954,7 @@ msgid "Theft"
msgstr "" msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7 #: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:54 #: allianceauth/timerboard/templates/timerboard/view.html:52
msgid "Upcoming Timers" msgid "Upcoming Timers"
msgstr "" msgstr ""
@@ -2911,7 +2982,7 @@ msgid "Create Timer"
msgstr "" msgstr ""
#: allianceauth/timerboard/templates/timerboard/timer_create_form.html:9 #: allianceauth/timerboard/templates/timerboard/timer_create_form.html:9
#: allianceauth/timerboard/templates/timerboard/view.html:22 #: allianceauth/timerboard/templates/timerboard/view.html:20
msgid "Create Structure Timer" msgid "Create Structure Timer"
msgstr "" msgstr ""
@@ -2929,11 +3000,11 @@ msgstr ""
msgid "Structure Timer Management" msgid "Structure Timer Management"
msgstr "" msgstr ""
#: allianceauth/timerboard/templates/timerboard/view.html:41 #: allianceauth/timerboard/templates/timerboard/view.html:39
msgid "Corporation Timers" msgid "Corporation Timers"
msgstr "" msgstr ""
#: allianceauth/timerboard/templates/timerboard/view.html:72 #: allianceauth/timerboard/templates/timerboard/view.html:70
msgid "Past Timers" msgid "Past Timers"
msgstr "" msgstr ""

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-21 13:44+1000\n" "POT-Creation-Date: 2025-11-13 10:19+1000\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"
@@ -57,7 +57,7 @@ msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:72 #: allianceauth/authentication/models.py:72
#: allianceauth/project_template/project_name/settings/base.py:104 #: allianceauth/project_template/project_name/settings/base.py:105
msgid "English" msgid "English"
msgstr "" msgstr ""
@@ -66,57 +66,57 @@ msgid "Czech"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:74 #: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:106 #: allianceauth/project_template/project_name/settings/base.py:107
msgid "German" msgid "German"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:75 #: allianceauth/authentication/models.py:75
#: allianceauth/project_template/project_name/settings/base.py:107 #: allianceauth/project_template/project_name/settings/base.py:108
msgid "Spanish" msgid "Spanish"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:76 #: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:108 #: allianceauth/project_template/project_name/settings/base.py:109
msgid "Italian" msgid "Italian"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:77 #: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:109 #: allianceauth/project_template/project_name/settings/base.py:110
msgid "Japanese" msgid "Japanese"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:78 #: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:110 #: allianceauth/project_template/project_name/settings/base.py:111
msgid "Korean" msgid "Korean"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:79 #: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:111 #: allianceauth/project_template/project_name/settings/base.py:112
msgid "French" msgid "French"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:80 #: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:114 #: allianceauth/project_template/project_name/settings/base.py:115
msgid "Russian" msgid "Russian"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:81 #: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:112 #: allianceauth/project_template/project_name/settings/base.py:113
msgid "Dutch" msgid "Dutch"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:82 #: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:113 #: allianceauth/project_template/project_name/settings/base.py:114
msgid "Polish" msgid "Polish"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:83 #: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:115 #: allianceauth/project_template/project_name/settings/base.py:116
msgid "Ukrainian" msgid "Ukrainian"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:84 #: allianceauth/authentication/models.py:84
#: allianceauth/project_template/project_name/settings/base.py:116 #: allianceauth/project_template/project_name/settings/base.py:117
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "" msgstr ""
@@ -125,22 +125,30 @@ msgstr ""
msgid "Language" msgid "Language"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:105 #: allianceauth/authentication/models.py:106
#: allianceauth/templates/allianceauth/night-toggle.html:6 #: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode" msgid "Night Mode"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:109 #: allianceauth/authentication/models.py:110
#: allianceauth/theme/templates/theme/theme_select.html:4 #: allianceauth/theme/templates/theme/theme_select.html:4
msgid "Theme" msgid "Theme"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:126 #: allianceauth/authentication/models.py:117
msgid "Minimize Sidebar Menu"
msgstr ""
#: allianceauth/authentication/models.py:119
msgid "Keep the sidebar menu minimized"
msgstr ""
#: allianceauth/authentication/models.py:133
#, python-format #, python-format
msgid "State changed to: %s" msgid "State changed to: %s"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:127 #: allianceauth/authentication/models.py:134
#, python-format #, python-format
msgid "Your user's state is now: %(state)s" msgid "Your user's state is now: %(state)s"
msgstr "" msgstr ""
@@ -200,8 +208,8 @@ msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:7 #: allianceauth/authentication/templates/authentication/tokens.html:7
#: allianceauth/authentication/templates/authentication/tokens.html:11 #: allianceauth/authentication/templates/authentication/tokens.html:11
#: allianceauth/menu/templates/menu/menu-user.html:133 #: allianceauth/menu/templates/menu/menu-user.html:158
#: allianceauth/menu/templates/menu/menu-user.html:136 #: allianceauth/menu/templates/menu/menu-user.html:161
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62
msgid "Token Management" msgid "Token Management"
msgstr "" msgstr ""
@@ -747,8 +755,8 @@ msgstr ""
#: allianceauth/fleetactivitytracking/views.py:323 #: allianceauth/fleetactivitytracking/views.py:323
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"Cannot register the fleet participation for {character.character_name}. The " "Cannot register the fleet participation for {character_name}. The character "
"character needs to be online." "needs to be online."
msgstr "" msgstr ""
#: allianceauth/framework/apps.py:16 #: allianceauth/framework/apps.py:16
@@ -1486,37 +1494,45 @@ msgid "Notifications"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:77 #: allianceauth/menu/templates/menu/menu-user.html:77
msgid "Sidebar"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:93
msgid "Minimize Sidebar"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:102
msgid "Super User" msgid "Super User"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:83 #: allianceauth/menu/templates/menu/menu-user.html:108
#: allianceauth/menu/templates/menu/menu-user.html:86 #: allianceauth/menu/templates/menu/menu-user.html:111
msgid "Alliance Auth Documentation" msgid "Alliance Auth Documentation"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:94 #: allianceauth/menu/templates/menu/menu-user.html:119
#: allianceauth/menu/templates/menu/menu-user.html:97 #: allianceauth/menu/templates/menu/menu-user.html:122
msgid "Alliance Auth Discord" msgid "Alliance Auth Discord"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:105 #: allianceauth/menu/templates/menu/menu-user.html:130
#: allianceauth/menu/templates/menu/menu-user.html:108 #: allianceauth/menu/templates/menu/menu-user.html:133
msgid "Alliance Auth Git" msgid "Alliance Auth Git"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:118 #: allianceauth/menu/templates/menu/menu-user.html:143
#: allianceauth/menu/templates/menu/menu-user.html:121 #: allianceauth/menu/templates/menu/menu-user.html:146
#: allianceauth/templates/allianceauth/top-menu-admin.html:9 #: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin" msgid "Admin"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:144 #: allianceauth/menu/templates/menu/menu-user.html:169
#: allianceauth/menu/templates/menu/menu-user.html:147 #: allianceauth/menu/templates/menu/menu-user.html:172
msgid "Sign Out" msgid "Sign Out"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:155 #: allianceauth/menu/templates/menu/menu-user.html:180
#: allianceauth/menu/templates/menu/menu-user.html:158 #: allianceauth/menu/templates/menu/menu-user.html:183
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:13 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:13
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:14 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:14
msgid "Sign In" msgid "Sign In"
@@ -1777,9 +1793,9 @@ msgstr ""
msgid "That service account already exists" msgid "That service account already exists"
msgstr "" msgstr ""
#: allianceauth/services/abstract.py:103 #: allianceauth/services/abstract.py:105
#, python-brace-format #, python-brace-format
msgid "Successfully set your {self.service_name} password" msgid "Successfully set your {service_name} password"
msgstr "" msgstr ""
#: allianceauth/services/apps.py:8 allianceauth/services/auth_hooks.py:12 #: allianceauth/services/apps.py:8 allianceauth/services/auth_hooks.py:12
@@ -2318,11 +2334,11 @@ msgstr ""
msgid "Invalid Link. Please use zkillboard.com or kb.evetools.org" msgid "Invalid Link. Please use zkillboard.com or kb.evetools.org"
msgstr "" msgstr ""
#: allianceauth/srp/form.py:46 #: allianceauth/srp/form.py:49
msgid "Invalid Link. Please post a direct link to a killmail." msgid "Invalid Link. Please post a direct link to a killmail."
msgstr "" msgstr ""
#: allianceauth/srp/form.py:53 #: allianceauth/srp/form.py:56
msgid "After Action Report Link" msgid "After Action Report Link"
msgstr "" msgstr ""
@@ -2596,7 +2612,7 @@ msgstr ""
msgid "Saved changes to SRP fleet %(fleetname)s" msgid "Saved changes to SRP fleet %(fleetname)s"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/esi_check.html:4 #: allianceauth/templates/allianceauth/admin-status/esi_check.html:5
msgid "Your Server received an ESI error response code of " msgid "Your Server received an ESI error response code of "
msgstr "" msgstr ""
@@ -3001,36 +3017,36 @@ msgstr ""
msgid "Saved changes to the timer." msgid "Saved changes to the timer."
msgstr "" msgstr ""
#: allianceauth/views.py:55 #: allianceauth/views.py:78
msgid "Bad Request" msgid "Bad Request"
msgstr "" msgstr ""
#: allianceauth/views.py:57 allianceauth/views.py:87 #: allianceauth/views.py:80 allianceauth/views.py:110
msgid "" msgid ""
"Auth encountered an error processing your request, please try again. If the " "Auth encountered an error processing your request, please try again. If the "
"error persists, please contact the administrators." "error persists, please contact the administrators."
msgstr "" msgstr ""
#: allianceauth/views.py:65 #: allianceauth/views.py:88
msgid "Permission Denied" msgid "Permission Denied"
msgstr "" msgstr ""
#: allianceauth/views.py:67 #: allianceauth/views.py:90
msgid "" msgid ""
"You do not have permission to access the requested page. If you believe this " "You do not have permission to access the requested page. If you believe this "
"is in error please contact the administrators." "is in error please contact the administrators."
msgstr "" msgstr ""
#: allianceauth/views.py:75 #: allianceauth/views.py:98
msgid "Page Not Found" msgid "Page Not Found"
msgstr "" msgstr ""
#: allianceauth/views.py:77 #: allianceauth/views.py:100
msgid "" msgid ""
"Page does not exist. If you believe this is in error please contact the " "Page does not exist. If you believe this is in error please contact the "
"administrators. " "administrators. "
msgstr "" msgstr ""
#: allianceauth/views.py:85 #: allianceauth/views.py:108
msgid "Internal Server Error" msgid "Internal Server Error"
msgstr "" msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -13,7 +13,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: 2025-06-19 20:23+1000\n" "POT-Creation-Date: 2025-09-21 13:44+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Machiel Broekman, 2025\n" "Last-Translator: Machiel Broekman, 2025\n"
"Language-Team: Dutch (Netherlands) (https://app.transifex.com/alliance-auth/teams/107430/nl_NL/)\n" "Language-Team: Dutch (Netherlands) (https://app.transifex.com/alliance-auth/teams/107430/nl_NL/)\n"
@@ -71,7 +71,7 @@ msgstr ""
"Je bent niet gemachtigd om de volgende beperkte groepen te verwijderen: %s" "Je bent niet gemachtigd om de volgende beperkte groepen te verwijderen: %s"
#: allianceauth/authentication/models.py:72 #: allianceauth/authentication/models.py:72
#: allianceauth/project_template/project_name/settings/base.py:106 #: allianceauth/project_template/project_name/settings/base.py:104
msgid "English" msgid "English"
msgstr "Engels" msgstr "Engels"
@@ -80,57 +80,57 @@ msgid "Czech"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:74 #: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:108 #: allianceauth/project_template/project_name/settings/base.py:106
msgid "German" msgid "German"
msgstr "Duits" msgstr "Duits"
#: allianceauth/authentication/models.py:75 #: allianceauth/authentication/models.py:75
#: allianceauth/project_template/project_name/settings/base.py:109 #: allianceauth/project_template/project_name/settings/base.py:107
msgid "Spanish" msgid "Spanish"
msgstr "Spaans" msgstr "Spaans"
#: allianceauth/authentication/models.py:76 #: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:110 #: allianceauth/project_template/project_name/settings/base.py:108
msgid "Italian" msgid "Italian"
msgstr "Italiaans" msgstr "Italiaans"
#: allianceauth/authentication/models.py:77 #: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:111 #: allianceauth/project_template/project_name/settings/base.py:109
msgid "Japanese" msgid "Japanese"
msgstr "Japans" msgstr "Japans"
#: allianceauth/authentication/models.py:78 #: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:112 #: allianceauth/project_template/project_name/settings/base.py:110
msgid "Korean" msgid "Korean"
msgstr "Koreaans" msgstr "Koreaans"
#: allianceauth/authentication/models.py:79 #: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:113 #: allianceauth/project_template/project_name/settings/base.py:111
msgid "French" msgid "French"
msgstr "Frans" msgstr "Frans"
#: allianceauth/authentication/models.py:80 #: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:116 #: allianceauth/project_template/project_name/settings/base.py:114
msgid "Russian" msgid "Russian"
msgstr "Russisch" msgstr "Russisch"
#: allianceauth/authentication/models.py:81 #: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:114 #: allianceauth/project_template/project_name/settings/base.py:112
msgid "Dutch" msgid "Dutch"
msgstr "Nederlands" msgstr "Nederlands"
#: allianceauth/authentication/models.py:82 #: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:115 #: allianceauth/project_template/project_name/settings/base.py:113
msgid "Polish" msgid "Polish"
msgstr "Pools" msgstr "Pools"
#: allianceauth/authentication/models.py:83 #: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:117 #: allianceauth/project_template/project_name/settings/base.py:115
msgid "Ukrainian" msgid "Ukrainian"
msgstr "Oekraïens" msgstr "Oekraïens"
#: allianceauth/authentication/models.py:84 #: allianceauth/authentication/models.py:84
#: allianceauth/project_template/project_name/settings/base.py:118 #: allianceauth/project_template/project_name/settings/base.py:116
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "Eenvoudig Chinees" msgstr "Eenvoudig Chinees"
@@ -175,14 +175,12 @@ msgstr "Karakter"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:11 #: allianceauth/authentication/templates/authentication/dashboard_characters.html:11
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:12 #: allianceauth/authentication/templates/authentication/dashboard_characters.html:12
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:4 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:4
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:6
msgid "Add Character" msgid "Add Character"
msgstr "Personages toevoegen" msgstr "Personages toevoegen"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14 #: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:15 #: allianceauth/authentication/templates/authentication/dashboard_characters.html:15
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:10 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:8
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:12
msgid "Change Main" msgid "Change Main"
msgstr "Verander Main" msgstr "Verander Main"
@@ -242,8 +240,8 @@ msgstr "Scopes"
#: allianceauth/hrapplications/templates/hrapplications/management.html:168 #: allianceauth/hrapplications/templates/hrapplications/management.html:168
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:35 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:35
#: allianceauth/hrapplications/templates/hrapplications/view.html:94 #: allianceauth/hrapplications/templates/hrapplications/view.html:94
#: allianceauth/srp/templates/srp/data.html:83 #: allianceauth/srp/templates/srp/data.html:81
#: allianceauth/srp/templates/srp/management.html:53 #: allianceauth/srp/templates/srp/management.html:51
msgid "Actions" msgid "Actions"
msgstr "Acties" msgstr "Acties"
@@ -294,7 +292,7 @@ msgstr "Registreer"
msgid "Invalid or expired activation link." msgid "Invalid or expired activation link."
msgstr "Ongeldige of verlopen activeringslink." msgstr "Ongeldige of verlopen activeringslink."
#: allianceauth/authentication/views.py:158 #: allianceauth/authentication/views.py:159
#, python-format #, python-format
msgid "" msgid ""
"Cannot change main character to %(char)s: character owned by a different " "Cannot change main character to %(char)s: character owned by a different "
@@ -303,23 +301,23 @@ msgstr ""
"Het hoofdkarakter kan niet worden gewijzigd naar %(char)s: Karakter is " "Het hoofdkarakter kan niet worden gewijzigd naar %(char)s: Karakter is "
"eigendom van een ander account." "eigendom van een ander account."
#: allianceauth/authentication/views.py:165 #: allianceauth/authentication/views.py:166
#, python-format #, python-format
msgid "Changed main character to %s" msgid "Changed main character to %s"
msgstr "Hoofdkarakter veranderd naar %s" msgstr "Hoofdkarakter veranderd naar %s"
#: allianceauth/authentication/views.py:179 #: allianceauth/authentication/views.py:180
#, python-format #, python-format
msgid "Added %(name)s to your account." msgid "Added %(name)s to your account."
msgstr "%(name)s aan uw account toegevoegd." msgstr "%(name)s aan uw account toegevoegd."
#: allianceauth/authentication/views.py:181 #: allianceauth/authentication/views.py:182
#, python-format #, python-format
msgid "Failed to add %(name)s to your account: they already have an account." msgid "Failed to add %(name)s to your account: they already have an account."
msgstr "" msgstr ""
"Toevoegen van %(name)s aan uw account is mislukt: ze hebben al een account." "Toevoegen van %(name)s aan uw account is mislukt: ze hebben al een account."
#: allianceauth/authentication/views.py:226 #: allianceauth/authentication/views.py:227
msgid "" msgid ""
"Unable to authenticate as the selected character. Please log in with the " "Unable to authenticate as the selected character. Please log in with the "
"main character associated with this account." "main character associated with this account."
@@ -327,11 +325,11 @@ msgstr ""
"Niet mogelijk om te authenticeren als de geselecteerde karakter. Log " "Niet mogelijk om te authenticeren als de geselecteerde karakter. Log "
"alstublieft in met het hoofdkarakter dat aan dit account is gekoppeld." "alstublieft in met het hoofdkarakter dat aan dit account is gekoppeld."
#: allianceauth/authentication/views.py:293 #: allianceauth/authentication/views.py:294
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "Registratietoken is verlopen." msgstr "Registratietoken is verlopen."
#: allianceauth/authentication/views.py:354 #: allianceauth/authentication/views.py:355
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
@@ -339,11 +337,11 @@ msgstr ""
"E-mail met bevestiging verzonden. Volg de link om uw e-mailadres te " "E-mail met bevestiging verzonden. Volg de link om uw e-mailadres te "
"bevestigen." "bevestigen."
#: allianceauth/authentication/views.py:360 #: allianceauth/authentication/views.py:361
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "Uw e-mailadres is bevestigd. Gelieve in te loggen om verder te gaan." msgstr "Uw e-mailadres is bevestigd. Gelieve in te loggen om verder te gaan."
#: allianceauth/authentication/views.py:366 #: allianceauth/authentication/views.py:367
msgid "Registration of new accounts is not allowed at this time." msgid "Registration of new accounts is not allowed at this time."
msgstr "Registratie van nieuwe accounts in momenteel niet toegestaan." msgstr "Registratie van nieuwe accounts in momenteel niet toegestaan."
@@ -360,11 +358,11 @@ msgstr "Gegevens van bedrijfsleden"
msgid "Corporations" msgid "Corporations"
msgstr "Bedrijven" msgstr "Bedrijven"
#: allianceauth/corputils/templates/corputils/base.html:35 #: allianceauth/corputils/templates/corputils/base.html:31
msgid "Add corporation" msgid "Add corporation"
msgstr "Voeg bedrijf toe" msgstr "Voeg bedrijf toe"
#: allianceauth/corputils/templates/corputils/base.html:51 #: allianceauth/corputils/templates/corputils/base.html:47
msgid "Search all corporations..." msgid "Search all corporations..."
msgstr "Zoek in alle bedrijven..." msgstr "Zoek in alle bedrijven..."
@@ -514,7 +512,7 @@ msgid "Fleet Activity Tracking"
msgstr "Fleetactiviteit Tracking" msgstr "Fleetactiviteit Tracking"
#: allianceauth/fleetactivitytracking/forms.py:6 allianceauth/srp/form.py:8 #: allianceauth/fleetactivitytracking/forms.py:6 allianceauth/srp/form.py:8
#: allianceauth/srp/templates/srp/management.html:44 #: allianceauth/srp/templates/srp/management.html:42
msgid "Fleet Name" msgid "Fleet Name"
msgstr "Fleet naam" msgstr "Fleet naam"
@@ -1002,7 +1000,7 @@ msgstr "Beschrijving"
#: allianceauth/hrapplications/templates/hrapplications/management.html:123 #: allianceauth/hrapplications/templates/hrapplications/management.html:123
#: allianceauth/hrapplications/templates/hrapplications/management.html:167 #: allianceauth/hrapplications/templates/hrapplications/management.html:167
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:34 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:34
#: allianceauth/srp/templates/srp/data.html:81 #: allianceauth/srp/templates/srp/data.html:79
msgid "Status" msgid "Status"
msgstr "Status" msgstr "Status"
@@ -1015,7 +1013,7 @@ msgid "Hidden"
msgstr "verborgen" msgstr "verborgen"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:15 #: allianceauth/templates/allianceauth/admin-status/overview.html:53
msgid "Open" msgid "Open"
msgstr "Open" msgstr "Open"
@@ -1060,18 +1058,10 @@ msgstr "Groep"
msgid "Leave" msgid "Leave"
msgstr "Verlaat" msgstr "Verlaat"
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:74 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:73
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:89 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:88
#: allianceauth/hrapplications/templates/hrapplications/management.html:46 msgid "Request pending"
#: allianceauth/hrapplications/templates/hrapplications/management.html:95 msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/management.html:138
#: allianceauth/hrapplications/templates/hrapplications/management.html:182
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:46
#: allianceauth/hrapplications/templates/hrapplications/view.html:25
#: allianceauth/srp/templates/srp/data.html:120
#: allianceauth/srp/templates/srp/management.html:87
msgid "Pending"
msgstr "In behandeling"
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:80 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:80
msgid "Join" msgid "Join"
@@ -1081,7 +1071,11 @@ msgstr "Toetreden"
msgid "Request" msgid "Request"
msgstr "Aanvraag" msgstr "Aanvraag"
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:99 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:93
msgid "Retract"
msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:103
msgid "No groups available." msgid "No groups available."
msgstr "" msgstr ""
@@ -1210,6 +1204,19 @@ msgstr ""
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:438
msgid "You cannot retract that request"
msgstr ""
#: allianceauth/groupmanagement/views.py:450
#, python-format
msgid "Retracted application to group %(group)s."
msgstr ""
#: allianceauth/groupmanagement/views.py:458
msgid "You have no open request for that group."
msgstr ""
#: allianceauth/hrapplications/apps.py:8 #: allianceauth/hrapplications/apps.py:8
msgid "HR Applications" msgid "HR Applications"
msgstr "" msgstr ""
@@ -1280,12 +1287,23 @@ msgstr ""
msgid "Username" msgid "Username"
msgstr "Gebruikersnaam" msgstr "Gebruikersnaam"
#: allianceauth/hrapplications/templates/hrapplications/management.html:46
#: allianceauth/hrapplications/templates/hrapplications/management.html:95
#: allianceauth/hrapplications/templates/hrapplications/management.html:138
#: allianceauth/hrapplications/templates/hrapplications/management.html:182
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:46
#: allianceauth/hrapplications/templates/hrapplications/view.html:25
#: allianceauth/srp/templates/srp/data.html:118
#: allianceauth/srp/templates/srp/management.html:85
msgid "Pending"
msgstr "In behandeling"
#: allianceauth/hrapplications/templates/hrapplications/management.html:48 #: allianceauth/hrapplications/templates/hrapplications/management.html:48
#: allianceauth/hrapplications/templates/hrapplications/management.html:141 #: allianceauth/hrapplications/templates/hrapplications/management.html:141
#: allianceauth/hrapplications/templates/hrapplications/management.html:185 #: allianceauth/hrapplications/templates/hrapplications/management.html:185
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:48 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:48
#: allianceauth/hrapplications/templates/hrapplications/view.html:21 #: allianceauth/hrapplications/templates/hrapplications/view.html:21
#: allianceauth/srp/templates/srp/data.html:112 #: allianceauth/srp/templates/srp/data.html:110
msgid "Approved" msgid "Approved"
msgstr "Aanvaard" msgstr "Aanvaard"
@@ -1293,7 +1311,7 @@ msgstr "Aanvaard"
#: allianceauth/hrapplications/templates/hrapplications/management.html:143 #: allianceauth/hrapplications/templates/hrapplications/management.html:143
#: allianceauth/hrapplications/templates/hrapplications/management.html:187 #: allianceauth/hrapplications/templates/hrapplications/management.html:187
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:50 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:50
#: allianceauth/srp/templates/srp/data.html:116 #: allianceauth/srp/templates/srp/data.html:114
msgid "Rejected" msgid "Rejected"
msgstr "Afgewezen" msgstr "Afgewezen"
@@ -1528,8 +1546,8 @@ msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:155 #: allianceauth/menu/templates/menu/menu-user.html:155
#: allianceauth/menu/templates/menu/menu-user.html:158 #: allianceauth/menu/templates/menu/menu-user.html:158
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:13
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:14
msgid "Sign In" msgid "Sign In"
msgstr "" msgstr ""
@@ -1557,11 +1575,11 @@ msgstr "Ongelezen"
msgid "Read" msgid "Read"
msgstr "Gelezen" msgstr "Gelezen"
#: allianceauth/notifications/templates/notifications/list.html:32 #: allianceauth/notifications/templates/notifications/list.html:31
msgid "Mark all notifications as read" msgid "Mark all notifications as read"
msgstr "" msgstr ""
#: allianceauth/notifications/templates/notifications/list.html:38 #: allianceauth/notifications/templates/notifications/list.html:35
msgid "Delete all read notifications" msgid "Delete all read notifications"
msgstr "" msgstr ""
@@ -1626,12 +1644,12 @@ msgid "Operation Type"
msgstr "" msgstr ""
#: allianceauth/optimer/form.py:17 #: allianceauth/optimer/form.py:17
#: allianceauth/srp/templates/srp/management.html:47 #: allianceauth/srp/templates/srp/management.html:45
msgid "Fleet Commander" msgid "Fleet Commander"
msgstr "" msgstr ""
#: allianceauth/optimer/form.py:22 allianceauth/srp/form.py:14 #: allianceauth/optimer/form.py:22 allianceauth/srp/form.py:14
#: allianceauth/srp/templates/srp/data.html:72 #: allianceauth/srp/templates/srp/data.html:70
msgid "Additional Info" msgid "Additional Info"
msgstr "" msgstr ""
@@ -1640,7 +1658,7 @@ msgid "(Optional) Describe the operation with a couple of short words."
msgstr "" msgstr ""
#: allianceauth/optimer/templates/optimer/add.html:8 #: allianceauth/optimer/templates/optimer/add.html:8
#: allianceauth/optimer/templates/optimer/management.html:18 #: allianceauth/optimer/templates/optimer/management.html:16
msgid "Create Operation" msgid "Create Operation"
msgstr "" msgstr ""
@@ -1689,26 +1707,26 @@ msgstr "Vloot Commandant"
msgid "Fleet Operation Management" msgid "Fleet Operation Management"
msgstr "" msgstr ""
#: allianceauth/optimer/templates/optimer/management.html:28 #: allianceauth/optimer/templates/optimer/management.html:26
#: allianceauth/timerboard/templates/timerboard/view.html:32 #: allianceauth/timerboard/templates/timerboard/view.html:30
msgid "Current EVE time:" msgid "Current EVE time:"
msgstr "" msgstr ""
#: allianceauth/optimer/templates/optimer/management.html:36 #: allianceauth/optimer/templates/optimer/management.html:34
msgid "Next Fleet Operations" msgid "Next Fleet Operations"
msgstr "" msgstr ""
#: allianceauth/optimer/templates/optimer/management.html:44 #: allianceauth/optimer/templates/optimer/management.html:42
#: allianceauth/timerboard/templates/timerboard/view.html:63 #: allianceauth/timerboard/templates/timerboard/view.html:61
msgid "No upcoming timers." msgid "No upcoming timers."
msgstr "" msgstr ""
#: allianceauth/optimer/templates/optimer/management.html:52 #: allianceauth/optimer/templates/optimer/management.html:50
msgid "Past Fleet Operations" msgid "Past Fleet Operations"
msgstr "" msgstr ""
#: allianceauth/optimer/templates/optimer/management.html:60 #: allianceauth/optimer/templates/optimer/management.html:58
#: allianceauth/timerboard/templates/timerboard/view.html:81 #: allianceauth/timerboard/templates/timerboard/view.html:79
msgid "No past timers." msgid "No past timers."
msgstr "" msgstr ""
@@ -2276,7 +2294,7 @@ msgid "Enabled"
msgstr "" msgstr ""
#: allianceauth/services/templates/services/service_status.html:7 #: allianceauth/services/templates/services/service_status.html:7
#: allianceauth/srp/templates/srp/management.html:78 #: allianceauth/srp/templates/srp/management.html:76
msgid "Disabled" msgid "Disabled"
msgstr "Uitgeschakeld" msgstr "Uitgeschakeld"
@@ -2314,12 +2332,12 @@ msgid "Ship Replacement"
msgstr "" msgstr ""
#: allianceauth/srp/form.py:9 #: allianceauth/srp/form.py:9
#: allianceauth/srp/templates/srp/management.html:45 #: allianceauth/srp/templates/srp/management.html:43
msgid "Fleet Time" msgid "Fleet Time"
msgstr "" msgstr ""
#: allianceauth/srp/form.py:10 #: allianceauth/srp/form.py:10
#: allianceauth/srp/templates/srp/management.html:46 #: allianceauth/srp/templates/srp/management.html:44
msgid "Fleet Doctrine" msgid "Fleet Doctrine"
msgstr "" msgstr ""
@@ -2368,7 +2386,7 @@ msgid "Give this link to the line members."
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:8 #: allianceauth/srp/templates/srp/data.html:8
#: allianceauth/srp/templates/srp/data.html:39 #: allianceauth/srp/templates/srp/data.html:37
msgid "SRP Fleet Data" msgid "SRP Fleet Data"
msgstr "" msgstr ""
@@ -2376,64 +2394,64 @@ msgstr ""
msgid "View Fleets" msgid "View Fleets"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:26 #: allianceauth/srp/templates/srp/data.html:24
msgid "Mark Incomplete" msgid "Mark Incomplete"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:30 #: allianceauth/srp/templates/srp/data.html:28
msgid "Mark Completed" msgid "Mark Completed"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:48 #: allianceauth/srp/templates/srp/data.html:46
#: allianceauth/srp/templates/srp/data.html:142 #: allianceauth/srp/templates/srp/data.html:140
msgid "Total Losses:" msgid "Total Losses:"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:49 #: allianceauth/srp/templates/srp/data.html:47
#: allianceauth/srp/templates/srp/data.html:143 #: allianceauth/srp/templates/srp/data.html:141
#: allianceauth/srp/templates/srp/management.html:36 #: allianceauth/srp/templates/srp/management.html:34
msgid "Total ISK Cost:" msgid "Total ISK Cost:"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:60 #: allianceauth/srp/templates/srp/data.html:58
#: allianceauth/srp/templates/srp/data.html:154 #: allianceauth/srp/templates/srp/data.html:152
msgid "Are you sure you want to delete SRP requests?" msgid "Are you sure you want to delete SRP requests?"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:70 #: allianceauth/srp/templates/srp/data.html:68
msgid "Pilot Name" msgid "Pilot Name"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:71 #: allianceauth/srp/templates/srp/data.html:69
msgid "Killboard Link" msgid "Killboard Link"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:73 #: allianceauth/srp/templates/srp/data.html:71
msgid "Ship Type" msgid "Ship Type"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:74 #: allianceauth/srp/templates/srp/data.html:72
msgid "Killboard Loss Amt" msgid "Killboard Loss Amt"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:76 #: allianceauth/srp/templates/srp/data.html:74
msgid "SRP ISK Cost" msgid "SRP ISK Cost"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:77 #: allianceauth/srp/templates/srp/data.html:75
msgid "Click value to edit Enter to save & next ESC to cancel" msgid "Click value to edit Enter to save & next ESC to cancel"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:80 #: allianceauth/srp/templates/srp/data.html:78
msgid "Post Time" msgid "Post Time"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:102 #: allianceauth/srp/templates/srp/data.html:100
#: allianceauth/srp/templates/srp/management.html:70 #: allianceauth/srp/templates/srp/management.html:68
msgid "Link" msgid "Link"
msgstr "Link" msgstr "Link"
#: allianceauth/srp/templates/srp/data.html:163 #: allianceauth/srp/templates/srp/data.html:161
msgid "No SRP requests for this fleet." msgid "No SRP requests for this fleet."
msgstr "" msgstr ""
@@ -2445,39 +2463,39 @@ msgstr ""
msgid "View All" msgid "View All"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/management.html:27 #: allianceauth/srp/templates/srp/management.html:25
msgid "Add SRP Fleet" msgid "Add SRP Fleet"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/management.html:48 #: allianceauth/srp/templates/srp/management.html:46
msgid "Fleet AAR" msgid "Fleet AAR"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/management.html:49 #: allianceauth/srp/templates/srp/management.html:47
msgid "Fleet SRP Code" msgid "Fleet SRP Code"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/management.html:50 #: allianceauth/srp/templates/srp/management.html:48
msgid "Fleet ISK Cost" msgid "Fleet ISK Cost"
msgstr "Vloot ISK Kost" msgstr "Vloot ISK Kost"
#: allianceauth/srp/templates/srp/management.html:51 #: allianceauth/srp/templates/srp/management.html:49
msgid "SRP Status" msgid "SRP Status"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/management.html:52 #: allianceauth/srp/templates/srp/management.html:50
msgid "Pending Requests" msgid "Pending Requests"
msgstr "Lopende Aanvragen" msgstr "Lopende Aanvragen"
#: allianceauth/srp/templates/srp/management.html:91 #: allianceauth/srp/templates/srp/management.html:89
msgid "Completed" msgid "Completed"
msgstr "Voltooid" msgstr "Voltooid"
#: allianceauth/srp/templates/srp/management.html:108 #: allianceauth/srp/templates/srp/management.html:106
msgid "Are you sure you want to delete this SRP code and its contents?" msgid "Are you sure you want to delete this SRP code and its contents?"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/management.html:129 #: allianceauth/srp/templates/srp/management.html:127
msgid "No SRP fleets created." msgid "No SRP fleets created."
msgstr "" msgstr ""
@@ -2613,67 +2631,120 @@ msgstr ""
msgid "Your Server received an ESI error response code of " msgid "Your Server received an ESI error response code of "
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:8 #: allianceauth/templates/allianceauth/admin-status/overview.html:11
msgid "Alliance Auth Notifications" msgid "second"
msgstr "Alliantie Authenticatie Notificaties"
#: allianceauth/templates/allianceauth/admin-status/overview.html:20
msgid "No notifications at this time"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:29 #: allianceauth/templates/allianceauth/admin-status/overview.html:12
msgid "Powered by GitLab" msgid "seconds"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:35 #: allianceauth/templates/allianceauth/admin-status/overview.html:13
msgid "Support Discord" msgid "minute"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:49 #: allianceauth/templates/allianceauth/admin-status/overview.html:14
#: allianceauth/templates/allianceauth/admin-status/overview.html:53 msgid "minutes"
msgid "Software Version"
msgstr "Software Versie"
#: allianceauth/templates/allianceauth/admin-status/overview.html:56
msgid "Current"
msgstr "Huidige"
#: allianceauth/templates/allianceauth/admin-status/overview.html:63
msgid "Latest Stable"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:68 #: allianceauth/templates/allianceauth/admin-status/overview.html:15
msgid "Update available" msgid "hour"
msgstr "Update Beschikbaar"
#: allianceauth/templates/allianceauth/admin-status/overview.html:76
msgid "Latest Pre-Release"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:81 #: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Pre-Release available" msgid "hours"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:91 #: allianceauth/templates/allianceauth/admin-status/overview.html:17
msgid "Task Queue" msgid "N/A"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:96 #: allianceauth/templates/allianceauth/admin-status/overview.html:18
#, python-format msgid "ERROR"
msgid ""
"\n"
" Status of %(total)s processed tasks • last %(latest)s\n"
" "
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:112 #: allianceauth/templates/allianceauth/admin-status/overview.html:19
msgid "running" msgid "running"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:113 #: allianceauth/templates/allianceauth/admin-status/overview.html:20
msgid "queued" msgid "queued"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:21
msgid "succeeded"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:22
msgid "retried"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:23
msgid "failed"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:29
msgid "Debug mode"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:34
msgid ""
"Debug mode is currently turned on!<br>Make sure to turn it off as soon as "
"you are finished testing."
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:46
msgid "Alliance Auth Notifications"
msgstr "Alliantie Authenticatie Notificaties"
#: allianceauth/templates/allianceauth/admin-status/overview.html:58
msgid "No notifications at this time"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Powered by GitLab"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:73
msgid "Support Discord"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:87
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
msgid "Software Version"
msgstr "Software Versie"
#: allianceauth/templates/allianceauth/admin-status/overview.html:94
msgid "Current"
msgstr "Huidige"
#: allianceauth/templates/allianceauth/admin-status/overview.html:101
msgid "Latest Stable"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:106
msgid "Update available"
msgstr "Update Beschikbaar"
#: allianceauth/templates/allianceauth/admin-status/overview.html:114
msgid "Latest Pre-Release"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:119
msgid "Pre-Release available"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:129
msgid "Task Queue"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:134
msgid ""
"\n"
" Status of <span id=\"total-task-count\">?</span> processed tasks • last <span id=\"celery-uptime\">?</span>\n"
" "
msgstr ""
#: allianceauth/templates/allianceauth/top-menu-admin.html:19 #: allianceauth/templates/allianceauth/top-menu-admin.html:19
msgid "AA Documentation" msgid "AA Documentation"
msgstr "AA Documentatie" msgstr "AA Documentatie"
@@ -2897,7 +2968,7 @@ msgid "Theft"
msgstr "" msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7 #: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:54 #: allianceauth/timerboard/templates/timerboard/view.html:52
msgid "Upcoming Timers" msgid "Upcoming Timers"
msgstr "" msgstr ""
@@ -2925,7 +2996,7 @@ msgid "Create Timer"
msgstr "" msgstr ""
#: allianceauth/timerboard/templates/timerboard/timer_create_form.html:9 #: allianceauth/timerboard/templates/timerboard/timer_create_form.html:9
#: allianceauth/timerboard/templates/timerboard/view.html:22 #: allianceauth/timerboard/templates/timerboard/view.html:20
msgid "Create Structure Timer" msgid "Create Structure Timer"
msgstr "" msgstr ""
@@ -2943,11 +3014,11 @@ msgstr "Constructie"
msgid "Structure Timer Management" msgid "Structure Timer Management"
msgstr "" msgstr ""
#: allianceauth/timerboard/templates/timerboard/view.html:41 #: allianceauth/timerboard/templates/timerboard/view.html:39
msgid "Corporation Timers" msgid "Corporation Timers"
msgstr "Corporatie Timers" msgstr "Corporatie Timers"
#: allianceauth/timerboard/templates/timerboard/view.html:72 #: allianceauth/timerboard/templates/timerboard/view.html:70
msgid "Past Timers" msgid "Past Timers"
msgstr "Verlopen Timers." msgstr "Verlopen Timers."

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -7,17 +7,17 @@
# Shen Yang, 2023 # Shen Yang, 2023
# 85b931f94c2441449e78b527e0a313ae_baf2e99 <639a60f913241ffb1c9bd90bc93a541f_869335>, 2023 # 85b931f94c2441449e78b527e0a313ae_baf2e99 <639a60f913241ffb1c9bd90bc93a541f_869335>, 2023
# Aaron BuBu <351793078@qq.com>, 2023 # Aaron BuBu <351793078@qq.com>, 2023
# Joel Falknau <ozirascal@gmail.com>, 2023
# Aika Yu, 2025 # Aika Yu, 2025
# Joel Falknau <ozirascal@gmail.com>, 2025
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-19 20:23+1000\n" "POT-Creation-Date: 2026-01-21 15:33+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Aika Yu, 2025\n" "Last-Translator: Joel Falknau <ozirascal@gmail.com>, 2025\n"
"Language-Team: Chinese Simplified (https://app.transifex.com/alliance-auth/teams/107430/zh-Hans/)\n" "Language-Team: Chinese Simplified (https://app.transifex.com/alliance-auth/teams/107430/zh-Hans/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -64,7 +64,7 @@ msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:72 #: allianceauth/authentication/models.py:72
#: allianceauth/project_template/project_name/settings/base.py:106 #: allianceauth/project_template/project_name/settings/base.py:105
msgid "English" msgid "English"
msgstr "英语" msgstr "英语"
@@ -73,57 +73,57 @@ msgid "Czech"
msgstr "捷克语" msgstr "捷克语"
#: allianceauth/authentication/models.py:74 #: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:108 #: allianceauth/project_template/project_name/settings/base.py:107
msgid "German" msgid "German"
msgstr "德语" msgstr "德语"
#: allianceauth/authentication/models.py:75 #: allianceauth/authentication/models.py:75
#: allianceauth/project_template/project_name/settings/base.py:109 #: allianceauth/project_template/project_name/settings/base.py:108
msgid "Spanish" msgid "Spanish"
msgstr "西班牙语" msgstr "西班牙语"
#: allianceauth/authentication/models.py:76 #: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:110 #: allianceauth/project_template/project_name/settings/base.py:109
msgid "Italian" msgid "Italian"
msgstr "意大利语" msgstr "意大利语"
#: allianceauth/authentication/models.py:77 #: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:111 #: allianceauth/project_template/project_name/settings/base.py:110
msgid "Japanese" msgid "Japanese"
msgstr "日语" msgstr "日语"
#: allianceauth/authentication/models.py:78 #: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:112 #: allianceauth/project_template/project_name/settings/base.py:111
msgid "Korean" msgid "Korean"
msgstr "韩语" msgstr "韩语"
#: allianceauth/authentication/models.py:79 #: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:113 #: allianceauth/project_template/project_name/settings/base.py:112
msgid "French" msgid "French"
msgstr "法语" msgstr "法语"
#: allianceauth/authentication/models.py:80 #: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:116 #: allianceauth/project_template/project_name/settings/base.py:115
msgid "Russian" msgid "Russian"
msgstr "俄语" msgstr "俄语"
#: allianceauth/authentication/models.py:81 #: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:114 #: allianceauth/project_template/project_name/settings/base.py:113
msgid "Dutch" msgid "Dutch"
msgstr "荷兰语" msgstr "荷兰语"
#: allianceauth/authentication/models.py:82 #: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:115 #: allianceauth/project_template/project_name/settings/base.py:114
msgid "Polish" msgid "Polish"
msgstr "波兰语" msgstr "波兰语"
#: allianceauth/authentication/models.py:83 #: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:117 #: allianceauth/project_template/project_name/settings/base.py:116
msgid "Ukrainian" msgid "Ukrainian"
msgstr "乌克兰语" msgstr "乌克兰语"
#: allianceauth/authentication/models.py:84 #: allianceauth/authentication/models.py:84
#: allianceauth/project_template/project_name/settings/base.py:118 #: allianceauth/project_template/project_name/settings/base.py:117
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "简体中文" msgstr "简体中文"
@@ -132,22 +132,30 @@ msgstr "简体中文"
msgid "Language" msgid "Language"
msgstr "语言" msgstr "语言"
#: allianceauth/authentication/models.py:105 #: allianceauth/authentication/models.py:106
#: allianceauth/templates/allianceauth/night-toggle.html:6 #: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode" msgid "Night Mode"
msgstr "夜间模式" msgstr "夜间模式"
#: allianceauth/authentication/models.py:109 #: allianceauth/authentication/models.py:110
#: allianceauth/theme/templates/theme/theme_select.html:4 #: allianceauth/theme/templates/theme/theme_select.html:4
msgid "Theme" msgid "Theme"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:126 #: allianceauth/authentication/models.py:117
msgid "Minimize Sidebar Menu"
msgstr ""
#: allianceauth/authentication/models.py:119
msgid "Keep the sidebar menu minimized"
msgstr ""
#: allianceauth/authentication/models.py:133
#, python-format #, python-format
msgid "State changed to: %s" msgid "State changed to: %s"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:127 #: allianceauth/authentication/models.py:134
#, python-format #, python-format
msgid "Your user's state is now: %(state)s" msgid "Your user's state is now: %(state)s"
msgstr "" msgstr ""
@@ -168,14 +176,12 @@ msgstr "角色"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:11 #: allianceauth/authentication/templates/authentication/dashboard_characters.html:11
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:12 #: allianceauth/authentication/templates/authentication/dashboard_characters.html:12
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:4 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:4
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:6
msgid "Add Character" msgid "Add Character"
msgstr "添加角色" msgstr "添加角色"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14 #: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:15 #: allianceauth/authentication/templates/authentication/dashboard_characters.html:15
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:10 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:8
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:12
msgid "Change Main" msgid "Change Main"
msgstr "修改主要角色" msgstr "修改主要角色"
@@ -209,8 +215,8 @@ msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:7 #: allianceauth/authentication/templates/authentication/tokens.html:7
#: allianceauth/authentication/templates/authentication/tokens.html:11 #: allianceauth/authentication/templates/authentication/tokens.html:11
#: allianceauth/menu/templates/menu/menu-user.html:133 #: allianceauth/menu/templates/menu/menu-user.html:158
#: allianceauth/menu/templates/menu/menu-user.html:136 #: allianceauth/menu/templates/menu/menu-user.html:161
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62
msgid "Token Management" msgid "Token Management"
msgstr "" msgstr ""
@@ -232,8 +238,8 @@ msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/management.html:168 #: allianceauth/hrapplications/templates/hrapplications/management.html:168
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:35 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:35
#: allianceauth/hrapplications/templates/hrapplications/view.html:94 #: allianceauth/hrapplications/templates/hrapplications/view.html:94
#: allianceauth/srp/templates/srp/data.html:83 #: allianceauth/srp/templates/srp/data.html:81
#: allianceauth/srp/templates/srp/management.html:53 #: allianceauth/srp/templates/srp/management.html:51
msgid "Actions" msgid "Actions"
msgstr "操作" msgstr "操作"
@@ -246,8 +252,8 @@ msgstr "操作"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:41 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:41
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:54
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:118 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:129
msgid "Character" msgid "Character"
msgstr "角色" msgstr "角色"
@@ -284,49 +290,49 @@ msgstr "注册"
msgid "Invalid or expired activation link." msgid "Invalid or expired activation link."
msgstr "激活链接无效或过期" msgstr "激活链接无效或过期"
#: allianceauth/authentication/views.py:158 #: allianceauth/authentication/views.py:159
#, python-format #, python-format
msgid "" msgid ""
"Cannot change main character to %(char)s: character owned by a different " "Cannot change main character to %(char)s: character owned by a different "
"account." "account."
msgstr "不能修改主角色为%(char)s这个角色被另一个账户所拥有" msgstr "不能修改主角色为%(char)s这个角色被另一个账户所拥有"
#: allianceauth/authentication/views.py:165 #: allianceauth/authentication/views.py:166
#, python-format #, python-format
msgid "Changed main character to %s" msgid "Changed main character to %s"
msgstr "修改主角色为%s" msgstr "修改主角色为%s"
#: allianceauth/authentication/views.py:179 #: allianceauth/authentication/views.py:180
#, python-format #, python-format
msgid "Added %(name)s to your account." msgid "Added %(name)s to your account."
msgstr "添加%(name)s到您的账户" msgstr "添加%(name)s到您的账户"
#: allianceauth/authentication/views.py:181 #: allianceauth/authentication/views.py:182
#, python-format #, python-format
msgid "Failed to add %(name)s to your account: they already have an account." msgid "Failed to add %(name)s to your account: they already have an account."
msgstr "添加%(name)s到您的账户失败他们已经在一个账户中了" msgstr "添加%(name)s到您的账户失败他们已经在一个账户中了"
#: allianceauth/authentication/views.py:226 #: allianceauth/authentication/views.py:227
msgid "" msgid ""
"Unable to authenticate as the selected character. Please log in with the " "Unable to authenticate as the selected character. Please log in with the "
"main character associated with this account." "main character associated with this account."
msgstr "" msgstr ""
#: allianceauth/authentication/views.py:293 #: allianceauth/authentication/views.py:294
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "注册令牌过期。" msgstr "注册令牌过期。"
#: allianceauth/authentication/views.py:354 #: allianceauth/authentication/views.py:355
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
msgstr "已经发送了确认邮件。请按照链接确定您的电邮地址" msgstr "已经发送了确认邮件。请按照链接确定您的电邮地址"
#: allianceauth/authentication/views.py:360 #: allianceauth/authentication/views.py:361
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "已确认您的电邮地址。请登录以继续" msgstr "已确认您的电邮地址。请登录以继续"
#: allianceauth/authentication/views.py:366 #: allianceauth/authentication/views.py:367
msgid "Registration of new accounts is not allowed at this time." msgid "Registration of new accounts is not allowed at this time."
msgstr "" msgstr ""
@@ -343,11 +349,11 @@ msgstr "军团成员数据"
msgid "Corporations" msgid "Corporations"
msgstr "所有公司" msgstr "所有公司"
#: allianceauth/corputils/templates/corputils/base.html:35 #: allianceauth/corputils/templates/corputils/base.html:31
msgid "Add corporation" msgid "Add corporation"
msgstr "" msgstr ""
#: allianceauth/corputils/templates/corputils/base.html:51 #: allianceauth/corputils/templates/corputils/base.html:47
msgid "Search all corporations..." msgid "Search all corporations..."
msgstr "搜索所有公司" msgstr "搜索所有公司"
@@ -384,6 +390,8 @@ msgstr "注册过的角色"
#: allianceauth/corputils/templates/corputils/corpstats.html:125 #: allianceauth/corputils/templates/corputils/corpstats.html:125
#: allianceauth/corputils/templates/corputils/search.html:18 #: allianceauth/corputils/templates/corputils/search.html:18
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:58
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:133
#: allianceauth/hrapplications/templates/hrapplications/management.html:35 #: allianceauth/hrapplications/templates/hrapplications/management.html:35
#: allianceauth/hrapplications/templates/hrapplications/management.html:122 #: allianceauth/hrapplications/templates/hrapplications/management.html:122
#: allianceauth/hrapplications/templates/hrapplications/management.html:166 #: allianceauth/hrapplications/templates/hrapplications/management.html:166
@@ -495,7 +503,7 @@ msgid "Fleet Activity Tracking"
msgstr "舰队活动历史" msgstr "舰队活动历史"
#: allianceauth/fleetactivitytracking/forms.py:6 allianceauth/srp/form.py:8 #: allianceauth/fleetactivitytracking/forms.py:6 allianceauth/srp/form.py:8
#: allianceauth/srp/templates/srp/management.html:44 #: allianceauth/srp/templates/srp/management.html:42
msgid "Fleet Name" msgid "Fleet Name"
msgstr "舰队名" msgstr "舰队名"
@@ -754,14 +762,18 @@ msgstr "PAP链接已过期"
#: allianceauth/fleetactivitytracking/views.py:323 #: allianceauth/fleetactivitytracking/views.py:323
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"Cannot register the fleet participation for {character.character_name}. The " "Cannot register the fleet participation for {character_name}. The character "
"character needs to be online." "needs to be online."
msgstr "" msgstr ""
#: allianceauth/framework/apps.py:16 #: allianceauth/framework/apps.py:16
msgid "Framework" msgid "Framework"
msgstr "" msgstr ""
#: allianceauth/framework/templates/framework/datatables/process-indicator.html:8
msgid "Loading …"
msgstr ""
#: allianceauth/groupmanagement/apps.py:8 #: allianceauth/groupmanagement/apps.py:8
#: allianceauth/groupmanagement/auth_hooks.py:18 #: allianceauth/groupmanagement/auth_hooks.py:18
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:18 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:18
@@ -933,8 +945,8 @@ msgid "Group Members"
msgstr "群组成员" msgstr "群组成员"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:30 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:56 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:119 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:130
#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:33 #: allianceauth/permissions_tool/templates/permissions_tool/audit.html:33
msgid "Organization" msgid "Organization"
msgstr "组织" msgstr "组织"
@@ -946,7 +958,9 @@ msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:61 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:61
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:85 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:85
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:148 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:106
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:160
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:181
#: allianceauth/permissions_tool/templates/permissions_tool/audit_row.html:18 #: allianceauth/permissions_tool/templates/permissions_tool/audit_row.html:18
msgid "(unknown)" msgid "(unknown)"
msgstr "" msgstr ""
@@ -979,7 +993,7 @@ msgstr "描述"
#: allianceauth/hrapplications/templates/hrapplications/management.html:123 #: allianceauth/hrapplications/templates/hrapplications/management.html:123
#: allianceauth/hrapplications/templates/hrapplications/management.html:167 #: allianceauth/hrapplications/templates/hrapplications/management.html:167
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:34 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:34
#: allianceauth/srp/templates/srp/data.html:81 #: allianceauth/srp/templates/srp/data.html:79
msgid "Status" msgid "Status"
msgstr "状态" msgstr "状态"
@@ -992,7 +1006,7 @@ msgid "Hidden"
msgstr "已隐藏" msgstr "已隐藏"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:15 #: allianceauth/templates/allianceauth/admin-status/overview.html:53
msgid "Open" msgid "Open"
msgstr "公开" msgstr "公开"
@@ -1026,8 +1040,8 @@ msgid "Leaders"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:37 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:37
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:57 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:56
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:120 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:131
#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:30 #: allianceauth/permissions_tool/templates/permissions_tool/audit.html:30
#: allianceauth/services/modules/openfire/forms.py:6 #: allianceauth/services/modules/openfire/forms.py:6
msgid "Group" msgid "Group"
@@ -1037,18 +1051,10 @@ msgstr "用户组"
msgid "Leave" msgid "Leave"
msgstr "离开" msgstr "离开"
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:74 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:73
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:89 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:88
#: allianceauth/hrapplications/templates/hrapplications/management.html:46 msgid "Request pending"
#: allianceauth/hrapplications/templates/hrapplications/management.html:95 msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/management.html:138
#: allianceauth/hrapplications/templates/hrapplications/management.html:182
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:46
#: allianceauth/hrapplications/templates/hrapplications/view.html:25
#: allianceauth/srp/templates/srp/data.html:120
#: allianceauth/srp/templates/srp/management.html:87
msgid "Pending"
msgstr "待定"
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:80 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:80
msgid "Join" msgid "Join"
@@ -1058,7 +1064,11 @@ msgstr "加入"
msgid "Request" msgid "Request"
msgstr "申请" msgstr "申请"
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:99 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:93
msgid "Retract"
msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:103
msgid "No groups available." msgid "No groups available."
msgstr "没有可用用户组" msgstr "没有可用用户组"
@@ -1080,22 +1090,22 @@ msgstr "离组的请求"
msgid "Group Membership" msgid "Group Membership"
msgstr "用户组成员" msgstr "用户组成员"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:93 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:96
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:156 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:171
msgid "Accept" msgid "Accept"
msgstr "接受" msgstr "接受"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:96 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:99
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:160 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:174
#: allianceauth/hrapplications/templates/hrapplications/view.html:104 #: allianceauth/hrapplications/templates/hrapplications/view.html:104
msgid "Reject" msgid "Reject"
msgstr "拒绝" msgstr "拒绝"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:106 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:117
msgid "No group add requests." msgid "No group add requests."
msgstr "没有加入用户组的请求,小老弟你是不是摇不到人" msgstr "没有加入用户组的请求,小老弟你是不是摇不到人"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:169 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:190
msgid "No group leave requests." msgid "No group leave requests."
msgstr "没有离开用户组的请求,小老弟你人缘可以啊?" msgstr "没有离开用户组的请求,小老弟你人缘可以啊?"
@@ -1187,6 +1197,19 @@ msgstr "你已经有了该组的未决离开请求"
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "已经离开群组%(group)s" msgstr "已经离开群组%(group)s"
#: allianceauth/groupmanagement/views.py:438
msgid "You cannot retract that request"
msgstr ""
#: allianceauth/groupmanagement/views.py:450
#, python-format
msgid "Retracted application to group %(group)s."
msgstr ""
#: allianceauth/groupmanagement/views.py:458
msgid "You have no open request for that group."
msgstr ""
#: allianceauth/hrapplications/apps.py:8 #: allianceauth/hrapplications/apps.py:8
msgid "HR Applications" msgid "HR Applications"
msgstr "" msgstr ""
@@ -1257,12 +1280,23 @@ msgstr "创建申请"
msgid "Username" msgid "Username"
msgstr "用户名" msgstr "用户名"
#: allianceauth/hrapplications/templates/hrapplications/management.html:46
#: allianceauth/hrapplications/templates/hrapplications/management.html:95
#: allianceauth/hrapplications/templates/hrapplications/management.html:138
#: allianceauth/hrapplications/templates/hrapplications/management.html:182
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:46
#: allianceauth/hrapplications/templates/hrapplications/view.html:25
#: allianceauth/srp/templates/srp/data.html:118
#: allianceauth/srp/templates/srp/management.html:85
msgid "Pending"
msgstr "待定"
#: allianceauth/hrapplications/templates/hrapplications/management.html:48 #: allianceauth/hrapplications/templates/hrapplications/management.html:48
#: allianceauth/hrapplications/templates/hrapplications/management.html:141 #: allianceauth/hrapplications/templates/hrapplications/management.html:141
#: allianceauth/hrapplications/templates/hrapplications/management.html:185 #: allianceauth/hrapplications/templates/hrapplications/management.html:185
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:48 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:48
#: allianceauth/hrapplications/templates/hrapplications/view.html:21 #: allianceauth/hrapplications/templates/hrapplications/view.html:21
#: allianceauth/srp/templates/srp/data.html:112 #: allianceauth/srp/templates/srp/data.html:110
msgid "Approved" msgid "Approved"
msgstr "通过" msgstr "通过"
@@ -1270,7 +1304,7 @@ msgstr "通过"
#: allianceauth/hrapplications/templates/hrapplications/management.html:143 #: allianceauth/hrapplications/templates/hrapplications/management.html:143
#: allianceauth/hrapplications/templates/hrapplications/management.html:187 #: allianceauth/hrapplications/templates/hrapplications/management.html:187
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:50 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:50
#: allianceauth/srp/templates/srp/data.html:116 #: allianceauth/srp/templates/srp/data.html:114
msgid "Rejected" msgid "Rejected"
msgstr "拒绝" msgstr "拒绝"
@@ -1474,39 +1508,47 @@ msgid "Notifications"
msgstr "通知" msgstr "通知"
#: allianceauth/menu/templates/menu/menu-user.html:77 #: allianceauth/menu/templates/menu/menu-user.html:77
msgid "Sidebar"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:93
msgid "Minimize Sidebar"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:102
msgid "Super User" msgid "Super User"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:83 #: allianceauth/menu/templates/menu/menu-user.html:108
#: allianceauth/menu/templates/menu/menu-user.html:86 #: allianceauth/menu/templates/menu/menu-user.html:111
msgid "Alliance Auth Documentation" msgid "Alliance Auth Documentation"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:94 #: allianceauth/menu/templates/menu/menu-user.html:119
#: allianceauth/menu/templates/menu/menu-user.html:97 #: allianceauth/menu/templates/menu/menu-user.html:122
msgid "Alliance Auth Discord" msgid "Alliance Auth Discord"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:105 #: allianceauth/menu/templates/menu/menu-user.html:130
#: allianceauth/menu/templates/menu/menu-user.html:108 #: allianceauth/menu/templates/menu/menu-user.html:133
msgid "Alliance Auth Git" msgid "Alliance Auth Git"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:118 #: allianceauth/menu/templates/menu/menu-user.html:143
#: allianceauth/menu/templates/menu/menu-user.html:121 #: allianceauth/menu/templates/menu/menu-user.html:146
#: allianceauth/templates/allianceauth/top-menu-admin.html:9 #: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin" msgid "Admin"
msgstr "管理员" msgstr "管理员"
#: allianceauth/menu/templates/menu/menu-user.html:144 #: allianceauth/menu/templates/menu/menu-user.html:169
#: allianceauth/menu/templates/menu/menu-user.html:147 #: allianceauth/menu/templates/menu/menu-user.html:172
msgid "Sign Out" msgid "Sign Out"
msgstr "登出" msgstr "登出"
#: allianceauth/menu/templates/menu/menu-user.html:155 #: allianceauth/menu/templates/menu/menu-user.html:180
#: allianceauth/menu/templates/menu/menu-user.html:158 #: allianceauth/menu/templates/menu/menu-user.html:183
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:13
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:14
msgid "Sign In" msgid "Sign In"
msgstr "登入" msgstr "登入"
@@ -1534,11 +1576,11 @@ msgstr "未读"
msgid "Read" msgid "Read"
msgstr "已读" msgstr "已读"
#: allianceauth/notifications/templates/notifications/list.html:32 #: allianceauth/notifications/templates/notifications/list.html:31
msgid "Mark all notifications as read" msgid "Mark all notifications as read"
msgstr "" msgstr ""
#: allianceauth/notifications/templates/notifications/list.html:38 #: allianceauth/notifications/templates/notifications/list.html:35
msgid "Delete all read notifications" msgid "Delete all read notifications"
msgstr "" msgstr ""
@@ -1603,12 +1645,12 @@ msgid "Operation Type"
msgstr "" msgstr ""
#: allianceauth/optimer/form.py:17 #: allianceauth/optimer/form.py:17
#: allianceauth/srp/templates/srp/management.html:47 #: allianceauth/srp/templates/srp/management.html:45
msgid "Fleet Commander" msgid "Fleet Commander"
msgstr "FC" msgstr "FC"
#: allianceauth/optimer/form.py:22 allianceauth/srp/form.py:14 #: allianceauth/optimer/form.py:22 allianceauth/srp/form.py:14
#: allianceauth/srp/templates/srp/data.html:72 #: allianceauth/srp/templates/srp/data.html:70
msgid "Additional Info" msgid "Additional Info"
msgstr "其他信息" msgstr "其他信息"
@@ -1617,7 +1659,7 @@ msgid "(Optional) Describe the operation with a couple of short words."
msgstr "" msgstr ""
#: allianceauth/optimer/templates/optimer/add.html:8 #: allianceauth/optimer/templates/optimer/add.html:8
#: allianceauth/optimer/templates/optimer/management.html:18 #: allianceauth/optimer/templates/optimer/management.html:16
msgid "Create Operation" msgid "Create Operation"
msgstr "起一个队" msgstr "起一个队"
@@ -1666,26 +1708,26 @@ msgstr "FC"
msgid "Fleet Operation Management" msgid "Fleet Operation Management"
msgstr "管理搞事队" msgstr "管理搞事队"
#: allianceauth/optimer/templates/optimer/management.html:28 #: allianceauth/optimer/templates/optimer/management.html:26
#: allianceauth/timerboard/templates/timerboard/view.html:32 #: allianceauth/timerboard/templates/timerboard/view.html:30
msgid "Current EVE time:" msgid "Current EVE time:"
msgstr "" msgstr ""
#: allianceauth/optimer/templates/optimer/management.html:36 #: allianceauth/optimer/templates/optimer/management.html:34
msgid "Next Fleet Operations" msgid "Next Fleet Operations"
msgstr "下一个舰队任务" msgstr "下一个舰队任务"
#: allianceauth/optimer/templates/optimer/management.html:44 #: allianceauth/optimer/templates/optimer/management.html:42
#: allianceauth/timerboard/templates/timerboard/view.html:63 #: allianceauth/timerboard/templates/timerboard/view.html:61
msgid "No upcoming timers." msgid "No upcoming timers."
msgstr "没有快到的时间节点,歇一会吧" msgstr "没有快到的时间节点,歇一会吧"
#: allianceauth/optimer/templates/optimer/management.html:52 #: allianceauth/optimer/templates/optimer/management.html:50
msgid "Past Fleet Operations" msgid "Past Fleet Operations"
msgstr "过去的舰队任务" msgstr "过去的舰队任务"
#: allianceauth/optimer/templates/optimer/management.html:60 #: allianceauth/optimer/templates/optimer/management.html:58
#: allianceauth/timerboard/templates/timerboard/view.html:81 #: allianceauth/timerboard/templates/timerboard/view.html:79
msgid "No past timers." msgid "No past timers."
msgstr "没有已经结束的时间节点啦" msgstr "没有已经结束的时间节点啦"
@@ -1765,9 +1807,9 @@ msgstr "声望"
msgid "That service account already exists" msgid "That service account already exists"
msgstr "该服务账户仍然存在" msgstr "该服务账户仍然存在"
#: allianceauth/services/abstract.py:103 #: allianceauth/services/abstract.py:105
#, python-brace-format #, python-brace-format
msgid "Successfully set your {self.service_name} password" msgid "Successfully set your {service_name} password"
msgstr "" msgstr ""
#: allianceauth/services/apps.py:8 allianceauth/services/auth_hooks.py:12 #: allianceauth/services/apps.py:8 allianceauth/services/auth_hooks.py:12
@@ -2253,7 +2295,7 @@ msgid "Enabled"
msgstr "" msgstr ""
#: allianceauth/services/templates/services/service_status.html:7 #: allianceauth/services/templates/services/service_status.html:7
#: allianceauth/srp/templates/srp/management.html:78 #: allianceauth/srp/templates/srp/management.html:76
msgid "Disabled" msgid "Disabled"
msgstr "失效了" msgstr "失效了"
@@ -2291,12 +2333,12 @@ msgid "Ship Replacement"
msgstr "补损" msgstr "补损"
#: allianceauth/srp/form.py:9 #: allianceauth/srp/form.py:9
#: allianceauth/srp/templates/srp/management.html:45 #: allianceauth/srp/templates/srp/management.html:43
msgid "Fleet Time" msgid "Fleet Time"
msgstr "集结时间" msgstr "集结时间"
#: allianceauth/srp/form.py:10 #: allianceauth/srp/form.py:10
#: allianceauth/srp/templates/srp/management.html:46 #: allianceauth/srp/templates/srp/management.html:44
msgid "Fleet Doctrine" msgid "Fleet Doctrine"
msgstr "舰队船型" msgstr "舰队船型"
@@ -2308,11 +2350,11 @@ msgstr ""
msgid "Invalid Link. Please use zkillboard.com or kb.evetools.org" msgid "Invalid Link. Please use zkillboard.com or kb.evetools.org"
msgstr "" msgstr ""
#: allianceauth/srp/form.py:46 #: allianceauth/srp/form.py:49
msgid "Invalid Link. Please post a direct link to a killmail." msgid "Invalid Link. Please post a direct link to a killmail."
msgstr "" msgstr ""
#: allianceauth/srp/form.py:53 #: allianceauth/srp/form.py:56
msgid "After Action Report Link" msgid "After Action Report Link"
msgstr "战报链接" msgstr "战报链接"
@@ -2345,7 +2387,7 @@ msgid "Give this link to the line members."
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:8 #: allianceauth/srp/templates/srp/data.html:8
#: allianceauth/srp/templates/srp/data.html:39 #: allianceauth/srp/templates/srp/data.html:37
msgid "SRP Fleet Data" msgid "SRP Fleet Data"
msgstr "舰队补损信息" msgstr "舰队补损信息"
@@ -2353,64 +2395,64 @@ msgstr "舰队补损信息"
msgid "View Fleets" msgid "View Fleets"
msgstr "查看舰队" msgstr "查看舰队"
#: allianceauth/srp/templates/srp/data.html:26 #: allianceauth/srp/templates/srp/data.html:24
msgid "Mark Incomplete" msgid "Mark Incomplete"
msgstr "标记为未完成" msgstr "标记为未完成"
#: allianceauth/srp/templates/srp/data.html:30 #: allianceauth/srp/templates/srp/data.html:28
msgid "Mark Completed" msgid "Mark Completed"
msgstr "标记为已完成" msgstr "标记为已完成"
#: allianceauth/srp/templates/srp/data.html:48 #: allianceauth/srp/templates/srp/data.html:46
#: allianceauth/srp/templates/srp/data.html:142 #: allianceauth/srp/templates/srp/data.html:140
msgid "Total Losses:" msgid "Total Losses:"
msgstr "损失总额:" msgstr "损失总额:"
#: allianceauth/srp/templates/srp/data.html:49 #: allianceauth/srp/templates/srp/data.html:47
#: allianceauth/srp/templates/srp/data.html:143 #: allianceauth/srp/templates/srp/data.html:141
#: allianceauth/srp/templates/srp/management.html:36 #: allianceauth/srp/templates/srp/management.html:34
msgid "Total ISK Cost:" msgid "Total ISK Cost:"
msgstr "ISK花费总额" msgstr "ISK花费总额"
#: allianceauth/srp/templates/srp/data.html:60 #: allianceauth/srp/templates/srp/data.html:58
#: allianceauth/srp/templates/srp/data.html:154 #: allianceauth/srp/templates/srp/data.html:152
msgid "Are you sure you want to delete SRP requests?" msgid "Are you sure you want to delete SRP requests?"
msgstr "老哥,你确定要删了补损请求么?" msgstr "老哥,你确定要删了补损请求么?"
#: allianceauth/srp/templates/srp/data.html:70 #: allianceauth/srp/templates/srp/data.html:68
msgid "Pilot Name" msgid "Pilot Name"
msgstr "玩家ID" msgstr "玩家ID"
#: allianceauth/srp/templates/srp/data.html:71 #: allianceauth/srp/templates/srp/data.html:69
msgid "Killboard Link" msgid "Killboard Link"
msgstr "KB网链接" msgstr "KB网链接"
#: allianceauth/srp/templates/srp/data.html:73 #: allianceauth/srp/templates/srp/data.html:71
msgid "Ship Type" msgid "Ship Type"
msgstr "船型" msgstr "船型"
#: allianceauth/srp/templates/srp/data.html:74 #: allianceauth/srp/templates/srp/data.html:72
msgid "Killboard Loss Amt" msgid "Killboard Loss Amt"
msgstr "KB网总损失" msgstr "KB网总损失"
#: allianceauth/srp/templates/srp/data.html:76 #: allianceauth/srp/templates/srp/data.html:74
msgid "SRP ISK Cost" msgid "SRP ISK Cost"
msgstr "补损ISK花费" msgstr "补损ISK花费"
#: allianceauth/srp/templates/srp/data.html:77 #: allianceauth/srp/templates/srp/data.html:75
msgid "Click value to edit Enter to save & next ESC to cancel" msgid "Click value to edit Enter to save & next ESC to cancel"
msgstr "点击数值就可以编辑啦按回车确认按ESC取消" msgstr "点击数值就可以编辑啦按回车确认按ESC取消"
#: allianceauth/srp/templates/srp/data.html:80 #: allianceauth/srp/templates/srp/data.html:78
msgid "Post Time" msgid "Post Time"
msgstr "发布时间" msgstr "发布时间"
#: allianceauth/srp/templates/srp/data.html:102 #: allianceauth/srp/templates/srp/data.html:100
#: allianceauth/srp/templates/srp/management.html:70 #: allianceauth/srp/templates/srp/management.html:68
msgid "Link" msgid "Link"
msgstr "链接" msgstr "链接"
#: allianceauth/srp/templates/srp/data.html:163 #: allianceauth/srp/templates/srp/data.html:161
msgid "No SRP requests for this fleet." msgid "No SRP requests for this fleet."
msgstr "这次起队没有补损请求!大捷" msgstr "这次起队没有补损请求!大捷"
@@ -2422,39 +2464,39 @@ msgstr "补损管理"
msgid "View All" msgid "View All"
msgstr "查看全部" msgstr "查看全部"
#: allianceauth/srp/templates/srp/management.html:27 #: allianceauth/srp/templates/srp/management.html:25
msgid "Add SRP Fleet" msgid "Add SRP Fleet"
msgstr "添加补损舰队" msgstr "添加补损舰队"
#: allianceauth/srp/templates/srp/management.html:48 #: allianceauth/srp/templates/srp/management.html:46
msgid "Fleet AAR" msgid "Fleet AAR"
msgstr "舰队战报" msgstr "舰队战报"
#: allianceauth/srp/templates/srp/management.html:49 #: allianceauth/srp/templates/srp/management.html:47
msgid "Fleet SRP Code" msgid "Fleet SRP Code"
msgstr "补损编号" msgstr "补损编号"
#: allianceauth/srp/templates/srp/management.html:50 #: allianceauth/srp/templates/srp/management.html:48
msgid "Fleet ISK Cost" msgid "Fleet ISK Cost"
msgstr "舰队ISK花费" msgstr "舰队ISK花费"
#: allianceauth/srp/templates/srp/management.html:51 #: allianceauth/srp/templates/srp/management.html:49
msgid "SRP Status" msgid "SRP Status"
msgstr "补损状态" msgstr "补损状态"
#: allianceauth/srp/templates/srp/management.html:52 #: allianceauth/srp/templates/srp/management.html:50
msgid "Pending Requests" msgid "Pending Requests"
msgstr "待处理请求" msgstr "待处理请求"
#: allianceauth/srp/templates/srp/management.html:91 #: allianceauth/srp/templates/srp/management.html:89
msgid "Completed" msgid "Completed"
msgstr "已完成" msgstr "已完成"
#: allianceauth/srp/templates/srp/management.html:108 #: allianceauth/srp/templates/srp/management.html:106
msgid "Are you sure you want to delete this SRP code and its contents?" msgid "Are you sure you want to delete this SRP code and its contents?"
msgstr "老哥,你确认要把这次补损的编号和内容都删了?" msgstr "老哥,你确认要把这次补损的编号和内容都删了?"
#: allianceauth/srp/templates/srp/management.html:129 #: allianceauth/srp/templates/srp/management.html:127
msgid "No SRP fleets created." msgid "No SRP fleets created."
msgstr "没有创建任何补损舰队,你快灭灯了吧?" msgstr "没有创建任何补损舰队,你快灭灯了吧?"
@@ -2586,71 +2628,124 @@ msgstr "找不到ID是%(requestid)s的补损申请呀老哥眼花了"
msgid "Saved changes to SRP fleet %(fleetname)s" msgid "Saved changes to SRP fleet %(fleetname)s"
msgstr "你做的修改已经保存到%(fleetname)s这个补损舰队啦尽情白给吧" msgstr "你做的修改已经保存到%(fleetname)s这个补损舰队啦尽情白给吧"
#: allianceauth/templates/allianceauth/admin-status/esi_check.html:4 #: allianceauth/templates/allianceauth/admin-status/esi_check.html:5
msgid "Your Server received an ESI error response code of " msgid "Your Server received an ESI error response code of "
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:8 #: allianceauth/templates/allianceauth/admin-status/overview.html:11
msgid "Alliance Auth Notifications" msgid "second"
msgstr "系统通知"
#: allianceauth/templates/allianceauth/admin-status/overview.html:20
msgid "No notifications at this time"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:29 #: allianceauth/templates/allianceauth/admin-status/overview.html:12
msgid "Powered by GitLab" msgid "seconds"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:35 #: allianceauth/templates/allianceauth/admin-status/overview.html:13
msgid "Support Discord" msgid "minute"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:49 #: allianceauth/templates/allianceauth/admin-status/overview.html:14
#: allianceauth/templates/allianceauth/admin-status/overview.html:53 msgid "minutes"
msgid "Software Version" msgstr "分钟数"
msgstr "软件版本"
#: allianceauth/templates/allianceauth/admin-status/overview.html:56 #: allianceauth/templates/allianceauth/admin-status/overview.html:15
msgid "Current" msgid "hour"
msgstr "当前版本"
#: allianceauth/templates/allianceauth/admin-status/overview.html:63
msgid "Latest Stable"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:68 #: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Update available" msgid "hours"
msgstr "有更新!"
#: allianceauth/templates/allianceauth/admin-status/overview.html:76
msgid "Latest Pre-Release"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:81 #: allianceauth/templates/allianceauth/admin-status/overview.html:17
msgid "Pre-Release available" msgid "N/A"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:91 #: allianceauth/templates/allianceauth/admin-status/overview.html:18
msgid "Task Queue" msgid "ERROR"
msgstr "任务队列"
#: allianceauth/templates/allianceauth/admin-status/overview.html:96
#, python-format
msgid ""
"\n"
" Status of %(total)s processed tasks • last %(latest)s\n"
" "
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:112 #: allianceauth/templates/allianceauth/admin-status/overview.html:19
msgid "running" msgid "running"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:113 #: allianceauth/templates/allianceauth/admin-status/overview.html:20
msgid "queued" msgid "queued"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:21
msgid "succeeded"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:22
msgid "retried"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:23
msgid "failed"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:29
msgid "Debug mode"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:34
msgid ""
"Debug mode is currently turned on!<br>Make sure to turn it off as soon as "
"you are finished testing."
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:46
msgid "Alliance Auth Notifications"
msgstr "系统通知"
#: allianceauth/templates/allianceauth/admin-status/overview.html:58
msgid "No notifications at this time"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Powered by GitLab"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:73
msgid "Support Discord"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:87
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
msgid "Software Version"
msgstr "软件版本"
#: allianceauth/templates/allianceauth/admin-status/overview.html:94
msgid "Current"
msgstr "当前版本"
#: allianceauth/templates/allianceauth/admin-status/overview.html:101
msgid "Latest Stable"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:106
msgid "Update available"
msgstr "有更新!"
#: allianceauth/templates/allianceauth/admin-status/overview.html:114
msgid "Latest Pre-Release"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:119
msgid "Pre-Release available"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:129
msgid "Task Queue"
msgstr "任务队列"
#: allianceauth/templates/allianceauth/admin-status/overview.html:134
msgid ""
"\n"
" Status of <span id=\"total-task-count\">?</span> processed tasks • last <span id=\"celery-uptime\">?</span>\n"
" "
msgstr ""
#: allianceauth/templates/allianceauth/top-menu-admin.html:19 #: allianceauth/templates/allianceauth/top-menu-admin.html:19
msgid "AA Documentation" msgid "AA Documentation"
msgstr "" msgstr ""
@@ -2874,7 +2969,7 @@ msgid "Theft"
msgstr "" msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7 #: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:54 #: allianceauth/timerboard/templates/timerboard/view.html:52
msgid "Upcoming Timers" msgid "Upcoming Timers"
msgstr "" msgstr ""
@@ -2902,7 +2997,7 @@ msgid "Create Timer"
msgstr "创建时间计划表" msgstr "创建时间计划表"
#: allianceauth/timerboard/templates/timerboard/timer_create_form.html:9 #: allianceauth/timerboard/templates/timerboard/timer_create_form.html:9
#: allianceauth/timerboard/templates/timerboard/view.html:22 #: allianceauth/timerboard/templates/timerboard/view.html:20
msgid "Create Structure Timer" msgid "Create Structure Timer"
msgstr "创建建筑时间表" msgstr "创建建筑时间表"
@@ -2920,11 +3015,11 @@ msgstr "建筑"
msgid "Structure Timer Management" msgid "Structure Timer Management"
msgstr "管理建筑时间表" msgstr "管理建筑时间表"
#: allianceauth/timerboard/templates/timerboard/view.html:41 #: allianceauth/timerboard/templates/timerboard/view.html:39
msgid "Corporation Timers" msgid "Corporation Timers"
msgstr "" msgstr ""
#: allianceauth/timerboard/templates/timerboard/view.html:72 #: allianceauth/timerboard/templates/timerboard/view.html:70
msgid "Past Timers" msgid "Past Timers"
msgstr "已经过去的时间节点" msgstr "已经过去的时间节点"
@@ -2937,36 +3032,36 @@ msgstr "已经把%(system)s星系里%(time)s的时间节点设置好了CTA
msgid "Saved changes to the timer." msgid "Saved changes to the timer."
msgstr "保存至新的计划表" msgstr "保存至新的计划表"
#: allianceauth/views.py:55 #: allianceauth/views.py:78
msgid "Bad Request" msgid "Bad Request"
msgstr "" msgstr ""
#: allianceauth/views.py:57 allianceauth/views.py:87 #: allianceauth/views.py:80 allianceauth/views.py:110
msgid "" msgid ""
"Auth encountered an error processing your request, please try again. If the " "Auth encountered an error processing your request, please try again. If the "
"error persists, please contact the administrators." "error persists, please contact the administrators."
msgstr "" msgstr ""
#: allianceauth/views.py:65 #: allianceauth/views.py:88
msgid "Permission Denied" msgid "Permission Denied"
msgstr "" msgstr ""
#: allianceauth/views.py:67 #: allianceauth/views.py:90
msgid "" msgid ""
"You do not have permission to access the requested page. If you believe this" "You do not have permission to access the requested page. If you believe this"
" is in error please contact the administrators." " is in error please contact the administrators."
msgstr "" msgstr ""
#: allianceauth/views.py:75 #: allianceauth/views.py:98
msgid "Page Not Found" msgid "Page Not Found"
msgstr "" msgstr ""
#: allianceauth/views.py:77 #: allianceauth/views.py:100
msgid "" msgid ""
"Page does not exist. If you believe this is in error please contact the " "Page does not exist. If you believe this is in error please contact the "
"administrators. " "administrators. "
msgstr "" msgstr ""
#: allianceauth/views.py:85 #: allianceauth/views.py:108
msgid "Internal Server Error" msgid "Internal Server Error"
msgstr "" msgstr ""

View File

@@ -1,4 +1,4 @@
from __future__ import annotations from __future__ import annotations # Still needed for Python 3.8, replaced with better implementations in Py39+
import logging import logging
from typing import TYPE_CHECKING from typing import TYPE_CHECKING

View File

@@ -72,6 +72,31 @@
{% theme_select %} {% theme_select %}
{% if user.is_authenticated and not request.is_mobile_device %}
<li><hr class="dropdown-divider"></li>
<li><h6 class="dropdown-header">{% translate "Sidebar" %}</h6></li>
<li>
<form class="dropdown-item" action="{% url 'minimize_sidebar' %}?next={{ request.path|urlencode }}" method="post">
{% csrf_token %}
<div class="form-check form-switch">
<input
class="form-check-input"
type="checkbox"
role="switch"
id="toggle-sidebar"
onchange="this.form.submit()"
{% if request.session.MINIMIZE_SIDEBAR %}checked{% endif %}
>
<label class="form-check-label" for="toggle-sidebar">
{% translate "Minimize Sidebar" %}
</label>
</div>
</form>
</li>
{% endif %}
{% if user.is_superuser %} {% if user.is_superuser %}
<li><hr class="dropdown-divider"></li> <li><hr class="dropdown-divider"></li>
<li><h6 class="dropdown-header">{% translate "Super User" %}</h6></li> <li><h6 class="dropdown-header">{% translate "Super User" %}</h6></li>

View File

@@ -3,7 +3,7 @@
{% load menu_menu_items %} {% load menu_menu_items %}
<div class="col-auto px-0"> <div class="col-auto px-0">
<div class="collapse collapse-horizontal" tabindex="-1" id="sidebar"> <div class="collapse collapse-horizontal {% if user.is_authenticated and not request.is_mobile_device and not request.session.MINIMIZE_SIDEBAR %}show{% endif %}" tabindex="-1" id="sidebar">
<div> <div>
<div class="nav-padding navbar-dark text-bg-dark px-0 d-flex flex-column overflow-hidden vh-100 {% if not user.is_authenticated %}position-relative{% endif %}"> <div class="nav-padding navbar-dark text-bg-dark px-0 d-flex flex-column overflow-hidden vh-100 {% if not user.is_authenticated %}position-relative{% endif %}">
{% if user.is_authenticated %} {% if user.is_authenticated %}

View File

@@ -0,0 +1,65 @@
"""
Alliance Auth Middleware
"""
from user_agents import parse
class DeviceDetectionMiddleware:
"""
Middleware to detect the type of device making the request.
Sets flags on the request object for easy access in views and templates.
Flags include:
- is_mobile: True if the device is a mobile phone.
- is_tablet: True if the device is a tablet.
- is_mobile_device: True if the device is either a mobile phone or a tablet.
- is_touch_capable: True if the device has touch capabilities.
- is_pc: True if the device is a desktop or laptop computer.
- is_bot: True if the device is identified as a bot or crawler.
"""
def __init__(self, get_response):
"""
Initialize the middleware with the get_response callable.
:param get_response:
:type get_response:
"""
self.get_response = get_response
def __call__(self, request):
"""
Process the incoming request to determine if it's from a mobile device.
This method is called when the middleware is invoked. It inspects the
`user-agent` header of the incoming HTTP request to determine the type
of client making the request (e.g., mobile, tablet, PC, bot, etc.).
Flags are set on the `request` object to indicate the client type.
:param request: The HTTP request object.
:type request: HttpRequest
:return: The HTTP response object after processing the request.
:rtype: HttpResponse
"""
# Retrieve the user-agent string from the request headers
user_agent_string = request.headers.get("user-agent", "")
# Parse the user-agent string to extract client information
user_agent = parse(user_agent_string)
# Set flags on the request object based on the client type
request.is_mobile = user_agent.is_mobile # True if the client is a mobile phone
request.is_tablet = user_agent.is_tablet # True if the client is a tablet
request.is_mobile_device = user_agent.is_mobile or user_agent.is_tablet # True if mobile phone or tablet
request.is_touch_capable = user_agent.is_touch_capable # True if the client supports touch input
request.is_pc = user_agent.is_pc # True if the client is a PC
request.is_bot = user_agent.is_bot # True if the client is a bot
# Pass the request to the next middleware or view and get the response
response = self.get_response(request)
# Return the processed response
return response

View File

@@ -65,6 +65,7 @@
{% include 'bundles/timers-js.html' %} {% include 'bundles/timers-js.html' %}
<script> <script>
$(document).ready(() => {
// Data // Data
const timers = [ const timers = [
{% for op in optimer %} {% for op in optimer %}
@@ -143,5 +144,6 @@
// Start timed updates // Start timed updates
setInterval(timedUpdate, 1000); setInterval(timedUpdate, 1000);
});
</script> </script>
{% endblock content %} {% endblock content %}

View File

@@ -88,6 +88,7 @@ MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware", "django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware", "django.contrib.sessions.middleware.SessionMiddleware",
"allianceauth.authentication.middleware.UserSettingsMiddleware", "allianceauth.authentication.middleware.UserSettingsMiddleware",
"allianceauth.middleware.DeviceDetectionMiddleware",
"django.middleware.locale.LocaleMiddleware", "django.middleware.locale.LocaleMiddleware",
"django.middleware.common.CommonMiddleware", "django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware", "django.middleware.csrf.CsrfViewMiddleware",

View File

@@ -1,22 +1,37 @@
[supervisord]
environment =
AA_USER = allianceserver, ; The user under which the processes will run
AA_PROJECT_NAME = {{ project_name }}, ; The name of the project
AA_PROJECT_DIRECTORY = {{ project_directory }}, ; The directory of the project
AA_VENV_DIRECTORY = {{ venv_directory }}, ; The directory of the virtual environment
AA_COMMAND_CELERY = {{ celery }}, ; The command to run Celery
AA_COMMAND_GUNICORN = {{ gunicorn }}, ; The command to run Gunicorn
AA_COMMAND_MEMMON = {{ memmon }} ; The command to run Memmon
[program:beat] [program:beat]
command = {{ celery }} -A {{ project_name }} beat command = %(ENV_AA_COMMAND_CELERY)s
directory = {{ project_directory }} -A %(ENV_AA_PROJECT_NAME)s beat
user = allianceserver directory = %(ENV_AA_PROJECT_DIRECTORY)s
stdout_logfile = {{ project_directory }}/log/%(program_name)s.log user = %(ENV_AA_USER)s
stderr_logfile = {{ project_directory }}/log/%(program_name)s.log stdout_logfile = %(ENV_AA_PROJECT_DIRECTORY)s/log/%(program_name)s.log
stderr_logfile = %(ENV_AA_PROJECT_DIRECTORY)s/log/%(program_name)s.log
autostart = true autostart = true
autorestart = true autorestart = true
startsecs = 10 startsecs = 10
priority = 998 priority = 998
[program:worker] [program:worker]
command = {{ celery }} -A {{ project_name }} worker --pool=threads --concurrency=5 -n %(program_name)s_%(process_num)02d command = %(ENV_AA_COMMAND_CELERY)s
directory = {{ project_directory }} -A %(ENV_AA_PROJECT_NAME)s worker
user = allianceserver --pool=threads
--concurrency=5
-n %(program_name)s_%(process_num)02d
directory = %(ENV_AA_PROJECT_DIRECTORY)s
user = %(ENV_AA_USER)s
numprocs = 1 numprocs = 1
process_name = %(program_name)s_%(process_num)02d process_name = %(program_name)s_%(process_num)02d
stdout_logfile = {{ project_directory }}/log/%(program_name)s.log stdout_logfile = %(ENV_AA_PROJECT_DIRECTORY)s/log/%(program_name)s.log
stderr_logfile = {{ project_directory }}/log/%(program_name)s.log stderr_logfile = %(ENV_AA_PROJECT_DIRECTORY)s/log/%(program_name)s.log
autostart = true autostart = true
autorestart = true autorestart = true
startsecs = 10 startsecs = 10
@@ -26,22 +41,26 @@ priority = 998
{% if gunicorn %} {% if gunicorn %}
[program:gunicorn] [program:gunicorn]
user = allianceserver user = %(ENV_AA_USER)s
directory = {{ project_directory }} directory = %(ENV_AA_PROJECT_DIRECTORY)s
command = {{ gunicorn }} {{ project_name }}.wsgi --workers=3 --timeout 120 command = %(ENV_AA_COMMAND_GUNICORN)s %(ENV_AA_PROJECT_NAME)s.wsgi
stdout_logfile = {{ project_directory }}/log/%(program_name)s.log --workers=3
stderr_logfile = {{ project_directory }}/log/%(program_name)s.log --timeout 120
stdout_logfile = %(ENV_AA_PROJECT_DIRECTORY)s/log/%(program_name)s.log
stderr_logfile = %(ENV_AA_PROJECT_DIRECTORY)s/log/%(program_name)s.log
autostart = true autostart = true
autorestart = true autorestart = true
stopsignal = INT stopsignal = INT
{% endif %} {% endif %}
[eventlistener:memmon] [eventlistener:memmon]
command = {{ memmon }} -p worker_00=256MB -p gunicorn=256MB command = %(ENV_AA_COMMAND_MEMMON)s
directory = {{ project_directory }} -p worker_00=256MB
-p gunicorn=256MB
directory = %(ENV_AA_PROJECT_DIRECTORY)s
events = TICK_60 events = TICK_60
stdout_logfile = {{ project_directory }}/log/memmon.log stdout_logfile = %(ENV_AA_PROJECT_DIRECTORY)s/log/memmon.log
stderr_logfile = {{ project_directory }}/log/memmon.log stderr_logfile = %(ENV_AA_PROJECT_DIRECTORY)s/log/memmon.log
[group:{{ project_name }}] [group:{{ project_name }}]
programs = beat,worker{% if gunicorn %},gunicorn{% endif %} programs = beat,worker{% if gunicorn %},gunicorn{% endif %}

View File

@@ -100,7 +100,10 @@ class BaseSetPasswordServiceAccountView(ServicesCRUDMixin, BaseServiceView, Upda
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
result = super().post(request, *args, **kwargs) result = super().post(request, *args, **kwargs)
if self.get_form().is_valid(): if self.get_form().is_valid():
messages.success(request, _(f"Successfully set your {self.service_name} password")) messages.success(
request,
_("Successfully set your {service_name} password").format(service_name=self.service_name)
)
return result return result

View File

@@ -100,13 +100,13 @@ def jabber_broadcast_view(request):
if main_char is not None: if main_char is not None:
message_to_send = form.cleaned_data['message'] + "\n##### SENT BY: " + "[" + main_char.corporation_ticker + "]" + \ message_to_send = form.cleaned_data['message'] + "\n##### SENT BY: " + "[" + main_char.corporation_ticker + "]" + \
main_char.character_name + " TO: " + \ main_char.character_name + " TO: " + \
form.cleaned_data['group'] + " WHEN: " + datetime.datetime.utcnow().strftime( form.cleaned_data['group'] + " WHEN: " + datetime.datetime.now(datetime.timezone.utc).strftime(
"%Y-%m-%d %H:%M:%S") + " #####\n##### Replies are NOT monitored #####\n" "%Y-%m-%d %H:%M:%S") + " #####\n##### Replies are NOT monitored #####\n"
group_to_send = form.cleaned_data['group'] group_to_send = form.cleaned_data['group']
else: else:
message_to_send = form.cleaned_data['message'] + "\n##### SENT BY: " + "No character but can send pings?" + " TO: " + \ message_to_send = form.cleaned_data['message'] + "\n##### SENT BY: " + "No character but can send pings?" + " TO: " + \
form.cleaned_data['group'] + " WHEN: " + datetime.datetime.utcnow().strftime( form.cleaned_data['group'] + " WHEN: " + datetime.datetime.now(datetime.timezone.utc).strftime(
"%Y-%m-%d %H:%M:%S") + " #####\n##### Replies are NOT monitored #####\n" "%Y-%m-%d %H:%M:%S") + " #####\n##### Replies are NOT monitored #####\n"
group_to_send = form.cleaned_data['group'] group_to_send = form.cleaned_data['group']

View File

@@ -2,7 +2,7 @@ import random
import string import string
import calendar import calendar
import re import re
from datetime import datetime import datetime as dt
from passlib.apps import phpbb3_context from passlib.apps import phpbb3_context
from django.db import connections from django.db import connections
@@ -128,7 +128,7 @@ class Phpbb3Manager:
@staticmethod @staticmethod
def __get_current_utc_date(): def __get_current_utc_date():
d = datetime.utcnow() d = dt.datetime.now(dt.timezone.utc)
unixtime = calendar.timegm(d.utctimetuple()) unixtime = calendar.timegm(d.utctimetuple())
return unixtime return unixtime

View File

@@ -1,7 +1,7 @@
import random import random
import string import string
import calendar import calendar
from datetime import datetime import datetime as dt
import hashlib import hashlib
import logging import logging
import re import re
@@ -105,7 +105,7 @@ class SmfManager:
@staticmethod @staticmethod
def get_current_utc_date(): def get_current_utc_date():
d = datetime.utcnow() d = dt.datetime.now(dt.timezone.utc)
unixtime = calendar.timegm(d.utctimetuple()) unixtime = calendar.timegm(d.utctimetuple())
return unixtime return unixtime

View File

@@ -111,11 +111,11 @@ class Teamspeak3Manager:
outlist = {} outlist = {}
if type(groups) == list: if type(groups) == list:
logger.debug("Recieved multiple groups. Iterating.") logger.debug("Received multiple groups. Iterating.")
for group in groups: for group in groups:
outlist[group['keys']['name']] = group['keys']['sgid'] outlist[group['keys']['name']] = group['keys']['sgid']
elif type(groups) == dict: elif type(groups) == dict:
logger.debug("Recieved single group.") logger.debug("Received single group.")
outlist[groups['keys']['name']] = groups['keys']['sgid'] outlist[groups['keys']['name']] = groups['keys']['sgid']
logger.debug("Returning name/id pairing: %s" % outlist) logger.debug("Returning name/id pairing: %s" % outlist)
return outlist return outlist

View File

@@ -34,6 +34,9 @@ class SrpFleetUserRequestForm(forms.Form):
_("Invalid Link. Please use zkillboard.com or kb.evetools.org") _("Invalid Link. Please use zkillboard.com or kb.evetools.org")
) )
if re.match(r"^http[s]?:\/\/zkillboard\.com\/", data) and not data.endswith("/"):
data += "/"
# Check if it's an actual kill mail # Check if it's an actual kill mail
if not any( if not any(
re.match(regex, data) re.match(regex, data)

View File

@@ -0,0 +1,27 @@
from django.test import TestCase
from allianceauth.srp.form import SrpFleetUserRequestForm
class TestForms(TestCase):
def test_allow_missing_trailing_slash_zkillboard(self):
form = SrpFleetUserRequestForm(
data = {
"killboard_link": "https://zkillboard.com/kill/130429493",
"additional_info": "Details",
}
)
form.cleaned_data = {"killboard_link": "https://zkillboard.com/kill/130429493"}
self.assertEqual("https://zkillboard.com/kill/130429493/", form.clean_killboard_link())
def test_not_add_trailling_slash_kb_evetools(self):
form = SrpFleetUserRequestForm(
data = {
"killboard_link": "https://kb.evetools.org/kill/130429493",
}
)
form.cleaned_data = {"killboard_link": "https://kb.evetools.org/kill/130429493"}
self.assertEqual("https://kb.evetools.org/kill/130429493", form.clean_killboard_link())

View File

@@ -0,0 +1,207 @@
/* global fetchGet, numberFormatter, taskQueueSettings */
$(document).ready(() => {
'use strict';
const elements = {
total: document.getElementById('total-task-count'),
uptime: document.getElementById('celery-uptime'),
running: document.getElementById('running-task-count'),
queued: document.getElementById('queued-tasks-count'),
succeeded: document.getElementById('succeeded-tasks-count'),
retried: document.getElementById('retried-tasks-count'),
failed: document.getElementById('failed-tasks-count')
};
/**
* Fetches the task queue status and updates the UI elements accordingly.
* It retrieves the total number of tasks, running tasks, queued tasks,
* succeeded tasks, retried tasks, and failed tasks, and updates the
* corresponding HTML elements with the fetched data.
* It also updates the progress bars for succeeded, retried, and failed tasks.
* The function is called immediately and then every 30 seconds to keep the
* task queue status up to date.
*/
const updateTaskCount = () => {
fetchGet({url: taskQueueSettings.url})
.then((data) => {
const elemProgressBar = document.getElementById('celery-tasks-progress-bar');
const progressElements = {
succeeded: {
bar: document.getElementById('celery-progress-bar-succeeded'),
text: document.getElementById('celery-progress-bar-succeeded-progress')
},
retried: {
bar: document.getElementById('celery-progress-bar-retried'),
text: document.getElementById('celery-progress-bar-retried-progress')
},
failed: {
bar: document.getElementById('celery-progress-bar-failed'),
text: document.getElementById('celery-progress-bar-failed-progress')
}
};
// Assign progress data from the fetched data to variables
const {
earliest_task: earliestTask,
tasks_total: tasksTotal,
tasks_running: tasksRunning,
tasks_queued: tasksQueued,
tasks_succeeded: tasksSucceeded,
tasks_retried: tasksRetried,
tasks_failed: tasksFailed
} = data;
/**
* Updates the text content of the specified HTML element with the given value.
* If the value is null, it sets the text to 'N/A'.
* Otherwise, it formats the number using the locale-specific format.
*
* @param {HTMLElement} element The HTML element to update.
* @param {number|null} value The value to set in the element.
*/
const updateTaskCount = (element, value) => {
element.textContent = value === null ? taskQueueSettings.l10n.na : numberFormatter({value: value, locales: taskQueueSettings.l10n.language});
};
/**
* Calculates the time since the given timestamp and returns a formatted string.
* If the timestamp is null or undefined, it returns 'N/A'.
* The returned string is in the format of "X hours, Y minutes" or "X minutes, Y seconds".
*
* @param {string|null} timestamp The timestamp to calculate the time since.
* @returns {string} A formatted string representing the time since the timestamp.
*/
const timeSince = (timestamp) => {
if (!timestamp) {
return taskQueueSettings.l10n.na;
}
const diffSecs = Math.floor((Date.now() - new Date(timestamp)) / 1000);
if (diffSecs >= 3600) {
const hours = Math.floor(diffSecs / 3600);
const minutes = Math.floor((diffSecs % 3600) / 60);
if (minutes > 0) {
const hourText = hours === 1 ? taskQueueSettings.l10n.hour_singular : taskQueueSettings.l10n.hour_plural;
const minuteText = minutes === 1 ? taskQueueSettings.l10n.minute_singular : taskQueueSettings.l10n.minute_plural;
return `${hours} ${hourText}, ${minutes} ${minuteText}`;
}
const hourText = hours === 1 ? taskQueueSettings.l10n.hour_singular : taskQueueSettings.l10n.hour_plural;
return `${hours} ${hourText}`;
}
const units = [
[
60,
taskQueueSettings.l10n.minute_singular,
taskQueueSettings.l10n.minute_plural
],
[
1,
taskQueueSettings.l10n.second_singular,
taskQueueSettings.l10n.second_plural
]
];
for (const [seconds, singular, plural] of units) {
const value = Math.floor(diffSecs / seconds);
if (value > 0) {
return `${value} ${value > 1 ? plural : singular}`;
}
}
return `0 ${taskQueueSettings.l10n.second_plural}`;
};
/**
* Updates the progress bar element and its text content based on the given value and total.
* It calculates the percentage of completion and updates the aria attributes and styles accordingly.
*
* @param {HTMLElement} element The progress bar element to update.
* @param {HTMLElement} textElement The text element to update with the percentage.
* @param {number} value The current value to set in the progress bar.
* @param {number} total The total value for calculating the percentage.
*/
const updateProgressBar = (element, textElement, value, total) => {
const percentage = total ? (value / total) * 100 : 0;
element.setAttribute('aria-valuenow', percentage.toString());
textElement.textContent = `${numberFormatter({value: percentage.toFixed(0), locales: taskQueueSettings.l10n.language})}%`;
element.style.width = `${percentage}%`;
};
// Update task counts
[
[elements.total, tasksTotal],
[elements.running, tasksRunning],
[elements.queued, tasksQueued],
[elements.succeeded, tasksSucceeded],
[elements.retried, tasksRetried],
[elements.failed, tasksFailed]
].forEach(([element, value]) => {
updateTaskCount(element, value);
});
// Update uptime
elements.uptime.textContent = timeSince(earliestTask);
// Update progress bar title
const [
titleTextSucceeded,
titleTextRetried,
titleTextFailed
] = [
[tasksSucceeded, taskQueueSettings.l10n.succeeded],
[tasksRetried, taskQueueSettings.l10n.retried],
[tasksFailed, taskQueueSettings.l10n.failed]
].map(([count, label]) => {
return `${numberFormatter({value: count, locales: taskQueueSettings.l10n.language})} ${label}`;
});
// Set the title attribute for the progress bar
elemProgressBar.setAttribute(
'title',
`${titleTextSucceeded}, ${titleTextRetried}, ${titleTextFailed}`
);
// Update progress bars
[
tasksSucceeded,
tasksRetried,
tasksFailed
].forEach((count, index) => {
const type = ['succeeded', 'retried', 'failed'][index];
updateProgressBar(
progressElements[type].bar,
progressElements[type].text,
count,
tasksTotal
);
});
})
.catch((error) => {
console.error('Error fetching task queue:', error);
// If there is an error fetching the task queue, set all elements to 'ERROR'
[
elements.running,
elements.queued,
elements.succeeded,
elements.retried,
elements.failed
].forEach((elem) => {
elem.textContent = taskQueueSettings.l10n.error;
});
});
};
updateTaskCount();
setInterval(updateTaskCount, 30000);
});

View File

@@ -0,0 +1,57 @@
$(document).ready(() => {
'use strict';
/**
* Collect all badges in the sidebar menu that are not part of a collapsible submenu, and calculate the total notification count.
* Show a total notification badge in the navbar if there are any notifications.
*/
const totalNotificationsBadge = () => {
const badges = [];
let notificationCount = 0;
document.querySelectorAll('#sidebar-menu .badge').forEach(b => {
const li = b.closest('li');
if (!li || !li.querySelector('ul.collapse')) {
badges.push(b);
notificationCount += parseInt(b.textContent);
}
});
if (badges.length > 0 && notificationCount > 0) {
const notificationBadge = document.createElement('span');
notificationBadge.classList.add(
'badge',
'text-bg-danger',
'align-self-center',
'sidemenu-notification-badge',
'sidemenu-total-notifications-badge'
);
notificationBadge.textContent = String(notificationCount);
document.querySelector('a.navbar-brand i.fa-solid').prepend(notificationBadge);
}
};
/**
* Find the active child menu item in the sidebar menu, if any, and ensure its parent submenu is expanded.
*/
const expandChildMenu = () => {
const activeChildMenuItem = document.querySelector('ul#sidebar-menu ul.collapse a.active');
if (activeChildMenuItem) {
const activeChildMenuUl = activeChildMenuItem.closest('ul');
activeChildMenuUl.classList.add('show');
document.querySelectorAll(`[data-bs-target^="#${activeChildMenuUl.id}"]`)
.forEach(element => element.setAttribute('aria-expanded', 'true'));
}
};
// Execute functions on document ready
[
totalNotificationsBadge,
expandChildMenu
].forEach(fn => fn());
});

View File

@@ -1,29 +1,32 @@
{% load i18n %} {% load i18n %}
<div id="esi-alert" class="col-12 collapse"> <div id="esi-alert" class="col-12 collapse">
<div class="alert alert-warning"> <div class="alert alert-warning">
<p class="text-center ">{% translate 'Your Server received an ESI error response code of ' %}<b id="esi-code">?</b></p> <p class="text-center ">{% translate 'Your Server received an ESI error response code of ' %}<b id="esi-code">?</b></p>
<hr> <hr>
<pre id="esi-data" class="text-center text-wrap"></pre> <pre id="esi-data" class="text-center text-wrap"></pre>
</div> </div>
</div>
<script> <script>
const elemCard = document.getElementById('esi-alert'); $(document).ready(() => {
const elemMessage = document.getElementById('esi-data'); const elements = {
const elemCode = document.getElementById('esi-code'); card: document.getElementById('esi-alert'),
message: document.getElementById('esi-data'),
code: document.getElementById('esi-code')
};
fetchGet({url: '{% url "authentication:esi_check" %}'}) fetchGet({url: '{% url "authentication:esi_check" %}'})
.then((data) => { .then(({status, data}) => {
console.log('ESI Check: ', JSON.stringify(data, null, 2)); console.log('ESI Check:', JSON.stringify({status, data}, null, 2));
if (data.status !== 200) { if (status !== 200) {
elemCode.textContent = data.status; elements.code.textContent = status;
elemMessage.textContent = data.data.error; elements.message.textContent = data.error;
new bootstrap.Collapse(elemCard, {toggle: true}); new bootstrap.Collapse(elements.card, {toggle: true});
} }
}) })
.catch((error) => { .catch((error) => console.error('Error fetching ESI check:', error));
console.error('Error fetching ESI check:', error);
}); });
</script> </script>
</div>

View File

@@ -161,206 +161,24 @@ the escapejs filter without having to redefine them later.
</div> </div>
<script> <script>
const elements = { const taskQueueSettings = {
total: document.getElementById('total-task-count'), url: '{% url "authentication:task_counts" %}',
uptime: document.getElementById('celery-uptime'), l10n: {
running: document.getElementById('running-task-count'), language: '{{ LANGUAGE_CODE }}',
queued: document.getElementById('queued-tasks-count'), second_singular: '{{ l10nSecondSingular|escapejs }}',
succeeded: document.getElementById('succeeded-tasks-count'), second_plural: '{{ l10nSecondPlural|escapejs }}',
retried: document.getElementById('retried-tasks-count'), minute_singular: '{{ l10nMinuteSingular|escapejs }}',
failed: document.getElementById('failed-tasks-count') minute_plural: '{{ l10nMinutePlural|escapejs }}',
}; hour_singular: '{{ l10nHourSingular|escapejs }}',
hour_plural: '{{ l10nHourPlural|escapejs }}',
/** na: '{{ l10nNA|escapejs }}',
* Fetches the task queue status and updates the UI elements accordingly. error: '{{ l10nError|escapejs }}',
* It retrieves the total number of tasks, running tasks, queued tasks, running: '{{ l10nRunning|escapejs }}',
* succeeded tasks, retried tasks, and failed tasks, and updates the queued: '{{ l10nQueued|escapejs }}',
* corresponding HTML elements with the fetched data. succeeded: '{{ l10nSucceeded|escapejs }}',
* It also updates the progress bars for succeeded, retried, and failed tasks. retried: '{{ l10nRetried|escapejs }}',
* The function is called immediately and then every 30 seconds to keep the failed: '{{ l10nFailed|escapejs }}'
* task queue status up to date.
*/
const updateTaskCount = () => {
fetchGet({url: '{% url "authentication:task_counts" %}'})
.then((data) => {
const numberL10nFormat = new Intl.NumberFormat('{{ LANGUAGE_CODE }}');
const elemProgressBar = document.getElementById('celery-tasks-progress-bar');
const progressElements = {
succeeded: {
bar: document.getElementById('celery-progress-bar-succeeded'),
text: document.getElementById('celery-progress-bar-succeeded-progress')
},
retried: {
bar: document.getElementById('celery-progress-bar-retried'),
text: document.getElementById('celery-progress-bar-retried-progress')
},
failed: {
bar: document.getElementById('celery-progress-bar-failed'),
text: document.getElementById('celery-progress-bar-failed-progress')
} }
}; };
// Assign progress data from the fetched data to variables
const {
earliest_task: earliestTask,
tasks_total: tasksTotal,
tasks_running: tasksRunning,
tasks_queued: tasksQueued,
tasks_succeeded: tasksSucceeded,
tasks_retried: tasksRetried,
tasks_failed: tasksFailed
} = data;
/**
* Updates the text content of the specified HTML element with the given value.
* If the value is null, it sets the text to 'N/A'.
* Otherwise, it formats the number using the locale-specific format.
*
* @param {HTMLElement} element The HTML element to update.
* @param {number|null} value The value to set in the element.
*/
const updateTaskCount = (element, value) => {
element.textContent = value == null ? '{{ l10nNA|escapejs }}' : numberL10nFormat.format(value);
};
/**
* Calculates the time since the given timestamp and returns a formatted string.
* If the timestamp is null or undefined, it returns 'N/A'.
* The returned string is in the format of "X hours, Y minutes" or "X minutes, Y seconds".
*
* @param {string|null} timestamp The timestamp to calculate the time since.
* @returns {string} A formatted string representing the time since the timestamp.
*/
const timeSince = (timestamp) => {
if (!timestamp) {
return '{{ l10nNA|escapejs }}';
}
const diffSecs = Math.floor((Date.now() - new Date(timestamp)) / 1000);
if (diffSecs >= 3600) {
const hours = Math.floor(diffSecs / 3600);
const minutes = Math.floor((diffSecs % 3600) / 60);
if (minutes > 0) {
const hourText = hours === 1 ? '{{ l10nHourSingular|escapejs }}' : '{{ l10nHourPlural|escapejs }}';
const minuteText = minutes === 1 ? '{{ l10nMinuteSingular|escapejs }}' : '{{ l10nMinutePlural|escapejs }}';
return `${hours} ${hourText}, ${minutes} ${minuteText}`;
}
const hourText = hours === 1 ? '{{ l10nHourSingular|escapejs }}' : '{{ l10nHourPlural|escapejs }}';
return `${hours} ${hourText}`;
}
const units = [
[
60,
'{{ l10nMinuteSingular|escapejs }}',
'{{ l10nMinutePlural|escapejs }}'
],
[
1,
'{{ l10nSecondSingular|escapejs }}',
'{{ l10nSecondPlural|escapejs }}'
]
];
for (const [seconds, singular, plural] of units) {
const value = Math.floor(diffSecs / seconds);
if (value > 0) {
return `${value} ${value > 1 ? plural : singular}`;
}
}
return '0 {{ l10nSecondPlural|escapejs }}';
};
/**
* Updates the progress bar element and its text content based on the given value and total.
* It calculates the percentage of completion and updates the aria attributes and styles accordingly.
*
* @param {HTMLElement} element The progress bar element to update.
* @param {HTMLElement} textElement The text element to update with the percentage.
* @param {number} value The current value to set in the progress bar.
* @param {number} total The total value for calculating the percentage.
*/
const updateProgressBar = (element, textElement, value, total) => {
const percentage = total ? (value / total) * 100 : 0;
element.setAttribute('aria-valuenow', percentage.toString());
textElement.textContent = `${numberL10nFormat.format(percentage.toFixed(0))}%`;
element.style.width = `${percentage}%`;
};
// Update task counts
[
[elements.total, tasksTotal],
[elements.running, tasksRunning],
[elements.queued, tasksQueued],
[elements.succeeded, tasksSucceeded],
[elements.retried, tasksRetried],
[elements.failed, tasksFailed]
].forEach(([element, value]) => {
updateTaskCount(element, value);
});
// Update uptime
elements.uptime.textContent = timeSince(earliestTask);
// Update progress bar title
const [
titleTextSucceeded,
titleTextRetried,
titleTextFailed
] = [
[tasksSucceeded, '{{ l10nSucceeded|escapejs }}'],
[tasksRetried, '{{ l10nRetried|escapejs }}'],
[tasksFailed, '{{ l10nFailed|escapejs }}']
].map(([count, label]) => {
return `${numberL10nFormat.format(count)} ${label}`;
});
// Set the title attribute for the progress bar
elemProgressBar.setAttribute(
'title',
`${titleTextSucceeded}, ${titleTextRetried}, ${titleTextFailed}`
);
// Update progress bars
[
tasksSucceeded,
tasksRetried,
tasksFailed
].forEach((count, index) => {
const type = ['succeeded', 'retried', 'failed'][index];
updateProgressBar(
progressElements[type].bar,
progressElements[type].text,
count,
tasksTotal
);
});
})
.catch((error) => {
console.error('Error fetching task queue:', error);
// If there is an error fetching the task queue, set all elements to 'ERROR'
[
elements.running,
elements.queued,
elements.succeeded,
elements.retried,
elements.failed
].forEach((elem) => {
elem.textContent = '{{ l10nError|escapejs }}';
});
});
};
updateTaskCount();
setInterval(updateTaskCount, 30000);
</script> </script>
{% include "bundles/auth-dashboard-task-queue-js.html" %}

View File

@@ -102,44 +102,7 @@
</main> </main>
<!-- End Body --> <!-- End Body -->
<script> {% include "bundles/auth-sidebar-collapse-js.html" %}
(() => {
// TODO Move to own JS file
const sidebar = document.getElementById('sidebar');
const sidebarKey = `sidebar_${sidebar.id}`;
sidebar.addEventListener('shown.bs.collapse', (event) => {
if (event.target.id === sidebar.id) {
localStorage.removeItem(sidebarKey);
}
});
sidebar.addEventListener('hidden.bs.collapse', (event) => {
if (event.target.id === sidebar.id) {
localStorage.setItem(sidebarKey, 'closed');
}
});
if (localStorage.getItem(sidebarKey) === 'closed') {
sidebar.classList.remove('show');
} else {
sidebar.classList.add('show');
}
const activeChildMenuItem = document.querySelector('#sidebar-menu li ul li a.active');
if (activeChildMenuItem) {
const activeChildMenuUl = activeChildMenuItem.parentElement.parentElement;
const elementsToToggle = document.querySelectorAll(`[data-bs-target^="#${activeChildMenuUl.id}"]`);
activeChildMenuUl.classList.add('show');
elementsToToggle.forEach((element) => {
element.setAttribute('aria-expanded', true);
});
}
})();
</script>
{% theme_js %} {% theme_js %}

View File

@@ -0,0 +1,3 @@
{% load sri %}
{% sri_static 'allianceauth/js/dashboard-update-task-queue.js' %}

View File

@@ -0,0 +1,3 @@
{% load sri %}
{% sri_static 'allianceauth/js/sidebar.js' %}

View File

@@ -0,0 +1,11 @@
{# Template override to display the errors of django Forms when using `boostrap_form` form the `django-bootstrap5` #}
{# library. #}
{# See: https://github.com/zostera/django-bootstrap5/pull/767 #}
{% if field_errors %}
<div id="{{ field.auto_id }}_error" class="invalid-feedback">
{% for text in field_errors %}
<div>{{ text }}</div>
{% endfor %}
</div>
{% endif %}

View File

@@ -96,6 +96,7 @@
{% get_datatables_language_static LANGUAGE_CODE as DT_LANG_PATH %} {% get_datatables_language_static LANGUAGE_CODE as DT_LANG_PATH %}
<script> <script>
$(document).ready(() => {
const timers = [ const timers = [
{% for timer in timers %} {% for timer in timers %}
{ {
@@ -175,7 +176,6 @@
// Start timed updates // Start timed updates
setInterval(timedUpdate, 1000); setInterval(timedUpdate, 1000);
$(document).ready(() => {
const dtOptions = { const dtOptions = {
language: {url: '{{ DT_LANG_PATH }}'}, language: {url: '{{ DT_LANG_PATH }}'},
order: [ order: [
@@ -185,7 +185,10 @@
{% if perms.auth.timer_management %} {% if perms.auth.timer_management %}
dtOptions['columnDefs'] = [ dtOptions['columnDefs'] = [
{ "orderable": false, "targets": 7 } {
"orderable": false,
"targets": 7
}
]; ];
{% endif %} {% endif %}

View File

@@ -80,7 +80,10 @@ urlpatterns = [
path('night/', views.NightModeRedirectView.as_view(), name='nightmode'), path('night/', views.NightModeRedirectView.as_view(), name='nightmode'),
# Theme Change # Theme Change
path('theme/', views.ThemeRedirectView.as_view(), name='theme') path('theme/', views.ThemeRedirectView.as_view(), name='theme'),
# Minimize Menu
path('minimize-sidebar/', views.MinimizeSidebarRedirectView.as_view(), name='minimize_sidebar')
] ]
url_hooks = get_hooks("url_hook") url_hooks = get_hooks("url_hook")

View File

@@ -48,6 +48,29 @@ class ThemeRedirectView(View):
return HttpResponseRedirect(request.GET.get("next", "/")) return HttpResponseRedirect(request.GET.get("next", "/"))
class MinimizeSidebarRedirectView(View):
SESSION_VAR = "MINIMIZE_SIDEBAR"
def post(self, request, *args, **kwargs):
request.session[self.SESSION_VAR] = not self.minimize_sidebar_state(request)
if not request.user.is_anonymous:
try:
request.user.profile.minimize_sidebar = request.session[self.SESSION_VAR]
request.user.profile.save()
except Exception as e:
logger.exception(e)
return HttpResponseRedirect(request.GET.get("next", "/"))
@classmethod
def minimize_sidebar_state(cls, request):
try:
return request.session.get(cls.SESSION_VAR, False)
except AttributeError:
# Session is middleware
# Sometimes request wont have a session attribute
return False
# TODO: error views should be renamed to a proper function name when possible # TODO: error views should be renamed to a proper function name when possible

View File

@@ -1,7 +1,7 @@
PROTOCOL=https:// PROTOCOL=https://
AUTH_SUBDOMAIN=%AUTH_SUBDOMAIN% AUTH_SUBDOMAIN=%AUTH_SUBDOMAIN%
DOMAIN=%DOMAIN% DOMAIN=%DOMAIN%
AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v4.10.0 AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v4.11.1
# Nginx Proxy Manager # Nginx Proxy Manager
PROXY_HTTP_PORT=80 PROXY_HTTP_PORT=80

View File

@@ -1,5 +1,5 @@
FROM python:3.11-slim FROM python:3.11-slim
ARG AUTH_VERSION=v4.10.0 ARG AUTH_VERSION=v4.11.1
ARG AUTH_PACKAGE=allianceauth==${AUTH_VERSION} ARG AUTH_PACKAGE=allianceauth==${AUTH_VERSION}
ENV AUTH_USER=allianceauth ENV AUTH_USER=allianceauth
ENV AUTH_GROUP=allianceauth ENV AUTH_GROUP=allianceauth

View File

@@ -15,7 +15,7 @@ license = { file = "LICENSE" }
authors = [ authors = [
{ name = "Alliance Auth", email = "adarnof@gmail.com" }, { name = "Alliance Auth", email = "adarnof@gmail.com" },
] ]
requires-python = ">=3.8" requires-python = ">=3.8,<3.13"
classifiers = [ classifiers = [
"Environment :: Web Environment", "Environment :: Web Environment",
"Framework :: Celery", "Framework :: Celery",
@@ -31,7 +31,6 @@ classifiers = [
"Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP",
"Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
] ]
@@ -40,7 +39,7 @@ dynamic = [
"version", "version",
] ]
dependencies = [ dependencies = [
"bcrypt", "bcrypt<5",
"beautifulsoup4", "beautifulsoup4",
"celery>=5.2,<6", "celery>=5.2,<6",
"celery-once>=3.0.1", "celery-once>=3.0.1",
@@ -61,11 +60,14 @@ dependencies = [
"passlib", "passlib",
"pydiscourse", "pydiscourse",
"python-slugify>=1.2", "python-slugify>=1.2",
"pyyaml",
"redis>=4", "redis>=4",
"requests>=2.9.1", "requests>=2.9.1",
"requests-oauthlib", "requests-oauthlib",
"semantic-version", "semantic-version",
"slixmpp<1.9", "slixmpp<1.9",
"ua-parser",
"user-agents",
] ]
optional-dependencies.docs = [ optional-dependencies.docs = [
"myst-parser", "myst-parser",