Compare commits

...

115 Commits

Author SHA1 Message Date
Joel Falknau
a5f2e29a46 fixes 2024-12-30 22:26:35 +10:00
Joel Falknau
8f33c649b3 cleanup 2024-12-30 20:28:54 +10:00
Joel Falknau
f6cb28d64b clarify templinks page 2024-12-30 20:28:45 +10:00
Joel Falknau
96b54d15ac shift tests 2024-12-30 20:27:47 +10:00
Joel Falknau
498b876572 begin docs for new authenticator 2024-12-30 13:29:25 +10:00
Joel Falknau
7559b7ac09 Mumble Server Parameter 2024-12-30 13:28:36 +10:00
Joel Falknau
9e39769ad3 model docs 2024-12-30 13:28:05 +10:00
Joel Falknau
d68d75bd05 use new model formats, remove temp templates 2024-12-29 21:16:59 +10:00
Joel Falknau
1385a2ef16 unify user types 2024-12-29 21:15:48 +10:00
Joel Falknau
d09892397b add TempUser to more authenticator functions 2024-12-29 21:15:03 +10:00
Joel Falknau
168e6cc290 remove temps from more templates 2024-12-29 21:14:40 +10:00
Joel Falknau
baf3c85ac7 Cleanup of templinks merge 2024-12-29 17:36:04 +10:00
Joel Falknau
3ef3098ad1 push templink framework 2024-12-06 21:07:42 +10:00
Joel Falknau
3b792117d9 Django Context Mumble Authenticator 2024-12-06 19:59:47 +10:00
Ariel Rin
1478588016 Merge branch 'add-js-type' into 'master'
[ADD] `js_type` parameter to allow JS modules to be loaded

See merge request allianceauth/allianceauth!1664
2024-12-04 11:24:21 +00:00
Ariel Rin
a16eb4b7f7 Merge branch 'image-overflow-fix' into 'master'
[FIX] Prevent images from overflowing their parent element

See merge request allianceauth/allianceauth!1665
2024-12-04 11:23:38 +00:00
Ariel Rin
702564d15e correct top level indentation to be able to be directly copy-pasteable 2024-12-03 09:50:55 +00:00
Peter Pfeufer
cef2e86ea1 [FIX] Prevent images from overflowing their parent element 2024-11-26 22:28:35 +01:00
Peter Pfeufer
50681b023b [CHANGE] Move the if inside the script tag
Makes the code better readable and maintainable.
2024-11-23 01:55:04 +01:00
Peter Pfeufer
2822775fb8 [ADD] js_type parameter to allow JS modules to be loaded 2024-11-22 15:01:32 +01:00
Ariel Rin
ef7c8be7b5 Merge branch 'fix/default-collation' into 'master'
Fix Different collations being used by docker and baremetal installations

See merge request allianceauth/allianceauth!1662
2024-11-17 01:57:59 +00:00
Ariel Rin
d639617eba Merge branch 'master' into 'master'
Celery documentation improvements

See merge request allianceauth/allianceauth!1663
2024-11-17 01:57:05 +00:00
r0kym
2125192f72 Fix typo in the long-running tasks example 2024-11-15 15:13:25 +01:00
r0kym
8d63801b00 Change logging imports and commands
Now uses `get_extension_logger` as is recommanded by https://allianceauth.readthedocs.io/en/v4.4.2/development/custom/logging.html
2024-11-15 15:12:03 +01:00
Matteo Ghia
e053fb7d96 also in baremetal docs 2024-11-09 12:45:59 +01:00
Matteo Ghia
ae7ed5c297 add default keyword required by mariadb 2024-11-09 12:45:31 +01:00
Matteo Ghia
d624ba4427 set default collation in startup script 2024-11-09 12:01:57 +01:00
Joel Falknau
164cd4fbb2 Merge branch 'master' of gitlab.com:allianceauth/allianceauth 2024-11-08 12:48:21 +10:00
Joel Falknau
94b52c850e Version Bump 4.4.2 2024-11-08 12:47:55 +10:00
Ariel Rin
4d19ceb388 Merge branch 'translations_7f31a07ccd4e4a66b1dd7b6bc2dbddb5' into 'master'
Updates for project Alliance Auth

See merge request allianceauth/allianceauth!1660
2024-11-08 02:43:11 +00:00
Ariel Rin
9a64728311 Updates for project Alliance Auth 2024-11-08 02:43:11 +00:00
Ariel Rin
dcc0c78daf Merge branch 'fix-language-selector' into 'master'
[FIX] Language selector

See merge request allianceauth/allianceauth!1661
2024-11-08 02:17:30 +00:00
Peter Pfeufer
5507c30af4 [CHANGE] Use language local name 2024-11-07 10:49:31 +01:00
Peter Pfeufer
66b97835d4 [FIX] Language selector 2024-10-22 21:20:00 +02:00
Ariel Rin
fd66a7cb20 Merge branch 'fix-mumble-chart-font-color' into 'master'
[FIX] Make chart labels better readable for darker themes

See merge request allianceauth/allianceauth!1659
2024-10-22 02:14:36 +00:00
Peter Pfeufer
c0f0f8db73 [FIX] Make chart labels better readable for darker themes 2024-10-21 05:35:22 +02:00
Joel Falknau
4210b2eabc Version Bump 4.4.0 2024-10-21 13:00:43 +10:00
Ariel Rin
225e68647e Merge branch 'add-missing-mumble-migration' into 'master'
[ADD] Missing Mumble migration

See merge request allianceauth/allianceauth!1655
2024-10-18 02:37:50 +00:00
Ariel Rin
7e2f864ebf Merge branch 'optimer-fix' into 'master'
Fix maximum character limit for duration in the optimer form

See merge request allianceauth/allianceauth!1656
2024-10-18 02:37:19 +00:00
Ariel Rin
f2384ba45b Merge branch 'master' into 'master'
Use https where applicable

See merge request allianceauth/allianceauth!1657
2024-10-18 02:29:33 +00:00
salartarium
c5918b9b3c Use https where applicable 2024-10-18 02:29:33 +00:00
Aaron Kable
ffedc4103d fix max chars on duration 2024-10-14 19:22:46 +08:00
Peter Pfeufer
0467b23a1a [ADD] Missing Mumble migration
Running migrations:
  No migrations to apply.
  Your models in app(s): 'mumble' have changes that are not yet reflected in a migration, and so won't be applied.
  Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.
2024-10-07 15:42:51 +02:00
Ariel Rin
cda5ce739f Merge branch 'mumbleconnectionhistory' into 'master'
Mumble Connection History Page

See merge request allianceauth/allianceauth!1648
2024-10-04 12:12:17 +00:00
Ariel Rin
e5c8426ea3 Merge branch 'fixing-bs3-side-menu' into 'master'
[REMOVE] Duplicate menu item

See merge request allianceauth/allianceauth!1654
2024-10-04 12:07:22 +00:00
Ariel Rin
b2bd489ddc Merge branch 'translations_7f31a07ccd4e4a66b1dd7b6bc2dbddb5' into 'master'
Updates for project Alliance Auth

See merge request allianceauth/allianceauth!1653
2024-10-04 12:06:53 +00:00
Ariel Rin
6397cf358a Updates for project Alliance Auth 2024-10-04 12:06:53 +00:00
Ariel Rin
90fcc4a811 Merge branch 'master' into 'master'
Add an example to the notification documentation

See merge request allianceauth/allianceauth!1652
2024-10-04 12:05:17 +00:00
Ariel Rin
ec7472fe22 Merge branch 'bootstrap-dark-fixes' into 'master'
[FIX] Re-add the dark bootstrap html tag

See merge request allianceauth/allianceauth!1651
2024-10-04 12:03:25 +00:00
Peter Pfeufer
5148b1914d [REMOVE] Duplicate menu item 2024-10-04 13:56:57 +02:00
Ariel Rin
2e0716f5ae Merge branch 'mumbleconnectionhistory-improvements' into 'mumbleconnectionhistory'
[CHANGE] Some improvements

See merge request soratidus999/allianceauth!12
2024-09-23 23:33:01 +00:00
Peter Pfeufer
1fb091acb2 [CHANGE] Some improvements
- Fixed Bootstraps cards, rows and cols
- Replaced style argument with Bootstrap class
- Removed unused Django templatetag
- JS modernized and moved to its own script tag instead of concatenating it with other more or less "global" scripts
- Fixed Bootstrap classes
2024-09-23 15:09:35 +02:00
r0kym
07c62ed32a Add an example to the notification documentation 2024-09-23 13:15:19 +02:00
Aaron Kable
660fe79d08 re-add the dark bootstrap html tag 2024-09-17 21:24:01 +08:00
Joel Falknau
42ee06470c Version Bump 4.3.1 2024-09-13 20:22:31 +10:00
Joel Falknau
69aaa9652f compilemessages 2024-09-13 20:09:46 +10:00
Ariel Rin
1ccfff50e5 Merge branch 'translations_7f31a07ccd4e4a66b1dd7b6bc2dbddb5' into 'master'
Updates for project Alliance Auth

See merge request allianceauth/allianceauth!1649
2024-09-13 10:09:10 +00:00
Ariel Rin
57a39557fd Updates for project Alliance Auth 2024-09-13 10:09:09 +00:00
Joel Falknau
c36dea08e3 compilemessages 2024-09-13 20:01:33 +10:00
Joel Falknau
d3acd821b7 remove excess translations 2024-09-13 20:01:20 +10:00
Joel Falknau
0a17427169 update language codes 2024-09-13 19:59:40 +10:00
Ariel Rin
ce8935e621 Merge branch 'translations_7f31a07ccd4e4a66b1dd7b6bc2dbddb5' into 'master'
Updates for project Alliance Auth

See merge request allianceauth/allianceauth!1647
2024-09-13 08:55:07 +00:00
Ariel Rin
efff946a56 Updates for project Alliance Auth 2024-09-13 08:55:07 +00:00
Joel Falknau
1dea92ed76 add Connection History 2024-09-12 15:54:14 +10:00
Joel Falknau
3f54d49d8b update help text from mumble definition 2024-09-12 15:54:06 +10:00
Joel Falknau
77da6928b2 add Chart.js 4.4.1 to Bundles 2024-09-12 15:53:53 +10:00
Joel Falknau
bd17b95cac Version Bump 4.3.0 2024-09-09 14:05:58 +10:00
Joel Falknau
4ed1c5b7c4 bring test celery in line with project 2024-09-09 13:59:43 +10:00
Ariel Rin
271fd8e8c4 Merge branch 'docs-user-creation-fix' into 'master'
[Docs] Add shell option to adduser command for Ubuntu install docs

See merge request allianceauth/allianceauth!1622
2024-09-09 03:58:47 +00:00
colcrunch
9b4321281a [Docs] Add shell option to adduser command for Ubuntu install docs 2024-09-09 03:58:47 +00:00
Ariel Rin
052c35c8e5 Merge branch 'metenox' into 'master'
Timerboard Improvements

Closes #1384

See merge request allianceauth/allianceauth!1645
2024-09-09 03:57:21 +00:00
Ariel Rin
0fcb517b0b Timerboard Improvements 2024-09-09 03:57:21 +00:00
Ariel Rin
dcfddf0add Merge branch 'docs2' into 'master'
Documentation

See merge request allianceauth/allianceauth!1646
2024-09-09 03:43:30 +00:00
Joel Falknau
4a4258d0e6 use docker command inside docker 2024-09-09 13:32:18 +10:00
Joel Falknau
dd15a221aa split repo from install 2024-09-09 13:32:06 +10:00
Joel Falknau
737e02293a expand mumble service install docs 2024-09-09 12:59:49 +10:00
Joel Falknau
c34efebacf define charsets for db backed apps 2024-09-03 12:27:50 +10:00
Joel Falknau
4602097399 remove DB step from mumble install, sqlite has been reccommended for a while 2024-09-03 12:27:02 +10:00
Joel Falknau
7051e06564 update features from readme 2024-09-03 12:26:43 +10:00
Joel Falknau
9767ce79d8 cleanup some local.py references 2024-09-03 12:26:31 +10:00
Joel Falknau
0c090f1486 Ubuntu 2004 should not be reccommended for new isntalls 2024-09-03 12:25:01 +10:00
Joel Falknau
618ee81f9b remove unneeded analytics docs for removed features 2024-09-03 12:24:37 +10:00
Joel Falknau
98efb9f887 split maintenance tasks into bare metal / docker 2024-09-03 12:24:17 +10:00
Ariel Rin
cbe6c821cc Merge branch 'custom-css' into 'master'
[ADD] Custom CSS Module

See merge request allianceauth/allianceauth!1643
2024-08-21 05:01:38 +00:00
Ariel Rin
de9d2b39a6 Merge branch 'theme-html-tags' into 'master'
[ADD] Theme html tags

See merge request allianceauth/allianceauth!1642
2024-08-21 04:59:18 +00:00
Peter Pfeufer
0d5f22288b Merge branch 'switch-to-django-solo' into custom-css 2024-08-20 14:41:52 +02:00
Peter Pfeufer
e0d76dc268 [CHANGE] Switch to Django Solo 2024-08-20 14:41:43 +02:00
Peter Pfeufer
ecc9e68330 [CHANGE] Consolidate migrations 2024-08-14 13:25:49 +02:00
Peter Pfeufer
710149ec21 [FIX] Check if the CustomCSS object exists 2024-08-14 13:22:23 +02:00
Peter Pfeufer
3c2c137dad [CHANGE] improve try block in template tag 2024-08-14 13:05:32 +02:00
Peter Pfeufer
a8271c4189 [CHANGE] Remove custom CSS file when it will be empty 2024-08-14 12:58:01 +02:00
Peter Pfeufer
3315ae7778 [ADD] Module to base settings file 2024-08-14 12:47:38 +02:00
Peter Pfeufer
d2f048f8fe [ADD Example template for admin overrides
For when we might want to add syntax highlight ti it, which is a completely different can of worms though.
2024-08-14 12:45:57 +02:00
Peter Pfeufer
0fe2855faa [ADD] Custom CSS to base file
Check if the CSS file exists and add it to the HTML output
2024-08-14 12:44:51 +02:00
Peter Pfeufer
79a1fa3d7c [ADD] CSS compression on save 2024-08-14 12:42:52 +02:00
Peter Pfeufer
96fe88d5c7 [REMOVE] highlight.js and leave it as an example in the widget code 2024-08-14 11:53:02 +02:00
Peter Pfeufer
59391ad3c5 [ADD] Custom CSS module (First steps) 2024-08-11 22:34:16 +02:00
Peter Pfeufer
94e9c08422 [ADD] Theme html tags 2024-08-08 10:22:14 +02:00
Joel Falknau
acff3695bc Version Bump 4.2.2 2024-08-06 12:43:06 +10:00
Ariel Rin
43ec8514aa Merge branch 'improve-redis-installation-on-ubuntu' into 'master'
[MISC] Improve Redis installation instructions for Ubuntu

See merge request allianceauth/allianceauth!1641
2024-08-05 01:26:07 +00:00
Peter Pfeufer
4c629b193f [CHANGE] Redis hint link 2024-08-05 03:21:14 +02:00
Peter Pfeufer
c651da4011 [MISC] Improve Redis installation instructions for Ubuntu 2024-08-05 03:12:24 +02:00
Ariel Rin
da382cffd1 Merge branch 'fix-mumble-url' into 'master'
[FIX] Mumble URL in service card

See merge request allianceauth/allianceauth!1637
2024-08-05 01:04:24 +00:00
Ariel Rin
4ecfc3afd8 Merge branch 'docs-docker-headlines' into 'master'
[CHANGE] Clarify that these instructions are for Docker

See merge request allianceauth/allianceauth!1638
2024-08-05 01:02:57 +00:00
Ariel Rin
4eb7dbbe62 Merge branch 'add-margin' into 'master'
[ADD] A bit margin to the notifications

See merge request allianceauth/allianceauth!1639
2024-08-05 01:02:52 +00:00
Ariel Rin
c96ba65296 Merge branch 'avoid-KeyError-in-checks' into 'master'
[FIX] Avoid `KeyError` in `celery_settings` checks

See merge request allianceauth/allianceauth!1640
2024-08-05 01:02:40 +00:00
Peter Pfeufer
ff2f60f7f3 [FIX] Avoid KeyError in celery_settings checks 2024-08-04 18:29:43 +02:00
Peter Pfeufer
3000545c98 [ADD] A bit margin to the notifications 2024-07-26 23:09:15 +02:00
Peter Pfeufer
f3ad092ef2 [CHANGNE] Clarify that these instructions are for Docker
This should also fix the menu item title, hopefully …
2024-07-19 19:13:48 +02:00
Peter Pfeufer
a012e7df2f [FIX] Mumble URL in service card 2024-07-19 17:33:32 +02:00
Ariel Rin
1fa77412c0 Merge branch 'fix/missing-celery-setting' into 'master'
fix missing setting in celery

See merge request allianceauth/allianceauth!1636
2024-07-15 13:39:28 +00:00
Matteo Ghia
e56caeb22b fix missing setting in celery 2024-07-15 14:53:45 +02:00
Joel Falknau
ceb07ebc67 Version Bump 4.2.1 2024-07-15 22:20:32 +10:00
Ariel Rin
237075d45c Merge branch 'checklib' into 'master'
More Detail on the SQL charset check

See merge request allianceauth/allianceauth!1635
2024-07-15 12:18:47 +00:00
Ariel Rin
7099b1946d More Detail on the SQL charset check 2024-07-15 12:18:47 +00:00
134 changed files with 9413 additions and 3210 deletions

View File

@@ -72,7 +72,8 @@ repos:
allianceauth\/static\/allianceauth\/css\/themes\/bootstrap-locals.less|
\.po|
\.mo|
swagger\.json
swagger\.json|
\.ice
)
- repo: https://github.com/igorshubovych/markdownlint-cli
rev: v0.41.0

View File

@@ -5,7 +5,7 @@
[![django](https://img.shields.io/pypi/djversions/allianceauth?label=django)](https://pypi.org/project/allianceauth/)
[![version](https://img.shields.io/pypi/v/allianceauth?label=release)](https://pypi.org/project/allianceauth/)
[![pipeline status](https://gitlab.com/allianceauth/allianceauth/badges/master/pipeline.svg)](https://gitlab.com/allianceauth/allianceauth/commits/master)
[![Documentation Status](https://readthedocs.org/projects/allianceauth/badge/?version=latest)](http://allianceauth.readthedocs.io/?badge=latest)
[![Documentation Status](https://readthedocs.org/projects/allianceauth/badge/?version=latest)](https://allianceauth.readthedocs.io/?badge=latest)
[![coverage report](https://gitlab.com/allianceauth/allianceauth/badges/master/coverage.svg)](https://gitlab.com/allianceauth/allianceauth/commits/master)
[![Chat on Discord](https://img.shields.io/discord/399006117012832262.svg)](https://discord.gg/fjnHAmk)
@@ -14,7 +14,7 @@ An auth system for EVE Online to help in-game organizations manage online servic
## Content
- [Overview](#overview)
- [Documentation](http://allianceauth.rtfd.io)
- [Documentation](https://allianceauth.rtfd.io)
- [Support](#support)
- [Release Notes](https://gitlab.com/allianceauth/allianceauth/-/releases)
- [Developer Team](#development-team)
@@ -38,7 +38,7 @@ Main features:
- English :flag_gb:, Chinese :flag_cn:, German :flag_de:, Spanish :flag_es:, Korean :flag_kr:, Russian :flag_ru:, Italian :flag_it:, French :flag_fr:, Japanese :flag_jp: and Ukrainian :flag_ua: Localization
For further details about AA - including an installation guide and a full list of included services and plugin apps - please see the [official documentation](http://allianceauth.rtfd.io).
For further details about AA - including an installation guide and a full list of included services and plugin apps - please see the [official documentation](https://allianceauth.rtfd.io).
## Screenshot

View File

@@ -5,7 +5,7 @@ manage online service access.
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
__version__ = '4.2.0'
__version__ = '4.4.2'
__title__ = 'Alliance Auth'
__url__ = 'https://gitlab.com/allianceauth/allianceauth'
NAME = f'{__title__} v{__version__}'

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2 on 2024-09-13 09:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('authentication', '0023_alter_userprofile_language'),
]
operations = [
migrations.AlterField(
model_name='userprofile',
name='language',
field=models.CharField(blank=True, choices=[('en', 'English'), ('cs-cz', 'Czech'), ('de', 'German'), ('es', 'Spanish'), ('it-it', 'Italian'), ('ja', 'Japanese'), ('ko-kr', 'Korean'), ('fr-fr', 'French'), ('ru', 'Russian'), ('nl-nl', 'Dutch'), ('pl-pl', 'Polish'), ('uk', 'Ukrainian'), ('zh-hans', 'Simplified Chinese')], default='', max_length=10, verbose_name='Language'),
),
]

View File

@@ -67,18 +67,20 @@ class UserProfile(models.Model):
"""
Choices for UserProfile.language
"""
# Sorted by Language Code alphabetical order + English at top
ENGLISH = 'en', _('English')
CZECH = 'cs-cz', _("Czech") # Not yet at 50% translated
GERMAN = 'de', _('German')
SPANISH = 'es', _('Spanish')
CHINESE = 'zh-hans', _('Chinese Simplified')
RUSSIAN = 'ru', _('Russian')
KOREAN = 'ko', _('Korean')
FRENCH = 'fr', _('French')
ITALIAN = 'it-it', _('Italian')
JAPANESE = 'ja', _('Japanese')
ITALIAN = 'it', _('Italian')
KOREAN = 'ko-kr', _('Korean')
FRENCH = 'fr-fr', _('French')
RUSSIAN = 'ru', _('Russian')
DUTCH = 'nl-nl', _("Dutch")
POLISH = 'pl-pl', _("Polish")
UKRAINIAN = 'uk', _('Ukrainian')
POLISH = 'pl', _("Polish")
CHINESE = 'zh-hans', _('Simplified Chinese')
user = models.OneToOneField(
User,

View File

@@ -5,11 +5,11 @@
{% csrf_token %}
<select class="form-select" onchange="this.form.submit()" class="form-control" id="lang-select" name="language">
{% get_language_info_list for LANGUAGES as languages %}
{% get_available_languages as LANGUAGES %}
{% for language in languages %}
<option lang="{{ language.code }}" value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}>
{{ language.name_local|capfirst }} ({{ language.code }})
{% for lang_code, lang_name in LANGUAGES %}
<option lang="{{ lang_code }}" value="{{ lang_code }}"{% if lang_code == LANGUAGE_CODE %} selected{% endif %}>
{{ lang_code|language_name_local|capfirst }} ({{ lang_code }})
</option>
{% endfor %}
</select>

View File

@@ -42,13 +42,13 @@ def system_package_redis(app_configs, **kwargs) -> List[CheckMessage]:
return errors
if redis_version.major == 7 and redis_version.minor == 2 and timezone.now() > timezone.datetime(year=2025, month=8, day=31, tzinfo=timezone.utc):
errors.append(Error(f"Redis {redis_version.public} in Security Support only, Updating Suggested", hint="https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/", id="allianceauth.checks.A001"))
errors.append(Error(f"Redis {redis_version.public} in Security Support only, Updating Suggested", hint="https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html#redis-and-other-tools", id="allianceauth.checks.A001"))
elif redis_version.major == 7 and redis_version.minor == 0:
errors.append(Warning(f"Redis {redis_version.public} in Security Support only, Updating Suggested", hint="https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/", id="allianceauth.checks.A002"))
errors.append(Warning(f"Redis {redis_version.public} in Security Support only, Updating Suggested", hint="https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html#redis-and-other-tools", id="allianceauth.checks.A002"))
elif redis_version.major == 6 and redis_version.minor == 2:
errors.append(Warning(f"Redis {redis_version.public} in Security Support only, Updating Suggested", hint="https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/", id="allianceauth.checks.A018"))
errors.append(Warning(f"Redis {redis_version.public} in Security Support only, Updating Suggested", hint="https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html#redis-and-other-tools", id="allianceauth.checks.A018"))
elif redis_version.major in [6, 5]:
errors.append(Error(f"Redis {redis_version.public} EOL", hint="https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/", id="allianceauth.checks.A003"))
errors.append(Error(f"Redis {redis_version.public} EOL", hint="https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html#redis-and-other-tools", id="allianceauth.checks.A003"))
return errors
@@ -140,11 +140,19 @@ def sql_settings(app_configs, **kwargs) -> List[CheckMessage]:
errors: List[CheckMessage] = []
for connection in db.connections.all():
if connection.vendor == "mysql":
if connection.settings_dict["OPTIONS"]["charset"] != "utf8mb4":
errors.append(Error("SQL Charset is not set correctly", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/89be2456fb2d741b86417e889da9b6129525bec8", id="allianceauth.checks.B001"))
try:
if connection.settings_dict["OPTIONS"]["charset"] != "utf8mb4":
errors.append(Error(f"SQL Charset is not set to utf8mb4 DB:{connection.alias}", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/89be2456fb2d741b86417e889da9b6129525bec8", id="allianceauth.checks.B001"))
except KeyError:
errors.append(Error(f"SQL Charset is not set to utf8mb4 DB:{connection.alias}", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/89be2456fb2d741b86417e889da9b6129525bec8", id="allianceauth.checks.B001"))
# This hasn't actually been set on AA yet
# if connection.settings_dict["OPTIONS"]["charset"] != "utf8mb4_unicode_ci":
# errors.append(Error("SQL Collation is not set correctly", hint="", id="allianceauth.checks.B002"))
# try:
# if connection.settings_dict["OPTIONS"]["collation"] != "utf8mb4_unicode_ci":
# errors.append(Error(f"SQL Collation is not set to utf8mb4_unicode_ci DB:{connection.alias}", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/89be2456fb2d741b86417e889da9b6129525bec8", id="allianceauth.checks.B001"))
# except KeyError:
# errors.append(Error(f"SQL Collation is not set to utf8mb4_unicode_ci DB:{connection.alias}", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/89be2456fb2d741b86417e889da9b6129525bec8", id="allianceauth.checks.B001"))
# if connection.vendor == "sqlite":
return errors
@@ -153,11 +161,19 @@ def sql_settings(app_configs, **kwargs) -> List[CheckMessage]:
@register()
def celery_settings(app_configs, **kwargs) -> List[CheckMessage]:
errors: List[CheckMessage] = []
if current_app.conf.broker_transport_options != {'priority_steps': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 'queue_order_strategy': 'priority'}:
errors.append(Error("Celery Priorities are not set correctly", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/8861ec0a61790eca0261f1adc1cc04ca5f243cbc", id="allianceauth.checks.B003"))
if current_app.conf.broker_connection_retry_on_startup != True:
errors.append(Error("Celery broker_connection_retry_on_startup not set correctly", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/380c41400b535447839e5552df2410af35a75280", id="allianceauth.checks.B004"))
try:
if current_app.conf.broker_transport_options != {'priority_steps': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 'queue_order_strategy': 'priority'}:
errors.append(Error("Celery Priorities are not set correctly", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/8861ec0a61790eca0261f1adc1cc04ca5f243cbc", id="allianceauth.checks.B003"))
except KeyError:
errors.append(Error("Celery Priorities are not set", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/8861ec0a61790eca0261f1adc1cc04ca5f243cbc", id="allianceauth.checks.B003"))
try:
if current_app.conf.broker_connection_retry_on_startup != True:
errors.append(Error("Celery broker_connection_retry_on_startup not set correctly", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/380c41400b535447839e5552df2410af35a75280", id="allianceauth.checks.B004"))
except KeyError:
errors.append(Error("Celery broker_connection_retry_on_startup not set", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/380c41400b535447839e5552df2410af35a75280", id="allianceauth.checks.B004"))
return errors

View File

@@ -0,0 +1,3 @@
"""
Initializes the custom_css module.
"""

View File

@@ -0,0 +1,25 @@
"""
Admin classes for custom_css app
"""
# Django
from django.contrib import admin
# Django Solos
from solo.admin import SingletonModelAdmin
# Alliance Auth Custom CSS
from allianceauth.custom_css.models import CustomCSS
from allianceauth.custom_css.forms import CustomCSSAdminForm
@admin.register(CustomCSS)
class CustomCSSAdmin(SingletonModelAdmin):
"""
Custom CSS Admin
"""
form = CustomCSSAdminForm
# Leave this here for when we decide to add syntax highlighting to the CSS editor
# change_form_template = 'custom_css/admin/change_form.html'

View File

@@ -0,0 +1,13 @@
"""
Django app configuration for custom_css
"""
# Django
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class CustomCSSConfig(AppConfig):
name = "allianceauth.custom_css"
label = "custom_css"
verbose_name = _("Custom CSS")

View File

@@ -0,0 +1,29 @@
"""
Forms for custom_css app
"""
# Alliance Auth Custom CSS
from allianceauth.custom_css.models import CustomCSS
from allianceauth.custom_css.widgets import CssEditorWidget
# Django
from django import forms
class CustomCSSAdminForm(forms.ModelForm):
"""
Form for editing custom CSS
"""
class Meta:
model = CustomCSS
fields = ("css",)
widgets = {
"css": CssEditorWidget(
attrs={
"style": "width: 90%; height: 100%;",
"data-editor": "code-highlight",
"data-language": "css",
}
)
}

View File

@@ -0,0 +1,42 @@
# Generated by Django 4.2.15 on 2024-08-14 11:25
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name="CustomCSS",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"css",
models.TextField(
blank=True,
help_text="This CSS will be added to the site after the default CSS.",
null=True,
verbose_name="Your custom CSS",
),
),
("timestamp", models.DateTimeField(auto_now=True)),
],
options={
"verbose_name": "Custom CSS",
"verbose_name_plural": "Custom CSS",
"default_permissions": (),
},
),
]

View File

@@ -0,0 +1,143 @@
"""
Models for the custom_css app
"""
import os
import re
# Django Solo
from solo.models import SingletonModel
# Django
from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _
class CustomCSS(SingletonModel):
"""
Model for storing custom CSS for the site
"""
css = models.TextField(
blank=True,
null=True,
verbose_name=_("Your custom CSS"),
help_text=_("This CSS will be added to the site after the default CSS."),
)
timestamp = models.DateTimeField(auto_now=True)
class Meta:
"""
Meta for CustomCSS
"""
default_permissions = ()
verbose_name = _("Custom CSS")
verbose_name_plural = _("Custom CSS")
def __str__(self) -> str:
"""
String representation of CustomCSS
:return:
:rtype:
"""
return str(_("Custom CSS"))
def save(self, *args, **kwargs):
"""
Save method for CustomCSS
:param args:
:type args:
:param kwargs:
:type kwargs:
:return:
:rtype:
"""
self.pk = 1
if self.css and len(self.css.replace(" ", "")) > 0:
# Write the custom CSS to a file
custom_css_file = open(
f"{settings.STATIC_ROOT}allianceauth/custom-styles.css", "w+"
)
custom_css_file.write(self.compress_css())
custom_css_file.close()
else:
# Remove the custom CSS file
try:
os.remove(f"{settings.STATIC_ROOT}allianceauth/custom-styles.css")
except FileNotFoundError:
pass
super().save(*args, **kwargs)
def compress_css(self) -> str:
"""
Compress CSS
:return:
:rtype:
"""
css = self.css
new_css = ""
# Remove comments
css = re.sub(pattern=r"\s*/\*\s*\*/", repl="$$HACK1$$", string=css)
css = re.sub(pattern=r"/\*[\s\S]*?\*/", repl="", string=css)
css = css.replace("$$HACK1$$", "/**/")
# url() doesn't need quotes
css = re.sub(pattern=r'url\((["\'])([^)]*)\1\)', repl=r"url(\2)", string=css)
# Spaces may be safely collapsed as generated content will collapse them anyway.
css = re.sub(pattern=r"\s+", repl=" ", string=css)
# Shorten collapsable colors: #aabbcc to #abc
css = re.sub(
pattern=r"#([0-9a-f])\1([0-9a-f])\2([0-9a-f])\3(\s|;)",
repl=r"#\1\2\3\4",
string=css,
)
# Fragment values can loose zeros
css = re.sub(
pattern=r":\s*0(\.\d+([cm]m|e[mx]|in|p[ctx]))\s*;", repl=r":\1;", string=css
)
for rule in re.findall(pattern=r"([^{]+){([^}]*)}", string=css):
# We don't need spaces around operators
selectors = [
re.sub(
pattern=r"(?<=[\[\(>+=])\s+|\s+(?=[=~^$*|>+\]\)])",
repl=r"",
string=selector.strip(),
)
for selector in rule[0].split(",")
]
# Order is important, but we still want to discard repetitions
properties = {}
porder = []
for prop in re.findall(pattern="(.*?):(.*?)(;|$)", string=rule[1]):
key = prop[0].strip().lower()
if key not in porder:
porder.append(key)
properties[key] = prop[1].strip()
# output rule if it contains any declarations
if properties:
new_css += "{}{{{}}}".format(
",".join(selectors),
"".join([f"{key}:{properties[key]};" for key in porder])[:-1],
)
return new_css

View File

@@ -0,0 +1,48 @@
{% extends "admin/change_form.html" %}
{% block field_sets %}
{% for fieldset in adminform %}
<fieldset class="module aligned {{ fieldset.classes }}">
{% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %}
{% if fieldset.description %}
<div class="description">{{ fieldset.description|safe }}</div>
{% endif %}
{% for line in fieldset %}
<div class="form-row{% if line.fields|length == 1 and line.errors %} errors{% endif %}{% if not line.has_visible_field %} hidden{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}">
{% if line.fields|length == 1 %}{{ line.errors }}{% else %}<div class="flex-container form-multiline">{% endif %}
{% for field in line %}
<div>
{% if not line.fields|length == 1 and not field.is_readonly %}{{ field.errors }}{% endif %}
<div class="flex-container{% if not line.fields|length == 1 %} fieldBox{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}{% if field.field.is_hidden %} hidden{% endif %}{% elif field.is_checkbox %} checkbox-row{% endif %}">
{% if field.is_checkbox %}
{{ field.field }}{{ field.label_tag }}
{% else %}
{{ field.label_tag }}
{% if field.is_readonly %}
<div class="readonly">{{ field.contents }}</div>
{% else %}
{{ field.field }}
{% endif %}
{% endif %}
</div>
{% if field.field.help_text %}
<div class="help"{% if field.field.id_for_label %} id="{{ field.field.id_for_label }}_helptext"{% endif %}>
<div>{{ field.field.help_text|safe }}</div>
</div>
{% endif %}
</div>
{% endfor %}
{% if not line.fields|length == 1 %}</div>{% endif %}
</div>
{% endfor %}
</fieldset>
{% endfor %}
{% endblock %}
{% block after_field_sets %}{% endblock %}

View File

@@ -0,0 +1,3 @@
{% load custom_css %}
{% custom_css_static 'allianceauth/custom-styles.css' %}

View File

@@ -0,0 +1,3 @@
"""
Init file for custom_css templatetags
"""

View File

@@ -0,0 +1,48 @@
"""
Custom template tags for custom_css app
"""
# Alliance Auth Custom CSS
from allianceauth.custom_css.models import CustomCSS
# Django
from django.conf import settings
from django.template.defaulttags import register
from django.templatetags.static import static
from django.utils.safestring import mark_safe
from pathlib import Path
@register.simple_tag
def custom_css_static(path: str) -> str:
"""
Versioned static URL
This is to make sure to break the browser cache on CSS updates.
Example: /static/allianceauth/custom-styles.css?v=1234567890
:param path:
:type path:
:return:
:rtype:
"""
try:
Path(f"{settings.STATIC_ROOT}{path}").resolve(strict=True)
except FileNotFoundError:
return ""
else:
try:
custom_css = CustomCSS.objects.get(pk=1)
except CustomCSS.DoesNotExist:
return ""
else:
custom_css_changed = custom_css.timestamp.timestamp()
custom_css_version = (
str(custom_css_changed).replace(" ", "").replace(":", "").replace("-", "")
) # remove spaces, colons, and dashes
static_url = static(path)
versioned_url = static_url + "?v=" + custom_css_version
return mark_safe(f'<link rel="stylesheet" href="{versioned_url}">')

View File

@@ -0,0 +1,38 @@
"""
Form widgets for custom_css app
"""
# Django
from django import forms
# Alliance Auth
from allianceauth.custom_css.models import CustomCSS
class CssEditorWidget(forms.Textarea):
"""
Widget for editing CSS
"""
def __init__(self, attrs=None):
default_attrs = {"class": "custom-css-editor"}
if attrs:
default_attrs.update(attrs)
super().__init__(default_attrs)
# For when we want to add some sort of syntax highlight to it, which is not that
# easy to do on a textarea field though.
# `highlight.js` is just used as an example here, and doesn't work on a textarea field.
# class Media:
# css = {
# "all": (
# "/static/custom_css/libs/highlight.js/11.10.0/styles/github.min.css",
# )
# }
# js = (
# "/static/custom_css/libs/highlight.js/11.10.0/highlight.min.js",
# "/static/custom_css/libs/highlight.js/11.10.0/languages/css.min.js",
# "/static/custom_css/javascript/custom-css.min.js",
# )

View File

@@ -10,7 +10,7 @@ from . import (
)
_BASE_URL = 'http://evemaps.dotlan.net'
_BASE_URL = 'https://evemaps.dotlan.net'
def _build_url(category: str, name: str) -> str:

View File

@@ -31,29 +31,29 @@ class TestDotlan(TestCase):
def test_alliance_url(self):
self.assertEqual(
dotlan.alliance_url('Wayne Enterprices'),
'http://evemaps.dotlan.net/alliance/Wayne_Enterprices'
'https://evemaps.dotlan.net/alliance/Wayne_Enterprices'
)
def test_corporation_url(self):
self.assertEqual(
dotlan.corporation_url('Wayne Technology'),
'http://evemaps.dotlan.net/corp/Wayne_Technology'
'https://evemaps.dotlan.net/corp/Wayne_Technology'
)
self.assertEqual(
dotlan.corporation_url('Crédit Agricole'),
'http://evemaps.dotlan.net/corp/Cr%C3%A9dit_Agricole'
'https://evemaps.dotlan.net/corp/Cr%C3%A9dit_Agricole'
)
def test_region_url(self):
self.assertEqual(
dotlan.region_url('Black Rise'),
'http://evemaps.dotlan.net/map/Black_Rise'
'https://evemaps.dotlan.net/map/Black_Rise'
)
def test_solar_system_url(self):
self.assertEqual(
dotlan.solar_system_url('Jita'),
'http://evemaps.dotlan.net/system/Jita'
'https://evemaps.dotlan.net/system/Jita'
)

View File

@@ -13,6 +13,15 @@
}
}
/* Image overflow fix
------------------------------------------------------------------------------------- */
@media all {
img {
max-width: 100%;
height: auto;
}
}
/* Side Navigation
------------------------------------------------------------------------------------- */
@media all {

View File

@@ -49,7 +49,7 @@ class GroupsMenuItem(MenuItemHook):
MenuItemHook.__init__(
self,
text=_("Groups"),
classes="fa-solid fa-user",
classes="fa-solid fa-users",
url_name="groupmanagement:groups",
order=25,
navactive=[

Binary file not shown.

View File

@@ -11,14 +11,14 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-12 19:15+1000\n"
"POT-Creation-Date: 2024-09-13 19:57+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Tomas Skarecky <t.skarecky@gmail.com>, 2024\n"
"Language-Team: Czech (https://app.transifex.com/alliance-auth/teams/107430/cs/)\n"
"Language-Team: Czech (Czech Republic) (https://app.transifex.com/alliance-auth/teams/107430/cs_CZ/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: cs\n"
"Language: cs_CZ\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
#: allianceauth/analytics/models.py:26
@@ -54,66 +54,90 @@ msgstr ""
"přístupem:%s"
#: allianceauth/authentication/models.py:71
#: allianceauth/project_template/project_name/settings/base.py:99
msgid "English"
msgstr "Angličtina"
#: allianceauth/authentication/models.py:72
msgid "Czech"
msgstr ""
#: allianceauth/authentication/models.py:73
#: allianceauth/project_template/project_name/settings/base.py:101
msgid "German"
msgstr "Němčina"
#: allianceauth/authentication/models.py:73
#: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:102
msgid "Spanish"
msgstr "Španělština"
#: allianceauth/authentication/models.py:74
msgid "Chinese Simplified"
msgstr "Zjednodušená čínština"
#: allianceauth/authentication/models.py:75
msgid "Russian"
msgstr "Ruština"
#: allianceauth/authentication/models.py:76
msgid "Korean"
msgstr "Korejština"
#: allianceauth/authentication/models.py:77
msgid "French"
msgstr "Francouzština"
#: allianceauth/authentication/models.py:78
msgid "Japanese"
msgstr "Japonština"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:103
msgid "Italian"
msgstr "Italština"
#: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:104
msgid "Japanese"
msgstr "Japonština"
#: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:105
msgid "Korean"
msgstr "Korejština"
#: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:106
msgid "French"
msgstr "Francouzština"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:109
msgid "Russian"
msgstr "Ruština"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:107
msgid "Dutch"
msgstr ""
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:108
msgid "Polish"
msgstr ""
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:110
msgid "Ukrainian"
msgstr "Ukrajinština"
#: allianceauth/authentication/models.py:96
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:111
msgid "Simplified Chinese"
msgstr ""
#: allianceauth/authentication/models.py:99
#: allianceauth/menu/templates/menu/menu-user.html:42
msgid "Language"
msgstr "Jazyk"
#: allianceauth/authentication/models.py:101
#: allianceauth/authentication/models.py:104
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr "Noční režim"
#: allianceauth/authentication/models.py:105
#: allianceauth/authentication/models.py:108
#: allianceauth/menu/templates/menu/menu-user.html:46
msgid "Theme"
msgstr "Motiv"
#: allianceauth/authentication/models.py:122
#: allianceauth/authentication/models.py:125
#, python-format
msgid "State changed to: %s"
msgstr "Status změněn na: %s"
#: allianceauth/authentication/models.py:123
#: allianceauth/authentication/models.py:126
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr "Váš uživatelský status je nyní: %(state)s"
@@ -125,27 +149,27 @@ msgstr "Váš uživatelský status je nyní: %(state)s"
msgid "Dashboard"
msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:7
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:5
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:33
#: allianceauth/hrapplications/templates/hrapplications/view.html:54
msgid "Characters"
msgstr "Postavy"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:13
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:11
#: 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:6
msgid "Add Character"
msgstr "Přidat postavu"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:16
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:17
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: 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:12
msgid "Change Main"
msgstr "Změnit postavu"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:89
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:23
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:31
@@ -154,12 +178,12 @@ msgstr "Změnit postavu"
msgid "Name"
msgstr "Jméno"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:25
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:23
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:33
msgid "Corp"
msgstr "Korporace"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:26
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/corputils/templates/corputils/corpstats.html:125
#: allianceauth/hrapplications/templates/hrapplications/view.html:63
msgid "Alliance"
@@ -169,7 +193,7 @@ msgstr "Aliance"
msgid "Membership"
msgstr "Členství"
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:8
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:10
msgid "State:"
msgstr "Stav:"
@@ -409,6 +433,19 @@ msgstr "Vybraná korporace již má statistický modul"
msgid "Failed to gather corporation statistics with selected token."
msgstr "Nepodařilo se získat statistiky korporace pomocí vybraného tokenu."
#: allianceauth/custom_css/apps.py:13 allianceauth/custom_css/models.py:36
#: allianceauth/custom_css/models.py:37 allianceauth/custom_css/models.py:47
msgid "Custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:25
msgid "Your custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:26
msgid "This CSS will be added to the site after the default CSS."
msgstr ""
#: allianceauth/fleetactivitytracking/auth_hooks.py:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkcreate.html:11
@@ -501,8 +538,8 @@ msgstr "Uživatel"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:37
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:42
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:59
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:37
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/timertable.html:9
msgid "System"
msgstr "Systém"
@@ -826,7 +863,7 @@ msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
msgid "Type"
msgstr ""
@@ -918,7 +955,7 @@ msgid "Hidden"
msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:19
#: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Open"
msgstr ""
@@ -1394,16 +1431,16 @@ msgstr ""
msgid "Super User"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:68
#: allianceauth/menu/templates/menu/menu-user.html:70
#: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:80
#: allianceauth/menu/templates/menu/menu-user.html:82
msgid "Sign Out"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:84
#: allianceauth/menu/templates/menu/menu-user.html:86
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18
msgid "Sign In"
@@ -1553,7 +1590,7 @@ msgid "Form Up System"
msgstr ""
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18
msgid "EVE Time"
msgstr ""
@@ -1748,17 +1785,17 @@ msgid ""
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:20
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:22
msgid "Activate"
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:34
msgid "Reset Password"
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:40
msgid "Deactivate"
msgstr ""
@@ -1839,12 +1876,12 @@ msgstr ""
msgid "Deactivated IPSuite4 account."
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28
#: allianceauth/services/templates/services/service_password.html:26
msgid "Set Password"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:44
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:46
msgid "Connect"
msgstr ""
@@ -2407,56 +2444,56 @@ msgstr ""
msgid "Your Server received an ESI error response code of "
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:11
#: allianceauth/templates/allianceauth/admin-status/overview.html:8
msgid "Alliance Auth Notifications"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:21
#: allianceauth/templates/allianceauth/admin-status/overview.html:18
msgid "Closed"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:27
#: allianceauth/templates/allianceauth/admin-status/overview.html:24
msgid "No notifications at this time"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:36
#: allianceauth/templates/allianceauth/admin-status/overview.html:33
msgid "Powered by GitLab"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:42
#: allianceauth/templates/allianceauth/admin-status/overview.html:39
msgid "Support Discord"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:59
#: allianceauth/templates/allianceauth/admin-status/overview.html:63
#: allianceauth/templates/allianceauth/admin-status/overview.html:53
#: allianceauth/templates/allianceauth/admin-status/overview.html:57
msgid "Software Version"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:66
#: allianceauth/templates/allianceauth/admin-status/overview.html:60
msgid "Current"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:73
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Latest Stable"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:78
#: allianceauth/templates/allianceauth/admin-status/overview.html:72
msgid "Update available"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:86
#: allianceauth/templates/allianceauth/admin-status/overview.html:80
msgid "Latest Pre-Release"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
#: allianceauth/templates/allianceauth/admin-status/overview.html:85
msgid "Pre-Release available"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:102
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
msgid "Task Queue"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:107
#: allianceauth/templates/allianceauth/admin-status/overview.html:100
#, python-format
msgid ""
"\n"
@@ -2464,11 +2501,11 @@ msgid ""
" "
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:123
#: allianceauth/templates/allianceauth/admin-status/overview.html:116
msgid "running"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:124
#: allianceauth/templates/allianceauth/admin-status/overview.html:117
msgid "queued"
msgstr ""
@@ -2497,114 +2534,216 @@ msgstr ""
msgid "Select Theme"
msgstr ""
#: allianceauth/timerboard/form.py:53
#: allianceauth/timerboard/templates/timerboard/timertable.html:172
msgid "Other"
msgstr ""
#: allianceauth/timerboard/form.py:54
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:44
msgid "Friendly"
msgstr ""
#: allianceauth/timerboard/form.py:55
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Hostile"
msgstr ""
#: allianceauth/timerboard/form.py:56
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Neutral"
msgstr ""
#: allianceauth/timerboard/form.py:58
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:13
#: allianceauth/timerboard/form.py:36
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/timertable.html:7
msgid "Details"
msgstr ""
#: allianceauth/timerboard/form.py:60
#: allianceauth/timerboard/form.py:38
msgid "Planet/Moon"
msgstr ""
#: allianceauth/timerboard/form.py:61
#: allianceauth/timerboard/form.py:39
msgid "Structure Type"
msgstr ""
#: allianceauth/timerboard/form.py:62
#: allianceauth/timerboard/form.py:40
msgid "Timer Type"
msgstr ""
#: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/form.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:8
msgid "Objective"
msgstr ""
#: allianceauth/timerboard/form.py:64
#: allianceauth/timerboard/form.py:42
msgid "Absolute Timer"
msgstr ""
#: allianceauth/timerboard/form.py:65
#: allianceauth/timerboard/form.py:43
msgid "Date and Time"
msgstr ""
#: allianceauth/timerboard/form.py:66
#: allianceauth/timerboard/form.py:44
msgid "Days Remaining"
msgstr ""
#: allianceauth/timerboard/form.py:67
#: allianceauth/timerboard/form.py:45
msgid "Hours Remaining"
msgstr ""
#: allianceauth/timerboard/form.py:69
#: allianceauth/timerboard/form.py:47
msgid "Minutes Remaining"
msgstr ""
#: allianceauth/timerboard/form.py:71
#: allianceauth/timerboard/form.py:48
msgid "Important"
msgstr ""
#: allianceauth/timerboard/form.py:72
#: allianceauth/timerboard/form.py:49
msgid "Corp-Restricted"
msgstr ""
#: allianceauth/timerboard/models.py:14
msgid "Not Specified"
msgstr ""
#: allianceauth/timerboard/models.py:15
msgid "Shield"
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:39
#: allianceauth/timerboard/templates/timerboard/timertable.html:36
msgid "Friendly"
msgstr ""
#: allianceauth/timerboard/models.py:16
msgid "Armor"
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:34
msgid "Hostile"
msgstr ""
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Neutral"
msgstr ""
#: allianceauth/timerboard/models.py:24
#: allianceauth/timerboard/templates/timerboard/timertable.html:48
msgid "POCO"
msgstr ""
#: allianceauth/timerboard/models.py:25
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Orbital Skyhook"
msgstr ""
#: allianceauth/timerboard/models.py:26
#: allianceauth/timerboard/templates/timerboard/timertable.html:52
msgid "I-HUB"
msgstr ""
#: allianceauth/timerboard/models.py:27
#: allianceauth/timerboard/templates/timerboard/timertable.html:55
msgid "TCU"
msgstr ""
#: allianceauth/timerboard/models.py:28
#: allianceauth/timerboard/templates/timerboard/timertable.html:57
msgid "POS [S]"
msgstr ""
#: allianceauth/timerboard/models.py:29
#: allianceauth/timerboard/templates/timerboard/timertable.html:59
msgid "POS [M]"
msgstr ""
#: allianceauth/timerboard/models.py:30
#: allianceauth/timerboard/templates/timerboard/timertable.html:61
msgid "POS [L]"
msgstr ""
#: allianceauth/timerboard/models.py:31
#: allianceauth/timerboard/templates/timerboard/timertable.html:63
msgid "Astrahus"
msgstr ""
#: allianceauth/timerboard/models.py:32
#: allianceauth/timerboard/templates/timerboard/timertable.html:65
msgid "Fortizar"
msgstr ""
#: allianceauth/timerboard/models.py:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:67
msgid "Keepstar"
msgstr ""
#: allianceauth/timerboard/models.py:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:69
msgid "Raitaru"
msgstr ""
#: allianceauth/timerboard/models.py:35
#: allianceauth/timerboard/templates/timerboard/timertable.html:71
msgid "Azbel"
msgstr ""
#: allianceauth/timerboard/models.py:36
#: allianceauth/timerboard/templates/timerboard/timertable.html:73
msgid "Sotiyo"
msgstr ""
#: allianceauth/timerboard/models.py:37
#: allianceauth/timerboard/templates/timerboard/timertable.html:75
msgid "Athanor"
msgstr ""
#: allianceauth/timerboard/models.py:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:77
msgid "Tatara"
msgstr ""
#: allianceauth/timerboard/models.py:39
msgid "Pharolux Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/models.py:40
msgid "Tenebrex Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/models.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:83
msgid "Ansiblex Jump Gate"
msgstr ""
#: allianceauth/timerboard/models.py:42
#: allianceauth/timerboard/templates/timerboard/timertable.html:85
msgid "Moon Mining Cycle"
msgstr ""
#: allianceauth/timerboard/models.py:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:87
msgid "Metenox Moon Drill"
msgstr ""
#: allianceauth/timerboard/models.py:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:89
msgid "Other"
msgstr ""
#: allianceauth/timerboard/models.py:51
msgid "Not Specified"
msgstr ""
#: allianceauth/timerboard/models.py:52
msgid "Shield"
msgstr ""
#: allianceauth/timerboard/models.py:53
msgid "Armor"
msgstr ""
#: allianceauth/timerboard/models.py:54
msgid "Hull"
msgstr ""
#: allianceauth/timerboard/models.py:18
#: allianceauth/timerboard/models.py:55
msgid "Final"
msgstr ""
#: allianceauth/timerboard/models.py:19
#: allianceauth/timerboard/models.py:56
msgid "Anchoring"
msgstr ""
#: allianceauth/timerboard/models.py:20
#: allianceauth/timerboard/models.py:57
msgid "Unanchoring"
msgstr ""
#: allianceauth/timerboard/models.py:58
msgid "Abandoned"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:53
msgid "Upcoming Timers"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
msgid "Timer"
msgstr ""
@@ -2648,78 +2787,14 @@ msgstr ""
msgid "Structure"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:64
msgid "POCO"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:70
msgid "I-HUB"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:76
msgid "TCU"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:82
msgid "POS [S]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:88
msgid "POS [M]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:94
msgid "POS [L]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:100
msgid "Astrahus"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:106
msgid "Fortizar"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:112
msgid "Keepstar"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:118
msgid "Raitaru"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:124
msgid "Azbel"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:130
msgid "Sotiyo"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:136
msgid "Athanor"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:142
msgid "Tatara"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:148
#: allianceauth/timerboard/templates/timerboard/timertable.html:79
msgid "Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:154
#: allianceauth/timerboard/templates/timerboard/timertable.html:81
msgid "Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:160
msgid "Ansiblex Jump Gate"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:166
msgid "Moon Mining Cycle"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/view.html:9
msgid "Structure Timer Management"
msgstr ""

View File

@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-12 19:15+1000\n"
"POT-Creation-Date: 2024-10-21 12:59+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Peter Pfeufer, 2024\n"
"Language-Team: German (https://app.transifex.com/alliance-auth/teams/107430/de/)\n"
@@ -62,66 +62,90 @@ msgstr ""
"Du kannst diese eingeschränkten Gruppen nicht hinzufügen oder entfernen: %s"
#: allianceauth/authentication/models.py:71
#: allianceauth/project_template/project_name/settings/base.py:99
msgid "English"
msgstr "Englisch"
#: allianceauth/authentication/models.py:72
msgid "Czech"
msgstr "Tschechisch"
#: allianceauth/authentication/models.py:73
#: allianceauth/project_template/project_name/settings/base.py:101
msgid "German"
msgstr "Deutsch"
#: allianceauth/authentication/models.py:73
#: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:102
msgid "Spanish"
msgstr "Spanisch"
#: allianceauth/authentication/models.py:74
msgid "Chinese Simplified"
msgstr "Chinesisch vereinfacht"
#: allianceauth/authentication/models.py:75
msgid "Russian"
msgstr "Russisch"
#: allianceauth/authentication/models.py:76
msgid "Korean"
msgstr "Koreanisch"
#: allianceauth/authentication/models.py:77
msgid "French"
msgstr "Französisch"
#: allianceauth/authentication/models.py:78
msgid "Japanese"
msgstr "Japanisch"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:103
msgid "Italian"
msgstr "Italienisch"
#: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:104
msgid "Japanese"
msgstr "Japanisch"
#: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:105
msgid "Korean"
msgstr "Koreanisch"
#: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:106
msgid "French"
msgstr "Französisch"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:109
msgid "Russian"
msgstr "Russisch"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:107
msgid "Dutch"
msgstr "Niederländisch"
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:108
msgid "Polish"
msgstr "Polnisch"
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:110
msgid "Ukrainian"
msgstr "Ukrainisch"
#: allianceauth/authentication/models.py:96
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:111
msgid "Simplified Chinese"
msgstr "Vereinfachtes Chinesisch"
#: allianceauth/authentication/models.py:99
#: allianceauth/menu/templates/menu/menu-user.html:42
msgid "Language"
msgstr "Sprache"
#: allianceauth/authentication/models.py:101
#: allianceauth/authentication/models.py:104
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr "Nachtmodus"
#: allianceauth/authentication/models.py:105
#: allianceauth/authentication/models.py:108
#: allianceauth/menu/templates/menu/menu-user.html:46
msgid "Theme"
msgstr "Theme"
#: allianceauth/authentication/models.py:122
#: allianceauth/authentication/models.py:125
#, python-format
msgid "State changed to: %s"
msgstr "Status geändert zu %s"
#: allianceauth/authentication/models.py:123
#: allianceauth/authentication/models.py:126
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr "Dein Nutzerstatus ist nun %(state)s"
@@ -133,27 +157,27 @@ msgstr "Dein Nutzerstatus ist nun %(state)s"
msgid "Dashboard"
msgstr "Dashboard"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:7
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:5
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:33
#: allianceauth/hrapplications/templates/hrapplications/view.html:54
msgid "Characters"
msgstr "Charaktere"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:13
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:11
#: 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:6
msgid "Add Character"
msgstr "Charakter hinzufügen"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:16
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:17
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: 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:12
msgid "Change Main"
msgstr "Hauptcharakter ändern"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:89
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:23
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:31
@@ -162,12 +186,12 @@ msgstr "Hauptcharakter ändern"
msgid "Name"
msgstr "Name"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:25
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:23
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:33
msgid "Corp"
msgstr "Corp"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:26
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/corputils/templates/corputils/corpstats.html:125
#: allianceauth/hrapplications/templates/hrapplications/view.html:63
msgid "Alliance"
@@ -177,7 +201,7 @@ msgstr "Allianz"
msgid "Membership"
msgstr "Mitgliedschaft"
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:8
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:10
msgid "State:"
msgstr "Status:"
@@ -423,6 +447,19 @@ msgstr "Ausgewählte Corp hat bereits ein Statistik Modul."
msgid "Failed to gather corporation statistics with selected token."
msgstr "Fehler beim Sammeln von Corpstatistiken mit ausgewählten Token."
#: allianceauth/custom_css/apps.py:13 allianceauth/custom_css/models.py:36
#: allianceauth/custom_css/models.py:37 allianceauth/custom_css/models.py:47
msgid "Custom CSS"
msgstr "Eigenes CSS"
#: allianceauth/custom_css/models.py:25
msgid "Your custom CSS"
msgstr "Dein eigenes CSS"
#: allianceauth/custom_css/models.py:26
msgid "This CSS will be added to the site after the default CSS."
msgstr "Dieses CSS wird der Site nach dem Standard-CSS hinzugefügt."
#: allianceauth/fleetactivitytracking/auth_hooks.py:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkcreate.html:11
@@ -510,13 +547,14 @@ msgstr "FAT löschen"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35
#: allianceauth/hrapplications/templates/hrapplications/view.html:41
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30
msgid "User"
msgstr "Benutzername"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:37
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:42
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:59
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:37
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/timertable.html:9
msgid "System"
msgstr "System"
@@ -707,7 +745,6 @@ msgstr "Gruppenverwaltung"
#: allianceauth/groupmanagement/auth_hooks.py:51
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34
#: allianceauth/templates/allianceauth/side-menu.html:15
msgid "Groups"
msgstr "Gruppen"
@@ -863,7 +900,7 @@ msgstr "Antragsteller"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
msgid "Type"
msgstr "Typ"
@@ -955,7 +992,7 @@ msgid "Hidden"
msgstr "Verborgen"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:19
#: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Open"
msgstr "Öffnen"
@@ -1439,16 +1476,16 @@ msgstr "Benachrichtigungen"
msgid "Super User"
msgstr "Super User"
#: allianceauth/menu/templates/menu/menu-user.html:68
#: allianceauth/menu/templates/menu/menu-user.html:70
#: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin"
msgstr "Admin"
#: allianceauth/menu/templates/menu/menu-user.html:80
#: allianceauth/menu/templates/menu/menu-user.html:82
msgid "Sign Out"
msgstr "Ausloggen"
#: allianceauth/menu/templates/menu/menu-user.html:84
#: allianceauth/menu/templates/menu/menu-user.html:86
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18
msgid "Sign In"
@@ -1598,7 +1635,7 @@ msgid "Form Up System"
msgstr "Startsystem"
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18
msgid "EVE Time"
msgstr "EVE Zeit"
@@ -1627,7 +1664,7 @@ msgstr "Anstehende Flotten"
#: allianceauth/optimer/templates/optimer/management.html:44
#: allianceauth/timerboard/templates/timerboard/view.html:62
msgid "No upcoming timers."
msgstr "Keine bevorstehenden Timer."
msgstr "Keine anstehenden Timer."
#: allianceauth/optimer/templates/optimer/management.html:52
msgid "Past Fleet Operations"
@@ -1795,17 +1832,17 @@ msgstr ""
" dies war ein Fehler, kontaktiere bitte einen Administrator."
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:20
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:22
msgid "Activate"
msgstr "Aktivieren"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:34
msgid "Reset Password"
msgstr "Passwort zurücksetzen"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:40
msgid "Deactivate"
msgstr "Deaktivieren"
@@ -1893,15 +1930,61 @@ msgstr "Setze IPSuite4 Passwort."
msgid "Deactivated IPSuite4 account."
msgstr "IP4Suite Konto deaktiviert."
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6
msgid "Mumble"
msgstr "Mumble"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10
msgid "Mumble History"
msgstr "Mumbleverbindungen"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22
msgid "Server Connection History"
msgstr "Verlauf der Serververbindungen"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31
msgid "Displayed Name"
msgstr "Angezeigter Name"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32
msgid "Release"
msgstr "Release"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67
msgid "Version"
msgstr "Version"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34
msgid "Last Connect"
msgstr "Zuletzt verbunden"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35
msgid "Last Disconnect"
msgstr "Zuletzt getrennt"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59
msgid "Server Connection Breakdown"
msgstr "Serververbindungen"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68
msgid "Number"
msgstr "Nummer"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28
#: allianceauth/services/templates/services/service_password.html:26
msgid "Set Password"
msgstr "Setze Passwort"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:44
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:46
msgid "Connect"
msgstr "Verbinden"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52
msgid "Mumble Connection History"
msgstr "Verlauf der Mumbleverbindungen"
#: allianceauth/services/modules/openfire/auth_hooks.py:27
msgid "Jabber"
msgstr "Jabber"
@@ -2473,56 +2556,56 @@ msgstr "Änderungen der SRP Flotte %(fleetname)s gespeichert"
msgid "Your Server received an ESI error response code of "
msgstr "Der Server hat einen ESI-Fehlerantwortcode erhalten"
#: allianceauth/templates/allianceauth/admin-status/overview.html:11
#: allianceauth/templates/allianceauth/admin-status/overview.html:8
msgid "Alliance Auth Notifications"
msgstr "Alliance Auth Benachrichtigungen"
#: allianceauth/templates/allianceauth/admin-status/overview.html:21
#: allianceauth/templates/allianceauth/admin-status/overview.html:18
msgid "Closed"
msgstr "Geschlossen"
#: allianceauth/templates/allianceauth/admin-status/overview.html:27
#: allianceauth/templates/allianceauth/admin-status/overview.html:24
msgid "No notifications at this time"
msgstr "Derzeit liegen keine Benachrichtigungen vor"
#: allianceauth/templates/allianceauth/admin-status/overview.html:36
#: allianceauth/templates/allianceauth/admin-status/overview.html:33
msgid "Powered by GitLab"
msgstr "Unterstützt durch GitLab"
#: allianceauth/templates/allianceauth/admin-status/overview.html:42
#: allianceauth/templates/allianceauth/admin-status/overview.html:39
msgid "Support Discord"
msgstr "Support Discord"
#: allianceauth/templates/allianceauth/admin-status/overview.html:59
#: allianceauth/templates/allianceauth/admin-status/overview.html:63
#: allianceauth/templates/allianceauth/admin-status/overview.html:53
#: allianceauth/templates/allianceauth/admin-status/overview.html:57
msgid "Software Version"
msgstr "Software Version"
#: allianceauth/templates/allianceauth/admin-status/overview.html:66
#: allianceauth/templates/allianceauth/admin-status/overview.html:60
msgid "Current"
msgstr "Aktuell"
#: allianceauth/templates/allianceauth/admin-status/overview.html:73
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Latest Stable"
msgstr "Aktuellste stabile Version"
#: allianceauth/templates/allianceauth/admin-status/overview.html:78
#: allianceauth/templates/allianceauth/admin-status/overview.html:72
msgid "Update available"
msgstr "Update verfügbar"
#: allianceauth/templates/allianceauth/admin-status/overview.html:86
#: allianceauth/templates/allianceauth/admin-status/overview.html:80
msgid "Latest Pre-Release"
msgstr "Aktuellste Testversion"
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
#: allianceauth/templates/allianceauth/admin-status/overview.html:85
msgid "Pre-Release available"
msgstr "Testversion verfügbar"
#: allianceauth/templates/allianceauth/admin-status/overview.html:102
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
msgid "Task Queue"
msgstr "Task-Warteschlange"
#: allianceauth/templates/allianceauth/admin-status/overview.html:107
#: allianceauth/templates/allianceauth/admin-status/overview.html:100
#, python-format
msgid ""
"\n"
@@ -2532,11 +2615,11 @@ msgstr ""
"\n"
"Status von %(total)s verarbeiten Aufgaben • in den letzten %(latest)s"
#: allianceauth/templates/allianceauth/admin-status/overview.html:123
#: allianceauth/templates/allianceauth/admin-status/overview.html:116
msgid "running"
msgstr "laufend"
#: allianceauth/templates/allianceauth/admin-status/overview.html:124
#: allianceauth/templates/allianceauth/admin-status/overview.html:117
msgid "queued"
msgstr "eingereiht"
@@ -2565,114 +2648,216 @@ msgstr "Navigation umschalten"
msgid "Select Theme"
msgstr "Theme auswählen"
#: allianceauth/timerboard/form.py:53
#: allianceauth/timerboard/templates/timerboard/timertable.html:172
msgid "Other"
msgstr "Anderes"
#: allianceauth/timerboard/form.py:54
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:44
msgid "Friendly"
msgstr "Freundlich"
#: allianceauth/timerboard/form.py:55
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Hostile"
msgstr "Feindlich"
#: allianceauth/timerboard/form.py:56
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Neutral"
msgstr "Neutral"
#: allianceauth/timerboard/form.py:58
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:13
#: allianceauth/timerboard/form.py:36
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/timertable.html:7
msgid "Details"
msgstr "Details"
#: allianceauth/timerboard/form.py:60
#: allianceauth/timerboard/form.py:38
msgid "Planet/Moon"
msgstr "Planet/Mond"
#: allianceauth/timerboard/form.py:61
#: allianceauth/timerboard/form.py:39
msgid "Structure Type"
msgstr "Strukturen Typ"
#: allianceauth/timerboard/form.py:62
#: allianceauth/timerboard/form.py:40
msgid "Timer Type"
msgstr "Timer Typ"
#: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/form.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:8
msgid "Objective"
msgstr "Ziel"
#: allianceauth/timerboard/form.py:64
#: allianceauth/timerboard/form.py:42
msgid "Absolute Timer"
msgstr "Absoluter Timer"
#: allianceauth/timerboard/form.py:65
#: allianceauth/timerboard/form.py:43
msgid "Date and Time"
msgstr "Datum und Uhrzeit"
#: allianceauth/timerboard/form.py:66
#: allianceauth/timerboard/form.py:44
msgid "Days Remaining"
msgstr "Tage verbleibend"
#: allianceauth/timerboard/form.py:67
#: allianceauth/timerboard/form.py:45
msgid "Hours Remaining"
msgstr "Stunden verbleibend"
#: allianceauth/timerboard/form.py:69
#: allianceauth/timerboard/form.py:47
msgid "Minutes Remaining"
msgstr "Minuten verbleibend"
#: allianceauth/timerboard/form.py:71
#: allianceauth/timerboard/form.py:48
msgid "Important"
msgstr "Wichtig"
#: allianceauth/timerboard/form.py:72
#: allianceauth/timerboard/form.py:49
msgid "Corp-Restricted"
msgstr "Auf Corp beschränkt"
#: allianceauth/timerboard/models.py:14
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:39
#: allianceauth/timerboard/templates/timerboard/timertable.html:36
msgid "Friendly"
msgstr "Freundlich"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:34
msgid "Hostile"
msgstr "Feindlich"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Neutral"
msgstr "Neutral"
#: allianceauth/timerboard/models.py:24
#: allianceauth/timerboard/templates/timerboard/timertable.html:48
msgid "POCO"
msgstr "POCO"
#: allianceauth/timerboard/models.py:25
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Orbital Skyhook"
msgstr "Orbital Skyhook"
#: allianceauth/timerboard/models.py:26
#: allianceauth/timerboard/templates/timerboard/timertable.html:52
msgid "I-HUB"
msgstr "I-HUB"
#: allianceauth/timerboard/models.py:27
#: allianceauth/timerboard/templates/timerboard/timertable.html:55
msgid "TCU"
msgstr "TCU"
#: allianceauth/timerboard/models.py:28
#: allianceauth/timerboard/templates/timerboard/timertable.html:57
msgid "POS [S]"
msgstr "POS [S]"
#: allianceauth/timerboard/models.py:29
#: allianceauth/timerboard/templates/timerboard/timertable.html:59
msgid "POS [M]"
msgstr "POS [M]"
#: allianceauth/timerboard/models.py:30
#: allianceauth/timerboard/templates/timerboard/timertable.html:61
msgid "POS [L]"
msgstr "POS [L]"
#: allianceauth/timerboard/models.py:31
#: allianceauth/timerboard/templates/timerboard/timertable.html:63
msgid "Astrahus"
msgstr "Astrahus"
#: allianceauth/timerboard/models.py:32
#: allianceauth/timerboard/templates/timerboard/timertable.html:65
msgid "Fortizar"
msgstr "Fortizar"
#: allianceauth/timerboard/models.py:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:67
msgid "Keepstar"
msgstr "Keepstar"
#: allianceauth/timerboard/models.py:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:69
msgid "Raitaru"
msgstr "Raitaru"
#: allianceauth/timerboard/models.py:35
#: allianceauth/timerboard/templates/timerboard/timertable.html:71
msgid "Azbel"
msgstr "Azbel"
#: allianceauth/timerboard/models.py:36
#: allianceauth/timerboard/templates/timerboard/timertable.html:73
msgid "Sotiyo"
msgstr "Sotiyo"
#: allianceauth/timerboard/models.py:37
#: allianceauth/timerboard/templates/timerboard/timertable.html:75
msgid "Athanor"
msgstr "Athanor"
#: allianceauth/timerboard/models.py:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:77
msgid "Tatara"
msgstr "Tatara"
#: allianceauth/timerboard/models.py:39
msgid "Pharolux Cyno Beacon"
msgstr "Pharolux Cyno Beacon"
#: allianceauth/timerboard/models.py:40
msgid "Tenebrex Cyno Jammer"
msgstr "Tenebrex Cyno Jammer"
#: allianceauth/timerboard/models.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:83
msgid "Ansiblex Jump Gate"
msgstr "Ansiblex Jump Gate"
#: allianceauth/timerboard/models.py:42
#: allianceauth/timerboard/templates/timerboard/timertable.html:85
msgid "Moon Mining Cycle"
msgstr "Moon Mining Cycle"
#: allianceauth/timerboard/models.py:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:87
msgid "Metenox Moon Drill"
msgstr "Metenox Moon Drill"
#: allianceauth/timerboard/models.py:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:89
msgid "Other"
msgstr "Anderes"
#: allianceauth/timerboard/models.py:51
msgid "Not Specified"
msgstr "Keine Angabe"
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/models.py:52
msgid "Shield"
msgstr "Schild"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/models.py:53
msgid "Armor"
msgstr "Panzerung"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/models.py:54
msgid "Hull"
msgstr "Hülle"
#: allianceauth/timerboard/models.py:18
#: allianceauth/timerboard/models.py:55
msgid "Final"
msgstr "Final"
#: allianceauth/timerboard/models.py:19
#: allianceauth/timerboard/models.py:56
msgid "Anchoring"
msgstr "Ankernd"
#: allianceauth/timerboard/models.py:20
#: allianceauth/timerboard/models.py:57
msgid "Unanchoring"
msgstr "Entankernd"
#: allianceauth/timerboard/models.py:58
msgid "Abandoned"
msgstr "Aufgegeben"
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:53
msgid "Upcoming Timers"
msgstr "Bevorstehende Timefr"
msgstr "Anstehende Timer"
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
msgid "Timer"
msgstr "Timer"
@@ -2716,78 +2901,14 @@ msgstr "Strukturen Timer aktualisieren"
msgid "Structure"
msgstr "Struktur"
#: allianceauth/timerboard/templates/timerboard/timertable.html:64
msgid "POCO"
msgstr "POCO"
#: allianceauth/timerboard/templates/timerboard/timertable.html:70
msgid "I-HUB"
msgstr "I-HUB"
#: allianceauth/timerboard/templates/timerboard/timertable.html:76
msgid "TCU"
msgstr "TCU"
#: allianceauth/timerboard/templates/timerboard/timertable.html:82
msgid "POS [S]"
msgstr "POS [S]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:88
msgid "POS [M]"
msgstr "POS [M]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:94
msgid "POS [L]"
msgstr "POS [L]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:100
msgid "Astrahus"
msgstr "Astrahus"
#: allianceauth/timerboard/templates/timerboard/timertable.html:106
msgid "Fortizar"
msgstr "Fortizar"
#: allianceauth/timerboard/templates/timerboard/timertable.html:112
msgid "Keepstar"
msgstr "Keepstar"
#: allianceauth/timerboard/templates/timerboard/timertable.html:118
msgid "Raitaru"
msgstr "Raitaru"
#: allianceauth/timerboard/templates/timerboard/timertable.html:124
msgid "Azbel"
msgstr "Azbel"
#: allianceauth/timerboard/templates/timerboard/timertable.html:130
msgid "Sotiyo"
msgstr "Sotiyo"
#: allianceauth/timerboard/templates/timerboard/timertable.html:136
msgid "Athanor"
msgstr "Athanor"
#: allianceauth/timerboard/templates/timerboard/timertable.html:142
msgid "Tatara"
msgstr "Tatara"
#: allianceauth/timerboard/templates/timerboard/timertable.html:148
#: allianceauth/timerboard/templates/timerboard/timertable.html:79
msgid "Cyno Beacon"
msgstr "Cyno Beacon"
#: allianceauth/timerboard/templates/timerboard/timertable.html:154
#: allianceauth/timerboard/templates/timerboard/timertable.html:81
msgid "Cyno Jammer"
msgstr "Cyno Jammer"
#: allianceauth/timerboard/templates/timerboard/timertable.html:160
msgid "Ansiblex Jump Gate"
msgstr "Ansiblex Jump Gate"
#: allianceauth/timerboard/templates/timerboard/timertable.html:166
msgid "Moon Mining Cycle"
msgstr "Moon Mining Cycle"
#: allianceauth/timerboard/templates/timerboard/view.html:9
msgid "Structure Timer Management"
msgstr "Strukturen Timer Verwaltung"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-12 19:15+1000\n"
"POT-Creation-Date: 2024-10-21 12:59+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -49,66 +49,90 @@ msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr ""
#: allianceauth/authentication/models.py:71
#: allianceauth/project_template/project_name/settings/base.py:99
msgid "English"
msgstr ""
#: allianceauth/authentication/models.py:72
msgid "German"
msgid "Czech"
msgstr ""
#: allianceauth/authentication/models.py:73
msgid "Spanish"
#: allianceauth/project_template/project_name/settings/base.py:101
msgid "German"
msgstr ""
#: allianceauth/authentication/models.py:74
msgid "Chinese Simplified"
#: allianceauth/project_template/project_name/settings/base.py:102
msgid "Spanish"
msgstr ""
#: allianceauth/authentication/models.py:75
msgid "Russian"
msgstr ""
#: allianceauth/authentication/models.py:76
msgid "Korean"
msgstr ""
#: allianceauth/authentication/models.py:77
msgid "French"
msgstr ""
#: allianceauth/authentication/models.py:78
msgid "Japanese"
msgstr ""
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:103
msgid "Italian"
msgstr ""
#: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:104
msgid "Japanese"
msgstr ""
#: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:105
msgid "Korean"
msgstr ""
#: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:106
msgid "French"
msgstr ""
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:109
msgid "Russian"
msgstr ""
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:107
msgid "Dutch"
msgstr ""
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:108
msgid "Polish"
msgstr ""
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:110
msgid "Ukrainian"
msgstr ""
#: allianceauth/authentication/models.py:96
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:111
msgid "Simplified Chinese"
msgstr ""
#: allianceauth/authentication/models.py:99
#: allianceauth/menu/templates/menu/menu-user.html:42
msgid "Language"
msgstr ""
#: allianceauth/authentication/models.py:101
#: allianceauth/authentication/models.py:104
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr ""
#: allianceauth/authentication/models.py:105
#: allianceauth/authentication/models.py:108
#: allianceauth/menu/templates/menu/menu-user.html:46
msgid "Theme"
msgstr ""
#: allianceauth/authentication/models.py:122
#: allianceauth/authentication/models.py:125
#, python-format
msgid "State changed to: %s"
msgstr ""
#: allianceauth/authentication/models.py:123
#: allianceauth/authentication/models.py:126
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr ""
@@ -120,27 +144,27 @@ msgstr ""
msgid "Dashboard"
msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:7
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:5
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:33
#: allianceauth/hrapplications/templates/hrapplications/view.html:54
msgid "Characters"
msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:13
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:11
#: 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:6
msgid "Add Character"
msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:16
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:17
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: 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:12
msgid "Change Main"
msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:89
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:23
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:31
@@ -149,12 +173,12 @@ msgstr ""
msgid "Name"
msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:25
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:23
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:33
msgid "Corp"
msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:26
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/corputils/templates/corputils/corpstats.html:125
#: allianceauth/hrapplications/templates/hrapplications/view.html:63
msgid "Alliance"
@@ -164,7 +188,7 @@ msgstr ""
msgid "Membership"
msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:8
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:10
msgid "State:"
msgstr ""
@@ -395,6 +419,19 @@ msgstr ""
msgid "Failed to gather corporation statistics with selected token."
msgstr ""
#: allianceauth/custom_css/apps.py:13 allianceauth/custom_css/models.py:36
#: allianceauth/custom_css/models.py:37 allianceauth/custom_css/models.py:47
msgid "Custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:25
msgid "Your custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:26
msgid "This CSS will be added to the site after the default CSS."
msgstr ""
#: allianceauth/fleetactivitytracking/auth_hooks.py:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkcreate.html:11
@@ -482,13 +519,14 @@ msgstr ""
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35
#: allianceauth/hrapplications/templates/hrapplications/view.html:41
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30
msgid "User"
msgstr ""
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:37
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:42
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:59
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:37
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/timertable.html:9
msgid "System"
msgstr ""
@@ -677,7 +715,6 @@ msgstr ""
#: allianceauth/groupmanagement/auth_hooks.py:51
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34
#: allianceauth/templates/allianceauth/side-menu.html:15
msgid "Groups"
msgstr ""
@@ -807,7 +844,7 @@ msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
msgid "Type"
msgstr ""
@@ -899,7 +936,7 @@ msgid "Hidden"
msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:19
#: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Open"
msgstr ""
@@ -1375,16 +1412,16 @@ msgstr ""
msgid "Super User"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:68
#: allianceauth/menu/templates/menu/menu-user.html:70
#: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:80
#: allianceauth/menu/templates/menu/menu-user.html:82
msgid "Sign Out"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:84
#: allianceauth/menu/templates/menu/menu-user.html:86
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18
msgid "Sign In"
@@ -1534,7 +1571,7 @@ msgid "Form Up System"
msgstr ""
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18
msgid "EVE Time"
msgstr ""
@@ -1729,17 +1766,17 @@ msgid ""
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:20
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:22
msgid "Activate"
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:34
msgid "Reset Password"
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:40
msgid "Deactivate"
msgstr ""
@@ -1819,15 +1856,61 @@ msgstr ""
msgid "Deactivated IPSuite4 account."
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6
msgid "Mumble"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10
msgid "Mumble History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22
msgid "Server Connection History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31
msgid "Displayed Name"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32
msgid "Release"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67
msgid "Version"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34
msgid "Last Connect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35
msgid "Last Disconnect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59
msgid "Server Connection Breakdown"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68
msgid "Number"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28
#: allianceauth/services/templates/services/service_password.html:26
msgid "Set Password"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:44
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:46
msgid "Connect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52
msgid "Mumble Connection History"
msgstr ""
#: allianceauth/services/modules/openfire/auth_hooks.py:27
msgid "Jabber"
msgstr ""
@@ -2386,56 +2469,56 @@ msgstr ""
msgid "Your Server received an ESI error response code of "
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:11
#: allianceauth/templates/allianceauth/admin-status/overview.html:8
msgid "Alliance Auth Notifications"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:21
#: allianceauth/templates/allianceauth/admin-status/overview.html:18
msgid "Closed"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:27
#: allianceauth/templates/allianceauth/admin-status/overview.html:24
msgid "No notifications at this time"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:36
#: allianceauth/templates/allianceauth/admin-status/overview.html:33
msgid "Powered by GitLab"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:42
#: allianceauth/templates/allianceauth/admin-status/overview.html:39
msgid "Support Discord"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:59
#: allianceauth/templates/allianceauth/admin-status/overview.html:63
#: allianceauth/templates/allianceauth/admin-status/overview.html:53
#: allianceauth/templates/allianceauth/admin-status/overview.html:57
msgid "Software Version"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:66
#: allianceauth/templates/allianceauth/admin-status/overview.html:60
msgid "Current"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:73
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Latest Stable"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:78
#: allianceauth/templates/allianceauth/admin-status/overview.html:72
msgid "Update available"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:86
#: allianceauth/templates/allianceauth/admin-status/overview.html:80
msgid "Latest Pre-Release"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
#: allianceauth/templates/allianceauth/admin-status/overview.html:85
msgid "Pre-Release available"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:102
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
msgid "Task Queue"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:107
#: allianceauth/templates/allianceauth/admin-status/overview.html:100
#, python-format
msgid ""
"\n"
@@ -2444,11 +2527,11 @@ msgid ""
" "
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:123
#: allianceauth/templates/allianceauth/admin-status/overview.html:116
msgid "running"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:124
#: allianceauth/templates/allianceauth/admin-status/overview.html:117
msgid "queued"
msgstr ""
@@ -2477,114 +2560,216 @@ msgstr ""
msgid "Select Theme"
msgstr ""
#: allianceauth/timerboard/form.py:53
#: allianceauth/timerboard/templates/timerboard/timertable.html:172
msgid "Other"
msgstr ""
#: allianceauth/timerboard/form.py:54
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:44
msgid "Friendly"
msgstr ""
#: allianceauth/timerboard/form.py:55
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Hostile"
msgstr ""
#: allianceauth/timerboard/form.py:56
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Neutral"
msgstr ""
#: allianceauth/timerboard/form.py:58
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:13
#: allianceauth/timerboard/form.py:36
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/timertable.html:7
msgid "Details"
msgstr ""
#: allianceauth/timerboard/form.py:60
#: allianceauth/timerboard/form.py:38
msgid "Planet/Moon"
msgstr ""
#: allianceauth/timerboard/form.py:61
#: allianceauth/timerboard/form.py:39
msgid "Structure Type"
msgstr ""
#: allianceauth/timerboard/form.py:62
#: allianceauth/timerboard/form.py:40
msgid "Timer Type"
msgstr ""
#: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/form.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:8
msgid "Objective"
msgstr ""
#: allianceauth/timerboard/form.py:64
#: allianceauth/timerboard/form.py:42
msgid "Absolute Timer"
msgstr ""
#: allianceauth/timerboard/form.py:65
#: allianceauth/timerboard/form.py:43
msgid "Date and Time"
msgstr ""
#: allianceauth/timerboard/form.py:66
#: allianceauth/timerboard/form.py:44
msgid "Days Remaining"
msgstr ""
#: allianceauth/timerboard/form.py:67
#: allianceauth/timerboard/form.py:45
msgid "Hours Remaining"
msgstr ""
#: allianceauth/timerboard/form.py:69
#: allianceauth/timerboard/form.py:47
msgid "Minutes Remaining"
msgstr ""
#: allianceauth/timerboard/form.py:71
#: allianceauth/timerboard/form.py:48
msgid "Important"
msgstr ""
#: allianceauth/timerboard/form.py:72
#: allianceauth/timerboard/form.py:49
msgid "Corp-Restricted"
msgstr ""
#: allianceauth/timerboard/models.py:14
msgid "Not Specified"
msgstr ""
#: allianceauth/timerboard/models.py:15
msgid "Shield"
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:39
#: allianceauth/timerboard/templates/timerboard/timertable.html:36
msgid "Friendly"
msgstr ""
#: allianceauth/timerboard/models.py:16
msgid "Armor"
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:34
msgid "Hostile"
msgstr ""
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Neutral"
msgstr ""
#: allianceauth/timerboard/models.py:24
#: allianceauth/timerboard/templates/timerboard/timertable.html:48
msgid "POCO"
msgstr ""
#: allianceauth/timerboard/models.py:25
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Orbital Skyhook"
msgstr ""
#: allianceauth/timerboard/models.py:26
#: allianceauth/timerboard/templates/timerboard/timertable.html:52
msgid "I-HUB"
msgstr ""
#: allianceauth/timerboard/models.py:27
#: allianceauth/timerboard/templates/timerboard/timertable.html:55
msgid "TCU"
msgstr ""
#: allianceauth/timerboard/models.py:28
#: allianceauth/timerboard/templates/timerboard/timertable.html:57
msgid "POS [S]"
msgstr ""
#: allianceauth/timerboard/models.py:29
#: allianceauth/timerboard/templates/timerboard/timertable.html:59
msgid "POS [M]"
msgstr ""
#: allianceauth/timerboard/models.py:30
#: allianceauth/timerboard/templates/timerboard/timertable.html:61
msgid "POS [L]"
msgstr ""
#: allianceauth/timerboard/models.py:31
#: allianceauth/timerboard/templates/timerboard/timertable.html:63
msgid "Astrahus"
msgstr ""
#: allianceauth/timerboard/models.py:32
#: allianceauth/timerboard/templates/timerboard/timertable.html:65
msgid "Fortizar"
msgstr ""
#: allianceauth/timerboard/models.py:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:67
msgid "Keepstar"
msgstr ""
#: allianceauth/timerboard/models.py:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:69
msgid "Raitaru"
msgstr ""
#: allianceauth/timerboard/models.py:35
#: allianceauth/timerboard/templates/timerboard/timertable.html:71
msgid "Azbel"
msgstr ""
#: allianceauth/timerboard/models.py:36
#: allianceauth/timerboard/templates/timerboard/timertable.html:73
msgid "Sotiyo"
msgstr ""
#: allianceauth/timerboard/models.py:37
#: allianceauth/timerboard/templates/timerboard/timertable.html:75
msgid "Athanor"
msgstr ""
#: allianceauth/timerboard/models.py:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:77
msgid "Tatara"
msgstr ""
#: allianceauth/timerboard/models.py:39
msgid "Pharolux Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/models.py:40
msgid "Tenebrex Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/models.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:83
msgid "Ansiblex Jump Gate"
msgstr ""
#: allianceauth/timerboard/models.py:42
#: allianceauth/timerboard/templates/timerboard/timertable.html:85
msgid "Moon Mining Cycle"
msgstr ""
#: allianceauth/timerboard/models.py:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:87
msgid "Metenox Moon Drill"
msgstr ""
#: allianceauth/timerboard/models.py:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:89
msgid "Other"
msgstr ""
#: allianceauth/timerboard/models.py:51
msgid "Not Specified"
msgstr ""
#: allianceauth/timerboard/models.py:52
msgid "Shield"
msgstr ""
#: allianceauth/timerboard/models.py:53
msgid "Armor"
msgstr ""
#: allianceauth/timerboard/models.py:54
msgid "Hull"
msgstr ""
#: allianceauth/timerboard/models.py:18
#: allianceauth/timerboard/models.py:55
msgid "Final"
msgstr ""
#: allianceauth/timerboard/models.py:19
#: allianceauth/timerboard/models.py:56
msgid "Anchoring"
msgstr ""
#: allianceauth/timerboard/models.py:20
#: allianceauth/timerboard/models.py:57
msgid "Unanchoring"
msgstr ""
#: allianceauth/timerboard/models.py:58
msgid "Abandoned"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:53
msgid "Upcoming Timers"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
msgid "Timer"
msgstr ""
@@ -2628,78 +2813,14 @@ msgstr ""
msgid "Structure"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:64
msgid "POCO"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:70
msgid "I-HUB"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:76
msgid "TCU"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:82
msgid "POS [S]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:88
msgid "POS [M]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:94
msgid "POS [L]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:100
msgid "Astrahus"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:106
msgid "Fortizar"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:112
msgid "Keepstar"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:118
msgid "Raitaru"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:124
msgid "Azbel"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:130
msgid "Sotiyo"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:136
msgid "Athanor"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:142
msgid "Tatara"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:148
#: allianceauth/timerboard/templates/timerboard/timertable.html:79
msgid "Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:154
#: allianceauth/timerboard/templates/timerboard/timertable.html:81
msgid "Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:160
msgid "Ansiblex Jump Gate"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:166
msgid "Moon Mining Cycle"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/view.html:9
msgid "Structure Timer Management"
msgstr ""

View File

@@ -15,7 +15,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-12 19:15+1000\n"
"POT-Creation-Date: 2024-10-21 12:59+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: trenus, 2023\n"
"Language-Team: Spanish (https://app.transifex.com/alliance-auth/teams/107430/es/)\n"
@@ -58,66 +58,90 @@ msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr "No puedes añadir o eliminar estos grupos restringidos: %s"
#: allianceauth/authentication/models.py:71
#: allianceauth/project_template/project_name/settings/base.py:99
msgid "English"
msgstr "Inglés"
#: allianceauth/authentication/models.py:72
msgid "Czech"
msgstr ""
#: allianceauth/authentication/models.py:73
#: allianceauth/project_template/project_name/settings/base.py:101
msgid "German"
msgstr "Alemán"
#: allianceauth/authentication/models.py:73
#: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:102
msgid "Spanish"
msgstr "Español"
#: allianceauth/authentication/models.py:74
msgid "Chinese Simplified"
msgstr "Chino Simplificado"
#: allianceauth/authentication/models.py:75
msgid "Russian"
msgstr "Ruso"
#: allianceauth/authentication/models.py:76
msgid "Korean"
msgstr "Coreano"
#: allianceauth/authentication/models.py:77
msgid "French"
msgstr "Francés"
#: allianceauth/authentication/models.py:78
msgid "Japanese"
msgstr "Japonés"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:103
msgid "Italian"
msgstr "Italiano"
#: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:104
msgid "Japanese"
msgstr "Japonés"
#: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:105
msgid "Korean"
msgstr "Coreano"
#: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:106
msgid "French"
msgstr "Francés"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:109
msgid "Russian"
msgstr "Ruso"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:107
msgid "Dutch"
msgstr ""
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:108
msgid "Polish"
msgstr ""
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:110
msgid "Ukrainian"
msgstr ""
#: allianceauth/authentication/models.py:96
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:111
msgid "Simplified Chinese"
msgstr ""
#: allianceauth/authentication/models.py:99
#: allianceauth/menu/templates/menu/menu-user.html:42
msgid "Language"
msgstr "Idioma"
#: allianceauth/authentication/models.py:101
#: allianceauth/authentication/models.py:104
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr "Modo Nocturno"
#: allianceauth/authentication/models.py:105
#: allianceauth/authentication/models.py:108
#: allianceauth/menu/templates/menu/menu-user.html:46
msgid "Theme"
msgstr ""
#: allianceauth/authentication/models.py:122
#: allianceauth/authentication/models.py:125
#, python-format
msgid "State changed to: %s"
msgstr "Estado cambiado a: %s"
#: allianceauth/authentication/models.py:123
#: allianceauth/authentication/models.py:126
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr "El estado de su usuario es ahora: %(state)s"
@@ -129,27 +153,27 @@ msgstr "El estado de su usuario es ahora: %(state)s"
msgid "Dashboard"
msgstr "Página principal"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:7
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:5
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:33
#: allianceauth/hrapplications/templates/hrapplications/view.html:54
msgid "Characters"
msgstr "Personajes"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:13
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:11
#: 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:6
msgid "Add Character"
msgstr "Agregar Personaje"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:16
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:17
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: 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:12
msgid "Change Main"
msgstr "Cambiar Personaje Principal"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:89
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:23
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:31
@@ -158,12 +182,12 @@ msgstr "Cambiar Personaje Principal"
msgid "Name"
msgstr "Nombre"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:25
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:23
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:33
msgid "Corp"
msgstr "Corporación"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:26
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/corputils/templates/corputils/corpstats.html:125
#: allianceauth/hrapplications/templates/hrapplications/view.html:63
msgid "Alliance"
@@ -173,7 +197,7 @@ msgstr "Allianza"
msgid "Membership"
msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:8
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:10
msgid "State:"
msgstr ""
@@ -415,6 +439,19 @@ msgid "Failed to gather corporation statistics with selected token."
msgstr ""
"Se fallo en obtener las estadisticas corporativas con el token seleccionado"
#: allianceauth/custom_css/apps.py:13 allianceauth/custom_css/models.py:36
#: allianceauth/custom_css/models.py:37 allianceauth/custom_css/models.py:47
msgid "Custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:25
msgid "Your custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:26
msgid "This CSS will be added to the site after the default CSS."
msgstr ""
#: allianceauth/fleetactivitytracking/auth_hooks.py:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkcreate.html:11
@@ -502,13 +539,14 @@ msgstr "Borrar fatlink"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35
#: allianceauth/hrapplications/templates/hrapplications/view.html:41
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30
msgid "User"
msgstr "Usuario"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:37
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:42
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:59
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:37
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/timertable.html:9
msgid "System"
msgstr "Sistema"
@@ -701,7 +739,6 @@ msgstr "Manejo de Grupo"
#: allianceauth/groupmanagement/auth_hooks.py:51
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34
#: allianceauth/templates/allianceauth/side-menu.html:15
msgid "Groups"
msgstr "Grupos"
@@ -856,7 +893,7 @@ msgstr "Solicitante"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
msgid "Type"
msgstr "Tipo"
@@ -948,7 +985,7 @@ msgid "Hidden"
msgstr "Escondido"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:19
#: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Open"
msgstr "Abierto"
@@ -1429,16 +1466,16 @@ msgstr "Notificaciones"
msgid "Super User"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:68
#: allianceauth/menu/templates/menu/menu-user.html:70
#: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin"
msgstr "Administrador"
#: allianceauth/menu/templates/menu/menu-user.html:80
#: allianceauth/menu/templates/menu/menu-user.html:82
msgid "Sign Out"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:84
#: allianceauth/menu/templates/menu/menu-user.html:86
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18
msgid "Sign In"
@@ -1588,7 +1625,7 @@ msgid "Form Up System"
msgstr "Sistema de encuentro"
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18
msgid "EVE Time"
msgstr ""
@@ -1785,17 +1822,17 @@ msgstr ""
"que se trata de un error, ponte en contacto con un administrador."
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:20
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:22
msgid "Activate"
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:34
msgid "Reset Password"
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:40
msgid "Deactivate"
msgstr ""
@@ -1882,15 +1919,61 @@ msgstr "Establecer contraseña de IPSuite4."
msgid "Deactivated IPSuite4 account."
msgstr "Cuenta IPSuite4 desactivada."
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6
msgid "Mumble"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10
msgid "Mumble History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22
msgid "Server Connection History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31
msgid "Displayed Name"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32
msgid "Release"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67
msgid "Version"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34
msgid "Last Connect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35
msgid "Last Disconnect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59
msgid "Server Connection Breakdown"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68
msgid "Number"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28
#: allianceauth/services/templates/services/service_password.html:26
msgid "Set Password"
msgstr "Cambiar Contraseña"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:44
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:46
msgid "Connect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52
msgid "Mumble Connection History"
msgstr ""
#: allianceauth/services/modules/openfire/auth_hooks.py:27
msgid "Jabber"
msgstr "Jabber"
@@ -2456,56 +2539,56 @@ msgstr "Se guardaron los cambios en el SRP de la flota %(fleetname)s"
msgid "Your Server received an ESI error response code of "
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:11
#: allianceauth/templates/allianceauth/admin-status/overview.html:8
msgid "Alliance Auth Notifications"
msgstr "Notificaciones de Alliance Auth"
#: allianceauth/templates/allianceauth/admin-status/overview.html:21
#: allianceauth/templates/allianceauth/admin-status/overview.html:18
msgid "Closed"
msgstr "Cerrado"
#: allianceauth/templates/allianceauth/admin-status/overview.html:27
#: allianceauth/templates/allianceauth/admin-status/overview.html:24
msgid "No notifications at this time"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:36
#: allianceauth/templates/allianceauth/admin-status/overview.html:33
msgid "Powered by GitLab"
msgstr "Desarrollado por GitLab"
#: allianceauth/templates/allianceauth/admin-status/overview.html:42
#: allianceauth/templates/allianceauth/admin-status/overview.html:39
msgid "Support Discord"
msgstr "Soporte Discord"
#: allianceauth/templates/allianceauth/admin-status/overview.html:59
#: allianceauth/templates/allianceauth/admin-status/overview.html:63
#: allianceauth/templates/allianceauth/admin-status/overview.html:53
#: allianceauth/templates/allianceauth/admin-status/overview.html:57
msgid "Software Version"
msgstr "Versión del Software"
#: allianceauth/templates/allianceauth/admin-status/overview.html:66
#: allianceauth/templates/allianceauth/admin-status/overview.html:60
msgid "Current"
msgstr "Actual"
#: allianceauth/templates/allianceauth/admin-status/overview.html:73
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Latest Stable"
msgstr "Último Estable"
#: allianceauth/templates/allianceauth/admin-status/overview.html:78
#: allianceauth/templates/allianceauth/admin-status/overview.html:72
msgid "Update available"
msgstr "Actualizacion Disponible"
#: allianceauth/templates/allianceauth/admin-status/overview.html:86
#: allianceauth/templates/allianceauth/admin-status/overview.html:80
msgid "Latest Pre-Release"
msgstr "Último Pre-Lanzamiento"
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
#: allianceauth/templates/allianceauth/admin-status/overview.html:85
msgid "Pre-Release available"
msgstr "Pre-Lanzamiento disponible"
#: allianceauth/templates/allianceauth/admin-status/overview.html:102
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
msgid "Task Queue"
msgstr "Cola de Tareas"
#: allianceauth/templates/allianceauth/admin-status/overview.html:107
#: allianceauth/templates/allianceauth/admin-status/overview.html:100
#, python-format
msgid ""
"\n"
@@ -2513,11 +2596,11 @@ msgid ""
" "
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:123
#: allianceauth/templates/allianceauth/admin-status/overview.html:116
msgid "running"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:124
#: allianceauth/templates/allianceauth/admin-status/overview.html:117
msgid "queued"
msgstr ""
@@ -2546,114 +2629,216 @@ msgstr "Navegacion"
msgid "Select Theme"
msgstr ""
#: allianceauth/timerboard/form.py:53
#: allianceauth/timerboard/templates/timerboard/timertable.html:172
msgid "Other"
msgstr "Otro"
#: allianceauth/timerboard/form.py:54
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:44
msgid "Friendly"
msgstr "Amigable"
#: allianceauth/timerboard/form.py:55
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Hostile"
msgstr "Hostil"
#: allianceauth/timerboard/form.py:56
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Neutral"
msgstr "Neutral"
#: allianceauth/timerboard/form.py:58
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:13
#: allianceauth/timerboard/form.py:36
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/timertable.html:7
msgid "Details"
msgstr "Detalles"
#: allianceauth/timerboard/form.py:60
#: allianceauth/timerboard/form.py:38
msgid "Planet/Moon"
msgstr "Planeta/Luna"
#: allianceauth/timerboard/form.py:61
#: allianceauth/timerboard/form.py:39
msgid "Structure Type"
msgstr "Tipo de Estructura"
#: allianceauth/timerboard/form.py:62
#: allianceauth/timerboard/form.py:40
msgid "Timer Type"
msgstr "Tipo de temporizador"
#: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/form.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:8
msgid "Objective"
msgstr "Objetivo"
#: allianceauth/timerboard/form.py:64
#: allianceauth/timerboard/form.py:42
msgid "Absolute Timer"
msgstr ""
#: allianceauth/timerboard/form.py:65
#: allianceauth/timerboard/form.py:43
msgid "Date and Time"
msgstr ""
#: allianceauth/timerboard/form.py:66
#: allianceauth/timerboard/form.py:44
msgid "Days Remaining"
msgstr "Dias restantes"
#: allianceauth/timerboard/form.py:67
#: allianceauth/timerboard/form.py:45
msgid "Hours Remaining"
msgstr "Horas Restantes"
#: allianceauth/timerboard/form.py:69
#: allianceauth/timerboard/form.py:47
msgid "Minutes Remaining"
msgstr "Minutos Restantes"
#: allianceauth/timerboard/form.py:71
#: allianceauth/timerboard/form.py:48
msgid "Important"
msgstr "Importante"
#: allianceauth/timerboard/form.py:72
#: allianceauth/timerboard/form.py:49
msgid "Corp-Restricted"
msgstr "Restringido a Corp"
#: allianceauth/timerboard/models.py:14
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:39
#: allianceauth/timerboard/templates/timerboard/timertable.html:36
msgid "Friendly"
msgstr "Amigable"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:34
msgid "Hostile"
msgstr "Hostil"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Neutral"
msgstr "Neutral"
#: allianceauth/timerboard/models.py:24
#: allianceauth/timerboard/templates/timerboard/timertable.html:48
msgid "POCO"
msgstr ""
#: allianceauth/timerboard/models.py:25
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Orbital Skyhook"
msgstr ""
#: allianceauth/timerboard/models.py:26
#: allianceauth/timerboard/templates/timerboard/timertable.html:52
msgid "I-HUB"
msgstr ""
#: allianceauth/timerboard/models.py:27
#: allianceauth/timerboard/templates/timerboard/timertable.html:55
msgid "TCU"
msgstr ""
#: allianceauth/timerboard/models.py:28
#: allianceauth/timerboard/templates/timerboard/timertable.html:57
msgid "POS [S]"
msgstr ""
#: allianceauth/timerboard/models.py:29
#: allianceauth/timerboard/templates/timerboard/timertable.html:59
msgid "POS [M]"
msgstr ""
#: allianceauth/timerboard/models.py:30
#: allianceauth/timerboard/templates/timerboard/timertable.html:61
msgid "POS [L]"
msgstr ""
#: allianceauth/timerboard/models.py:31
#: allianceauth/timerboard/templates/timerboard/timertable.html:63
msgid "Astrahus"
msgstr ""
#: allianceauth/timerboard/models.py:32
#: allianceauth/timerboard/templates/timerboard/timertable.html:65
msgid "Fortizar"
msgstr ""
#: allianceauth/timerboard/models.py:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:67
msgid "Keepstar"
msgstr ""
#: allianceauth/timerboard/models.py:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:69
msgid "Raitaru"
msgstr ""
#: allianceauth/timerboard/models.py:35
#: allianceauth/timerboard/templates/timerboard/timertable.html:71
msgid "Azbel"
msgstr ""
#: allianceauth/timerboard/models.py:36
#: allianceauth/timerboard/templates/timerboard/timertable.html:73
msgid "Sotiyo"
msgstr ""
#: allianceauth/timerboard/models.py:37
#: allianceauth/timerboard/templates/timerboard/timertable.html:75
msgid "Athanor"
msgstr ""
#: allianceauth/timerboard/models.py:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:77
msgid "Tatara"
msgstr ""
#: allianceauth/timerboard/models.py:39
msgid "Pharolux Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/models.py:40
msgid "Tenebrex Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/models.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:83
msgid "Ansiblex Jump Gate"
msgstr ""
#: allianceauth/timerboard/models.py:42
#: allianceauth/timerboard/templates/timerboard/timertable.html:85
msgid "Moon Mining Cycle"
msgstr ""
#: allianceauth/timerboard/models.py:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:87
msgid "Metenox Moon Drill"
msgstr ""
#: allianceauth/timerboard/models.py:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:89
msgid "Other"
msgstr "Otro"
#: allianceauth/timerboard/models.py:51
msgid "Not Specified"
msgstr "Sin especificación"
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/models.py:52
msgid "Shield"
msgstr "Escudo"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/models.py:53
msgid "Armor"
msgstr "Armadura"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/models.py:54
msgid "Hull"
msgstr "Tipo"
#: allianceauth/timerboard/models.py:18
#: allianceauth/timerboard/models.py:55
msgid "Final"
msgstr "Final"
#: allianceauth/timerboard/models.py:19
#: allianceauth/timerboard/models.py:56
msgid "Anchoring"
msgstr "Anclando"
#: allianceauth/timerboard/models.py:20
#: allianceauth/timerboard/models.py:57
msgid "Unanchoring"
msgstr "Desanclando"
#: allianceauth/timerboard/models.py:58
msgid "Abandoned"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:53
msgid "Upcoming Timers"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
msgid "Timer"
msgstr ""
@@ -2697,78 +2882,14 @@ msgstr "Actualizar Timer de Estructura"
msgid "Structure"
msgstr "Estructura"
#: allianceauth/timerboard/templates/timerboard/timertable.html:64
msgid "POCO"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:70
msgid "I-HUB"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:76
msgid "TCU"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:82
msgid "POS [S]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:88
msgid "POS [M]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:94
msgid "POS [L]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:100
msgid "Astrahus"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:106
msgid "Fortizar"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:112
msgid "Keepstar"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:118
msgid "Raitaru"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:124
msgid "Azbel"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:130
msgid "Sotiyo"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:136
msgid "Athanor"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:142
msgid "Tatara"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:148
#: allianceauth/timerboard/templates/timerboard/timertable.html:79
msgid "Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:154
#: allianceauth/timerboard/templates/timerboard/timertable.html:81
msgid "Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:160
msgid "Ansiblex Jump Gate"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:166
msgid "Moon Mining Cycle"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/view.html:9
msgid "Structure Timer Management"
msgstr "Manejo de Timers Estructurales"

View File

@@ -13,15 +13,16 @@
# Geoffrey Fabbro, 2023
# Idea, 2024
# Joel Falknau <ozirascal@gmail.com>, 2024
# T'rahk Rokym, 2024
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-12 19:15+1000\n"
"POT-Creation-Date: 2024-10-21 12:59+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Joel Falknau <ozirascal@gmail.com>, 2024\n"
"Last-Translator: T'rahk Rokym, 2024\n"
"Language-Team: French (France) (https://app.transifex.com/alliance-auth/teams/107430/fr_FR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -70,66 +71,90 @@ msgstr ""
"restreints: %s"
#: allianceauth/authentication/models.py:71
#: allianceauth/project_template/project_name/settings/base.py:99
msgid "English"
msgstr "Anglais"
#: allianceauth/authentication/models.py:72
msgid "Czech"
msgstr ""
#: allianceauth/authentication/models.py:73
#: allianceauth/project_template/project_name/settings/base.py:101
msgid "German"
msgstr "Allemand"
#: allianceauth/authentication/models.py:73
#: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:102
msgid "Spanish"
msgstr "Espagnol"
#: allianceauth/authentication/models.py:74
msgid "Chinese Simplified"
msgstr "Chinois simplifié"
#: allianceauth/authentication/models.py:75
msgid "Russian"
msgstr "Russe"
#: allianceauth/authentication/models.py:76
msgid "Korean"
msgstr "Coréen"
#: allianceauth/authentication/models.py:77
msgid "French"
msgstr "Français"
#: allianceauth/authentication/models.py:78
msgid "Japanese"
msgstr "Japonais"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:103
msgid "Italian"
msgstr "Italien"
#: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:104
msgid "Japanese"
msgstr "Japonais"
#: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:105
msgid "Korean"
msgstr "Coréen"
#: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:106
msgid "French"
msgstr "Français"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:109
msgid "Russian"
msgstr "Russe"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:107
msgid "Dutch"
msgstr ""
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:108
msgid "Polish"
msgstr "Polonais"
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:110
msgid "Ukrainian"
msgstr "Ukrainien"
#: allianceauth/authentication/models.py:96
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:111
msgid "Simplified Chinese"
msgstr ""
#: allianceauth/authentication/models.py:99
#: allianceauth/menu/templates/menu/menu-user.html:42
msgid "Language"
msgstr "Langue"
#: allianceauth/authentication/models.py:101
#: allianceauth/authentication/models.py:104
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr "Mode Nuit"
#: allianceauth/authentication/models.py:105
#: allianceauth/authentication/models.py:108
#: allianceauth/menu/templates/menu/menu-user.html:46
msgid "Theme"
msgstr "Thème"
#: allianceauth/authentication/models.py:122
#: allianceauth/authentication/models.py:125
#, python-format
msgid "State changed to: %s"
msgstr "État changé à: %s"
#: allianceauth/authentication/models.py:123
#: allianceauth/authentication/models.py:126
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr "L'état de votre personnage est maintenant: %(state)s"
@@ -141,27 +166,27 @@ msgstr "L'état de votre personnage est maintenant: %(state)s"
msgid "Dashboard"
msgstr "Écran de bord"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:7
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:5
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:33
#: allianceauth/hrapplications/templates/hrapplications/view.html:54
msgid "Characters"
msgstr "Personnages"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:13
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:11
#: 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:6
msgid "Add Character"
msgstr "Ajouter un Personnage"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:16
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:17
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: 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:12
msgid "Change Main"
msgstr "Changer de Personnage Principal"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:89
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:23
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:31
@@ -170,12 +195,12 @@ msgstr "Changer de Personnage Principal"
msgid "Name"
msgstr "Nom"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:25
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:23
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:33
msgid "Corp"
msgstr "Corpo"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:26
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/corputils/templates/corputils/corpstats.html:125
#: allianceauth/hrapplications/templates/hrapplications/view.html:63
msgid "Alliance"
@@ -185,7 +210,7 @@ msgstr "Alliance"
msgid "Membership"
msgstr "Appartenance"
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:8
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:10
msgid "State:"
msgstr "État:"
@@ -431,6 +456,19 @@ msgid "Failed to gather corporation statistics with selected token."
msgstr ""
"Impossible d'obtenir les statistiques de la corpo avec le code choisi."
#: allianceauth/custom_css/apps.py:13 allianceauth/custom_css/models.py:36
#: allianceauth/custom_css/models.py:37 allianceauth/custom_css/models.py:47
msgid "Custom CSS"
msgstr "CSS personnalisé"
#: allianceauth/custom_css/models.py:25
msgid "Your custom CSS"
msgstr "Votre CSS personnalisé"
#: allianceauth/custom_css/models.py:26
msgid "This CSS will be added to the site after the default CSS."
msgstr "Ce CSS être ajouté sur le site après le CSS par défaut"
#: allianceauth/fleetactivitytracking/auth_hooks.py:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkcreate.html:11
@@ -518,13 +556,14 @@ msgstr "supprimer lien FAT"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35
#: allianceauth/hrapplications/templates/hrapplications/view.html:41
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30
msgid "User"
msgstr "Utilisateur"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:37
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:42
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:59
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:37
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/timertable.html:9
msgid "System"
msgstr "Système"
@@ -717,7 +756,6 @@ msgstr "Gestion de groupe"
#: allianceauth/groupmanagement/auth_hooks.py:51
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34
#: allianceauth/templates/allianceauth/side-menu.html:15
msgid "Groups"
msgstr "Groupes"
@@ -873,7 +911,7 @@ msgstr "Demandeur"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
msgid "Type"
msgstr "Type"
@@ -965,7 +1003,7 @@ msgid "Hidden"
msgstr "Caché"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:19
#: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Open"
msgstr "Ouvert"
@@ -1449,16 +1487,16 @@ msgstr "Alertes"
msgid "Super User"
msgstr "Super Utilisateur"
#: allianceauth/menu/templates/menu/menu-user.html:68
#: allianceauth/menu/templates/menu/menu-user.html:70
#: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin"
msgstr "Administrateur"
#: allianceauth/menu/templates/menu/menu-user.html:80
#: allianceauth/menu/templates/menu/menu-user.html:82
msgid "Sign Out"
msgstr "Se Déconnecter"
#: allianceauth/menu/templates/menu/menu-user.html:84
#: allianceauth/menu/templates/menu/menu-user.html:86
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18
msgid "Sign In"
@@ -1608,7 +1646,7 @@ msgid "Form Up System"
msgstr "Système de départ"
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18
msgid "EVE Time"
msgstr "Temps EVE"
@@ -1805,17 +1843,17 @@ msgstr ""
"pensez que c'est une erreur, veuillez contacter un administrateur."
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:20
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:22
msgid "Activate"
msgstr "Activer"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:34
msgid "Reset Password"
msgstr "Réinitialiser le mot de passe"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:40
msgid "Deactivate"
msgstr "Désactiver"
@@ -1902,15 +1940,61 @@ msgstr "Définir le mot de passe IPSuite4."
msgid "Deactivated IPSuite4 account."
msgstr "Compte IPSuite4 désactivé."
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6
msgid "Mumble"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10
msgid "Mumble History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22
msgid "Server Connection History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31
msgid "Displayed Name"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32
msgid "Release"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67
msgid "Version"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34
msgid "Last Connect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35
msgid "Last Disconnect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59
msgid "Server Connection Breakdown"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68
msgid "Number"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28
#: allianceauth/services/templates/services/service_password.html:26
msgid "Set Password"
msgstr "Définir le mot de passe"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:44
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:46
msgid "Connect"
msgstr "Connecter"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52
msgid "Mumble Connection History"
msgstr ""
#: allianceauth/services/modules/openfire/auth_hooks.py:27
msgid "Jabber"
msgstr "Jabber"
@@ -2480,56 +2564,56 @@ msgstr "Modifications enregistrées de la flotte SRP%(fleetname)s"
msgid "Your Server received an ESI error response code of "
msgstr "Votre serveur a reçu une erreur ESI avec pour code"
#: allianceauth/templates/allianceauth/admin-status/overview.html:11
#: allianceauth/templates/allianceauth/admin-status/overview.html:8
msgid "Alliance Auth Notifications"
msgstr "Alertes Alliance Auth"
#: allianceauth/templates/allianceauth/admin-status/overview.html:21
#: allianceauth/templates/allianceauth/admin-status/overview.html:18
msgid "Closed"
msgstr "Fermé"
#: allianceauth/templates/allianceauth/admin-status/overview.html:27
#: allianceauth/templates/allianceauth/admin-status/overview.html:24
msgid "No notifications at this time"
msgstr "Aucune notification pour le moment"
#: allianceauth/templates/allianceauth/admin-status/overview.html:36
#: allianceauth/templates/allianceauth/admin-status/overview.html:33
msgid "Powered by GitLab"
msgstr "Propulsé par Gitlab"
#: allianceauth/templates/allianceauth/admin-status/overview.html:42
#: allianceauth/templates/allianceauth/admin-status/overview.html:39
msgid "Support Discord"
msgstr "Support Discord"
#: allianceauth/templates/allianceauth/admin-status/overview.html:59
#: allianceauth/templates/allianceauth/admin-status/overview.html:63
#: allianceauth/templates/allianceauth/admin-status/overview.html:53
#: allianceauth/templates/allianceauth/admin-status/overview.html:57
msgid "Software Version"
msgstr "Version du logiciel"
#: allianceauth/templates/allianceauth/admin-status/overview.html:66
#: allianceauth/templates/allianceauth/admin-status/overview.html:60
msgid "Current"
msgstr "Actuelle"
#: allianceauth/templates/allianceauth/admin-status/overview.html:73
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Latest Stable"
msgstr "Dernière version stable"
#: allianceauth/templates/allianceauth/admin-status/overview.html:78
#: allianceauth/templates/allianceauth/admin-status/overview.html:72
msgid "Update available"
msgstr "Mise à jour disponible"
#: allianceauth/templates/allianceauth/admin-status/overview.html:86
#: allianceauth/templates/allianceauth/admin-status/overview.html:80
msgid "Latest Pre-Release"
msgstr "Dernière Pre-Release"
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
#: allianceauth/templates/allianceauth/admin-status/overview.html:85
msgid "Pre-Release available"
msgstr "Pre-Release disponible"
#: allianceauth/templates/allianceauth/admin-status/overview.html:102
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
msgid "Task Queue"
msgstr "File d'attente des tâches"
#: allianceauth/templates/allianceauth/admin-status/overview.html:107
#: allianceauth/templates/allianceauth/admin-status/overview.html:100
#, python-format
msgid ""
"\n"
@@ -2539,11 +2623,11 @@ msgstr ""
"\n"
" Status de %(total)s tâches traitées • %(latest)s restantes"
#: allianceauth/templates/allianceauth/admin-status/overview.html:123
#: allianceauth/templates/allianceauth/admin-status/overview.html:116
msgid "running"
msgstr "en cours d'exécution"
#: allianceauth/templates/allianceauth/admin-status/overview.html:124
#: allianceauth/templates/allianceauth/admin-status/overview.html:117
msgid "queued"
msgstr "en attente"
@@ -2572,114 +2656,216 @@ msgstr "Activer navigation"
msgid "Select Theme"
msgstr "Sélectionner un thème"
#: allianceauth/timerboard/form.py:53
#: allianceauth/timerboard/templates/timerboard/timertable.html:172
msgid "Other"
msgstr "Autre"
#: allianceauth/timerboard/form.py:54
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:44
msgid "Friendly"
msgstr "Amical"
#: allianceauth/timerboard/form.py:55
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Hostile"
msgstr "Hostile"
#: allianceauth/timerboard/form.py:56
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Neutral"
msgstr "Neutre"
#: allianceauth/timerboard/form.py:58
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:13
#: allianceauth/timerboard/form.py:36
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/timertable.html:7
msgid "Details"
msgstr "Details"
#: allianceauth/timerboard/form.py:60
#: allianceauth/timerboard/form.py:38
msgid "Planet/Moon"
msgstr "Planète/Lune"
#: allianceauth/timerboard/form.py:61
#: allianceauth/timerboard/form.py:39
msgid "Structure Type"
msgstr "Type de structure"
#: allianceauth/timerboard/form.py:62
#: allianceauth/timerboard/form.py:40
msgid "Timer Type"
msgstr "Type de timer"
#: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/form.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:8
msgid "Objective"
msgstr "Objectif"
#: allianceauth/timerboard/form.py:64
#: allianceauth/timerboard/form.py:42
msgid "Absolute Timer"
msgstr "Minuterie absolue"
#: allianceauth/timerboard/form.py:65
#: allianceauth/timerboard/form.py:43
msgid "Date and Time"
msgstr "Date et heure"
#: allianceauth/timerboard/form.py:66
#: allianceauth/timerboard/form.py:44
msgid "Days Remaining"
msgstr "Jour restants"
#: allianceauth/timerboard/form.py:67
#: allianceauth/timerboard/form.py:45
msgid "Hours Remaining"
msgstr "Heures restantes"
#: allianceauth/timerboard/form.py:69
#: allianceauth/timerboard/form.py:47
msgid "Minutes Remaining"
msgstr "Minutes restantes"
#: allianceauth/timerboard/form.py:71
#: allianceauth/timerboard/form.py:48
msgid "Important"
msgstr "Important"
#: allianceauth/timerboard/form.py:72
#: allianceauth/timerboard/form.py:49
msgid "Corp-Restricted"
msgstr "Limité à la Corporation"
#: allianceauth/timerboard/models.py:14
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:39
#: allianceauth/timerboard/templates/timerboard/timertable.html:36
msgid "Friendly"
msgstr "Amical"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:34
msgid "Hostile"
msgstr "Hostile"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Neutral"
msgstr "Neutre"
#: allianceauth/timerboard/models.py:24
#: allianceauth/timerboard/templates/timerboard/timertable.html:48
msgid "POCO"
msgstr "POCO"
#: allianceauth/timerboard/models.py:25
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Orbital Skyhook"
msgstr ""
#: allianceauth/timerboard/models.py:26
#: allianceauth/timerboard/templates/timerboard/timertable.html:52
msgid "I-HUB"
msgstr "I-HUB"
#: allianceauth/timerboard/models.py:27
#: allianceauth/timerboard/templates/timerboard/timertable.html:55
msgid "TCU"
msgstr "TCU"
#: allianceauth/timerboard/models.py:28
#: allianceauth/timerboard/templates/timerboard/timertable.html:57
msgid "POS [S]"
msgstr "POS [S]"
#: allianceauth/timerboard/models.py:29
#: allianceauth/timerboard/templates/timerboard/timertable.html:59
msgid "POS [M]"
msgstr "POS [M]"
#: allianceauth/timerboard/models.py:30
#: allianceauth/timerboard/templates/timerboard/timertable.html:61
msgid "POS [L]"
msgstr "POS [L]"
#: allianceauth/timerboard/models.py:31
#: allianceauth/timerboard/templates/timerboard/timertable.html:63
msgid "Astrahus"
msgstr "Astrahus"
#: allianceauth/timerboard/models.py:32
#: allianceauth/timerboard/templates/timerboard/timertable.html:65
msgid "Fortizar"
msgstr "Fortizar"
#: allianceauth/timerboard/models.py:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:67
msgid "Keepstar"
msgstr "Keepstar"
#: allianceauth/timerboard/models.py:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:69
msgid "Raitaru"
msgstr "Raitaru"
#: allianceauth/timerboard/models.py:35
#: allianceauth/timerboard/templates/timerboard/timertable.html:71
msgid "Azbel"
msgstr "Azbel"
#: allianceauth/timerboard/models.py:36
#: allianceauth/timerboard/templates/timerboard/timertable.html:73
msgid "Sotiyo"
msgstr "Sotiyo"
#: allianceauth/timerboard/models.py:37
#: allianceauth/timerboard/templates/timerboard/timertable.html:75
msgid "Athanor"
msgstr "Athanor"
#: allianceauth/timerboard/models.py:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:77
msgid "Tatara"
msgstr "Tatara"
#: allianceauth/timerboard/models.py:39
msgid "Pharolux Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/models.py:40
msgid "Tenebrex Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/models.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:83
msgid "Ansiblex Jump Gate"
msgstr "Porte de saut Ansiblex"
#: allianceauth/timerboard/models.py:42
#: allianceauth/timerboard/templates/timerboard/timertable.html:85
msgid "Moon Mining Cycle"
msgstr "Cycle dextraction de lune"
#: allianceauth/timerboard/models.py:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:87
msgid "Metenox Moon Drill"
msgstr ""
#: allianceauth/timerboard/models.py:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:89
msgid "Other"
msgstr "Autre"
#: allianceauth/timerboard/models.py:51
msgid "Not Specified"
msgstr "Non Spécifié"
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/models.py:52
msgid "Shield"
msgstr "Bouclier"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/models.py:53
msgid "Armor"
msgstr "Armure"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/models.py:54
msgid "Hull"
msgstr "Coque"
#: allianceauth/timerboard/models.py:18
#: allianceauth/timerboard/models.py:55
msgid "Final"
msgstr "Final"
#: allianceauth/timerboard/models.py:19
#: allianceauth/timerboard/models.py:56
msgid "Anchoring"
msgstr "Ancrage"
#: allianceauth/timerboard/models.py:20
#: allianceauth/timerboard/models.py:57
msgid "Unanchoring"
msgstr "Désancrage"
#: allianceauth/timerboard/models.py:58
msgid "Abandoned"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:53
msgid "Upcoming Timers"
msgstr "Prochaines Échéances"
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
msgid "Timer"
msgstr "Échéances"
@@ -2723,78 +2909,14 @@ msgstr "Mettre à jour le minuteur de structure"
msgid "Structure"
msgstr "Structure"
#: allianceauth/timerboard/templates/timerboard/timertable.html:64
msgid "POCO"
msgstr "POCO"
#: allianceauth/timerboard/templates/timerboard/timertable.html:70
msgid "I-HUB"
msgstr "I-HUB"
#: allianceauth/timerboard/templates/timerboard/timertable.html:76
msgid "TCU"
msgstr "TCU"
#: allianceauth/timerboard/templates/timerboard/timertable.html:82
msgid "POS [S]"
msgstr "POS [S]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:88
msgid "POS [M]"
msgstr "POS [M]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:94
msgid "POS [L]"
msgstr "POS [L]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:100
msgid "Astrahus"
msgstr "Astrahus"
#: allianceauth/timerboard/templates/timerboard/timertable.html:106
msgid "Fortizar"
msgstr "Fortizar"
#: allianceauth/timerboard/templates/timerboard/timertable.html:112
msgid "Keepstar"
msgstr "Keepstar"
#: allianceauth/timerboard/templates/timerboard/timertable.html:118
msgid "Raitaru"
msgstr "Raitaru"
#: allianceauth/timerboard/templates/timerboard/timertable.html:124
msgid "Azbel"
msgstr "Azbel"
#: allianceauth/timerboard/templates/timerboard/timertable.html:130
msgid "Sotiyo"
msgstr "Sotiyo"
#: allianceauth/timerboard/templates/timerboard/timertable.html:136
msgid "Athanor"
msgstr "Athanor"
#: allianceauth/timerboard/templates/timerboard/timertable.html:142
msgid "Tatara"
msgstr "Tatara"
#: allianceauth/timerboard/templates/timerboard/timertable.html:148
#: allianceauth/timerboard/templates/timerboard/timertable.html:79
msgid "Cyno Beacon"
msgstr "Balise Cyno"
#: allianceauth/timerboard/templates/timerboard/timertable.html:154
#: allianceauth/timerboard/templates/timerboard/timertable.html:81
msgid "Cyno Jammer"
msgstr "Brouilleur de Cyno"
#: allianceauth/timerboard/templates/timerboard/timertable.html:160
msgid "Ansiblex Jump Gate"
msgstr "Porte de saut Ansiblex"
#: allianceauth/timerboard/templates/timerboard/timertable.html:166
msgid "Moon Mining Cycle"
msgstr "Cycle dextraction de lune"
#: allianceauth/timerboard/templates/timerboard/view.html:9
msgid "Structure Timer Management"
msgstr "Gestion des minuteurs de structure"

View File

@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-12 19:15+1000\n"
"POT-Creation-Date: 2024-10-21 12:59+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Tuz, 2024\n"
"Language-Team: Italian (Italy) (https://app.transifex.com/alliance-auth/teams/107430/it_IT/)\n"
@@ -62,66 +62,90 @@ msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr "Non ti è consentito aggiungere o rimuovere questi gruppi ristretti:%s"
#: allianceauth/authentication/models.py:71
#: allianceauth/project_template/project_name/settings/base.py:99
msgid "English"
msgstr "Inglese"
#: allianceauth/authentication/models.py:72
msgid "Czech"
msgstr ""
#: allianceauth/authentication/models.py:73
#: allianceauth/project_template/project_name/settings/base.py:101
msgid "German"
msgstr "Tedesco"
#: allianceauth/authentication/models.py:73
#: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:102
msgid "Spanish"
msgstr "Spagnolo"
#: allianceauth/authentication/models.py:74
msgid "Chinese Simplified"
msgstr "Cinese semplificato"
#: allianceauth/authentication/models.py:75
msgid "Russian"
msgstr "Russo"
#: allianceauth/authentication/models.py:76
msgid "Korean"
msgstr "Coreano"
#: allianceauth/authentication/models.py:77
msgid "French"
msgstr "Francese"
#: allianceauth/authentication/models.py:78
msgid "Japanese"
msgstr "Giapponese"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:103
msgid "Italian"
msgstr "Italiano"
#: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:104
msgid "Japanese"
msgstr "Giapponese"
#: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:105
msgid "Korean"
msgstr "Coreano"
#: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:106
msgid "French"
msgstr "Francese"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:109
msgid "Russian"
msgstr "Russo"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:107
msgid "Dutch"
msgstr ""
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:108
msgid "Polish"
msgstr ""
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:110
msgid "Ukrainian"
msgstr "Ucraino"
#: allianceauth/authentication/models.py:96
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:111
msgid "Simplified Chinese"
msgstr ""
#: allianceauth/authentication/models.py:99
#: allianceauth/menu/templates/menu/menu-user.html:42
msgid "Language"
msgstr "Lingua"
#: allianceauth/authentication/models.py:101
#: allianceauth/authentication/models.py:104
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr "Modalità scura"
#: allianceauth/authentication/models.py:105
#: allianceauth/authentication/models.py:108
#: allianceauth/menu/templates/menu/menu-user.html:46
msgid "Theme"
msgstr "Tema"
#: allianceauth/authentication/models.py:122
#: allianceauth/authentication/models.py:125
#, python-format
msgid "State changed to: %s"
msgstr "Stato modificato a: %s"
#: allianceauth/authentication/models.py:123
#: allianceauth/authentication/models.py:126
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr "Il tuo stato utente è ora: %(state)s"
@@ -133,27 +157,27 @@ msgstr "Il tuo stato utente è ora: %(state)s"
msgid "Dashboard"
msgstr "Pannello di controllo"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:7
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:5
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:33
#: allianceauth/hrapplications/templates/hrapplications/view.html:54
msgid "Characters"
msgstr "Personaggi"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:13
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:11
#: 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:6
msgid "Add Character"
msgstr "Aggiungi personaggio"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:16
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:17
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: 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:12
msgid "Change Main"
msgstr "Cambia personaggio principale"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:89
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:23
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:31
@@ -162,12 +186,12 @@ msgstr "Cambia personaggio principale"
msgid "Name"
msgstr "Nome"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:25
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:23
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:33
msgid "Corp"
msgstr "Corp"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:26
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/corputils/templates/corputils/corpstats.html:125
#: allianceauth/hrapplications/templates/hrapplications/view.html:63
msgid "Alliance"
@@ -177,7 +201,7 @@ msgstr "Alleanza"
msgid "Membership"
msgstr "Appartenenza"
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:8
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:10
msgid "State:"
msgstr "Stato:"
@@ -424,6 +448,19 @@ msgstr ""
"Impossibile raccogliere le statistiche sulla corporazione con il token "
"selezionato."
#: allianceauth/custom_css/apps.py:13 allianceauth/custom_css/models.py:36
#: allianceauth/custom_css/models.py:37 allianceauth/custom_css/models.py:47
msgid "Custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:25
msgid "Your custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:26
msgid "This CSS will be added to the site after the default CSS."
msgstr ""
#: allianceauth/fleetactivitytracking/auth_hooks.py:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkcreate.html:11
@@ -512,13 +549,14 @@ msgstr "Elimina fat"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35
#: allianceauth/hrapplications/templates/hrapplications/view.html:41
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30
msgid "User"
msgstr "Utente"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:37
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:42
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:59
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:37
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/timertable.html:9
msgid "System"
msgstr "Sistema"
@@ -711,7 +749,6 @@ msgstr "Gestione gruppi"
#: allianceauth/groupmanagement/auth_hooks.py:51
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34
#: allianceauth/templates/allianceauth/side-menu.html:15
msgid "Groups"
msgstr "Gruppi"
@@ -867,7 +904,7 @@ msgstr "Richiedente"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
msgid "Type"
msgstr "Tipo"
@@ -959,7 +996,7 @@ msgid "Hidden"
msgstr "Nascosto"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:19
#: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Open"
msgstr "Aperto"
@@ -1446,16 +1483,16 @@ msgstr "Notifiche"
msgid "Super User"
msgstr "Super User"
#: allianceauth/menu/templates/menu/menu-user.html:68
#: allianceauth/menu/templates/menu/menu-user.html:70
#: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin"
msgstr "Amministratore"
#: allianceauth/menu/templates/menu/menu-user.html:80
#: allianceauth/menu/templates/menu/menu-user.html:82
msgid "Sign Out"
msgstr "Sign Out"
#: allianceauth/menu/templates/menu/menu-user.html:84
#: allianceauth/menu/templates/menu/menu-user.html:86
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18
msgid "Sign In"
@@ -1605,7 +1642,7 @@ msgid "Form Up System"
msgstr "Sistema di partenza"
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18
msgid "EVE Time"
msgstr ""
@@ -1802,17 +1839,17 @@ msgstr ""
"pensi questo sia un errore per favore contatta un ammistratore."
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:20
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:22
msgid "Activate"
msgstr "Attivare"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:34
msgid "Reset Password"
msgstr "Reset Password"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:40
msgid "Deactivate"
msgstr "Deattivare"
@@ -1899,15 +1936,61 @@ msgstr "Imposta password IPSuite4."
msgid "Deactivated IPSuite4 account."
msgstr "Disattiva account IPSuite4."
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6
msgid "Mumble"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10
msgid "Mumble History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22
msgid "Server Connection History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31
msgid "Displayed Name"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32
msgid "Release"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67
msgid "Version"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34
msgid "Last Connect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35
msgid "Last Disconnect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59
msgid "Server Connection Breakdown"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68
msgid "Number"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28
#: allianceauth/services/templates/services/service_password.html:26
msgid "Set Password"
msgstr "Imposta password"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:44
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:46
msgid "Connect"
msgstr "Connect"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52
msgid "Mumble Connection History"
msgstr ""
#: allianceauth/services/modules/openfire/auth_hooks.py:27
msgid "Jabber"
msgstr "Jabber"
@@ -2480,56 +2563,56 @@ msgstr "Salvati i cambiamenti al SRP della flotta %(fleetname)s"
msgid "Your Server received an ESI error response code of "
msgstr "Il server ha ricevuto un codice di risposta di errore ESI pari a "
#: allianceauth/templates/allianceauth/admin-status/overview.html:11
#: allianceauth/templates/allianceauth/admin-status/overview.html:8
msgid "Alliance Auth Notifications"
msgstr "Notifiche Auth Alleanza"
#: allianceauth/templates/allianceauth/admin-status/overview.html:21
#: allianceauth/templates/allianceauth/admin-status/overview.html:18
msgid "Closed"
msgstr "Chiuso"
#: allianceauth/templates/allianceauth/admin-status/overview.html:27
#: allianceauth/templates/allianceauth/admin-status/overview.html:24
msgid "No notifications at this time"
msgstr "Nessuna notifica al momento"
#: allianceauth/templates/allianceauth/admin-status/overview.html:36
#: allianceauth/templates/allianceauth/admin-status/overview.html:33
msgid "Powered by GitLab"
msgstr "Powered by GitLab"
#: allianceauth/templates/allianceauth/admin-status/overview.html:42
#: allianceauth/templates/allianceauth/admin-status/overview.html:39
msgid "Support Discord"
msgstr "Discord di supporto"
#: allianceauth/templates/allianceauth/admin-status/overview.html:59
#: allianceauth/templates/allianceauth/admin-status/overview.html:63
#: allianceauth/templates/allianceauth/admin-status/overview.html:53
#: allianceauth/templates/allianceauth/admin-status/overview.html:57
msgid "Software Version"
msgstr "Versione del software"
#: allianceauth/templates/allianceauth/admin-status/overview.html:66
#: allianceauth/templates/allianceauth/admin-status/overview.html:60
msgid "Current"
msgstr "Attuale"
#: allianceauth/templates/allianceauth/admin-status/overview.html:73
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Latest Stable"
msgstr "Ultima versione stabile"
#: allianceauth/templates/allianceauth/admin-status/overview.html:78
#: allianceauth/templates/allianceauth/admin-status/overview.html:72
msgid "Update available"
msgstr "Aggiornamento disponibile"
#: allianceauth/templates/allianceauth/admin-status/overview.html:86
#: allianceauth/templates/allianceauth/admin-status/overview.html:80
msgid "Latest Pre-Release"
msgstr "Ultima versione preliminare"
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
#: allianceauth/templates/allianceauth/admin-status/overview.html:85
msgid "Pre-Release available"
msgstr "Versione preliminare disponibile"
#: allianceauth/templates/allianceauth/admin-status/overview.html:102
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
msgid "Task Queue"
msgstr "Coda delle attività"
#: allianceauth/templates/allianceauth/admin-status/overview.html:107
#: allianceauth/templates/allianceauth/admin-status/overview.html:100
#, python-format
msgid ""
"\n"
@@ -2537,11 +2620,11 @@ msgid ""
" "
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:123
#: allianceauth/templates/allianceauth/admin-status/overview.html:116
msgid "running"
msgstr "in esecuzione"
#: allianceauth/templates/allianceauth/admin-status/overview.html:124
#: allianceauth/templates/allianceauth/admin-status/overview.html:117
msgid "queued"
msgstr "in coda"
@@ -2570,114 +2653,216 @@ msgstr "Attiva/disattiva navigazione"
msgid "Select Theme"
msgstr "Seleziona Tema"
#: allianceauth/timerboard/form.py:53
#: allianceauth/timerboard/templates/timerboard/timertable.html:172
msgid "Other"
msgstr "Altro"
#: allianceauth/timerboard/form.py:54
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:44
msgid "Friendly"
msgstr "Amichevole"
#: allianceauth/timerboard/form.py:55
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Hostile"
msgstr "Ostile"
#: allianceauth/timerboard/form.py:56
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Neutral"
msgstr "Neutrale"
#: allianceauth/timerboard/form.py:58
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:13
#: allianceauth/timerboard/form.py:36
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/timertable.html:7
msgid "Details"
msgstr "Dettagli"
#: allianceauth/timerboard/form.py:60
#: allianceauth/timerboard/form.py:38
msgid "Planet/Moon"
msgstr "Pianeta/Luna"
#: allianceauth/timerboard/form.py:61
#: allianceauth/timerboard/form.py:39
msgid "Structure Type"
msgstr "Tipologia di struttura"
#: allianceauth/timerboard/form.py:62
#: allianceauth/timerboard/form.py:40
msgid "Timer Type"
msgstr "Tipologia di timer"
#: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/form.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:8
msgid "Objective"
msgstr "Obiettivo"
#: allianceauth/timerboard/form.py:64
#: allianceauth/timerboard/form.py:42
msgid "Absolute Timer"
msgstr "Timer Assoluto"
#: allianceauth/timerboard/form.py:65
#: allianceauth/timerboard/form.py:43
msgid "Date and Time"
msgstr "Data e Ora"
#: allianceauth/timerboard/form.py:66
#: allianceauth/timerboard/form.py:44
msgid "Days Remaining"
msgstr "Giorni rimanenti"
#: allianceauth/timerboard/form.py:67
#: allianceauth/timerboard/form.py:45
msgid "Hours Remaining"
msgstr "Ore rimanenti"
#: allianceauth/timerboard/form.py:69
#: allianceauth/timerboard/form.py:47
msgid "Minutes Remaining"
msgstr "Minuti rimanenti "
#: allianceauth/timerboard/form.py:71
#: allianceauth/timerboard/form.py:48
msgid "Important"
msgstr "Importante"
#: allianceauth/timerboard/form.py:72
#: allianceauth/timerboard/form.py:49
msgid "Corp-Restricted"
msgstr "Limitato alla corporazione"
#: allianceauth/timerboard/models.py:14
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:39
#: allianceauth/timerboard/templates/timerboard/timertable.html:36
msgid "Friendly"
msgstr "Amichevole"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:34
msgid "Hostile"
msgstr "Ostile"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Neutral"
msgstr "Neutrale"
#: allianceauth/timerboard/models.py:24
#: allianceauth/timerboard/templates/timerboard/timertable.html:48
msgid "POCO"
msgstr "POCO"
#: allianceauth/timerboard/models.py:25
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Orbital Skyhook"
msgstr ""
#: allianceauth/timerboard/models.py:26
#: allianceauth/timerboard/templates/timerboard/timertable.html:52
msgid "I-HUB"
msgstr "I-HUB"
#: allianceauth/timerboard/models.py:27
#: allianceauth/timerboard/templates/timerboard/timertable.html:55
msgid "TCU"
msgstr "TCU"
#: allianceauth/timerboard/models.py:28
#: allianceauth/timerboard/templates/timerboard/timertable.html:57
msgid "POS [S]"
msgstr "POS [S]"
#: allianceauth/timerboard/models.py:29
#: allianceauth/timerboard/templates/timerboard/timertable.html:59
msgid "POS [M]"
msgstr "POS [M]"
#: allianceauth/timerboard/models.py:30
#: allianceauth/timerboard/templates/timerboard/timertable.html:61
msgid "POS [L]"
msgstr "POS [L]"
#: allianceauth/timerboard/models.py:31
#: allianceauth/timerboard/templates/timerboard/timertable.html:63
msgid "Astrahus"
msgstr "Astrahus"
#: allianceauth/timerboard/models.py:32
#: allianceauth/timerboard/templates/timerboard/timertable.html:65
msgid "Fortizar"
msgstr "Fortizar"
#: allianceauth/timerboard/models.py:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:67
msgid "Keepstar"
msgstr "Keepstar"
#: allianceauth/timerboard/models.py:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:69
msgid "Raitaru"
msgstr "Raitaru"
#: allianceauth/timerboard/models.py:35
#: allianceauth/timerboard/templates/timerboard/timertable.html:71
msgid "Azbel"
msgstr "Azbel"
#: allianceauth/timerboard/models.py:36
#: allianceauth/timerboard/templates/timerboard/timertable.html:73
msgid "Sotiyo"
msgstr "Sotiyo"
#: allianceauth/timerboard/models.py:37
#: allianceauth/timerboard/templates/timerboard/timertable.html:75
msgid "Athanor"
msgstr "Athanor"
#: allianceauth/timerboard/models.py:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:77
msgid "Tatara"
msgstr "Tatara"
#: allianceauth/timerboard/models.py:39
msgid "Pharolux Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/models.py:40
msgid "Tenebrex Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/models.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:83
msgid "Ansiblex Jump Gate"
msgstr "Ansiblex Jump Gate"
#: allianceauth/timerboard/models.py:42
#: allianceauth/timerboard/templates/timerboard/timertable.html:85
msgid "Moon Mining Cycle"
msgstr "Moon Mining Cycle"
#: allianceauth/timerboard/models.py:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:87
msgid "Metenox Moon Drill"
msgstr ""
#: allianceauth/timerboard/models.py:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:89
msgid "Other"
msgstr "Altro"
#: allianceauth/timerboard/models.py:51
msgid "Not Specified"
msgstr "Non specificato"
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/models.py:52
msgid "Shield"
msgstr "Scudo"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/models.py:53
msgid "Armor"
msgstr "Armatura"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/models.py:54
msgid "Hull"
msgstr "Struttura"
#: allianceauth/timerboard/models.py:18
#: allianceauth/timerboard/models.py:55
msgid "Final"
msgstr "Ultimo"
#: allianceauth/timerboard/models.py:19
#: allianceauth/timerboard/models.py:56
msgid "Anchoring"
msgstr "In ancoraggio"
#: allianceauth/timerboard/models.py:20
#: allianceauth/timerboard/models.py:57
msgid "Unanchoring"
msgstr "In disancoraggio"
#: allianceauth/timerboard/models.py:58
msgid "Abandoned"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:53
msgid "Upcoming Timers"
msgstr "Prossimi Timer"
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
msgid "Timer"
msgstr "Timer"
@@ -2721,78 +2906,14 @@ msgstr "Aggiorna timer struttura"
msgid "Structure"
msgstr "Struttura"
#: allianceauth/timerboard/templates/timerboard/timertable.html:64
msgid "POCO"
msgstr "POCO"
#: allianceauth/timerboard/templates/timerboard/timertable.html:70
msgid "I-HUB"
msgstr "I-HUB"
#: allianceauth/timerboard/templates/timerboard/timertable.html:76
msgid "TCU"
msgstr "TCU"
#: allianceauth/timerboard/templates/timerboard/timertable.html:82
msgid "POS [S]"
msgstr "POS [S]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:88
msgid "POS [M]"
msgstr "POS [M]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:94
msgid "POS [L]"
msgstr "POS [L]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:100
msgid "Astrahus"
msgstr "Astrahus"
#: allianceauth/timerboard/templates/timerboard/timertable.html:106
msgid "Fortizar"
msgstr "Fortizar"
#: allianceauth/timerboard/templates/timerboard/timertable.html:112
msgid "Keepstar"
msgstr "Keepstar"
#: allianceauth/timerboard/templates/timerboard/timertable.html:118
msgid "Raitaru"
msgstr "Raitaru"
#: allianceauth/timerboard/templates/timerboard/timertable.html:124
msgid "Azbel"
msgstr "Azbel"
#: allianceauth/timerboard/templates/timerboard/timertable.html:130
msgid "Sotiyo"
msgstr "Sotiyo"
#: allianceauth/timerboard/templates/timerboard/timertable.html:136
msgid "Athanor"
msgstr "Athanor"
#: allianceauth/timerboard/templates/timerboard/timertable.html:142
msgid "Tatara"
msgstr "Tatara"
#: allianceauth/timerboard/templates/timerboard/timertable.html:148
#: allianceauth/timerboard/templates/timerboard/timertable.html:79
msgid "Cyno Beacon"
msgstr "Cyno Beacon"
#: allianceauth/timerboard/templates/timerboard/timertable.html:154
#: allianceauth/timerboard/templates/timerboard/timertable.html:81
msgid "Cyno Jammer"
msgstr "Cyno Jammer"
#: allianceauth/timerboard/templates/timerboard/timertable.html:160
msgid "Ansiblex Jump Gate"
msgstr "Ansiblex Jump Gate"
#: allianceauth/timerboard/templates/timerboard/timertable.html:166
msgid "Moon Mining Cycle"
msgstr "Moon Mining Cycle"
#: allianceauth/timerboard/templates/timerboard/view.html:9
msgid "Structure Timer Management"
msgstr "Gestione timer strutture"

View File

@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-12 19:15+1000\n"
"POT-Creation-Date: 2024-10-21 12:59+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: kotaneko, 2024\n"
"Language-Team: Japanese (https://app.transifex.com/alliance-auth/teams/107430/ja/)\n"
@@ -57,66 +57,90 @@ msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr "これらの制限付きグループを追加または削除することはできません。%s"
#: allianceauth/authentication/models.py:71
#: allianceauth/project_template/project_name/settings/base.py:99
msgid "English"
msgstr "英語"
#: allianceauth/authentication/models.py:72
msgid "Czech"
msgstr ""
#: allianceauth/authentication/models.py:73
#: allianceauth/project_template/project_name/settings/base.py:101
msgid "German"
msgstr "ドイツ語"
#: allianceauth/authentication/models.py:73
#: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:102
msgid "Spanish"
msgstr "スペイン語"
#: allianceauth/authentication/models.py:74
msgid "Chinese Simplified"
msgstr "中国語 簡体字"
#: allianceauth/authentication/models.py:75
msgid "Russian"
msgstr "ロシア語"
#: allianceauth/authentication/models.py:76
msgid "Korean"
msgstr "韓国語"
#: allianceauth/authentication/models.py:77
msgid "French"
msgstr "フランス語"
#: allianceauth/authentication/models.py:78
msgid "Japanese"
msgstr "日本語"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:103
msgid "Italian"
msgstr "イタリア語"
#: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:104
msgid "Japanese"
msgstr "日本語"
#: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:105
msgid "Korean"
msgstr "韓国語"
#: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:106
msgid "French"
msgstr "フランス語"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:109
msgid "Russian"
msgstr "ロシア語"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:107
msgid "Dutch"
msgstr ""
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:108
msgid "Polish"
msgstr ""
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:110
msgid "Ukrainian"
msgstr "ウクライナ語"
#: allianceauth/authentication/models.py:96
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:111
msgid "Simplified Chinese"
msgstr ""
#: allianceauth/authentication/models.py:99
#: allianceauth/menu/templates/menu/menu-user.html:42
msgid "Language"
msgstr "言語"
#: allianceauth/authentication/models.py:101
#: allianceauth/authentication/models.py:104
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr "ナイトモード"
#: allianceauth/authentication/models.py:105
#: allianceauth/authentication/models.py:108
#: allianceauth/menu/templates/menu/menu-user.html:46
msgid "Theme"
msgstr "テーマ"
#: allianceauth/authentication/models.py:122
#: allianceauth/authentication/models.py:125
#, python-format
msgid "State changed to: %s"
msgstr "分類が%sに変更されました。"
#: allianceauth/authentication/models.py:123
#: allianceauth/authentication/models.py:126
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr "あなたの分類は%(state)sになりました。"
@@ -128,27 +152,27 @@ msgstr "あなたの分類は%(state)sになりました。"
msgid "Dashboard"
msgstr "ダッシュボード"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:7
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:5
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:33
#: allianceauth/hrapplications/templates/hrapplications/view.html:54
msgid "Characters"
msgstr "キャラクター"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:13
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:11
#: 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:6
msgid "Add Character"
msgstr "キャラクターを追加"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:16
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:17
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: 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:12
msgid "Change Main"
msgstr "メンキャラクターを変更"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:89
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:23
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:31
@@ -157,12 +181,12 @@ msgstr "メンキャラクターを変更"
msgid "Name"
msgstr "名前"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:25
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:23
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:33
msgid "Corp"
msgstr "コーポ"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:26
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/corputils/templates/corputils/corpstats.html:125
#: allianceauth/hrapplications/templates/hrapplications/view.html:63
msgid "Alliance"
@@ -172,7 +196,7 @@ msgstr "アライアンス"
msgid "Membership"
msgstr "メンバーシップ"
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:8
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:10
msgid "State:"
msgstr "状態:"
@@ -407,6 +431,19 @@ msgstr "選択されたCorpはすでにStatistics Moduleを導入済みです。
msgid "Failed to gather corporation statistics with selected token."
msgstr "選択されたTokenではCorporation Statisticsを取得できませんでした。"
#: allianceauth/custom_css/apps.py:13 allianceauth/custom_css/models.py:36
#: allianceauth/custom_css/models.py:37 allianceauth/custom_css/models.py:47
msgid "Custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:25
msgid "Your custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:26
msgid "This CSS will be added to the site after the default CSS."
msgstr ""
#: allianceauth/fleetactivitytracking/auth_hooks.py:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkcreate.html:11
@@ -494,13 +531,14 @@ msgstr "Fat-Linkを削除"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35
#: allianceauth/hrapplications/templates/hrapplications/view.html:41
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30
msgid "User"
msgstr "ユーザ"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:37
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:42
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:59
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:37
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/timertable.html:9
msgid "System"
msgstr "星系"
@@ -687,7 +725,6 @@ msgstr "グループ管理"
#: allianceauth/groupmanagement/auth_hooks.py:51
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34
#: allianceauth/templates/allianceauth/side-menu.html:15
msgid "Groups"
msgstr "グループ"
@@ -827,7 +864,7 @@ msgstr "依頼者"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
msgid "Type"
msgstr "タイプ"
@@ -919,7 +956,7 @@ msgid "Hidden"
msgstr "閉じる"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:19
#: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Open"
msgstr "開く"
@@ -1395,16 +1432,16 @@ msgstr "通知"
msgid "Super User"
msgstr "スーパーユーザ"
#: allianceauth/menu/templates/menu/menu-user.html:68
#: allianceauth/menu/templates/menu/menu-user.html:70
#: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin"
msgstr "管理者"
#: allianceauth/menu/templates/menu/menu-user.html:80
#: allianceauth/menu/templates/menu/menu-user.html:82
msgid "Sign Out"
msgstr "サインアウト"
#: allianceauth/menu/templates/menu/menu-user.html:84
#: allianceauth/menu/templates/menu/menu-user.html:86
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18
msgid "Sign In"
@@ -1554,7 +1591,7 @@ msgid "Form Up System"
msgstr "フォームアップ星系"
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18
msgid "EVE Time"
msgstr "EVE内時間"
@@ -1750,17 +1787,17 @@ msgstr ""
"DiscordアカウントはAuthによって自動的に無効化されました。これが何らかの間違いによるものだと思われる場合は、管理者に連絡してください。"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:20
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:22
msgid "Activate"
msgstr "有効化"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:34
msgid "Reset Password"
msgstr "パスワードをリセット"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:40
msgid "Deactivate"
msgstr "非アクティブ化"
@@ -1841,15 +1878,61 @@ msgstr "IPSuite4 のパスワードを設定します。"
msgid "Deactivated IPSuite4 account."
msgstr "IPSuite4 アカウントを非アクティブ化しました。"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6
msgid "Mumble"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10
msgid "Mumble History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22
msgid "Server Connection History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31
msgid "Displayed Name"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32
msgid "Release"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67
msgid "Version"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34
msgid "Last Connect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35
msgid "Last Disconnect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59
msgid "Server Connection Breakdown"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68
msgid "Number"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28
#: allianceauth/services/templates/services/service_password.html:26
msgid "Set Password"
msgstr "パスワード設定"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:44
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:46
msgid "Connect"
msgstr "接続"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52
msgid "Mumble Connection History"
msgstr ""
#: allianceauth/services/modules/openfire/auth_hooks.py:27
msgid "Jabber"
msgstr "Jabber"
@@ -2413,56 +2496,56 @@ msgstr "SRP フリートへの変更を保存 %(fleetname)s"
msgid "Your Server received an ESI error response code of "
msgstr "サーバーが ESI エラー応答コードを受信しました "
#: allianceauth/templates/allianceauth/admin-status/overview.html:11
#: allianceauth/templates/allianceauth/admin-status/overview.html:8
msgid "Alliance Auth Notifications"
msgstr "アライアンスAuth 通知"
#: allianceauth/templates/allianceauth/admin-status/overview.html:21
#: allianceauth/templates/allianceauth/admin-status/overview.html:18
msgid "Closed"
msgstr "クローズド"
#: allianceauth/templates/allianceauth/admin-status/overview.html:27
#: allianceauth/templates/allianceauth/admin-status/overview.html:24
msgid "No notifications at this time"
msgstr "現時点では通知はありません"
#: allianceauth/templates/allianceauth/admin-status/overview.html:36
#: allianceauth/templates/allianceauth/admin-status/overview.html:33
msgid "Powered by GitLab"
msgstr "Powered by GitLab"
#: allianceauth/templates/allianceauth/admin-status/overview.html:42
#: allianceauth/templates/allianceauth/admin-status/overview.html:39
msgid "Support Discord"
msgstr "サポートディスコード"
#: allianceauth/templates/allianceauth/admin-status/overview.html:59
#: allianceauth/templates/allianceauth/admin-status/overview.html:63
#: allianceauth/templates/allianceauth/admin-status/overview.html:53
#: allianceauth/templates/allianceauth/admin-status/overview.html:57
msgid "Software Version"
msgstr "ソフトウェアバージョン"
#: allianceauth/templates/allianceauth/admin-status/overview.html:66
#: allianceauth/templates/allianceauth/admin-status/overview.html:60
msgid "Current"
msgstr "現在"
#: allianceauth/templates/allianceauth/admin-status/overview.html:73
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Latest Stable"
msgstr "最新安定版"
#: allianceauth/templates/allianceauth/admin-status/overview.html:78
#: allianceauth/templates/allianceauth/admin-status/overview.html:72
msgid "Update available"
msgstr "アップデート可能"
#: allianceauth/templates/allianceauth/admin-status/overview.html:86
#: allianceauth/templates/allianceauth/admin-status/overview.html:80
msgid "Latest Pre-Release"
msgstr "最新のプレリリース"
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
#: allianceauth/templates/allianceauth/admin-status/overview.html:85
msgid "Pre-Release available"
msgstr "プレリリース利用可能"
#: allianceauth/templates/allianceauth/admin-status/overview.html:102
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
msgid "Task Queue"
msgstr "タスク待ち"
#: allianceauth/templates/allianceauth/admin-status/overview.html:107
#: allianceauth/templates/allianceauth/admin-status/overview.html:100
#, python-format
msgid ""
"\n"
@@ -2473,11 +2556,11 @@ msgstr ""
" ステータス %(total)s 処理済みタスク • 残り %(latest)s\n"
" "
#: allianceauth/templates/allianceauth/admin-status/overview.html:123
#: allianceauth/templates/allianceauth/admin-status/overview.html:116
msgid "running"
msgstr "実行中"
#: allianceauth/templates/allianceauth/admin-status/overview.html:124
#: allianceauth/templates/allianceauth/admin-status/overview.html:117
msgid "queued"
msgstr "実行待ち"
@@ -2506,114 +2589,216 @@ msgstr "ナビゲーションを切り替え"
msgid "Select Theme"
msgstr "テーマを選択"
#: allianceauth/timerboard/form.py:53
#: allianceauth/timerboard/templates/timerboard/timertable.html:172
msgid "Other"
msgstr "その他"
#: allianceauth/timerboard/form.py:54
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:44
msgid "Friendly"
msgstr "味方"
#: allianceauth/timerboard/form.py:55
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Hostile"
msgstr "敵性"
#: allianceauth/timerboard/form.py:56
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Neutral"
msgstr "中立"
#: allianceauth/timerboard/form.py:58
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:13
#: allianceauth/timerboard/form.py:36
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/timertable.html:7
msgid "Details"
msgstr "詳細"
#: allianceauth/timerboard/form.py:60
#: allianceauth/timerboard/form.py:38
msgid "Planet/Moon"
msgstr "惑星/月"
#: allianceauth/timerboard/form.py:61
#: allianceauth/timerboard/form.py:39
msgid "Structure Type"
msgstr "ストラクチャタイプ"
#: allianceauth/timerboard/form.py:62
#: allianceauth/timerboard/form.py:40
msgid "Timer Type"
msgstr "タイマータイプ"
#: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/form.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:8
msgid "Objective"
msgstr "目標"
#: allianceauth/timerboard/form.py:64
#: allianceauth/timerboard/form.py:42
msgid "Absolute Timer"
msgstr "アブソルートタイマー"
#: allianceauth/timerboard/form.py:65
#: allianceauth/timerboard/form.py:43
msgid "Date and Time"
msgstr "日付と時刻"
#: allianceauth/timerboard/form.py:66
#: allianceauth/timerboard/form.py:44
msgid "Days Remaining"
msgstr "残り日数"
#: allianceauth/timerboard/form.py:67
#: allianceauth/timerboard/form.py:45
msgid "Hours Remaining"
msgstr "残り時間"
#: allianceauth/timerboard/form.py:69
#: allianceauth/timerboard/form.py:47
msgid "Minutes Remaining"
msgstr "残り分数"
#: allianceauth/timerboard/form.py:71
#: allianceauth/timerboard/form.py:48
msgid "Important"
msgstr "重要"
#: allianceauth/timerboard/form.py:72
#: allianceauth/timerboard/form.py:49
msgid "Corp-Restricted"
msgstr "コーポレーション制限付き"
#: allianceauth/timerboard/models.py:14
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:39
#: allianceauth/timerboard/templates/timerboard/timertable.html:36
msgid "Friendly"
msgstr "味方"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:34
msgid "Hostile"
msgstr "敵性"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Neutral"
msgstr "中立"
#: allianceauth/timerboard/models.py:24
#: allianceauth/timerboard/templates/timerboard/timertable.html:48
msgid "POCO"
msgstr "POCO"
#: allianceauth/timerboard/models.py:25
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Orbital Skyhook"
msgstr ""
#: allianceauth/timerboard/models.py:26
#: allianceauth/timerboard/templates/timerboard/timertable.html:52
msgid "I-HUB"
msgstr "I-HUB"
#: allianceauth/timerboard/models.py:27
#: allianceauth/timerboard/templates/timerboard/timertable.html:55
msgid "TCU"
msgstr "TCU"
#: allianceauth/timerboard/models.py:28
#: allianceauth/timerboard/templates/timerboard/timertable.html:57
msgid "POS [S]"
msgstr "POS [S]"
#: allianceauth/timerboard/models.py:29
#: allianceauth/timerboard/templates/timerboard/timertable.html:59
msgid "POS [M]"
msgstr "POS [M]"
#: allianceauth/timerboard/models.py:30
#: allianceauth/timerboard/templates/timerboard/timertable.html:61
msgid "POS [L]"
msgstr "POS [L]"
#: allianceauth/timerboard/models.py:31
#: allianceauth/timerboard/templates/timerboard/timertable.html:63
msgid "Astrahus"
msgstr "Astrahus"
#: allianceauth/timerboard/models.py:32
#: allianceauth/timerboard/templates/timerboard/timertable.html:65
msgid "Fortizar"
msgstr "Fortizar"
#: allianceauth/timerboard/models.py:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:67
msgid "Keepstar"
msgstr "Keepstar"
#: allianceauth/timerboard/models.py:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:69
msgid "Raitaru"
msgstr "Raitaru"
#: allianceauth/timerboard/models.py:35
#: allianceauth/timerboard/templates/timerboard/timertable.html:71
msgid "Azbel"
msgstr "Azbel"
#: allianceauth/timerboard/models.py:36
#: allianceauth/timerboard/templates/timerboard/timertable.html:73
msgid "Sotiyo"
msgstr "Sotiyo"
#: allianceauth/timerboard/models.py:37
#: allianceauth/timerboard/templates/timerboard/timertable.html:75
msgid "Athanor"
msgstr "Athanor"
#: allianceauth/timerboard/models.py:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:77
msgid "Tatara"
msgstr "Tatara"
#: allianceauth/timerboard/models.py:39
msgid "Pharolux Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/models.py:40
msgid "Tenebrex Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/models.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:83
msgid "Ansiblex Jump Gate"
msgstr "Ansiblex Jump Gate"
#: allianceauth/timerboard/models.py:42
#: allianceauth/timerboard/templates/timerboard/timertable.html:85
msgid "Moon Mining Cycle"
msgstr "Moon Mining Cycle"
#: allianceauth/timerboard/models.py:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:87
msgid "Metenox Moon Drill"
msgstr ""
#: allianceauth/timerboard/models.py:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:89
msgid "Other"
msgstr "その他"
#: allianceauth/timerboard/models.py:51
msgid "Not Specified"
msgstr "指定なし"
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/models.py:52
msgid "Shield"
msgstr "シールド"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/models.py:53
msgid "Armor"
msgstr "アーマー"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/models.py:54
msgid "Hull"
msgstr "ハル"
#: allianceauth/timerboard/models.py:18
#: allianceauth/timerboard/models.py:55
msgid "Final"
msgstr "最終"
#: allianceauth/timerboard/models.py:19
#: allianceauth/timerboard/models.py:56
msgid "Anchoring"
msgstr "Anchoring"
#: allianceauth/timerboard/models.py:20
#: allianceauth/timerboard/models.py:57
msgid "Unanchoring"
msgstr "Unanchoring"
#: allianceauth/timerboard/models.py:58
msgid "Abandoned"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:53
msgid "Upcoming Timers"
msgstr "今後予定されているタイマー"
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
msgid "Timer"
msgstr "タイマー"
@@ -2657,78 +2842,14 @@ msgstr "ストラクチャタイマーを更新"
msgid "Structure"
msgstr "ストラクチャ"
#: allianceauth/timerboard/templates/timerboard/timertable.html:64
msgid "POCO"
msgstr "POCO"
#: allianceauth/timerboard/templates/timerboard/timertable.html:70
msgid "I-HUB"
msgstr "I-HUB"
#: allianceauth/timerboard/templates/timerboard/timertable.html:76
msgid "TCU"
msgstr "TCU"
#: allianceauth/timerboard/templates/timerboard/timertable.html:82
msgid "POS [S]"
msgstr "POS [S]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:88
msgid "POS [M]"
msgstr "POS [M]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:94
msgid "POS [L]"
msgstr "POS [L]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:100
msgid "Astrahus"
msgstr "Astrahus"
#: allianceauth/timerboard/templates/timerboard/timertable.html:106
msgid "Fortizar"
msgstr "Fortizar"
#: allianceauth/timerboard/templates/timerboard/timertable.html:112
msgid "Keepstar"
msgstr "Keepstar"
#: allianceauth/timerboard/templates/timerboard/timertable.html:118
msgid "Raitaru"
msgstr "Raitaru"
#: allianceauth/timerboard/templates/timerboard/timertable.html:124
msgid "Azbel"
msgstr "Azbel"
#: allianceauth/timerboard/templates/timerboard/timertable.html:130
msgid "Sotiyo"
msgstr "Sotiyo"
#: allianceauth/timerboard/templates/timerboard/timertable.html:136
msgid "Athanor"
msgstr "Athanor"
#: allianceauth/timerboard/templates/timerboard/timertable.html:142
msgid "Tatara"
msgstr "Tatara"
#: allianceauth/timerboard/templates/timerboard/timertable.html:148
#: allianceauth/timerboard/templates/timerboard/timertable.html:79
msgid "Cyno Beacon"
msgstr "Cyno Beacon"
#: allianceauth/timerboard/templates/timerboard/timertable.html:154
#: allianceauth/timerboard/templates/timerboard/timertable.html:81
msgid "Cyno Jammer"
msgstr "Cyno Jammer"
#: allianceauth/timerboard/templates/timerboard/timertable.html:160
msgid "Ansiblex Jump Gate"
msgstr "Ansiblex Jump Gate"
#: allianceauth/timerboard/templates/timerboard/timertable.html:166
msgid "Moon Mining Cycle"
msgstr "Moon Mining Cycle"
#: allianceauth/timerboard/templates/timerboard/view.html:9
msgid "Structure Timer Management"
msgstr "ストラクチャタイマー管理"

View File

@@ -5,7 +5,7 @@
#
# Translators:
# Joel Falknau <ozirascal@gmail.com>, 2023
# None None <khd1226543@gmail.com>, 2023
# Nox <khd1226543@gmail.com>, 2023
# ThatRagingKid, 2023
# Lahty <js03js70@gmail.com>, 2023
# Olgeda Choi <undead.choi@gmail.com>, 2023
@@ -18,7 +18,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-12 19:15+1000\n"
"POT-Creation-Date: 2024-10-21 12:59+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Woojin Kang, 2024\n"
"Language-Team: Korean (Korea) (https://app.transifex.com/alliance-auth/teams/107430/ko_KR/)\n"
@@ -63,66 +63,90 @@ msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr "해당 제한된 그룹을 추가하거나 제거할 수 있는 권한이 존재하지 않습니다: %s"
#: allianceauth/authentication/models.py:71
#: allianceauth/project_template/project_name/settings/base.py:99
msgid "English"
msgstr "영어"
#: allianceauth/authentication/models.py:72
msgid "Czech"
msgstr ""
#: allianceauth/authentication/models.py:73
#: allianceauth/project_template/project_name/settings/base.py:101
msgid "German"
msgstr "독일어"
#: allianceauth/authentication/models.py:73
#: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:102
msgid "Spanish"
msgstr "스페인어"
#: allianceauth/authentication/models.py:74
msgid "Chinese Simplified"
msgstr "간체자"
#: allianceauth/authentication/models.py:75
msgid "Russian"
msgstr "러시아어"
#: allianceauth/authentication/models.py:76
msgid "Korean"
msgstr "한국어"
#: allianceauth/authentication/models.py:77
msgid "French"
msgstr "프랑스어"
#: allianceauth/authentication/models.py:78
msgid "Japanese"
msgstr "일본어"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:103
msgid "Italian"
msgstr "이탈리아어"
#: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:104
msgid "Japanese"
msgstr "일본어"
#: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:105
msgid "Korean"
msgstr "한국어"
#: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:106
msgid "French"
msgstr "프랑스어"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:109
msgid "Russian"
msgstr "러시아어"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:107
msgid "Dutch"
msgstr ""
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:108
msgid "Polish"
msgstr ""
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:110
msgid "Ukrainian"
msgstr "우크라이나어"
#: allianceauth/authentication/models.py:96
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:111
msgid "Simplified Chinese"
msgstr ""
#: allianceauth/authentication/models.py:99
#: allianceauth/menu/templates/menu/menu-user.html:42
msgid "Language"
msgstr "언어"
#: allianceauth/authentication/models.py:101
#: allianceauth/authentication/models.py:104
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr "야간 모드"
#: allianceauth/authentication/models.py:105
#: allianceauth/authentication/models.py:108
#: allianceauth/menu/templates/menu/menu-user.html:46
msgid "Theme"
msgstr "테마"
#: allianceauth/authentication/models.py:122
#: allianceauth/authentication/models.py:125
#, python-format
msgid "State changed to: %s"
msgstr "상태가 %s로 변경됐습니다."
#: allianceauth/authentication/models.py:123
#: allianceauth/authentication/models.py:126
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr "사용자의 상태는 %(state)s입니다."
@@ -134,27 +158,27 @@ msgstr "사용자의 상태는 %(state)s입니다."
msgid "Dashboard"
msgstr "대시보드"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:7
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:5
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:33
#: allianceauth/hrapplications/templates/hrapplications/view.html:54
msgid "Characters"
msgstr "캐릭터"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:13
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:11
#: 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:6
msgid "Add Character"
msgstr "캐릭터 추가"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:16
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:17
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: 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:12
msgid "Change Main"
msgstr "주 캐릭터 변경"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:89
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:23
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:31
@@ -163,12 +187,12 @@ msgstr "주 캐릭터 변경"
msgid "Name"
msgstr "이름"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:25
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:23
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:33
msgid "Corp"
msgstr "코퍼레이션"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:26
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/corputils/templates/corputils/corpstats.html:125
#: allianceauth/hrapplications/templates/hrapplications/view.html:63
msgid "Alliance"
@@ -178,7 +202,7 @@ msgstr "얼라이언스"
msgid "Membership"
msgstr "멤버쉽"
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:8
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:10
msgid "State:"
msgstr "상태:"
@@ -413,6 +437,19 @@ msgstr "선택한 코퍼레이션은 이미 통계 모듈을 갖고 있습니다
msgid "Failed to gather corporation statistics with selected token."
msgstr "선택한 토큰으로 코퍼레이션 통계 수집에 실패했습니다."
#: allianceauth/custom_css/apps.py:13 allianceauth/custom_css/models.py:36
#: allianceauth/custom_css/models.py:37 allianceauth/custom_css/models.py:47
msgid "Custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:25
msgid "Your custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:26
msgid "This CSS will be added to the site after the default CSS."
msgstr ""
#: allianceauth/fleetactivitytracking/auth_hooks.py:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkcreate.html:11
@@ -500,13 +537,14 @@ msgstr "함대 활동 추적(FAT) 링크 삭제"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35
#: allianceauth/hrapplications/templates/hrapplications/view.html:41
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30
msgid "User"
msgstr "사용자"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:37
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:42
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:59
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:37
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/timertable.html:9
msgid "System"
msgstr "시스템"
@@ -695,7 +733,6 @@ msgstr "그룹 관리"
#: allianceauth/groupmanagement/auth_hooks.py:51
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34
#: allianceauth/templates/allianceauth/side-menu.html:15
msgid "Groups"
msgstr "그룹"
@@ -836,7 +873,7 @@ msgstr "요청인"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
msgid "Type"
msgstr "타입"
@@ -928,7 +965,7 @@ msgid "Hidden"
msgstr "숨김"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:19
#: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Open"
msgstr "열기"
@@ -1404,16 +1441,16 @@ msgstr "알림"
msgid "Super User"
msgstr "Super User"
#: allianceauth/menu/templates/menu/menu-user.html:68
#: allianceauth/menu/templates/menu/menu-user.html:70
#: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin"
msgstr "어드민"
#: allianceauth/menu/templates/menu/menu-user.html:80
#: allianceauth/menu/templates/menu/menu-user.html:82
msgid "Sign Out"
msgstr "탈퇴"
#: allianceauth/menu/templates/menu/menu-user.html:84
#: allianceauth/menu/templates/menu/menu-user.html:86
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18
msgid "Sign In"
@@ -1563,7 +1600,7 @@ msgid "Form Up System"
msgstr "폼업 성계"
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18
msgid "EVE Time"
msgstr "인게임 시간"
@@ -1758,17 +1795,17 @@ msgid ""
msgstr "Auth에 의해 자동으로 Discord 계정이 비활성화됐습니다. 원치 않는 사항일 경우, 관리자에게 문의해 주세요."
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:20
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:22
msgid "Activate"
msgstr "활성화"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:34
msgid "Reset Password"
msgstr "비밀번호 초기화"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:40
msgid "Deactivate"
msgstr "비활성화"
@@ -1849,15 +1886,61 @@ msgstr "IPSuite4 비밀번호 설정"
msgid "Deactivated IPSuite4 account."
msgstr "IPSuite4 계정 비활성화 완료"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6
msgid "Mumble"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10
msgid "Mumble History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22
msgid "Server Connection History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31
msgid "Displayed Name"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32
msgid "Release"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67
msgid "Version"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34
msgid "Last Connect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35
msgid "Last Disconnect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59
msgid "Server Connection Breakdown"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68
msgid "Number"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28
#: allianceauth/services/templates/services/service_password.html:26
msgid "Set Password"
msgstr "비밀번호 설정"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:44
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:46
msgid "Connect"
msgstr "연결"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52
msgid "Mumble Connection History"
msgstr ""
#: allianceauth/services/modules/openfire/auth_hooks.py:27
msgid "Jabber"
msgstr "재버"
@@ -2418,56 +2501,56 @@ msgstr "SRP 보상 요청 함대 %(fleetname)s의 변경 사항이 저장되었
msgid "Your Server received an ESI error response code of "
msgstr "당신의 서버에 ESI 에러가 발생하였습니다. 응답코드 :"
#: allianceauth/templates/allianceauth/admin-status/overview.html:11
#: allianceauth/templates/allianceauth/admin-status/overview.html:8
msgid "Alliance Auth Notifications"
msgstr "얼라이언스 Auth 알림"
#: allianceauth/templates/allianceauth/admin-status/overview.html:21
#: allianceauth/templates/allianceauth/admin-status/overview.html:18
msgid "Closed"
msgstr "닫혔음"
#: allianceauth/templates/allianceauth/admin-status/overview.html:27
#: allianceauth/templates/allianceauth/admin-status/overview.html:24
msgid "No notifications at this time"
msgstr "이번에는 알림을 울리지 않기"
#: allianceauth/templates/allianceauth/admin-status/overview.html:36
#: allianceauth/templates/allianceauth/admin-status/overview.html:33
msgid "Powered by GitLab"
msgstr "GitLab 제공"
#: allianceauth/templates/allianceauth/admin-status/overview.html:42
#: allianceauth/templates/allianceauth/admin-status/overview.html:39
msgid "Support Discord"
msgstr "Support Discord"
#: allianceauth/templates/allianceauth/admin-status/overview.html:59
#: allianceauth/templates/allianceauth/admin-status/overview.html:63
#: allianceauth/templates/allianceauth/admin-status/overview.html:53
#: allianceauth/templates/allianceauth/admin-status/overview.html:57
msgid "Software Version"
msgstr "소프트웨어 버전"
#: allianceauth/templates/allianceauth/admin-status/overview.html:66
#: allianceauth/templates/allianceauth/admin-status/overview.html:60
msgid "Current"
msgstr "현재"
#: allianceauth/templates/allianceauth/admin-status/overview.html:73
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Latest Stable"
msgstr "최신 안정화 버전"
#: allianceauth/templates/allianceauth/admin-status/overview.html:78
#: allianceauth/templates/allianceauth/admin-status/overview.html:72
msgid "Update available"
msgstr "업데이트 가능"
#: allianceauth/templates/allianceauth/admin-status/overview.html:86
#: allianceauth/templates/allianceauth/admin-status/overview.html:80
msgid "Latest Pre-Release"
msgstr "최신 사전 출시 버전"
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
#: allianceauth/templates/allianceauth/admin-status/overview.html:85
msgid "Pre-Release available"
msgstr "사전 출시 사용 가능"
#: allianceauth/templates/allianceauth/admin-status/overview.html:102
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
msgid "Task Queue"
msgstr "작업 대기열"
#: allianceauth/templates/allianceauth/admin-status/overview.html:107
#: allianceauth/templates/allianceauth/admin-status/overview.html:100
#, python-format
msgid ""
"\n"
@@ -2477,11 +2560,11 @@ msgstr ""
"\n"
" %(total)s 의 진행된 작업 상태 • 잔여 %(latest)s"
#: allianceauth/templates/allianceauth/admin-status/overview.html:123
#: allianceauth/templates/allianceauth/admin-status/overview.html:116
msgid "running"
msgstr "진행중"
#: allianceauth/templates/allianceauth/admin-status/overview.html:124
#: allianceauth/templates/allianceauth/admin-status/overview.html:117
msgid "queued"
msgstr "대기중"
@@ -2510,114 +2593,216 @@ msgstr "네비게이션 전환"
msgid "Select Theme"
msgstr "테마 선택"
#: allianceauth/timerboard/form.py:53
#: allianceauth/timerboard/templates/timerboard/timertable.html:172
msgid "Other"
msgstr "기타"
#: allianceauth/timerboard/form.py:54
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:44
msgid "Friendly"
msgstr "우호"
#: allianceauth/timerboard/form.py:55
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Hostile"
msgstr "적대"
#: allianceauth/timerboard/form.py:56
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Neutral"
msgstr "중립"
#: allianceauth/timerboard/form.py:58
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:13
#: allianceauth/timerboard/form.py:36
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/timertable.html:7
msgid "Details"
msgstr "설명"
#: allianceauth/timerboard/form.py:60
#: allianceauth/timerboard/form.py:38
msgid "Planet/Moon"
msgstr "행성/달"
#: allianceauth/timerboard/form.py:61
#: allianceauth/timerboard/form.py:39
msgid "Structure Type"
msgstr "스트럭처 종류"
#: allianceauth/timerboard/form.py:62
#: allianceauth/timerboard/form.py:40
msgid "Timer Type"
msgstr "타이머 종류"
#: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/form.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:8
msgid "Objective"
msgstr "목표 대상"
#: allianceauth/timerboard/form.py:64
#: allianceauth/timerboard/form.py:42
msgid "Absolute Timer"
msgstr "절대 타이머"
#: allianceauth/timerboard/form.py:65
#: allianceauth/timerboard/form.py:43
msgid "Date and Time"
msgstr "날짜와 시간"
#: allianceauth/timerboard/form.py:66
#: allianceauth/timerboard/form.py:44
msgid "Days Remaining"
msgstr "남은 일수"
#: allianceauth/timerboard/form.py:67
#: allianceauth/timerboard/form.py:45
msgid "Hours Remaining"
msgstr "남은 시간"
#: allianceauth/timerboard/form.py:69
#: allianceauth/timerboard/form.py:47
msgid "Minutes Remaining"
msgstr "남은 분"
#: allianceauth/timerboard/form.py:71
#: allianceauth/timerboard/form.py:48
msgid "Important"
msgstr "중요"
#: allianceauth/timerboard/form.py:72
#: allianceauth/timerboard/form.py:49
msgid "Corp-Restricted"
msgstr "코퍼레이션 제한"
#: allianceauth/timerboard/models.py:14
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:39
#: allianceauth/timerboard/templates/timerboard/timertable.html:36
msgid "Friendly"
msgstr "우호"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:34
msgid "Hostile"
msgstr "적대"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Neutral"
msgstr "중립"
#: allianceauth/timerboard/models.py:24
#: allianceauth/timerboard/templates/timerboard/timertable.html:48
msgid "POCO"
msgstr "포코(POCO)"
#: allianceauth/timerboard/models.py:25
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Orbital Skyhook"
msgstr ""
#: allianceauth/timerboard/models.py:26
#: allianceauth/timerboard/templates/timerboard/timertable.html:52
msgid "I-HUB"
msgstr "I-HUB"
#: allianceauth/timerboard/models.py:27
#: allianceauth/timerboard/templates/timerboard/timertable.html:55
msgid "TCU"
msgstr "TCU"
#: allianceauth/timerboard/models.py:28
#: allianceauth/timerboard/templates/timerboard/timertable.html:57
msgid "POS [S]"
msgstr "POS [S]"
#: allianceauth/timerboard/models.py:29
#: allianceauth/timerboard/templates/timerboard/timertable.html:59
msgid "POS [M]"
msgstr "POS [M]"
#: allianceauth/timerboard/models.py:30
#: allianceauth/timerboard/templates/timerboard/timertable.html:61
msgid "POS [L]"
msgstr "POS [L]"
#: allianceauth/timerboard/models.py:31
#: allianceauth/timerboard/templates/timerboard/timertable.html:63
msgid "Astrahus"
msgstr "아스트라허스(Astrahus)"
#: allianceauth/timerboard/models.py:32
#: allianceauth/timerboard/templates/timerboard/timertable.html:65
msgid "Fortizar"
msgstr "포르티자(Fortizar)"
#: allianceauth/timerboard/models.py:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:67
msgid "Keepstar"
msgstr "킵스타(Keepstar)"
#: allianceauth/timerboard/models.py:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:69
msgid "Raitaru"
msgstr "라이타루(Raitaru)"
#: allianceauth/timerboard/models.py:35
#: allianceauth/timerboard/templates/timerboard/timertable.html:71
msgid "Azbel"
msgstr "아즈벨(Azbel)"
#: allianceauth/timerboard/models.py:36
#: allianceauth/timerboard/templates/timerboard/timertable.html:73
msgid "Sotiyo"
msgstr "소티요(Sotiyo)"
#: allianceauth/timerboard/models.py:37
#: allianceauth/timerboard/templates/timerboard/timertable.html:75
msgid "Athanor"
msgstr "아타노르(Athanor)"
#: allianceauth/timerboard/models.py:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:77
msgid "Tatara"
msgstr "타타라(Tatara)"
#: allianceauth/timerboard/models.py:39
msgid "Pharolux Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/models.py:40
msgid "Tenebrex Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/models.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:83
msgid "Ansiblex Jump Gate"
msgstr "엔서블렉스 점프 게이트(Ansiblex Jump Gate)"
#: allianceauth/timerboard/models.py:42
#: allianceauth/timerboard/templates/timerboard/timertable.html:85
msgid "Moon Mining Cycle"
msgstr "문 마이닝 주기"
#: allianceauth/timerboard/models.py:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:87
msgid "Metenox Moon Drill"
msgstr ""
#: allianceauth/timerboard/models.py:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:89
msgid "Other"
msgstr "기타"
#: allianceauth/timerboard/models.py:51
msgid "Not Specified"
msgstr "명시되지 않음"
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/models.py:52
msgid "Shield"
msgstr "실드"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/models.py:53
msgid "Armor"
msgstr "장갑"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/models.py:54
msgid "Hull"
msgstr "선체"
#: allianceauth/timerboard/models.py:18
#: allianceauth/timerboard/models.py:55
msgid "Final"
msgstr "최종"
#: allianceauth/timerboard/models.py:19
#: allianceauth/timerboard/models.py:56
msgid "Anchoring"
msgstr "고정"
#: allianceauth/timerboard/models.py:20
#: allianceauth/timerboard/models.py:57
msgid "Unanchoring"
msgstr "미고정"
#: allianceauth/timerboard/models.py:58
msgid "Abandoned"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:53
msgid "Upcoming Timers"
msgstr "예정 타이머"
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
msgid "Timer"
msgstr "타이머"
@@ -2661,78 +2846,14 @@ msgstr "구조물 타이머 수정"
msgid "Structure"
msgstr "구조물"
#: allianceauth/timerboard/templates/timerboard/timertable.html:64
msgid "POCO"
msgstr "포코(POCO)"
#: allianceauth/timerboard/templates/timerboard/timertable.html:70
msgid "I-HUB"
msgstr "I-HUB"
#: allianceauth/timerboard/templates/timerboard/timertable.html:76
msgid "TCU"
msgstr "TCU"
#: allianceauth/timerboard/templates/timerboard/timertable.html:82
msgid "POS [S]"
msgstr "POS [S]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:88
msgid "POS [M]"
msgstr "POS [M]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:94
msgid "POS [L]"
msgstr "POS [L]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:100
msgid "Astrahus"
msgstr "아스트라허스(Astrahus)"
#: allianceauth/timerboard/templates/timerboard/timertable.html:106
msgid "Fortizar"
msgstr "포르티자(Fortizar)"
#: allianceauth/timerboard/templates/timerboard/timertable.html:112
msgid "Keepstar"
msgstr "킵스타(Keepstar)"
#: allianceauth/timerboard/templates/timerboard/timertable.html:118
msgid "Raitaru"
msgstr "라이타루(Raitaru)"
#: allianceauth/timerboard/templates/timerboard/timertable.html:124
msgid "Azbel"
msgstr "아즈벨(Azbel)"
#: allianceauth/timerboard/templates/timerboard/timertable.html:130
msgid "Sotiyo"
msgstr "소티요(Sotiyo)"
#: allianceauth/timerboard/templates/timerboard/timertable.html:136
msgid "Athanor"
msgstr "아타노르(Athanor)"
#: allianceauth/timerboard/templates/timerboard/timertable.html:142
msgid "Tatara"
msgstr "타타라(Tatara)"
#: allianceauth/timerboard/templates/timerboard/timertable.html:148
#: allianceauth/timerboard/templates/timerboard/timertable.html:79
msgid "Cyno Beacon"
msgstr "사이노 비컨(Cyno Beacon)"
#: allianceauth/timerboard/templates/timerboard/timertable.html:154
#: allianceauth/timerboard/templates/timerboard/timertable.html:81
msgid "Cyno Jammer"
msgstr "사이노 재머(Cyno Jammer)"
#: allianceauth/timerboard/templates/timerboard/timertable.html:160
msgid "Ansiblex Jump Gate"
msgstr "엔서블렉스 점프 게이트(Ansiblex Jump Gate)"
#: allianceauth/timerboard/templates/timerboard/timertable.html:166
msgid "Moon Mining Cycle"
msgstr "문 마이닝 주기"
#: allianceauth/timerboard/templates/timerboard/view.html:9
msgid "Structure Timer Management"
msgstr "구조물 타이머 관리"

Binary file not shown.

View File

@@ -12,14 +12,14 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-12 19:15+1000\n"
"POT-Creation-Date: 2024-09-13 19:57+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Agent Fuse, 2024\n"
"Language-Team: Dutch (https://app.transifex.com/alliance-auth/teams/107430/nl/)\n"
"Language-Team: Dutch (Netherlands) (https://app.transifex.com/alliance-auth/teams/107430/nl_NL/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nl\n"
"Language: nl_NL\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: allianceauth/analytics/models.py:26
@@ -62,66 +62,90 @@ msgstr ""
"Je bent niet gemachtigd om de volgende beperkte groepen te verwijderen: %s"
#: allianceauth/authentication/models.py:71
#: allianceauth/project_template/project_name/settings/base.py:99
msgid "English"
msgstr "Engels"
#: allianceauth/authentication/models.py:72
msgid "Czech"
msgstr ""
#: allianceauth/authentication/models.py:73
#: allianceauth/project_template/project_name/settings/base.py:101
msgid "German"
msgstr "Duits"
#: allianceauth/authentication/models.py:73
#: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:102
msgid "Spanish"
msgstr "Spaans"
#: allianceauth/authentication/models.py:74
msgid "Chinese Simplified"
msgstr "Vereenvoudigd Chinees"
#: allianceauth/authentication/models.py:75
msgid "Russian"
msgstr "Russisch"
#: allianceauth/authentication/models.py:76
msgid "Korean"
msgstr "Koreaans"
#: allianceauth/authentication/models.py:77
msgid "French"
msgstr "Frans"
#: allianceauth/authentication/models.py:78
msgid "Japanese"
msgstr "Japans"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:103
msgid "Italian"
msgstr "Italiaans"
#: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:104
msgid "Japanese"
msgstr "Japans"
#: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:105
msgid "Korean"
msgstr "Koreaans"
#: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:106
msgid "French"
msgstr "Frans"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:109
msgid "Russian"
msgstr "Russisch"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:107
msgid "Dutch"
msgstr ""
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:108
msgid "Polish"
msgstr ""
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:110
msgid "Ukrainian"
msgstr "Oekraïens"
#: allianceauth/authentication/models.py:96
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:111
msgid "Simplified Chinese"
msgstr ""
#: allianceauth/authentication/models.py:99
#: allianceauth/menu/templates/menu/menu-user.html:42
msgid "Language"
msgstr "Taal"
#: allianceauth/authentication/models.py:101
#: allianceauth/authentication/models.py:104
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr "Nachtstand"
#: allianceauth/authentication/models.py:105
#: allianceauth/authentication/models.py:108
#: allianceauth/menu/templates/menu/menu-user.html:46
msgid "Theme"
msgstr "Thema"
#: allianceauth/authentication/models.py:122
#: allianceauth/authentication/models.py:125
#, python-format
msgid "State changed to: %s"
msgstr "State gewijzigd naar: %s"
#: allianceauth/authentication/models.py:123
#: allianceauth/authentication/models.py:126
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr "De gebruikers staat is nu: %(state)s"
@@ -133,27 +157,27 @@ msgstr "De gebruikers staat is nu: %(state)s"
msgid "Dashboard"
msgstr "Dashboard"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:7
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:5
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:33
#: allianceauth/hrapplications/templates/hrapplications/view.html:54
msgid "Characters"
msgstr "Karakter"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:13
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:11
#: 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:6
msgid "Add Character"
msgstr "Personages toevoegen"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:16
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:17
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: 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:12
msgid "Change Main"
msgstr "Verander Main"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:89
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:23
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:31
@@ -162,12 +186,12 @@ msgstr "Verander Main"
msgid "Name"
msgstr "Naam"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:25
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:23
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:33
msgid "Corp"
msgstr "Corp"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:26
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/corputils/templates/corputils/corpstats.html:125
#: allianceauth/hrapplications/templates/hrapplications/view.html:63
msgid "Alliance"
@@ -177,7 +201,7 @@ msgstr "Alliantie"
msgid "Membership"
msgstr "Lidmaatschap"
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:8
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:10
msgid "State:"
msgstr "Status:"
@@ -422,6 +446,19 @@ msgstr ""
"Het is niet gelukt om bedrijfsstatistieken te verzamelen met het "
"geselecteerde token."
#: allianceauth/custom_css/apps.py:13 allianceauth/custom_css/models.py:36
#: allianceauth/custom_css/models.py:37 allianceauth/custom_css/models.py:47
msgid "Custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:25
msgid "Your custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:26
msgid "This CSS will be added to the site after the default CSS."
msgstr ""
#: allianceauth/fleetactivitytracking/auth_hooks.py:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkcreate.html:11
@@ -514,8 +551,8 @@ msgstr "Gebruiker"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:37
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:42
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:59
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:37
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/timertable.html:9
msgid "System"
msgstr "Systeem"
@@ -837,7 +874,7 @@ msgstr "Aanvrager"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
msgid "Type"
msgstr "Type"
@@ -929,7 +966,7 @@ msgid "Hidden"
msgstr "verborgen"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:19
#: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Open"
msgstr "Open"
@@ -1405,16 +1442,16 @@ msgstr "Notificatie"
msgid "Super User"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:68
#: allianceauth/menu/templates/menu/menu-user.html:70
#: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin"
msgstr "Administrator"
#: allianceauth/menu/templates/menu/menu-user.html:80
#: allianceauth/menu/templates/menu/menu-user.html:82
msgid "Sign Out"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:84
#: allianceauth/menu/templates/menu/menu-user.html:86
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18
msgid "Sign In"
@@ -1564,7 +1601,7 @@ msgid "Form Up System"
msgstr ""
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18
msgid "EVE Time"
msgstr ""
@@ -1759,17 +1796,17 @@ msgid ""
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:20
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:22
msgid "Activate"
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:34
msgid "Reset Password"
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:40
msgid "Deactivate"
msgstr ""
@@ -1850,12 +1887,12 @@ msgstr ""
msgid "Deactivated IPSuite4 account."
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28
#: allianceauth/services/templates/services/service_password.html:26
msgid "Set Password"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:44
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:46
msgid "Connect"
msgstr ""
@@ -2418,56 +2455,56 @@ msgstr ""
msgid "Your Server received an ESI error response code of "
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:11
#: allianceauth/templates/allianceauth/admin-status/overview.html:8
msgid "Alliance Auth Notifications"
msgstr "Alliantie Authenticatie Notificaties"
#: allianceauth/templates/allianceauth/admin-status/overview.html:21
#: allianceauth/templates/allianceauth/admin-status/overview.html:18
msgid "Closed"
msgstr "Gesloten"
#: allianceauth/templates/allianceauth/admin-status/overview.html:27
#: allianceauth/templates/allianceauth/admin-status/overview.html:24
msgid "No notifications at this time"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:36
#: allianceauth/templates/allianceauth/admin-status/overview.html:33
msgid "Powered by GitLab"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:42
#: allianceauth/templates/allianceauth/admin-status/overview.html:39
msgid "Support Discord"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:59
#: allianceauth/templates/allianceauth/admin-status/overview.html:63
#: allianceauth/templates/allianceauth/admin-status/overview.html:53
#: allianceauth/templates/allianceauth/admin-status/overview.html:57
msgid "Software Version"
msgstr "Software Versie"
#: allianceauth/templates/allianceauth/admin-status/overview.html:66
#: allianceauth/templates/allianceauth/admin-status/overview.html:60
msgid "Current"
msgstr "Huidige"
#: allianceauth/templates/allianceauth/admin-status/overview.html:73
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Latest Stable"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:78
#: allianceauth/templates/allianceauth/admin-status/overview.html:72
msgid "Update available"
msgstr "Update Beschikbaar"
#: allianceauth/templates/allianceauth/admin-status/overview.html:86
#: allianceauth/templates/allianceauth/admin-status/overview.html:80
msgid "Latest Pre-Release"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
#: allianceauth/templates/allianceauth/admin-status/overview.html:85
msgid "Pre-Release available"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:102
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
msgid "Task Queue"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:107
#: allianceauth/templates/allianceauth/admin-status/overview.html:100
#, python-format
msgid ""
"\n"
@@ -2475,11 +2512,11 @@ msgid ""
" "
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:123
#: allianceauth/templates/allianceauth/admin-status/overview.html:116
msgid "running"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:124
#: allianceauth/templates/allianceauth/admin-status/overview.html:117
msgid "queued"
msgstr ""
@@ -2508,114 +2545,216 @@ msgstr ""
msgid "Select Theme"
msgstr "Selecteer Thema"
#: allianceauth/timerboard/form.py:53
#: allianceauth/timerboard/templates/timerboard/timertable.html:172
msgid "Other"
msgstr "Andere"
#: allianceauth/timerboard/form.py:54
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:44
msgid "Friendly"
msgstr "Vriendelijk"
#: allianceauth/timerboard/form.py:55
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Hostile"
msgstr "Vijandig"
#: allianceauth/timerboard/form.py:56
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Neutral"
msgstr "Neutraal"
#: allianceauth/timerboard/form.py:58
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:13
#: allianceauth/timerboard/form.py:36
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/timertable.html:7
msgid "Details"
msgstr "Details"
#: allianceauth/timerboard/form.py:60
#: allianceauth/timerboard/form.py:38
msgid "Planet/Moon"
msgstr "Planeet/Maan"
#: allianceauth/timerboard/form.py:61
#: allianceauth/timerboard/form.py:39
msgid "Structure Type"
msgstr ""
#: allianceauth/timerboard/form.py:62
#: allianceauth/timerboard/form.py:40
msgid "Timer Type"
msgstr "Timer Type"
#: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/form.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:8
msgid "Objective"
msgstr "Doel"
#: allianceauth/timerboard/form.py:64
#: allianceauth/timerboard/form.py:42
msgid "Absolute Timer"
msgstr "Absolute Timer"
#: allianceauth/timerboard/form.py:65
#: allianceauth/timerboard/form.py:43
msgid "Date and Time"
msgstr "Datum en Tijd"
#: allianceauth/timerboard/form.py:66
#: allianceauth/timerboard/form.py:44
msgid "Days Remaining"
msgstr "Resterende Dagen"
#: allianceauth/timerboard/form.py:67
#: allianceauth/timerboard/form.py:45
msgid "Hours Remaining"
msgstr "Resterende Uren"
#: allianceauth/timerboard/form.py:69
#: allianceauth/timerboard/form.py:47
msgid "Minutes Remaining"
msgstr "Resterende Minuten"
#: allianceauth/timerboard/form.py:71
#: allianceauth/timerboard/form.py:48
msgid "Important"
msgstr "Belangrijk"
#: allianceauth/timerboard/form.py:72
#: allianceauth/timerboard/form.py:49
msgid "Corp-Restricted"
msgstr ""
#: allianceauth/timerboard/models.py:14
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:39
#: allianceauth/timerboard/templates/timerboard/timertable.html:36
msgid "Friendly"
msgstr "Vriendelijk"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:34
msgid "Hostile"
msgstr "Vijandig"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Neutral"
msgstr "Neutraal"
#: allianceauth/timerboard/models.py:24
#: allianceauth/timerboard/templates/timerboard/timertable.html:48
msgid "POCO"
msgstr ""
#: allianceauth/timerboard/models.py:25
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Orbital Skyhook"
msgstr ""
#: allianceauth/timerboard/models.py:26
#: allianceauth/timerboard/templates/timerboard/timertable.html:52
msgid "I-HUB"
msgstr ""
#: allianceauth/timerboard/models.py:27
#: allianceauth/timerboard/templates/timerboard/timertable.html:55
msgid "TCU"
msgstr ""
#: allianceauth/timerboard/models.py:28
#: allianceauth/timerboard/templates/timerboard/timertable.html:57
msgid "POS [S]"
msgstr ""
#: allianceauth/timerboard/models.py:29
#: allianceauth/timerboard/templates/timerboard/timertable.html:59
msgid "POS [M]"
msgstr ""
#: allianceauth/timerboard/models.py:30
#: allianceauth/timerboard/templates/timerboard/timertable.html:61
msgid "POS [L]"
msgstr ""
#: allianceauth/timerboard/models.py:31
#: allianceauth/timerboard/templates/timerboard/timertable.html:63
msgid "Astrahus"
msgstr "Astrahus"
#: allianceauth/timerboard/models.py:32
#: allianceauth/timerboard/templates/timerboard/timertable.html:65
msgid "Fortizar"
msgstr "Fortizar"
#: allianceauth/timerboard/models.py:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:67
msgid "Keepstar"
msgstr "Keepstar"
#: allianceauth/timerboard/models.py:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:69
msgid "Raitaru"
msgstr "Raitaru"
#: allianceauth/timerboard/models.py:35
#: allianceauth/timerboard/templates/timerboard/timertable.html:71
msgid "Azbel"
msgstr "Sotiyo"
#: allianceauth/timerboard/models.py:36
#: allianceauth/timerboard/templates/timerboard/timertable.html:73
msgid "Sotiyo"
msgstr "Sotiyo"
#: allianceauth/timerboard/models.py:37
#: allianceauth/timerboard/templates/timerboard/timertable.html:75
msgid "Athanor"
msgstr "Athanor"
#: allianceauth/timerboard/models.py:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:77
msgid "Tatara"
msgstr "Tatara"
#: allianceauth/timerboard/models.py:39
msgid "Pharolux Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/models.py:40
msgid "Tenebrex Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/models.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:83
msgid "Ansiblex Jump Gate"
msgstr "Ansiblex Jump Gate"
#: allianceauth/timerboard/models.py:42
#: allianceauth/timerboard/templates/timerboard/timertable.html:85
msgid "Moon Mining Cycle"
msgstr "Maan mijn Cyclus"
#: allianceauth/timerboard/models.py:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:87
msgid "Metenox Moon Drill"
msgstr ""
#: allianceauth/timerboard/models.py:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:89
msgid "Other"
msgstr "Andere"
#: allianceauth/timerboard/models.py:51
msgid "Not Specified"
msgstr "Niet gespecifieerd"
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/models.py:52
msgid "Shield"
msgstr "Schild"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/models.py:53
msgid "Armor"
msgstr "Pantser"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/models.py:54
msgid "Hull"
msgstr "Romp"
#: allianceauth/timerboard/models.py:18
#: allianceauth/timerboard/models.py:55
msgid "Final"
msgstr "Laatste"
#: allianceauth/timerboard/models.py:19
#: allianceauth/timerboard/models.py:56
msgid "Anchoring"
msgstr "Ankeren"
#: allianceauth/timerboard/models.py:20
#: allianceauth/timerboard/models.py:57
msgid "Unanchoring"
msgstr "ontankeren"
#: allianceauth/timerboard/models.py:58
msgid "Abandoned"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:53
msgid "Upcoming Timers"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
msgid "Timer"
msgstr "Timer"
@@ -2659,78 +2798,14 @@ msgstr ""
msgid "Structure"
msgstr "Constructie"
#: allianceauth/timerboard/templates/timerboard/timertable.html:64
msgid "POCO"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:70
msgid "I-HUB"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:76
msgid "TCU"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:82
msgid "POS [S]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:88
msgid "POS [M]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:94
msgid "POS [L]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:100
msgid "Astrahus"
msgstr "Astrahus"
#: allianceauth/timerboard/templates/timerboard/timertable.html:106
msgid "Fortizar"
msgstr "Fortizar"
#: allianceauth/timerboard/templates/timerboard/timertable.html:112
msgid "Keepstar"
msgstr "Keepstar"
#: allianceauth/timerboard/templates/timerboard/timertable.html:118
msgid "Raitaru"
msgstr "Raitaru"
#: allianceauth/timerboard/templates/timerboard/timertable.html:124
msgid "Azbel"
msgstr "Sotiyo"
#: allianceauth/timerboard/templates/timerboard/timertable.html:130
msgid "Sotiyo"
msgstr "Sotiyo"
#: allianceauth/timerboard/templates/timerboard/timertable.html:136
msgid "Athanor"
msgstr "Athanor"
#: allianceauth/timerboard/templates/timerboard/timertable.html:142
msgid "Tatara"
msgstr "Tatara"
#: allianceauth/timerboard/templates/timerboard/timertable.html:148
#: allianceauth/timerboard/templates/timerboard/timertable.html:79
msgid "Cyno Beacon"
msgstr "Cyno Beacon"
#: allianceauth/timerboard/templates/timerboard/timertable.html:154
#: allianceauth/timerboard/templates/timerboard/timertable.html:81
msgid "Cyno Jammer"
msgstr "Cyno Jammer"
#: allianceauth/timerboard/templates/timerboard/timertable.html:160
msgid "Ansiblex Jump Gate"
msgstr "Ansiblex Jump Gate"
#: allianceauth/timerboard/templates/timerboard/timertable.html:166
msgid "Moon Mining Cycle"
msgstr "Maan mijn Cyclus"
#: allianceauth/timerboard/templates/timerboard/view.html:9
msgid "Structure Timer Management"
msgstr ""

View File

@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-12 19:15+1000\n"
"POT-Creation-Date: 2024-10-21 12:59+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: MisBimbrownik, 2024\n"
"Language-Team: Polish (Poland) (https://app.transifex.com/alliance-auth/teams/107430/pl_PL/)\n"
@@ -63,66 +63,90 @@ msgstr ""
"%s"
#: allianceauth/authentication/models.py:71
#: allianceauth/project_template/project_name/settings/base.py:99
msgid "English"
msgstr "Angielski"
#: allianceauth/authentication/models.py:72
msgid "Czech"
msgstr ""
#: allianceauth/authentication/models.py:73
#: allianceauth/project_template/project_name/settings/base.py:101
msgid "German"
msgstr "Niemiecki"
#: allianceauth/authentication/models.py:73
#: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:102
msgid "Spanish"
msgstr "Hiszpański"
#: allianceauth/authentication/models.py:74
msgid "Chinese Simplified"
msgstr "Chiński uproszczony"
#: allianceauth/authentication/models.py:75
msgid "Russian"
msgstr "Rosyjski"
#: allianceauth/authentication/models.py:76
msgid "Korean"
msgstr "Koreański"
#: allianceauth/authentication/models.py:77
msgid "French"
msgstr "Francuski"
#: allianceauth/authentication/models.py:78
msgid "Japanese"
msgstr "Japoński"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:103
msgid "Italian"
msgstr "Włoski"
#: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:104
msgid "Japanese"
msgstr "Japoński"
#: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:105
msgid "Korean"
msgstr "Koreański"
#: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:106
msgid "French"
msgstr "Francuski"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:109
msgid "Russian"
msgstr "Rosyjski"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:107
msgid "Dutch"
msgstr ""
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:108
msgid "Polish"
msgstr ""
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:110
msgid "Ukrainian"
msgstr "Ukraiński"
#: allianceauth/authentication/models.py:96
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:111
msgid "Simplified Chinese"
msgstr ""
#: allianceauth/authentication/models.py:99
#: allianceauth/menu/templates/menu/menu-user.html:42
msgid "Language"
msgstr "Język"
#: allianceauth/authentication/models.py:101
#: allianceauth/authentication/models.py:104
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr "Tryb nocny"
#: allianceauth/authentication/models.py:105
#: allianceauth/authentication/models.py:108
#: allianceauth/menu/templates/menu/menu-user.html:46
msgid "Theme"
msgstr "Styl"
#: allianceauth/authentication/models.py:122
#: allianceauth/authentication/models.py:125
#, python-format
msgid "State changed to: %s"
msgstr "Stan został zmieniony na: %s"
#: allianceauth/authentication/models.py:123
#: allianceauth/authentication/models.py:126
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr "Stan twojego użytkownika to: %(state)s"
@@ -134,27 +158,27 @@ msgstr "Stan twojego użytkownika to: %(state)s"
msgid "Dashboard"
msgstr "Tablica"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:7
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:5
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:33
#: allianceauth/hrapplications/templates/hrapplications/view.html:54
msgid "Characters"
msgstr "Postacie"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:13
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:11
#: 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:6
msgid "Add Character"
msgstr "Dodaj postać"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:16
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:17
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: 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:12
msgid "Change Main"
msgstr "Zmień główną postać"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:89
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:23
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:31
@@ -163,12 +187,12 @@ msgstr "Zmień główną postać"
msgid "Name"
msgstr "Nazwa"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:25
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:23
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:33
msgid "Corp"
msgstr "Korporacja"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:26
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/corputils/templates/corputils/corpstats.html:125
#: allianceauth/hrapplications/templates/hrapplications/view.html:63
msgid "Alliance"
@@ -178,7 +202,7 @@ msgstr "Sojusz"
msgid "Membership"
msgstr "Członkowstwo"
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:8
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:10
msgid "State:"
msgstr "Stan:"
@@ -425,6 +449,19 @@ msgstr "Wybrana Korporacja ma już włączony moduł statystyk."
msgid "Failed to gather corporation statistics with selected token."
msgstr "Nie udało się pobrać statystyk korporacji używając wybranego Tokenu."
#: allianceauth/custom_css/apps.py:13 allianceauth/custom_css/models.py:36
#: allianceauth/custom_css/models.py:37 allianceauth/custom_css/models.py:47
msgid "Custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:25
msgid "Your custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:26
msgid "This CSS will be added to the site after the default CSS."
msgstr ""
#: allianceauth/fleetactivitytracking/auth_hooks.py:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkcreate.html:11
@@ -512,13 +549,14 @@ msgstr "Usuń FAT"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35
#: allianceauth/hrapplications/templates/hrapplications/view.html:41
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30
msgid "User"
msgstr "Użytkownik"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:37
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:42
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:59
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:37
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/timertable.html:9
msgid "System"
msgstr "System"
@@ -713,7 +751,6 @@ msgstr "Zarządzanie Grupami"
#: allianceauth/groupmanagement/auth_hooks.py:51
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34
#: allianceauth/templates/allianceauth/side-menu.html:15
msgid "Groups"
msgstr "Grupy"
@@ -865,7 +902,7 @@ msgstr "Wnioskujący"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
msgid "Type"
msgstr "Typ"
@@ -957,7 +994,7 @@ msgid "Hidden"
msgstr "Ukryte"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:19
#: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Open"
msgstr "Otwarta"
@@ -1441,16 +1478,16 @@ msgstr "Powiadomienia"
msgid "Super User"
msgstr "Super-Użytkownik"
#: allianceauth/menu/templates/menu/menu-user.html:68
#: allianceauth/menu/templates/menu/menu-user.html:70
#: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin"
msgstr "Administrator"
#: allianceauth/menu/templates/menu/menu-user.html:80
#: allianceauth/menu/templates/menu/menu-user.html:82
msgid "Sign Out"
msgstr "Wyloguj"
#: allianceauth/menu/templates/menu/menu-user.html:84
#: allianceauth/menu/templates/menu/menu-user.html:86
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18
msgid "Sign In"
@@ -1600,7 +1637,7 @@ msgid "Form Up System"
msgstr "Miejsce zbiórki"
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18
msgid "EVE Time"
msgstr "Czas EVE"
@@ -1797,17 +1834,17 @@ msgstr ""
" uważasz, że to pomyłka - skontaktuj się z Adminem."
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:20
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:22
msgid "Activate"
msgstr "Włącz"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:34
msgid "Reset Password"
msgstr "Zresetuj hasło"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:40
msgid "Deactivate"
msgstr "Wyłącz"
@@ -1892,15 +1929,61 @@ msgstr "Ustaw hasło IPSuite4."
msgid "Deactivated IPSuite4 account."
msgstr "Wyłączono konto IPSuite4."
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6
msgid "Mumble"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10
msgid "Mumble History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22
msgid "Server Connection History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31
msgid "Displayed Name"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32
msgid "Release"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67
msgid "Version"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34
msgid "Last Connect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35
msgid "Last Disconnect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59
msgid "Server Connection Breakdown"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68
msgid "Number"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28
#: allianceauth/services/templates/services/service_password.html:26
msgid "Set Password"
msgstr "Ustaw hasło"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:44
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:46
msgid "Connect"
msgstr "Połącz"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52
msgid "Mumble Connection History"
msgstr ""
#: allianceauth/services/modules/openfire/auth_hooks.py:27
msgid "Jabber"
msgstr "Jabber"
@@ -2470,56 +2553,56 @@ msgstr "Zapisano zmiany we Flocie z SRP %(fleetname)s"
msgid "Your Server received an ESI error response code of "
msgstr "Twój Serwer otrzymał błąd ESI o kodzie"
#: allianceauth/templates/allianceauth/admin-status/overview.html:11
#: allianceauth/templates/allianceauth/admin-status/overview.html:8
msgid "Alliance Auth Notifications"
msgstr "Powiadomienia z Autoryzacji Sojuszu (AA)"
#: allianceauth/templates/allianceauth/admin-status/overview.html:21
#: allianceauth/templates/allianceauth/admin-status/overview.html:18
msgid "Closed"
msgstr "Zakończone"
#: allianceauth/templates/allianceauth/admin-status/overview.html:27
#: allianceauth/templates/allianceauth/admin-status/overview.html:24
msgid "No notifications at this time"
msgstr "Brak nowych powiadomień"
#: allianceauth/templates/allianceauth/admin-status/overview.html:36
#: allianceauth/templates/allianceauth/admin-status/overview.html:33
msgid "Powered by GitLab"
msgstr "Utworzone przy użyciu GitLab"
#: allianceauth/templates/allianceauth/admin-status/overview.html:42
#: allianceauth/templates/allianceauth/admin-status/overview.html:39
msgid "Support Discord"
msgstr "Potrzebujesz pomocy? Użyj Discord"
#: allianceauth/templates/allianceauth/admin-status/overview.html:59
#: allianceauth/templates/allianceauth/admin-status/overview.html:63
#: allianceauth/templates/allianceauth/admin-status/overview.html:53
#: allianceauth/templates/allianceauth/admin-status/overview.html:57
msgid "Software Version"
msgstr "Wersja oprogramowania"
#: allianceauth/templates/allianceauth/admin-status/overview.html:66
#: allianceauth/templates/allianceauth/admin-status/overview.html:60
msgid "Current"
msgstr "Aktualne"
#: allianceauth/templates/allianceauth/admin-status/overview.html:73
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Latest Stable"
msgstr "Ostatnia stabilna"
#: allianceauth/templates/allianceauth/admin-status/overview.html:78
#: allianceauth/templates/allianceauth/admin-status/overview.html:72
msgid "Update available"
msgstr "Aktualizacja jest dostępna"
#: allianceauth/templates/allianceauth/admin-status/overview.html:86
#: allianceauth/templates/allianceauth/admin-status/overview.html:80
msgid "Latest Pre-Release"
msgstr "Ostatnie przed-produkcyjna"
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
#: allianceauth/templates/allianceauth/admin-status/overview.html:85
msgid "Pre-Release available"
msgstr "Przed-produkcyjna jest dostępna"
#: allianceauth/templates/allianceauth/admin-status/overview.html:102
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
msgid "Task Queue"
msgstr "Kolejka Zadań"
#: allianceauth/templates/allianceauth/admin-status/overview.html:107
#: allianceauth/templates/allianceauth/admin-status/overview.html:100
#, python-format
msgid ""
"\n"
@@ -2529,11 +2612,11 @@ msgstr ""
"\n"
"Status %(total)s przeprocesowanych Zadań • ostatnie %(latest)s"
#: allianceauth/templates/allianceauth/admin-status/overview.html:123
#: allianceauth/templates/allianceauth/admin-status/overview.html:116
msgid "running"
msgstr "w trakcie"
#: allianceauth/templates/allianceauth/admin-status/overview.html:124
#: allianceauth/templates/allianceauth/admin-status/overview.html:117
msgid "queued"
msgstr "oczekujące"
@@ -2562,114 +2645,216 @@ msgstr "Przełącz nawigację"
msgid "Select Theme"
msgstr "Wybierz styl"
#: allianceauth/timerboard/form.py:53
#: allianceauth/timerboard/templates/timerboard/timertable.html:172
msgid "Other"
msgstr "Inny"
#: allianceauth/timerboard/form.py:54
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:44
msgid "Friendly"
msgstr "Przyjaciel"
#: allianceauth/timerboard/form.py:55
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Hostile"
msgstr "Wróg"
#: allianceauth/timerboard/form.py:56
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Neutral"
msgstr "Neutralny"
#: allianceauth/timerboard/form.py:58
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:13
#: allianceauth/timerboard/form.py:36
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/timertable.html:7
msgid "Details"
msgstr "Szczegóły"
#: allianceauth/timerboard/form.py:60
#: allianceauth/timerboard/form.py:38
msgid "Planet/Moon"
msgstr "Planeta/Księżyc"
#: allianceauth/timerboard/form.py:61
#: allianceauth/timerboard/form.py:39
msgid "Structure Type"
msgstr "Typ Struktury"
#: allianceauth/timerboard/form.py:62
#: allianceauth/timerboard/form.py:40
msgid "Timer Type"
msgstr "Typ Licznika"
#: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/form.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:8
msgid "Objective"
msgstr "Cel"
#: allianceauth/timerboard/form.py:64
#: allianceauth/timerboard/form.py:42
msgid "Absolute Timer"
msgstr "Licznik bezwzględny"
#: allianceauth/timerboard/form.py:65
#: allianceauth/timerboard/form.py:43
msgid "Date and Time"
msgstr "Data i Czas"
#: allianceauth/timerboard/form.py:66
#: allianceauth/timerboard/form.py:44
msgid "Days Remaining"
msgstr "Pozostało dni"
#: allianceauth/timerboard/form.py:67
#: allianceauth/timerboard/form.py:45
msgid "Hours Remaining"
msgstr "Pozostało godzin"
#: allianceauth/timerboard/form.py:69
#: allianceauth/timerboard/form.py:47
msgid "Minutes Remaining"
msgstr "Pozostało minut"
#: allianceauth/timerboard/form.py:71
#: allianceauth/timerboard/form.py:48
msgid "Important"
msgstr "Ważny"
#: allianceauth/timerboard/form.py:72
#: allianceauth/timerboard/form.py:49
msgid "Corp-Restricted"
msgstr "Wewnętrzny dla Korporacji"
#: allianceauth/timerboard/models.py:14
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:39
#: allianceauth/timerboard/templates/timerboard/timertable.html:36
msgid "Friendly"
msgstr "Przyjaciel"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:34
msgid "Hostile"
msgstr "Wróg"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Neutral"
msgstr "Neutralny"
#: allianceauth/timerboard/models.py:24
#: allianceauth/timerboard/templates/timerboard/timertable.html:48
msgid "POCO"
msgstr "POCO"
#: allianceauth/timerboard/models.py:25
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Orbital Skyhook"
msgstr ""
#: allianceauth/timerboard/models.py:26
#: allianceauth/timerboard/templates/timerboard/timertable.html:52
msgid "I-HUB"
msgstr "I-HUB"
#: allianceauth/timerboard/models.py:27
#: allianceauth/timerboard/templates/timerboard/timertable.html:55
msgid "TCU"
msgstr "TCU"
#: allianceauth/timerboard/models.py:28
#: allianceauth/timerboard/templates/timerboard/timertable.html:57
msgid "POS [S]"
msgstr "POS (Mały)"
#: allianceauth/timerboard/models.py:29
#: allianceauth/timerboard/templates/timerboard/timertable.html:59
msgid "POS [M]"
msgstr "POS (Średni)"
#: allianceauth/timerboard/models.py:30
#: allianceauth/timerboard/templates/timerboard/timertable.html:61
msgid "POS [L]"
msgstr "POS (Duży)"
#: allianceauth/timerboard/models.py:31
#: allianceauth/timerboard/templates/timerboard/timertable.html:63
msgid "Astrahus"
msgstr "Astrahus"
#: allianceauth/timerboard/models.py:32
#: allianceauth/timerboard/templates/timerboard/timertable.html:65
msgid "Fortizar"
msgstr "Fortizar"
#: allianceauth/timerboard/models.py:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:67
msgid "Keepstar"
msgstr "Keepstar"
#: allianceauth/timerboard/models.py:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:69
msgid "Raitaru"
msgstr "Raitaru"
#: allianceauth/timerboard/models.py:35
#: allianceauth/timerboard/templates/timerboard/timertable.html:71
msgid "Azbel"
msgstr "Azbel"
#: allianceauth/timerboard/models.py:36
#: allianceauth/timerboard/templates/timerboard/timertable.html:73
msgid "Sotiyo"
msgstr "Sotiyo"
#: allianceauth/timerboard/models.py:37
#: allianceauth/timerboard/templates/timerboard/timertable.html:75
msgid "Athanor"
msgstr "Athanor"
#: allianceauth/timerboard/models.py:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:77
msgid "Tatara"
msgstr "Tatara"
#: allianceauth/timerboard/models.py:39
msgid "Pharolux Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/models.py:40
msgid "Tenebrex Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/models.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:83
msgid "Ansiblex Jump Gate"
msgstr "Ansiblex Jump Gate"
#: allianceauth/timerboard/models.py:42
#: allianceauth/timerboard/templates/timerboard/timertable.html:85
msgid "Moon Mining Cycle"
msgstr "Cykl Koparki Księżycowej"
#: allianceauth/timerboard/models.py:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:87
msgid "Metenox Moon Drill"
msgstr ""
#: allianceauth/timerboard/models.py:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:89
msgid "Other"
msgstr "Inny"
#: allianceauth/timerboard/models.py:51
msgid "Not Specified"
msgstr "Nie określono"
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/models.py:52
msgid "Shield"
msgstr "Pole siłowe"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/models.py:53
msgid "Armor"
msgstr "Armor"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/models.py:54
msgid "Hull"
msgstr "Struktura"
#: allianceauth/timerboard/models.py:18
#: allianceauth/timerboard/models.py:55
msgid "Final"
msgstr "Ostateczny"
#: allianceauth/timerboard/models.py:19
#: allianceauth/timerboard/models.py:56
msgid "Anchoring"
msgstr "Kotwiczenie"
#: allianceauth/timerboard/models.py:20
#: allianceauth/timerboard/models.py:57
msgid "Unanchoring"
msgstr "Usunięcie kotwiczenia"
#: allianceauth/timerboard/models.py:58
msgid "Abandoned"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:53
msgid "Upcoming Timers"
msgstr "Nadczodzące zdarzenia"
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
msgid "Timer"
msgstr "Zdarzenie"
@@ -2713,78 +2898,14 @@ msgstr "Zaktualizuj Zdarzenie powiązane z Obiektami"
msgid "Structure"
msgstr "Obiekt"
#: allianceauth/timerboard/templates/timerboard/timertable.html:64
msgid "POCO"
msgstr "POCO"
#: allianceauth/timerboard/templates/timerboard/timertable.html:70
msgid "I-HUB"
msgstr "I-HUB"
#: allianceauth/timerboard/templates/timerboard/timertable.html:76
msgid "TCU"
msgstr "TCU"
#: allianceauth/timerboard/templates/timerboard/timertable.html:82
msgid "POS [S]"
msgstr "POS (Mały)"
#: allianceauth/timerboard/templates/timerboard/timertable.html:88
msgid "POS [M]"
msgstr "POS (Średni)"
#: allianceauth/timerboard/templates/timerboard/timertable.html:94
msgid "POS [L]"
msgstr "POS (Duży)"
#: allianceauth/timerboard/templates/timerboard/timertable.html:100
msgid "Astrahus"
msgstr "Astrahus"
#: allianceauth/timerboard/templates/timerboard/timertable.html:106
msgid "Fortizar"
msgstr "Fortizar"
#: allianceauth/timerboard/templates/timerboard/timertable.html:112
msgid "Keepstar"
msgstr "Keepstar"
#: allianceauth/timerboard/templates/timerboard/timertable.html:118
msgid "Raitaru"
msgstr "Raitaru"
#: allianceauth/timerboard/templates/timerboard/timertable.html:124
msgid "Azbel"
msgstr "Azbel"
#: allianceauth/timerboard/templates/timerboard/timertable.html:130
msgid "Sotiyo"
msgstr "Sotiyo"
#: allianceauth/timerboard/templates/timerboard/timertable.html:136
msgid "Athanor"
msgstr "Athanor"
#: allianceauth/timerboard/templates/timerboard/timertable.html:142
msgid "Tatara"
msgstr "Tatara"
#: allianceauth/timerboard/templates/timerboard/timertable.html:148
#: allianceauth/timerboard/templates/timerboard/timertable.html:79
msgid "Cyno Beacon"
msgstr "Cyno Beacon"
#: allianceauth/timerboard/templates/timerboard/timertable.html:154
#: allianceauth/timerboard/templates/timerboard/timertable.html:81
msgid "Cyno Jammer"
msgstr "Cyno Jammer"
#: allianceauth/timerboard/templates/timerboard/timertable.html:160
msgid "Ansiblex Jump Gate"
msgstr "Ansiblex Jump Gate"
#: allianceauth/timerboard/templates/timerboard/timertable.html:166
msgid "Moon Mining Cycle"
msgstr "Cykl Koparki Księżycowej"
#: allianceauth/timerboard/templates/timerboard/view.html:9
msgid "Structure Timer Management"
msgstr "Zarządzanie Zdarzeniami Obiektu"

View File

@@ -16,7 +16,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-12 19:15+1000\n"
"POT-Creation-Date: 2024-10-21 12:59+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Joel Falknau <ozirascal@gmail.com>, 2024\n"
"Language-Team: Russian (https://app.transifex.com/alliance-auth/teams/107430/ru/)\n"
@@ -58,66 +58,90 @@ msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr "Вам не разрешено добавлять или удалять эти ограниченные группы: %s"
#: allianceauth/authentication/models.py:71
#: allianceauth/project_template/project_name/settings/base.py:99
msgid "English"
msgstr "Английский"
#: allianceauth/authentication/models.py:72
msgid "Czech"
msgstr ""
#: allianceauth/authentication/models.py:73
#: allianceauth/project_template/project_name/settings/base.py:101
msgid "German"
msgstr "Немецкий"
#: allianceauth/authentication/models.py:73
#: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:102
msgid "Spanish"
msgstr "Испанский"
#: allianceauth/authentication/models.py:74
msgid "Chinese Simplified"
msgstr "Китайский упрощённый"
#: allianceauth/authentication/models.py:75
msgid "Russian"
msgstr "Русский"
#: allianceauth/authentication/models.py:76
msgid "Korean"
msgstr "Корейский"
#: allianceauth/authentication/models.py:77
msgid "French"
msgstr "Французский"
#: allianceauth/authentication/models.py:78
msgid "Japanese"
msgstr "Японский"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:103
msgid "Italian"
msgstr "Итальянский"
#: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:104
msgid "Japanese"
msgstr "Японский"
#: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:105
msgid "Korean"
msgstr "Корейский"
#: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:106
msgid "French"
msgstr "Французский"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:109
msgid "Russian"
msgstr "Русский"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:107
msgid "Dutch"
msgstr ""
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:108
msgid "Polish"
msgstr ""
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:110
msgid "Ukrainian"
msgstr "Украинский"
#: allianceauth/authentication/models.py:96
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:111
msgid "Simplified Chinese"
msgstr ""
#: allianceauth/authentication/models.py:99
#: allianceauth/menu/templates/menu/menu-user.html:42
msgid "Language"
msgstr "Язык"
#: allianceauth/authentication/models.py:101
#: allianceauth/authentication/models.py:104
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr "Ночной режим"
#: allianceauth/authentication/models.py:105
#: allianceauth/authentication/models.py:108
#: allianceauth/menu/templates/menu/menu-user.html:46
msgid "Theme"
msgstr ""
#: allianceauth/authentication/models.py:122
#: allianceauth/authentication/models.py:125
#, python-format
msgid "State changed to: %s"
msgstr "Статус изменен: %s"
#: allianceauth/authentication/models.py:123
#: allianceauth/authentication/models.py:126
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr "Статус пилота: %(state)s"
@@ -129,27 +153,27 @@ msgstr "Статус пилота: %(state)s"
msgid "Dashboard"
msgstr "Панель показателей"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:7
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:5
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:33
#: allianceauth/hrapplications/templates/hrapplications/view.html:54
msgid "Characters"
msgstr "Персонажи"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:13
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:11
#: 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:6
msgid "Add Character"
msgstr "Добавить Персонажа"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:16
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:17
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: 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:12
msgid "Change Main"
msgstr "Сменить основного персонажа"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:89
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:23
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:31
@@ -158,12 +182,12 @@ msgstr "Сменить основного персонажа"
msgid "Name"
msgstr "Имя"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:25
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:23
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:33
msgid "Corp"
msgstr "Корпорация"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:26
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/corputils/templates/corputils/corpstats.html:125
#: allianceauth/hrapplications/templates/hrapplications/view.html:63
msgid "Alliance"
@@ -173,7 +197,7 @@ msgstr "Альянс"
msgid "Membership"
msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:8
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:10
msgid "State:"
msgstr ""
@@ -409,6 +433,19 @@ msgstr "Выбранная корпорация уже в модуле стат
msgid "Failed to gather corporation statistics with selected token."
msgstr "Невозможно получить статистику корпорации по данному токену."
#: allianceauth/custom_css/apps.py:13 allianceauth/custom_css/models.py:36
#: allianceauth/custom_css/models.py:37 allianceauth/custom_css/models.py:47
msgid "Custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:25
msgid "Your custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:26
msgid "This CSS will be added to the site after the default CSS."
msgstr ""
#: allianceauth/fleetactivitytracking/auth_hooks.py:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkcreate.html:11
@@ -496,13 +533,14 @@ msgstr "Удалить ФлАк"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35
#: allianceauth/hrapplications/templates/hrapplications/view.html:41
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30
msgid "User"
msgstr "Пользователь"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:37
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:42
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:59
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:37
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/timertable.html:9
msgid "System"
msgstr "Система"
@@ -697,7 +735,6 @@ msgstr "Управление Группой"
#: allianceauth/groupmanagement/auth_hooks.py:51
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34
#: allianceauth/templates/allianceauth/side-menu.html:15
msgid "Groups"
msgstr "Группы"
@@ -854,7 +891,7 @@ msgstr "Запрос от"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
msgid "Type"
msgstr "Тип"
@@ -946,7 +983,7 @@ msgid "Hidden"
msgstr "Скрытые"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:19
#: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Open"
msgstr "Открыть"
@@ -1426,16 +1463,16 @@ msgstr "Уведомления"
msgid "Super User"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:68
#: allianceauth/menu/templates/menu/menu-user.html:70
#: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin"
msgstr "Администратор"
#: allianceauth/menu/templates/menu/menu-user.html:80
#: allianceauth/menu/templates/menu/menu-user.html:82
msgid "Sign Out"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:84
#: allianceauth/menu/templates/menu/menu-user.html:86
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18
msgid "Sign In"
@@ -1585,7 +1622,7 @@ msgid "Form Up System"
msgstr "Система сбора"
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18
msgid "EVE Time"
msgstr "EVE Время"
@@ -1782,17 +1819,17 @@ msgstr ""
"произошло по ошибке, пожалуйста свяжитесь с админом."
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:20
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:22
msgid "Activate"
msgstr "Активировать"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:34
msgid "Reset Password"
msgstr "Сброс пароля"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:40
msgid "Deactivate"
msgstr "Дизактивировать"
@@ -1883,15 +1920,61 @@ msgstr "Установить пароль IPSuite4."
msgid "Deactivated IPSuite4 account."
msgstr "Деактивированный аккаунт IPSuite4."
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6
msgid "Mumble"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10
msgid "Mumble History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22
msgid "Server Connection History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31
msgid "Displayed Name"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32
msgid "Release"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67
msgid "Version"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34
msgid "Last Connect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35
msgid "Last Disconnect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59
msgid "Server Connection Breakdown"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68
msgid "Number"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28
#: allianceauth/services/templates/services/service_password.html:26
msgid "Set Password"
msgstr "Установить Пароль"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:44
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:46
msgid "Connect"
msgstr "Подключить"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52
msgid "Mumble Connection History"
msgstr ""
#: allianceauth/services/modules/openfire/auth_hooks.py:27
msgid "Jabber"
msgstr "Jabber"
@@ -2456,56 +2539,56 @@ msgstr "Сохранены изменения в SRP флот %(fleetname)s"
msgid "Your Server received an ESI error response code of "
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:11
#: allianceauth/templates/allianceauth/admin-status/overview.html:8
msgid "Alliance Auth Notifications"
msgstr "Уведомления об Альянсовых авторизациях"
#: allianceauth/templates/allianceauth/admin-status/overview.html:21
#: allianceauth/templates/allianceauth/admin-status/overview.html:18
msgid "Closed"
msgstr "Закрыт"
#: allianceauth/templates/allianceauth/admin-status/overview.html:27
#: allianceauth/templates/allianceauth/admin-status/overview.html:24
msgid "No notifications at this time"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:36
#: allianceauth/templates/allianceauth/admin-status/overview.html:33
msgid "Powered by GitLab"
msgstr "При поддержке GitLab"
#: allianceauth/templates/allianceauth/admin-status/overview.html:42
#: allianceauth/templates/allianceauth/admin-status/overview.html:39
msgid "Support Discord"
msgstr "Поддержка Discord"
#: allianceauth/templates/allianceauth/admin-status/overview.html:59
#: allianceauth/templates/allianceauth/admin-status/overview.html:63
#: allianceauth/templates/allianceauth/admin-status/overview.html:53
#: allianceauth/templates/allianceauth/admin-status/overview.html:57
msgid "Software Version"
msgstr "Версия приложения"
#: allianceauth/templates/allianceauth/admin-status/overview.html:66
#: allianceauth/templates/allianceauth/admin-status/overview.html:60
msgid "Current"
msgstr "Текущий"
#: allianceauth/templates/allianceauth/admin-status/overview.html:73
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Latest Stable"
msgstr "Стабильная Версия"
#: allianceauth/templates/allianceauth/admin-status/overview.html:78
#: allianceauth/templates/allianceauth/admin-status/overview.html:72
msgid "Update available"
msgstr "Доступно обновление"
#: allianceauth/templates/allianceauth/admin-status/overview.html:86
#: allianceauth/templates/allianceauth/admin-status/overview.html:80
msgid "Latest Pre-Release"
msgstr "Предрелизная Версия"
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
#: allianceauth/templates/allianceauth/admin-status/overview.html:85
msgid "Pre-Release available"
msgstr "Предрелизная Версия"
#: allianceauth/templates/allianceauth/admin-status/overview.html:102
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
msgid "Task Queue"
msgstr "Список задач"
#: allianceauth/templates/allianceauth/admin-status/overview.html:107
#: allianceauth/templates/allianceauth/admin-status/overview.html:100
#, python-format
msgid ""
"\n"
@@ -2513,11 +2596,11 @@ msgid ""
" "
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:123
#: allianceauth/templates/allianceauth/admin-status/overview.html:116
msgid "running"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:124
#: allianceauth/templates/allianceauth/admin-status/overview.html:117
msgid "queued"
msgstr ""
@@ -2546,114 +2629,216 @@ msgstr "Проложить маршрут"
msgid "Select Theme"
msgstr ""
#: allianceauth/timerboard/form.py:53
#: allianceauth/timerboard/templates/timerboard/timertable.html:172
msgid "Other"
msgstr "Прочие"
#: allianceauth/timerboard/form.py:54
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:44
msgid "Friendly"
msgstr "Дружественный"
#: allianceauth/timerboard/form.py:55
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Hostile"
msgstr "Вражеский"
#: allianceauth/timerboard/form.py:56
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Neutral"
msgstr "Нейтрал"
#: allianceauth/timerboard/form.py:58
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:13
#: allianceauth/timerboard/form.py:36
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/timertable.html:7
msgid "Details"
msgstr "Детали"
#: allianceauth/timerboard/form.py:60
#: allianceauth/timerboard/form.py:38
msgid "Planet/Moon"
msgstr "Планета / Луна"
#: allianceauth/timerboard/form.py:61
#: allianceauth/timerboard/form.py:39
msgid "Structure Type"
msgstr "Тип структуры"
#: allianceauth/timerboard/form.py:62
#: allianceauth/timerboard/form.py:40
msgid "Timer Type"
msgstr "Тип таймера"
#: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/form.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:8
msgid "Objective"
msgstr "Задача"
#: allianceauth/timerboard/form.py:64
#: allianceauth/timerboard/form.py:42
msgid "Absolute Timer"
msgstr ""
#: allianceauth/timerboard/form.py:65
#: allianceauth/timerboard/form.py:43
msgid "Date and Time"
msgstr ""
#: allianceauth/timerboard/form.py:66
#: allianceauth/timerboard/form.py:44
msgid "Days Remaining"
msgstr "Дней осталось"
#: allianceauth/timerboard/form.py:67
#: allianceauth/timerboard/form.py:45
msgid "Hours Remaining"
msgstr "Часов осталось"
#: allianceauth/timerboard/form.py:69
#: allianceauth/timerboard/form.py:47
msgid "Minutes Remaining"
msgstr "Минут осталось"
#: allianceauth/timerboard/form.py:71
#: allianceauth/timerboard/form.py:48
msgid "Important"
msgstr "Важно"
#: allianceauth/timerboard/form.py:72
#: allianceauth/timerboard/form.py:49
msgid "Corp-Restricted"
msgstr "Корпорация зарегистрированна"
#: allianceauth/timerboard/models.py:14
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:39
#: allianceauth/timerboard/templates/timerboard/timertable.html:36
msgid "Friendly"
msgstr "Дружественный"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:34
msgid "Hostile"
msgstr "Вражеский"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Neutral"
msgstr "Нейтрал"
#: allianceauth/timerboard/models.py:24
#: allianceauth/timerboard/templates/timerboard/timertable.html:48
msgid "POCO"
msgstr ""
#: allianceauth/timerboard/models.py:25
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Orbital Skyhook"
msgstr ""
#: allianceauth/timerboard/models.py:26
#: allianceauth/timerboard/templates/timerboard/timertable.html:52
msgid "I-HUB"
msgstr ""
#: allianceauth/timerboard/models.py:27
#: allianceauth/timerboard/templates/timerboard/timertable.html:55
msgid "TCU"
msgstr ""
#: allianceauth/timerboard/models.py:28
#: allianceauth/timerboard/templates/timerboard/timertable.html:57
msgid "POS [S]"
msgstr ""
#: allianceauth/timerboard/models.py:29
#: allianceauth/timerboard/templates/timerboard/timertable.html:59
msgid "POS [M]"
msgstr ""
#: allianceauth/timerboard/models.py:30
#: allianceauth/timerboard/templates/timerboard/timertable.html:61
msgid "POS [L]"
msgstr ""
#: allianceauth/timerboard/models.py:31
#: allianceauth/timerboard/templates/timerboard/timertable.html:63
msgid "Astrahus"
msgstr ""
#: allianceauth/timerboard/models.py:32
#: allianceauth/timerboard/templates/timerboard/timertable.html:65
msgid "Fortizar"
msgstr ""
#: allianceauth/timerboard/models.py:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:67
msgid "Keepstar"
msgstr ""
#: allianceauth/timerboard/models.py:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:69
msgid "Raitaru"
msgstr ""
#: allianceauth/timerboard/models.py:35
#: allianceauth/timerboard/templates/timerboard/timertable.html:71
msgid "Azbel"
msgstr ""
#: allianceauth/timerboard/models.py:36
#: allianceauth/timerboard/templates/timerboard/timertable.html:73
msgid "Sotiyo"
msgstr ""
#: allianceauth/timerboard/models.py:37
#: allianceauth/timerboard/templates/timerboard/timertable.html:75
msgid "Athanor"
msgstr ""
#: allianceauth/timerboard/models.py:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:77
msgid "Tatara"
msgstr ""
#: allianceauth/timerboard/models.py:39
msgid "Pharolux Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/models.py:40
msgid "Tenebrex Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/models.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:83
msgid "Ansiblex Jump Gate"
msgstr ""
#: allianceauth/timerboard/models.py:42
#: allianceauth/timerboard/templates/timerboard/timertable.html:85
msgid "Moon Mining Cycle"
msgstr ""
#: allianceauth/timerboard/models.py:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:87
msgid "Metenox Moon Drill"
msgstr ""
#: allianceauth/timerboard/models.py:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:89
msgid "Other"
msgstr "Прочие"
#: allianceauth/timerboard/models.py:51
msgid "Not Specified"
msgstr "Не указано"
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/models.py:52
msgid "Shield"
msgstr "Щит"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/models.py:53
msgid "Armor"
msgstr "Броня"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/models.py:54
msgid "Hull"
msgstr "Структура"
#: allianceauth/timerboard/models.py:18
#: allianceauth/timerboard/models.py:55
msgid "Final"
msgstr "Финальный"
#: allianceauth/timerboard/models.py:19
#: allianceauth/timerboard/models.py:56
msgid "Anchoring"
msgstr "Постановка на якорь"
#: allianceauth/timerboard/models.py:20
#: allianceauth/timerboard/models.py:57
msgid "Unanchoring"
msgstr "Снятие с якоря"
#: allianceauth/timerboard/models.py:58
msgid "Abandoned"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:53
msgid "Upcoming Timers"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
msgid "Timer"
msgstr ""
@@ -2697,78 +2882,14 @@ msgstr "Обновить Структурный Таймер"
msgid "Structure"
msgstr "Структура"
#: allianceauth/timerboard/templates/timerboard/timertable.html:64
msgid "POCO"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:70
msgid "I-HUB"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:76
msgid "TCU"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:82
msgid "POS [S]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:88
msgid "POS [M]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:94
msgid "POS [L]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:100
msgid "Astrahus"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:106
msgid "Fortizar"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:112
msgid "Keepstar"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:118
msgid "Raitaru"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:124
msgid "Azbel"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:130
msgid "Sotiyo"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:136
msgid "Athanor"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:142
msgid "Tatara"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:148
#: allianceauth/timerboard/templates/timerboard/timertable.html:79
msgid "Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:154
#: allianceauth/timerboard/templates/timerboard/timertable.html:81
msgid "Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:160
msgid "Ansiblex Jump Gate"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:166
msgid "Moon Mining Cycle"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/view.html:9
msgid "Structure Timer Management"
msgstr "Управление Структурными Таймерами"

View File

@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-12 19:15+1000\n"
"POT-Creation-Date: 2024-10-21 12:59+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Andrii Yukhymchak, 2024\n"
"Language-Team: Ukrainian (https://app.transifex.com/alliance-auth/teams/107430/uk/)\n"
@@ -61,66 +61,90 @@ msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr "Вам заборонено додавати або видаляти ці обмежені групи: %s"
#: allianceauth/authentication/models.py:71
#: allianceauth/project_template/project_name/settings/base.py:99
msgid "English"
msgstr "Англійська"
#: allianceauth/authentication/models.py:72
msgid "Czech"
msgstr ""
#: allianceauth/authentication/models.py:73
#: allianceauth/project_template/project_name/settings/base.py:101
msgid "German"
msgstr "Німецька"
#: allianceauth/authentication/models.py:73
#: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:102
msgid "Spanish"
msgstr "Іспанська"
#: allianceauth/authentication/models.py:74
msgid "Chinese Simplified"
msgstr "Китайська спрощена"
#: allianceauth/authentication/models.py:75
msgid "Russian"
msgstr "Російська"
#: allianceauth/authentication/models.py:76
msgid "Korean"
msgstr "Корейська"
#: allianceauth/authentication/models.py:77
msgid "French"
msgstr "Французька"
#: allianceauth/authentication/models.py:78
msgid "Japanese"
msgstr "Японська"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:103
msgid "Italian"
msgstr "Італійська"
#: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:104
msgid "Japanese"
msgstr "Японська"
#: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:105
msgid "Korean"
msgstr "Корейська"
#: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:106
msgid "French"
msgstr "Французька"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:109
msgid "Russian"
msgstr "Російська"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:107
msgid "Dutch"
msgstr ""
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:108
msgid "Polish"
msgstr ""
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:110
msgid "Ukrainian"
msgstr "Українська"
#: allianceauth/authentication/models.py:96
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:111
msgid "Simplified Chinese"
msgstr ""
#: allianceauth/authentication/models.py:99
#: allianceauth/menu/templates/menu/menu-user.html:42
msgid "Language"
msgstr "Мова"
#: allianceauth/authentication/models.py:101
#: allianceauth/authentication/models.py:104
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr "Нічний режим"
#: allianceauth/authentication/models.py:105
#: allianceauth/authentication/models.py:108
#: allianceauth/menu/templates/menu/menu-user.html:46
msgid "Theme"
msgstr "Тема"
#: allianceauth/authentication/models.py:122
#: allianceauth/authentication/models.py:125
#, python-format
msgid "State changed to: %s"
msgstr "Стан змінено на: %s"
#: allianceauth/authentication/models.py:123
#: allianceauth/authentication/models.py:126
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr "Стан вашого користувача зараз: %(state)s"
@@ -132,27 +156,27 @@ msgstr "Стан вашого користувача зараз: %(state)s"
msgid "Dashboard"
msgstr "Панель приладів"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:7
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:5
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:33
#: allianceauth/hrapplications/templates/hrapplications/view.html:54
msgid "Characters"
msgstr "Персонажі"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:13
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:11
#: 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:6
msgid "Add Character"
msgstr "Додати персонажа"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:16
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:17
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: 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:12
msgid "Change Main"
msgstr "Змінити основного персонажа"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:89
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:23
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:31
@@ -161,12 +185,12 @@ msgstr "Змінити основного персонажа"
msgid "Name"
msgstr "Ім'я"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:25
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:23
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:33
msgid "Corp"
msgstr "Корпорація"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:26
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/corputils/templates/corputils/corpstats.html:125
#: allianceauth/hrapplications/templates/hrapplications/view.html:63
msgid "Alliance"
@@ -176,7 +200,7 @@ msgstr "Альянс"
msgid "Membership"
msgstr "Членство"
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:8
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:10
msgid "State:"
msgstr "Стан:"
@@ -425,6 +449,19 @@ msgstr "Вибрана корпорація вже має модуль стат
msgid "Failed to gather corporation statistics with selected token."
msgstr "Не вдалося зібрати статистику корпорації з обраним токеном."
#: allianceauth/custom_css/apps.py:13 allianceauth/custom_css/models.py:36
#: allianceauth/custom_css/models.py:37 allianceauth/custom_css/models.py:47
msgid "Custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:25
msgid "Your custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:26
msgid "This CSS will be added to the site after the default CSS."
msgstr ""
#: allianceauth/fleetactivitytracking/auth_hooks.py:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkcreate.html:11
@@ -512,13 +549,14 @@ msgstr "Видалити Fat"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35
#: allianceauth/hrapplications/templates/hrapplications/view.html:41
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30
msgid "User"
msgstr "Користувач"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:37
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:42
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:59
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:37
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/timertable.html:9
msgid "System"
msgstr "Система"
@@ -713,7 +751,6 @@ msgstr "Керування групами"
#: allianceauth/groupmanagement/auth_hooks.py:51
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34
#: allianceauth/templates/allianceauth/side-menu.html:15
msgid "Groups"
msgstr "Групи"
@@ -868,7 +905,7 @@ msgstr "Запитувач"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
msgid "Type"
msgstr "Тип"
@@ -960,7 +997,7 @@ msgid "Hidden"
msgstr "Прихована"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:19
#: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Open"
msgstr "Відкрита"
@@ -1444,16 +1481,16 @@ msgstr "Повідомлення"
msgid "Super User"
msgstr "Супер користувач"
#: allianceauth/menu/templates/menu/menu-user.html:68
#: allianceauth/menu/templates/menu/menu-user.html:70
#: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin"
msgstr "Адміністратор"
#: allianceauth/menu/templates/menu/menu-user.html:80
#: allianceauth/menu/templates/menu/menu-user.html:82
msgid "Sign Out"
msgstr "Вийти"
#: allianceauth/menu/templates/menu/menu-user.html:84
#: allianceauth/menu/templates/menu/menu-user.html:86
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18
msgid "Sign In"
@@ -1603,7 +1640,7 @@ msgid "Form Up System"
msgstr "Система збору флоту"
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18
msgid "EVE Time"
msgstr "Час за EVE"
@@ -1800,17 +1837,17 @@ msgstr ""
"думаєте, що це помилка, будь ласка, зверніться до адміністратора."
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:20
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:22
msgid "Activate"
msgstr "Активувати"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:34
msgid "Reset Password"
msgstr "Скинути пароль"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:40
msgid "Deactivate"
msgstr "Деактивувати"
@@ -1897,15 +1934,61 @@ msgstr "Встановити пароль IPSuite4."
msgid "Deactivated IPSuite4 account."
msgstr "Деактивовано обліковий запис IPSuite4."
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6
msgid "Mumble"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10
msgid "Mumble History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22
msgid "Server Connection History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31
msgid "Displayed Name"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32
msgid "Release"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67
msgid "Version"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34
msgid "Last Connect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35
msgid "Last Disconnect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59
msgid "Server Connection Breakdown"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68
msgid "Number"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28
#: allianceauth/services/templates/services/service_password.html:26
msgid "Set Password"
msgstr "Встановити пароль"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:44
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:46
msgid "Connect"
msgstr "Підєднатись"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52
msgid "Mumble Connection History"
msgstr ""
#: allianceauth/services/modules/openfire/auth_hooks.py:27
msgid "Jabber"
msgstr "Jabber"
@@ -2477,56 +2560,56 @@ msgstr "Збережено зміни до флоту SRP %(fleetname)s"
msgid "Your Server received an ESI error response code of "
msgstr "Ваш сервер отримав код відповіді на помилку ESI "
#: allianceauth/templates/allianceauth/admin-status/overview.html:11
#: allianceauth/templates/allianceauth/admin-status/overview.html:8
msgid "Alliance Auth Notifications"
msgstr "Сповіщення Alliance Auth"
#: allianceauth/templates/allianceauth/admin-status/overview.html:21
#: allianceauth/templates/allianceauth/admin-status/overview.html:18
msgid "Closed"
msgstr "Закрито"
#: allianceauth/templates/allianceauth/admin-status/overview.html:27
#: allianceauth/templates/allianceauth/admin-status/overview.html:24
msgid "No notifications at this time"
msgstr "На даний момент сповіщень немає"
#: allianceauth/templates/allianceauth/admin-status/overview.html:36
#: allianceauth/templates/allianceauth/admin-status/overview.html:33
msgid "Powered by GitLab"
msgstr "Powered by GitLab"
#: allianceauth/templates/allianceauth/admin-status/overview.html:42
#: allianceauth/templates/allianceauth/admin-status/overview.html:39
msgid "Support Discord"
msgstr "Discord підтримки"
#: allianceauth/templates/allianceauth/admin-status/overview.html:59
#: allianceauth/templates/allianceauth/admin-status/overview.html:63
#: allianceauth/templates/allianceauth/admin-status/overview.html:53
#: allianceauth/templates/allianceauth/admin-status/overview.html:57
msgid "Software Version"
msgstr "Версія програмного забезпечення"
#: allianceauth/templates/allianceauth/admin-status/overview.html:66
#: allianceauth/templates/allianceauth/admin-status/overview.html:60
msgid "Current"
msgstr "Поточна"
#: allianceauth/templates/allianceauth/admin-status/overview.html:73
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Latest Stable"
msgstr "Остання стабільна"
#: allianceauth/templates/allianceauth/admin-status/overview.html:78
#: allianceauth/templates/allianceauth/admin-status/overview.html:72
msgid "Update available"
msgstr "Є доступне оновлення"
#: allianceauth/templates/allianceauth/admin-status/overview.html:86
#: allianceauth/templates/allianceauth/admin-status/overview.html:80
msgid "Latest Pre-Release"
msgstr "Останній передрелізний випуск"
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
#: allianceauth/templates/allianceauth/admin-status/overview.html:85
msgid "Pre-Release available"
msgstr "Доступний Попередній Реліз"
#: allianceauth/templates/allianceauth/admin-status/overview.html:102
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
msgid "Task Queue"
msgstr "Черга Завдань"
#: allianceauth/templates/allianceauth/admin-status/overview.html:107
#: allianceauth/templates/allianceauth/admin-status/overview.html:100
#, python-format
msgid ""
"\n"
@@ -2537,11 +2620,11 @@ msgstr ""
" Статус %(total)s оброблених завдань • останні %(latest)s\n"
" "
#: allianceauth/templates/allianceauth/admin-status/overview.html:123
#: allianceauth/templates/allianceauth/admin-status/overview.html:116
msgid "running"
msgstr "в праці"
#: allianceauth/templates/allianceauth/admin-status/overview.html:124
#: allianceauth/templates/allianceauth/admin-status/overview.html:117
msgid "queued"
msgstr "у черзі"
@@ -2570,114 +2653,216 @@ msgstr "Перемикання навігації"
msgid "Select Theme"
msgstr "Виберіть тему"
#: allianceauth/timerboard/form.py:53
#: allianceauth/timerboard/templates/timerboard/timertable.html:172
msgid "Other"
msgstr "Інше"
#: allianceauth/timerboard/form.py:54
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:44
msgid "Friendly"
msgstr "Дружній"
#: allianceauth/timerboard/form.py:55
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Hostile"
msgstr "Ворожий"
#: allianceauth/timerboard/form.py:56
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Neutral"
msgstr "Нейтральний"
#: allianceauth/timerboard/form.py:58
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:13
#: allianceauth/timerboard/form.py:36
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/timertable.html:7
msgid "Details"
msgstr "Деталі"
#: allianceauth/timerboard/form.py:60
#: allianceauth/timerboard/form.py:38
msgid "Planet/Moon"
msgstr "Планета/місяць"
#: allianceauth/timerboard/form.py:61
#: allianceauth/timerboard/form.py:39
msgid "Structure Type"
msgstr "Тип структури"
#: allianceauth/timerboard/form.py:62
#: allianceauth/timerboard/form.py:40
msgid "Timer Type"
msgstr "Тип таймера"
#: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/form.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:8
msgid "Objective"
msgstr "Мета"
#: allianceauth/timerboard/form.py:64
#: allianceauth/timerboard/form.py:42
msgid "Absolute Timer"
msgstr "Абсолютний таймер"
#: allianceauth/timerboard/form.py:65
#: allianceauth/timerboard/form.py:43
msgid "Date and Time"
msgstr "Дата/Час"
#: allianceauth/timerboard/form.py:66
#: allianceauth/timerboard/form.py:44
msgid "Days Remaining"
msgstr "Залишилося днів"
#: allianceauth/timerboard/form.py:67
#: allianceauth/timerboard/form.py:45
msgid "Hours Remaining"
msgstr "Залишилося годин"
#: allianceauth/timerboard/form.py:69
#: allianceauth/timerboard/form.py:47
msgid "Minutes Remaining"
msgstr "Залишилося хвилин"
#: allianceauth/timerboard/form.py:71
#: allianceauth/timerboard/form.py:48
msgid "Important"
msgstr "Важливо"
#: allianceauth/timerboard/form.py:72
#: allianceauth/timerboard/form.py:49
msgid "Corp-Restricted"
msgstr "Обмежено для корпорації"
#: allianceauth/timerboard/models.py:14
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:39
#: allianceauth/timerboard/templates/timerboard/timertable.html:36
msgid "Friendly"
msgstr "Дружній"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:34
msgid "Hostile"
msgstr "Ворожий"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Neutral"
msgstr "Нейтральний"
#: allianceauth/timerboard/models.py:24
#: allianceauth/timerboard/templates/timerboard/timertable.html:48
msgid "POCO"
msgstr "POCO"
#: allianceauth/timerboard/models.py:25
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Orbital Skyhook"
msgstr ""
#: allianceauth/timerboard/models.py:26
#: allianceauth/timerboard/templates/timerboard/timertable.html:52
msgid "I-HUB"
msgstr "I-HUB"
#: allianceauth/timerboard/models.py:27
#: allianceauth/timerboard/templates/timerboard/timertable.html:55
msgid "TCU"
msgstr "TCU"
#: allianceauth/timerboard/models.py:28
#: allianceauth/timerboard/templates/timerboard/timertable.html:57
msgid "POS [S]"
msgstr "POS [S]"
#: allianceauth/timerboard/models.py:29
#: allianceauth/timerboard/templates/timerboard/timertable.html:59
msgid "POS [M]"
msgstr "POS [M]"
#: allianceauth/timerboard/models.py:30
#: allianceauth/timerboard/templates/timerboard/timertable.html:61
msgid "POS [L]"
msgstr "POS [L]"
#: allianceauth/timerboard/models.py:31
#: allianceauth/timerboard/templates/timerboard/timertable.html:63
msgid "Astrahus"
msgstr "Астрахус"
#: allianceauth/timerboard/models.py:32
#: allianceauth/timerboard/templates/timerboard/timertable.html:65
msgid "Fortizar"
msgstr "Фортізар"
#: allianceauth/timerboard/models.py:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:67
msgid "Keepstar"
msgstr "Кіпстар"
#: allianceauth/timerboard/models.py:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:69
msgid "Raitaru"
msgstr "Райтару"
#: allianceauth/timerboard/models.py:35
#: allianceauth/timerboard/templates/timerboard/timertable.html:71
msgid "Azbel"
msgstr "Азбел"
#: allianceauth/timerboard/models.py:36
#: allianceauth/timerboard/templates/timerboard/timertable.html:73
msgid "Sotiyo"
msgstr "Сотійо"
#: allianceauth/timerboard/models.py:37
#: allianceauth/timerboard/templates/timerboard/timertable.html:75
msgid "Athanor"
msgstr "Атанор"
#: allianceauth/timerboard/models.py:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:77
msgid "Tatara"
msgstr "Татара"
#: allianceauth/timerboard/models.py:39
msgid "Pharolux Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/models.py:40
msgid "Tenebrex Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/models.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:83
msgid "Ansiblex Jump Gate"
msgstr "Мост Ансіблекс"
#: allianceauth/timerboard/models.py:42
#: allianceauth/timerboard/templates/timerboard/timertable.html:85
msgid "Moon Mining Cycle"
msgstr "Цикл видобутку супутника"
#: allianceauth/timerboard/models.py:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:87
msgid "Metenox Moon Drill"
msgstr ""
#: allianceauth/timerboard/models.py:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:89
msgid "Other"
msgstr "Інше"
#: allianceauth/timerboard/models.py:51
msgid "Not Specified"
msgstr "Не визначено"
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/models.py:52
msgid "Shield"
msgstr "Щит"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/models.py:53
msgid "Armor"
msgstr "Броня"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/models.py:54
msgid "Hull"
msgstr "Корпус"
#: allianceauth/timerboard/models.py:18
#: allianceauth/timerboard/models.py:55
msgid "Final"
msgstr "Фінальна"
#: allianceauth/timerboard/models.py:19
#: allianceauth/timerboard/models.py:56
msgid "Anchoring"
msgstr "Постановка на якір"
#: allianceauth/timerboard/models.py:20
#: allianceauth/timerboard/models.py:57
msgid "Unanchoring"
msgstr "Зняття з якорю"
#: allianceauth/timerboard/models.py:58
msgid "Abandoned"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:53
msgid "Upcoming Timers"
msgstr "Майбутні таймери"
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
msgid "Timer"
msgstr "Таймер"
@@ -2721,78 +2906,14 @@ msgstr "Оновити таймер структури"
msgid "Structure"
msgstr "Структура"
#: allianceauth/timerboard/templates/timerboard/timertable.html:64
msgid "POCO"
msgstr "POCO"
#: allianceauth/timerboard/templates/timerboard/timertable.html:70
msgid "I-HUB"
msgstr "I-HUB"
#: allianceauth/timerboard/templates/timerboard/timertable.html:76
msgid "TCU"
msgstr "TCU"
#: allianceauth/timerboard/templates/timerboard/timertable.html:82
msgid "POS [S]"
msgstr "POS [S]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:88
msgid "POS [M]"
msgstr "POS [M]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:94
msgid "POS [L]"
msgstr "POS [L]"
#: allianceauth/timerboard/templates/timerboard/timertable.html:100
msgid "Astrahus"
msgstr "Астрахус"
#: allianceauth/timerboard/templates/timerboard/timertable.html:106
msgid "Fortizar"
msgstr "Фортізар"
#: allianceauth/timerboard/templates/timerboard/timertable.html:112
msgid "Keepstar"
msgstr "Кіпстар"
#: allianceauth/timerboard/templates/timerboard/timertable.html:118
msgid "Raitaru"
msgstr "Райтару"
#: allianceauth/timerboard/templates/timerboard/timertable.html:124
msgid "Azbel"
msgstr "Азбел"
#: allianceauth/timerboard/templates/timerboard/timertable.html:130
msgid "Sotiyo"
msgstr "Сотійо"
#: allianceauth/timerboard/templates/timerboard/timertable.html:136
msgid "Athanor"
msgstr "Атанор"
#: allianceauth/timerboard/templates/timerboard/timertable.html:142
msgid "Tatara"
msgstr "Татара"
#: allianceauth/timerboard/templates/timerboard/timertable.html:148
#: allianceauth/timerboard/templates/timerboard/timertable.html:79
msgid "Cyno Beacon"
msgstr "Циномаяк"
#: allianceauth/timerboard/templates/timerboard/timertable.html:154
#: allianceauth/timerboard/templates/timerboard/timertable.html:81
msgid "Cyno Jammer"
msgstr "Циноглушник"
#: allianceauth/timerboard/templates/timerboard/timertable.html:160
msgid "Ansiblex Jump Gate"
msgstr "Мост Ансіблекс"
#: allianceauth/timerboard/templates/timerboard/timertable.html:166
msgid "Moon Mining Cycle"
msgstr "Цикл видобутку супутника"
#: allianceauth/timerboard/templates/timerboard/view.html:9
msgid "Structure Timer Management"
msgstr "Керування таймерами структур"

View File

@@ -5,7 +5,7 @@
#
# Translators:
# Shen Yang, 2023
# Jesse . <sgeine@hotmail.com>, 2023
# 85b931f94c2441449e78b527e0a313ae_baf2e99 <639a60f913241ffb1c9bd90bc93a541f_869335>, 2023
# Aaron BuBu <351793078@qq.com>, 2023
# Joel Falknau <ozirascal@gmail.com>, 2023
#
@@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-12 19:15+1000\n"
"POT-Creation-Date: 2024-10-21 12:59+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Joel Falknau <ozirascal@gmail.com>, 2023\n"
"Language-Team: Chinese Simplified (https://app.transifex.com/alliance-auth/teams/107430/zh-Hans/)\n"
@@ -55,66 +55,90 @@ msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr ""
#: allianceauth/authentication/models.py:71
#: allianceauth/project_template/project_name/settings/base.py:99
msgid "English"
msgstr "英语"
#: allianceauth/authentication/models.py:72
msgid "Czech"
msgstr ""
#: allianceauth/authentication/models.py:73
#: allianceauth/project_template/project_name/settings/base.py:101
msgid "German"
msgstr "德语"
#: allianceauth/authentication/models.py:73
#: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:102
msgid "Spanish"
msgstr "西班牙语"
#: allianceauth/authentication/models.py:74
msgid "Chinese Simplified"
msgstr "简体中文"
#: allianceauth/authentication/models.py:75
msgid "Russian"
msgstr "俄语"
#: allianceauth/authentication/models.py:76
msgid "Korean"
msgstr "韩语"
#: allianceauth/authentication/models.py:77
msgid "French"
msgstr "法语"
#: allianceauth/authentication/models.py:78
msgid "Japanese"
msgstr "日语"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:103
msgid "Italian"
msgstr "意大利语"
#: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:104
msgid "Japanese"
msgstr "日语"
#: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:105
msgid "Korean"
msgstr "韩语"
#: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:106
msgid "French"
msgstr "法语"
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:109
msgid "Russian"
msgstr "俄语"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:107
msgid "Dutch"
msgstr ""
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:108
msgid "Polish"
msgstr ""
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:110
msgid "Ukrainian"
msgstr ""
#: allianceauth/authentication/models.py:96
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:111
msgid "Simplified Chinese"
msgstr ""
#: allianceauth/authentication/models.py:99
#: allianceauth/menu/templates/menu/menu-user.html:42
msgid "Language"
msgstr "语言"
#: allianceauth/authentication/models.py:101
#: allianceauth/authentication/models.py:104
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr "夜间模式"
#: allianceauth/authentication/models.py:105
#: allianceauth/authentication/models.py:108
#: allianceauth/menu/templates/menu/menu-user.html:46
msgid "Theme"
msgstr ""
#: allianceauth/authentication/models.py:122
#: allianceauth/authentication/models.py:125
#, python-format
msgid "State changed to: %s"
msgstr ""
#: allianceauth/authentication/models.py:123
#: allianceauth/authentication/models.py:126
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr ""
@@ -126,27 +150,27 @@ msgstr ""
msgid "Dashboard"
msgstr "账户总览"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:7
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:5
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:33
#: allianceauth/hrapplications/templates/hrapplications/view.html:54
msgid "Characters"
msgstr "角色"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:13
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:11
#: 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:6
msgid "Add Character"
msgstr "添加角色"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:16
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:17
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:14
#: 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:12
msgid "Change Main"
msgstr "修改主要角色"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:89
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:23
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:31
@@ -155,12 +179,12 @@ msgstr "修改主要角色"
msgid "Name"
msgstr "角色名"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:25
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:23
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:33
msgid "Corp"
msgstr "所在公司"
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:26
#: allianceauth/authentication/templates/authentication/dashboard_characters.html:24
#: allianceauth/corputils/templates/corputils/corpstats.html:125
#: allianceauth/hrapplications/templates/hrapplications/view.html:63
msgid "Alliance"
@@ -170,7 +194,7 @@ msgstr "所在联盟"
msgid "Membership"
msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:8
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:10
msgid "State:"
msgstr ""
@@ -402,6 +426,19 @@ msgstr "选定的军团已经有了一个统计模块"
msgid "Failed to gather corporation statistics with selected token."
msgstr "未能使用指定的令牌收集军团信息"
#: allianceauth/custom_css/apps.py:13 allianceauth/custom_css/models.py:36
#: allianceauth/custom_css/models.py:37 allianceauth/custom_css/models.py:47
msgid "Custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:25
msgid "Your custom CSS"
msgstr ""
#: allianceauth/custom_css/models.py:26
msgid "This CSS will be added to the site after the default CSS."
msgstr ""
#: allianceauth/fleetactivitytracking/auth_hooks.py:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkcreate.html:11
@@ -489,13 +526,14 @@ msgstr "删除舰队活动历史"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35
#: allianceauth/hrapplications/templates/hrapplications/view.html:41
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30
msgid "User"
msgstr "用户"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:37
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:42
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:59
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
#: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:37
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/timertable.html:9
msgid "System"
msgstr "星系"
@@ -682,7 +720,6 @@ msgstr "用户组管理"
#: allianceauth/groupmanagement/auth_hooks.py:51
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34
#: allianceauth/templates/allianceauth/side-menu.html:15
msgid "Groups"
msgstr "群组"
@@ -813,7 +850,7 @@ msgstr "申请人"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16
msgid "Type"
msgstr "类型"
@@ -905,7 +942,7 @@ msgid "Hidden"
msgstr "已隐藏"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:19
#: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Open"
msgstr "公开"
@@ -1381,16 +1418,16 @@ msgstr "通知"
msgid "Super User"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:68
#: allianceauth/menu/templates/menu/menu-user.html:70
#: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin"
msgstr "管理员"
#: allianceauth/menu/templates/menu/menu-user.html:80
#: allianceauth/menu/templates/menu/menu-user.html:82
msgid "Sign Out"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:84
#: allianceauth/menu/templates/menu/menu-user.html:86
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18
msgid "Sign In"
@@ -1540,7 +1577,7 @@ msgid "Form Up System"
msgstr "集结点"
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18
msgid "EVE Time"
msgstr ""
@@ -1735,17 +1772,17 @@ msgid ""
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:20
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:22
msgid "Activate"
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:34
msgid "Reset Password"
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:40
msgid "Deactivate"
msgstr ""
@@ -1826,15 +1863,61 @@ msgstr "修改IPSuite4密码"
msgid "Deactivated IPSuite4 account."
msgstr "停用IPSuite4账户"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6
msgid "Mumble"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10
msgid "Mumble History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22
msgid "Server Connection History"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31
msgid "Displayed Name"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32
msgid "Release"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67
msgid "Version"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34
msgid "Last Connect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35
msgid "Last Disconnect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59
msgid "Server Connection Breakdown"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68
msgid "Number"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28
#: allianceauth/services/templates/services/service_password.html:26
msgid "Set Password"
msgstr "设置密码"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:44
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:46
msgid "Connect"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52
msgid "Mumble Connection History"
msgstr ""
#: allianceauth/services/modules/openfire/auth_hooks.py:27
msgid "Jabber"
msgstr "Jabber"
@@ -2394,56 +2477,56 @@ msgstr "你做的修改已经保存到%(fleetname)s这个补损舰队啦
msgid "Your Server received an ESI error response code of "
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:11
#: allianceauth/templates/allianceauth/admin-status/overview.html:8
msgid "Alliance Auth Notifications"
msgstr "系统通知"
#: allianceauth/templates/allianceauth/admin-status/overview.html:21
#: allianceauth/templates/allianceauth/admin-status/overview.html:18
msgid "Closed"
msgstr "已关闭"
#: allianceauth/templates/allianceauth/admin-status/overview.html:27
#: allianceauth/templates/allianceauth/admin-status/overview.html:24
msgid "No notifications at this time"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:36
#: allianceauth/templates/allianceauth/admin-status/overview.html:33
msgid "Powered by GitLab"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:42
#: allianceauth/templates/allianceauth/admin-status/overview.html:39
msgid "Support Discord"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:59
#: allianceauth/templates/allianceauth/admin-status/overview.html:63
#: allianceauth/templates/allianceauth/admin-status/overview.html:53
#: allianceauth/templates/allianceauth/admin-status/overview.html:57
msgid "Software Version"
msgstr "软件版本"
#: allianceauth/templates/allianceauth/admin-status/overview.html:66
#: allianceauth/templates/allianceauth/admin-status/overview.html:60
msgid "Current"
msgstr "当前版本"
#: allianceauth/templates/allianceauth/admin-status/overview.html:73
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Latest Stable"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:78
#: allianceauth/templates/allianceauth/admin-status/overview.html:72
msgid "Update available"
msgstr "有更新!"
#: allianceauth/templates/allianceauth/admin-status/overview.html:86
#: allianceauth/templates/allianceauth/admin-status/overview.html:80
msgid "Latest Pre-Release"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
#: allianceauth/templates/allianceauth/admin-status/overview.html:85
msgid "Pre-Release available"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:102
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
msgid "Task Queue"
msgstr "任务队列"
#: allianceauth/templates/allianceauth/admin-status/overview.html:107
#: allianceauth/templates/allianceauth/admin-status/overview.html:100
#, python-format
msgid ""
"\n"
@@ -2451,11 +2534,11 @@ msgid ""
" "
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:123
#: allianceauth/templates/allianceauth/admin-status/overview.html:116
msgid "running"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:124
#: allianceauth/templates/allianceauth/admin-status/overview.html:117
msgid "queued"
msgstr ""
@@ -2484,114 +2567,216 @@ msgstr "打开导航栏"
msgid "Select Theme"
msgstr ""
#: allianceauth/timerboard/form.py:53
#: allianceauth/timerboard/templates/timerboard/timertable.html:172
msgid "Other"
msgstr "其他"
#: allianceauth/timerboard/form.py:54
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:44
msgid "Friendly"
msgstr "蓝加"
#: allianceauth/timerboard/form.py:55
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Hostile"
msgstr "红减"
#: allianceauth/timerboard/form.py:56
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Neutral"
msgstr "白名"
#: allianceauth/timerboard/form.py:58
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:13
#: allianceauth/timerboard/form.py:36
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/timertable.html:7
msgid "Details"
msgstr "详细信息"
#: allianceauth/timerboard/form.py:60
#: allianceauth/timerboard/form.py:38
msgid "Planet/Moon"
msgstr "行星/卫星"
#: allianceauth/timerboard/form.py:61
#: allianceauth/timerboard/form.py:39
msgid "Structure Type"
msgstr "建筑类型"
#: allianceauth/timerboard/form.py:62
#: allianceauth/timerboard/form.py:40
msgid "Timer Type"
msgstr ""
#: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/form.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:8
msgid "Objective"
msgstr "声望"
#: allianceauth/timerboard/form.py:64
#: allianceauth/timerboard/form.py:42
msgid "Absolute Timer"
msgstr ""
#: allianceauth/timerboard/form.py:65
#: allianceauth/timerboard/form.py:43
msgid "Date and Time"
msgstr ""
#: allianceauth/timerboard/form.py:66
#: allianceauth/timerboard/form.py:44
msgid "Days Remaining"
msgstr "剩余天数"
#: allianceauth/timerboard/form.py:67
#: allianceauth/timerboard/form.py:45
msgid "Hours Remaining"
msgstr "剩余小时数"
#: allianceauth/timerboard/form.py:69
#: allianceauth/timerboard/form.py:47
msgid "Minutes Remaining"
msgstr "剩余分钟"
#: allianceauth/timerboard/form.py:71
#: allianceauth/timerboard/form.py:48
msgid "Important"
msgstr "重要信息"
#: allianceauth/timerboard/form.py:72
#: allianceauth/timerboard/form.py:49
msgid "Corp-Restricted"
msgstr "受限制的公司"
#: allianceauth/timerboard/models.py:14
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:39
#: allianceauth/timerboard/templates/timerboard/timertable.html:36
msgid "Friendly"
msgstr "蓝加"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:34
msgid "Hostile"
msgstr "红减"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:38
msgid "Neutral"
msgstr "白名"
#: allianceauth/timerboard/models.py:24
#: allianceauth/timerboard/templates/timerboard/timertable.html:48
msgid "POCO"
msgstr ""
#: allianceauth/timerboard/models.py:25
#: allianceauth/timerboard/templates/timerboard/timertable.html:50
msgid "Orbital Skyhook"
msgstr ""
#: allianceauth/timerboard/models.py:26
#: allianceauth/timerboard/templates/timerboard/timertable.html:52
msgid "I-HUB"
msgstr ""
#: allianceauth/timerboard/models.py:27
#: allianceauth/timerboard/templates/timerboard/timertable.html:55
msgid "TCU"
msgstr ""
#: allianceauth/timerboard/models.py:28
#: allianceauth/timerboard/templates/timerboard/timertable.html:57
msgid "POS [S]"
msgstr ""
#: allianceauth/timerboard/models.py:29
#: allianceauth/timerboard/templates/timerboard/timertable.html:59
msgid "POS [M]"
msgstr ""
#: allianceauth/timerboard/models.py:30
#: allianceauth/timerboard/templates/timerboard/timertable.html:61
msgid "POS [L]"
msgstr ""
#: allianceauth/timerboard/models.py:31
#: allianceauth/timerboard/templates/timerboard/timertable.html:63
msgid "Astrahus"
msgstr ""
#: allianceauth/timerboard/models.py:32
#: allianceauth/timerboard/templates/timerboard/timertable.html:65
msgid "Fortizar"
msgstr ""
#: allianceauth/timerboard/models.py:33
#: allianceauth/timerboard/templates/timerboard/timertable.html:67
msgid "Keepstar"
msgstr ""
#: allianceauth/timerboard/models.py:34
#: allianceauth/timerboard/templates/timerboard/timertable.html:69
msgid "Raitaru"
msgstr ""
#: allianceauth/timerboard/models.py:35
#: allianceauth/timerboard/templates/timerboard/timertable.html:71
msgid "Azbel"
msgstr ""
#: allianceauth/timerboard/models.py:36
#: allianceauth/timerboard/templates/timerboard/timertable.html:73
msgid "Sotiyo"
msgstr ""
#: allianceauth/timerboard/models.py:37
#: allianceauth/timerboard/templates/timerboard/timertable.html:75
msgid "Athanor"
msgstr ""
#: allianceauth/timerboard/models.py:38
#: allianceauth/timerboard/templates/timerboard/timertable.html:77
msgid "Tatara"
msgstr ""
#: allianceauth/timerboard/models.py:39
msgid "Pharolux Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/models.py:40
msgid "Tenebrex Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/models.py:41
#: allianceauth/timerboard/templates/timerboard/timertable.html:83
msgid "Ansiblex Jump Gate"
msgstr ""
#: allianceauth/timerboard/models.py:42
#: allianceauth/timerboard/templates/timerboard/timertable.html:85
msgid "Moon Mining Cycle"
msgstr ""
#: allianceauth/timerboard/models.py:43
#: allianceauth/timerboard/templates/timerboard/timertable.html:87
msgid "Metenox Moon Drill"
msgstr ""
#: allianceauth/timerboard/models.py:44
#: allianceauth/timerboard/templates/timerboard/timertable.html:89
msgid "Other"
msgstr "其他"
#: allianceauth/timerboard/models.py:51
msgid "Not Specified"
msgstr ""
#: allianceauth/timerboard/models.py:15
#: allianceauth/timerboard/models.py:52
msgid "Shield"
msgstr "护盾"
#: allianceauth/timerboard/models.py:16
#: allianceauth/timerboard/models.py:53
msgid "Armor"
msgstr "装甲"
#: allianceauth/timerboard/models.py:17
#: allianceauth/timerboard/models.py:54
msgid "Hull"
msgstr "结构"
#: allianceauth/timerboard/models.py:18
#: allianceauth/timerboard/models.py:55
msgid "Final"
msgstr ""
#: allianceauth/timerboard/models.py:19
#: allianceauth/timerboard/models.py:56
msgid "Anchoring"
msgstr "铆钉"
#: allianceauth/timerboard/models.py:20
#: allianceauth/timerboard/models.py:57
msgid "Unanchoring"
msgstr "解锚"
#: allianceauth/timerboard/models.py:58
msgid "Abandoned"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:53
msgid "Upcoming Timers"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15
msgid "Timer"
msgstr ""
@@ -2635,78 +2820,14 @@ msgstr "更新建筑时间表"
msgid "Structure"
msgstr "建筑"
#: allianceauth/timerboard/templates/timerboard/timertable.html:64
msgid "POCO"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:70
msgid "I-HUB"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:76
msgid "TCU"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:82
msgid "POS [S]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:88
msgid "POS [M]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:94
msgid "POS [L]"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:100
msgid "Astrahus"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:106
msgid "Fortizar"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:112
msgid "Keepstar"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:118
msgid "Raitaru"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:124
msgid "Azbel"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:130
msgid "Sotiyo"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:136
msgid "Athanor"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:142
msgid "Tatara"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:148
#: allianceauth/timerboard/templates/timerboard/timertable.html:79
msgid "Cyno Beacon"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:154
#: allianceauth/timerboard/templates/timerboard/timertable.html:81
msgid "Cyno Jammer"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:160
msgid "Ansiblex Jump Gate"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/timertable.html:166
msgid "Moon Mining Cycle"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/view.html:9
msgid "Structure Timer Management"
msgstr "管理建筑时间表"

View File

@@ -1 +1,21 @@
"""
Example
=======
.. code-block:: python
from allianceauth.notifications.models import Notification
def notify_user_view(request):
'''Simple view sending a notification to the user'''
Notification.objects.notify_user(
user=request.user,
title="Some title",
message="Some message",
level=Notification.Level.INFO,
)
"""
from .core import notify # noqa: F401

View File

@@ -15,7 +15,7 @@ class OpForm(forms.Form):
operation_name = forms.CharField(max_length=254, required=True, label=_("Operation Name"))
type = forms.CharField(required=False, label=_("Operation Type"))
fc = forms.CharField(max_length=254, required=True, label=_("Fleet Commander"))
duration = forms.CharField(max_length=254, required=True, label=_("Duration"))
duration = forms.CharField(max_length=25, required=True, label=_("Duration"))
description = forms.CharField(
widget=forms.Textarea(attrs={"rows": 10, "cols": 20, "input_type": "textarea"}),
required=False,

View File

@@ -12,6 +12,8 @@ from celery.schedules import crontab
from django.contrib import messages
from django.utils.translation import gettext_lazy as _
INSTALLED_APPS = [
'allianceauth', # needs to be on top of this list to support favicons in Django admin (see https://gitlab.com/allianceauth/allianceauth/-/issues/1301)
'django.contrib.admin',
@@ -22,6 +24,7 @@ INSTALLED_APPS = [
'django.contrib.staticfiles',
'django.contrib.humanize',
'django_celery_beat',
'solo',
'bootstrapform',
'django_bootstrap5', # https://github.com/zostera/django-bootstrap5
'sortedm2m',
@@ -39,6 +42,7 @@ INSTALLED_APPS = [
'allianceauth.theme.darkly',
'allianceauth.theme.flatly',
'allianceauth.theme.materia',
"allianceauth.custom_css",
]
SECRET_KEY = "wow I'm a really bad default secret key"
@@ -91,18 +95,20 @@ LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale/'),
)
LANGUAGES = (
("en", "English"),
("de", "German"),
("es", "Spanish"),
("zh-hans", "Chinese Simplified"),
("ru", "Russian"),
("ko", "Korean"),
("fr", "French"),
("ja", "Japanese"),
("it", "Italian"),
("uk", "Ukrainian"),
("pl", "Polish"),
LANGUAGES = ( # Sorted by Language Code alphabetical order + English at top
("en", _("English")),
# ("cs-cz", _("Czech")), #Not yet at 50% translated
("de", _("German")),
("es", _("Spanish")),
("it-it", _("Italian")),
("ja", _("Japanese")),
("ko-kr", _("Korean")),
("fr-fr", _("French")),
("nl-nl", _("Dutch")),
("pl-pl", _("Polish")),
("ru", _("Russian")),
("uk", _("Ukrainian")),
("zh-hans", _("Simplified Chinese")),
)
TEMPLATES = [

View File

@@ -0,0 +1,941 @@
// Copyright 2022-2023 The Mumble Developers. All rights reserved.
// Use of this source code is governed by a BSD-style license
// that can be found in the LICENSE file at the root of the
// Mumble source tree or at <https://www.mumble.info/LICENSE>.
/**
*
* Information and control of the murmur server. Each server has
* one {@link Meta} interface that controls global information, and
* each virtual server has a {@link Server} interface.
*
**/
#include <Ice/SliceChecksumDict.ice>
module MumbleServer
{
/** A network address in IPv6 format.
**/
["python:seq:tuple"] sequence<byte> NetAddress;
/** A connected user.
**/
struct User {
/** Session ID. This identifies the connection to the server. */
int session;
/** User ID. -1 if the user is anonymous. */
int userid;
/** Is user muted by the server? */
bool mute;
/** Is user deafened by the server? If true, this implies mute. */
bool deaf;
/** Is the user suppressed by the server? This means the user is not muted, but does not have speech privileges in the current channel. */
bool suppress;
/** Is the user a priority speaker? */
bool prioritySpeaker;
/** Is the user self-muted? */
bool selfMute;
/** Is the user self-deafened? If true, this implies mute. */
bool selfDeaf;
/** Is the User recording? (This flag is read-only and cannot be changed using setState().) **/
bool recording;
/** Channel ID the user is in. Matches {@link Channel.id}. */
int channel;
/** The name of the user. */
string name;
/** Seconds user has been online. */
int onlinesecs;
/** Average transmission rate in bytes per second over the last few seconds. */
int bytespersec;
/** Legacy client version. */
int version;
/** New client version. (See https://github.com/mumble-voip/mumble/issues/5827) */
long version2;
/** Client release. For official releases, this equals the version. For snapshots and git compiles, this will be something else. */
string release;
/** Client OS. */
string os;
/** Client OS Version. */
string osversion;
/** Plugin Identity. This will be the user's unique ID inside the current game. */
string identity;
/**
Base64-encoded Plugin context. This is a binary blob identifying the game and team the user is on.
The used Base64 alphabet is the one specified in RFC 2045.
Before Mumble 1.3.0, this string was not Base64-encoded. This could cause problems for some Ice
implementations, such as the .NET implementation.
If you need the exact string that is used by Mumble, you can get it by Base64-decoding this string.
If you simply need to detect whether two users are in the same game world, string comparisons will
continue to work as before.
*/
string context;
/** User comment. Shown as tooltip for this user. */
string comment;
/** Client address. */
NetAddress address;
/** TCP only. True until UDP connectivity is established. */
bool tcponly;
/** Idle time. This is how many seconds it is since the user last spoke. Other activity is not counted. */
int idlesecs;
/** UDP Ping Average. This is the average ping for the user via UDP over the duration of the connection. */
float udpPing;
/** TCP Ping Average. This is the average ping for the user via TCP over the duration of the connection. */
float tcpPing;
};
sequence<int> IntList;
/** A text message between users.
**/
struct TextMessage {
/** Sessions (connected users) who were sent this message. */
IntList sessions;
/** Channels who were sent this message. */
IntList channels;
/** Trees of channels who were sent this message. */
IntList trees;
/** The contents of the message. */
string text;
};
/** A channel.
**/
struct Channel {
/** Channel ID. This is unique per channel, and the root channel is always id 0. */
int id;
/** Name of the channel. There can not be two channels with the same parent that has the same name. */
string name;
/** ID of parent channel, or -1 if this is the root channel. */
int parent;
/** List of id of linked channels. */
IntList links;
/** Description of channel. Shown as tooltip for this channel. */
string description;
/** Channel is temporary, and will be removed when the last user leaves it. */
bool temporary;
/** Position of the channel which is used in Client for sorting. */
int position;
};
/** A group. Groups are defined per channel, and can inherit members from parent channels.
**/
struct Group {
/** Group name */
string name;
/** Is this group inherited from a parent channel? Read-only. */
bool inherited;
/** Does this group inherit members from parent channels? */
bool inherit;
/** Can subchannels inherit members from this group? */
bool inheritable;
/** List of users to add to the group. */
IntList add;
/** List of inherited users to remove from the group. */
IntList remove;
/** Current members of the group, including inherited members. Read-only. */
IntList members;
};
/** Write access to channel control. Implies all other permissions (except Speak). */
const int PermissionWrite = 0x01;
/** Traverse channel. Without this, a client cannot reach subchannels, no matter which privileges he has there. */
const int PermissionTraverse = 0x02;
/** Enter channel. */
const int PermissionEnter = 0x04;
/** Speak in channel. */
const int PermissionSpeak = 0x08;
/** Whisper to channel. This is different from Speak, so you can set up different permissions. */
const int PermissionWhisper = 0x100;
/** Mute and deafen other users in this channel. */
const int PermissionMuteDeafen = 0x10;
/** Move users from channel. You need this permission in both the source and destination channel to move another user. */
const int PermissionMove = 0x20;
/** Make new channel as a subchannel of this channel. */
const int PermissionMakeChannel = 0x40;
/** Make new temporary channel as a subchannel of this channel. */
const int PermissionMakeTempChannel = 0x400;
/** Link this channel. You need this permission in both the source and destination channel to link channels, or in either channel to unlink them. */
const int PermissionLinkChannel = 0x80;
/** Send text message to channel. */
const int PermissionTextMessage = 0x200;
/** Kick user from server. Only valid on root channel. */
const int PermissionKick = 0x10000;
/** Ban user from server. Only valid on root channel. */
const int PermissionBan = 0x20000;
/** Register and unregister users. Only valid on root channel. */
const int PermissionRegister = 0x40000;
/** Register and unregister users. Only valid on root channel. */
const int PermissionRegisterSelf = 0x80000;
/** Reset the comment or avatar of a user. Only valid on root channel. */
const int ResetUserContent = 0x100000;
/** Access Control List for a channel. ACLs are defined per channel, and can be inherited from parent channels.
**/
struct ACL {
/** Does the ACL apply to this channel? */
bool applyHere;
/** Does the ACL apply to subchannels? */
bool applySubs;
/** Is this ACL inherited from a parent channel? Read-only. */
bool inherited;
/** ID of user this ACL applies to. -1 if using a group name. */
int userid;
/** Group this ACL applies to. Blank if using userid. */
string group;
/** Binary mask of privileges to allow. */
int allow;
/** Binary mask of privileges to deny. */
int deny;
};
/** A single ip mask for a ban.
**/
struct Ban {
/** Address to ban. */
NetAddress address;
/** Number of bits in ban to apply. */
int bits;
/** Username associated with ban. */
string name;
/** Hash of banned user. */
string hash;
/** Reason for ban. */
string reason;
/** Date ban was applied in unix time format. */
int start;
/** Duration of ban. */
int duration;
};
/** A entry in the log.
**/
struct LogEntry {
/** Timestamp in UNIX time_t */
int timestamp;
/** The log message. */
string txt;
};
class Tree;
sequence<Tree> TreeList;
enum ChannelInfo { ChannelDescription, ChannelPosition };
enum UserInfo { UserName, UserEmail, UserComment, UserHash, UserPassword, UserLastActive, UserKDFIterations };
dictionary<int, User> UserMap;
dictionary<int, Channel> ChannelMap;
sequence<Channel> ChannelList;
sequence<User> UserList;
sequence<Group> GroupList;
sequence<ACL> ACLList;
sequence<LogEntry> LogList;
sequence<Ban> BanList;
sequence<int> IdList;
sequence<string> NameList;
dictionary<int, string> NameMap;
dictionary<string, int> IdMap;
sequence<byte> Texture;
dictionary<string, string> ConfigMap;
sequence<string> GroupNameList;
sequence<byte> CertificateDer;
sequence<CertificateDer> CertificateList;
/** User information map.
* Older versions of ice-php can't handle enums as keys. If you are using one of these, replace 'UserInfo' with 'byte'.
*/
dictionary<UserInfo, string> UserInfoMap;
/** User and subchannel state. Read-only.
**/
class Tree {
/** Channel definition of current channel. */
Channel c;
/** List of subchannels. */
TreeList children;
/** Users in this channel. */
UserList users;
};
exception MurmurException {};
/** This is thrown when you specify an invalid session. This may happen if the user has disconnected since your last call to {@link Server.getUsers}. See {@link User.session} */
exception InvalidSessionException extends MurmurException {};
/** This is thrown when you specify an invalid channel id. This may happen if the channel was removed by another provess. It can also be thrown if you try to add an invalid channel. */
exception InvalidChannelException extends MurmurException {};
/** This is thrown when you try to do an operation on a server that does not exist. This may happen if someone has removed the server. */
exception InvalidServerException extends MurmurException {};
/** This happens if you try to fetch user or channel state on a stopped server, if you try to stop an already stopped server or start an already started server. */
exception ServerBootedException extends MurmurException {};
/** This is thrown if {@link Server.start} fails, and should generally be the cause for some concern. */
exception ServerFailureException extends MurmurException {};
/** This is thrown when you specify an invalid userid. */
exception InvalidUserException extends MurmurException {};
/** This is thrown when you try to set an invalid texture. */
exception InvalidTextureException extends MurmurException {};
/** This is thrown when you supply an invalid callback. */
exception InvalidCallbackException extends MurmurException {};
/** This is thrown when you supply the wrong secret in the calling context. */
exception InvalidSecretException extends MurmurException {};
/** This is thrown when the channel operation would exceed the channel nesting limit */
exception NestingLimitException extends MurmurException {};
/** This is thrown when you ask the server to disclose something that should be secret. */
exception WriteOnlyException extends MurmurException {};
/** This is thrown when invalid input data was specified. */
exception InvalidInputDataException extends MurmurException {};
/** Callback interface for servers. You can supply an implementation of this to receive notification
* messages from the server.
* If an added callback ever throws an exception or goes away, it will be automatically removed.
* Please note that all callbacks are done asynchronously; murmur does not wait for the callback to
* complete before continuing processing.
* Note that callbacks are removed when a server is stopped, so you should have a callback for
* {@link MetaCallback.started} which calls {@link Server.addCallback}.
* @see MetaCallback
* @see Server.addCallback
*/
interface ServerCallback {
/** Called when a user connects to the server.
* @param state State of connected user.
*/
idempotent void userConnected(User state);
/** Called when a user disconnects from the server. The user has already been removed, so you can no longer use methods like {@link Server.getState}
* to retrieve the user's state.
* @param state State of disconnected user.
*/
idempotent void userDisconnected(User state);
/** Called when a user state changes. This is called if the user moves, is renamed, is muted, deafened etc.
* @param state New state of user.
*/
idempotent void userStateChanged(User state);
/** Called when user writes a text message
* @param state the User sending the message
* @param message the TextMessage the user has sent
*/
idempotent void userTextMessage(User state, TextMessage message);
/** Called when a new channel is created.
* @param state State of new channel.
*/
idempotent void channelCreated(Channel state);
/** Called when a channel is removed. The channel has already been removed, you can no longer use methods like {@link Server.getChannelState}
* @param state State of removed channel.
*/
idempotent void channelRemoved(Channel state);
/** Called when a new channel state changes. This is called if the channel is moved, renamed or if new links are added.
* @param state New state of channel.
*/
idempotent void channelStateChanged(Channel state);
};
/** Context for actions in the Server menu. */
const int ContextServer = 0x01;
/** Context for actions in the Channel menu. */
const int ContextChannel = 0x02;
/** Context for actions in the User menu. */
const int ContextUser = 0x04;
/** Callback interface for context actions. You need to supply one of these for {@link Server.addContext}.
* If an added callback ever throws an exception or goes away, it will be automatically removed.
* Please note that all callbacks are done asynchronously; murmur does not wait for the callback to
* complete before continuing processing.
*/
interface ServerContextCallback {
/** Called when a context action is performed.
* @param action Action to be performed.
* @param usr User which initiated the action.
* @param session If nonzero, session of target user.
* @param channelid If not -1, id of target channel.
*/
idempotent void contextAction(string action, User usr, int session, int channelid);
};
/** Callback interface for server authentication. You need to supply one of these for {@link Server.setAuthenticator}.
* If an added callback ever throws an exception or goes away, it will be automatically removed.
* Please note that unlike {@link ServerCallback} and {@link ServerContextCallback}, these methods are called
* synchronously. If the response lags, the entire murmur server will lag.
* Also note that, as the method calls are synchronous, making a call to {@link Server} or {@link Meta} will
* deadlock the server.
*/
interface ServerAuthenticator {
/** Called to authenticate a user. If you do not know the username in question, always return -2 from this
* method to fall through to normal database authentication.
* Note that if authentication succeeds, murmur will create a record of the user in it's database, reserving
* the username and id so it cannot be used for normal database authentication.
* The data in the certificate (name, email addresses etc), as well as the list of signing certificates,
* should only be trusted if certstrong is true.
*
* Internally, Murmur treats usernames as case-insensitive. It is recommended
* that authenticators do the same. Murmur checks if a username is in use when
* a user connects. If the connecting user is registered, the other username is
* kicked. If the connecting user is not registered, the connecting user is not
* allowed to join the server.
*
* @param name Username to authenticate.
* @param pw Password to authenticate with.
* @param certificates List of der encoded certificates the user connected with.
* @param certhash Hash of user certificate, as used by murmur internally when matching.
* @param certstrong True if certificate was valid and signed by a trusted CA.
* @param newname Set this to change the username from the supplied one.
* @param groups List of groups on the root channel that the user will be added to for the duration of the connection.
* @return UserID of authenticated user, -1 for authentication failures, -2 for unknown user (fallthrough),
* -3 for authentication failures where the data could (temporarily) not be verified.
*/
idempotent int authenticate(string name, string pw, CertificateList certificates, string certhash, bool certstrong, out string newname, out GroupNameList groups);
/** Fetch information about a user. This is used to retrieve information like email address, keyhash etc. If you
* want murmur to take care of this information itself, simply return false to fall through.
* @param id User id.
* @param info Information about user. This needs to include at least "name".
* @return true if information is present, false to fall through.
*/
idempotent bool getInfo(int id, out UserInfoMap info);
/** Map a name to a user id.
* @param name Username to map.
* @return User id or -2 for unknown name.
*/
idempotent int nameToId(string name);
/** Map a user id to a username.
* @param id User id to map.
* @return Name of user or empty string for unknown id.
*/
idempotent string idToName(int id);
/** Map a user to a custom Texture.
* @param id User id to map.
* @return User texture or an empty texture for unknown users or users without textures.
*/
idempotent Texture idToTexture(int id);
};
/** Callback interface for server authentication and registration. This allows you to support both authentication
* and account updating.
* You do not need to implement this if all you want is authentication, you only need this if other scripts
* connected to the same server calls e.g. {@link Server.setTexture}.
* Almost all of these methods support fall through, meaning murmur should continue the operation against its
* own database.
*/
interface ServerUpdatingAuthenticator extends ServerAuthenticator {
/** Register a new user.
* @param info Information about user to register.
* @return User id of new user, -1 for registration failure, or -2 to fall through.
*/
int registerUser(UserInfoMap info);
/** Unregister a user.
* @param id Userid to unregister.
* @return 1 for successful unregistration, 0 for unsuccessful unregistration, -1 to fall through.
*/
int unregisterUser(int id);
/** Get a list of registered users matching filter.
* @param filter Substring usernames must contain. If empty, return all registered users.
* @return List of matching registered users.
*/
idempotent NameMap getRegisteredUsers(string filter);
/** Set additional information for user registration.
* @param id Userid of registered user.
* @param info Information to set about user. This should be merged with existing information.
* @return 1 for successful update, 0 for unsuccessful update, -1 to fall through.
*/
idempotent int setInfo(int id, UserInfoMap info);
/** Set texture (now called avatar) of user registration.
* @param id registrationId of registered user.
* @param tex New texture.
* @return 1 for successful update, 0 for unsuccessful update, -1 to fall through.
*/
idempotent int setTexture(int id, Texture tex);
};
/** Per-server interface. This includes all methods for configuring and altering
* the state of a single virtual server. You can retrieve a pointer to this interface
* from one of the methods in {@link Meta}.
**/
["amd"] interface Server {
/** Shows if the server currently running (accepting users).
*
* @return Run-state of server.
*/
idempotent bool isRunning() throws InvalidSecretException;
/** Start server. */
void start() throws ServerBootedException, ServerFailureException, InvalidSecretException;
/** Stop server.
* Note: Server will be restarted on Murmur restart unless explicitly disabled
* with setConf("boot", false)
*/
void stop() throws ServerBootedException, InvalidSecretException;
/** Delete server and all it's configuration. */
void delete() throws ServerBootedException, InvalidSecretException;
/** Fetch the server id.
*
* @return Unique server id.
*/
idempotent int id() throws InvalidSecretException;
/** Add a callback. The callback will receive notifications about changes to users and channels.
*
* @param cb Callback interface which will receive notifications.
* @see removeCallback
*/
void addCallback(ServerCallback *cb) throws ServerBootedException, InvalidCallbackException, InvalidSecretException;
/** Remove a callback.
*
* @param cb Callback interface to be removed.
* @see addCallback
*/
void removeCallback(ServerCallback *cb) throws ServerBootedException, InvalidCallbackException, InvalidSecretException;
/** Set external authenticator. If set, all authentications from clients are forwarded to this
* proxy.
*
* @param auth Authenticator object to perform subsequent authentications.
*/
void setAuthenticator(ServerAuthenticator *auth) throws ServerBootedException, InvalidCallbackException, InvalidSecretException;
/** Retrieve configuration item.
* @param key Configuration key.
* @return Configuration value. If this is empty, see {@link Meta.getDefaultConf}
*/
idempotent string getConf(string key) throws InvalidSecretException, WriteOnlyException;
/** Retrieve all configuration items.
* @return All configured values. If a value isn't set here, the value from {@link Meta.getDefaultConf} is used.
*/
idempotent ConfigMap getAllConf() throws InvalidSecretException;
/** Set a configuration item.
* @param key Configuration key.
* @param value Configuration value.
*/
idempotent void setConf(string key, string value) throws InvalidSecretException;
/** Set superuser password. This is just a convenience for using {@link updateRegistration} on user id 0.
* @param pw Password.
*/
idempotent void setSuperuserPassword(string pw) throws InvalidSecretException;
/** Fetch log entries.
* @param first Lowest numbered entry to fetch. 0 is the most recent item.
* @param last Last entry to fetch.
* @return List of log entries.
*/
idempotent LogList getLog(int first, int last) throws InvalidSecretException;
/** Fetch length of log
* @return Number of entries in log
*/
idempotent int getLogLen() throws InvalidSecretException;
/** Fetch all users. This returns all currently connected users on the server.
* @return List of connected users.
* @see getState
*/
idempotent UserMap getUsers() throws ServerBootedException, InvalidSecretException;
/** Fetch all channels. This returns all defined channels on the server. The root channel is always channel 0.
* @return List of defined channels.
* @see getChannelState
*/
idempotent ChannelMap getChannels() throws ServerBootedException, InvalidSecretException;
/** Fetch certificate of user. This returns the complete certificate chain of a user.
* @param session Connection ID of user. See {@link User.session}.
* @return Certificate list of user.
*/
idempotent CertificateList getCertificateList(int session) throws ServerBootedException, InvalidSessionException, InvalidSecretException;
/** Fetch all channels and connected users as a tree. This retrieves an easy-to-use representation of the server
* as a tree. This is primarily used for viewing the state of the server on a webpage.
* @return Recursive tree of all channels and connected users.
*/
idempotent Tree getTree() throws ServerBootedException, InvalidSecretException;
/** Fetch all current IP bans on the server.
* @return List of bans.
*/
idempotent BanList getBans() throws ServerBootedException, InvalidSecretException;
/** Set all current IP bans on the server. This will replace any bans already present, so if you want to add a ban, be sure to call {@link getBans} and then
* append to the returned list before calling this method.
* @param bans List of bans.
*/
idempotent void setBans(BanList bans) throws ServerBootedException, InvalidSecretException;
/** Kick a user. The user is not banned, and is free to rejoin the server.
* @param session Connection ID of user. See {@link User.session}.
* @param reason Text message to show when user is kicked.
*/
void kickUser(int session, string reason) throws ServerBootedException, InvalidSessionException, InvalidSecretException;
/** Get state of a single connected user.
* @param session Connection ID of user. See {@link User.session}.
* @return State of connected user.
* @see setState
* @see getUsers
*/
idempotent User getState(int session) throws ServerBootedException, InvalidSessionException, InvalidSecretException;
/** Set user state. You can use this to move, mute and deafen users.
* @param state User state to set.
* @see getState
*/
idempotent void setState(User state) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException;
/** Send text message to a single user.
* @param session Connection ID of user. See {@link User.session}.
* @param text Message to send.
* @see sendMessageChannel
*/
void sendMessage(int session, string text) throws ServerBootedException, InvalidSessionException, InvalidSecretException;
/** Check if user is permitted to perform action.
* @param session Connection ID of user. See {@link User.session}.
* @param channelid ID of Channel. See {@link Channel.id}.
* @param perm Permission bits to check.
* @return true if any of the permissions in perm were set for the user.
*/
bool hasPermission(int session, int channelid, int perm) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException;
/** Return users effective permissions
* @param session Connection ID of user. See {@link User.session}.
* @param channelid ID of Channel. See {@link Channel.id}.
* @return bitfield of allowed actions
*/
idempotent int effectivePermissions(int session, int channelid) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException;
/** Add a context callback. This is done per user, and will add a context menu action for the user.
*
* @param session Session of user which should receive context entry.
* @param action Action string, a unique name to associate with the action.
* @param text Name of action shown to user.
* @param cb Callback interface which will receive notifications.
* @param ctx Context this should be used in. Needs to be one or a combination of {@link ContextServer}, {@link ContextChannel} and {@link ContextUser}.
* @see removeContextCallback
*/
void addContextCallback(int session, string action, string text, ServerContextCallback *cb, int ctx) throws ServerBootedException, InvalidCallbackException, InvalidSecretException;
/** Remove a callback.
*
* @param cb Callback interface to be removed. This callback will be removed from all from all users.
* @see addContextCallback
*/
void removeContextCallback(ServerContextCallback *cb) throws ServerBootedException, InvalidCallbackException, InvalidSecretException;
/** Get state of single channel.
* @param channelid ID of Channel. See {@link Channel.id}.
* @return State of channel.
* @see setChannelState
* @see getChannels
*/
idempotent Channel getChannelState(int channelid) throws ServerBootedException, InvalidChannelException, InvalidSecretException;
/** Set state of a single channel. You can use this to move or relink channels.
* @param state Channel state to set.
* @see getChannelState
*/
idempotent void setChannelState(Channel state) throws ServerBootedException, InvalidChannelException, InvalidSecretException, NestingLimitException;
/** Remove a channel and all its subchannels.
* @param channelid ID of Channel. See {@link Channel.id}.
*/
void removeChannel(int channelid) throws ServerBootedException, InvalidChannelException, InvalidSecretException;
/** Add a new channel.
* @param name Name of new channel.
* @param parent Channel ID of parent channel. See {@link Channel.id}.
* @return ID of newly created channel.
*/
int addChannel(string name, int parent) throws ServerBootedException, InvalidChannelException, InvalidSecretException, NestingLimitException;
/** Send text message to channel or a tree of channels.
* @param channelid Channel ID of channel to send to. See {@link Channel.id}.
* @param tree If true, the message will be sent to the channel and all its subchannels.
* @param text Message to send.
* @see sendMessage
*/
void sendMessageChannel(int channelid, bool tree, string text) throws ServerBootedException, InvalidChannelException, InvalidSecretException;
/** Retrieve ACLs and Groups on a channel.
* @param channelid Channel ID of channel to fetch from. See {@link Channel.id}.
* @param acls List of ACLs on the channel. This will include inherited ACLs.
* @param groups List of groups on the channel. This will include inherited groups.
* @param inherit Does this channel inherit ACLs from the parent channel?
*/
idempotent void getACL(int channelid, out ACLList acls, out GroupList groups, out bool inherit) throws ServerBootedException, InvalidChannelException, InvalidSecretException;
/** Set ACLs and Groups on a channel. Note that this will replace all existing ACLs and groups on the channel.
* @param channelid Channel ID of channel to fetch from. See {@link Channel.id}.
* @param acls List of ACLs on the channel.
* @param groups List of groups on the channel.
* @param inherit Should this channel inherit ACLs from the parent channel?
*/
idempotent void setACL(int channelid, ACLList acls, GroupList groups, bool inherit) throws ServerBootedException, InvalidChannelException, InvalidSecretException;
/** Temporarily add a user to a group on a channel. This state is not saved, and is intended for temporary memberships.
* @param channelid Channel ID of channel to add to. See {@link Channel.id}.
* @param session Connection ID of user. See {@link User.session}.
* @param group Group name to add to.
*/
idempotent void addUserToGroup(int channelid, int session, string group) throws ServerBootedException, InvalidChannelException, InvalidSessionException, InvalidSecretException;
/** Remove a user from a temporary group membership on a channel. This state is not saved, and is intended for temporary memberships.
* @param channelid Channel ID of channel to add to. See {@link Channel.id}.
* @param session Connection ID of user. See {@link User.session}.
* @param group Group name to remove from.
*/
idempotent void removeUserFromGroup(int channelid, int session, string group) throws ServerBootedException, InvalidChannelException, InvalidSessionException, InvalidSecretException;
/** Redirect whisper targets for user. If set, whenever a user tries to whisper to group "source", the whisper will be redirected to group "target".
* To remove a redirect pass an empty target string. This is intended for context groups.
* @param session Connection ID of user. See {@link User.session}.
* @param source Group name to redirect from.
* @param target Group name to redirect to.
*/
idempotent void redirectWhisperGroup(int session, string source, string target) throws ServerBootedException, InvalidSessionException, InvalidSecretException;
/** Map a list of {@link User.userid} to a matching name.
* @param List of ids.
* @return Matching list of names, with an empty string representing invalid or unknown ids.
*/
idempotent NameMap getUserNames(IdList ids) throws ServerBootedException, InvalidSecretException;
/** Map a list of user names to a matching id.
* @param List of names.
* @reuturn List of matching ids, with -1 representing invalid or unknown user names.
*/
idempotent IdMap getUserIds(NameList names) throws ServerBootedException, InvalidSecretException;
/** Register a new user.
* @param info Information about new user. Must include at least "name".
* @return The ID of the user. See {@link RegisteredUser.userid}.
*/
int registerUser(UserInfoMap info) throws ServerBootedException, InvalidUserException, InvalidSecretException;
/** Remove a user registration.
* @param userid ID of registered user. See {@link RegisteredUser.userid}.
*/
void unregisterUser(int userid) throws ServerBootedException, InvalidUserException, InvalidSecretException;
/** Update the registration for a user. You can use this to set the email or password of a user,
* and can also use it to change the user's name.
* @param registration Updated registration record.
*/
idempotent void updateRegistration(int userid, UserInfoMap info) throws ServerBootedException, InvalidUserException, InvalidSecretException;
/** Fetch registration for a single user.
* @param userid ID of registered user. See {@link RegisteredUser.userid}.
* @return Registration record.
*/
idempotent UserInfoMap getRegistration(int userid) throws ServerBootedException, InvalidUserException, InvalidSecretException;
/** Fetch a group of registered users.
* @param filter Substring of user name. If blank, will retrieve all registered users.
* @return List of registration records.
*/
idempotent NameMap getRegisteredUsers(string filter) throws ServerBootedException, InvalidSecretException;
/** Verify the password of a user. You can use this to verify a user's credentials.
* @param name User name. See {@link RegisteredUser.name}.
* @param pw User password.
* @return User ID of registered user (See {@link RegisteredUser.userid}), -1 for failed authentication or -2 for unknown usernames.
*/
idempotent int verifyPassword(string name, string pw) throws ServerBootedException, InvalidSecretException;
/** Fetch user texture. Textures are stored as zlib compress()ed 600x60 32-bit BGRA data.
* @param userid ID of registered user. See {@link RegisteredUser.userid}.
* @return Custom texture associated with user or an empty texture.
*/
idempotent Texture getTexture(int userid) throws ServerBootedException, InvalidUserException, InvalidSecretException;
/** Set a user texture (now called avatar).
* @param userid ID of registered user. See {@link RegisteredUser.userid}.
* @param tex Texture (as a Byte-Array) to set for the user, or an empty texture to remove the existing texture.
*/
idempotent void setTexture(int userid, Texture tex) throws ServerBootedException, InvalidUserException, InvalidTextureException, InvalidSecretException;
/** Get virtual server uptime.
* @return Uptime of the virtual server in seconds
*/
idempotent int getUptime() throws ServerBootedException, InvalidSecretException;
/**
* Update the server's certificate information.
*
* Reconfigure the running server's TLS socket with the given
* certificate and private key.
*
* The certificate and and private key must be PEM formatted.
*
* New clients will see the new certificate.
* Existing clients will continue to see the certificate the server
* was using when they connected to it.
*
* This method throws InvalidInputDataException if any of the
* following errors happen:
* - Unable to decode the PEM certificate and/or private key.
* - Unable to decrypt the private key with the given passphrase.
* - The certificate and/or private key do not contain RSA keys.
* - The certificate is not usable with the given private key.
*/
idempotent void updateCertificate(string certificate, string privateKey, string passphrase) throws ServerBootedException, InvalidSecretException, InvalidInputDataException;
/**
* Makes the given user start listening to the given channel.
* @param userid The ID of the user
* @param channelid The ID of the channel
*/
idempotent void startListening(int userid, int channelid);
/**
* Makes the given user stop listening to the given channel.
* @param userid The ID of the user
* @param channelid The ID of the channel
*/
idempotent void stopListening(int userid, int channelid);
/**
* @param userid The ID of the user
* @param channelid The ID of the channel
* @returns Whether the given user is currently listening to the given channel
*/
idempotent bool isListening(int userid, int channelid);
/**
* @param userid The ID of the user
* @returns An ID-list of channels the given user is listening to
*/
idempotent IntList getListeningChannels(int userid);
/**
* @param channelid The ID of the channel
* @returns An ID-list of users listening to the given channel
*/
idempotent IntList getListeningUsers(int channelid);
/**
* @param channelid The ID of the channel
* @param userid The ID of the user
* @returns The volume adjustment set for a listener of the given user in the given channel
*/
idempotent float getListenerVolumeAdjustment(int channelid, int userid);
/**
* Sets the volume adjustment set for a listener of the given user in the given channel
* @param channelid The ID of the channel
* @param userid The ID of the user
*/
idempotent void setListenerVolumeAdjustment(int channelid, int userid, float volumeAdjustment);
/**
* @param receiverUserIDs list of IDs of the users the message shall be sent to
*/
idempotent void sendWelcomeMessage(IdList receiverUserIDs);
};
/** Callback interface for Meta. You can supply an implementation of this to receive notifications
* when servers are stopped or started.
* If an added callback ever throws an exception or goes away, it will be automatically removed.
* Please note that all callbacks are done asynchronously; murmur does not wait for the callback to
* complete before continuing processing.
* @see ServerCallback
* @see Meta.addCallback
*/
interface MetaCallback {
/** Called when a server is started. The server is up and running when this event is sent, so all methods that
* need a running server will work.
* @param srv Interface for started server.
*/
void started(Server *srv);
/** Called when a server is stopped. The server is already stopped when this event is sent, so no methods that
* need a running server will work.
* @param srv Interface for started server.
*/
void stopped(Server *srv);
};
sequence<Server *> ServerList;
/** This is the meta interface. It is primarily used for retrieving the {@link Server} interfaces for each individual server.
**/
["amd"] interface Meta {
/** Fetch interface to specific server.
* @param id Server ID. See {@link Server.getId}.
* @return Interface for specified server, or a null proxy if id is invalid.
*/
idempotent Server *getServer(int id) throws InvalidSecretException;
/** Create a new server. Call {@link Server.getId} on the returned interface to find it's ID.
* @return Interface for new server.
*/
Server *newServer() throws InvalidSecretException;
/** Fetch list of all currently running servers.
* @return List of interfaces for running servers.
*/
idempotent ServerList getBootedServers() throws InvalidSecretException;
/** Fetch list of all defined servers.
* @return List of interfaces for all servers.
*/
idempotent ServerList getAllServers() throws InvalidSecretException;
/** Fetch default configuration. This returns the configuration items that were set in the configuration file, or
* the built-in default. The individual servers will use these values unless they have been overridden in the
* server specific configuration. The only special case is the port, which defaults to the value defined here +
* the servers ID - 1 (so that virtual server #1 uses the defined port, server #2 uses port+1 etc).
* @return Default configuration of the servers.
*/
idempotent ConfigMap getDefaultConf() throws InvalidSecretException;
/** Fetch version of Murmur.
* @param major Major version.
* @param minor Minor version.
* @param patch Patchlevel.
* @param text Textual representation of version. Note that this may not match the {@link major}, {@link minor} and {@link patch} levels, as it
* may be simply the compile date or the SVN revision. This is usually the text you want to present to users.
*/
idempotent void getVersion(out int major, out int minor, out int patch, out string text);
/** Add a callback. The callback will receive notifications when servers are started or stopped.
*
* @param cb Callback interface which will receive notifications.
*/
void addCallback(MetaCallback *cb) throws InvalidCallbackException, InvalidSecretException;
/** Remove a callback.
*
* @param cb Callback interface to be removed.
*/
void removeCallback(MetaCallback *cb) throws InvalidCallbackException, InvalidSecretException;
/** Get murmur uptime.
* @return Uptime of murmur in seconds
*/
idempotent int getUptime();
/** Get slice file.
* @return Contents of the slice file server compiled with.
*/
idempotent string getSlice();
/** Returns a checksum dict for the slice file.
* @return Checksum dict
*/
idempotent Ice::SliceChecksumDict getSliceChecksums();
};
};

View File

@@ -0,0 +1,927 @@
// Copyright 2008-2021 The Mumble Developers. All rights reserved.
// Use of this source code is governed by a BSD-style license
// that can be found in the LICENSE file at the root of the
// Mumble source tree or at <https://www.mumble.info/LICENSE>.
/**
*
* Information and control of the murmur server. Each server has
* one {@link Meta} interface that controls global information, and
* each virtual server has a {@link Server} interface.
*
**/
#include <Ice/SliceChecksumDict.ice>
module Murmur
{
/** A network address in IPv6 format.
**/
["python:seq:tuple"] sequence<byte> NetAddress;
/** A connected user.
**/
struct User {
/** Session ID. This identifies the connection to the server. */
int session;
/** User ID. -1 if the user is anonymous. */
int userid;
/** Is user muted by the server? */
bool mute;
/** Is user deafened by the server? If true, this implies mute. */
bool deaf;
/** Is the user suppressed by the server? This means the user is not muted, but does not have speech privileges in the current channel. */
bool suppress;
/** Is the user a priority speaker? */
bool prioritySpeaker;
/** Is the user self-muted? */
bool selfMute;
/** Is the user self-deafened? If true, this implies mute. */
bool selfDeaf;
/** Is the User recording? (This flag is read-only and cannot be changed using setState().) **/
bool recording;
/** Channel ID the user is in. Matches {@link Channel.id}. */
int channel;
/** The name of the user. */
string name;
/** Seconds user has been online. */
int onlinesecs;
/** Average transmission rate in bytes per second over the last few seconds. */
int bytespersec;
/** Legacy client version. */
int version;
/** New client version. (See https://github.com/mumble-voip/mumble/issues/5827) */
long version2;
/** Client release. For official releases, this equals the version. For snapshots and git compiles, this will be something else. */
string release;
/** Client OS. */
string os;
/** Client OS Version. */
string osversion;
/** Plugin Identity. This will be the user's unique ID inside the current game. */
string identity;
/**
Base64-encoded Plugin context. This is a binary blob identifying the game and team the user is on.
The used Base64 alphabet is the one specified in RFC 2045.
Before Mumble 1.3.0, this string was not Base64-encoded. This could cause problems for some Ice
implementations, such as the .NET implementation.
If you need the exact string that is used by Mumble, you can get it by Base64-decoding this string.
If you simply need to detect whether two users are in the same game world, string comparisons will
continue to work as before.
*/
string context;
/** User comment. Shown as tooltip for this user. */
string comment;
/** Client address. */
NetAddress address;
/** TCP only. True until UDP connectivity is established. */
bool tcponly;
/** Idle time. This is how many seconds it is since the user last spoke. Other activity is not counted. */
int idlesecs;
/** UDP Ping Average. This is the average ping for the user via UDP over the duration of the connection. */
float udpPing;
/** TCP Ping Average. This is the average ping for the user via TCP over the duration of the connection. */
float tcpPing;
};
sequence<int> IntList;
/** A text message between users.
**/
struct TextMessage {
/** Sessions (connected users) who were sent this message. */
IntList sessions;
/** Channels who were sent this message. */
IntList channels;
/** Trees of channels who were sent this message. */
IntList trees;
/** The contents of the message. */
string text;
};
/** A channel.
**/
struct Channel {
/** Channel ID. This is unique per channel, and the root channel is always id 0. */
int id;
/** Name of the channel. There can not be two channels with the same parent that has the same name. */
string name;
/** ID of parent channel, or -1 if this is the root channel. */
int parent;
/** List of id of linked channels. */
IntList links;
/** Description of channel. Shown as tooltip for this channel. */
string description;
/** Channel is temporary, and will be removed when the last user leaves it. */
bool temporary;
/** Position of the channel which is used in Client for sorting. */
int position;
};
/** A group. Groups are defined per channel, and can inherit members from parent channels.
**/
struct Group {
/** Group name */
string name;
/** Is this group inherited from a parent channel? Read-only. */
bool inherited;
/** Does this group inherit members from parent channels? */
bool inherit;
/** Can subchannels inherit members from this group? */
bool inheritable;
/** List of users to add to the group. */
IntList add;
/** List of inherited users to remove from the group. */
IntList remove;
/** Current members of the group, including inherited members. Read-only. */
IntList members;
};
/** Write access to channel control. Implies all other permissions (except Speak). */
const int PermissionWrite = 0x01;
/** Traverse channel. Without this, a client cannot reach subchannels, no matter which privileges he has there. */
const int PermissionTraverse = 0x02;
/** Enter channel. */
const int PermissionEnter = 0x04;
/** Speak in channel. */
const int PermissionSpeak = 0x08;
/** Whisper to channel. This is different from Speak, so you can set up different permissions. */
const int PermissionWhisper = 0x100;
/** Mute and deafen other users in this channel. */
const int PermissionMuteDeafen = 0x10;
/** Move users from channel. You need this permission in both the source and destination channel to move another user. */
const int PermissionMove = 0x20;
/** Make new channel as a subchannel of this channel. */
const int PermissionMakeChannel = 0x40;
/** Make new temporary channel as a subchannel of this channel. */
const int PermissionMakeTempChannel = 0x400;
/** Link this channel. You need this permission in both the source and destination channel to link channels, or in either channel to unlink them. */
const int PermissionLinkChannel = 0x80;
/** Send text message to channel. */
const int PermissionTextMessage = 0x200;
/** Kick user from server. Only valid on root channel. */
const int PermissionKick = 0x10000;
/** Ban user from server. Only valid on root channel. */
const int PermissionBan = 0x20000;
/** Register and unregister users. Only valid on root channel. */
const int PermissionRegister = 0x40000;
/** Register and unregister users. Only valid on root channel. */
const int PermissionRegisterSelf = 0x80000;
/** Reset the comment or avatar of a user. Only valid on root channel. */
const int ResetUserContent = 0x100000;
/** Access Control List for a channel. ACLs are defined per channel, and can be inherited from parent channels.
**/
struct ACL {
/** Does the ACL apply to this channel? */
bool applyHere;
/** Does the ACL apply to subchannels? */
bool applySubs;
/** Is this ACL inherited from a parent channel? Read-only. */
bool inherited;
/** ID of user this ACL applies to. -1 if using a group name. */
int userid;
/** Group this ACL applies to. Blank if using userid. */
string group;
/** Binary mask of privileges to allow. */
int allow;
/** Binary mask of privileges to deny. */
int deny;
};
/** A single ip mask for a ban.
**/
struct Ban {
/** Address to ban. */
NetAddress address;
/** Number of bits in ban to apply. */
int bits;
/** Username associated with ban. */
string name;
/** Hash of banned user. */
string hash;
/** Reason for ban. */
string reason;
/** Date ban was applied in unix time format. */
int start;
/** Duration of ban. */
int duration;
};
/** A entry in the log.
**/
struct LogEntry {
/** Timestamp in UNIX time_t */
int timestamp;
/** The log message. */
string txt;
};
class Tree;
sequence<Tree> TreeList;
enum ChannelInfo { ChannelDescription, ChannelPosition };
enum UserInfo { UserName, UserEmail, UserComment, UserHash, UserPassword, UserLastActive, UserKDFIterations };
dictionary<int, User> UserMap;
dictionary<int, Channel> ChannelMap;
sequence<Channel> ChannelList;
sequence<User> UserList;
sequence<Group> GroupList;
sequence<ACL> ACLList;
sequence<LogEntry> LogList;
sequence<Ban> BanList;
sequence<int> IdList;
sequence<string> NameList;
dictionary<int, string> NameMap;
dictionary<string, int> IdMap;
sequence<byte> Texture;
dictionary<string, string> ConfigMap;
sequence<string> GroupNameList;
sequence<byte> CertificateDer;
sequence<CertificateDer> CertificateList;
/** User information map.
* Older versions of ice-php can't handle enums as keys. If you are using one of these, replace 'UserInfo' with 'byte'.
*/
dictionary<UserInfo, string> UserInfoMap;
/** User and subchannel state. Read-only.
**/
class Tree {
/** Channel definition of current channel. */
Channel c;
/** List of subchannels. */
TreeList children;
/** Users in this channel. */
UserList users;
};
exception MurmurException {};
/** This is thrown when you specify an invalid session. This may happen if the user has disconnected since your last call to {@link Server.getUsers}. See {@link User.session} */
exception InvalidSessionException extends MurmurException {};
/** This is thrown when you specify an invalid channel id. This may happen if the channel was removed by another provess. It can also be thrown if you try to add an invalid channel. */
exception InvalidChannelException extends MurmurException {};
/** This is thrown when you try to do an operation on a server that does not exist. This may happen if someone has removed the server. */
exception InvalidServerException extends MurmurException {};
/** This happens if you try to fetch user or channel state on a stopped server, if you try to stop an already stopped server or start an already started server. */
exception ServerBootedException extends MurmurException {};
/** This is thrown if {@link Server.start} fails, and should generally be the cause for some concern. */
exception ServerFailureException extends MurmurException {};
/** This is thrown when you specify an invalid userid. */
exception InvalidUserException extends MurmurException {};
/** This is thrown when you try to set an invalid texture. */
exception InvalidTextureException extends MurmurException {};
/** This is thrown when you supply an invalid callback. */
exception InvalidCallbackException extends MurmurException {};
/** This is thrown when you supply the wrong secret in the calling context. */
exception InvalidSecretException extends MurmurException {};
/** This is thrown when the channel operation would exceed the channel nesting limit */
exception NestingLimitException extends MurmurException {};
/** This is thrown when you ask the server to disclose something that should be secret. */
exception WriteOnlyException extends MurmurException {};
/** This is thrown when invalid input data was specified. */
exception InvalidInputDataException extends MurmurException {};
/** Callback interface for servers. You can supply an implementation of this to receive notification
* messages from the server.
* If an added callback ever throws an exception or goes away, it will be automatically removed.
* Please note that all callbacks are done asynchronously; murmur does not wait for the callback to
* complete before continuing processing.
* Note that callbacks are removed when a server is stopped, so you should have a callback for
* {@link MetaCallback.started} which calls {@link Server.addCallback}.
* @see MetaCallback
* @see Server.addCallback
*/
interface ServerCallback {
/** Called when a user connects to the server.
* @param state State of connected user.
*/
idempotent void userConnected(User state);
/** Called when a user disconnects from the server. The user has already been removed, so you can no longer use methods like {@link Server.getState}
* to retrieve the user's state.
* @param state State of disconnected user.
*/
idempotent void userDisconnected(User state);
/** Called when a user state changes. This is called if the user moves, is renamed, is muted, deafened etc.
* @param state New state of user.
*/
idempotent void userStateChanged(User state);
/** Called when user writes a text message
* @param state the User sending the message
* @param message the TextMessage the user has sent
*/
idempotent void userTextMessage(User state, TextMessage message);
/** Called when a new channel is created.
* @param state State of new channel.
*/
idempotent void channelCreated(Channel state);
/** Called when a channel is removed. The channel has already been removed, you can no longer use methods like {@link Server.getChannelState}
* @param state State of removed channel.
*/
idempotent void channelRemoved(Channel state);
/** Called when a new channel state changes. This is called if the channel is moved, renamed or if new links are added.
* @param state New state of channel.
*/
idempotent void channelStateChanged(Channel state);
};
/** Context for actions in the Server menu. */
const int ContextServer = 0x01;
/** Context for actions in the Channel menu. */
const int ContextChannel = 0x02;
/** Context for actions in the User menu. */
const int ContextUser = 0x04;
/** Callback interface for context actions. You need to supply one of these for {@link Server.addContext}.
* If an added callback ever throws an exception or goes away, it will be automatically removed.
* Please note that all callbacks are done asynchronously; murmur does not wait for the callback to
* complete before continuing processing.
*/
interface ServerContextCallback {
/** Called when a context action is performed.
* @param action Action to be performed.
* @param usr User which initiated the action.
* @param session If nonzero, session of target user.
* @param channelid If not -1, id of target channel.
*/
idempotent void contextAction(string action, User usr, int session, int channelid);
};
/** Callback interface for server authentication. You need to supply one of these for {@link Server.setAuthenticator}.
* If an added callback ever throws an exception or goes away, it will be automatically removed.
* Please note that unlike {@link ServerCallback} and {@link ServerContextCallback}, these methods are called
* synchronously. If the response lags, the entire murmur server will lag.
* Also note that, as the method calls are synchronous, making a call to {@link Server} or {@link Meta} will
* deadlock the server.
*/
interface ServerAuthenticator {
/** Called to authenticate a user. If you do not know the username in question, always return -2 from this
* method to fall through to normal database authentication.
* Note that if authentication succeeds, murmur will create a record of the user in it's database, reserving
* the username and id so it cannot be used for normal database authentication.
* The data in the certificate (name, email addresses etc), as well as the list of signing certificates,
* should only be trusted if certstrong is true.
*
* Internally, Murmur treats usernames as case-insensitive. It is recommended
* that authenticators do the same. Murmur checks if a username is in use when
* a user connects. If the connecting user is registered, the other username is
* kicked. If the connecting user is not registered, the connecting user is not
* allowed to join the server.
*
* @param name Username to authenticate.
* @param pw Password to authenticate with.
* @param certificates List of der encoded certificates the user connected with.
* @param certhash Hash of user certificate, as used by murmur internally when matching.
* @param certstrong True if certificate was valid and signed by a trusted CA.
* @param newname Set this to change the username from the supplied one.
* @param groups List of groups on the root channel that the user will be added to for the duration of the connection.
* @return UserID of authenticated user, -1 for authentication failures, -2 for unknown user (fallthrough),
* -3 for authentication failures where the data could (temporarily) not be verified.
*/
idempotent int authenticate(string name, string pw, CertificateList certificates, string certhash, bool certstrong, out string newname, out GroupNameList groups);
/** Fetch information about a user. This is used to retrieve information like email address, keyhash etc. If you
* want murmur to take care of this information itself, simply return false to fall through.
* @param id User id.
* @param info Information about user. This needs to include at least "name".
* @return true if information is present, false to fall through.
*/
idempotent bool getInfo(int id, out UserInfoMap info);
/** Map a name to a user id.
* @param name Username to map.
* @return User id or -2 for unknown name.
*/
idempotent int nameToId(string name);
/** Map a user id to a username.
* @param id User id to map.
* @return Name of user or empty string for unknown id.
*/
idempotent string idToName(int id);
/** Map a user to a custom Texture.
* @param id User id to map.
* @return User texture or an empty texture for unknown users or users without textures.
*/
idempotent Texture idToTexture(int id);
};
/** Callback interface for server authentication and registration. This allows you to support both authentication
* and account updating.
* You do not need to implement this if all you want is authentication, you only need this if other scripts
* connected to the same server calls e.g. {@link Server.setTexture}.
* Almost all of these methods support fall through, meaning murmur should continue the operation against its
* own database.
*/
interface ServerUpdatingAuthenticator extends ServerAuthenticator {
/** Register a new user.
* @param info Information about user to register.
* @return User id of new user, -1 for registration failure, or -2 to fall through.
*/
int registerUser(UserInfoMap info);
/** Unregister a user.
* @param id Userid to unregister.
* @return 1 for successful unregistration, 0 for unsuccessful unregistration, -1 to fall through.
*/
int unregisterUser(int id);
/** Get a list of registered users matching filter.
* @param filter Substring usernames must contain. If empty, return all registered users.
* @return List of matching registered users.
*/
idempotent NameMap getRegisteredUsers(string filter);
/** Set additional information for user registration.
* @param id Userid of registered user.
* @param info Information to set about user. This should be merged with existing information.
* @return 1 for successful update, 0 for unsuccessful update, -1 to fall through.
*/
idempotent int setInfo(int id, UserInfoMap info);
/** Set texture (now called avatar) of user registration.
* @param id registrationId of registered user.
* @param tex New texture.
* @return 1 for successful update, 0 for unsuccessful update, -1 to fall through.
*/
idempotent int setTexture(int id, Texture tex);
};
/** Per-server interface. This includes all methods for configuring and altering
* the state of a single virtual server. You can retrieve a pointer to this interface
* from one of the methods in {@link Meta}.
**/
["amd"] interface Server {
/** Shows if the server currently running (accepting users).
*
* @return Run-state of server.
*/
idempotent bool isRunning() throws InvalidSecretException;
/** Start server. */
void start() throws ServerBootedException, ServerFailureException, InvalidSecretException;
/** Stop server.
* Note: Server will be restarted on Murmur restart unless explicitly disabled
* with setConf("boot", false)
*/
void stop() throws ServerBootedException, InvalidSecretException;
/** Delete server and all it's configuration. */
void delete() throws ServerBootedException, InvalidSecretException;
/** Fetch the server id.
*
* @return Unique server id.
*/
idempotent int id() throws InvalidSecretException;
/** Add a callback. The callback will receive notifications about changes to users and channels.
*
* @param cb Callback interface which will receive notifications.
* @see removeCallback
*/
void addCallback(ServerCallback *cb) throws ServerBootedException, InvalidCallbackException, InvalidSecretException;
/** Remove a callback.
*
* @param cb Callback interface to be removed.
* @see addCallback
*/
void removeCallback(ServerCallback *cb) throws ServerBootedException, InvalidCallbackException, InvalidSecretException;
/** Set external authenticator. If set, all authentications from clients are forwarded to this
* proxy.
*
* @param auth Authenticator object to perform subsequent authentications.
*/
void setAuthenticator(ServerAuthenticator *auth) throws ServerBootedException, InvalidCallbackException, InvalidSecretException;
/** Retrieve configuration item.
* @param key Configuration key.
* @return Configuration value. If this is empty, see {@link Meta.getDefaultConf}
*/
idempotent string getConf(string key) throws InvalidSecretException, WriteOnlyException;
/** Retrieve all configuration items.
* @return All configured values. If a value isn't set here, the value from {@link Meta.getDefaultConf} is used.
*/
idempotent ConfigMap getAllConf() throws InvalidSecretException;
/** Set a configuration item.
* @param key Configuration key.
* @param value Configuration value.
*/
idempotent void setConf(string key, string value) throws InvalidSecretException;
/** Set superuser password. This is just a convenience for using {@link updateRegistration} on user id 0.
* @param pw Password.
*/
idempotent void setSuperuserPassword(string pw) throws InvalidSecretException;
/** Fetch log entries.
* @param first Lowest numbered entry to fetch. 0 is the most recent item.
* @param last Last entry to fetch.
* @return List of log entries.
*/
idempotent LogList getLog(int first, int last) throws InvalidSecretException;
/** Fetch length of log
* @return Number of entries in log
*/
idempotent int getLogLen() throws InvalidSecretException;
/** Fetch all users. This returns all currently connected users on the server.
* @return List of connected users.
* @see getState
*/
idempotent UserMap getUsers() throws ServerBootedException, InvalidSecretException;
/** Fetch all channels. This returns all defined channels on the server. The root channel is always channel 0.
* @return List of defined channels.
* @see getChannelState
*/
idempotent ChannelMap getChannels() throws ServerBootedException, InvalidSecretException;
/** Fetch certificate of user. This returns the complete certificate chain of a user.
* @param session Connection ID of user. See {@link User.session}.
* @return Certificate list of user.
*/
idempotent CertificateList getCertificateList(int session) throws ServerBootedException, InvalidSessionException, InvalidSecretException;
/** Fetch all channels and connected users as a tree. This retrieves an easy-to-use representation of the server
* as a tree. This is primarily used for viewing the state of the server on a webpage.
* @return Recursive tree of all channels and connected users.
*/
idempotent Tree getTree() throws ServerBootedException, InvalidSecretException;
/** Fetch all current IP bans on the server.
* @return List of bans.
*/
idempotent BanList getBans() throws ServerBootedException, InvalidSecretException;
/** Set all current IP bans on the server. This will replace any bans already present, so if you want to add a ban, be sure to call {@link getBans} and then
* append to the returned list before calling this method.
* @param bans List of bans.
*/
idempotent void setBans(BanList bans) throws ServerBootedException, InvalidSecretException;
/** Kick a user. The user is not banned, and is free to rejoin the server.
* @param session Connection ID of user. See {@link User.session}.
* @param reason Text message to show when user is kicked.
*/
void kickUser(int session, string reason) throws ServerBootedException, InvalidSessionException, InvalidSecretException;
/** Get state of a single connected user.
* @param session Connection ID of user. See {@link User.session}.
* @return State of connected user.
* @see setState
* @see getUsers
*/
idempotent User getState(int session) throws ServerBootedException, InvalidSessionException, InvalidSecretException;
/** Set user state. You can use this to move, mute and deafen users.
* @param state User state to set.
* @see getState
*/
idempotent void setState(User state) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException;
/** Send text message to a single user.
* @param session Connection ID of user. See {@link User.session}.
* @param text Message to send.
* @see sendMessageChannel
*/
void sendMessage(int session, string text) throws ServerBootedException, InvalidSessionException, InvalidSecretException;
/** Check if user is permitted to perform action.
* @param session Connection ID of user. See {@link User.session}.
* @param channelid ID of Channel. See {@link Channel.id}.
* @param perm Permission bits to check.
* @return true if any of the permissions in perm were set for the user.
*/
bool hasPermission(int session, int channelid, int perm) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException;
/** Return users effective permissions
* @param session Connection ID of user. See {@link User.session}.
* @param channelid ID of Channel. See {@link Channel.id}.
* @return bitfield of allowed actions
*/
idempotent int effectivePermissions(int session, int channelid) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException;
/** Add a context callback. This is done per user, and will add a context menu action for the user.
*
* @param session Session of user which should receive context entry.
* @param action Action string, a unique name to associate with the action.
* @param text Name of action shown to user.
* @param cb Callback interface which will receive notifications.
* @param ctx Context this should be used in. Needs to be one or a combination of {@link ContextServer}, {@link ContextChannel} and {@link ContextUser}.
* @see removeContextCallback
*/
void addContextCallback(int session, string action, string text, ServerContextCallback *cb, int ctx) throws ServerBootedException, InvalidCallbackException, InvalidSecretException;
/** Remove a callback.
*
* @param cb Callback interface to be removed. This callback will be removed from all from all users.
* @see addContextCallback
*/
void removeContextCallback(ServerContextCallback *cb) throws ServerBootedException, InvalidCallbackException, InvalidSecretException;
/** Get state of single channel.
* @param channelid ID of Channel. See {@link Channel.id}.
* @return State of channel.
* @see setChannelState
* @see getChannels
*/
idempotent Channel getChannelState(int channelid) throws ServerBootedException, InvalidChannelException, InvalidSecretException;
/** Set state of a single channel. You can use this to move or relink channels.
* @param state Channel state to set.
* @see getChannelState
*/
idempotent void setChannelState(Channel state) throws ServerBootedException, InvalidChannelException, InvalidSecretException, NestingLimitException;
/** Remove a channel and all its subchannels.
* @param channelid ID of Channel. See {@link Channel.id}.
*/
void removeChannel(int channelid) throws ServerBootedException, InvalidChannelException, InvalidSecretException;
/** Add a new channel.
* @param name Name of new channel.
* @param parent Channel ID of parent channel. See {@link Channel.id}.
* @return ID of newly created channel.
*/
int addChannel(string name, int parent) throws ServerBootedException, InvalidChannelException, InvalidSecretException, NestingLimitException;
/** Send text message to channel or a tree of channels.
* @param channelid Channel ID of channel to send to. See {@link Channel.id}.
* @param tree If true, the message will be sent to the channel and all its subchannels.
* @param text Message to send.
* @see sendMessage
*/
void sendMessageChannel(int channelid, bool tree, string text) throws ServerBootedException, InvalidChannelException, InvalidSecretException;
/** Retrieve ACLs and Groups on a channel.
* @param channelid Channel ID of channel to fetch from. See {@link Channel.id}.
* @param acls List of ACLs on the channel. This will include inherited ACLs.
* @param groups List of groups on the channel. This will include inherited groups.
* @param inherit Does this channel inherit ACLs from the parent channel?
*/
idempotent void getACL(int channelid, out ACLList acls, out GroupList groups, out bool inherit) throws ServerBootedException, InvalidChannelException, InvalidSecretException;
/** Set ACLs and Groups on a channel. Note that this will replace all existing ACLs and groups on the channel.
* @param channelid Channel ID of channel to fetch from. See {@link Channel.id}.
* @param acls List of ACLs on the channel.
* @param groups List of groups on the channel.
* @param inherit Should this channel inherit ACLs from the parent channel?
*/
idempotent void setACL(int channelid, ACLList acls, GroupList groups, bool inherit) throws ServerBootedException, InvalidChannelException, InvalidSecretException;
/** Temporarily add a user to a group on a channel. This state is not saved, and is intended for temporary memberships.
* @param channelid Channel ID of channel to add to. See {@link Channel.id}.
* @param session Connection ID of user. See {@link User.session}.
* @param group Group name to add to.
*/
idempotent void addUserToGroup(int channelid, int session, string group) throws ServerBootedException, InvalidChannelException, InvalidSessionException, InvalidSecretException;
/** Remove a user from a temporary group membership on a channel. This state is not saved, and is intended for temporary memberships.
* @param channelid Channel ID of channel to add to. See {@link Channel.id}.
* @param session Connection ID of user. See {@link User.session}.
* @param group Group name to remove from.
*/
idempotent void removeUserFromGroup(int channelid, int session, string group) throws ServerBootedException, InvalidChannelException, InvalidSessionException, InvalidSecretException;
/** Redirect whisper targets for user. If set, whenever a user tries to whisper to group "source", the whisper will be redirected to group "target".
* To remove a redirect pass an empty target string. This is intended for context groups.
* @param session Connection ID of user. See {@link User.session}.
* @param source Group name to redirect from.
* @param target Group name to redirect to.
*/
idempotent void redirectWhisperGroup(int session, string source, string target) throws ServerBootedException, InvalidSessionException, InvalidSecretException;
/** Map a list of {@link User.userid} to a matching name.
* @param List of ids.
* @return Matching list of names, with an empty string representing invalid or unknown ids.
*/
idempotent NameMap getUserNames(IdList ids) throws ServerBootedException, InvalidSecretException;
/** Map a list of user names to a matching id.
* @param List of names.
* @reuturn List of matching ids, with -1 representing invalid or unknown user names.
*/
idempotent IdMap getUserIds(NameList names) throws ServerBootedException, InvalidSecretException;
/** Register a new user.
* @param info Information about new user. Must include at least "name".
* @return The ID of the user. See {@link RegisteredUser.userid}.
*/
int registerUser(UserInfoMap info) throws ServerBootedException, InvalidUserException, InvalidSecretException;
/** Remove a user registration.
* @param userid ID of registered user. See {@link RegisteredUser.userid}.
*/
void unregisterUser(int userid) throws ServerBootedException, InvalidUserException, InvalidSecretException;
/** Update the registration for a user. You can use this to set the email or password of a user,
* and can also use it to change the user's name.
* @param registration Updated registration record.
*/
idempotent void updateRegistration(int userid, UserInfoMap info) throws ServerBootedException, InvalidUserException, InvalidSecretException;
/** Fetch registration for a single user.
* @param userid ID of registered user. See {@link RegisteredUser.userid}.
* @return Registration record.
*/
idempotent UserInfoMap getRegistration(int userid) throws ServerBootedException, InvalidUserException, InvalidSecretException;
/** Fetch a group of registered users.
* @param filter Substring of user name. If blank, will retrieve all registered users.
* @return List of registration records.
*/
idempotent NameMap getRegisteredUsers(string filter) throws ServerBootedException, InvalidSecretException;
/** Verify the password of a user. You can use this to verify a user's credentials.
* @param name User name. See {@link RegisteredUser.name}.
* @param pw User password.
* @return User ID of registered user (See {@link RegisteredUser.userid}), -1 for failed authentication or -2 for unknown usernames.
*/
idempotent int verifyPassword(string name, string pw) throws ServerBootedException, InvalidSecretException;
/** Fetch user texture. Textures are stored as zlib compress()ed 600x60 32-bit BGRA data.
* @param userid ID of registered user. See {@link RegisteredUser.userid}.
* @return Custom texture associated with user or an empty texture.
*/
idempotent Texture getTexture(int userid) throws ServerBootedException, InvalidUserException, InvalidSecretException;
/** Set a user texture (now called avatar).
* @param userid ID of registered user. See {@link RegisteredUser.userid}.
* @param tex Texture (as a Byte-Array) to set for the user, or an empty texture to remove the existing texture.
*/
idempotent void setTexture(int userid, Texture tex) throws ServerBootedException, InvalidUserException, InvalidTextureException, InvalidSecretException;
/** Get virtual server uptime.
* @return Uptime of the virtual server in seconds
*/
idempotent int getUptime() throws ServerBootedException, InvalidSecretException;
/**
* Update the server's certificate information.
*
* Reconfigure the running server's TLS socket with the given
* certificate and private key.
*
* The certificate and and private key must be PEM formatted.
*
* New clients will see the new certificate.
* Existing clients will continue to see the certificate the server
* was using when they connected to it.
*
* This method throws InvalidInputDataException if any of the
* following errors happen:
* - Unable to decode the PEM certificate and/or private key.
* - Unable to decrypt the private key with the given passphrase.
* - The certificate and/or private key do not contain RSA keys.
* - The certificate is not usable with the given private key.
*/
idempotent void updateCertificate(string certificate, string privateKey, string passphrase) throws ServerBootedException, InvalidSecretException, InvalidInputDataException;
/**
* Makes the given user start listening to the given channel.
* @param userid The ID of the user
* @param channelid The ID of the channel
*/
idempotent void startListening(int userid, int channelid);
/**
* Makes the given user stop listening to the given channel.
* @param userid The ID of the user
* @param channelid The ID of the channel
*/
idempotent void stopListening(int userid, int channelid);
/**
* @param userid The ID of the user
* @param channelid The ID of the channel
* @returns Whether the given user is currently listening to the given channel
*/
idempotent bool isListening(int userid, int channelid);
/**
* @param userid The ID of the user
* @returns An ID-list of channels the given user is listening to
*/
idempotent IntList getListeningChannels(int userid);
/**
* @param channelid The ID of the channel
* @returns An ID-list of users listening to the given channel
*/
idempotent IntList getListeningUsers(int channelid);
/**
* @param receiverUserIDs list of IDs of the users the message shall be sent to
*/
idempotent void sendWelcomeMessage(IdList receiverUserIDs);
};
/** Callback interface for Meta. You can supply an implementation of this to receive notifications
* when servers are stopped or started.
* If an added callback ever throws an exception or goes away, it will be automatically removed.
* Please note that all callbacks are done asynchronously; murmur does not wait for the callback to
* complete before continuing processing.
* @see ServerCallback
* @see Meta.addCallback
*/
interface MetaCallback {
/** Called when a server is started. The server is up and running when this event is sent, so all methods that
* need a running server will work.
* @param srv Interface for started server.
*/
void started(Server *srv);
/** Called when a server is stopped. The server is already stopped when this event is sent, so no methods that
* need a running server will work.
* @param srv Interface for started server.
*/
void stopped(Server *srv);
};
sequence<Server *> ServerList;
/** This is the meta interface. It is primarily used for retrieving the {@link Server} interfaces for each individual server.
**/
["amd"] interface Meta {
/** Fetch interface to specific server.
* @param id Server ID. See {@link Server.getId}.
* @return Interface for specified server, or a null proxy if id is invalid.
*/
idempotent Server *getServer(int id) throws InvalidSecretException;
/** Create a new server. Call {@link Server.getId} on the returned interface to find it's ID.
* @return Interface for new server.
*/
Server *newServer() throws InvalidSecretException;
/** Fetch list of all currently running servers.
* @return List of interfaces for running servers.
*/
idempotent ServerList getBootedServers() throws InvalidSecretException;
/** Fetch list of all defined servers.
* @return List of interfaces for all servers.
*/
idempotent ServerList getAllServers() throws InvalidSecretException;
/** Fetch default configuration. This returns the configuration items that were set in the configuration file, or
* the built-in default. The individual servers will use these values unless they have been overridden in the
* server specific configuration. The only special case is the port, which defaults to the value defined here +
* the servers ID - 1 (so that virtual server #1 uses the defined port, server #2 uses port+1 etc).
* @return Default configuration of the servers.
*/
idempotent ConfigMap getDefaultConf() throws InvalidSecretException;
/** Fetch version of Murmur.
* @param major Major version.
* @param minor Minor version.
* @param patch Patchlevel.
* @param text Textual representation of version. Note that this may not match the {@link major}, {@link minor} and {@link patch} levels, as it
* may be simply the compile date or the SVN revision. This is usually the text you want to present to users.
*/
idempotent void getVersion(out int major, out int minor, out int patch, out string text);
/** Add a callback. The callback will receive notifications when servers are started or stopped.
*
* @param cb Callback interface which will receive notifications.
*/
void addCallback(MetaCallback *cb) throws InvalidCallbackException, InvalidSecretException;
/** Remove a callback.
*
* @param cb Callback interface to be removed.
*/
void removeCallback(MetaCallback *cb) throws InvalidCallbackException, InvalidSecretException;
/** Get murmur uptime.
* @return Uptime of murmur in seconds
*/
idempotent int getUptime();
/** Get slice file.
* @return Contents of the slice file server compiled with.
*/
idempotent string getSlice();
/** Returns a checksum dict for the slice file.
* @return Checksum dict
*/
idempotent Ice::SliceChecksumDict getSliceChecksums();
};
};

View File

@@ -1,6 +1,6 @@
from django.contrib import admin
from .models import MumbleUser
from .models import IdlerHandler, MumbleServerServer, MumbleUser
from ...admin import ServicesUserAdmin
@@ -8,11 +8,23 @@ from ...admin import ServicesUserAdmin
class MumbleUserAdmin(ServicesUserAdmin):
list_display = ServicesUserAdmin.list_display + (
'username',
'groups',
'release',
'version'
)
search_fields = ServicesUserAdmin.search_fields + (
'username',
'groups'
)
fields = ('user', 'username', 'groups') # pwhash is hidden from admin panel
@admin.register(MumbleServerServer)
class MumbleServerServerAdmin(admin.ModelAdmin):
list_display = ["name", "ip", "port", "slice", "virtual_servers", "avatar_enable", "reject_on_error", "offset"]
list_filter = ["slice", "avatar_enable", "reject_on_error", "offset"]
search_fields = ["name"]
@admin.register(IdlerHandler)
class IdlerhandlerAdmin(admin.ModelAdmin):
list_display = ["name", "enabled", "seconds", "interval", "channel", "denylist"]
list_filter = ["enabled", "denylist"]
search_fields = ["name"]

View File

@@ -0,0 +1,5 @@
from django.conf import settings
MUMBLE_TEMPS_FORCE_SSO = getattr(settings, "MUMBLE_TEMPS_FORCE_SSO", True)
MUMBLE_TEMPS_SSO_PREFIX = getattr(settings, "MUMBLE_TEMPS_SSO_PREFIX", "[TEMP]")
MUMBLE_TEMPS_LOGIN_PREFIX = getattr(settings, "MUMBLE_TEMPS_LOGIN_PREFIX", "[*TEMP]")

View File

@@ -1,6 +1,7 @@
import logging
import urllib
from allianceauth.menu.hooks import MenuItemHook
from django.conf import settings
from django.template.loader import render_to_string
from allianceauth.notifications import notify
@@ -10,6 +11,7 @@ from allianceauth.services.hooks import ServicesHook
from .tasks import MumbleTasks
from .models import MumbleUser
from .urls import urlpatterns
from django.utils.translation import gettext_lazy as _
logger = logging.getLogger(__name__)
@@ -35,24 +37,10 @@ class MumbleService(ServicesHook):
except MumbleUser.DoesNotExist:
logging.debug("User does not have a mumble account")
def update_groups(self, user):
logger.debug(f"Updating {self.name} groups for {user}")
if MumbleTasks.has_account(user):
MumbleTasks.update_groups.delay(user.pk)
def sync_nickname(self, user):
logger.debug(f"Updating {self.name} nickname for {user}")
if MumbleTasks.has_account(user):
MumbleTasks.update_display_name.apply_async(args=[user.pk], countdown=5) # cooldown on this task to ensure DB clean when syncing
def validate_user(self, user):
if MumbleTasks.has_account(user) and not self.service_active_for_user(user):
self.delete_user(user, notify_user=True)
def update_all_groups(self):
logger.debug("Updating all %s groups" % self.name)
MumbleTasks.update_all_groups.delay()
def service_active_for_user(self, user):
return user.has_perm(self.access_perm)
@@ -73,5 +61,26 @@ class MumbleService(ServicesHook):
@hooks.register('services_hook')
def register_mumble_service():
def register_mumble_service() -> ServicesHook:
return MumbleService()
class MumbleMenuItem(MenuItemHook):
def __init__(self) -> None:
MenuItemHook.__init__(
self=self,
text=_("Mumble Temp Links"),
classes="fa-solid fa-microphone",
url_name="mumble:templinks",
navactive=["mumble:templinks"],
)
def render(self, request) -> str:
if request.user.has_perm("mumble.create_new_templinks"):
return MenuItemHook.render(self, request)
return ""
@hooks.register("menu_item_hook")
def register_menu() -> MumbleMenuItem:
return MumbleMenuItem()

View File

@@ -0,0 +1,631 @@
#!/usr/bin/env python
# Copyright (C) 2010 Stefan Hacker <dd0t@users.sourceforge.net>
# All rights reserved.
# Adapted by Adarnof for AllianceAuth
# Further modified by the Alliance Auth team and contributers
# Rewritten for Django Context by the Alliance Auth Team
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# - Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# - Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
# - Neither the name of the Mumble Developers nor the names of its
# contributors may be used to endorse or promote products derived from this
# software without specific prior written permission.
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# `AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import importlib.util
import logging
import Ice
from urllib.request import urlopen
from threading import Timer
from passlib.hash import bcrypt_sha256
from hashlib import sha1
import django
from django.utils.datetime_safe import datetime
import os
import sys
logger = logging.getLogger(__name__)
sys.path.append(os.getcwd())
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myauth.settings.local")
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
django.setup()
from allianceauth import __version__ # noqa
from allianceauth.services.modules.mumble.models import MumbleServerServer, MumbleUser, TempUser # noqa
def main(server_id: int = 1) -> None:
"""_summary_
Args:
server_id (int, optional): _description_. Defaults to 1.
Raises:
e: _description_
Murmur.InvalidSecretException: _description_
e: _description_
Returns:
_type_: _description_
"""
slicedir = Ice.getSliceDir()
if not slicedir:
slicedir = ["-I/usr/share/Ice/slice", "-I/usr/share/slice"]
else:
slicedir = ['-I' + slicedir]
package_dir = next(iter(importlib.util.find_spec('allianceauth.services.modules.mumble').submodule_search_locations))
package_ice = os.path.join(package_dir, server_config_obj.slice)
logger.info(f"Using slice file: {package_ice}")
slicedir.append("-I" + os.path.dirname(package_ice))
Ice.loadSlice("", slicedir + [package_ice])
try:
import MumbleServer as Murmur # Mumble >=1.5.17
except ImportError:
import Murmur # Mumble <=1.5.17
server_config_obj = MumbleServerServer.objects.get(id=server_id)
class AllianceAuthAuthenticatorApp(Ice.Application):
def run(self, args) -> int:
self.shutdownOnInterrupt()
if not self.initializeIceConnection():
return 1
if server_config_obj.watchdog > 0:
self.failedWatch = True
self.checkConnection()
# Serve till we are stopped
self.communicator().waitForShutdown()
self.watchdog.cancel()
if self.interrupted():
logger.warning("Caught interrupt, shutting down")
return 0
def initializeIceConnection(self) -> bool:
"""
Establishes the two-way Ice connection and adds the authenticator to the
configured servers
"""
ice = self.communicator()
logger.debug("Using shared ice secret")
ice.getImplicitContext().put("secret", server_config_obj.secret)
logger.info(f"Connecting to Ice server ({server_config_obj.ip}:{server_config_obj.port})")
base = ice.stringToProxy(f"Meta:tcp -h {server_config_obj.ip} -p {server_config_obj.port}")
self.meta = Murmur.MetaPrx.uncheckedCast(base)
adapter = ice.createObjectAdapterWithEndpoints("Callback.Client", f"tcp -h {server_config_obj.endpoint}")
adapter.activate()
metacbprx = adapter.addWithUUID(metaCallback(self))
self.metacb = Murmur.MetaCallbackPrx.uncheckedCast(metacbprx)
servercbprx = adapter.addWithUUID(serverCallback(self))
self.servercb = Murmur.ServerCallbackPrx.uncheckedCast(servercbprx)
authprx = adapter.addWithUUID(AllianceAuthAuthenticator())
self.auth = Murmur.ServerUpdatingAuthenticatorPrx.uncheckedCast(authprx)
return self.attachCallbacks()
def attachCallbacks(self, quiet=False) -> bool:
"""
Attaches all callbacks for meta and authenticators
"""
# Ice.ConnectionRefusedException
# logger.debug('Attaching callbacks')
try:
if not quiet:
logger.info("Attaching meta callback")
self.meta.addCallback(self.metacb)
for server in self.meta.getBootedServers():
if server.id() in server_config_obj.virtual_servers_list():
logger.info("Setting authenticator for virtual server %d", server.id())
server.setAuthenticator(self.auth)
server.addCallback(self.servercb)
if server_config_obj.idler_handler:
idler_handler(server)
except (Murmur.InvalidSecretException, Ice.UnknownUserException, Ice.ConnectionRefusedException) as e:
logger.exception(e)
if isinstance(e, Ice.ConnectionRefusedException):
logger.error("Server refused connection")
elif (isinstance(e, Murmur.InvalidSecretException) or isinstance(e, Ice.UnknownUserException) and (e.unknown == "Murmur::InvalidSecretException")):
logger.error("Invalid ice secret")
else:
# We do not actually want to handle this one, re-raise it
raise e
self.connected = False
return False
self.connected = True
return True
def checkConnection(self) -> None:
"""
Tries reapplies all callbacks to make sure the authenticator
survives server restarts and disconnects.
"""
try:
if not self.attachCallbacks(quiet=not self.failedWatch):
self.failedWatch = True
else:
self.failedWatch = False
except Ice.Exception as e:
logger.error(f"Failed connection check, will retry in next watchdog run ({server_config_obj.watchdog}s)")
logger.exception(e)
self.failedWatch = True
# Renew the timer
self.watchdog = Timer(server_config_obj.watchdog, self.checkConnection)
self.watchdog.start()
def checkSecret(func):
"""
Decorator that checks whether the server transmitted the right secret
if a secret is supposed to be used.
"""
if not server_config_obj.secret:
return func
def newfunc(*args, **kws):
if "current" in kws:
current = kws["current"]
else:
current = args[-1]
if not current or "secret" not in current.ctx or current.ctx["secret"] != server_config_obj.secret:
logger.error("Server transmitted invalid secret. Possible injection attempt.")
raise Murmur.InvalidSecretException()
return func(*args, **kws)
return newfunc
def fortifyIceFu(retval=None, exceptions=(Ice.Exception,)):
"""
Decorator that catches exceptions,logs them and returns a safe retval
value. This helps preventing the authenticator getting stuck in
critical code paths. Only exceptions that are instances of classes
given in the exceptions list are not caught.
The default is to catch all non-Ice exceptions.
"""
def newdec(func):
def newfunc(*args, **kws):
try:
return func(*args, **kws)
except Exception as e:
catch = True
for ex in exceptions:
if isinstance(e, ex):
catch = False
break
if catch:
logger.critical("Unexpected exception caught")
logger.exception(e)
return retval
raise
return newfunc
return newdec
class metaCallback(Murmur.MetaCallback):
def __init__(self, app) -> None:
Murmur.MetaCallback.__init__(self)
self.app = app
@fortifyIceFu()
@checkSecret
def started(self, server, current=None) -> None:
"""
This function is called when a virtual server is started
and makes sure an authenticator gets attached if needed.
"""
if server.id() in server_config_obj.virtual_servers_list():
logger.info("Setting authenticator for virtual server %d", server.id())
try:
server.setAuthenticator(self.app.auth)
# Apparently this server was restarted without us noticing
except (Murmur.InvalidSecretException, Ice.UnknownUserException) as e:
if (hasattr(e, "unknown") and e.unknown != "Murmur::InvalidSecretException"):
# Special handling for Murmur 1.2.2 servers with invalid slice files
raise e
logger.error("Invalid ice secret")
return
else:
logger.debug("Virtual server %d got started", server.id())
@fortifyIceFu()
@checkSecret
def stopped(self, server, current=None) -> None:
"""
This function is called when a virtual server is stopped
"""
if self.app.connected:
# Only try to output the server id if we think we are still connected to prevent
# flooding of our thread pool
try:
if server.id() in server_config_obj.virtual_servers_list():
logger.info(f"Authenticated virtual server {server.id()} got stopped")
else:
logger.debug(f"Virtual server {server.id()} got stopped")
return
except Ice.ConnectionRefusedException:
self.app.connected = False
logger.debug("Server shutdown stopped a virtual server")
if server_config_obj.reject_on_error: # Python 2.4 compat
authenticateFortifyResult = (-1, None, None)
else:
authenticateFortifyResult = (-2, None, None)
class serverCallback(Murmur.ServerCallback):
def __init__(self, app) -> None:
Murmur.ServerCallback.__init__(self)
self.app = app
def userConnected(self, user, current=None) -> None:
try:
mumble_user = MumbleUser.objects.get(username=user)
mumble_user.release = user.release
mumble_user.version = user.version
mumble_user.last_connect = datetime.now()
mumble_user.save()
except MumbleUser.DoesNotExist as a:
try:
mumble_user = TempUser.objects.get(username=user)
mumble_user.release = user.release
mumble_user.version = user.version
mumble_user.last_connect = datetime.now()
mumble_user.save()
except Exception as b:
logger.exception(a)
logger.exception(b)
def userDisconnected(self, user, current=None) -> None:
try:
mumble_user = MumbleUser.objects.get(username=user)
mumble_user.last_disconnect = datetime.now()
mumble_user.save()
except MumbleUser.DoesNotExist as a:
try:
mumble_user = TempUser.objects.get(username=user)
mumble_user.last_disconnect = datetime.now()
mumble_user.save()
except Exception as b:
logger.exception(a)
logger.exception(b)
def userStateChanged(self, user, current=None) -> None:
pass
def userTextMessage(self, user, text_message=None) -> None:
if text_message.text == "!kicktemps":
if self.server.hasPermission(user.session, 0, 0x10000):
self.server.sendMessage(user.session, "Kicking all templink clients!")
users = self.server.getUsers()
for (userid, auser) in users.items():
if auser.userid > (server_config_obj.offset * 2):
self.server.kickUser(auser.session, "Kicking all temp users! :-)")
self.server.sendMessage(user.session, "All templink clients kicked!")
else:
self.server.sendMessage(user.session, "You do not have kick permissions!")
def channelCreated(self, channel, current=None) -> None:
pass
def channelRemoved(self, channel, current=None) -> None:
pass
def channelStateChanged(self, channel, current=None) -> None:
pass
class AllianceAuthAuthenticator(Murmur.ServerUpdatingAuthenticator):
texture_cache = {}
def __init__(self):
Murmur.ServerUpdatingAuthenticator.__init__(self)
@fortifyIceFu(authenticateFortifyResult)
@checkSecret
def authenticate(self, name, pw, certlist, certhash, strong, current=None) -> tuple[int, str | None, str | None]:
"""
This function is called to authenticate a user
"""
FALL_THROUGH = -2
AUTH_REFUSED = -1
if name == "SuperUser":
logger.debug("Forced fall through for SuperUser")
return (FALL_THROUGH, None, None)
try:
mumble_user = MumbleUser.objects.get(username=name)
except MumbleUser.DoesNotExist:
try:
mumble_user = TempUser.objects.get(username=name)
except TempUser.DoesNotExist:
return (-2, None, None) # No Standard or Temp User
logger.debug("checking password with hash function: %s" % mumble_user.hashfn)
if allianceauth_check_hash(pw, mumble_user.pwhash, mumble_user.hashfn):
logger.info(f'User authenticated: {mumble_user.display_name} {mumble_user.user_id + server_config_obj.offset}')
logger.debug("Group memberships: %s", mumble_user.group_string())
return (mumble_user.user_id + server_config_obj.offset, mumble_user.display_name, mumble_user.group_string())
logger.info(
f'Failed authentication attempt for user: {name} {mumble_user.user_id + server_config_obj.offset}')
return (AUTH_REFUSED, None, None)
@fortifyIceFu((False, None))
@checkSecret
def getInfo(self, id, current=None) -> tuple[bool, None]:
"""
Gets called to fetch user specific information
"""
# We do not expose any additional information so always fall through
logger.debug("getInfo for %d -> denied", id)
return (False, None)
@fortifyIceFu(-2)
@checkSecret
def nameToId(self, name, current=None) -> int:
"""
Gets called to get the id for a given username
"""
if name == "SuperUser":
logger.debug("nameToId SuperUser -> forced fall through")
return -2 # FALL_THROUGH
try:
return (MumbleUser.objects.get(username=name).pk + server_config_obj.offset)
except MumbleUser.DoesNotExist:
try:
return (TempUser.objects.get(username=name).pk + server_config_obj.offset * 2)
except TempUser.DoesNotExist:
return -2 # FALL_THROUGH
@fortifyIceFu("")
@checkSecret
def idToName(self, id, current=None) -> str:
"""
Gets called to get the username for a given id
"""
if id < server_config_obj.offset:
return "" # FALL_THROUGH
try:
mumble_user = MumbleUser.objects.get(user_id=id - server_config_obj.offset)
mumble_user.username
except MumbleUser.DoesNotExist:
try:
mumble_user = TempUser.objects.get(user_id=id - server_config_obj.offset * 2)
mumble_user.username
except TempUser.DoesNotExist:
return "" # FALL_THROUGH
# I dont quite rightly know why we have this
# SuperUser shouldnt be in our Authenticator?
# But Maybe it can be?
if MumbleUser.objects.get(user_id=id - server_config_obj.offset).username == "SuperUser":
logger.debug('idToName %d -> "SuperUser" caught')
return "" # FALL_THROUGH
else:
return mumble_user.username
@fortifyIceFu("")
@checkSecret
def idToTexture(self, id, current=None):
"""
Gets called to get the corresponding texture for a user
"""
if server_config_obj.avatar_enable is False:
logger.debug(f"idToTexture {id} -> avatar display disabled, fall through")
return "" # FALL_THROUGH
if id < server_config_obj.offset:
return "" # FALL_THROUGH
try:
avatar_url = MumbleUser.objects.get(user_id=id - server_config_obj.offset).user.profile.main_character.portrait_url()
except MumbleUser.DoesNotExist:
logger.debug(f"idToTexture {id} -> MumbleUser.DoesNotExist, Fall Through")
return "" # FALL_THROUGH
if avatar_url:
if avatar_url in self.texture_cache:
logger.debug('idToTexture {id} -> cached avatar returned: {avatar_url}')
return self.texture_cache[avatar_url]
# Not cached? Try to retrieve from CCP image server.
try:
logger.debug('idToTexture %d -> try file "%s"', id, avatar_url)
handle = urlopen(avatar_url)
except (OSError, Exception) as e:
logger.exception(e)
logger.debug(f'idToTexture {id} -> image download for {avatar_url} failed, fall through')
return "" # FALL_THROUGH
else:
file = handle.read()
handle.close()
# Cache resulting avatar by file address and return image.
self.texture_cache[avatar_url] = file
logger.debug(f'idToTexture {id} -> avatar from {avatar_url} retrieved and returned')
return self.texture_cache[avatar_url]
else:
logger.debug(f"idToTexture {id} -> empty avatar_url, final fall through")
return "" # FALL_THROUGH
@fortifyIceFu(-2)
@checkSecret
def registerUser(self, name, current=None) -> int:
"""
Gets called when the server is asked to register a user.
"""
logger.debug(f'registerUser {name} -> fall through')
return -2 # FALL_THROUGH
@fortifyIceFu(-1)
@checkSecret
def unregisterUser(self, id, current=None) -> int:
"""
Gets called when the server is asked to unregister a user.
"""
# Return -1 to fall through to internal server database, so as to not modify Alliance Auth
# but we can make murmur delete all additional logger.information it got this way.
logger.debug(f"unregisterUser {id} -> fall through", )
return -1 # FALL_THROUGH
@fortifyIceFu({})
@checkSecret
def getRegisteredUsers(self, filter, current=None) -> dict:
"""
Returns a list of usernames in the AllianceAuth database which contain
filter as a substring.
"""
if not filter:
mumble_users = MumbleUser.objects.all()
else:
mumble_users = MumbleUser.objects.filter(username__icontains=filter)
if not mumble_users.exists():
logger.debug(f'getRegisteredUsers -> empty list for filter {filter}', )
return {}
logger.debug(f'getRegisteredUsers -> {len(mumble_users)} results for filter {filter}')
return {mumble_user.user_id + server_config_obj.offset: mumble_user.username for mumble_user in mumble_users}
@fortifyIceFu(-1)
@checkSecret
def setInfo(self, id, info, current=None) -> int:
"""
Gets called when the server is supposed to save additional information
about a user to his database
"""
# Return -1 to fall through to the internal server handler.
# Store this in Murmur, Not Alliance Auth
logger.debug(f"setInfo {id} -> fall through")
return -1 # FALL_THROUGH
@fortifyIceFu(-1)
@checkSecret
def setTexture(self, id, texture, current=None) -> int:
"""
Gets called when the server is asked to update the user texture of a user
"""
# Return -1 to fall through to the internal server handler.
# Store this in Murmur, Not Alliance Auth
logger.debug(f"setTexture {id} -> fall through")
return -1 # FALL_THROUGH
#
# --- Start of authenticator
#
logger.info(f"Starting AllianceAuth Mumble Authenticator V:{__version__}")
initdata = Ice.InitializationData()
initdata.properties = Ice.createProperties([], initdata.properties)
initdata.properties.setProperty('Ice.ImplicitContext', 'Shared')
initdata.properties.setProperty('Ice.Default.EncodingVersion', '1.0')
initdata.logger = logger
app = AllianceAuthAuthenticatorApp()
state = app.main(sys.argv, initData=initdata)
logger.info('Shutdown complete')
def allianceauth_check_hash(password, hash, hash_type) -> bool:
"""
:param password: Password to be verified
:param hash: Hash for the password to be checked against
:param hash_type: Hashing function originally used to generate the hash
"""
if hash_type == "sha1":
return sha1(password).hexdigest() == hash
elif hash_type == "bcrypt-sha256":
return bcrypt_sha256.verify(password, hash)
else:
logger.warning("No valid hash function found for %s" % hash_type)
return False
def idler_handler(server) -> None:
logger.debug("IdlerHandler: Starting")
users = server.getUsers().values()
logger.debug("IdleHandler: Fetched All Users")
for user in users:
logger.debug(f"IdleHandler: Checking user {user.name}")
if isinstance(user, int):
logger.debug(f"IdleHandler: Skipping User {user.name}, This happens occasionally")
continue
if user_idlesecs > server_config_obj.idler_handler.seconds:
logger.debug(
f"IdleHandler: User {user.name} is AFK, for {user_idlesecs}/{server_config_obj.idler_handler.seconds}"
)
state = server.getState(user.session)
if state:
# AllowList > DenyList
if server_config_obj.idler_handler.denylist is False:
if state.channel not in server_config_obj.idler_handler.list:
return
elif server_config_obj.idler_handler.denylist is True:
if state.channel in server_config_obj.idler_handler.list:
return
if state.channel == server_config_obj.idler_handler.channel:
return
state.channel = server_config_obj.idler_handler.channel
state.selfMute = True
state.selfDeaf = True
server.setState(state)
logger.debug(f"IdleHandler: Moved AFK User {user.name}")
Timer(server_config_obj.idler_handler.interval, idler_handler, (server,)).start()
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,15 @@
from allianceauth.services.modules.mumble import authenticator
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = 'Run the Mumble Authenticator'
def add_arguments(self, parser) -> None:
parser.add_argument(
'--server_id', action='store', default=1,
help='Run the Mumble Authenticator for the given Server Configuration ID')
def handle(self, *args, **options) -> None:
authenticator.main()

View File

@@ -0,0 +1,48 @@
import random
import string
from allianceauth.eveonline.models import EveCharacter
from allianceauth.services.hooks import NameFormatter
from passlib.hash import bcrypt_sha256
from django.db import models
from allianceauth.services.abstract import AbstractServiceModel
import logging
from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _
logger = logging.getLogger(__name__)
class MumbleManager(models.Manager):
@staticmethod
def get_username(user) -> str:
return user.profile.main_character.character_name # main character as the user.username may be incorrect
@staticmethod
def sanitise_username(username) -> str:
return username.replace(" ", "_")
@staticmethod
def generate_random_pass() -> str:
return ''.join([random.choice(string.ascii_letters + string.digits) for n in range(16)])
@staticmethod
def gen_pwhash(password) -> str:
return bcrypt_sha256.encrypt(password.encode('utf-8'))
def create(self, user):
try:
username = self.get_username(user)
logger.debug(f"Creating mumble user with username {username}")
username_clean = self.sanitise_username(username)
password = self.generate_random_pass()
pwhash = self.gen_pwhash(password)
logger.debug("Proceeding with mumble user creation: clean username {}, pwhash starts with {}".format(
username_clean, pwhash[0:5]))
logger.info(f"Creating mumble user {username_clean}")
result = super().create(user=user, username=username_clean, pwhash=pwhash)
result.credentials.update({'username': result.username, 'password': password})
return result
except AttributeError: # No Main or similar errors
return False
return False

View File

@@ -0,0 +1,37 @@
# Generated by Django 4.2.16 on 2024-10-07 13:39
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("mumble", "0012_mumble_client_info"),
]
operations = [
migrations.AlterModelOptions(
name="mumbleuser",
options={
"permissions": (
("access_mumble", "Can access the Mumble service"),
(
"view_connection_history",
"Can access the connection history of the Mumble service",
),
)
},
),
migrations.AlterField(
model_name="mumbleuser",
name="release",
field=models.TextField(
blank=True,
editable=False,
help_text="Client release. For official releases, this equals the version. For snapshots and git compiles, this will be something else.",
max_length=254,
null=True,
verbose_name="Mumble Release",
),
),
]

View File

@@ -0,0 +1,66 @@
# Generated by Django 4.2.16 on 2024-12-06 06:20
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('mumble', '0013_connection_history'),
]
operations = [
migrations.CreateModel(
name='IdlerHandler',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=50, verbose_name='')),
('enabled', models.BooleanField(default=False, verbose_name='')),
('seconds', models.SmallIntegerField(default=3600, verbose_name='')),
('interval', models.SmallIntegerField(default=60, verbose_name='')),
('channel', models.SmallIntegerField(verbose_name='')),
('denylist', models.BooleanField(default=True, verbose_name='')),
('list', models.CharField(default='', max_length=50, verbose_name='')),
],
options={
'verbose_name': '',
'verbose_name_plural': 's',
},
),
migrations.RemoveField(
model_name='mumbleuser',
name='display_name',
),
migrations.RemoveField(
model_name='mumbleuser',
name='groups',
),
migrations.AlterField(
model_name='mumbleuser',
name='hashfn',
field=models.CharField(choices=[('bcrypt-sha256', ''), ('sha1', '')], default='bcrypt-sha256', max_length=15),
),
migrations.CreateModel(
name='MumbleServerServer',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=50, verbose_name='')),
('ip', models.GenericIPAddressField(verbose_name='')),
('endpoint', models.GenericIPAddressField(verbose_name='')),
('port', models.PositiveSmallIntegerField(default=6502, verbose_name='')),
('secret', models.CharField(max_length=50, verbose_name='')),
('watchdog', models.SmallIntegerField(default=30, verbose_name='')),
('slice', models.CharField(choices=[('MumbleServer.ice', 'MumbleServer.ice eg, Mumble >=1.5.17'), ('Murmur.Ice', 'Murmur.Ice eg, Mumble <=1.5.17')], default='MumbleServer.ice', max_length=16)),
('virtual_servers', models.CharField(default='1', max_length=50, verbose_name='')),
('avatar_enable', models.BooleanField(verbose_name='')),
('reject_on_error', models.BooleanField(verbose_name='')),
('offset', models.IntegerField(default=1000000000, verbose_name='')),
('idler_handler', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='mumble.idlerhandler', verbose_name='')),
],
options={
'verbose_name': '',
'verbose_name_plural': 's',
},
),
]

View File

@@ -0,0 +1,121 @@
# Generated by Django 4.2.16 on 2024-12-06 09:58
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('mumble', '0014_idlerhandler_remove_mumbleuser_display_name_and_more'),
]
operations = [
migrations.AlterModelOptions(
name='idlerhandler',
options={'default_permissions': (), 'verbose_name': 'Idler Handler', 'verbose_name_plural': 'Idler Handlers'},
),
migrations.AlterModelOptions(
name='mumbleserverserver',
options={'default_permissions': (), 'verbose_name': 'Mumble Server', 'verbose_name_plural': 'Mumble Servers'},
),
migrations.AlterModelOptions(
name='mumbleuser',
options={'permissions': (('access_mumble', 'Can access the Mumble service'), ('view_connection_history', 'Can access the connection history of the Mumble service')), 'verbose_name': 'User', 'verbose_name_plural': 'Users'},
),
migrations.AlterField(
model_name='idlerhandler',
name='channel',
field=models.SmallIntegerField(verbose_name='AFK Channel'),
),
migrations.AlterField(
model_name='idlerhandler',
name='enabled',
field=models.BooleanField(default=False, verbose_name='Enabled'),
),
migrations.AlterField(
model_name='idlerhandler',
name='interval',
field=models.SmallIntegerField(default=60, verbose_name='Run Interval'),
),
migrations.AlterField(
model_name='idlerhandler',
name='name',
field=models.CharField(max_length=50, verbose_name='Name'),
),
migrations.AlterField(
model_name='idlerhandler',
name='seconds',
field=models.SmallIntegerField(default=3600, verbose_name='Idle Seconds'),
),
migrations.AlterField(
model_name='mumbleserverserver',
name='avatar_enable',
field=models.BooleanField(default=True, verbose_name='Enable EVE Avatars'),
),
migrations.AlterField(
model_name='mumbleserverserver',
name='endpoint',
field=models.GenericIPAddressField(default='127.0.0.1', verbose_name='Endpoint IP Address'),
),
migrations.AlterField(
model_name='mumbleserverserver',
name='idler_handler',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='mumble.idlerhandler', verbose_name='Idler Handler'),
),
migrations.AlterField(
model_name='mumbleserverserver',
name='ip',
field=models.GenericIPAddressField(default='127.0.0.1', verbose_name='Host IP Address'),
),
migrations.AlterField(
model_name='mumbleserverserver',
name='name',
field=models.CharField(max_length=50),
),
migrations.AlterField(
model_name='mumbleserverserver',
name='offset',
field=models.IntegerField(default=1000000000, verbose_name='ID Offset'),
),
migrations.AlterField(
model_name='mumbleserverserver',
name='port',
field=models.PositiveSmallIntegerField(default=6502, verbose_name='Port'),
),
migrations.AlterField(
model_name='mumbleserverserver',
name='reject_on_error',
field=models.BooleanField(default=True, verbose_name='Reject Unauthenticated'),
),
migrations.AlterField(
model_name='mumbleserverserver',
name='secret',
field=models.CharField(max_length=50, verbose_name='ICE Secret'),
),
migrations.AlterField(
model_name='mumbleserverserver',
name='slice',
field=models.CharField(choices=[('MumbleServer.ice', 'MumbleServer.ice (Mumble >=1.5.17)'), ('Murmur.Ice', 'Murmur.Ice (Mumble <=1.5.17)')], default='MumbleServer.ice', max_length=16),
),
migrations.AlterField(
model_name='mumbleserverserver',
name='virtual_servers',
field=models.CharField(default='1', max_length=50, verbose_name='Virtual Servers'),
),
migrations.AlterField(
model_name='mumbleserverserver',
name='watchdog',
field=models.SmallIntegerField(default=30, verbose_name='Watchdog Interval'),
),
migrations.AlterField(
model_name='mumbleuser',
name='hashfn',
field=models.CharField(choices=[('bcrypt-sha256', 'SHA256'), ('sha1', 'SHA1')], default='bcrypt-sha256', max_length=15),
),
migrations.AlterField(
model_name='mumbleuser',
name='last_disconnect',
field=models.DateTimeField(blank=True, editable=False, help_text='Timestamp of the users Last Disconnection from Mumble', max_length=254, null=True, verbose_name='Last Disconnection'),
),
]

View File

@@ -0,0 +1,60 @@
# Generated by Django 4.2.16 on 2024-12-06 10:47
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('eveonline', '0017_alliance_and_corp_names_are_not_unique'),
('mumble', '0015_alter_idlerhandler_options_and_more'),
]
operations = [
migrations.CreateModel(
name='TempLink',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('expires', models.DateTimeField(verbose_name='Expiry')),
('link_ref', models.CharField(max_length=20)),
('creator', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='eveonline.evecharacter')),
],
options={
'permissions': (('create_new_links', 'Can Create Temp Links'),),
},
),
migrations.AlterField(
model_name='mumbleuser',
name='last_connect',
field=models.DateTimeField(blank=True, editable=False, help_text='Timestamp of the users Last Connection to Mumble', null=True, verbose_name='Last Connection'),
),
migrations.AlterField(
model_name='mumbleuser',
name='last_disconnect',
field=models.DateTimeField(blank=True, editable=False, help_text='Timestamp of the users Last Disconnection from Mumble', null=True, verbose_name='Last Disconnection'),
),
migrations.AlterField(
model_name='mumbleuser',
name='release',
field=models.TextField(blank=True, editable=False, help_text='Client release. For official releases, this equals the version. For snapshots and git compiles, this will be something else.', null=True, verbose_name='Mumble Release'),
),
migrations.CreateModel(
name='TempUser',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200)),
('username', models.CharField(max_length=254, unique=True)),
('pwhash', models.CharField(max_length=90)),
('hashfn', models.CharField(choices=[('bcrypt-sha256', 'SHA256'), ('sha1', 'SHA1')], default='bcrypt-sha256', max_length=15)),
('certhash', models.CharField(blank=True, editable=False, help_text='Hash of Mumble client certificate as presented when user authenticates', max_length=254, null=True, verbose_name='Certificate Hash')),
('release', models.TextField(blank=True, editable=False, help_text='Client release. For official releases, this equals the version. For snapshots and git compiles, this will be something else.', null=True, verbose_name='Mumble Release')),
('version', models.IntegerField(blank=True, editable=False, help_text='Client version. Major version in upper 16 bits, followed by 8 bits of minor version and 8 bits of patchlevel. Version 1.2.3 = 0x010203.', null=True, verbose_name='Mumble Version')),
('last_connect', models.DateTimeField(blank=True, editable=False, help_text='Timestamp of the users Last Connection to Mumble', null=True, verbose_name='Last Connection')),
('last_disconnect', models.DateTimeField(blank=True, editable=False, help_text='Timestamp of the users Last Disconnection from Mumble', null=True, verbose_name='Last Disconnection')),
('expires', models.DateTimeField(verbose_name='Expiry')),
('character_id', models.IntegerField(blank=True, default=None, null=True)),
('templink', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='mumble.templink')),
],
),
]

View File

@@ -0,0 +1,27 @@
# Generated by Django 4.2.16 on 2024-12-29 13:14
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('mumble', '0016_templink_alter_mumbleuser_last_connect_and_more'),
]
operations = [
migrations.AlterModelOptions(
name='tempuser',
options={'permissions': (), 'verbose_name': 'Temp User', 'verbose_name_plural': 'Temp Users'},
),
migrations.AlterField(
model_name='idlerhandler',
name='denylist',
field=models.BooleanField(default=True, help_text='True for DenyList, False for Allowlist', verbose_name='DenyList'),
),
migrations.AlterField(
model_name='idlerhandler',
name='list',
field=models.CharField(default='', max_length=50, verbose_name='Allow/Deny list'),
),
]

View File

@@ -1,162 +1,263 @@
import random
import string
from passlib.hash import bcrypt_sha256
from django.db import models
from django.contrib.auth.models import Group
from allianceauth.eveonline.models import EveCharacter
from allianceauth.services.hooks import NameFormatter
from allianceauth.services.modules.mumble.managers import MumbleManager
from passlib.hash import bcrypt_sha256
from django.db import models
from allianceauth.services.abstract import AbstractServiceModel
import logging
from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _
logger = logging.getLogger(__name__)
class MumbleManager(models.Manager):
HASH_FN = 'bcrypt-sha256'
@staticmethod
def get_display_name(user):
from .auth_hooks import MumbleService
return NameFormatter(MumbleService(), user).format_name()
@staticmethod
def get_username(user):
return user.profile.main_character.character_name # main character as the user.username may be incorect
@staticmethod
def sanitise_username(username):
return username.replace(" ", "_")
@staticmethod
def generate_random_pass():
return ''.join([random.choice(string.ascii_letters + string.digits) for n in range(16)])
@staticmethod
def gen_pwhash(password):
return bcrypt_sha256.encrypt(password.encode('utf-8'))
def create(self, user):
try:
username = self.get_username(user)
logger.debug(f"Creating mumble user with username {username}")
username_clean = self.sanitise_username(username)
display_name = self.get_display_name(user)
password = self.generate_random_pass()
pwhash = self.gen_pwhash(password)
logger.debug("Proceeding with mumble user creation: clean username {}, pwhash starts with {}".format(
username_clean, pwhash[0:5]))
logger.info(f"Creating mumble user {username_clean}")
result = super().create(user=user, username=username_clean,
pwhash=pwhash, hashfn=self.HASH_FN,
display_name=display_name)
result.update_groups()
result.credentials.update({'username': result.username, 'password': password})
return result
except AttributeError: # No Main or similar errors
return False
return False
def user_exists(self, username):
return self.filter(username=username).exists()
class MumbleUser(AbstractServiceModel):
class HashFunction(models.TextChoices):
SHA256 = 'bcrypt-sha256', _('SHA256')
SHA1 = 'sha1', _('SHA1')
user = models.OneToOneField(
'auth.User',
User,
primary_key=True,
on_delete=models.CASCADE,
related_name='mumble'
)
username = models.CharField(max_length=254, unique=True)
pwhash = models.CharField(max_length=90)
hashfn = models.CharField(max_length=20, default='sha1')
groups = models.TextField(blank=True, null=True)
hashfn = models.CharField(
max_length=15,
choices=HashFunction.choices,
default=HashFunction.SHA256)
certhash = models.CharField(
verbose_name="Certificate Hash",
max_length=254,
blank=True,
null=True,
editable=False,
help_text="Hash of Mumble client certificate as presented when user authenticates"
)
display_name = models.CharField(
max_length=254,
unique=True
)
max_length=254,blank=True, null=True, editable=False,
help_text="Hash of Mumble client certificate as presented when user authenticates")
release = models.TextField(
verbose_name="Mumble Release",
max_length=254,
blank=True,
null=True,
editable=False,
help_text="The Mumble Release the user last authenticated with"
)
blank=True, null=True, editable=False,
help_text="Client release. For official releases, this equals the version. For snapshots and git compiles, this will be something else.")
version = models.IntegerField(
verbose_name="Mumble Version",
blank=True,
null=True,
editable=False,
help_text="Client version. Major version in upper 16 bits, followed by 8 bits of minor version and 8 bits of patchlevel. Version 1.2.3 = 0x010203."
)
blank=True, null=True, editable=False,
help_text="Client version. Major version in upper 16 bits, followed by 8 bits of minor version and 8 bits of patchlevel. Version 1.2.3 = 0x010203.")
last_connect = models.DateTimeField(
verbose_name="Last Connection",
max_length=254,
blank=True,
null=True,
editable=False,
help_text="Timestamp of the users Last Connection to Mumble"
)
blank=True, null=True, editable=False,
help_text="Timestamp of the users Last Connection to Mumble")
last_disconnect = models.DateTimeField(
verbose_name="Last Disconnection",
max_length=254,
blank=True,
null=True,
editable=False,
help_text="Timestamp of the users Last Disconnection to Mumble"
)
blank=True, null=True, editable=False,
help_text="Timestamp of the users Last Disconnection from Mumble")
objects = MumbleManager()
def __str__(self):
return self.username
@property
def display_name(self) -> str:
from .auth_hooks import MumbleService
return NameFormatter(MumbleService(), self.user).format_name()
def update_password(self, password=None):
@property
def groups(self) -> str:
# Not sure where this is used, there was a test for it
return self.group_string()
def __str__(self) -> str:
return f"{self.username}"
def update_password(self, password=None) -> None:
init_password = password
logger.debug(f"Updating mumble user %s password.")
logger.debug(f"Updating mumble user {self.user} password.")
if not password:
password = MumbleManager.generate_random_pass()
pwhash = MumbleManager.gen_pwhash(password)
logger.debug("Proceeding with mumble user {} password update - pwhash starts with {}".format(
self.user, pwhash[0:5]))
logger.debug(f"Proceeding with mumble user {self.user} password update - pwhash starts with {pwhash[0:5]}")
self.pwhash = pwhash
self.hashfn = MumbleManager.HASH_FN
self.hashfn = self.HashFunction.SHA256
self.save()
if init_password is None:
self.credentials.update({'username': self.username, 'password': password})
def reset_password(self):
def reset_password(self) -> None:
self.update_password()
def update_groups(self, groups: Group=None):
if groups is None:
groups = self.user.groups.all()
groups_str = [self.user.profile.state.name]
for group in groups:
groups_str.append(str(group.name))
safe_groups = ','.join({g.replace(' ', '-') for g in groups_str})
logger.info(f"Updating mumble user {self.user} groups to {safe_groups}")
self.groups = safe_groups
self.save()
return True
def group_string(self) -> str:
"""Return a Mumble Safe Formatted List of Groups
This used to be a ModelField, generated on the fly now with DjangoAuthenticatorTM
def update_display_name(self):
logger.info(f"Updating mumble user {self.user} display name")
self.display_name = MumbleManager.get_display_name(self.user)
self.save()
return True
Returns:
LiteralString: Mumble Safe Formatted List of Groups
"""
groups_str = [self.user.profile.state.name]
for group in self.user.groups.all():
groups_str.append(str(group.name))
return ','.join({g.replace(' ', '-') for g in groups_str})
class Meta:
verbose_name = _("User")
verbose_name_plural = _("Users")
permissions = (
("access_mumble", "Can access the Mumble service"),
("view_connection_history", "Can access the connection history of the Mumble service"),
)
class TempLink(models.Model):
expires = models.DateTimeField(_("Expiry"), auto_now=False, auto_now_add=False)
link_ref = models.CharField(max_length=20)
creator = models.ForeignKey(EveCharacter, on_delete=models.SET_NULL, null=True, default=None)
class Meta:
permissions = (("create_new_links", "Can Create Temp Links"),)
def __str__(self):
return f"Link {self.link_ref} - {self.expires}"
class TempUser(models.Model):
class HashFunction(models.TextChoices):
SHA256 = 'bcrypt-sha256', _('SHA256')
SHA1 = 'sha1', _('SHA1')
name = models.CharField(max_length=200) # Display name to show
username = models.CharField(max_length=254, unique=True)
pwhash = models.CharField(max_length=90)
hashfn = models.CharField(
max_length=15,
choices=HashFunction.choices,
default=HashFunction.SHA256)
certhash = models.CharField(
verbose_name="Certificate Hash",
max_length=254,blank=True, null=True, editable=False,
help_text="Hash of Mumble client certificate as presented when user authenticates")
release = models.TextField(
verbose_name="Mumble Release",
blank=True, null=True, editable=False,
help_text="Client release. For official releases, this equals the version. For snapshots and git compiles, this will be something else.")
version = models.IntegerField(
verbose_name="Mumble Version",
blank=True, null=True, editable=False,
help_text="Client version. Major version in upper 16 bits, followed by 8 bits of minor version and 8 bits of patchlevel. Version 1.2.3 = 0x010203.")
last_connect = models.DateTimeField(
verbose_name="Last Connection",
blank=True, null=True, editable=False,
help_text="Timestamp of the users Last Connection to Mumble")
last_disconnect = models.DateTimeField(
verbose_name="Last Disconnection",
blank=True, null=True, editable=False,
help_text="Timestamp of the users Last Disconnection from Mumble")
expires = models.DateTimeField(_("Expiry"), auto_now=False, auto_now_add=False)
templink = models.ForeignKey(TempLink, on_delete=models.CASCADE, null=True, default=None)
character_id = models.IntegerField(default=None, blank=True, null=True)
@property
def display_name(self) -> str:
from .auth_hooks import MumbleService
return NameFormatter(MumbleService(), self.user).format_name()
@property
def groups(self) -> str:
# Not sure where this is used, there was a test for it
return self.group_string()
@staticmethod
def get_username(user) -> str:
return user.profile.main_character.character_name # main character as the user.username may be incorrect
@staticmethod
def sanitise_username(username) -> str:
return username.replace(" ", "_")
@staticmethod
def generate_random_pass() -> str:
return ''.join([random.choice(string.ascii_letters + string.digits) for n in range(16)])
@staticmethod
def gen_pwhash(password) -> str:
return bcrypt_sha256.encrypt(password.encode('utf-8'))
def __str__(self) -> str:
return f"Temp User: {self.username} - {self.name}"
def group_string(self) -> str:
"""Overwritten from MumbleUser, we could add features to this in the future
"""
return str(["Guest"])
class Meta:
verbose_name = _("Temp User")
verbose_name_plural = _("Temp Users")
permissions = ()
class IdlerHandler(models.Model):
name = models.CharField(_("Name"), max_length=50)
enabled = models.BooleanField(_("Enabled"), default=False)
seconds = models.SmallIntegerField(_("Idle Seconds"), default=3600)
interval = models.SmallIntegerField(_("Run Interval"), default=60)
channel = models.SmallIntegerField(_("AFK Channel"))
denylist = models.BooleanField(_("DenyList"), default=True, help_text="True for DenyList, False for Allowlist")
list = models.CharField(_("Allow/Deny list"), max_length=50, default="")
class Meta:
verbose_name = _("Idler Handler")
verbose_name_plural = _("Idler Handlers")
default_permissions = ()
def __str__(self) -> str:
return f"{self.name}"
class MumbleServerServer(models.Model): # This will clash with ICE MumbleServer
class ServerVersion(models.TextChoices):
MUMBLESERVER_ICE = 'MumbleServer.ice', _('MumbleServer.ice (Mumble >=1.5.17)')
MURMUR_ICE = 'Murmur.Ice', _('Murmur.Ice (Mumble <=1.5.17)')
name = models.CharField(max_length=50)
ip = models.GenericIPAddressField(
verbose_name=_("Host IP Address"),
protocol="both",
unpack_ipv4=False,
default="127.0.0.1")
endpoint = models.GenericIPAddressField(
verbose_name=_("Endpoint IP Address"),
protocol="both",
unpack_ipv4=False,
default="127.0.0.1")
port = models.PositiveSmallIntegerField(verbose_name=_("Port"), default=6502)
secret = models.CharField(verbose_name=_("ICE Secret"), max_length=50)
watchdog = models.SmallIntegerField(verbose_name=_("Watchdog Interval"), default=30)
slice = models.CharField(
max_length=16,
choices=ServerVersion.choices,
default=ServerVersion.MUMBLESERVER_ICE)
virtual_servers = models.CharField(
verbose_name=_("Virtual Servers"),
max_length=50,
default="1")
avatar_enable = models.BooleanField(
verbose_name=_("Enable EVE Avatars"),
default=True)
reject_on_error = models.BooleanField(
verbose_name=_("Reject Unauthenticated"),
default=True)
offset = models.IntegerField(
verbose_name=_("ID Offset"),
default=1000000000)
idler_handler = models.ForeignKey(
IdlerHandler,
verbose_name=_("Idler Handler"),
on_delete=models.SET_NULL,
null=True,
blank=True)
class Meta:
verbose_name = _("Mumble Server")
verbose_name_plural = _("Mumble Servers")
default_permissions = ()
def __str__(self) -> str:
return f"{self.name}"
def virtual_servers_list(self) -> list:
return [int(num) for num in self.virtual_servers.replace(",", " ").split() if num]

View File

@@ -1,10 +1,9 @@
from datetime import datetime, timezone
import logging
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist
from celery import shared_task
from allianceauth.services.tasks import QueueOnce
from .models import MumbleUser
from .models import MumbleUser, TempLink, TempUser
logger = logging.getLogger(__name__)
@@ -25,56 +24,9 @@ class MumbleTasks:
logger.info("Deleting all MumbleUser models")
MumbleUser.objects.all().delete()
@staticmethod
@shared_task(bind=True, name="mumble.update_groups", base=QueueOnce)
def update_groups(self, pk):
user = User.objects.get(pk=pk)
logger.debug("Updating mumble groups for user %s" % user)
if MumbleTasks.has_account(user):
try:
if not user.mumble.update_groups():
raise Exception("Group sync failed")
logger.debug("Updated user %s mumble groups." % user)
return True
except MumbleUser.DoesNotExist:
logger.info(f"Mumble group sync failed for {user}, user does not have a mumble account")
except:
logger.exception("Mumble group sync failed for %s, retrying in 10 mins" % user)
raise self.retry(countdown=60 * 10)
else:
logger.debug("User %s does not have a mumble account, skipping" % user)
return False
@staticmethod
@shared_task(bind=True, name="mumble.update_display_name", base=QueueOnce)
def update_display_name(self, pk):
user = User.objects.get(pk=pk)
logger.debug("Updating mumble groups for user %s" % user)
if MumbleTasks.has_account(user):
try:
if not user.mumble.update_display_name():
raise Exception("Display Name Sync failed")
logger.debug("Updated user %s mumble display name." % user)
return True
except MumbleUser.DoesNotExist:
logger.info(f"Mumble display name sync failed for {user}, user does not have a mumble account")
except:
logger.exception("Mumble display name sync failed for %s, retrying in 10 mins" % user)
raise self.retry(countdown=60 * 10)
else:
logger.debug("User %s does not have a mumble account, skipping" % user)
return False
@staticmethod
@shared_task(name="mumble.update_all_groups")
def update_all_groups():
logger.debug("Updating ALL mumble groups")
for mumble_user in MumbleUser.objects.exclude(username__exact=''):
MumbleTasks.update_groups.delay(mumble_user.user.pk)
@staticmethod
@shared_task(name="mumble.update_all_display_names")
def update_all_display_names():
logger.debug("Updating ALL mumble display names")
for mumble_user in MumbleUser.objects.exclude(username__exact=''):
MumbleTasks.update_display_name.delay(mumble_user.user.pk)
@shared_task
def tidy_up_temp_links() -> None:
TempLink.objects.filter(expires__lt=datetime.now(timezone.utc).timestamp()).delete()
TempUser.objects.filter(templink__isnull=True).delete()
TempUser.objects.filter(expires__lt=datetime.now(timezone.utc).timestamp()).delete()

View File

@@ -0,0 +1,19 @@
{% extends "allianceauth/base-bs5.html" %}
{% load i18n %}
{% block page_title %}
{% translate "Mumble Temporary Links" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Mumble Temporary Links" %}
{% endblock header_nav_brand %}
{% block content %}
<div class="allianceauth-mumble">
<div class="row">
{% block mumble %}{% endblock mumble %}
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,120 @@
{% extends "services/mumble/base.html" %}
{% load static %}
{% load i18n %}
{% block mumble %}
<div class="text-center">
<p>
<img class="ra-avatar img-circle" src="{{ link.creator.portrait_url_128 }}" alt="{{ link.creator.character_name }}" />
</p>
<h4>
{% blocktranslatelate with character=link.creator.character_name %}
{{ character }} has invited you to join Mumble!
{% endblocktranslatelate %}
</h4>
<p>
{% translate "Time Remaining" %}: <span id="countdown{{ link.link_ref }}"></span>
</p>
<p>
<span class="label label-info">{% translate "Link Ref" %}: {{ link.link_ref }}</span>
</p>
<p>
<a class="btn btn-primary" href="mumble://{{ connect_url }}">
<img src="{% static 'services/mumble/images/mumble-icon.png' %}" alt="{% translate 'Mumble' %}" height="64" width="64" style="margin: 15px" />
<span style="margin: 15px;">
{% translate "Click to Join Mumble as" %}: <b>{{ temp_user.name }}</b>
</span>
</a>
</p>
<div class="row justify-content-center">
<div class="col-md-10 col-lg-8">
<div class="card">
<div class="card-header text-center">
<div class="card-title mb-0">{% translate "Manually Connect" %}</div>
</div>
<div class="card-body">
<p>
{% translate "If you have problems with the application link above, please use the following in Mumble's connection dialog." %}
</p>
<p>
{% translate "Mumble URL" %}: <span class="badge bg-dark">{{ mumble }}</span>
</p>
<p>
{% translate "Username" %}: <span class="badge bg-dark">{{ temp_user.username }}</span>
</p>
<p>
{% translate "Password" %}: <span class="badge bg-dark">{{ temp_user.password }}</span>
</p>
</div>
</div>
</div>
</div>
</div>
{% include "bundles/moment-js.html" with locale=True %}
{% include "bundles/timers-js.html" %}
<script>
/* global moment */
const locale = '{{ LANGUAGE_CODE }}';
const timers = [{
'id': '{{ link.link_ref }}',
'targetDate': moment('{{ link.expires| date:"c" }}'),
'expired': false
}];
moment.locale(locale);
/**
* Update a timer
*
* @param timer
*/
const updateTimer = (timer) => {
if (timer.targetDate.isAfter(Date.now())) {
const duration = moment.duration(timer.targetDate - moment(), 'milliseconds');
document.getElementById("countdown" + timer.id).innerHTML = getDurationString(duration);
} else {
timer.expired = true;
document.getElementById("countdown" + timer.id).innerHTML = "";
}
};
/**
* Update all timers
*/
const updateAllTimers = () => {
const l = timers.length;
for (let i = 0; i < l; ++i) {
if (timers[i].expired) {
continue;
}
updateTimer(timers[i]);
}
};
/**
* Timed update
*/
const timedUpdate = () => {
updateAllTimers();
};
// Set initial values
timedUpdate();
// Start timed updates
setInterval(timedUpdate, 1000);
</script>
{% endblock mumble %}

View File

@@ -0,0 +1,139 @@
{% extends "services/mumble/base.html" %}
{% load static %}
{% load i18n %}
{% block mumble %}
<div class="col-md-12 text-center">
<div class="mumble-sso-login mb-3">
<p>
<img class="ra-avatar img-circle" src="{{ link.creator.portrait_url_128 }}" alt="{{ link.creator.character_name }}" />
</p>
<h4>
{% blocktranslatelate with character=link.creator.character_name %}
{{ character }} has invited you to join Mumble!
{% endblocktranslatelate %}
</h4>
<p>
{% translate "Time Remaining" %}: <span id="countdown{{ link.link_ref }}"></span>
</p>
<p>
<span class="label label-info">{% translate "Link Ref" %}: {{ link.link_ref }}</span>
</p>
<form action="{% url 'mumble:join' link.link_ref %}" method="post">
{% csrf_token %}
<input type="hidden" name="sso" value="True" />
<input
type="image"
class="img-responsive center-block"
src="{% static 'allianceauth/authentication/img/sso/EVE_SSO_Login_Buttons_Large_Black.png' %}"
alt="{% translate 'Login with SSO"' %}"
>
</form>
</div>
<div class="mumble-non-sso-login">
<div class="row justify-content-center">
<div class="col-md-10 col-lg-8">
<div class="card">
<div class="card-header text-center">
<div class="card-title mb-0">{% translate "Non SSO Login" %}</div>
</div>
<div class="card-body text-start">
<div class="form-group">
<form action="{% url 'mumble:join' link.link_ref %}" method="post">
{% csrf_token %}
<input type="hidden" name="sso" value="False" />
<p class="text-center">
{% translate "If you cannot SSO with your EVE character, You can enter your own details below." %}
</p>
<p>
<label for="name">{% translate "Name" %}</label>
<input type="text" class="form-control" name="name" id="name" placeholder="{% translate 'Who are you?' %}" />
</p>
<p>
<label for="association">{% translate "Association" %}</label>
<input type="text" class="form-control" name="association" id="association" placeholder="{% translate 'Who are you with?' %}" />
</p>
<button type="submit" value="{% translate 'Submit' %}" class="btn btn-primary">
{% translate "Login Without SSO" %}
</button>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% include "bundles/moment-js.html" with locale=True %}
{% include "bundles/timers-js.html" %}
<script>
/* global moment */
const locale = '{{ LANGUAGE_CODE }}';
const timers = [{
'id': '{{ link.link_ref }}',
'targetDate': moment('{{ link.expires| date:"c" }}'),
'expired': false
}];
moment.locale(locale);
/**
* Update a timer
*
* @param timer
*/
const updateTimer = (timer) => {
if (timer.targetDate.isAfter(Date.now())) {
const duration = moment.duration(timer.targetDate - moment(), 'milliseconds');
document.getElementById("countdown" + timer.id).innerHTML = getDurationString(duration);
} else {
timer.expired = true;
document.getElementById("countdown" + timer.id).innerHTML = "";
}
};
/**
* Update all timers
*/
const updateAllTimers = () => {
const l = timers.length;
for (let i = 0; i < l; ++i) {
if (timers[i].expired) {
continue;
}
updateTimer(timers[i]);
}
};
/**
* Timed update
*/
const timedUpdate = () => {
updateAllTimers();
};
// Set initial values
timedUpdate();
// Start timed updates
setInterval(timedUpdate, 1000);
</script>
{% endblock mumble %}

View File

@@ -0,0 +1,209 @@
{% extends "allianceauth/base-bs5.html" %}
{% load i18n %}
{% block page_title %}
{% translate "Mumble" %}
{% endblock page_title %}
{% block header_nav_brand %}
<a class="navbar-brand">{% trans "Mumble History" %} - {{ mumble_url }}</a>
{% endblock header_nav_brand %}
{% block header_nav_collapse_left %}
{% endblock header_nav_collapse_left %}
{% block header_nav_collapse_right %}
{% endblock header_nav_collapse_right %}
{% block content %}
<div class="card col-lg-12 mb-3">
<div class="card-header">
<span class="card-title">{% translate "Server Connection History" %}</span>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table w-100" id="table-mumble-connection-history">
<thead>
<tr>
<th class="text-start">{% translate "User" %}</th>
<th class="text-start">{% translate "Displayed Name" %}</th>
<th class="text-start">{% translate "Release" %}</th>
<th class="text-start">{% translate "Version" %}</th>
<th class="text-end">{% translate "Last Connect" %}</th>
<th class="text-end">{% translate "Last Disconnect" %}</th>
</tr>
</thead>
</table>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-6">
<div class="card">
<div class="card-header">
<span class="card-title">{% translate "Server Connection Breakdown" %}</span>
</div>
<div class="card-body">
<canvas id="pieChart"></canvas> <!-- Canvas element for the pie chart -->
</div>
</div>
</div>
<div class="col-lg-6">
<div class="card">
<div class="card-header">
<span class="card-title">{% translate "Server Connection Breakdown" %}</span>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table w-100" id="table-mumble-connection-stats">
<thead>
<tr>
<th class="text-start">{% translate "Version" %}</th>
<th class="text-end">{% translate "Number" %}</th>
</tr>
</thead>
</table>
</div>
</div>
</div>
</div>
</div>
{% endblock content %}
{% block extra_javascript %}
{% include "bundles/datatables-js-bs5.html" %}
{% include "bundles/filterdropdown-js.html" %}
{% include "bundles/chart-js.html" %}
{% include "bundles/moment-js.html" with locale=True %}
<script>
$(document).ready(function () {
const MUMBLESTATS_DATETIME_FORMAT = 'YYYY-MM-DD, HH:mm';
'use strict';
$("#table-mumble-connection-history").DataTable({
ajax: {
url: '{% url "mumble:connection_history_data" %}',
dataSrc: 'connection_history_data',
},
columns: [
{ data: 'user' },
{ data: 'display_name' },
{ data: 'release' },
{ data: 'version' },
{
data: 'last_connect',
render: (data) => {
return moment(data).utc().format(MUMBLESTATS_DATETIME_FORMAT);
},
className: 'text-end',
},
{
data: 'last_disconnect',
render: (data) => {
return moment(data).utc().format(MUMBLESTATS_DATETIME_FORMAT);
},
className: 'text-end',
},
],
order: [[4, 'desc']],
processing: true,
stateSave: true,
stateDuration: 0,
filterDropDown: {
columns: [
{
idx: 2,
},
{
idx: 3,
},
],
bootstrap: true,
bootstrap_version: 5,
},
});
$("#table-mumble-connection-stats").DataTable({
ajax: {
url: '{% url "mumble:release_counts_data" %}',
dataSrc: 'release_counts_data',
},
columns: [
{ data: 'release' },
{ data: 'user_count', className: 'text-end' },
],
order: [[1, 'desc']],
processing: true,
stateSave: true,
stateDuration: 0,
});
// Initialize empty Pie chart
const elementBody = document.querySelector('body');
const elementBodyCss = getComputedStyle(elementBody);
const ctx = document.getElementById('pieChart').getContext('2d');
const pieChart = new Chart(ctx, {
type: 'pie',
data: {
labels: [], // Initially empty
datasets: [
{
label: 'Server Connection Breakdown',
data: [], // Initially empty
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)'
],
borderWidth: 1
}
]
},
options: {
responsive: true,
plugins: {
legend: {
position: 'top'
}
}
}
});
Chart.defaults.color = elementBodyCss.color;
// AJAX call to dynamically update the chart
$.ajax({
url: '{% url "mumble:release_pie_chart_data" %}', // Your Django view URL that returns chart data
method: "GET",
success: (data) => {
// Replace chart data with the data from the AJAX response
pieChart.data.labels = data.labels; // Set the new labels
pieChart.data.datasets[0].data = data.values; // Set the new values
// Update the chart to reflect the new data
pieChart.update();
},
error: (xhr, status, error) => {
console.error('Error fetching pie chart data:', status, error);
},
});
});
</script>
{% endblock extra_javascript %}
{% block extra_css %}
{% include "bundles/datatables-css-bs5.html" %}
{% endblock extra_css %}

View File

@@ -4,15 +4,17 @@
{% block title %}
{{ service_name }}
{% endblock %}
{% endblock title %}
{% block url %}
<a href="{{ service_url }}">{{ service_url }}</a>
{% endblock %}
{% if username != '' %}
<a href="mumble://{{ connect_url }}">{{ service_url }}</a>
{% endif %}
{% endblock url %}
{% block user %}
{% include "services/service_username.html" with username=username %}
{% endblock %}
{% endblock user %}
{% block controls %}
{% if username == "" %}
@@ -46,4 +48,9 @@
</a>
{% endif %}
{% endif %}
{% endblock %}
{% if request.user.is_superuser %}
<a class="btn btn-primary" type="button" id="btnMumbleConnectionHistory" href="{% url 'mumble:connection_history' %}" title="{% translate 'Mumble Connection History' %}">
<i class="fa-solid fa-clock-rotate-left"></i> History
</a>
{% endif %}
{% endblock controls %}

View File

@@ -0,0 +1,197 @@
{% extends "services/mumble/base.html" %}
{% load i18n %}
{% load humanize %}
{% block mumble %}
<div class="col-md-6 mb-2">
<div class="card h-100">
<div class="card-header bg-warning">
<div class="card-title mb-0">{% translate "Mumble Temporary Links" %}</div>
</div>
<div class="card-body text-center">
<p>
{% blocktranslate trimmed with bold_start="<b>" bold_end="</b>" %}
Temp Links Give Access to mumble with the {{ bold_start }}Guest{{ bold_end }} Group for the preset time
{% endblocktranslate %}
</p>
<p>
{% blocktranslate trimmed with bold_start="<b class='text-warning'>" bold_end="</b>" %}
Connected users {{ bold_start }}will not{{ bold_end }} be kicked at the end of this period.
{% endblocktranslate %}
</p>
<p>
{% blocktranslate trimmed with badge_start="<span class='badge bg-danger'>" badge_end="</span>" %}
Templink users can be kicked in mumble by typing {{ badge_start }}!kicktemps{{ badge_end }} in mumble chat.
{% endblocktranslate %}
</p>
<p>
{% blocktranslate trimmed with bold_start="<b class='text-warning'>" bold_end="</b>" %}
There are {{ bold_start }}no restrictions{{ bold_end }} on who or how many can use a templink, share wisely.
{% endblocktranslate %}
</p>
</div>
</div>
</div>
<div class="col-md-6 mt-sm-2 mt-md-0 mb-2">
<div class="card h-100">
<div class="card-header">
<div class="card-title mb-0">{% translate "Create New Link" %}</div>
</div>
<div class="card-body text-center">
<p>{% translate "Your link will be displayed on the next page for an easy copy and paste." %}</p>
<form action="{% url 'mumble:index' %}" method="post">
{% csrf_token %}
<div class="mb-3">
<label for="time">{% translate "Duration (hours)" %}</label>
<select class="form-select" name="time" id="time">
<option value="3">3</option>
<option value="6">6</option>
<option value="12">12</option>
<option value="24">24</option>
</select>
</div>
<input class="btn btn-primary" type="submit" value="{% translate 'OK' %}" />
</form>
</div>
</div>
</div>
{% if tl %}
<div class="my-2">
<div class="card">
<div class="card-header bg-success">
<div class="card-title mb-0">{% translate "New Link" %}</div>
</div>
<div class="card-body text-center" style="min-height: 100px;">
<p>
{% translate "Expires in" %}: <span id="countdown{{ tl.link_ref }}hot"></span>
</p>
<pre>{{ SITE_URL }}{% url 'mumble:join' tl.link_ref %}</pre>
<button class="btn btn-info" id="clipboard-new" data-clipboard-text="{{ SITE_URL }}{% url 'mumble:join' tl.link_ref %}">
{% translate "Copy to Clipboard!" %}
</button>
</div>
</div>
</div>
{% endif %}
<div class="my-2">
<div class="card pb-2">
<div class="card-header">
<div class="card-title mb-0">{% translate "Active Links" %}</div>
</div>
<div class="card-body" style="min-height: 100px;">
<table class="table table-striped">
<thead>
<tr>
<th></th>
<th class="text-center">{% translate "Creator" %}</th>
<th class="text-center">{% translate "Key" %}</th>
<th class="text-center">{% translate "Time Left" %}</th>
<th class="text-center">{% translate "Copy" %}</th>
<th class="text-center">{% translate "Nuke" %}</th>
</tr>
</thead>
<tbody>
{% for lnk in tl_list %}
<tr>
<td class="text-center">
<img class="ra-avatar img-circle" src="{{ lnk.creator.portrait_url_32 }}" alt="{{ lnk.creator.character_name }}" />
</td>
<td class="text-center">{{ lnk.creator.character_name }}</td>
<td class="text-center">{{ lnk.link_ref }}</td>
<td class="text-center" id="countdown{{ lnk.link_ref }}"></td>
<td class="text-center">
<button class="btn btn-info"
id="clipboard-{{ lnk.link_ref }}"
data-clipboard-text="{{ SITE_URL }}{% url 'mumble:join' lnk.link_ref %}">
{% translate "Copy to Clipboard!" %}
</button>
</td>
<td class="text-center">
<a class="btn btn-danger" href="{% url 'mumble:nuke' lnk.link_ref %}">{% translate "Nuke Link!" %}</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
{% if ex_tl_list.count > 0 %}
<div class="my-2">
<div class="card">
<div class="card-header">
<div class="card-title mb-0">{% translate "Expired Links" %}</div>
</div>
<div class="card-body" style="min-height: 100px;">
<table class="table table-striped">
<thead>
<tr>
<th></th>
<th class="text-center">{% translate "Creator" %}</th>
<th class="text-center">{% translate "Key" %}</th>
<th class="text-center">{% translate "Nuke" %}</th>
</tr>
</thead>
<tbody>
{% for lnk in ex_tl_list %}
<tr>
<td class="text-center">
<img class="ra-avatar img-circle" src="{{ lnk.creator.portrait_url_32 }}" alt="{{ lnk.creator.character_name }}" />
</td>
<td class="text-center">{{ lnk.creator.character_name }}</td>
<td class="text-center">{{ lnk.link_ref }}</td>
<td class="text-center">
<a class="btn btn-danger" href="{% url 'mumble:nuke' lnk.link_ref %}">{% translate "Nuke Link!" %}</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
{% endif %}
{% endblock mumble %}
{% block extra_javascript %}
{% include "bundles/clipboard-js.html" %}
<script>
/* global ClipboardJS */
const clipboard = new ClipboardJS('#clipboard-new');
{% for lnk in tl_list %}
const lnk{{ lnk.link_ref }} = new ClipboardJS('#clipboard-{{ lnk.link_ref }}');
{% endfor %}
</script>
{% endblock extra_javascript %}

View File

@@ -1,212 +0,0 @@
from unittest import mock
from django.test import TestCase, RequestFactory
from django import urls
from django.contrib.auth.models import User, Group, Permission
from django.core.exceptions import ObjectDoesNotExist
from allianceauth.tests.auth_utils import AuthUtils
from .auth_hooks import MumbleService
from .models import MumbleUser
from .tasks import MumbleTasks
MODULE_PATH = 'allianceauth.services.modules.mumble'
DEFAULT_AUTH_GROUP = 'Member'
def add_permissions():
permission = Permission.objects.get(codename='access_mumble')
members = Group.objects.get_or_create(name=DEFAULT_AUTH_GROUP)[0]
AuthUtils.add_permissions_to_groups([permission], [members])
class MumbleHooksTestCase(TestCase):
def setUp(self):
self.member = 'member_user'
member = AuthUtils.create_member(self.member)
AuthUtils.add_main_character(member, 'auth_member', '12345', corp_id='111', corp_name='Test Corporation', corp_ticker='TESTR')
member = User.objects.get(pk=member.pk)
MumbleUser.objects.create(user=member)
self.none_user = 'none_user'
none_user = AuthUtils.create_user(self.none_user)
self.service = MumbleService
add_permissions()
def test_has_account(self):
member = User.objects.get(username=self.member)
none_user = User.objects.get(username=self.none_user)
self.assertTrue(MumbleTasks.has_account(member))
self.assertFalse(MumbleTasks.has_account(none_user))
def test_service_enabled(self):
service = self.service()
member = User.objects.get(username=self.member)
none_user = User.objects.get(username=self.none_user)
self.assertTrue(service.service_active_for_user(member))
self.assertFalse(service.service_active_for_user(none_user))
@mock.patch(MODULE_PATH + '.tasks.User.mumble')
def test_update_all_groups(self, mumble):
service = self.service()
service.update_all_groups()
# Check member and blue user have groups updated
self.assertTrue(mumble.update_groups.called)
self.assertEqual(mumble.update_groups.call_count, 1)
def test_update_groups(self):
# Check member has Member group updated
service = self.service()
member = User.objects.get(username=self.member)
member.mumble.groups = '' # Remove the group set in setUp
member.mumble.save()
service.update_groups(member)
mumble_user = MumbleUser.objects.get(user=member)
self.assertIn(DEFAULT_AUTH_GROUP, mumble_user.groups)
# Check none user does not have groups updated
service = self.service()
none_user = User.objects.get(username=self.none_user)
result = service.update_groups(none_user)
self.assertFalse(result)
def test_validate_user(self):
service = self.service()
# Test member is not deleted
member = User.objects.get(username=self.member)
service.validate_user(member)
self.assertTrue(member.mumble)
# Test none user is deleted
none_user = User.objects.get(username=self.none_user)
MumbleUser.objects.create(user=none_user)
service.validate_user(none_user)
with self.assertRaises(ObjectDoesNotExist):
none_mumble = User.objects.get(username=self.none_user).mumble
def test_delete_user(self):
member = User.objects.get(username=self.member)
service = self.service()
result = service.delete_user(member)
self.assertTrue(result)
with self.assertRaises(ObjectDoesNotExist):
mumble_user = User.objects.get(username=self.member).mumble
def test_render_services_ctrl(self):
service = self.service()
member = User.objects.get(username=self.member)
request = RequestFactory().get('/services/')
request.user = member
response = service.render_services_ctrl(request)
self.assertTemplateUsed(service.service_ctrl_template)
self.assertIn(urls.reverse('mumble:deactivate'), response)
self.assertIn(urls.reverse('mumble:reset_password'), response)
self.assertIn(urls.reverse('mumble:set_password'), response)
# Test register becomes available
member.mumble.delete()
member = User.objects.get(username=self.member)
request.user = member
response = service.render_services_ctrl(request)
self.assertIn(urls.reverse('mumble:activate'), response)
class MumbleViewsTestCase(TestCase):
def setUp(self):
self.member = AuthUtils.create_member('auth_member')
self.member.email = 'auth_member@example.com'
self.member.save()
AuthUtils.add_main_character(self.member, 'auth_member', '12345', corp_id='111', corp_name='Test Corporation', corp_ticker='TESTR')
self.member = User.objects.get(pk=self.member.pk)
add_permissions()
def login(self):
self.client.force_login(self.member)
def test_activate_update(self):
self.login()
expected_username = 'auth_member'
expected_displayname = '[TESTR]auth_member'
response = self.client.get(urls.reverse('mumble:activate'), follow=False)
self.assertEqual(response.status_code, 200)
self.assertContains(response, expected_username)
# create
mumble_user = MumbleUser.objects.get(user=self.member)
self.assertEqual(mumble_user.username, expected_username)
self.assertTrue(MumbleUser.objects.user_exists(expected_username))
self.assertEqual(str(mumble_user), expected_username)
self.assertEqual(mumble_user.display_name, expected_displayname)
self.assertTrue(mumble_user.pwhash)
self.assertIn('Guest', mumble_user.groups)
self.assertIn('Member', mumble_user.groups)
self.assertIn(',', mumble_user.groups)
# test update
self.member.profile.main_character.character_name = "auth_member_updated"
self.member.profile.main_character.corporation_ticker = "TESTU"
self.member.profile.main_character.save()
mumble_user.update_display_name()
mumble_user = MumbleUser.objects.get(user=self.member)
expected_displayname = '[TESTU]auth_member_updated'
self.assertEqual(mumble_user.username, expected_username)
self.assertTrue(MumbleUser.objects.user_exists(expected_username))
self.assertEqual(str(mumble_user), expected_username)
self.assertEqual(mumble_user.display_name, expected_displayname)
self.assertTrue(mumble_user.pwhash)
self.assertIn('Guest', mumble_user.groups)
self.assertIn('Member', mumble_user.groups)
self.assertIn(',', mumble_user.groups)
def test_deactivate_post(self):
self.login()
MumbleUser.objects.create(user=self.member)
response = self.client.post(urls.reverse('mumble:deactivate'))
self.assertRedirects(response, expected_url=urls.reverse('services:services'), target_status_code=200)
with self.assertRaises(ObjectDoesNotExist):
mumble_user = User.objects.get(pk=self.member.pk).mumble
def test_set_password(self):
self.login()
created = MumbleUser.objects.create(user=self.member)
old_pwd = created.credentials.get('password')
response = self.client.post(urls.reverse('mumble:set_password'), data={'password': '1234asdf'})
self.assertNotEqual(MumbleUser.objects.get(user=self.member).pwhash, old_pwd)
self.assertRedirects(response, expected_url=urls.reverse('services:services'), target_status_code=200)
def test_reset_password(self):
self.login()
created = MumbleUser.objects.create(user=self.member)
old_pwd = created.credentials.get('password')
response = self.client.get(urls.reverse('mumble:reset_password'))
self.assertNotEqual(MumbleUser.objects.get(user=self.member).pwhash, old_pwd)
self.assertTemplateUsed(response, 'services/service_credentials.html')
self.assertContains(response, 'auth_member')
class MumbleManagerTestCase(TestCase):
def setUp(self):
from .models import MumbleManager
self.manager = MumbleManager
def test_generate_random_password(self):
password = self.manager.generate_random_pass()
self.assertEqual(len(password), 16)
self.assertIsInstance(password, str)
def test_gen_pwhash(self):
pwhash = self.manager.gen_pwhash('test')
self.assertEqual(pwhash[:15], '$bcrypt-sha256$')
self.assertEqual(len(pwhash), 83)

View File

@@ -0,0 +1,88 @@
from allianceauth.services.modules.mumble.auth_hooks import MumbleService
from allianceauth.services.modules.mumble.models import MumbleUser
from allianceauth.services.modules.mumble.tasks import MumbleTasks
from django.test import TestCase, RequestFactory
from django import urls
from django.contrib.auth.models import User, Group, Permission
from django.core.exceptions import ObjectDoesNotExist
from allianceauth.tests.auth_utils import AuthUtils
MODULE_PATH = 'allianceauth.services.modules.mumble'
DEFAULT_AUTH_GROUP = 'Member'
def add_permissions():
permission = Permission.objects.get(codename='access_mumble')
members = Group.objects.get_or_create(name=DEFAULT_AUTH_GROUP)[0]
AuthUtils.add_permissions_to_groups([permission], [members])
class MumbleHooksTestCase(TestCase):
def setUp(self):
self.member = 'member_user'
member = AuthUtils.create_member(self.member)
AuthUtils.add_main_character(member, 'auth_member', '12345', corp_id='111', corp_name='Test Corporation', corp_ticker='TESTR')
member = User.objects.get(pk=member.pk)
MumbleUser.objects.create(user=member)
self.none_user = 'none_user'
none_user = AuthUtils.create_user(self.none_user)
self.service = MumbleService
add_permissions()
def test_has_account(self):
member = User.objects.get(username=self.member)
none_user = User.objects.get(username=self.none_user)
self.assertTrue(MumbleTasks.has_account(member))
self.assertFalse(MumbleTasks.has_account(none_user))
def test_service_enabled(self):
service = self.service()
member = User.objects.get(username=self.member)
none_user = User.objects.get(username=self.none_user)
self.assertTrue(service.service_active_for_user(member))
self.assertFalse(service.service_active_for_user(none_user))
def test_validate_user(self):
service = self.service()
# Test member is not deleted
member = User.objects.get(username=self.member)
service.validate_user(member)
self.assertTrue(member.mumble)
# Test none user is deleted
none_user = User.objects.get(username=self.none_user)
MumbleUser.objects.create(user=none_user)
service.validate_user(none_user)
with self.assertRaises(ObjectDoesNotExist):
none_mumble = User.objects.get(username=self.none_user).mumble
def test_delete_user(self):
member = User.objects.get(username=self.member)
service = self.service()
result = service.delete_user(member)
self.assertTrue(result)
with self.assertRaises(ObjectDoesNotExist):
mumble_user = User.objects.get(username=self.member).mumble
def test_render_services_ctrl(self):
service = self.service()
member = User.objects.get(username=self.member)
request = RequestFactory().get('/services/')
request.user = member
response = service.render_services_ctrl(request)
self.assertTemplateUsed(service.service_ctrl_template)
self.assertIn(urls.reverse('mumble:deactivate'), response)
self.assertIn(urls.reverse('mumble:reset_password'), response)
self.assertIn(urls.reverse('mumble:set_password'), response)
# Test register becomes available
member.mumble.delete()
member = User.objects.get(username=self.member)
request.user = member
response = service.render_services_ctrl(request)
self.assertIn(urls.reverse('mumble:activate'), response)

View File

@@ -0,0 +1,117 @@
import unittest
from allianceauth.authentication.admin import Permission
from allianceauth.tests.auth_utils import AuthUtils
from django.test import TestCase
from django.utils import timezone
from django.contrib.auth.models import User, Group
from unittest.mock import patch
from datetime import timedelta
from ..models import (
MumbleUser,
TempLink,
TempUser,
IdlerHandler,
MumbleServerServer
)
MODULE_PATH = 'allianceauth.services.modules.mumble'
DEFAULT_AUTH_GROUP = 'Member'
def add_permissions():
permission = Permission.objects.get(codename='access_mumble')
members = Group.objects.get_or_create(name=DEFAULT_AUTH_GROUP)[0]
AuthUtils.add_permissions_to_groups([permission], [members])
class MumbleUserTests(TestCase):
def setUp(self):
self.member = AuthUtils.create_member('auth_member')
self.member.email = 'auth_member@example.com'
self.member.save()
AuthUtils.add_main_character(self.member, 'john_mumble', '12345', corp_id='111', corp_name='Test Corporation', corp_ticker='TESTR')
self.member = User.objects.get(pk=self.member.pk)
add_permissions()
self.mumble_user = MumbleUser.objects.create(user=self.member)
def test_mumble_user_str(self):
"""
Test that __str__ returns the username.
"""
self.assertEqual(str(self.mumble_user), 'john_mumble')
def test_update_password_no_arg(self):
"""
Test update_password when no password is provided
(it should generate a random one).
"""
old_pwhash = self.mumble_user.pwhash
self.mumble_user.update_password() # No password argument
# pwhash should have changed (random pass)
self.assertNotEqual(old_pwhash, self.mumble_user.pwhash)
self.assertTrue(self.mumble_user.credentials) # Should have 'username' & 'password'
def test_reset_password(self):
"""
reset_password is basically an alias to update_password with no password argument.
"""
old_pwhash = self.mumble_user.pwhash
self.mumble_user.reset_password()
self.assertNotEqual(old_pwhash, self.mumble_user.pwhash)
self.assertTrue(self.mumble_user.credentials)
class IdlerHandlerTests(TestCase):
def setUp(self):
self.idler = IdlerHandler.objects.create(
name="MyAFKIdler",
enabled=True,
seconds=7200,
interval=120,
channel=999,
denylist=False,
list="some_list"
)
def test_idler_handler_str(self):
self.assertEqual(str(self.idler), "MyAFKIdler")
class MumbleServerServerTests(TestCase):
def setUp(self):
self.idler = IdlerHandler.objects.create(
name="MyAFKIdler",
enabled=True,
seconds=3600,
interval=60,
channel=999,
denylist=True,
list=""
)
self.server = MumbleServerServer.objects.create(
name="MyMumbleServer",
ip="127.0.0.1",
endpoint="127.0.0.1",
port=6502,
secret="supersecret",
watchdog=30,
slice="MumbleServer.ice",
virtual_servers="1,2",
avatar_enable=True,
reject_on_error=True,
offset=1000000000,
idler_handler=self.idler
)
def test_mumble_server_str(self):
"""
Test string representation of MumbleServerServer.
"""
self.assertEqual(str(self.server), "MyMumbleServer")
def test_virtual_servers_list(self):
"""
The virtual_servers_list should parse '1,2' into [1, 2].
"""
self.assertEqual(self.server.virtual_servers_list(), [1, 2])

View File

@@ -0,0 +1,93 @@
from unittest import mock
from allianceauth.services.modules.mumble.auth_hooks import MumbleService
from allianceauth.services.modules.mumble.models import MumbleUser
from allianceauth.services.modules.mumble.tasks import MumbleTasks
from django.test import TestCase, RequestFactory
from django import urls
from django.contrib.auth.models import User, Group, Permission
from django.core.exceptions import ObjectDoesNotExist
from allianceauth.tests.auth_utils import AuthUtils
MODULE_PATH = 'allianceauth.services.modules.mumble'
DEFAULT_AUTH_GROUP = 'Member'
def add_permissions():
permission = Permission.objects.get(codename='access_mumble')
members = Group.objects.get_or_create(name=DEFAULT_AUTH_GROUP)[0]
AuthUtils.add_permissions_to_groups([permission], [members])
class MumbleViewsTestCase(TestCase):
def setUp(self):
self.member = AuthUtils.create_member('auth_member')
self.member.email = 'auth_member@example.com'
self.member.save()
AuthUtils.add_main_character(self.member, 'auth_member', '12345', corp_id='111', corp_name='Test Corporation', corp_ticker='TESTR')
self.member = User.objects.get(pk=self.member.pk)
add_permissions()
def login(self):
self.client.force_login(self.member)
def test_activate_update(self):
self.login()
expected_username = 'auth_member'
expected_displayname = '[TESTR]auth_member'
response = self.client.get(urls.reverse('mumble:activate'), follow=False)
self.assertEqual(response.status_code, 200)
self.assertContains(response, expected_username)
# create
mumble_user = MumbleUser.objects.get(user=self.member)
self.assertEqual(mumble_user.username, expected_username)
self.assertEqual(str(mumble_user), expected_username)
self.assertEqual(mumble_user.display_name, expected_displayname)
self.assertTrue(mumble_user.pwhash)
self.assertIn('Guest', mumble_user.groups)
self.assertIn('Member', mumble_user.groups)
self.assertIn(',', mumble_user.groups)
# test update
self.member.profile.main_character.character_name = "auth_member_updated"
self.member.profile.main_character.corporation_ticker = "TESTU"
self.member.profile.main_character.save()
mumble_user = MumbleUser.objects.get(user=self.member)
expected_displayname = '[TESTU]auth_member_updated'
self.assertEqual(mumble_user.username, expected_username)
self.assertEqual(str(mumble_user), expected_username)
self.assertEqual(mumble_user.display_name, expected_displayname)
self.assertTrue(mumble_user.pwhash)
self.assertIn('Guest', mumble_user.groups)
self.assertIn('Member', mumble_user.groups)
self.assertIn(',', mumble_user.groups)
def test_deactivate_post(self):
self.login()
MumbleUser.objects.create(user=self.member)
response = self.client.post(urls.reverse('mumble:deactivate'))
self.assertRedirects(response, expected_url=urls.reverse('services:services'), target_status_code=200)
with self.assertRaises(ObjectDoesNotExist):
mumble_user = User.objects.get(pk=self.member.pk).mumble
def test_set_password(self):
self.login()
created = MumbleUser.objects.create(user=self.member)
old_pwd = created.credentials.get('password')
response = self.client.post(urls.reverse('mumble:set_password'), data={'password': '1234asdf'})
self.assertNotEqual(MumbleUser.objects.get(user=self.member).pwhash, old_pwd)
self.assertRedirects(response, expected_url=urls.reverse('services:services'), target_status_code=200)
def test_reset_password(self):
self.login()
created = MumbleUser.objects.create(user=self.member)
old_pwd = created.credentials.get('password')
response = self.client.get(urls.reverse('mumble:reset_password'))
self.assertNotEqual(MumbleUser.objects.get(user=self.member).pwhash, old_pwd)
self.assertTemplateUsed(response, 'services/service_credentials.html')
self.assertContains(response, 'auth_member')

View File

@@ -1,4 +1,4 @@
from django.urls import include, path
from django.urls import include, path, re_path
from . import views
@@ -10,6 +10,14 @@ module_urls = [
path('deactivate/', views.DeleteMumbleView.as_view(), name='deactivate'),
path('reset_password/', views.ResetPasswordMumbleView.as_view(), name='reset_password'),
path('set_password/', views.SetPasswordMumbleView.as_view(), name='set_password'),
path('connection_history/', views.connection_history, name="connection_history"),
path('ajax/connection_history_data', views.connection_history_data, name="connection_history_data"),
path('ajax/release_counts_data', views.release_counts_data, name="release_counts_data"),
path('ajax/release_pie_chart_data', views.release_pie_chart_data, name="release_pie_chart_data"),
# Temp Links
path("templinks/", views.templinks, name="templinks"),
re_path(r"^join/(?P<link_ref>[\w\-]+)/$", views.link, name="join"),
re_path(r"^nuke/(?P<link_ref>[\w\-]+)/$", views.nuke, name="nuke"),
]
urlpatterns = [

View File

@@ -1,10 +1,23 @@
from datetime import datetime, timedelta, timezone
import logging
from allianceauth.authentication.models import get_guest_state
from allianceauth.eveonline.models import EveCharacter
from allianceauth.services.forms import ServicePasswordModelForm
from allianceauth.services.abstract import BaseCreatePasswordServiceAccountView, BaseDeactivateServiceAccountView, \
BaseResetPasswordServiceAccountView, BaseSetPasswordServiceAccountView
from allianceauth.services.modules.mumble import app_settings
from django.conf import settings
from django.contrib import messages
from django.contrib.auth.decorators import login_required, permission_required
from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist
from django.db.models import Count
from django.http import Http404, HttpResponse, JsonResponse
from django.shortcuts import redirect, render
from django.utils.crypto import get_random_string
from esi.views import sso_redirect
from .models import MumbleUser
from .models import MumbleUser, TempLink, TempUser
logger = logging.getLogger(__name__)
@@ -35,3 +48,220 @@ class ResetPasswordMumbleView(MumbleViewMixin, BaseResetPasswordServiceAccountVi
class SetPasswordMumbleView(MumbleViewMixin, BaseSetPasswordServiceAccountView):
form_class = MumblePasswordForm
@login_required
@permission_required('mumble.view_connection_history')
def connection_history(request) -> HttpResponse:
context = {
"mumble_url": settings.MUMBLE_URL,
}
return render(request, 'services/mumble/mumble_connection_history.html', context)
@login_required
@permission_required("mumble.view_connection_history")
def connection_history_data(request) -> JsonResponse:
users = MumbleUser.objects.all()
connection_history_data = []
for user in users:
connection_history_data.append({
'user': str(user),
'display_name': user.display_name,
'release': user.release,
'version': user.version,
'last_connect': user.last_connect,
'last_disconnect': user.last_disconnect,
})
return JsonResponse({"connection_history_data": list(connection_history_data)})
@login_required
@permission_required("mumble.view_connection_history")
def release_counts_data(request) -> JsonResponse:
release_counts_data = MumbleUser.objects.values('release').annotate(user_count=Count('user_id')).order_by('release')
return JsonResponse({
"release_counts_data": list(release_counts_data),
})
@login_required
@permission_required("mumble.view_connection_history")
def release_pie_chart_data(request) -> JsonResponse:
release_counts = MumbleUser.objects.values('release').annotate(user_count=Count('user_id')).order_by('release')
return JsonResponse({
"labels": list(release_counts.values_list("release", flat=True)),
"values": list(release_counts.values_list("user_count", flat=True)),
})
class PseudoProfile:
def __init__(self, main):
self.main_character = main
self.state = get_guest_state()
class PseudoUser:
def __init__(self, main, username):
self.username = username
self.profile = PseudoProfile(main)
@login_required
@permission_required("mumble.create_new_links")
def templinks(request) -> HttpResponse:
tl = None
if request.method == "POST":
duration = request.POST.get("time")
if duration in ["3", "6", "12", "24"]:
tl = TempLink.objects.create(
creator=request.user.profile.main_character,
link_ref=get_random_string(15),
expires=datetime.now(timezone.utc) + timedelta(hours=int(duration))
)
tl.save()
tl_list = TempLink.objects.prefetch_related("creator").filter(expires__gte=datetime.now(timezone.utc))
ex_tl_list = TempLink.objects.prefetch_related("creator").filter(expires__lt=datetime.now(timezone.utc))
context = {
"tl": tl,
"text": "Make Links",
"tl_list": tl_list,
"ex_tl_list": ex_tl_list,
}
return render(
request=request, template_name="services/mumble/index.html", context=context
)
def link(request, link_ref):
try:
templink = TempLink.objects.get(link_ref=link_ref)
except ObjectDoesNotExist:
raise Http404("Temp Link Does not Exist")
token = _check_callback(request=request)
if token:
return link_sso(request=request, token=token, link=templink)
if app_settings.MUMBLE_TEMPS_FORCE_SSO: # default always SSO
# prompt the user to log in for a new token
return sso_redirect(request=request, scopes=["publicData"])
if request.method == "POST": # ok so maybe we want to let some other people in too.
if request.POST.get("sso", False) == "False": # they picked user
name = request.POST.get("name", False)
association = request.POST.get("association", False)
return link_username(
request=request, name=name, association=association, link=templink
)
elif request.POST.get("sso", False) == "True": # they picked SSO
# prompt the user to log in for a new token
return sso_redirect(request=request, scopes=["publicData"])
context = {"link": templink}
return render(
request=request, template_name="services/mumble/login.html", context=context
)
def link_username(request, name, association, link):
username = get_random_string(length=10)
while TempUser.objects.filter(username=username).exists(): # force unique
username = get_random_string(length=10)
password = get_random_string(length=15)
display_name = "{}[{}] {}".format(
app_settings.MUMBLE_TEMPS_LOGIN_PREFIX, association, name
)
temp_user = TempUser.objects.create(
username=username,
password=password,
name=display_name,
expires=link.expires,
templink=link,
)
connect_url = f"{username}:{password}@{settings.MUMBLE_URL}"
context = {
"temp_user": temp_user,
"link": link,
"connect_url": connect_url,
"mumble": settings.MUMBLE_URL,
}
return render(
request=request, template_name="services/mumble/link.html", context=context
)
def link_sso(request, token, link):
try:
char = EveCharacter.objects.get(character_id=token.character_id)
except ObjectDoesNotExist:
try: # create a new character, we should not get here.
char = EveCharacter.objects.update_character(
character_id=token.character_id
)
except: # noqa: E722
pass # Yeah… ain't gonna happen
except MultipleObjectsReturned:
pass # authenticator won't care…, but the DB will be unhappy.
username = get_random_string(length=10)
while TempUser.objects.filter(username=username).exists(): # force unique
username = get_random_string(length=10)
password = get_random_string(length=15)
temp_user = TempUser.objects.create(
username=username,
password=password,
expires=link.expires,
templink=link,
character_id=char.character_id,
)
connect_url = f"{username}:{password}@{settings.MUMBLE_URL}"
context = {
"temp_user": temp_user,
"link": link,
"connect_url": connect_url,
"mumble": settings.MUMBLE_URL,
}
return render(
request=request, template_name="services/mumble/link.html", context=context
)
@login_required
@permission_required("mumble.create_new_links")
def nuke(request, link_ref):
try:
TempLink.objects.get(link_ref=link_ref).delete()
TempUser.objects.filter(templink__isnull=True).delete()
messages.success(request=request, message=f"Deleted Token {link_ref}")
except: # noqa: E722
messages.error(request=request, message=f"Deleted Token {link_ref}")
pass # Crappy link
return redirect(to="mumble:index")

View File

@@ -13,9 +13,9 @@
{% for notif in notifications %}
<li class="list-group-item">
{% if notif.state == 'opened' %}
<span class="badge bg-success">{% translate "Open" %}</span>
<span class="badge bg-success me-2">{% translate "Open" %}</span>
{% else %}
<span class="badge bg-danger">{% translate "Closed" %}</span>
<span class="badge bg-danger me-2">{% translate "Closed" %}</span>
{% endif %}
<a href="{{ notif.web_url }}" target="_blank">#{{ notif.iid }} {{ notif.title }}</a>
</li>

View File

@@ -35,6 +35,8 @@
</style>
{% block extra_css %}{% endblock extra_css %}
{% include 'custom_css/bundles/custom-css.html' %}
</head>
<body>

View File

@@ -10,11 +10,6 @@
<i class="fa-solid fa-gauge-high fa-fw"></i> {% translate "Dashboard" %}
</a>
</li>
<li>
<a class="{% navactive request 'groupmanagement:groups' %}" href="{% url 'groupmanagement:groups' %}">
<i class="fa-solid fa-users fa-fw"></i> {% translate "Groups" %}
</a>
</li>
{% menu_items %}
</ul>

View File

@@ -0,0 +1,3 @@
<!-- Start Chart.js js from cdnjs -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.min.js" integrity="sha512-CQBWl4fJHWbryGE+Pc7UAxWMUMNMWzWxF4SQo9CgkJIN1kx6djDQZjh3Y8SZ1d+6I+1zze6Z7kHXO7q3UyZAWw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<!-- End Chart.js js from cdnjs -->

View File

@@ -27,6 +27,7 @@ class BootstrapThemeHook(ThemeHook):
self,
"Bootstrap",
"Powerful, extensible, and feature-packed frontend toolkit.",
html_tags={"data-theme": "bootstrap"},
css=CSS_STATICS,
js=JS_STATICS,
header_padding="3.5em"
@@ -44,9 +45,9 @@ class BootstrapDarkThemeHook(ThemeHook):
self,
"Bootstrap Dark",
"Powerful, extensible, and feature-packed frontend toolkit.",
html_tags={"data-theme": "bootstrap-dark", "data-bs-theme":"dark"},
css=CSS_STATICS,
js=JS_STATICS,
html_tags="data-bs-theme=dark",
header_padding="3.5em"
)

View File

@@ -13,6 +13,7 @@ class DarklyThemeHook(ThemeHook):
self,
"Darkly",
"Flatly in night mode!",
html_tags={"data-theme": "darkly"},
css=[{
"url": "https://cdnjs.cloudflare.com/ajax/libs/bootswatch/5.3.3/darkly/bootstrap.min.css",
"integrity": "sha512-HDszXqSUU0om4Yj5dZOUNmtwXGWDa5ppESlX98yzbBS+z+3HQ8a/7kcdI1dv+jKq+1V5b01eYurE7+yFjw6Rdg=="

View File

@@ -13,6 +13,7 @@ class FlatlyThemeHook(ThemeHook):
self,
"Flatly",
"Flat and modern!",
html_tags={"data-theme": "flatly"},
css=[{
"url": "https://cdnjs.cloudflare.com/ajax/libs/bootswatch/5.3.3/flatly/bootstrap.min.css",
"integrity": "sha512-qoT4KwnRpAQ9uczPsw7GunsNmhRnYwSlE2KRCUPRQHSkDuLulCtDXuC2P/P6oqr3M5hoGagUG9pgHDPkD2zCDA=="

View File

@@ -1,21 +1,23 @@
from typing import List, Optional
from typing import List, Optional, Union
class ThemeHook:
"""
Theme hook for injecting a Bootstrap 5 Theme and associated JS into alliance auth.
these can be local or CDN delivered
Theme hook for injecting a Bootstrap 5 Theme and associated JS into alliance auth.
These can be local or CDN delivered.
"""
def __init__(self,
name: str,
description: str,
css: List[dict],
js: List[dict],
css_template: Optional[str] = None,
js_template: Optional[str] = None,
html_tags: Optional[str] = "",
header_padding: Optional[str] = "4em"):
name: str,
description: str,
css: List[dict],
js: List[dict],
css_template: Optional[str] = None,
js_template: Optional[str] = None,
js_type: Optional[str] = None,
html_tags: Optional[Union[dict, str]] = None,
header_padding: Optional[str] = "4em"
):
"""
:param name: Theme python name
:type name: str
@@ -29,7 +31,14 @@ class ThemeHook:
:type css_template: Optional[str], optional
:param js_template: _description_, defaults to None
:type js_template: Optional[str], optional
:param js_type: The type of the JS (e.g.: 'module'), defaults to None
:type js_type: Optional[str], optional
:param html_tags: Attributes added to the `<html>` tag, defaults to None
:type html_tags: Optional[dict|str], optional
:param header_padding: Top padding, defaults to "4em"
:type header_padding: Optional[str], optional
"""
self.name = name
self.description = description
@@ -41,7 +50,15 @@ class ThemeHook:
self.css_template = css_template
self.js_template = js_template
self.html_tags = html_tags
# Define the JS type (e.g.: 'module')
self.js_type = js_type
self.html_tags = (
" ".join([f"{key}={value}" for key, value in html_tags.items()])
if isinstance(html_tags, dict)
else html_tags
)
self.header_padding = header_padding
def get_name(self):
return f"{self.__class__.__module__}.{self.__class__.__name__}"

View File

@@ -13,6 +13,7 @@ class MateriaThemeHook(ThemeHook):
self,
"Materia",
"Material is the metaphor",
html_tags={"data-theme": "materia"},
css=[{
"url": "https://cdnjs.cloudflare.com/ajax/libs/bootswatch/5.3.3/materia/bootstrap.min.css",
"integrity": "sha512-2S9Do+uTmZmmJpdmAcOKdUrK/YslcvAuRfIF2ws8+BW9AvZXMRZM+o8Wq+PZrfISD6ZlIaeCWWZAdeprXIoYuQ=="

View File

@@ -4,7 +4,13 @@
{% include theme.js_template %}
{% else %}
{% for x in theme.js %}
<script src="{{ x.url }}" integrity="{{ x.integrity }}" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script
{% if x.js_type %}type="{{ x.js_type }}"{% endif %}
src="{{ x.url }}"
integrity="{{ x.integrity }}"
crossorigin="anonymous"
referrerpolicy="no-referrer"
></script>
{% endfor %}
{% endif %}
<!-- allianceauth.theme.{{ theme.name }} JS Ends-->

View File

@@ -1,11 +1,12 @@
import logging
import datetime
import logging
from django import forms
from django.utils import timezone
from django.core.validators import MaxValueValidator, MinValueValidator
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from .models import Timer, TimerType
from .models import Timer
logger = logging.getLogger(__name__)
@@ -32,54 +33,28 @@ class TimerForm(forms.ModelForm):
kwargs.update({'initial': initial})
super().__init__(*args, **kwargs)
structure_choices = [('POCO', 'POCO'),
('I-HUB', 'I-HUB'),
('TCU', 'TCU'),
('POS[S]', 'POS[S]'),
('POS[M]', 'POS[M]'),
('POS[L]', 'POS[L]'),
('Astrahus', 'Astrahus'),
('Fortizar', 'Fortizar'),
('Keepstar', 'Keepstar'),
('Raitaru', 'Raitaru'),
('Azbel', 'Azbel'),
('Sotiyo', 'Sotiyo'),
('Athanor', 'Athanor'),
('Tatara', 'Tatara'),
('Pharolux Cyno Beacon', 'Pharolux Cyno Beacon'),
('Tenebrex Cyno Jammer', 'Tenebrex Cyno Jammer'),
('Ansiblex Jump Gate', 'Ansiblex Jump Gate'),
('Moon Mining Cycle', 'Moon Mining Cycle'),
(_('Other'), _('Other'))]
objective_choices = [('Friendly', _('Friendly')),
('Hostile', _('Hostile')),
('Neutral', _('Neutral'))]
details = forms.CharField(max_length=254, required=True, label=_('Details'))
system = forms.CharField(max_length=254, required=True, label=_("System"))
planet_moon = forms.CharField(max_length=254, label=_("Planet/Moon"), required=False, initial="")
structure = forms.ChoiceField(choices=structure_choices, required=True, label=_("Structure Type"))
timer_type = forms.ChoiceField(choices=TimerType.choices, label=_("Timer Type"))
objective = forms.ChoiceField(choices=objective_choices, required=True, label=_("Objective"))
structure = forms.ChoiceField(choices=Timer.Structure.choices, required=True, label=_("Structure Type"))
timer_type = forms.ChoiceField(choices=Timer.TimerType.choices, label=_("Timer Type"))
objective = forms.ChoiceField(choices=Timer.Objective.choices, required=True, label=_("Objective"))
absolute_checkbox = forms.BooleanField(label=_("Absolute Timer"), required=False, initial=False)
absolute_time = forms.CharField(required=False,label=_("Date and Time"))
days_left = forms.IntegerField(required=False, label=_("Days Remaining"), validators=[MinValueValidator(0)])
hours_left = forms.IntegerField(required=False, label=_("Hours Remaining"),
validators=[MinValueValidator(0), MaxValueValidator(23)])
minutes_left = forms.IntegerField(required=False, label=_("Minutes Remaining"),
validators=[MinValueValidator(0), MaxValueValidator(59)])
minutes_left = forms.IntegerField(required=False, label=_("Minutes Remaining"), validators=[MinValueValidator(0), MaxValueValidator(59)])
important = forms.BooleanField(label=_("Important"), required=False)
corp_timer = forms.BooleanField(label=_("Corp-Restricted"), required=False)
def save(self, commit=True):
timer = super().save(commit=False)
# Get character
character = self.user.profile.main_character
corporation = character.corporation
logger.debug("Determined timer save request on behalf "
"of character {} corporation {}".format(character, corporation))
logger.debug(f"Determined timer save request on behalf of character {character} corporation {corporation}")
days_left = self.cleaned_data['days_left']
hours_left = self.cleaned_data['hours_left']

View File

@@ -0,0 +1,28 @@
# Generated by Django 4.2 on 2024-09-09 03:45
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('timerboard', '0005_alter_timer_planet_moon'),
]
operations = [
migrations.AlterField(
model_name='timer',
name='objective',
field=models.CharField(choices=[('Friendly', 'Friendly'), ('Hostile', 'Hostile'), ('Neutral', 'Neutral')], default='Neutral', max_length=254),
),
migrations.AlterField(
model_name='timer',
name='structure',
field=models.CharField(choices=[('POCO', 'POCO'), ('Orbital Skyhook', 'Orbital Skyhook'), ('I-HUB', 'I-HUB'), ('TCU', 'TCU'), ('POS[S]', 'POS [S]'), ('POS[M]', 'POS [M]'), ('POS[L]', 'POS [L]'), ('Astrahus', 'Astrahus'), ('Fortizar', 'Fortizar'), ('Keepstar', 'Keepstar'), ('Raitaru', 'Raitaru'), ('Azbel', 'Azbel'), ('Sotiyo', 'Sotiyo'), ('Athanor', 'Athanor'), ('Tatara', 'Tatara'), ('Pharolux Cyno Beacon', 'Pharolux Cyno Beacon'), ('Tenebrex Cyno Jammer', 'Tenebrex Cyno Jammer'), ('Ansiblex Jump Gate', 'Ansiblex Jump Gate'), ('Moon Mining Cycle', 'Moon Mining Cycle'), ('Metenox Moon Drill', 'Metenox Moon Drill'), ('Other', 'Other')], default='Other', max_length=254),
),
migrations.AlterField(
model_name='timer',
name='timer_type',
field=models.CharField(choices=[('UNSPECIFIED', 'Not Specified'), ('SHIELD', 'Shield'), ('ARMOR', 'Armor'), ('HULL', 'Hull'), ('FINAL', 'Final'), ('ANCHORING', 'Anchoring'), ('UNANCHORING', 'Unanchoring'), ('ABANDONED', 'Abandoned')], default='UNSPECIFIED', max_length=254),
),
]

View File

@@ -6,34 +6,63 @@ from allianceauth.eveonline.models import EveCharacter
from allianceauth.eveonline.models import EveCorporationInfo
class TimerType(models.TextChoices):
"""
Choices for Timer Type
"""
UNSPECIFIED = "UNSPECIFIED", _("Not Specified")
SHIELD = "SHIELD", _("Shield")
ARMOR = "ARMOR", _("Armor")
HULL = "HULL", _("Hull")
FINAL = "FINAL", _("Final")
ANCHORING = "ANCHORING", _("Anchoring")
UNANCHORING = "UNANCHORING", _("Unanchoring")
class Timer(models.Model):
class Meta:
ordering = ['eve_time']
class Objective(models.TextChoices):
"""
Choices for Objective Type
"""
FRIENDLY = "Friendly", _("Friendly")
HOSTILE = "Hostile", _("Hostile")
NEUTRAL = "Neutral", _("Neutral")
class Structure(models.TextChoices):
"""
Choices for Structure Type
"""
POCO = "POCO", _("POCO")
ORBITALSKYHOOK = "Orbital Skyhook", _("Orbital Skyhook")
IHUB = "I-HUB", _("I-HUB")
TCU = "TCU", _("TCU") # Pending Remval
POSS = "POS[S]", _("POS [S]")
POSM = "POS[M]", _("POS [M]")
POSL = "POS[L]", _("POS [L]")
ASTRAHUS = "Astrahus", _("Astrahus")
FORTIZAR = "Fortizar", _("Fortizar")
KEEPSTAR = "Keepstar", _("Keepstar")
RAITARU = "Raitaru", _("Raitaru")
AZBEL = "Azbel", _("Azbel")
SOTIYO = "Sotiyo", _("Sotiyo")
ATHANOR = "Athanor", _("Athanor")
TATARA = "Tatara", _("Tatara")
PHAROLUX = "Pharolux Cyno Beacon", _("Pharolux Cyno Beacon")
TENEBREX = "Tenebrex Cyno Jammer", _("Tenebrex Cyno Jammer")
ANSIBLEX = "Ansiblex Jump Gate", _("Ansiblex Jump Gate")
MOONPOP = "Moon Mining Cycle", _("Moon Mining Cycle")
METENOX = "Metenox Moon Drill", _("Metenox Moon Drill")
OTHER = "Other", _("Other")
class TimerType(models.TextChoices):
"""
Choices for Timer Type
"""
UNSPECIFIED = "UNSPECIFIED", _("Not Specified")
SHIELD = "SHIELD", _("Shield")
ARMOR = "ARMOR", _("Armor")
HULL = "HULL", _("Hull")
FINAL = "FINAL", _("Final")
ANCHORING = "ANCHORING", _("Anchoring")
UNANCHORING = "UNANCHORING", _("Unanchoring")
ABANDONED = "ABANDONED", _("Abandoned")
details = models.CharField(max_length=254, default="")
system = models.CharField(max_length=254, default="")
planet_moon = models.CharField(max_length=254, blank=True, default="")
structure = models.CharField(max_length=254, default="")
timer_type = models.CharField(
max_length=254,
choices=TimerType.choices,
default=TimerType.UNSPECIFIED,
)
objective = models.CharField(max_length=254, default="")
structure = models.CharField(max_length=254,choices=Structure.choices,default=Structure.OTHER)
timer_type = models.CharField(max_length=254,choices=TimerType.choices,default=TimerType.UNSPECIFIED)
objective = models.CharField(max_length=254, choices=Objective.choices, default=Objective.NEUTRAL)
eve_time = models.DateTimeField()
important = models.BooleanField(default=False)
eve_character = models.ForeignKey(EveCharacter, null=True, on_delete=models.SET_NULL)
@@ -41,5 +70,8 @@ class Timer(models.Model):
corp_timer = models.BooleanField(default=False)
user = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
def __str__(self):
def __str__(self) -> str:
return str(self.system) + ' ' + str(self.details)
class Meta:
ordering = ['eve_time']

View File

@@ -40,7 +40,7 @@
</div>
{% endif %}
{% if timer.objective == "Neutral" %}
<div class="badge bg-default">
<div class="badge bg-secondary">
{% translate "Neutral" %}
</div>
{% endif %}

View File

@@ -18,174 +18,85 @@
</tr>
{% for timer in timers %}
{% if timer.important == True %}
<tr class="bg-danger bg-opacity-25">
{% else %}
<tr class="bg-info bg-opacity-25">
{% endif %}
<tr class="{% if timer.important == True %}bg-danger bg-opacity-25{% else %}bg-info bg-opacity-25{% endif %}">
<td style="width: 150px;" class="text-center">
{{ timer.details }}
{% if timer.timer_type != 'UNSPECIFIED' %}
<br>({{ timer.get_timer_type_display }})
<br />
({{ timer.get_timer_type_display }})
{% endif %}
</td>
<td class="text-center">
{% if timer.objective == "Hostile" %}
<div class="badge bg-danger">
{% translate "Hostile" %}
</div>
{% endif %}
{% if timer.objective == "Friendly" %}
<div class="badge bg-primary">
{% translate "Friendly" %}
</div>
{% endif %}
{% if timer.objective == "Neutral" %}
<div class="badge bg-default">
{% translate "Neutral" %}
</div>
<div class="badge bg-danger">{% translate "Hostile" %}</div>
{% elif timer.objective == "Friendly" %}
<div class="badge bg-primary">{% translate "Friendly" %}</div>
{% elif timer.objective == "Neutral" %}
<div class="badge bg-secondary">{% translate "Neutral" %}</div>
{% endif %}
</td>
<td class="text-center">
<a href="{{ timer.system|dotlan_solar_system_url }}">
{{ timer.system }} {{ timer.planet_moon }}
</a>
<a href="{{ timer.system|dotlan_solar_system_url }}">{{ timer.system }} {{ timer.planet_moon }}</a>
</td>
<td class="text-center">
{% if timer.structure == "POCO" %}
<div class="badge bg-info">
{% translate "POCO" %}
</div>
{% endif %}
{% if timer.structure == "I-HUB" %}
<div class="badge bg-warning">
{% translate "I-HUB" %}
</div>
{% endif %}
{% if timer.structure == "TCU" %}
<div class="badge bg-danger">
{% translate "TCU" %}
</div>
{% endif %}
{% if timer.structure == "POS[S]" %}
<div class="badge bg-info">
{% translate "POS [S]" %}
</div>
{% endif %}
{% if timer.structure == "POS[M]" %}
<div class="badge bg-info">
{% translate "POS [M]" %}
</div>
{% endif %}
{% if timer.structure == "POS[L]" %}
<div class="badge bg-info">
{% translate "POS [L]" %}
</div>
{% endif %}
{% if timer.structure == "Citadel[M]" or timer.structure == "Astrahus" %}
<div class="badge bg-danger">
{% translate "Astrahus" %}
</div>
{% endif %}
{% if timer.structure == "Citadel[L]" or timer.structure == "Fortizar" %}
<div class="badge bg-danger">
{% translate "Fortizar" %}
</div>
{% endif %}
{% if timer.structure == "Citadel[XL]" or timer.structure == "Keepstar" %}
<div class="badge bg-danger">
{% translate "Keepstar" %}
</div>
{% endif %}
{% if timer.structure == "Engineering Complex[M]" or timer.structure == "Raitaru" %}
<div class="badge bg-warning">
{% translate "Raitaru" %}
</div>
{% endif %}
{% if timer.structure == "Engineering Complex[L]" or timer.structure == "Azbel" %}
<div class="badge bg-warning">
{% translate "Azbel" %}
</div>
{% endif %}
{% if timer.structure == "Engineering Complex[XL]" or timer.structure == "Sotiyo" %}
<div class="badge bg-warning">
{% translate "Sotiyo" %}
</div>
{% endif %}
{% if timer.structure == "Refinery[M]" or timer.structure == "Athanor" %}
<div class="badge bg-warning">
{% translate "Athanor" %}
</div>
{% endif %}
{% if timer.structure == "Refinery[L]" or timer.structure == "Tatara"%}
<div class="badge bg-warning">
{% translate "Tatara" %}
</div>
{% endif %}
{% if timer.structure == "Cyno Beacon" or timer.structure == "Pharolux Cyno Beacon" %}
<div class="badge bg-warning">
{% translate "Cyno Beacon" %}
</div>
{% endif %}
{% if timer.structure == "Cyno Jammer" or timer.structure == "Tenebrex Cyno Jammer" %}
<div class="badge bg-warning">
{% translate "Cyno Jammer" %}
</div>
{% endif %}
{% if timer.structure == "Jump Gate" or timer.structure == "Ansiblex Jump Gate" %}
<div class="badge bg-warning">
{% translate "Ansiblex Jump Gate" %}
</div>
{% endif %}
{% if timer.structure == "Moon Mining Cycle" %}
<div class="badge bg-success">
{% translate "Moon Mining Cycle" %}
</div>
{% endif %}
{% if timer.structure == "Other" %}
<div class="badge bg-default">
{% translate "Other" %}
</div>
<div class="badge bg-info">{% translate "POCO" %}</div>
{% elif timer.structure == "Orbital Skyhook" %}
<div class="badge bg-warning">{% translate "Orbital Skyhook" %}</div>
{% elif timer.structure == "I-HUB" %}
<div class="badge bg-warning">{% translate "I-HUB" %}</div>
{% elif timer.structure == "TCU" %} {% comment %} Pending Removal {% endcomment %}
<div class="badge bg-secondary">{% translate "TCU" %}</div>
{% elif timer.structure == "POS[S]" %}
<div class="badge bg-info">{% translate "POS [S]" %}</div>
{% elif timer.structure == "POS[M]" %}
<div class="badge bg-info">{% translate "POS [M]" %}</div>
{% elif timer.structure == "POS[L]" %}
<div class="badge bg-info">{% translate "POS [L]" %}</div>
{% elif timer.structure == "Citadel[M]" or timer.structure == "Astrahus" %}
<div class="badge bg-danger">{% translate "Astrahus" %}</div>
{% elif timer.structure == "Citadel[L]" or timer.structure == "Fortizar" %}
<div class="badge bg-danger">{% translate "Fortizar" %}</div>
{% elif timer.structure == "Citadel[XL]" or timer.structure == "Keepstar" %}
<div class="badge bg-danger">{% translate "Keepstar" %}</div>
{% elif timer.structure == "Engineering Complex[M]" or timer.structure == "Raitaru" %}
<div class="badge bg-warning">{% translate "Raitaru" %}</div>
{% elif timer.structure == "Engineering Complex[L]" or timer.structure == "Azbel" %}
<div class="badge bg-warning">{% translate "Azbel" %}</div>
{% elif timer.structure == "Engineering Complex[XL]" or timer.structure == "Sotiyo" %}
<div class="badge bg-danger">{% translate "Sotiyo" %}</div>
{% elif timer.structure == "Refinery[M]" or timer.structure == "Athanor" %}
<div class="badge bg-warning">{% translate "Athanor" %}</div>
{% elif timer.structure == "Refinery[L]" or timer.structure == "Tatara" %}
<div class="badge bg-warning">{% translate "Tatara" %}</div>
{% elif timer.structure == "Cyno Beacon" or timer.structure == "Pharolux Cyno Beacon" %}
<div class="badge bg-warning">{% translate "Cyno Beacon" %}</div>
{% elif timer.structure == "Cyno Jammer" or timer.structure == "Tenebrex Cyno Jammer" %}
<div class="badge bg-warning">{% translate "Cyno Jammer" %}</div>
{% elif timer.structure == "Jump Gate" or timer.structure == "Ansiblex Jump Gate" %}
<div class="badge bg-warning">{% translate "Ansiblex Jump Gate" %}</div>
{% elif timer.structure == "Moon Mining Cycle" %}
<div class="badge bg-success">{% translate "Moon Mining Cycle" %}</div>
{% elif timer.structure == "Metenox Moon Drill" %}
<div class="badge bg-warning">{% translate "Metenox Moon Drill" %}</div>
{% elif timer.structure == "Other" %}
<div class="badge bg-secondary">{% translate "Other" %}</div>
{% endif %}
</td>
<td class="text-center" nowrap>
{{ timer.eve_time | date:"Y-m-d H:i" }}
</td>
<td class="text-center" nowrap>{{ timer.eve_time | date:"Y-m-d H:i" }}</td>
<td class="text-center" nowrap>
<div id="localtime{{ timer.id }}"></div>
<div id="countdown{{ timer.id }}"></div>
</td>
<td class="text-center">
{{ timer.eve_character.character_name }}
</td>
<td class="text-center">{{ timer.eve_character.character_name }}</td>
{% if perms.auth.timer_management %}
<td class="text-center">

View File

@@ -167,8 +167,8 @@ class TimerboardViewsTestCase(WebTest):
form['details'] = 'details'
form['system'] = 'jita'
form['planet_moon'] = '4-4'
form['structure'] = TimerForm.structure_choices[0][0]
form['objective'] = TimerForm.objective_choices[0][0]
form['structure'] = Timer.Structure.choices[0][0]
form['objective'] = Timer.Objective.choices[0][0]
form['days_left'] = 1
form['hours_left'] = 2
form['minutes_left'] = 3
@@ -206,8 +206,8 @@ class TimerboardViewsTestCase(WebTest):
form['details'] = 'detailsUNIQUE'
form['system'] = 'jita'
form['planet_moon'] = '4-4'
form['structure'] = TimerForm.structure_choices[0][0]
form['objective'] = TimerForm.objective_choices[0][0]
form['structure'] = Timer.Structure.choices[0][0]
form['objective'] = Timer.Objective.choices[0][0]
form['days_left'] = 1
form['hours_left'] = 2
form['minutes_left'] = 3

View File

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

Some files were not shown because too many files have changed in this diff Show More