Compare commits

..

132 Commits
v3.4.0 ... v3.x

Author SHA1 Message Date
Ariel Rin
054ef27fa4 Version Bump 3.8.1 2024-02-17 19:39:14 +10:00
Ariel Rin
97e224b8e6 Merge branch 'translations_7f31a07ccd4e4a66b1dd7b6bc2dbddb5' into 'master'
Updates for project Alliance Auth

See merge request allianceauth/allianceauth!1593
2024-02-17 09:30:43 +00:00
Ariel Rin
3b8fa415bc Updates for project Alliance Auth 2024-02-17 09:30:43 +00:00
Ariel Rin
b94fd7ed19 I18N Maintenance 2024-02-17 18:52:42 +10:00
Ariel Rin
d1dac61135 Merge branch 'translations_7f31a07ccd4e4a66b1dd7b6bc2dbddb5' into 'master'
Updates for project Alliance Auth

See merge request allianceauth/allianceauth!1563
2024-02-17 08:48:55 +00:00
Ariel Rin
d2a095217f Updates for project Alliance Auth 2024-02-17 08:48:55 +00:00
Ariel Rin
5e9b47cf79 Merge branch 'docs-improvements' into 'master'
Docs improvements

See merge request allianceauth/allianceauth!1574
2024-01-15 05:25:51 +00:00
Ariel Rin
853826c140 Merge branch 'add-email-timeout' into 'master'
Add email timeout

See merge request allianceauth/allianceauth!1580
2024-01-15 05:19:57 +00:00
ErikKalkoken
9c7de58989 Add email timeout 2024-01-02 11:48:27 +01:00
Ariel Rin
3de988369f Merge branch 'fix-orphan-tokens' into 'master'
Fix orphan tokens and remove unused messages from backends

Closes #1391

See merge request allianceauth/allianceauth!1570
2023-12-25 09:48:15 +00:00
Peter Pfeufer
6e3219fd1b [FIX] Grammar and spelling 2023-12-17 20:21:11 +01:00
Peter Pfeufer
8aeb061635 [ADD] Remark on how to stop Gunicorn when testing 2023-12-17 17:45:29 +01:00
Peter Pfeufer
84e2107b62 [CHANGE] Switch to adduser for Ubuntu
This will create the users' hoe directory and make it a no-login user in one command.
2023-12-17 17:42:08 +01:00
Ariel Rin
20fcf5efa4 Merge branch 'docs' into 'master'
Docs fixes

See merge request allianceauth/allianceauth!1569
2023-12-17 03:49:41 +00:00
colcrunch
c15b955d5e Make pre-commit happy 2023-12-11 18:37:35 -05:00
colcrunch
65e1545a66 Remove all references to messages as they are never relayed to the user. 2023-12-11 18:16:34 -05:00
colcrunch
c558a980e1 Add more detail to error message displayed on failed alt login. 2023-12-11 18:14:09 -05:00
colcrunch
bd8ef84862 Delete tokens that can not be used for logins. 2023-12-11 18:13:24 -05:00
Ariel Rin
42e96d2f14 close the python section to fix mysql tabs/steps 2023-12-11 22:15:12 +10:00
Ariel Rin
23a3dd1ab9 Merge branch 'fantabular' into 'master'
Doc Modernisation

Closes #1331

See merge request allianceauth/allianceauth!1550
2023-12-05 13:00:50 +00:00
Ariel Rin
81e5bc5337 Merge branch 'master' into 'fantabular'
# Conflicts:
#   docs/maintenance/tuning/index.md
2023-12-02 01:38:18 +00:00
Ariel Rin
a8ef844fe7 Merge branch 'tuning' into 'master'
Docs: Sql Tuning and python version comparison

See merge request allianceauth/allianceauth!1545
2023-12-02 01:31:52 +00:00
Ariel Rin
9ce1939040 Version Bump 3.8.0 2023-11-09 00:00:28 +10:00
Ariel Rin
322131cd4f Update source language strings 2023-11-08 23:56:16 +10:00
Ariel Rin
55e6e92da5 Merge branch 'transifex' into 'master'
Update from Transifex

See merge request allianceauth/allianceauth!1562
2023-11-08 13:48:26 +00:00
Ariel Rin
e5d29629a5 Update from Transifex 2023-11-08 13:48:26 +00:00
Ariel Rin
26e187e4c8 Merge branch 'assign-users-on-group-form' into 'master'
New Feature: Assign/remove users on group form

See merge request allianceauth/allianceauth!1543
2023-11-08 13:05:25 +00:00
Erik Kalkoken
3480c4e0e8 New Feature: Assign/remove users on group form 2023-11-08 13:05:24 +00:00
Ariel Rin
1544f097e0 Merge branch 'fix-leave-tab-for-autoleave' into 'master'
Fix leave tab for autoleave

See merge request allianceauth/allianceauth!1536
2023-11-08 13:04:27 +00:00
Erik Kalkoken
2477c31656 Fix leave tab for autoleave 2023-11-08 13:04:26 +00:00
Ariel Rin
0dc631d69e Merge branch 'master' into 'master'
Stop renaming discord nick when setting has it disabled

See merge request allianceauth/allianceauth!1540
2023-11-08 13:04:12 +00:00
Dusty Meg
2a9981cdb9 Stop renaming discord nick when setting has it disabled 2023-11-08 13:04:11 +00:00
Ariel Rin
004c48b8ad mild formatting changes 2023-11-08 13:45:43 +10:00
Ariel Rin
4d66b7d456 and gitlab ci update for new docs 2023-11-01 13:28:32 +10:00
Ariel Rin
77e5747a23 move tox tests to new dependency format 2023-11-01 13:15:18 +10:00
Ariel Rin
6118c0ddec override non compatible dark mode check css 2023-11-01 01:10:39 +10:00
Ariel Rin
ce25deeca1 minor formatting 2023-10-31 23:52:34 +10:00
Ariel Rin
60084de3db Pygments lexer name 'math' is not known 2023-10-31 23:43:52 +10:00
Ariel Rin
e16c68e255 increase anchor generation 2023-10-31 23:43:45 +10:00
Ariel Rin
bf14e9c7c3 merged back into sphinxcontrib-django 2023-10-31 23:36:42 +10:00
Ariel Rin
98e91fe207 MyST conversion 2023-10-31 23:31:41 +10:00
Ariel Rin
7024552c4e remove ubuntu 1804 2023-10-27 22:20:27 +10:00
Ariel Rin
a0719e4b86 tabify 2023-10-27 22:20:11 +10:00
Ariel Rin
906c589f14 more automated upgrades 2023-10-27 22:19:28 +10:00
Ariel Rin
ffb526ab0c find and replace fixes, will introduce errors 2023-10-27 16:37:53 +10:00
Ariel Rin
b9d128259e correct path 2023-10-27 16:37:30 +10:00
Ariel Rin
13d866bd0d RST to MyST, pyproject doc dependencies, add sphinx tabs 2023-10-27 16:37:09 +10:00
Ariel Rin
ea1887b9ec mild clarifications 2023-10-26 11:26:39 +10:00
Ariel Rin
d2f8c2a42f Merge branch 'master' of gitlab.com:allianceauth/allianceauth into tuning 2023-10-26 10:49:29 +10:00
Ariel Rin
424246df26 Version Bump 3.7.1 2023-10-19 14:00:29 +10:00
Ariel Rin
563e2210ef Bump Django-ESI to >=5.0.0 2023-10-19 13:11:35 +10:00
Ariel Rin
02a1078005 Merge branch 'remove-thirdparty' into 'master'
Remove outdated supervisor configs - refer to docs

See merge request allianceauth/allianceauth!1533
2023-10-19 03:03:35 +00:00
Ariel Rin
30107de44e Merge branch 'docs-precommit' into 'master'
Add code-style docs

Closes #1379

See merge request allianceauth/allianceauth!1534
2023-10-19 03:03:14 +00:00
Ariel Rin
200e8f2ff1 initial sql tuning and python version comparison 2023-10-11 12:33:17 +10:00
Ariel Rin
77a08cd218 Add code-style docs 2023-10-07 22:32:19 +10:00
Ariel Rin
e5a09027e5 Remove outdated supervisor configs - refer to docs 2023-10-07 21:53:03 +10:00
Ariel Rin
52b6c5d341 Rework default celery configuration and documentation 2023-10-07 19:31:53 +10:00
Ariel Rin
8b895b76b5 Version Bump 3.7.0 2023-10-07 15:27:11 +10:00
Ariel Rin
babd71702f Merge branch 'docs' into 'master'
Remove CentOS Section from NGINX docs

See merge request allianceauth/allianceauth!1531
2023-10-07 04:59:12 +00:00
Ariel Rin
3ec3cbdff7 Merge branch 'fix-tasks-running' into 'master'
Fix tasks running counter

See merge request allianceauth/allianceauth!1529
2023-10-07 04:52:04 +00:00
Erik Kalkoken
51611e1237 Fix tasks running counter 2023-10-07 04:52:03 +00:00
Ariel Rin
39519bab91 Merge branch 'new-discord-username-format' into 'master'
[ADD] Respect and display the new Discord username format when eligible

See merge request allianceauth/allianceauth!1526
2023-10-07 04:40:46 +00:00
Ariel Rin
90dc6a4d4c Merge branch 'fix-reference-before-assignment' into 'master'
[FIX] Reference before assignment

Closes #1369 and #1375

See merge request allianceauth/allianceauth!1530
2023-10-07 04:40:00 +00:00
Ariel Rin
53ffd7f885 Merge branch 'set-lang-attribute' into 'master'
[ADD] Language code to page and language selector

See merge request allianceauth/allianceauth!1528
2023-10-07 04:39:01 +00:00
Ariel Rin
efc7475228 Merge branch 'celery-broker-connection' into 'master'
Prepare our Celery config for Celery 6

See merge request allianceauth/allianceauth!1532
2023-10-07 04:38:21 +00:00
Peter Pfeufer
380c41400b [CHANGE] Updating celery.py to prevent deprecation warning
```
[2023-08-14 06:41:04,904: WARNING/MainProcess] /mnt/sda1/Development/Python/AllianceAuth/venv-3.11/lib/python3.11/site-packages/celery/worker/consumer/consumer.py:498: CPendingDeprecationWarning: The broker_connection_retry configuration setting will no longer determine
whether broker connection retries are made during startup in Celery 6.0 and above.
If you wish to retain the existing behavior for retrying connections on startup,
you should set broker_connection_retry_on_startup to True.
```
2023-09-15 11:42:47 +02:00
colcrunch
079c12a72e Remove CentOS heading and add notes about the differing config methods to the relevant lines in the install section. 2023-09-07 07:11:05 -04:00
Peter Pfeufer
4f1ebedc44 [FIX] Reference before assignment
`ownership` doesn't exist at this point.
To get the main character, `user` is used here.


```
Traceback (most recent call last):
  File "/home/allianceserver/venv/auth/lib/python3.10/site-packages/django/core/handlers/exception.py", line 56, in inner
    response = get_response(request)
  File "/home/allianceserver/venv/auth/lib/python3.10/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/allianceserver/venv/auth/lib/python3.10/site-packages/esi/decorators.py", line 116, in _wrapped_view
    return view_func(request, token, *args, **kwargs)
  File "/home/allianceserver/venv/auth/lib/python3.10/site-packages/allianceauth/authentication/views.py", line 156, in sso_login
    user = authenticate(token=token)
  File "/home/allianceserver/venv/auth/lib/python3.10/site-packages/django/views/decorators/debug.py", line 42, in sensitive_variables_wrapper
    return func(*func_args, **func_kwargs)
  File "/home/allianceserver/venv/auth/lib/python3.10/site-packages/django/contrib/auth/__init__.py", line 77, in authenticate
    user = backend.authenticate(request, **credentials)
  File "/home/allianceserver/venv/auth/lib/python3.10/site-packages/allianceauth/authentication/backends.py", line 68, in authenticate
    if ownership.user.profile.main_character.character_id != token.character_id:
UnboundLocalError: local variable 'ownership' referenced before assignment
```
2023-09-01 20:46:00 +02:00
Peter Pfeufer
66822107e3 [ADD] Language code to page and language selector 2023-08-28 21:40:28 +02:00
Peter Pfeufer
7856cd5ce4 [ADD] Respect and display the new Discord username format when eligible 2023-08-26 00:47:08 +02:00
Ariel Rin
36b3077caa Version Bump 3.6.1 2023-08-10 14:37:27 +10:00
Ariel Rin
1786f3a642 Merge branch 'prepare-base-template-for-public-views' into 'master'
[FIX] Templates prepared for public views

See merge request allianceauth/allianceauth!1525
2023-08-10 04:23:48 +00:00
Peter Pfeufer
55927c6f15 [FIX] Allow messages also for non-logged-in user to be displayed 2023-08-08 23:20:43 +02:00
Peter Pfeufer
8fbe0ba45d [CHANGE] Comment 2023-08-07 07:23:21 +02:00
Peter Pfeufer
1563805ddb [ADD] CCP's "No Character" character image as user menu image for public 2023-08-05 18:51:12 +02:00
Ariel Rin
c58ed53369 Merge branch 'fix-negative-running-tasks' into 'master'
Fix negative running tasks

See merge request allianceauth/allianceauth!1524
2023-08-05 09:17:42 +00:00
Peter Pfeufer
32128ace1c [FIX] Better explanation in local.py project template 2023-08-02 23:35:25 +02:00
Peter Pfeufer
7290eaad7e [FIX] Notifications menu item removed in public views 2023-08-02 23:22:14 +02:00
Peter Pfeufer
f23d4f4dd1 [FIX] base.html prepared for public views
Certain things need to be behind `{% if user.is_authenticated %}` in order for the base template to play nice with public views.
2023-08-02 23:17:28 +02:00
ErikKalkoken
ab3f10e6f2 Add more tests for ItemCounter 2023-08-02 16:11:24 +02:00
ErikKalkoken
20187cc73e Add locks to ensure process safety 2023-08-02 15:58:36 +02:00
ErikKalkoken
1f55fbfccc Add minimum to ItemCounter and refactor redis client init 2023-08-02 15:41:47 +02:00
Ariel Rin
12383d79c8 Version Bump 3.6.0 2023-08-01 21:37:25 +10:00
Ariel Rin
56e2875650 Merge branch 'pre-commit-update' into 'master'
`pre-commit` Update and File Permission Fixes (redone)

See merge request allianceauth/allianceauth!1523
2023-08-01 11:22:37 +00:00
Peter Pfeufer
d0118e6c0b [FIX] File permissions 2023-08-01 12:55:19 +02:00
Peter Pfeufer
7075ccdf7a [CHANGE] Django Upgrade checks applied 2023-08-01 12:52:05 +02:00
Ariel Rin
b2d540c010 Merge branch 'add-public-routes-feature' into 'master'
Add public routes feature

See merge request allianceauth/allianceauth!1514
2023-08-01 10:20:14 +00:00
Erik Kalkoken
7cb7e2c77b Add public routes feature 2023-08-01 10:20:13 +00:00
Ariel Rin
5d6a4ab1a9 Merge branch 'feature-show-running-tasks' into 'master'
Show running tasks on dashboard

See merge request allianceauth/allianceauth!1515
2023-08-01 10:15:43 +00:00
Erik Kalkoken
1122d617bd Show running tasks on dashboard 2023-08-01 10:15:42 +00:00
Ariel Rin
ef33501e45 Merge branch 'proper-favicon-support' into 'master'
Proper favicon support

See merge request allianceauth/allianceauth!1520
2023-08-01 10:14:21 +00:00
Ariel Rin
08fd86db8f Merge branch 'migrate-pep-621' into 'master'
Migrate to PEP 621

See merge request allianceauth/allianceauth!1513
2023-07-25 09:32:29 +00:00
Erik Kalkoken
c4193c15fc Migrate to PEP 621 2023-07-25 09:32:28 +00:00
Ariel Rin
903074080e Merge branch 'unknown_discord_group_patch' into 'master'
Discord: Don't fail on unknown groups, simply remove them.

See merge request allianceauth/allianceauth!1504
2023-07-25 09:27:19 +00:00
Ariel Rin
3046a26a02 Merge branch 'AA-Timer-Absolute' into 'master'
Adding Absolute Timers to base timerboard

See merge request allianceauth/allianceauth!1518
2023-07-25 09:26:10 +00:00
Hamish W
951c4135c2 Adding Absolute Timers to base timerboard 2023-07-25 09:26:10 +00:00
Ariel Rin
b256a0c5e1 Merge branch 'next-params' into 'master'
Encode Next Param for Login Redirection

See merge request allianceauth/allianceauth!1519
2023-07-25 09:02:31 +00:00
Ariel Rin
212b9b0f60 Merge branch 'stringify-crontab-arguments' into 'master'
[FIX] `crontab` arguments are of type `string`, not `int`

See merge request allianceauth/allianceauth!1517
2023-07-25 08:55:25 +00:00
Peter Pfeufer
fc29d7e80d [ADD] All modern favicon versions generated by realfavicongenerator.net 2023-07-19 12:10:02 +02:00
Peter Pfeufer
ec536c66a0 [ADD] Favicon redirect to Nginx docs 2023-07-19 11:40:45 +02:00
Peter Pfeufer
749ece45e2 [ADD] Favicon redirect to Apache2 docs 2023-07-19 11:39:04 +02:00
Peter Pfeufer
b04c8873d0 [ADD] Directive for default favicon 2023-07-19 11:37:07 +02:00
Aaron Kable
9a77175bf3 Allow get params from next at login 2023-07-17 10:25:36 +08:00
Peter Pfeufer
5d4c7b9030 [FIX] crontab arguments here as well 2023-07-14 19:22:29 +02:00
Aaron Kable
5f80259d57 fix test 2023-07-13 20:28:35 +08:00
Peter Pfeufer
dcd6bd1b36 [FIX] crontab arguments are of type string, not int 2023-07-12 13:11:18 +02:00
Ariel Rin
6f4dffe930 Version Bump 3.5.1 2023-07-11 22:38:26 +10:00
Ariel Rin
56d70e6c74 Add pkg-config to dockerfile 2023-07-11 22:36:15 +10:00
Ariel Rin
5e14ea4573 Version Bump 3.5.0 2023-07-11 13:01:50 +10:00
Ariel Rin
c743eca0f7 Merge branch 'fix-use-of-deprecated-function-calls' into 'master'
[FIX] Use of deprecated `logger.warn()` function calls

See merge request allianceauth/allianceauth!1516
2023-07-11 02:36:59 +00:00
Ariel Rin
2002f24178 Merge branch 'limit-django-registration' into 'master'
[COMPATIBILITY] Limit `django-registration` to <3.4

See merge request allianceauth/allianceauth!1512
2023-07-07 23:57:30 +00:00
Ariel Rin
6412aedf53 Merge branch 'add-docs-for-external-link' into 'master'
Add customization example to docs

See merge request allianceauth/allianceauth!1511
2023-07-07 23:56:07 +00:00
Erik Kalkoken
939df08b95 Add customization example to docs 2023-07-07 23:56:07 +00:00
Ariel Rin
d8506aa753 Merge branch 'pkg-config' into 'master'
add pkg-config to our system package dependencies, for mysqlclient 2.2.0

Closes #1376

See merge request allianceauth/allianceauth!1509
2023-07-07 23:54:41 +00:00
Ariel Rin
3f2cdac658 Merge branch 'devdocs-1' into 'master'
Add pkg-config install to dev setup and expand python downgrade note.

See merge request allianceauth/allianceauth!1510
2023-07-07 23:54:39 +00:00
Peter Pfeufer
d57ab01ff3 [FIX] Use of deprecated logger.warn() function calls 2023-07-07 17:51:55 +02:00
Peter Pfeufer
91b62bbe9d [COMPATIBILITY] Limit django-registration to <3.4 2023-07-04 12:51:12 +02:00
Max Tsero
557a52e3c8 Add pkg-config install to dev setup and expand python downgrade note. 2023-07-02 10:39:23 +00:00
Ariel Rin
f8fefd92a5 add pkg-config to our system package dependencies, for mysqlclient 2.2.0 2023-06-27 11:08:59 +10:00
Ariel Rin
f2c43ee921 Merge branch 'add-docs-app-unintall' into 'master'
Improve documentation for app removal

See merge request allianceauth/allianceauth!1508
2023-06-20 14:34:32 +00:00
Erik Kalkoken
99945b0146 Improve documentation for app removal 2023-06-20 14:34:32 +00:00
Ariel Rin
abb9dc4db6 Merge branch 'master' into 'master'
Add utf8mb4 unicode option to mysql config in local.py

See merge request allianceauth/allianceauth!1503
2023-06-03 07:04:52 +00:00
Valiantiam
eba5b80cde Add utf8mb4 unicode option to mysql config in local.py 2023-06-03 07:04:52 +00:00
Ariel Rin
5b39c887a5 Merge branch 'master' into 'master'
Add Grafana datasoure and dashboard provisioning

See merge request allianceauth/allianceauth!1501
2023-06-03 05:06:23 +00:00
Ariel Rin
183363e789 Merge branch 'add-ukrainian-to-userprofile-language-selection' into 'master'
[ADDED] Ukrainian to `UserProfile.LANGUAGE_CHOICES`

See merge request allianceauth/allianceauth!1505
2023-06-03 05:04:34 +00:00
Ariel Rin
d8704f4d8f Merge branch 'add-ipv6-to-nginx-config' into 'master'
[ADDED] IPv6 to Nginx config

See merge request allianceauth/allianceauth!1506
2023-06-03 05:03:17 +00:00
Peter Pfeufer
165ee44a63 [ADDED] IPv6 to Nginx config
IPv6 is almost 25 years old, time to add it to our config …
2023-05-31 09:29:04 +02:00
Peter Pfeufer
e8f508cecb [CHANGE] Switched to more modern models.TextChoices class for languages 2023-05-28 18:31:50 +02:00
Peter Pfeufer
3044f18900 [ADDED] Ukrainian to UserProfile.LANGUAGE_CHOICES 2023-05-28 17:38:51 +02:00
Aaron Kable
1cae20fe5f Dont fail on unknown groups, simply remove them. 2023-05-19 05:00:39 +08:00
MillerUk
79637020f3 add grafana datasoure and dashboard provisioning 2023-05-16 22:14:11 +00:00
MillerUk
2d34422e2d add grafana datasoure and dashboard provisioning 2023-04-30 20:32:40 +00:00
222 changed files with 6095 additions and 3552 deletions

View File

@@ -25,7 +25,7 @@ before_script:
pre-commit-check: pre-commit-check:
<<: *only-default <<: *only-default
stage: pre-commit stage: pre-commit
image: python:3.8-bullseye image: python:3.10-bullseye
variables: variables:
PRE_COMMIT_HOME: ${CI_PROJECT_DIR}/.cache/pre-commit PRE_COMMIT_HOME: ${CI_PROJECT_DIR}/.cache/pre-commit
cache: cache:
@@ -195,7 +195,7 @@ build-test:
test-docs: test-docs:
<<: *only-default <<: *only-default
image: python:3.10-bullseye image: python:3.11-bullseye
script: script:
- tox -e docs - tox -e docs

View File

@@ -1,6 +0,0 @@
[settings]
profile=django
sections=FUTURE,STDLIB,THIRDPARTY,DJANGO,ESI,FIRSTPARTY,LOCALFOLDER
known_esi=esi
known_django=django
skip_gitignore=true

View File

@@ -7,12 +7,33 @@ repos:
- repo: https://github.com/pre-commit/pre-commit-hooks - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0 rev: v4.4.0
hooks: hooks:
- id: check-case-conflict # Identify invalid files
- id: check-json - id: check-ast
- id: check-xml
- id: check-yaml - id: check-yaml
- id: check-json
- id: check-toml
- id: check-xml
# git checks
- id: check-merge-conflict
- id: check-added-large-files
args: [ --maxkb=1000 ]
- id: detect-private-key
- id: check-case-conflict
# Python checks
# - id: check-docstring-first
- id: debug-statements
# - id: requirements-txt-fixer
- id: fix-encoding-pragma
args: [ --remove ]
- id: fix-byte-order-marker - id: fix-byte-order-marker
# General quality checks
- id: mixed-line-ending
args: [ --fix=lf ]
- id: trailing-whitespace - id: trailing-whitespace
args: [ --markdown-linebreak-ext=md ]
exclude: | exclude: |
(?x)( (?x)(
\.min\.css| \.min\.css|
@@ -21,6 +42,7 @@ repos:
\.mo| \.mo|
swagger\.json swagger\.json
) )
- id: check-executables-have-shebangs
- id: end-of-file-fixer - id: end-of-file-fixer
exclude: | exclude: |
(?x)( (?x)(
@@ -30,13 +52,9 @@ repos:
\.mo| \.mo|
swagger\.json swagger\.json
) )
- id: mixed-line-ending
args: [ '--fix=lf' ]
- id: fix-encoding-pragma
args: [ '--remove' ]
- repo: https://github.com/editorconfig-checker/editorconfig-checker.python - repo: https://github.com/editorconfig-checker/editorconfig-checker.python
rev: 2.7.1 rev: 2.7.2
hooks: hooks:
- id: editorconfig-checker - id: editorconfig-checker
exclude: | exclude: |
@@ -48,14 +66,14 @@ repos:
swagger\.json swagger\.json
) )
- repo: https://github.com/adamchainz/django-upgrade
rev: 1.14.0
hooks:
- id: django-upgrade
args: [ --target-version=4.0 ]
- repo: https://github.com/asottile/pyupgrade - repo: https://github.com/asottile/pyupgrade
rev: v3.3.1 rev: v3.10.1
hooks: hooks:
- id: pyupgrade - id: pyupgrade
args: [ --py38-plus ] args: [ --py38-plus ]
- repo: https://github.com/asottile/setup-cfg-fmt
rev: v2.2.0
hooks:
- id: setup-cfg-fmt
args: [ --include-version-classifiers ]

View File

@@ -7,11 +7,11 @@ version: 2
# Set the version of Python and other tools you might need # Set the version of Python and other tools you might need
build: build:
os: ubuntu-20.04 os: ubuntu-22.04
apt_packages: apt_packages:
- redis - redis
tools: tools:
python: "3.8" python: "3.11"
# Build documentation in the docs/ directory with Sphinx # Build documentation in the docs/ directory with Sphinx
sphinx: sphinx:
@@ -20,7 +20,10 @@ sphinx:
# Optionally build your docs in additional formats such as PDF and ePub # Optionally build your docs in additional formats such as PDF and ePub
formats: all formats: all
# Optionally set the version of Python and requirements required to build your docs # Python requirements required to build your docs
python: python:
install: install:
- requirements: docs/requirements.txt - method: pip
path: .
extra_requirements:
- docs

View File

@@ -1,5 +1,5 @@
[main] [main]
host = https://www.transifex.com host = https://app.transifex.com
lang_map = zh-Hans: zh_Hans lang_map = zh-Hans: zh_Hans
[o:alliance-auth:p:alliance-auth:r:django-po] [o:alliance-auth:p:alliance-auth:r:django-po]

View File

@@ -1,10 +0,0 @@
[main]
host = https://www.transifex.com
lang_map = zh-Hans:zh_Hans
[alliance-auth.django-po]
file_filter = allianceauth/locale/<lang>/LC_MESSAGES/django.po
minimum_perc = 0
source_file = allianceauth/locale/en/LC_MESSAGES/django.po
source_lang = en
type = PO

10
.tx/transifex.yml Normal file
View File

@@ -0,0 +1,10 @@
filters:
- filter_type: file
file_format: PO
source_file: allianceauth/locale/en/LC_MESSAGES/django.po
source_language: en
translation_files_expression: allianceauth/locale/<lang>/LC_MESSAGES/django.po
settings:
language_mapping:
zh-Hans: zh_Hans

View File

@@ -1,7 +0,0 @@
include LICENSE
include README.md
include MANIFEST.in
graft allianceauth
global-exclude __pycache__
global-exclude *.py[co]

2
README.md Executable file → Normal file
View File

@@ -17,7 +17,7 @@ An auth system for EVE Online to help in-game organizations manage online servic
- [Documentation](http://allianceauth.rtfd.io) - [Documentation](http://allianceauth.rtfd.io)
- [Support](#support) - [Support](#support)
- [Release Notes](https://gitlab.com/allianceauth/allianceauth/-/releases) - [Release Notes](https://gitlab.com/allianceauth/allianceauth/-/releases)
- [Developer Team](#developer-team) - [Developer Team](#development-team)
- [Contributing](#contributing) - [Contributing](#contributing)
## Overview ## Overview

View File

@@ -1,7 +1,11 @@
"""An auth system for EVE Online to help in-game organizations
manage online service access.
"""
# This will make sure the app is always imported when # This will make sure the app is always imported when
# Django starts so that shared_task will use this app. # Django starts so that shared_task will use this app.
__version__ = '3.4.0' __version__ = '3.8.1'
__title__ = 'Alliance Auth' __title__ = 'Alliance Auth'
__url__ = 'https://gitlab.com/allianceauth/allianceauth' __url__ = 'https://gitlab.com/allianceauth/allianceauth'
NAME = f'{__title__} v{__version__}' NAME = f'{__title__} v{__version__}'

View File

@@ -2,7 +2,6 @@ import logging
from django.contrib.auth.backends import ModelBackend from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User, Permission from django.contrib.auth.models import User, Permission
from django.contrib import messages
from .models import UserProfile, CharacterOwnership, OwnershipRecord from .models import UserProfile, CharacterOwnership, OwnershipRecord
@@ -41,9 +40,7 @@ class StateBackend(ModelBackend):
if ownership.user.profile.main_character: if ownership.user.profile.main_character:
if ownership.user.profile.main_character.character_id == token.character_id: if ownership.user.profile.main_character.character_id == token.character_id:
return ownership.user return ownership.user
else: ## this is an alt, enforce main only. else: # this is an alt, enforce main only.
if request:
messages.error("Unable to authenticate with this Character, Please log in with the main character associated with this account.")
return None return None
else: else:
logger.debug(f'{token.character_name} has changed ownership. Creating new user account.') logger.debug(f'{token.character_name} has changed ownership. Creating new user account.')
@@ -65,10 +62,8 @@ class StateBackend(ModelBackend):
# we've seen this character owner before. Re-attach to their old user account # we've seen this character owner before. Re-attach to their old user account
user = records[0].user user = records[0].user
if user.profile.main_character: if user.profile.main_character:
if ownership.user.profile.main_character.character_id != token.character_id: if user.profile.main_character.character_id != token.character_id:
## this is an alt, enforce main only due to trust issues in SSO. # this is an alt, enforce main only due to trust issues in SSO.
if request:
messages.error("Unable to authenticate with this Character, Please log in with the main character associated with this account. Then add this character from the dashboard.")
return None return None
token.user = user token.user = user

View File

@@ -0,0 +1,48 @@
"""API for interacting with celery workers."""
import itertools
import logging
from typing import Optional
from amqp.exceptions import ChannelError
from celery import current_app
from django.conf import settings
logger = logging.getLogger(__name__)
def active_tasks_count() -> Optional[int]:
"""Return count of currently active tasks
or None if celery workers are not online.
"""
inspect = current_app.control.inspect()
return _tasks_count(inspect.active())
def _tasks_count(data: dict) -> Optional[int]:
"""Return count of tasks in data from celery inspect API."""
try:
tasks = itertools.chain(*data.values())
except AttributeError:
return None
return len(list(tasks))
def queued_tasks_count() -> Optional[int]:
"""Return count of queued tasks. Return None if there was an error."""
try:
with current_app.connection_or_acquire() as conn:
result = conn.default_channel.queue_declare(
queue=getattr(settings, "CELERY_DEFAULT_QUEUE", "celery"), passive=True
)
return result.message_count
except ChannelError:
# Queue doesn't exist, probably empty
return 0
except Exception:
logger.exception("Failed to get celery queue length")
return None

View File

@@ -1,18 +1,28 @@
from django.conf.urls import include
from django.contrib.auth.decorators import user_passes_test
from django.core.exceptions import PermissionDenied
from functools import wraps from functools import wraps
from django.shortcuts import redirect from typing import Callable, Iterable, Optional
from django.urls import include
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.decorators import login_required, user_passes_test
from django.core.exceptions import PermissionDenied
from django.shortcuts import redirect
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.contrib.auth.decorators import login_required
def user_has_main_character(user): def user_has_main_character(user):
return bool(user.profile.main_character) return bool(user.profile.main_character)
def decorate_url_patterns(urls, decorator): def decorate_url_patterns(
urls, decorator: Callable, excluded_views: Optional[Iterable] = None
):
"""Decorate views given in url patterns except when they are explicitly excluded.
Args:
- urls: Django URL patterns
- decorator: Decorator to be added to each view
- exclude_views: Optional iterable of view names to be excluded
"""
url_list, app_name, namespace = include(urls) url_list, app_name, namespace = include(urls)
def process_patterns(url_patterns): def process_patterns(url_patterns):
@@ -22,6 +32,8 @@ def decorate_url_patterns(urls, decorator):
process_patterns(pattern.url_patterns) process_patterns(pattern.url_patterns)
else: else:
# this is a pattern # this is a pattern
if excluded_views and pattern.lookup_str in excluded_views:
return
pattern.callback = decorator(pattern.callback) pattern.callback = decorator(pattern.callback)
process_patterns(url_list) process_patterns(url_list)

View File

@@ -1,8 +1,5 @@
from django.conf.urls import include
from allianceauth.authentication import views from allianceauth.authentication import views
from django.urls import re_path from django.urls import include, re_path, path
from django.urls import path
urlpatterns = [ urlpatterns = [
path('activate/complete/', views.activation_complete, name='registration_activation_complete'), path('activate/complete/', views.activation_complete, name='registration_activation_complete'),

0
allianceauth/authentication/managers.py Executable file → Normal file
View File

View File

@@ -0,0 +1,34 @@
# Generated by Django 4.0.10 on 2023-05-28 15:36
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("authentication", "0020_userprofile_language_userprofile_night_mode"),
]
operations = [
migrations.AlterField(
model_name="userprofile",
name="language",
field=models.CharField(
blank=True,
choices=[
("en", "English"),
("de", "German"),
("es", "Spanish"),
("zh-hans", "Chinese Simplified"),
("ru", "Russian"),
("ko", "Korean"),
("fr", "French"),
("ja", "Japanese"),
("it", "Italian"),
("uk", "Ukrainian"),
],
default="",
max_length=10,
verbose_name="Language",
),
),
]

29
allianceauth/authentication/models.py Executable file → Normal file
View File

@@ -63,6 +63,22 @@ class UserProfile(models.Model):
class Meta: class Meta:
default_permissions = ('change',) default_permissions = ('change',)
class Language(models.TextChoices):
"""
Choices for UserProfile.language
"""
ENGLISH = 'en', _('English')
GERMAN = 'de', _('German')
SPANISH = 'es', _('Spanish')
CHINESE = 'zh-hans', _('Chinese Simplified')
RUSSIAN = 'ru', _('Russian')
KOREAN = 'ko', _('Korean')
FRENCH = 'fr', _('French')
JAPANESE = 'ja', _('Japanese')
ITALIAN = 'it', _('Italian')
UKRAINIAN = 'uk', _('Ukrainian')
user = models.OneToOneField( user = models.OneToOneField(
User, User,
related_name='profile', related_name='profile',
@@ -76,20 +92,9 @@ class UserProfile(models.Model):
State, State,
on_delete=models.SET_DEFAULT, on_delete=models.SET_DEFAULT,
default=get_guest_state_pk) default=get_guest_state_pk)
LANGUAGE_CHOICES = [
('en', _('English')),
('de', _('German')),
('es', _('Spanish')),
('zh-hans', _('Chinese Simplified')),
('ru', _('Russian')),
('ko', _('Korean')),
('fr', _('French')),
('ja', _('Japanese')),
('it', _('Italian')),
]
language = models.CharField( language = models.CharField(
_("Language"), max_length=10, _("Language"), max_length=10,
choices=LANGUAGE_CHOICES, choices=Language.choices,
blank=True, blank=True,
default='') default='')
night_mode = models.BooleanField( night_mode = models.BooleanField(

View File

@@ -1,29 +1,34 @@
from collections import namedtuple """Counters for Task Statistics."""
import datetime as dt import datetime as dt
from typing import NamedTuple, Optional
from .event_series import EventSeries from .event_series import EventSeries
# Global series for counting task events.
"""Global series for counting task events."""
succeeded_tasks = EventSeries("SUCCEEDED_TASKS") succeeded_tasks = EventSeries("SUCCEEDED_TASKS")
retried_tasks = EventSeries("RETRIED_TASKS") retried_tasks = EventSeries("RETRIED_TASKS")
failed_tasks = EventSeries("FAILED_TASKS") failed_tasks = EventSeries("FAILED_TASKS")
_TaskCounts = namedtuple( class _TaskCounts(NamedTuple):
"_TaskCounts", ["succeeded", "retried", "failed", "total", "earliest_task", "hours"] succeeded: int
) retried: int
failed: int
total: int
earliest_task: Optional[dt.datetime]
hours: int
def dashboard_results(hours: int) -> _TaskCounts: def dashboard_results(hours: int) -> _TaskCounts:
"""Counts of all task events within the given timeframe.""" """Counts of all task events within the given time frame."""
def earliest_if_exists(events: EventSeries, earliest: dt.datetime) -> list: def earliest_if_exists(events: EventSeries, earliest: dt.datetime) -> list:
my_earliest = events.first_event(earliest=earliest) my_earliest = events.first_event(earliest=earliest)
return [my_earliest] if my_earliest else [] return [my_earliest] if my_earliest else []
earliest = dt.datetime.utcnow() - dt.timedelta(hours=hours) earliest = dt.datetime.utcnow() - dt.timedelta(hours=hours)
earliest_events = list() earliest_events = []
succeeded_count = succeeded_tasks.count(earliest=earliest) succeeded_count = succeeded_tasks.count(earliest=earliest)
earliest_events += earliest_if_exists(succeeded_tasks, earliest) earliest_events += earliest_if_exists(succeeded_tasks, earliest)
retried_count = retried_tasks.count(earliest=earliest) retried_count = retried_tasks.count(earliest=earliest)

View File

@@ -1,61 +1,31 @@
"""Event series for Task Statistics."""
import datetime as dt import datetime as dt
import logging import logging
from typing import List, Optional from typing import List, Optional
from pytz import utc from pytz import utc
from redis import Redis, RedisError from redis import Redis
from allianceauth.utils.cache import get_redis_client from .helpers import get_redis_client_or_stub
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class _RedisStub:
"""Stub of a Redis client.
It's purpose is to prevent EventSeries objects from trying to access Redis
when it is not available. e.g. when the Sphinx docs are rendered by readthedocs.org.
"""
def delete(self, *args, **kwargs):
pass
def incr(self, *args, **kwargs):
return 0
def zadd(self, *args, **kwargs):
pass
def zcount(self, *args, **kwargs):
pass
def zrangebyscore(self, *args, **kwargs):
pass
class EventSeries: class EventSeries:
"""API for recording and analyzing a series of events.""" """API for recording and analyzing a series of events."""
_ROOT_KEY = "ALLIANCEAUTH_EVENT_SERIES" _ROOT_KEY = "ALLIANCEAUTH_EVENT_SERIES"
def __init__(self, key_id: str, redis: Redis = None) -> None: def __init__(self, key_id: str, redis: Optional[Redis] = None) -> None:
self._redis = get_redis_client() if not redis else redis self._redis = get_redis_client_or_stub() if not redis else redis
try:
if not self._redis.ping():
raise RuntimeError()
except (AttributeError, RedisError, RuntimeError):
logger.exception(
"Failed to establish a connection with Redis. "
"This EventSeries object is disabled.",
)
self._redis = _RedisStub()
self._key_id = str(key_id) self._key_id = str(key_id)
self.clear() self.clear()
@property @property
def is_disabled(self): def is_disabled(self):
"""True when this object is disabled, e.g. Redis was not available at startup.""" """True when this object is disabled, e.g. Redis was not available at startup."""
return isinstance(self._redis, _RedisStub) return hasattr(self._redis, "IS_STUB")
@property @property
def _key_counter(self): def _key_counter(self):
@@ -73,8 +43,8 @@ class EventSeries:
""" """
if not event_time: if not event_time:
event_time = dt.datetime.utcnow() event_time = dt.datetime.utcnow()
id = self._redis.incr(self._key_counter) my_id = self._redis.incr(self._key_counter)
self._redis.zadd(self._key_sorted_set, {id: event_time.timestamp()}) self._redis.zadd(self._key_sorted_set, {my_id: event_time.timestamp()})
def all(self) -> List[dt.datetime]: def all(self) -> List[dt.datetime]:
"""List of all known events.""" """List of all known events."""
@@ -95,15 +65,15 @@ class EventSeries:
self._redis.delete(self._key_counter) self._redis.delete(self._key_counter)
def count(self, earliest: dt.datetime = None, latest: dt.datetime = None) -> int: def count(self, earliest: dt.datetime = None, latest: dt.datetime = None) -> int:
"""Count of events, can be restricted to given timeframe. """Count of events, can be restricted to given time frame.
Args: Args:
- earliest: Date of first events to count(inclusive), or -infinite if not specified - earliest: Date of first events to count(inclusive), or -infinite if not specified
- latest: Date of last events to count(inclusive), or +infinite if not specified - latest: Date of last events to count(inclusive), or +infinite if not specified
""" """
min = "-inf" if not earliest else earliest.timestamp() minimum = "-inf" if not earliest else earliest.timestamp()
max = "+inf" if not latest else latest.timestamp() maximum = "+inf" if not latest else latest.timestamp()
return self._redis.zcount(self._key_sorted_set, min=min, max=max) return self._redis.zcount(self._key_sorted_set, min=minimum, max=maximum)
def first_event(self, earliest: dt.datetime = None) -> Optional[dt.datetime]: def first_event(self, earliest: dt.datetime = None) -> Optional[dt.datetime]:
"""Date/Time of first event. Returns `None` if series has no events. """Date/Time of first event. Returns `None` if series has no events.
@@ -111,10 +81,10 @@ class EventSeries:
Args: Args:
- earliest: Date of first events to count(inclusive), or any if not specified - earliest: Date of first events to count(inclusive), or any if not specified
""" """
min = "-inf" if not earliest else earliest.timestamp() minimum = "-inf" if not earliest else earliest.timestamp()
event = self._redis.zrangebyscore( event = self._redis.zrangebyscore(
self._key_sorted_set, self._key_sorted_set,
min, minimum,
"+inf", "+inf",
withscores=True, withscores=True,
start=0, start=0,

View File

@@ -0,0 +1,49 @@
"""Helpers for Task Statistics."""
import logging
from redis import Redis, RedisError
from allianceauth.utils.cache import get_redis_client
logger = logging.getLogger(__name__)
class _RedisStub:
"""Stub of a Redis client.
It's purpose is to prevent EventSeries objects from trying to access Redis
when it is not available. e.g. when the Sphinx docs are rendered by readthedocs.org.
"""
IS_STUB = True
def delete(self, *args, **kwargs):
pass
def incr(self, *args, **kwargs):
return 0
def zadd(self, *args, **kwargs):
pass
def zcount(self, *args, **kwargs):
pass
def zrangebyscore(self, *args, **kwargs):
pass
def get_redis_client_or_stub() -> Redis:
"""Return AA's default cache client or a stub if Redis is not available."""
redis = get_redis_client()
try:
if not redis.ping():
raise RuntimeError()
except (AttributeError, RedisError, RuntimeError):
logger.exception(
"Failed to establish a connection with Redis. "
"This EventSeries object is disabled.",
)
return _RedisStub()
return redis

View File

@@ -1,9 +1,7 @@
"""Signals for Task Statistics."""
from celery.signals import ( from celery.signals import (
task_failure, task_failure, task_internal_error, task_retry, task_success, worker_ready,
task_internal_error,
task_retry,
task_success,
worker_ready
) )
from django.conf import settings from django.conf import settings
@@ -19,6 +17,7 @@ def reset_counters():
def is_enabled() -> bool: def is_enabled() -> bool:
"""Return True if task statistics are enabled, else return False."""
return not bool( return not bool(
getattr(settings, "ALLIANCEAUTH_DASHBOARD_TASK_STATISTICS_DISABLED", False) getattr(settings, "ALLIANCEAUTH_DASHBOARD_TASK_STATISTICS_DISABLED", False)
) )

View File

@@ -4,29 +4,30 @@ from django.test import TestCase
from django.utils.timezone import now from django.utils.timezone import now
from allianceauth.authentication.task_statistics.counters import ( from allianceauth.authentication.task_statistics.counters import (
dashboard_results, dashboard_results, failed_tasks, retried_tasks, succeeded_tasks,
succeeded_tasks,
retried_tasks,
failed_tasks,
) )
class TestDashboardResults(TestCase): class TestDashboardResults(TestCase):
def test_should_return_counts_for_given_timeframe_only(self): def test_should_return_counts_for_given_time_frame_only(self):
# given # given
earliest_task = now() - dt.timedelta(minutes=15) earliest_task = now() - dt.timedelta(minutes=15)
succeeded_tasks.clear() succeeded_tasks.clear()
succeeded_tasks.add(now() - dt.timedelta(hours=1, seconds=1)) succeeded_tasks.add(now() - dt.timedelta(hours=1, seconds=1))
succeeded_tasks.add(earliest_task) succeeded_tasks.add(earliest_task)
succeeded_tasks.add() succeeded_tasks.add()
succeeded_tasks.add() succeeded_tasks.add()
retried_tasks.clear() retried_tasks.clear()
retried_tasks.add(now() - dt.timedelta(hours=1, seconds=1)) retried_tasks.add(now() - dt.timedelta(hours=1, seconds=1))
retried_tasks.add(now() - dt.timedelta(seconds=30)) retried_tasks.add(now() - dt.timedelta(seconds=30))
retried_tasks.add() retried_tasks.add()
failed_tasks.clear() failed_tasks.clear()
failed_tasks.add(now() - dt.timedelta(hours=1, seconds=1)) failed_tasks.add(now() - dt.timedelta(hours=1, seconds=1))
failed_tasks.add() failed_tasks.add()
# when # when
results = dashboard_results(hours=1) results = dashboard_results(hours=1)
# then # then

View File

@@ -1,48 +1,19 @@
import datetime as dt import datetime as dt
from unittest.mock import patch
from pytz import utc from pytz import utc
from redis import RedisError
from django.test import TestCase from django.test import TestCase
from django.utils.timezone import now from django.utils.timezone import now
from allianceauth.authentication.task_statistics.event_series import ( from allianceauth.authentication.task_statistics.event_series import (
EventSeries, EventSeries,
_RedisStub,
) )
from allianceauth.authentication.task_statistics.helpers import _RedisStub
MODULE_PATH = "allianceauth.authentication.task_statistics.event_series" MODULE_PATH = "allianceauth.authentication.task_statistics.event_series"
class TestEventSeries(TestCase): class TestEventSeries(TestCase):
def test_should_abort_without_redis_client(self):
# when
with patch(MODULE_PATH + ".get_redis_client") as mock:
mock.return_value = None
events = EventSeries("dummy")
# then
self.assertTrue(events._redis, _RedisStub)
self.assertTrue(events.is_disabled)
def test_should_disable_itself_if_redis_not_available_1(self):
# when
with patch(MODULE_PATH + ".get_redis_client") as mock_get_master_client:
mock_get_master_client.return_value.ping.side_effect = RedisError
events = EventSeries("dummy")
# then
self.assertIsInstance(events._redis, _RedisStub)
self.assertTrue(events.is_disabled)
def test_should_disable_itself_if_redis_not_available_2(self):
# when
with patch(MODULE_PATH + ".get_redis_client") as mock_get_master_client:
mock_get_master_client.return_value.ping.return_value = False
events = EventSeries("dummy")
# then
self.assertIsInstance(events._redis, _RedisStub)
self.assertTrue(events.is_disabled)
def test_should_add_event(self): def test_should_add_event(self):
# given # given
events = EventSeries("dummy") events = EventSeries("dummy")
@@ -166,3 +137,15 @@ class TestEventSeries(TestCase):
results = events.all() results = events.all()
# then # then
self.assertEqual(len(results), 2) self.assertEqual(len(results), 2)
def test_should_not_report_as_disabled_when_initialized_normally(self):
# given
events = EventSeries("dummy")
# when/then
self.assertFalse(events.is_disabled)
def test_should_report_as_disabled_when_initialized_with_redis_stub(self):
# given
events = EventSeries("dummy", redis=_RedisStub())
# when/then
self.assertTrue(events.is_disabled)

View File

@@ -0,0 +1,28 @@
from unittest import TestCase
from unittest.mock import patch
from redis import RedisError
from allianceauth.authentication.task_statistics.helpers import (
_RedisStub, get_redis_client_or_stub,
)
MODULE_PATH = "allianceauth.authentication.task_statistics.helpers"
class TestGetRedisClient(TestCase):
def test_should_return_mock_if_redis_not_available_1(self):
# when
with patch(MODULE_PATH + ".get_redis_client") as mock_get_master_client:
mock_get_master_client.return_value.ping.side_effect = RedisError
result = get_redis_client_or_stub()
# then
self.assertIsInstance(result, _RedisStub)
def test_should_return_mock_if_redis_not_available_2(self):
# when
with patch(MODULE_PATH + ".get_redis_client") as mock_get_master_client:
mock_get_master_client.return_value.ping.return_value = False
result = get_redis_client_or_stub()
# then
self.assertIsInstance(result, _RedisStub)

View File

@@ -17,16 +17,17 @@ from allianceauth.eveonline.tasks import update_character
@override_settings( @override_settings(
CELERY_ALWAYS_EAGER=True,ALLIANCEAUTH_DASHBOARD_TASK_STATISTICS_DISABLED=False CELERY_ALWAYS_EAGER=True, ALLIANCEAUTH_DASHBOARD_TASK_STATISTICS_DISABLED=False
) )
class TestTaskSignals(TestCase): class TestTaskSignals(TestCase):
fixtures = ["disable_analytics"] fixtures = ["disable_analytics"]
def test_should_record_successful_task(self): def setUp(self) -> None:
# given
succeeded_tasks.clear() succeeded_tasks.clear()
retried_tasks.clear() retried_tasks.clear()
failed_tasks.clear() failed_tasks.clear()
def test_should_record_successful_task(self):
# when # when
with patch( with patch(
"allianceauth.eveonline.tasks.EveCharacter.objects.update_character" "allianceauth.eveonline.tasks.EveCharacter.objects.update_character"
@@ -39,10 +40,6 @@ class TestTaskSignals(TestCase):
self.assertEqual(failed_tasks.count(), 0) self.assertEqual(failed_tasks.count(), 0)
def test_should_record_retried_task(self): def test_should_record_retried_task(self):
# given
succeeded_tasks.clear()
retried_tasks.clear()
failed_tasks.clear()
# when # when
with patch( with patch(
"allianceauth.eveonline.tasks.EveCharacter.objects.update_character" "allianceauth.eveonline.tasks.EveCharacter.objects.update_character"
@@ -55,10 +52,6 @@ class TestTaskSignals(TestCase):
self.assertEqual(retried_tasks.count(), 1) self.assertEqual(retried_tasks.count(), 1)
def test_should_record_failed_task(self): def test_should_record_failed_task(self):
# given
succeeded_tasks.clear()
retried_tasks.clear()
failed_tasks.clear()
# when # when
with patch( with patch(
"allianceauth.eveonline.tasks.EveCharacter.objects.update_character" "allianceauth.eveonline.tasks.EveCharacter.objects.update_character"

View File

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

View File

@@ -6,7 +6,7 @@
{% block page_title %}{% translate "Login" %}{% endblock %} {% block page_title %}{% translate "Login" %}{% endblock %}
{% block middle_box_content %} {% block middle_box_content %}
<a href="{% url 'auth_sso_login' %}{% if request.GET.next %}?next={{request.GET.next}}{%endif%}"> <a href="{% url 'auth_sso_login' %}{% if request.GET.next %}?next={{request.GET.next | urlencode}}{%endif%}">
<img class="img-responsive center-block" src="{% static 'allianceauth/authentication/img/sso/EVE_SSO_Login_Buttons_Large_Black.png' %}" alt="{% translate 'Login with Eve SSO' %}"> <img class="img-responsive center-block" src="{% static 'allianceauth/authentication/img/sso/EVE_SSO_Login_Buttons_Large_Black.png' %}" alt="{% translate 'Login with Eve SSO' %}">
</a> </a>
{% endblock %} {% endblock %}

View File

@@ -0,0 +1,85 @@
from unittest.mock import patch
from amqp.exceptions import ChannelError
from django.test import TestCase
from allianceauth.authentication.core.celery_workers import (
active_tasks_count, queued_tasks_count,
)
MODULE_PATH = "allianceauth.authentication.core.celery_workers"
@patch(MODULE_PATH + ".current_app")
class TestActiveTasksCount(TestCase):
def test_should_return_correct_count_when_no_active_tasks(self, mock_current_app):
# given
mock_current_app.control.inspect.return_value.active.return_value = {
"queue": []
}
# when
result = active_tasks_count()
# then
self.assertEqual(result, 0)
def test_should_return_correct_task_count_for_active_tasks(self, mock_current_app):
# given
mock_current_app.control.inspect.return_value.active.return_value = {
"queue": [1, 2, 3]
}
# when
result = active_tasks_count()
# then
self.assertEqual(result, 3)
def test_should_return_correct_task_count_for_multiple_queues(
self, mock_current_app
):
# given
mock_current_app.control.inspect.return_value.active.return_value = {
"queue_1": [1, 2],
"queue_2": [3, 4],
}
# when
result = active_tasks_count()
# then
self.assertEqual(result, 4)
def test_should_return_none_when_celery_not_available(self, mock_current_app):
# given
mock_current_app.control.inspect.return_value.active.return_value = None
# when
result = active_tasks_count()
# then
self.assertIsNone(result)
@patch(MODULE_PATH + ".current_app")
class TestQueuedTasksCount(TestCase):
def test_should_return_queue_length_when_queue_exists(self, mock_current_app):
# given
mock_conn = (
mock_current_app.connection_or_acquire.return_value.__enter__.return_value
)
mock_conn.default_channel.queue_declare.return_value.message_count = 7
# when
result = queued_tasks_count()
# then
self.assertEqual(result, 7)
def test_should_return_0_when_queue_does_not_exists(self, mock_current_app):
# given
mock_current_app.connection_or_acquire.side_effect = ChannelError
# when
result = queued_tasks_count()
# then
self.assertEqual(result, 0)
def test_should_return_None_on_other_errors(self, mock_current_app):
# given
mock_current_app.connection_or_acquire.side_effect = RuntimeError
# when
result = queued_tasks_count()
# then
self.assertIsNone(result)

View File

@@ -4,16 +4,16 @@ from urllib import parse
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
from django.http.response import HttpResponse from django.http.response import HttpResponse
from django.shortcuts import reverse
from django.test import TestCase from django.test import TestCase
from django.test.client import RequestFactory from django.test.client import RequestFactory
from django.urls import reverse, URLPattern
from allianceauth.eveonline.models import EveCharacter from allianceauth.eveonline.models import EveCharacter
from allianceauth.tests.auth_utils import AuthUtils from allianceauth.tests.auth_utils import AuthUtils
from ..decorators import main_character_required
from ..models import CharacterOwnership
from ..decorators import decorate_url_patterns, main_character_required
from ..models import CharacterOwnership
MODULE_PATH = 'allianceauth.authentication' MODULE_PATH = 'allianceauth.authentication'
@@ -66,3 +66,33 @@ class DecoratorTestCase(TestCase):
setattr(self.request, 'user', self.main_user) setattr(self.request, 'user', self.main_user)
response = self.dummy_view(self.request) response = self.dummy_view(self.request)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
class TestDecorateUrlPatterns(TestCase):
def test_should_add_decorator_by_default(self):
# given
decorator = mock.MagicMock(name="decorator")
view = mock.MagicMock(name="view")
path = mock.MagicMock(spec=URLPattern, name="path")
path.callback = view
path.lookup_str = "my_lookup_str"
urls = [path]
urlconf_module = urls
# when
decorate_url_patterns(urlconf_module, decorator)
# then
self.assertEqual(path.callback, decorator(view))
def test_should_not_add_decorator_when_excluded(self):
# given
decorator = mock.MagicMock(name="decorator")
view = mock.MagicMock(name="view")
path = mock.MagicMock(spec=URLPattern, name="path")
path.callback = view
path.lookup_str = "my_lookup_str"
urls = [path]
urlconf_module = urls
# when
decorate_url_patterns(urlconf_module, decorator, excluded_views=["my_lookup_str"])
# then
self.assertEqual(path.callback, view)

View File

@@ -9,12 +9,8 @@ from django.core.cache import cache
from django.test import TestCase from django.test import TestCase
from allianceauth.templatetags.admin_status import ( from allianceauth.templatetags.admin_status import (
status_overview, _current_notifications, _current_version_summary, _fetch_list_from_gitlab,
_fetch_list_from_gitlab, _fetch_notification_issues_from_gitlab, _latests_versions, status_overview,
_current_notifications,
_current_version_summary,
_fetch_notification_issues_from_gitlab,
_latests_versions
) )
MODULE_PATH = 'allianceauth.templatetags' MODULE_PATH = 'allianceauth.templatetags'
@@ -56,14 +52,10 @@ TEST_VERSION = '2.6.5'
class TestStatusOverviewTag(TestCase): class TestStatusOverviewTag(TestCase):
@patch(MODULE_PATH + '.admin_status.__version__', TEST_VERSION) @patch(MODULE_PATH + '.admin_status.__version__', TEST_VERSION)
@patch(MODULE_PATH + '.admin_status._fetch_celery_queue_length')
@patch(MODULE_PATH + '.admin_status._current_version_summary') @patch(MODULE_PATH + '.admin_status._current_version_summary')
@patch(MODULE_PATH + '.admin_status._current_notifications') @patch(MODULE_PATH + '.admin_status._current_notifications')
def test_status_overview( def test_status_overview(
self, self, mock_current_notifications, mock_current_version_info
mock_current_notifications,
mock_current_version_info,
mock_fetch_celery_queue_length
): ):
# given # given
notifications = { notifications = {
@@ -82,7 +74,6 @@ class TestStatusOverviewTag(TestCase):
'latest_beta_version': '2.4.4a1', 'latest_beta_version': '2.4.4a1',
} }
mock_current_version_info.return_value = version_info mock_current_version_info.return_value = version_info
mock_fetch_celery_queue_length.return_value = 3
# when # when
result = status_overview() result = status_overview()
# then # then
@@ -96,7 +87,6 @@ class TestStatusOverviewTag(TestCase):
self.assertEqual(result["latest_minor_version"], '2.4.0') self.assertEqual(result["latest_minor_version"], '2.4.0')
self.assertEqual(result["latest_patch_version"], '2.4.5') self.assertEqual(result["latest_patch_version"], '2.4.5')
self.assertEqual(result["latest_beta_version"], '2.4.4a1') self.assertEqual(result["latest_beta_version"], '2.4.4a1')
self.assertEqual(result["task_queue_length"], 3)
class TestNotifications(TestCase): class TestNotifications(TestCase):

View File

@@ -0,0 +1,39 @@
import json
from unittest.mock import patch
from django.test import RequestFactory, TestCase
from allianceauth.authentication.views import task_counts
from allianceauth.tests.auth_utils import AuthUtils
MODULE_PATH = "allianceauth.authentication.views"
def jsonresponse_to_dict(response) -> dict:
return json.loads(response.content)
@patch(MODULE_PATH + ".queued_tasks_count")
@patch(MODULE_PATH + ".active_tasks_count")
class TestRunningTasksCount(TestCase):
@classmethod
def setUpClass(cls) -> None:
super().setUpClass()
cls.factory = RequestFactory()
cls.user = AuthUtils.create_user("bruce_wayne")
def test_should_return_data(
self, mock_active_tasks_count, mock_queued_tasks_count
):
# given
mock_active_tasks_count.return_value = 2
mock_queued_tasks_count.return_value = 3
request = self.factory.get("/")
request.user = self.user
# when
response = task_counts(request)
# then
self.assertEqual(response.status_code, 200)
self.assertDictEqual(
jsonresponse_to_dict(response), {"tasks_running": 2, "tasks_queued": 3}
)

View File

@@ -38,4 +38,5 @@ urlpatterns = [
name='token_refresh' name='token_refresh'
), ),
path('dashboard/', views.dashboard, name='dashboard'), path('dashboard/', views.dashboard, name='dashboard'),
path('task-counts/', views.task_counts, name='task_counts'),
] ]

View File

@@ -1,31 +1,31 @@
import logging import logging
from django_registration.backends.activation.views import (
REGISTRATION_SALT, ActivationView as BaseActivationView,
RegistrationView as BaseRegistrationView,
)
from django_registration.signals import user_registered
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.auth import login, authenticate from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core import signing from django.core import signing
from django.core.mail import EmailMultiAlternatives
from django.http import JsonResponse from django.http import JsonResponse
from django.shortcuts import redirect, render from django.shortcuts import redirect, render
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.urls import reverse, reverse_lazy from django.urls import reverse, reverse_lazy
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from allianceauth.eveonline.models import EveCharacter
from esi.decorators import token_required from esi.decorators import token_required
from esi.models import Token from esi.models import Token
from django_registration.backends.activation.views import ( from allianceauth.eveonline.models import EveCharacter
RegistrationView as BaseRegistrationView,
ActivationView as BaseActivationView,
REGISTRATION_SALT
)
from django_registration.signals import user_registered
from .models import CharacterOwnership from .core.celery_workers import active_tasks_count, queued_tasks_count
from .forms import RegistrationForm from .forms import RegistrationForm
from .models import CharacterOwnership
if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS: if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS:
_has_auto_groups = True _has_auto_groups = True
@@ -61,6 +61,7 @@ def dashboard(request):
} }
return render(request, 'authentication/dashboard.html', context) return render(request, 'authentication/dashboard.html', context)
@login_required @login_required
def token_management(request): def token_management(request):
tokens = request.user.token_set.all() tokens = request.user.token_set.all()
@@ -70,6 +71,7 @@ def token_management(request):
} }
return render(request, 'authentication/tokens.html', context) return render(request, 'authentication/tokens.html', context)
@login_required @login_required
def token_delete(request, token_id=None): def token_delete(request, token_id=None):
try: try:
@@ -83,6 +85,7 @@ def token_delete(request, token_id=None):
messages.warning(request, "Token does not exist") messages.warning(request, "Token does not exist")
return redirect('authentication:token_management') return redirect('authentication:token_management')
@login_required @login_required
def token_refresh(request, token_id=None): def token_refresh(request, token_id=None):
try: try:
@@ -127,7 +130,7 @@ def main_character_change(request, token):
def add_character(request, token): def add_character(request, token):
if CharacterOwnership.objects.filter(character__character_id=token.character_id).filter( if CharacterOwnership.objects.filter(character__character_id=token.character_id).filter(
owner_hash=token.character_owner_hash).filter(user=request.user).exists(): owner_hash=token.character_owner_hash).filter(user=request.user).exists():
messages.success(request, _('Added %(name)s to your account.'% ({'name': token.character_name}))) messages.success(request, _('Added %(name)s to your account.' % ({'name': token.character_name})))
else: else:
messages.error(request, _('Failed to add %(name)s to your account: they already have an account.' % ({'name': token.character_name}))) messages.error(request, _('Failed to add %(name)s to your account: they already have an account.' % ({'name': token.character_name})))
return redirect('authentication:dashboard') return redirect('authentication:dashboard')
@@ -168,7 +171,13 @@ def sso_login(request, token):
request.session['registration_uid'] = user.pk request.session['registration_uid'] = user.pk
# Go to Step 2 # Go to Step 2
return redirect('registration_register') return redirect('registration_register')
messages.error(request, _('Unable to authenticate as the selected character.')) # Logging in with an alt is not allowed due to security concerns.
token.delete()
messages.error(
request,
_('Unable to authenticate as the selected character. '
'Please log in with the main character associated with this account.')
)
return redirect(settings.LOGIN_URL) return redirect(settings.LOGIN_URL)
@@ -268,8 +277,11 @@ class ActivationView(BaseActivationView):
def validate_key(self, activation_key): def validate_key(self, activation_key):
try: try:
dump = signing.loads(activation_key, salt=REGISTRATION_SALT, dump = signing.loads(
max_age=settings.ACCOUNT_ACTIVATION_DAYS * 86400) activation_key,
salt=REGISTRATION_SALT,
max_age=settings.ACCOUNT_ACTIVATION_DAYS * 86400
)
return dump return dump
except signing.BadSignature: except signing.BadSignature:
return None return None
@@ -299,3 +311,12 @@ def activation_complete(request):
def registration_closed(request): def registration_closed(request):
messages.error(request, _('Registration of new accounts is not allowed at this time.')) messages.error(request, _('Registration of new accounts is not allowed at this time.'))
return redirect('authentication:login') return redirect('authentication:login')
def task_counts(request) -> JsonResponse:
"""Return task counts as JSON for an AJAX call."""
data = {
"tasks_running": active_tasks_count(),
"tasks_queued": queued_tasks_count()
}
return JsonResponse(data)

View File

@@ -14,6 +14,7 @@ def sync_user_groups(modeladmin, request, queryset):
agc.update_all_states_group_membership() agc.update_all_states_group_membership()
@admin.register(AutogroupsConfig)
class AutogroupsConfigAdmin(admin.ModelAdmin): class AutogroupsConfigAdmin(admin.ModelAdmin):
formfield_overrides = { formfield_overrides = {
models.CharField: {'strip': False} models.CharField: {'strip': False}
@@ -36,6 +37,5 @@ class AutogroupsConfigAdmin(admin.ModelAdmin):
return actions return actions
admin.site.register(AutogroupsConfig, AutogroupsConfigAdmin)
admin.site.register(ManagedCorpGroup) admin.site.register(ManagedCorpGroup)
admin.site.register(ManagedAllianceGroup) admin.site.register(ManagedAllianceGroup)

0
allianceauth/eveonline/views.py Executable file → Normal file
View File

View File

@@ -1,6 +1,10 @@
import functools
from django import forms from django import forms
from django.contrib.auth.models import Group from django.contrib.admin.widgets import FilteredSelectMultiple
from django.contrib.auth.models import Group, User
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db.models.functions import Lower
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@@ -8,6 +12,39 @@ from .models import ReservedGroupName
class GroupAdminForm(forms.ModelForm): class GroupAdminForm(forms.ModelForm):
users = forms.ModelMultipleChoiceField(
queryset=User.objects.order_by(Lower('username')),
required=False,
widget=FilteredSelectMultiple(verbose_name=_("Users"), is_stacked=False),
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance and self.instance.pk:
self.fields["users"].initial = self.instance.user_set.all()
def save(self, commit=True):
group: Group = super().save(commit=False)
if commit:
group.save()
users = self.cleaned_data["users"]
if group.pk:
self._save_m2m_and_users(group, users)
else:
self.save_m2m = functools.partial(
self._save_m2m_and_users, group=group, users=users
)
return group
def _save_m2m_and_users(self, group, users):
"""Save m2m relations incl. users."""
group.user_set.set(users)
self._save_m2m()
def clean_name(self): def clean_name(self):
my_name = self.cleaned_data['name'] my_name = self.cleaned_data['name']
if ReservedGroupName.objects.filter(name__iexact=my_name).exists(): if ReservedGroupName.objects.filter(name__iexact=my_name).exists():

View File

@@ -1,8 +1,7 @@
from typing import Set from typing import Set
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import Group from django.contrib.auth.models import Group, User
from django.contrib.auth.models import User
from django.db import models from django.db import models
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@@ -14,7 +13,7 @@ from allianceauth.notifications import notify
class GroupRequest(models.Model): class GroupRequest(models.Model):
"""Request from a user for joining or leaving a group.""" """Request from a user for joining or leaving a group."""
leave_request = models.BooleanField(default=0) leave_request = models.BooleanField(default=False)
user = models.ForeignKey(User, on_delete=models.CASCADE) user = models.ForeignKey(User, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE) group = models.ForeignKey(Group, on_delete=models.CASCADE)
@@ -49,7 +48,7 @@ class RequestLog(models.Model):
request_type = models.BooleanField(null=True) request_type = models.BooleanField(null=True)
group = models.ForeignKey(Group, on_delete=models.CASCADE) group = models.ForeignKey(Group, on_delete=models.CASCADE)
request_info = models.CharField(max_length=254) request_info = models.CharField(max_length=254)
action = models.BooleanField(default=0) action = models.BooleanField(default=False)
request_actor = models.ForeignKey(User, on_delete=models.CASCADE) request_actor = models.ForeignKey(User, on_delete=models.CASCADE)
date = models.DateTimeField(auto_now_add=True) date = models.DateTimeField(auto_now_add=True)

View File

@@ -29,7 +29,7 @@
</a> </a>
</li> </li>
{% if not auto_leave %} {% if not show_leave_tab %}
<li> <li>
<a data-toggle="tab" href="#leave"> <a data-toggle="tab" href="#leave">
{% translate "Leave Requests" %} {% translate "Leave Requests" %}
@@ -102,7 +102,7 @@
{% endif %} {% endif %}
</div> </div>
{% if not auto_leave %} {% if not show_leave_tab %}
<div id="leave" class="tab-pane"> <div id="leave" class="tab-pane">
{% if leaverequests %} {% if leaverequests %}
<div class="table-responsive"> <div class="table-responsive">

View File

@@ -6,22 +6,22 @@ from django.conf import settings
from django.contrib import admin from django.contrib import admin
from django.contrib.admin.sites import AdminSite from django.contrib.admin.sites import AdminSite
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.test import TestCase, RequestFactory, Client, override_settings from django.test import Client, RequestFactory, TestCase, override_settings
from allianceauth.authentication.models import CharacterOwnership, State from allianceauth.authentication.models import CharacterOwnership, State
from allianceauth.eveonline.models import ( from allianceauth.eveonline.models import (
EveCharacter, EveCorporationInfo, EveAllianceInfo EveAllianceInfo, EveCharacter, EveCorporationInfo,
) )
from allianceauth.tests.auth_utils import AuthUtils from allianceauth.tests.auth_utils import AuthUtils
from . import get_admin_change_view_url from ..admin import Group, GroupAdmin, HasLeaderFilter
from ..admin import HasLeaderFilter, GroupAdmin, Group
from ..models import ReservedGroupName from ..models import ReservedGroupName
from . import get_admin_change_view_url
if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS: if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS:
_has_auto_groups = True _has_auto_groups = True
from allianceauth.eveonline.autogroups.models import AutogroupsConfig from allianceauth.eveonline.autogroups.models import AutogroupsConfig
from ..admin import IsAutoGroupFilter from ..admin import IsAutoGroupFilter
else: else:
_has_auto_groups = False _has_auto_groups = False
@@ -621,21 +621,16 @@ class TestGroupAdmin2(TestCase):
response = self.client.post( response = self.client.post(
f"/admin/groupmanagement/group/{group.pk}/change/", f"/admin/groupmanagement/group/{group.pk}/change/",
data={ data={
"name": f"{group.name}", "name": group.name,
"authgroup-TOTAL_FORMS": "1", "users": [user_member.pk, user_guest.pk],
"authgroup-INITIAL_FORMS": "1", "authgroup-TOTAL_FORMS": 1,
"authgroup-MIN_NUM_FORMS": "0", "authgroup-INITIAL_FORMS": 1,
"authgroup-MAX_NUM_FORMS": "1", "authgroup-MIN_NUM_FORMS": 0,
"authgroup-0-description": "", "authgroup-MAX_NUM_FORMS": 1,
"authgroup-0-states": f"{member_state.pk}", "authgroup-0-states": member_state.pk,
"authgroup-0-internal": "on", "authgroup-0-internal": "on",
"authgroup-0-hidden": "on", "authgroup-0-hidden": "on",
"authgroup-0-group": f"{group.pk}", "authgroup-0-group": group.pk,
"authgroup-__prefix__-description": "",
"authgroup-__prefix__-internal": "on",
"authgroup-__prefix__-hidden": "on",
"authgroup-__prefix__-group": f"{group.pk}",
"_save": "Save"
} }
) )
# then # then
@@ -644,6 +639,85 @@ class TestGroupAdmin2(TestCase):
self.assertIn(group, user_member.groups.all()) self.assertIn(group, user_member.groups.all())
self.assertNotIn(group, user_guest.groups.all()) self.assertNotIn(group, user_guest.groups.all())
def test_should_add_user_to_existing_group(self):
# given
user_bruce = AuthUtils.create_user("Bruce Wayne")
user_lex = AuthUtils.create_user("Lex Luthor")
group = Group.objects.create(name="dummy")
user_bruce.groups.add(group)
self.client.force_login(self.superuser)
# when
response = self.client.post(
f"/admin/groupmanagement/group/{group.pk}/change/",
data={
"name": group.name,
"users": [user_bruce.pk, user_lex.pk],
"authgroup-TOTAL_FORMS": 1,
"authgroup-INITIAL_FORMS": 1,
"authgroup-MIN_NUM_FORMS": 0,
"authgroup-MAX_NUM_FORMS": 1,
"authgroup-0-internal": "on",
"authgroup-0-hidden": "on",
"authgroup-0-group": group.pk,
}
)
# then
self.assertEqual(response.status_code, 302)
self.assertEqual(response.url, "/admin/groupmanagement/group/")
self.assertIn(group, user_bruce.groups.all())
self.assertIn(group, user_lex.groups.all())
def test_should_remove_user_from_existing_group(self):
# given
user_bruce = AuthUtils.create_user("Bruce Wayne")
user_lex = AuthUtils.create_user("Lex Luthor")
group = Group.objects.create(name="dummy")
user_bruce.groups.add(group)
user_lex.groups.add(group)
self.client.force_login(self.superuser)
# when
response = self.client.post(
f"/admin/groupmanagement/group/{group.pk}/change/",
data={
"name": group.name,
"users": user_bruce.pk,
"authgroup-TOTAL_FORMS": 1,
"authgroup-INITIAL_FORMS": 1,
"authgroup-MIN_NUM_FORMS": 0,
"authgroup-MAX_NUM_FORMS": 1,
"authgroup-0-internal": "on",
"authgroup-0-hidden": "on",
"authgroup-0-group": group.pk,
}
)
# then
self.assertEqual(response.status_code, 302)
self.assertEqual(response.url, "/admin/groupmanagement/group/")
self.assertIn(group, user_bruce.groups.all())
self.assertNotIn(group, user_lex.groups.all())
def test_should_include_user_when_creating_group(self):
# given
user_bruce = AuthUtils.create_user("Bruce Wayne")
self.client.force_login(self.superuser)
# when
response = self.client.post(
"/admin/groupmanagement/group/add/",
data={
"name": "new group",
"users": user_bruce.pk,
"authgroup-TOTAL_FORMS": 1,
"authgroup-INITIAL_FORMS": 0,
"authgroup-MIN_NUM_FORMS": 0,
"authgroup-MAX_NUM_FORMS": 1,
}
)
# then
self.assertEqual(response.status_code, 302)
self.assertEqual(response.url, "/admin/groupmanagement/group/")
group = Group.objects.get(name="new group")
self.assertIn(group, user_bruce.groups.all())
class TestReservedGroupNameAdmin(TestCase): class TestReservedGroupNameAdmin(TestCase):
@classmethod @classmethod

View File

@@ -1,6 +1,7 @@
from django.test import RequestFactory, TestCase, override_settings from django.test import RequestFactory, TestCase, override_settings
from django.urls import reverse from django.urls import reverse
from allianceauth.groupmanagement.models import Group, GroupRequest
from allianceauth.tests.auth_utils import AuthUtils from allianceauth.tests.auth_utils import AuthUtils
from .. import views from .. import views
@@ -16,6 +17,7 @@ class TestViews(TestCase):
self.factory = RequestFactory() self.factory = RequestFactory()
self.user = AuthUtils.create_user('Peter Parker') self.user = AuthUtils.create_user('Peter Parker')
self.user_with_manage_permission = AuthUtils.create_user('Bruce Wayne') self.user_with_manage_permission = AuthUtils.create_user('Bruce Wayne')
self.group = Group.objects.create(name="Example group")
# set permissions # set permissions
AuthUtils.add_permission_to_user_by_name( AuthUtils.add_permission_to_user_by_name(
@@ -83,3 +85,19 @@ class TestViews(TestCase):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertNotIn('<a data-toggle="tab" href="#leave">', content) self.assertNotIn('<a data-toggle="tab" href="#leave">', content)
self.assertNotIn('<div id="leave" class="tab-pane">', content) self.assertNotIn('<div id="leave" class="tab-pane">', content)
@override_settings(GROUPMANAGEMENT_AUTO_LEAVE=True)
def test_should_not_hide_leave_requests_tab_when_there_are_open_requests(self):
# given
request = self.factory.get(reverse('groupmanagement:management'))
request.user = self.user_with_manage_permission
GroupRequest.objects.create(user=self.user, group=self.group, leave_request=True)
# when
response = views.group_management(request)
# then
content = response_content_to_str(response)
self.assertEqual(response.status_code, 200)
self.assertIn('<a data-toggle="tab" href="#leave">', content)
self.assertIn('<div id="leave" class="tab-pane">', content)

13
allianceauth/groupmanagement/views.py Executable file → Normal file
View File

@@ -2,13 +2,12 @@ import logging
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required, user_passes_test
from django.contrib.auth.decorators import user_passes_test
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
from django.db.models import Count from django.db.models import Count
from django.http import Http404 from django.http import Http404
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import get_object_or_404, redirect, render
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from allianceauth.notifications import notify from allianceauth.notifications import notify
@@ -16,7 +15,6 @@ from allianceauth.notifications import notify
from .managers import GroupManager from .managers import GroupManager
from .models import GroupRequest, RequestLog from .models import GroupRequest, RequestLog
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -45,10 +43,15 @@ def group_management(request):
logger.debug("Providing user {} with {} acceptrequests and {} leaverequests.".format( logger.debug("Providing user {} with {} acceptrequests and {} leaverequests.".format(
request.user, len(acceptrequests), len(leaverequests))) request.user, len(acceptrequests), len(leaverequests)))
show_leave_tab = (
getattr(settings, 'GROUPMANAGEMENT_AUTO_LEAVE', False)
and not GroupRequest.objects.filter(leave_request=True).exists()
)
render_items = { render_items = {
'acceptrequests': acceptrequests, 'acceptrequests': acceptrequests,
'leaverequests': leaverequests, 'leaverequests': leaverequests,
'auto_leave': getattr(settings, 'GROUPMANAGEMENT_AUTO_LEAVE', False), 'show_leave_tab': show_leave_tab,
} }
return render(request, 'groupmanagement/index.html', context=render_items) return render(request, 'groupmanagement/index.html', context=render_items)

2
allianceauth/hrapplications/admin.py Executable file → Normal file
View File

@@ -10,6 +10,7 @@ class ChoiceInline(admin.TabularInline):
verbose_name_plural = 'Choices (optional)' verbose_name_plural = 'Choices (optional)'
verbose_name= 'Choice' verbose_name= 'Choice'
@admin.register(ApplicationQuestion)
class QuestionAdmin(admin.ModelAdmin): class QuestionAdmin(admin.ModelAdmin):
fieldsets = [ fieldsets = [
(None, {'fields': ['title', 'help_text', 'multi_select']}), (None, {'fields': ['title', 'help_text', 'multi_select']}),
@@ -18,6 +19,5 @@ class QuestionAdmin(admin.ModelAdmin):
admin.site.register(Application) admin.site.register(Application)
admin.site.register(ApplicationComment) admin.site.register(ApplicationComment)
admin.site.register(ApplicationQuestion, QuestionAdmin)
admin.site.register(ApplicationForm) admin.site.register(ApplicationForm)
admin.site.register(ApplicationResponse) admin.site.register(ApplicationResponse)

0
allianceauth/hrapplications/forms.py Executable file → Normal file
View File

0
allianceauth/hrapplications/models.py Executable file → Normal file
View File

18
allianceauth/hrapplications/views.py Executable file → Normal file
View File

@@ -57,7 +57,7 @@ def hr_application_create_view(request, form_id=None):
app_form = get_object_or_404(ApplicationForm, id=form_id) app_form = get_object_or_404(ApplicationForm, id=form_id)
if request.method == "POST": if request.method == "POST":
if Application.objects.filter(user=request.user).filter(form=app_form).exists(): if Application.objects.filter(user=request.user).filter(form=app_form).exists():
logger.warn(f"User {request.user} attempting to duplicate application to {app_form.corp}") logger.warning(f"User {request.user} attempting to duplicate application to {app_form.corp}")
else: else:
application = Application(user=request.user, form=app_form) application = Application(user=request.user, form=app_form)
application.save() application.save()
@@ -92,7 +92,7 @@ def hr_application_personal_view(request, app_id):
} }
return render(request, 'hrapplications/view.html', context=context) return render(request, 'hrapplications/view.html', context=context)
else: else:
logger.warn(f"User {request.user} not authorized to view {app}") logger.warning(f"User {request.user} not authorized to view {app}")
return redirect('hrapplications:personal_view') return redirect('hrapplications:personal_view')
@@ -105,9 +105,9 @@ def hr_application_personal_removal(request, app_id):
logger.info(f"User {request.user} deleting {app}") logger.info(f"User {request.user} deleting {app}")
app.delete() app.delete()
else: else:
logger.warn(f"User {request.user} attempting to delete reviewed app {app}") logger.warning(f"User {request.user} attempting to delete reviewed app {app}")
else: else:
logger.warn(f"User {request.user} not authorized to delete {app}") logger.warning(f"User {request.user} not authorized to delete {app}")
return redirect('hrapplications:index') return redirect('hrapplications:index')
@@ -132,7 +132,7 @@ def hr_application_view(request, app_id):
logger.info(f"Saved comment by user {request.user} to {app}") logger.info(f"Saved comment by user {request.user} to {app}")
return redirect('hrapplications:view', app_id) return redirect('hrapplications:view', app_id)
else: else:
logger.warn("User %s does not have permission to add ApplicationComments" % request.user) logger.warning("User %s does not have permission to add ApplicationComments" % request.user)
return redirect('hrapplications:view', app_id) return redirect('hrapplications:view', app_id)
else: else:
logger.debug("Returning blank HRApplication comment form.") logger.debug("Returning blank HRApplication comment form.")
@@ -171,7 +171,7 @@ def hr_application_approve(request, app_id):
app.save() app.save()
notify(app.user, "Application Accepted", message="Your application to %s has been approved." % app.form.corp, level="success") notify(app.user, "Application Accepted", message="Your application to %s has been approved." % app.form.corp, level="success")
else: else:
logger.warn(f"User {request.user} not authorized to approve {app}") logger.warning(f"User {request.user} not authorized to approve {app}")
return redirect('hrapplications:index') return redirect('hrapplications:index')
@@ -187,7 +187,7 @@ def hr_application_reject(request, app_id):
app.save() app.save()
notify(app.user, "Application Rejected", message="Your application to %s has been rejected." % app.form.corp, level="danger") notify(app.user, "Application Rejected", message="Your application to %s has been rejected." % app.form.corp, level="danger")
else: else:
logger.warn(f"User {request.user} not authorized to reject {app}") logger.warning(f"User {request.user} not authorized to reject {app}")
return redirect('hrapplications:index') return redirect('hrapplications:index')
@@ -208,7 +208,7 @@ def hr_application_search(request):
app_list = app_list.filter( app_list = app_list.filter(
form__corp__corporation_id=request.user.profile.main_character.corporation_id) form__corp__corporation_id=request.user.profile.main_character.corporation_id)
except AttributeError: except AttributeError:
logger.warn( logger.warning(
"User %s missing main character model: unable to filter applications to search" % request.user) "User %s missing main character model: unable to filter applications to search" % request.user)
applications = app_list.filter( applications = app_list.filter(
@@ -246,6 +246,6 @@ def hr_application_mark_in_progress(request, app_id):
app.save() app.save()
notify(app.user, "Application In Progress", message=f"Your application to {app.form.corp} is being reviewed by {app.reviewer_str}") notify(app.user, "Application In Progress", message=f"Your application to {app.form.corp} is being reviewed by {app.reviewer_str}")
else: else:
logger.warn( logger.warning(
f"User {request.user} unable to mark {app} in progress: already being reviewed by {app.reviewer}") f"User {request.user} unable to mark {app} in progress: already being reviewed by {app.reviewer}")
return redirect("hrapplications:view", app_id) return redirect("hrapplications:view", app_id)

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-10-09 18:20+1000\n" "POT-Creation-Date: 2024-02-17 18:50+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -26,7 +26,7 @@ msgstr ""
msgid "Google Analytics V4" msgid "Google Analytics V4"
msgstr "" msgstr ""
#: allianceauth/authentication/decorators.py:37 #: allianceauth/authentication/decorators.py:49
msgid "A main character is required to perform that action. Add one below." msgid "A main character is required to perform that action. Add one below."
msgstr "" msgstr ""
@@ -39,63 +39,68 @@ msgstr ""
msgid "You are not allowed to add or remove these restricted groups: %s" msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:80 #: allianceauth/authentication/models.py:71
msgid "English" msgid "English"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:81 #: allianceauth/authentication/models.py:72
msgid "German" msgid "German"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:82 #: allianceauth/authentication/models.py:73
msgid "Spanish" msgid "Spanish"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:83 #: allianceauth/authentication/models.py:74
msgid "Chinese Simplified" msgid "Chinese Simplified"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:84 #: allianceauth/authentication/models.py:75
msgid "Russian" msgid "Russian"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:85 #: allianceauth/authentication/models.py:76
msgid "Korean" msgid "Korean"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:86 #: allianceauth/authentication/models.py:77
msgid "French" msgid "French"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:87 #: allianceauth/authentication/models.py:78
msgid "Japanese" msgid "Japanese"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:88 #: allianceauth/authentication/models.py:79
msgid "Italian" msgid "Italian"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:91 #: allianceauth/authentication/models.py:80
msgid "Language" msgid "Ukrainian"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:96 #: allianceauth/authentication/models.py:96
msgid "Language"
msgstr ""
#: allianceauth/authentication/models.py:101
#: allianceauth/templates/allianceauth/night-toggle.html:6 #: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode" msgid "Night Mode"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:110 #: allianceauth/authentication/models.py:115
#, python-format #, python-format
msgid "State changed to: %s" msgid "State changed to: %s"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:111 #: allianceauth/authentication/models.py:116
#, python-format #, python-format
msgid "Your user's state is now: %(state)s" msgid "Your user's state is now: %(state)s"
msgstr "" msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:4 #: allianceauth/authentication/templates/authentication/dashboard.html:4
#: allianceauth/authentication/templates/authentication/dashboard.html:7 #: allianceauth/authentication/templates/authentication/dashboard.html:7
#: allianceauth/authentication/templates/authentication/tokens.html:4
#: allianceauth/templates/allianceauth/side-menu.html:10 #: allianceauth/templates/allianceauth/side-menu.html:10
msgid "Dashboard" msgid "Dashboard"
msgstr "" msgstr ""
@@ -151,8 +156,49 @@ msgstr ""
msgid "Alliance" msgid "Alliance"
msgstr "" msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:7
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62
msgid "Token Management"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:12
msgid "Scopes"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:13
#: allianceauth/hrapplications/templates/hrapplications/management.html:28
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:127
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/hrapplications/templates/hrapplications/view.html:73
#: allianceauth/srp/templates/srp/data.html:101
#: allianceauth/srp/templates/srp/management.html:44
msgid "Actions"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:14
#: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112
#: allianceauth/corputils/templates/corputils/corpstats.html:156
#: allianceauth/corputils/templates/corputils/search.html:13
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:26
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
msgid "Character"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:28
msgid ""
"This page is a best attempt, but backups or database logs can still contain "
"your tokens. Always revoke tokens on https://community.eveonline.com/support/"
"third-party-applications/ where possible."
msgstr ""
#: allianceauth/authentication/templates/public/login.html:6 #: allianceauth/authentication/templates/public/login.html:6
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:58 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:69
msgid "Login" msgid "Login"
msgstr "" msgstr ""
@@ -184,47 +230,49 @@ msgstr ""
msgid "Invalid or expired activation link." msgid "Invalid or expired activation link."
msgstr "" msgstr ""
#: allianceauth/authentication/views.py:77 #: allianceauth/authentication/views.py:118
#, python-format #, python-format
msgid "" msgid ""
"Cannot change main character to %(char)s: character owned by a different " "Cannot change main character to %(char)s: character owned by a different "
"account." "account."
msgstr "" msgstr ""
#: allianceauth/authentication/views.py:83 #: allianceauth/authentication/views.py:124
#, python-format #, python-format
msgid "Changed main character to %(char)s" msgid "Changed main character to %(char)s"
msgstr "" msgstr ""
#: allianceauth/authentication/views.py:92 #: allianceauth/authentication/views.py:133
#, python-format #, python-format
msgid "Added %(name)s to your account." msgid "Added %(name)s to your account."
msgstr "" msgstr ""
#: allianceauth/authentication/views.py:94 #: allianceauth/authentication/views.py:135
#, python-format #, python-format
msgid "Failed to add %(name)s to your account: they already have an account." msgid "Failed to add %(name)s to your account: they already have an account."
msgstr "" msgstr ""
#: allianceauth/authentication/views.py:133 #: allianceauth/authentication/views.py:178
msgid "Unable to authenticate as the selected character." msgid ""
"Unable to authenticate as the selected character. Please log in with the "
"main character associated with this account."
msgstr "" msgstr ""
#: allianceauth/authentication/views.py:197 #: allianceauth/authentication/views.py:244
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "" msgstr ""
#: allianceauth/authentication/views.py:252 #: allianceauth/authentication/views.py:302
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
msgstr "" msgstr ""
#: allianceauth/authentication/views.py:257 #: allianceauth/authentication/views.py:307
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "" msgstr ""
#: allianceauth/authentication/views.py:262 #: allianceauth/authentication/views.py:312
msgid "Registration of new accounts is not allowed at this time." msgid "Registration of new accounts is not allowed at this time."
msgstr "" msgstr ""
@@ -267,19 +315,6 @@ msgstr ""
msgid "Last update:" msgid "Last update:"
msgstr "" msgstr ""
#: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112
#: allianceauth/corputils/templates/corputils/corpstats.html:156
#: allianceauth/corputils/templates/corputils/search.html:13
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:26
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
msgid "Character"
msgstr ""
#: allianceauth/corputils/templates/corputils/corpstats.html:75 #: allianceauth/corputils/templates/corputils/corpstats.html:75
#: allianceauth/corputils/templates/corputils/search.html:14 #: allianceauth/corputils/templates/corputils/search.html:14
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
@@ -611,36 +646,41 @@ msgstr ""
msgid "Group Management" msgid "Group Management"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/forms.py:15 #: allianceauth/groupmanagement/forms.py:18
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35
msgid "Users"
msgstr ""
#: allianceauth/groupmanagement/forms.py:52
msgid "This name has been reserved and can not be used for groups." msgid "This name has been reserved and can not be used for groups."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/forms.py:25 #: allianceauth/groupmanagement/forms.py:62
msgid "(auto)" msgid "(auto)"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/forms.py:34 #: allianceauth/groupmanagement/forms.py:71
msgid "There already exists a group with that name." msgid "There already exists a group with that name."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:105 #: allianceauth/groupmanagement/models.py:104
msgid "" msgid ""
"Internal group, users cannot see, join or request to join this group." "Internal group, users cannot see, join or request to join this group."
"<br>Used for groups such as Members, Corp_*, Alliance_* etc.<br><b>Overrides " "<br>Used for groups such as Members, Corp_*, Alliance_* etc.<br><b>Overrides "
"Hidden and Open options when selected.</b>" "Hidden and Open options when selected.</b>"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:113 #: allianceauth/groupmanagement/models.py:112
msgid "Group is hidden from users but can still join with the correct link." msgid "Group is hidden from users but can still join with the correct link."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:119 #: allianceauth/groupmanagement/models.py:118
msgid "" msgid ""
"Group is open and users will be automatically added upon request.<br>If the " "Group is open and users will be automatically added upon request.<br>If the "
"group is not open users will need their request manually approved." "group is not open users will need their request manually approved."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:126 #: allianceauth/groupmanagement/models.py:125
msgid "" msgid ""
"Group is public. Any registered user is able to join this group, with " "Group is public. Any registered user is able to join this group, with "
"visibility based on the other options set for this group.<br>Auth will not " "visibility based on the other options set for this group.<br>Auth will not "
@@ -648,65 +688,65 @@ msgid ""
"authenticated." "authenticated."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:135 #: allianceauth/groupmanagement/models.py:134
msgid "" msgid ""
"Group is restricted. This means that adding or removing users for this group " "Group is restricted. This means that adding or removing users for this group "
"requires a superuser admin." "requires a superuser admin."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:144 #: allianceauth/groupmanagement/models.py:143
msgid "" msgid ""
"Group leaders can process requests for this group. Use the <code>auth." "Group leaders can process requests for this group. Use the <code>auth."
"group_management</code> permission to allow a user to manage all groups.<br>" "group_management</code> permission to allow a user to manage all groups.<br>"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:154 #: allianceauth/groupmanagement/models.py:153
msgid "" msgid ""
"Members of leader groups can process requests for this group. Use the " "Members of leader groups can process requests for this group. Use the "
"<code>auth.group_management</code> permission to allow a user to manage all " "<code>auth.group_management</code> permission to allow a user to manage all "
"groups.<br>" "groups.<br>"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:163 #: allianceauth/groupmanagement/models.py:162
msgid "" msgid ""
"States listed here will have the ability to join this group provided they " "States listed here will have the ability to join this group provided they "
"have the proper permissions.<br>" "have the proper permissions.<br>"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:171 #: allianceauth/groupmanagement/models.py:170
msgid "" msgid ""
"Short description <i>(max. 512 characters)</i> of the group shown to users." "Short description <i>(max. 512 characters)</i> of the group shown to users."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:178 #: allianceauth/groupmanagement/models.py:177
msgid "Can request non-public groups" msgid "Can request non-public groups"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:209 #: allianceauth/groupmanagement/models.py:208
msgid "name" msgid "name"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:212 #: allianceauth/groupmanagement/models.py:211
msgid "Name that can not be used for groups." msgid "Name that can not be used for groups."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:215 #: allianceauth/groupmanagement/models.py:214
msgid "reason" msgid "reason"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:215 #: allianceauth/groupmanagement/models.py:214
msgid "Reason why this name is reserved." msgid "Reason why this name is reserved."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:218 #: allianceauth/groupmanagement/models.py:217
msgid "created by" msgid "created by"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:223 #: allianceauth/groupmanagement/models.py:222
msgid "created at" msgid "created at"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:223 #: allianceauth/groupmanagement/models.py:222
msgid "Date when this entry was created" msgid "Date when this entry was created"
msgstr "" msgstr ""
@@ -933,86 +973,86 @@ msgstr ""
msgid "Group Membership" msgid "Group Membership"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:163 #: allianceauth/groupmanagement/views.py:166
#, python-format #, python-format
msgid "Removed user %(user)s from group %(group)s." msgid "Removed user %(user)s from group %(group)s."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:165 #: allianceauth/groupmanagement/views.py:168
msgid "User does not exist in that group" msgid "User does not exist in that group"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:168 #: allianceauth/groupmanagement/views.py:171
msgid "Group does not exist" msgid "Group does not exist"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:195 #: allianceauth/groupmanagement/views.py:198
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to %(group)s." msgid "Accepted application from %(mainchar)s to %(group)s."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:201 #: allianceauth/groupmanagement/views.py:204
#: allianceauth/groupmanagement/views.py:232 #: allianceauth/groupmanagement/views.py:235
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
"%(mainchar)s to %(group)s." "%(mainchar)s to %(group)s."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:226 #: allianceauth/groupmanagement/views.py:229
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to %(group)s." msgid "Rejected application from %(mainchar)s to %(group)s."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:261 #: allianceauth/groupmanagement/views.py:264
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to leave %(group)s." msgid "Accepted application from %(mainchar)s to leave %(group)s."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:266 #: allianceauth/groupmanagement/views.py:269
#: allianceauth/groupmanagement/views.py:298 #: allianceauth/groupmanagement/views.py:301
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
"%(mainchar)s to leave %(group)s." "%(mainchar)s to leave %(group)s."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:292 #: allianceauth/groupmanagement/views.py:295
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to leave %(group)s." msgid "Rejected application from %(mainchar)s to leave %(group)s."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:336 #: allianceauth/groupmanagement/views.py:339
#: allianceauth/groupmanagement/views.py:346 #: allianceauth/groupmanagement/views.py:349
msgid "You cannot join that group" msgid "You cannot join that group"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:341 #: allianceauth/groupmanagement/views.py:344
msgid "You are already a member of that group." msgid "You are already a member of that group."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:358 #: allianceauth/groupmanagement/views.py:361
msgid "You already have a pending application for that group." msgid "You already have a pending application for that group."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:367 #: allianceauth/groupmanagement/views.py:370
#, python-format #, python-format
msgid "Applied to group %(group)s." msgid "Applied to group %(group)s."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:377 #: allianceauth/groupmanagement/views.py:380
msgid "You cannot leave that group" msgid "You cannot leave that group"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:381 #: allianceauth/groupmanagement/views.py:384
msgid "You are not a member of that group" msgid "You are not a member of that group"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:393 #: allianceauth/groupmanagement/views.py:396
msgid "You already have a pending leave request for that group." msgid "You already have a pending leave request for that group."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:409 #: allianceauth/groupmanagement/views.py:412
#, python-format #, python-format
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "" msgstr ""
@@ -1074,16 +1114,6 @@ msgstr ""
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/management.html:28
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:127
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/hrapplications/templates/hrapplications/view.html:73
#: allianceauth/srp/templates/srp/data.html:101
#: allianceauth/srp/templates/srp/management.html:44
msgid "Actions"
msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/management.html:38 #: allianceauth/hrapplications/templates/hrapplications/management.html:38
#: allianceauth/hrapplications/templates/hrapplications/management.html:99 #: allianceauth/hrapplications/templates/hrapplications/management.html:99
#: allianceauth/hrapplications/templates/hrapplications/management.html:143 #: allianceauth/hrapplications/templates/hrapplications/management.html:143
@@ -1422,10 +1452,6 @@ msgstr ""
msgid "Code Name" msgid "Code Name"
msgstr "" msgstr ""
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35
msgid "Users"
msgstr ""
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41
msgid "States" msgid "States"
msgstr "" msgstr ""
@@ -2146,11 +2172,11 @@ msgid ""
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:95 #: allianceauth/templates/allianceauth/admin-status/overview.html:95
#, python-format msgid "running"
msgid "" msgstr ""
"\n"
" %(queue_length)s queued tasks\n" #: allianceauth/templates/allianceauth/admin-status/overview.html:96
" " msgid "queued"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/top-menu-admin.html:9 #: allianceauth/templates/allianceauth/top-menu-admin.html:9
@@ -2166,11 +2192,11 @@ msgid "AA Support Discord"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:14 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:16
msgid "User Menu" msgid "User Menu"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:56 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:67
msgid "Logout" msgid "Logout"
msgstr "" msgstr ""
@@ -2226,22 +2252,30 @@ msgid "Objective"
msgstr "" msgstr ""
#: allianceauth/timerboard/form.py:64 #: allianceauth/timerboard/form.py:64
msgid "Days Remaining" msgid "Absolute Timer"
msgstr "" msgstr ""
#: allianceauth/timerboard/form.py:65 #: allianceauth/timerboard/form.py:65
msgid "Hours Remaining" msgid "Date and Time"
msgstr ""
#: allianceauth/timerboard/form.py:66
msgid "Days Remaining"
msgstr "" msgstr ""
#: allianceauth/timerboard/form.py:67 #: allianceauth/timerboard/form.py:67
msgid "Minutes Remaining" msgid "Hours Remaining"
msgstr "" msgstr ""
#: allianceauth/timerboard/form.py:69 #: allianceauth/timerboard/form.py:69
msgid "Minutes Remaining"
msgstr ""
#: allianceauth/timerboard/form.py:71
msgid "Important" msgid "Important"
msgstr "" msgstr ""
#: allianceauth/timerboard/form.py:70 #: allianceauth/timerboard/form.py:72
msgid "Corp-Restricted" msgid "Corp-Restricted"
msgstr "" msgstr ""

View File

@@ -4,10 +4,10 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
# Translators: # Translators:
# frank1210 <francolopez_16@hotmail.com>, 2021
# Joel Falknau <ozirascal@gmail.com>, 2021
# Young Anexo, 2023
# Fegpawn Kaundur, 2023 # Fegpawn Kaundur, 2023
# frank1210 <francolopez_16@hotmail.com>, 2023
# Young Anexo, 2023
# Joel Falknau <ozirascal@gmail.com>, 2023
# trenus, 2023 # trenus, 2023
# #
#, fuzzy #, fuzzy
@@ -15,8 +15,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-10-09 18:20+1000\n" "POT-Creation-Date: 2024-02-17 18:50+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: trenus, 2023\n" "Last-Translator: trenus, 2023\n"
"Language-Team: Spanish (https://app.transifex.com/alliance-auth/teams/107430/es/)\n" "Language-Team: Spanish (https://app.transifex.com/alliance-auth/teams/107430/es/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -33,7 +33,7 @@ msgstr "Google Analytics Universal"
msgid "Google Analytics V4" msgid "Google Analytics V4"
msgstr "Google Analytics V4" msgstr "Google Analytics V4"
#: allianceauth/authentication/decorators.py:37 #: allianceauth/authentication/decorators.py:49
msgid "A main character is required to perform that action. Add one below." msgid "A main character is required to perform that action. Add one below."
msgstr "" msgstr ""
"Se necesita un personaje principal para realizar esa acción. Añade uno a " "Se necesita un personaje principal para realizar esa acción. Añade uno a "
@@ -48,63 +48,68 @@ msgstr "E-mail"
msgid "You are not allowed to add or remove these restricted groups: %s" msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr "No puedes añadir o eliminar estos grupos restringidos: %s" msgstr "No puedes añadir o eliminar estos grupos restringidos: %s"
#: allianceauth/authentication/models.py:80 #: allianceauth/authentication/models.py:71
msgid "English" msgid "English"
msgstr "Inglés" msgstr "Inglés"
#: allianceauth/authentication/models.py:81 #: allianceauth/authentication/models.py:72
msgid "German" msgid "German"
msgstr "Alemán" msgstr "Alemán"
#: allianceauth/authentication/models.py:82 #: allianceauth/authentication/models.py:73
msgid "Spanish" msgid "Spanish"
msgstr "Español" msgstr "Español"
#: allianceauth/authentication/models.py:83 #: allianceauth/authentication/models.py:74
msgid "Chinese Simplified" msgid "Chinese Simplified"
msgstr "Chino Simplificado" msgstr "Chino Simplificado"
#: allianceauth/authentication/models.py:84 #: allianceauth/authentication/models.py:75
msgid "Russian" msgid "Russian"
msgstr "Ruso" msgstr "Ruso"
#: allianceauth/authentication/models.py:85 #: allianceauth/authentication/models.py:76
msgid "Korean" msgid "Korean"
msgstr "Coreano" msgstr "Coreano"
#: allianceauth/authentication/models.py:86 #: allianceauth/authentication/models.py:77
msgid "French" msgid "French"
msgstr "Francés" msgstr "Francés"
#: allianceauth/authentication/models.py:87 #: allianceauth/authentication/models.py:78
msgid "Japanese" msgid "Japanese"
msgstr "Japonés" msgstr "Japonés"
#: allianceauth/authentication/models.py:88 #: allianceauth/authentication/models.py:79
msgid "Italian" msgid "Italian"
msgstr "Italiano" msgstr "Italiano"
#: allianceauth/authentication/models.py:91 #: allianceauth/authentication/models.py:80
msgid "Ukrainian"
msgstr ""
#: allianceauth/authentication/models.py:96
msgid "Language" msgid "Language"
msgstr "Idioma" msgstr "Idioma"
#: allianceauth/authentication/models.py:96 #: allianceauth/authentication/models.py:101
#: allianceauth/templates/allianceauth/night-toggle.html:6 #: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode" msgid "Night Mode"
msgstr "Modo Nocturno" msgstr "Modo Nocturno"
#: allianceauth/authentication/models.py:110 #: allianceauth/authentication/models.py:115
#, python-format #, python-format
msgid "State changed to: %s" msgid "State changed to: %s"
msgstr "Estado cambiado a: %s" msgstr "Estado cambiado a: %s"
#: allianceauth/authentication/models.py:111 #: allianceauth/authentication/models.py:116
#, python-format #, python-format
msgid "Your user's state is now: %(state)s" msgid "Your user's state is now: %(state)s"
msgstr "El estado de su usuario es ahora: %(state)s" msgstr "El estado de su usuario es ahora: %(state)s"
#: allianceauth/authentication/templates/authentication/dashboard.html:4 #: allianceauth/authentication/templates/authentication/dashboard.html:4
#: allianceauth/authentication/templates/authentication/dashboard.html:7 #: allianceauth/authentication/templates/authentication/dashboard.html:7
#: allianceauth/authentication/templates/authentication/tokens.html:4
#: allianceauth/templates/allianceauth/side-menu.html:10 #: allianceauth/templates/allianceauth/side-menu.html:10
msgid "Dashboard" msgid "Dashboard"
msgstr "Página principal" msgstr "Página principal"
@@ -162,8 +167,50 @@ msgstr "Corporación"
msgid "Alliance" msgid "Alliance"
msgstr "Allianza" msgstr "Allianza"
#: allianceauth/authentication/templates/authentication/tokens.html:7
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62
msgid "Token Management"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:12
msgid "Scopes"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:13
#: allianceauth/hrapplications/templates/hrapplications/management.html:28
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:127
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/hrapplications/templates/hrapplications/view.html:73
#: allianceauth/srp/templates/srp/data.html:101
#: allianceauth/srp/templates/srp/management.html:44
msgid "Actions"
msgstr "Acciones"
#: allianceauth/authentication/templates/authentication/tokens.html:14
#: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112
#: allianceauth/corputils/templates/corputils/corpstats.html:156
#: allianceauth/corputils/templates/corputils/search.html:13
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:26
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
msgid "Character"
msgstr "Personaje"
#: allianceauth/authentication/templates/authentication/tokens.html:28
msgid ""
"This page is a best attempt, but backups or database logs can still contain "
"your tokens. Always revoke tokens on "
"https://community.eveonline.com/support/third-party-applications/ where "
"possible."
msgstr ""
#: allianceauth/authentication/templates/public/login.html:6 #: allianceauth/authentication/templates/public/login.html:6
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:58 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:69
msgid "Login" msgid "Login"
msgstr "Ingresar" msgstr "Ingresar"
@@ -197,7 +244,7 @@ msgstr "Registrar"
msgid "Invalid or expired activation link." msgid "Invalid or expired activation link."
msgstr "Enlace de activacion expirado o invalido" msgstr "Enlace de activacion expirado o invalido"
#: allianceauth/authentication/views.py:77 #: allianceauth/authentication/views.py:118
#, python-format #, python-format
msgid "" msgid ""
"Cannot change main character to %(char)s: character owned by a different " "Cannot change main character to %(char)s: character owned by a different "
@@ -206,45 +253,47 @@ msgstr ""
"No se puede cambiar de personaje principal a %(char)s: personaje " "No se puede cambiar de personaje principal a %(char)s: personaje "
"perteneciente a otra cuenta." "perteneciente a otra cuenta."
#: allianceauth/authentication/views.py:83 #: allianceauth/authentication/views.py:124
#, python-format #, python-format
msgid "Changed main character to %(char)s" msgid "Changed main character to %(char)s"
msgstr "Se ha cambiado tu personaje principal ha %(char)s" msgstr "Se ha cambiado tu personaje principal ha %(char)s"
#: allianceauth/authentication/views.py:92 #: allianceauth/authentication/views.py:133
#, python-format #, python-format
msgid "Added %(name)s to your account." msgid "Added %(name)s to your account."
msgstr "Se ha agregado a %(name)s a tu cuenta" msgstr "Se ha agregado a %(name)s a tu cuenta"
#: allianceauth/authentication/views.py:94 #: allianceauth/authentication/views.py:135
#, python-format #, python-format
msgid "Failed to add %(name)s to your account: they already have an account." msgid "Failed to add %(name)s to your account: they already have an account."
msgstr "" msgstr ""
"Se fallo en agregar a %(name)s a tu cuenta: Ya se encuentra registrado en " "Se fallo en agregar a %(name)s a tu cuenta: Ya se encuentra registrado en "
"otra cuenta." "otra cuenta."
#: allianceauth/authentication/views.py:133 #: allianceauth/authentication/views.py:178
msgid "Unable to authenticate as the selected character." msgid ""
msgstr "Imposible validar con el personaje seleccionado." "Unable to authenticate as the selected character. Please log in with the "
"main character associated with this account."
msgstr ""
#: allianceauth/authentication/views.py:197 #: allianceauth/authentication/views.py:244
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "El token de registracion expiro." msgstr "El token de registracion expiro."
#: allianceauth/authentication/views.py:252 #: allianceauth/authentication/views.py:302
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
msgstr "" msgstr ""
"Confirmacion de mail enviada. Por favor siga el enlace para confirmar " "Confirmacion de mail enviada. Por favor siga el enlace para confirmar "
#: allianceauth/authentication/views.py:257 #: allianceauth/authentication/views.py:307
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "" msgstr ""
"Se ha confirmado su direccion de mail. Por favor igrese su token para " "Se ha confirmado su direccion de mail. Por favor igrese su token para "
"continuar." "continuar."
#: allianceauth/authentication/views.py:262 #: allianceauth/authentication/views.py:312
msgid "Registration of new accounts is not allowed at this time." msgid "Registration of new accounts is not allowed at this time."
msgstr "En este momento no se permite el registro de nuevas cuentas." msgstr "En este momento no se permite el registro de nuevas cuentas."
@@ -287,19 +336,6 @@ msgstr "Sin registro"
msgid "Last update:" msgid "Last update:"
msgstr "Ultima Actualizacion:" msgstr "Ultima Actualizacion:"
#: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112
#: allianceauth/corputils/templates/corputils/corpstats.html:156
#: allianceauth/corputils/templates/corputils/search.html:13
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:26
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
msgid "Character"
msgstr "Personaje"
#: allianceauth/corputils/templates/corputils/corpstats.html:75 #: allianceauth/corputils/templates/corputils/corpstats.html:75
#: allianceauth/corputils/templates/corputils/search.html:14 #: allianceauth/corputils/templates/corputils/search.html:14
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
@@ -636,19 +672,24 @@ msgstr ""
msgid "Group Management" msgid "Group Management"
msgstr "Manejo de Grupo" msgstr "Manejo de Grupo"
#: allianceauth/groupmanagement/forms.py:15 #: allianceauth/groupmanagement/forms.py:18
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35
msgid "Users"
msgstr "Usuarios"
#: allianceauth/groupmanagement/forms.py:52
msgid "This name has been reserved and can not be used for groups." msgid "This name has been reserved and can not be used for groups."
msgstr "Este nombre ha sido reservado y no puede utilizarse para grupos." msgstr "Este nombre ha sido reservado y no puede utilizarse para grupos."
#: allianceauth/groupmanagement/forms.py:25 #: allianceauth/groupmanagement/forms.py:62
msgid "(auto)" msgid "(auto)"
msgstr "(auto)" msgstr "(auto)"
#: allianceauth/groupmanagement/forms.py:34 #: allianceauth/groupmanagement/forms.py:71
msgid "There already exists a group with that name." msgid "There already exists a group with that name."
msgstr "Ya existe un grupo con ese nombre." msgstr "Ya existe un grupo con ese nombre."
#: allianceauth/groupmanagement/models.py:105 #: allianceauth/groupmanagement/models.py:104
msgid "" msgid ""
"Internal group, users cannot see, join or request to join this " "Internal group, users cannot see, join or request to join this "
"group.<br>Used for groups such as Members, Corp_*, Alliance_* " "group.<br>Used for groups such as Members, Corp_*, Alliance_* "
@@ -658,13 +699,13 @@ msgstr ""
"grupo.<br>Se utiliza para grupos como Miembros, Corp_*, Alliance_*, " "grupo.<br>Se utiliza para grupos como Miembros, Corp_*, Alliance_*, "
"etc.<br><b>Anula las opciones Oculto y Abierto cuando se selecciona.</b>" "etc.<br><b>Anula las opciones Oculto y Abierto cuando se selecciona.</b>"
#: allianceauth/groupmanagement/models.py:113 #: allianceauth/groupmanagement/models.py:112
msgid "Group is hidden from users but can still join with the correct link." msgid "Group is hidden from users but can still join with the correct link."
msgstr "" msgstr ""
"El grupo está oculto para los usuarios, pero aún pueden unirse con el enlace" "El grupo está oculto para los usuarios, pero aún pueden unirse con el enlace"
" correcto." " correcto."
#: allianceauth/groupmanagement/models.py:119 #: allianceauth/groupmanagement/models.py:118
msgid "" msgid ""
"Group is open and users will be automatically added upon request.<br>If the " "Group is open and users will be automatically added upon request.<br>If the "
"group is not open users will need their request manually approved." "group is not open users will need their request manually approved."
@@ -673,7 +714,7 @@ msgstr ""
"soliciten.<br>Si el grupo no está abierto, los usuarios necesitarán que su " "soliciten.<br>Si el grupo no está abierto, los usuarios necesitarán que su "
"solicitud sea aprobada manualmente." "solicitud sea aprobada manualmente."
#: allianceauth/groupmanagement/models.py:126 #: allianceauth/groupmanagement/models.py:125
msgid "" msgid ""
"Group is public. Any registered user is able to join this group, with " "Group is public. Any registered user is able to join this group, with "
"visibility based on the other options set for this group.<br>Auth will not " "visibility based on the other options set for this group.<br>Auth will not "
@@ -685,7 +726,7 @@ msgstr ""
"grupo.<br>Auth no eliminará automáticamente a los usuarios de este grupo " "grupo.<br>Auth no eliminará automáticamente a los usuarios de este grupo "
"cuando ya no estén autenticados." "cuando ya no estén autenticados."
#: allianceauth/groupmanagement/models.py:135 #: allianceauth/groupmanagement/models.py:134
msgid "" msgid ""
"Group is restricted. This means that adding or removing users for this group" "Group is restricted. This means that adding or removing users for this group"
" requires a superuser admin." " requires a superuser admin."
@@ -693,7 +734,7 @@ msgstr ""
"El grupo está restringido. Esto significa que para añadir o eliminar " "El grupo está restringido. Esto significa que para añadir o eliminar "
"usuarios de este grupo se requiere un superusuario administrador." "usuarios de este grupo se requiere un superusuario administrador."
#: allianceauth/groupmanagement/models.py:144 #: allianceauth/groupmanagement/models.py:143
msgid "" msgid ""
"Group leaders can process requests for this group. Use the " "Group leaders can process requests for this group. Use the "
"<code>auth.group_management</code> permission to allow a user to manage all " "<code>auth.group_management</code> permission to allow a user to manage all "
@@ -703,7 +744,7 @@ msgstr ""
" permiso <code>auth.group_management</code> para permitir que un usuario " " permiso <code>auth.group_management</code> para permitir que un usuario "
"gestione todos los grupos.<br>" "gestione todos los grupos.<br>"
#: allianceauth/groupmanagement/models.py:154 #: allianceauth/groupmanagement/models.py:153
msgid "" msgid ""
"Members of leader groups can process requests for this group. Use the " "Members of leader groups can process requests for this group. Use the "
"<code>auth.group_management</code> permission to allow a user to manage all " "<code>auth.group_management</code> permission to allow a user to manage all "
@@ -713,7 +754,7 @@ msgstr ""
"grupo. Utilice el <code>permiso auth.group_management</code> para permitir " "grupo. Utilice el <code>permiso auth.group_management</code> para permitir "
"que un usuario gestione todos los grupos.<br>" "que un usuario gestione todos los grupos.<br>"
#: allianceauth/groupmanagement/models.py:163 #: allianceauth/groupmanagement/models.py:162
msgid "" msgid ""
"States listed here will have the ability to join this group provided they " "States listed here will have the ability to join this group provided they "
"have the proper permissions.<br>" "have the proper permissions.<br>"
@@ -721,42 +762,42 @@ msgstr ""
"Los estados que figuren en esta lista podrán unirse a este grupo siempre que" "Los estados que figuren en esta lista podrán unirse a este grupo siempre que"
" dispongan de los permisos adecuados.<br>" " dispongan de los permisos adecuados.<br>"
#: allianceauth/groupmanagement/models.py:171 #: allianceauth/groupmanagement/models.py:170
msgid "" msgid ""
"Short description <i>(max. 512 characters)</i> of the group shown to users." "Short description <i>(max. 512 characters)</i> of the group shown to users."
msgstr "" msgstr ""
"Breve descripción <i>(máx. 512 caracteres)</i> del grupo que se muestra a " "Breve descripción <i>(máx. 512 caracteres)</i> del grupo que se muestra a "
"los usuarios." "los usuarios."
#: allianceauth/groupmanagement/models.py:178 #: allianceauth/groupmanagement/models.py:177
msgid "Can request non-public groups" msgid "Can request non-public groups"
msgstr "Se pueden solicitar grupos no públicos" msgstr "Se pueden solicitar grupos no públicos"
#: allianceauth/groupmanagement/models.py:209 #: allianceauth/groupmanagement/models.py:208
msgid "name" msgid "name"
msgstr "nombre" msgstr "nombre"
#: allianceauth/groupmanagement/models.py:212 #: allianceauth/groupmanagement/models.py:211
msgid "Name that can not be used for groups." msgid "Name that can not be used for groups."
msgstr "Nombre que no se puede utilizar para los grupos." msgstr "Nombre que no se puede utilizar para los grupos."
#: allianceauth/groupmanagement/models.py:215 #: allianceauth/groupmanagement/models.py:214
msgid "reason" msgid "reason"
msgstr "razón" msgstr "razón"
#: allianceauth/groupmanagement/models.py:215 #: allianceauth/groupmanagement/models.py:214
msgid "Reason why this name is reserved." msgid "Reason why this name is reserved."
msgstr "Razón por la que este nombre está reservado." msgstr "Razón por la que este nombre está reservado."
#: allianceauth/groupmanagement/models.py:218 #: allianceauth/groupmanagement/models.py:217
msgid "created by" msgid "created by"
msgstr "creado por" msgstr "creado por"
#: allianceauth/groupmanagement/models.py:223 #: allianceauth/groupmanagement/models.py:222
msgid "created at" msgid "created at"
msgstr "creado en" msgstr "creado en"
#: allianceauth/groupmanagement/models.py:223 #: allianceauth/groupmanagement/models.py:222
msgid "Date when this entry was created" msgid "Date when this entry was created"
msgstr "Fecha de creación de esta entrada" msgstr "Fecha de creación de esta entrada"
@@ -983,26 +1024,26 @@ msgstr "Solicitudes de Grupo"
msgid "Group Membership" msgid "Group Membership"
msgstr "Membresia de Grupo" msgstr "Membresia de Grupo"
#: allianceauth/groupmanagement/views.py:163 #: allianceauth/groupmanagement/views.py:166
#, python-format #, python-format
msgid "Removed user %(user)s from group %(group)s." msgid "Removed user %(user)s from group %(group)s."
msgstr "El usuario %(user)s fue removido del grupo %(group)s" msgstr "El usuario %(user)s fue removido del grupo %(group)s"
#: allianceauth/groupmanagement/views.py:165 #: allianceauth/groupmanagement/views.py:168
msgid "User does not exist in that group" msgid "User does not exist in that group"
msgstr "El usuario no existe en ese grupos" msgstr "El usuario no existe en ese grupos"
#: allianceauth/groupmanagement/views.py:168 #: allianceauth/groupmanagement/views.py:171
msgid "Group does not exist" msgid "Group does not exist"
msgstr "El grupo no existe" msgstr "El grupo no existe"
#: allianceauth/groupmanagement/views.py:195 #: allianceauth/groupmanagement/views.py:198
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to %(group)s." msgid "Accepted application from %(mainchar)s to %(group)s."
msgstr "Solicitud aceptada de %(mainchar)s a %(group)s" msgstr "Solicitud aceptada de %(mainchar)s a %(group)s"
#: allianceauth/groupmanagement/views.py:201 #: allianceauth/groupmanagement/views.py:204
#: allianceauth/groupmanagement/views.py:232 #: allianceauth/groupmanagement/views.py:235
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
@@ -1011,18 +1052,18 @@ msgstr ""
"Ocurrio un error cuando se intento procesar la informacion de %(mainchar)s " "Ocurrio un error cuando se intento procesar la informacion de %(mainchar)s "
"al grupo %(group)s." "al grupo %(group)s."
#: allianceauth/groupmanagement/views.py:226 #: allianceauth/groupmanagement/views.py:229
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to %(group)s." msgid "Rejected application from %(mainchar)s to %(group)s."
msgstr "Se rechazo la solicitud de %(mainchar)s al grupo %(group)s." msgstr "Se rechazo la solicitud de %(mainchar)s al grupo %(group)s."
#: allianceauth/groupmanagement/views.py:261 #: allianceauth/groupmanagement/views.py:264
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to leave %(group)s." msgid "Accepted application from %(mainchar)s to leave %(group)s."
msgstr "Se acepto la solicitud de %(mainchar)s para dejar el grupo %(group)s." msgstr "Se acepto la solicitud de %(mainchar)s para dejar el grupo %(group)s."
#: allianceauth/groupmanagement/views.py:266 #: allianceauth/groupmanagement/views.py:269
#: allianceauth/groupmanagement/views.py:298 #: allianceauth/groupmanagement/views.py:301
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
@@ -1031,43 +1072,43 @@ msgstr ""
"Se ha producido un error al procesar la solicitud de %(mainchar)s para " "Se ha producido un error al procesar la solicitud de %(mainchar)s para "
"abandonar %(group)s." "abandonar %(group)s."
#: allianceauth/groupmanagement/views.py:292 #: allianceauth/groupmanagement/views.py:295
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to leave %(group)s." msgid "Rejected application from %(mainchar)s to leave %(group)s."
msgstr "" msgstr ""
"Se rechazo la solicitud de %(mainchar)s para dejar el grupo %(group)s." "Se rechazo la solicitud de %(mainchar)s para dejar el grupo %(group)s."
#: allianceauth/groupmanagement/views.py:336 #: allianceauth/groupmanagement/views.py:339
#: allianceauth/groupmanagement/views.py:346 #: allianceauth/groupmanagement/views.py:349
msgid "You cannot join that group" msgid "You cannot join that group"
msgstr "No puedes unirte a ese grupo" msgstr "No puedes unirte a ese grupo"
#: allianceauth/groupmanagement/views.py:341 #: allianceauth/groupmanagement/views.py:344
msgid "You are already a member of that group." msgid "You are already a member of that group."
msgstr "Ya eres miembro de ese grupo." msgstr "Ya eres miembro de ese grupo."
#: allianceauth/groupmanagement/views.py:358 #: allianceauth/groupmanagement/views.py:361
msgid "You already have a pending application for that group." msgid "You already have a pending application for that group."
msgstr "Ya tiene una solicitud pendiente para ese grupo." msgstr "Ya tiene una solicitud pendiente para ese grupo."
#: allianceauth/groupmanagement/views.py:367 #: allianceauth/groupmanagement/views.py:370
#, python-format #, python-format
msgid "Applied to group %(group)s." msgid "Applied to group %(group)s."
msgstr "Solicitud enviada al grupo %(group)s." msgstr "Solicitud enviada al grupo %(group)s."
#: allianceauth/groupmanagement/views.py:377 #: allianceauth/groupmanagement/views.py:380
msgid "You cannot leave that group" msgid "You cannot leave that group"
msgstr "No puedes dejar el grupos" msgstr "No puedes dejar el grupos"
#: allianceauth/groupmanagement/views.py:381 #: allianceauth/groupmanagement/views.py:384
msgid "You are not a member of that group" msgid "You are not a member of that group"
msgstr "No eres miembro de ese grupo" msgstr "No eres miembro de ese grupo"
#: allianceauth/groupmanagement/views.py:393 #: allianceauth/groupmanagement/views.py:396
msgid "You already have a pending leave request for that group." msgid "You already have a pending leave request for that group."
msgstr "Ya tiene una solicitud de baja pendiente para ese grupo." msgstr "Ya tiene una solicitud de baja pendiente para ese grupo."
#: allianceauth/groupmanagement/views.py:409 #: allianceauth/groupmanagement/views.py:412
#, python-format #, python-format
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "Solicitaste dejar el grupo %(group)s." msgstr "Solicitaste dejar el grupo %(group)s."
@@ -1129,16 +1170,6 @@ msgstr "Crear Solicitud"
msgid "Username" msgid "Username"
msgstr "Usuario" msgstr "Usuario"
#: allianceauth/hrapplications/templates/hrapplications/management.html:28
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:127
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/hrapplications/templates/hrapplications/view.html:73
#: allianceauth/srp/templates/srp/data.html:101
#: allianceauth/srp/templates/srp/management.html:44
msgid "Actions"
msgstr "Acciones"
#: allianceauth/hrapplications/templates/hrapplications/management.html:38 #: allianceauth/hrapplications/templates/hrapplications/management.html:38
#: allianceauth/hrapplications/templates/hrapplications/management.html:99 #: allianceauth/hrapplications/templates/hrapplications/management.html:99
#: allianceauth/hrapplications/templates/hrapplications/management.html:143 #: allianceauth/hrapplications/templates/hrapplications/management.html:143
@@ -1477,10 +1508,6 @@ msgstr "Modelo"
msgid "Code Name" msgid "Code Name"
msgstr "Nombre codigo" msgstr "Nombre codigo"
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35
msgid "Users"
msgstr "Usuarios"
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41
msgid "States" msgid "States"
msgstr "Estados" msgstr "Estados"
@@ -2219,14 +2246,12 @@ msgstr ""
"Estado de %(total)s tareas procesadas • últimos %(latest)s" "Estado de %(total)s tareas procesadas • últimos %(latest)s"
#: allianceauth/templates/allianceauth/admin-status/overview.html:95 #: allianceauth/templates/allianceauth/admin-status/overview.html:95
#, python-format msgid "running"
msgid "" msgstr ""
"\n"
" %(queue_length)s queued tasks\n" #: allianceauth/templates/allianceauth/admin-status/overview.html:96
" " msgid "queued"
msgstr "" msgstr ""
"\n"
"%(queue_length)s tareas en cola"
#: allianceauth/templates/allianceauth/top-menu-admin.html:9 #: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin" msgid "Admin"
@@ -2241,11 +2266,11 @@ msgid "AA Support Discord"
msgstr "Soporte Discord AA" msgstr "Soporte Discord AA"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:14 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:16
msgid "User Menu" msgid "User Menu"
msgstr "Menú de usuario" msgstr "Menú de usuario"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:56 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:67
msgid "Logout" msgid "Logout"
msgstr "Salir" msgstr "Salir"
@@ -2301,22 +2326,30 @@ msgid "Objective"
msgstr "Objetivo" msgstr "Objetivo"
#: allianceauth/timerboard/form.py:64 #: allianceauth/timerboard/form.py:64
msgid "Absolute Timer"
msgstr ""
#: allianceauth/timerboard/form.py:65
msgid "Date and Time"
msgstr ""
#: allianceauth/timerboard/form.py:66
msgid "Days Remaining" msgid "Days Remaining"
msgstr "Dias restantes" msgstr "Dias restantes"
#: allianceauth/timerboard/form.py:65 #: allianceauth/timerboard/form.py:67
msgid "Hours Remaining" msgid "Hours Remaining"
msgstr "Horas Restantes" msgstr "Horas Restantes"
#: allianceauth/timerboard/form.py:67 #: allianceauth/timerboard/form.py:69
msgid "Minutes Remaining" msgid "Minutes Remaining"
msgstr "Minutos Restantes" msgstr "Minutos Restantes"
#: allianceauth/timerboard/form.py:69 #: allianceauth/timerboard/form.py:71
msgid "Important" msgid "Important"
msgstr "Importante" msgstr "Importante"
#: allianceauth/timerboard/form.py:70 #: allianceauth/timerboard/form.py:72
msgid "Corp-Restricted" msgid "Corp-Restricted"
msgstr "Restringido a Corp" msgstr "Restringido a Corp"

View File

@@ -4,23 +4,23 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
# Translators: # Translators:
# François LACROIX-DURANT <umbre@fallenstarscreations.com>, 2020 # Mickael Gr4vity, 2023
# Philippe Querin-Laporte <philippe.querin@hotmail.com>, 2020 # Idea ., 2023
# Keven D. <theenarki@gmail.com>, 2020 # rockclodbuster, 2023
# Idea ., 2021 # Keven D. <theenarki@gmail.com>, 2023
# Mickael PATTE, 2021
# Geoffrey Fabbro, 2021
# Mohssine Daghghar, 2023 # Mohssine Daghghar, 2023
# Ludovick Fortin, 2023 # Philippe Querin-Laporte <philippe.querin@hotmail.com>, 2023
# draktanar KarazGrong <umbre@fallenstarscreations.com>, 2023
# Geoffrey Fabbro, 2023
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-10-09 18:20+1000\n" "POT-Creation-Date: 2024-02-17 18:50+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Ludovick Fortin, 2023\n" "Last-Translator: Geoffrey Fabbro, 2023\n"
"Language-Team: French (France) (https://app.transifex.com/alliance-auth/teams/107430/fr_FR/)\n" "Language-Team: French (France) (https://app.transifex.com/alliance-auth/teams/107430/fr_FR/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -36,7 +36,7 @@ msgstr "Google Analytique Universelle"
msgid "Google Analytics V4" msgid "Google Analytics V4"
msgstr "Google Analytics V4" msgstr "Google Analytics V4"
#: allianceauth/authentication/decorators.py:37 #: allianceauth/authentication/decorators.py:49
msgid "A main character is required to perform that action. Add one below." msgid "A main character is required to perform that action. Add one below."
msgstr "" msgstr ""
"Un personnage principal est nécessaire pour effectuer cette action. Ajoutez-" "Un personnage principal est nécessaire pour effectuer cette action. Ajoutez-"
@@ -53,63 +53,68 @@ msgstr ""
"Vous n'avez pas lautorisation d'ajouter ou d'enlever ces groupes " "Vous n'avez pas lautorisation d'ajouter ou d'enlever ces groupes "
"restreints: %s" "restreints: %s"
#: allianceauth/authentication/models.py:80 #: allianceauth/authentication/models.py:71
msgid "English" msgid "English"
msgstr "Anglais" msgstr "Anglais"
#: allianceauth/authentication/models.py:81 #: allianceauth/authentication/models.py:72
msgid "German" msgid "German"
msgstr "Allemand" msgstr "Allemand"
#: allianceauth/authentication/models.py:82 #: allianceauth/authentication/models.py:73
msgid "Spanish" msgid "Spanish"
msgstr "Espagnol" msgstr "Espagnol"
#: allianceauth/authentication/models.py:83 #: allianceauth/authentication/models.py:74
msgid "Chinese Simplified" msgid "Chinese Simplified"
msgstr "Chinois simplifié" msgstr "Chinois simplifié"
#: allianceauth/authentication/models.py:84 #: allianceauth/authentication/models.py:75
msgid "Russian" msgid "Russian"
msgstr "Russe" msgstr "Russe"
#: allianceauth/authentication/models.py:85 #: allianceauth/authentication/models.py:76
msgid "Korean" msgid "Korean"
msgstr "Coréen" msgstr "Coréen"
#: allianceauth/authentication/models.py:86 #: allianceauth/authentication/models.py:77
msgid "French" msgid "French"
msgstr "Français" msgstr "Français"
#: allianceauth/authentication/models.py:87 #: allianceauth/authentication/models.py:78
msgid "Japanese" msgid "Japanese"
msgstr "Japonais" msgstr "Japonais"
#: allianceauth/authentication/models.py:88 #: allianceauth/authentication/models.py:79
msgid "Italian" msgid "Italian"
msgstr "Italien" msgstr "Italien"
#: allianceauth/authentication/models.py:91 #: allianceauth/authentication/models.py:80
msgid "Ukrainian"
msgstr ""
#: allianceauth/authentication/models.py:96
msgid "Language" msgid "Language"
msgstr "Langue" msgstr "Langue"
#: allianceauth/authentication/models.py:96 #: allianceauth/authentication/models.py:101
#: allianceauth/templates/allianceauth/night-toggle.html:6 #: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode" msgid "Night Mode"
msgstr "Mode Nuit" msgstr "Mode Nuit"
#: allianceauth/authentication/models.py:110 #: allianceauth/authentication/models.py:115
#, python-format #, python-format
msgid "State changed to: %s" msgid "State changed to: %s"
msgstr "État changé à: %s" msgstr "État changé à: %s"
#: allianceauth/authentication/models.py:111 #: allianceauth/authentication/models.py:116
#, python-format #, python-format
msgid "Your user's state is now: %(state)s" msgid "Your user's state is now: %(state)s"
msgstr "L'état de votre personnage est maintenant: %(state)s" msgstr "L'état de votre personnage est maintenant: %(state)s"
#: allianceauth/authentication/templates/authentication/dashboard.html:4 #: allianceauth/authentication/templates/authentication/dashboard.html:4
#: allianceauth/authentication/templates/authentication/dashboard.html:7 #: allianceauth/authentication/templates/authentication/dashboard.html:7
#: allianceauth/authentication/templates/authentication/tokens.html:4
#: allianceauth/templates/allianceauth/side-menu.html:10 #: allianceauth/templates/allianceauth/side-menu.html:10
msgid "Dashboard" msgid "Dashboard"
msgstr "Écran de bord" msgstr "Écran de bord"
@@ -167,8 +172,50 @@ msgstr "Corpo"
msgid "Alliance" msgid "Alliance"
msgstr "Alliance" msgstr "Alliance"
#: allianceauth/authentication/templates/authentication/tokens.html:7
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62
msgid "Token Management"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:12
msgid "Scopes"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:13
#: allianceauth/hrapplications/templates/hrapplications/management.html:28
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:127
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/hrapplications/templates/hrapplications/view.html:73
#: allianceauth/srp/templates/srp/data.html:101
#: allianceauth/srp/templates/srp/management.html:44
msgid "Actions"
msgstr "Actions"
#: allianceauth/authentication/templates/authentication/tokens.html:14
#: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112
#: allianceauth/corputils/templates/corputils/corpstats.html:156
#: allianceauth/corputils/templates/corputils/search.html:13
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:26
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
msgid "Character"
msgstr "Personnage"
#: allianceauth/authentication/templates/authentication/tokens.html:28
msgid ""
"This page is a best attempt, but backups or database logs can still contain "
"your tokens. Always revoke tokens on "
"https://community.eveonline.com/support/third-party-applications/ where "
"possible."
msgstr ""
#: allianceauth/authentication/templates/public/login.html:6 #: allianceauth/authentication/templates/public/login.html:6
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:58 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:69
msgid "Login" msgid "Login"
msgstr "Connexion" msgstr "Connexion"
@@ -202,7 +249,7 @@ msgstr "S'inscrire"
msgid "Invalid or expired activation link." msgid "Invalid or expired activation link."
msgstr "Lien d'activation invalide ou expiré." msgstr "Lien d'activation invalide ou expiré."
#: allianceauth/authentication/views.py:77 #: allianceauth/authentication/views.py:118
#, python-format #, python-format
msgid "" msgid ""
"Cannot change main character to %(char)s: character owned by a different " "Cannot change main character to %(char)s: character owned by a different "
@@ -211,30 +258,32 @@ msgstr ""
"Impossible de changer le personnage principal à %(char)s. Le personnage " "Impossible de changer le personnage principal à %(char)s. Le personnage "
"appartient à un autre compte." "appartient à un autre compte."
#: allianceauth/authentication/views.py:83 #: allianceauth/authentication/views.py:124
#, python-format #, python-format
msgid "Changed main character to %(char)s" msgid "Changed main character to %(char)s"
msgstr "Changé le personnage principal à %(char)s" msgstr "Changé le personnage principal à %(char)s"
#: allianceauth/authentication/views.py:92 #: allianceauth/authentication/views.py:133
#, python-format #, python-format
msgid "Added %(name)s to your account." msgid "Added %(name)s to your account."
msgstr "Ajouté %(name)s à votre compte." msgstr "Ajouté %(name)s à votre compte."
#: allianceauth/authentication/views.py:94 #: allianceauth/authentication/views.py:135
#, python-format #, python-format
msgid "Failed to add %(name)s to your account: they already have an account." msgid "Failed to add %(name)s to your account: they already have an account."
msgstr "Impossible d'ajouter %(name)s à votre compte: ils ont déjà un compte." msgstr "Impossible d'ajouter %(name)s à votre compte: ils ont déjà un compte."
#: allianceauth/authentication/views.py:133 #: allianceauth/authentication/views.py:178
msgid "Unable to authenticate as the selected character." msgid ""
msgstr "Personnage principal : échec de l'identification." "Unable to authenticate as the selected character. Please log in with the "
"main character associated with this account."
msgstr ""
#: allianceauth/authentication/views.py:197 #: allianceauth/authentication/views.py:244
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "Le token d'enregistrement est expiré." msgstr "Le token d'enregistrement est expiré."
#: allianceauth/authentication/views.py:252 #: allianceauth/authentication/views.py:302
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
@@ -242,12 +291,12 @@ msgstr ""
"Email de confirmation envoyé. Cliquez sur le lien pour valider votre adresse" "Email de confirmation envoyé. Cliquez sur le lien pour valider votre adresse"
" email." " email."
#: allianceauth/authentication/views.py:257 #: allianceauth/authentication/views.py:307
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "" msgstr ""
"Votre adresse email a été confirmé. Veuillez vous connecter pour continuer." "Votre adresse email a été confirmé. Veuillez vous connecter pour continuer."
#: allianceauth/authentication/views.py:262 #: allianceauth/authentication/views.py:312
msgid "Registration of new accounts is not allowed at this time." msgid "Registration of new accounts is not allowed at this time."
msgstr "La création de nouveaux comptes n'est pas actuellement permise." msgstr "La création de nouveaux comptes n'est pas actuellement permise."
@@ -290,19 +339,6 @@ msgstr "Pas inscrit"
msgid "Last update:" msgid "Last update:"
msgstr "Dernière mise à jour:" msgstr "Dernière mise à jour:"
#: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112
#: allianceauth/corputils/templates/corputils/corpstats.html:156
#: allianceauth/corputils/templates/corputils/search.html:13
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:26
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
msgid "Character"
msgstr "Personnage"
#: allianceauth/corputils/templates/corputils/corpstats.html:75 #: allianceauth/corputils/templates/corputils/corpstats.html:75
#: allianceauth/corputils/templates/corputils/search.html:14 #: allianceauth/corputils/templates/corputils/search.html:14
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
@@ -639,19 +675,24 @@ msgstr ""
msgid "Group Management" msgid "Group Management"
msgstr "Gestion de groupe" msgstr "Gestion de groupe"
#: allianceauth/groupmanagement/forms.py:15 #: allianceauth/groupmanagement/forms.py:18
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35
msgid "Users"
msgstr "Utilisateurs"
#: allianceauth/groupmanagement/forms.py:52
msgid "This name has been reserved and can not be used for groups." msgid "This name has been reserved and can not be used for groups."
msgstr "Ce nom a été réserver et il ne peut être utilisé pour les groupes." msgstr "Ce nom a été réserver et il ne peut être utilisé pour les groupes."
#: allianceauth/groupmanagement/forms.py:25 #: allianceauth/groupmanagement/forms.py:62
msgid "(auto)" msgid "(auto)"
msgstr "(automatique)" msgstr "(automatique)"
#: allianceauth/groupmanagement/forms.py:34 #: allianceauth/groupmanagement/forms.py:71
msgid "There already exists a group with that name." msgid "There already exists a group with that name."
msgstr "Il existe déjà un groupe portant ce nom." msgstr "Il existe déjà un groupe portant ce nom."
#: allianceauth/groupmanagement/models.py:105 #: allianceauth/groupmanagement/models.py:104
msgid "" msgid ""
"Internal group, users cannot see, join or request to join this " "Internal group, users cannot see, join or request to join this "
"group.<br>Used for groups such as Members, Corp_*, Alliance_* " "group.<br>Used for groups such as Members, Corp_*, Alliance_* "
@@ -662,13 +703,13 @@ msgstr ""
"Corporations _*, Alliance etc.<br><b> Annule les options masquer et exposer " "Corporations _*, Alliance etc.<br><b> Annule les options masquer et exposer "
"quand sélectionner." "quand sélectionner."
#: allianceauth/groupmanagement/models.py:113 #: allianceauth/groupmanagement/models.py:112
msgid "Group is hidden from users but can still join with the correct link." msgid "Group is hidden from users but can still join with the correct link."
msgstr "" msgstr ""
"Le groupe est caché aux utilisateurs, mais ils peuvent toujours rejoindre " "Le groupe est caché aux utilisateurs, mais ils peuvent toujours rejoindre "
"avec le bon lien." "avec le bon lien."
#: allianceauth/groupmanagement/models.py:119 #: allianceauth/groupmanagement/models.py:118
msgid "" msgid ""
"Group is open and users will be automatically added upon request.<br>If the " "Group is open and users will be automatically added upon request.<br>If the "
"group is not open users will need their request manually approved." "group is not open users will need their request manually approved."
@@ -677,7 +718,7 @@ msgstr ""
" demande. <br> Si le groupe nest pas ouvert, les utilisateurs auront besoin" " demande. <br> Si le groupe nest pas ouvert, les utilisateurs auront besoin"
" que leurs demandes soit approuvées manuellement." " que leurs demandes soit approuvées manuellement."
#: allianceauth/groupmanagement/models.py:126 #: allianceauth/groupmanagement/models.py:125
msgid "" msgid ""
"Group is public. Any registered user is able to join this group, with " "Group is public. Any registered user is able to join this group, with "
"visibility based on the other options set for this group.<br>Auth will not " "visibility based on the other options set for this group.<br>Auth will not "
@@ -689,7 +730,7 @@ msgstr ""
"groupe.<br> L' Auth ne supprimera pas automatiquement les utilisateurs de ce" "groupe.<br> L' Auth ne supprimera pas automatiquement les utilisateurs de ce"
" groupe lorsquils ne seront plus authentifiés." " groupe lorsquils ne seront plus authentifiés."
#: allianceauth/groupmanagement/models.py:135 #: allianceauth/groupmanagement/models.py:134
msgid "" msgid ""
"Group is restricted. This means that adding or removing users for this group" "Group is restricted. This means that adding or removing users for this group"
" requires a superuser admin." " requires a superuser admin."
@@ -697,62 +738,62 @@ msgstr ""
"Le groupe est restreint. Cela signifie que lajout ou la suppression " "Le groupe est restreint. Cela signifie que lajout ou la suppression "
"dutilisateurs pour ce groupe nécessite un administrateur superutilisateur." "dutilisateurs pour ce groupe nécessite un administrateur superutilisateur."
#: allianceauth/groupmanagement/models.py:144 #: allianceauth/groupmanagement/models.py:143
msgid "" msgid ""
"Group leaders can process requests for this group. Use the " "Group leaders can process requests for this group. Use the "
"<code>auth.group_management</code> permission to allow a user to manage all " "<code>auth.group_management</code> permission to allow a user to manage all "
"groups.<br>" "groups.<br>"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:154 #: allianceauth/groupmanagement/models.py:153
msgid "" msgid ""
"Members of leader groups can process requests for this group. Use the " "Members of leader groups can process requests for this group. Use the "
"<code>auth.group_management</code> permission to allow a user to manage all " "<code>auth.group_management</code> permission to allow a user to manage all "
"groups.<br>" "groups.<br>"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:163 #: allianceauth/groupmanagement/models.py:162
msgid "" msgid ""
"States listed here will have the ability to join this group provided they " "States listed here will have the ability to join this group provided they "
"have the proper permissions.<br>" "have the proper permissions.<br>"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:171 #: allianceauth/groupmanagement/models.py:170
msgid "" msgid ""
"Short description <i>(max. 512 characters)</i> of the group shown to users." "Short description <i>(max. 512 characters)</i> of the group shown to users."
msgstr "" msgstr ""
"Brève description <i> (512 caractères maximum) </i> du groupe présenté aux " "Brève description <i> (512 caractères maximum) </i> du groupe présenté aux "
"utilisateurs." "utilisateurs."
#: allianceauth/groupmanagement/models.py:178 #: allianceauth/groupmanagement/models.py:177
msgid "Can request non-public groups" msgid "Can request non-public groups"
msgstr "Peut demander des groupes non publics" msgstr "Peut demander des groupes non publics"
#: allianceauth/groupmanagement/models.py:209 #: allianceauth/groupmanagement/models.py:208
msgid "name" msgid "name"
msgstr "Nom" msgstr "Nom"
#: allianceauth/groupmanagement/models.py:212 #: allianceauth/groupmanagement/models.py:211
msgid "Name that can not be used for groups." msgid "Name that can not be used for groups."
msgstr "Nom qui ne peut pas être utilisé pour les groupes." msgstr "Nom qui ne peut pas être utilisé pour les groupes."
#: allianceauth/groupmanagement/models.py:215 #: allianceauth/groupmanagement/models.py:214
msgid "reason" msgid "reason"
msgstr "raison" msgstr "raison"
#: allianceauth/groupmanagement/models.py:215 #: allianceauth/groupmanagement/models.py:214
msgid "Reason why this name is reserved." msgid "Reason why this name is reserved."
msgstr "Raison pour laquelle ce nom est réservé." msgstr "Raison pour laquelle ce nom est réservé."
#: allianceauth/groupmanagement/models.py:218 #: allianceauth/groupmanagement/models.py:217
msgid "created by" msgid "created by"
msgstr "créé par" msgstr "créé par"
#: allianceauth/groupmanagement/models.py:223 #: allianceauth/groupmanagement/models.py:222
msgid "created at" msgid "created at"
msgstr "créé à" msgstr "créé à"
#: allianceauth/groupmanagement/models.py:223 #: allianceauth/groupmanagement/models.py:222
msgid "Date when this entry was created" msgid "Date when this entry was created"
msgstr "Date de création de cette entrée" msgstr "Date de création de cette entrée"
@@ -979,26 +1020,26 @@ msgstr "Demandes de groupe"
msgid "Group Membership" msgid "Group Membership"
msgstr "Groupe appartenance " msgstr "Groupe appartenance "
#: allianceauth/groupmanagement/views.py:163 #: allianceauth/groupmanagement/views.py:166
#, python-format #, python-format
msgid "Removed user %(user)s from group %(group)s." msgid "Removed user %(user)s from group %(group)s."
msgstr "L'utilisateur %(user)s à été retiré du groupe %(group)s." msgstr "L'utilisateur %(user)s à été retiré du groupe %(group)s."
#: allianceauth/groupmanagement/views.py:165 #: allianceauth/groupmanagement/views.py:168
msgid "User does not exist in that group" msgid "User does not exist in that group"
msgstr "L'utilisateur n'existe pas dans ce groupe" msgstr "L'utilisateur n'existe pas dans ce groupe"
#: allianceauth/groupmanagement/views.py:168 #: allianceauth/groupmanagement/views.py:171
msgid "Group does not exist" msgid "Group does not exist"
msgstr "Groupe non-existant" msgstr "Groupe non-existant"
#: allianceauth/groupmanagement/views.py:195 #: allianceauth/groupmanagement/views.py:198
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to %(group)s." msgid "Accepted application from %(mainchar)s to %(group)s."
msgstr "Candidature de %(mainchar)s acceptée à %(group)s." msgstr "Candidature de %(mainchar)s acceptée à %(group)s."
#: allianceauth/groupmanagement/views.py:201 #: allianceauth/groupmanagement/views.py:204
#: allianceauth/groupmanagement/views.py:232 #: allianceauth/groupmanagement/views.py:235
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
@@ -1007,18 +1048,18 @@ msgstr ""
"Une erreur inattendue est survenue durant le traitement de l'application de " "Une erreur inattendue est survenue durant le traitement de l'application de "
"%(mainchar)s à %(group)s." "%(mainchar)s à %(group)s."
#: allianceauth/groupmanagement/views.py:226 #: allianceauth/groupmanagement/views.py:229
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to %(group)s." msgid "Rejected application from %(mainchar)s to %(group)s."
msgstr "L'application de %(mainchar)s à %(group)s est rejetée." msgstr "L'application de %(mainchar)s à %(group)s est rejetée."
#: allianceauth/groupmanagement/views.py:261 #: allianceauth/groupmanagement/views.py:264
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to leave %(group)s." msgid "Accepted application from %(mainchar)s to leave %(group)s."
msgstr "La demande de retirer %(mainchar)s de %(group)s est acceptée." msgstr "La demande de retirer %(mainchar)s de %(group)s est acceptée."
#: allianceauth/groupmanagement/views.py:266 #: allianceauth/groupmanagement/views.py:269
#: allianceauth/groupmanagement/views.py:298 #: allianceauth/groupmanagement/views.py:301
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
@@ -1027,42 +1068,42 @@ msgstr ""
"Une erreur inattendue est survenue durant le traitement de la demande de " "Une erreur inattendue est survenue durant le traitement de la demande de "
"retirer %(mainchar)s de %(group)s." "retirer %(mainchar)s de %(group)s."
#: allianceauth/groupmanagement/views.py:292 #: allianceauth/groupmanagement/views.py:295
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to leave %(group)s." msgid "Rejected application from %(mainchar)s to leave %(group)s."
msgstr "La remande de retirer %(mainchar)s de %(group)s a été refusée." msgstr "La remande de retirer %(mainchar)s de %(group)s a été refusée."
#: allianceauth/groupmanagement/views.py:336 #: allianceauth/groupmanagement/views.py:339
#: allianceauth/groupmanagement/views.py:346 #: allianceauth/groupmanagement/views.py:349
msgid "You cannot join that group" msgid "You cannot join that group"
msgstr "Vous ne pouvez pas joindre ce groupe." msgstr "Vous ne pouvez pas joindre ce groupe."
#: allianceauth/groupmanagement/views.py:341 #: allianceauth/groupmanagement/views.py:344
msgid "You are already a member of that group." msgid "You are already a member of that group."
msgstr "Vous faites déjà parti de ce groupe." msgstr "Vous faites déjà parti de ce groupe."
#: allianceauth/groupmanagement/views.py:358 #: allianceauth/groupmanagement/views.py:361
msgid "You already have a pending application for that group." msgid "You already have a pending application for that group."
msgstr "Vous avez déjà une application en attente pour joindre ce groupe." msgstr "Vous avez déjà une application en attente pour joindre ce groupe."
#: allianceauth/groupmanagement/views.py:367 #: allianceauth/groupmanagement/views.py:370
#, python-format #, python-format
msgid "Applied to group %(group)s." msgid "Applied to group %(group)s."
msgstr "Appliqué au groupe %(group)s." msgstr "Appliqué au groupe %(group)s."
#: allianceauth/groupmanagement/views.py:377 #: allianceauth/groupmanagement/views.py:380
msgid "You cannot leave that group" msgid "You cannot leave that group"
msgstr "Vous ne pouvez pas quitter ce groupe." msgstr "Vous ne pouvez pas quitter ce groupe."
#: allianceauth/groupmanagement/views.py:381 #: allianceauth/groupmanagement/views.py:384
msgid "You are not a member of that group" msgid "You are not a member of that group"
msgstr "Vous n'êtes pas un membre de ce groupe." msgstr "Vous n'êtes pas un membre de ce groupe."
#: allianceauth/groupmanagement/views.py:393 #: allianceauth/groupmanagement/views.py:396
msgid "You already have a pending leave request for that group." msgid "You already have a pending leave request for that group."
msgstr "Vous avec déjà une demande de quitter ce groupe en attente." msgstr "Vous avec déjà une demande de quitter ce groupe en attente."
#: allianceauth/groupmanagement/views.py:409 #: allianceauth/groupmanagement/views.py:412
#, python-format #, python-format
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "Appliqué pour quitter le groupe %(group)s." msgstr "Appliqué pour quitter le groupe %(group)s."
@@ -1124,16 +1165,6 @@ msgstr "Créer une application"
msgid "Username" msgid "Username"
msgstr "Nom d'utilisateur" msgstr "Nom d'utilisateur"
#: allianceauth/hrapplications/templates/hrapplications/management.html:28
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:127
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/hrapplications/templates/hrapplications/view.html:73
#: allianceauth/srp/templates/srp/data.html:101
#: allianceauth/srp/templates/srp/management.html:44
msgid "Actions"
msgstr "Actions"
#: allianceauth/hrapplications/templates/hrapplications/management.html:38 #: allianceauth/hrapplications/templates/hrapplications/management.html:38
#: allianceauth/hrapplications/templates/hrapplications/management.html:99 #: allianceauth/hrapplications/templates/hrapplications/management.html:99
#: allianceauth/hrapplications/templates/hrapplications/management.html:143 #: allianceauth/hrapplications/templates/hrapplications/management.html:143
@@ -1472,10 +1503,6 @@ msgstr "Modèle"
msgid "Code Name" msgid "Code Name"
msgstr "Nom De Code" msgstr "Nom De Code"
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35
msgid "Users"
msgstr "Utilisateurs"
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41
msgid "States" msgid "States"
msgstr "États" msgstr "États"
@@ -2217,15 +2244,12 @@ msgstr ""
" " " "
#: allianceauth/templates/allianceauth/admin-status/overview.html:95 #: allianceauth/templates/allianceauth/admin-status/overview.html:95
#, python-format msgid "running"
msgid "" msgstr ""
"\n"
" %(queue_length)s queued tasks\n" #: allianceauth/templates/allianceauth/admin-status/overview.html:96
" " msgid "queued"
msgstr "" msgstr ""
"\n"
" %(queue_length)stâches en file d'attente\n"
" "
#: allianceauth/templates/allianceauth/top-menu-admin.html:9 #: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin" msgid "Admin"
@@ -2240,11 +2264,11 @@ msgid "AA Support Discord"
msgstr "Support Discord AA" msgstr "Support Discord AA"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:14 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:16
msgid "User Menu" msgid "User Menu"
msgstr "Menu Utilisateur" msgstr "Menu Utilisateur"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:56 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:67
msgid "Logout" msgid "Logout"
msgstr "Déconnexion" msgstr "Déconnexion"
@@ -2300,22 +2324,30 @@ msgid "Objective"
msgstr "Objectif" msgstr "Objectif"
#: allianceauth/timerboard/form.py:64 #: allianceauth/timerboard/form.py:64
msgid "Absolute Timer"
msgstr ""
#: allianceauth/timerboard/form.py:65
msgid "Date and Time"
msgstr ""
#: allianceauth/timerboard/form.py:66
msgid "Days Remaining" msgid "Days Remaining"
msgstr "Jour restants" msgstr "Jour restants"
#: allianceauth/timerboard/form.py:65 #: allianceauth/timerboard/form.py:67
msgid "Hours Remaining" msgid "Hours Remaining"
msgstr "Heures restantes" msgstr "Heures restantes"
#: allianceauth/timerboard/form.py:67 #: allianceauth/timerboard/form.py:69
msgid "Minutes Remaining" msgid "Minutes Remaining"
msgstr "Minutes restantes" msgstr "Minutes restantes"
#: allianceauth/timerboard/form.py:69 #: allianceauth/timerboard/form.py:71
msgid "Important" msgid "Important"
msgstr "Important" msgstr "Important"
#: allianceauth/timerboard/form.py:70 #: allianceauth/timerboard/form.py:72
msgid "Corp-Restricted" msgid "Corp-Restricted"
msgstr "Limité à la Corporation" msgstr "Limité à la Corporation"

File diff suppressed because it is too large Load Diff

View File

@@ -4,17 +4,18 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
# Translators: # Translators:
# Foch Petain <brigadier.rockforward@gmail.com>, 2020
# kotaneko, 2023 # kotaneko, 2023
# Foch Petain <brigadier.rockforward@gmail.com>, 2023
# Joel Falknau <ozirascal@gmail.com>, 2023
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-10-09 18:20+1000\n" "POT-Creation-Date: 2024-02-17 18:50+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: kotaneko, 2023\n" "Last-Translator: Joel Falknau <ozirascal@gmail.com>, 2023\n"
"Language-Team: Japanese (https://app.transifex.com/alliance-auth/teams/107430/ja/)\n" "Language-Team: Japanese (https://app.transifex.com/alliance-auth/teams/107430/ja/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -30,7 +31,7 @@ msgstr "Google ユニバーサル アナリティクス"
msgid "Google Analytics V4" msgid "Google Analytics V4"
msgstr "Google アナリティクス 4" msgstr "Google アナリティクス 4"
#: allianceauth/authentication/decorators.py:37 #: allianceauth/authentication/decorators.py:49
msgid "A main character is required to perform that action. Add one below." msgid "A main character is required to perform that action. Add one below."
msgstr "実行するためにはメインキャラクターの設定が必要です。設定してください。" msgstr "実行するためにはメインキャラクターの設定が必要です。設定してください。"
@@ -43,63 +44,68 @@ msgstr "メールアドレス"
msgid "You are not allowed to add or remove these restricted groups: %s" msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr "これらの制限付きグループを追加または削除することはできません。%s" msgstr "これらの制限付きグループを追加または削除することはできません。%s"
#: allianceauth/authentication/models.py:80 #: allianceauth/authentication/models.py:71
msgid "English" msgid "English"
msgstr "英語" msgstr "英語"
#: allianceauth/authentication/models.py:81 #: allianceauth/authentication/models.py:72
msgid "German" msgid "German"
msgstr "ドイツ語" msgstr "ドイツ語"
#: allianceauth/authentication/models.py:82 #: allianceauth/authentication/models.py:73
msgid "Spanish" msgid "Spanish"
msgstr "スペイン語" msgstr "スペイン語"
#: allianceauth/authentication/models.py:83 #: allianceauth/authentication/models.py:74
msgid "Chinese Simplified" msgid "Chinese Simplified"
msgstr "中国語 簡体字" msgstr "中国語 簡体字"
#: allianceauth/authentication/models.py:84 #: allianceauth/authentication/models.py:75
msgid "Russian" msgid "Russian"
msgstr "ロシア語" msgstr "ロシア語"
#: allianceauth/authentication/models.py:85 #: allianceauth/authentication/models.py:76
msgid "Korean" msgid "Korean"
msgstr "韓国語" msgstr "韓国語"
#: allianceauth/authentication/models.py:86 #: allianceauth/authentication/models.py:77
msgid "French" msgid "French"
msgstr "フランス語" msgstr "フランス語"
#: allianceauth/authentication/models.py:87 #: allianceauth/authentication/models.py:78
msgid "Japanese" msgid "Japanese"
msgstr "日本語" msgstr "日本語"
#: allianceauth/authentication/models.py:88 #: allianceauth/authentication/models.py:79
msgid "Italian" msgid "Italian"
msgstr "イタリア語" msgstr "イタリア語"
#: allianceauth/authentication/models.py:91 #: allianceauth/authentication/models.py:80
msgid "Ukrainian"
msgstr ""
#: allianceauth/authentication/models.py:96
msgid "Language" msgid "Language"
msgstr "言語" msgstr "言語"
#: allianceauth/authentication/models.py:96 #: allianceauth/authentication/models.py:101
#: allianceauth/templates/allianceauth/night-toggle.html:6 #: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode" msgid "Night Mode"
msgstr "ナイトモード" msgstr "ナイトモード"
#: allianceauth/authentication/models.py:110 #: allianceauth/authentication/models.py:115
#, python-format #, python-format
msgid "State changed to: %s" msgid "State changed to: %s"
msgstr "分類が%sに変更されました。" msgstr "分類が%sに変更されました。"
#: allianceauth/authentication/models.py:111 #: allianceauth/authentication/models.py:116
#, python-format #, python-format
msgid "Your user's state is now: %(state)s" msgid "Your user's state is now: %(state)s"
msgstr "あなたの分類は%(state)sになりました。" msgstr "あなたの分類は%(state)sになりました。"
#: allianceauth/authentication/templates/authentication/dashboard.html:4 #: allianceauth/authentication/templates/authentication/dashboard.html:4
#: allianceauth/authentication/templates/authentication/dashboard.html:7 #: allianceauth/authentication/templates/authentication/dashboard.html:7
#: allianceauth/authentication/templates/authentication/tokens.html:4
#: allianceauth/templates/allianceauth/side-menu.html:10 #: allianceauth/templates/allianceauth/side-menu.html:10
msgid "Dashboard" msgid "Dashboard"
msgstr "ダッシュボード" msgstr "ダッシュボード"
@@ -157,8 +163,50 @@ msgstr "Corp"
msgid "Alliance" msgid "Alliance"
msgstr "Alliance" msgstr "Alliance"
#: allianceauth/authentication/templates/authentication/tokens.html:7
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62
msgid "Token Management"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:12
msgid "Scopes"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:13
#: allianceauth/hrapplications/templates/hrapplications/management.html:28
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:127
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/hrapplications/templates/hrapplications/view.html:73
#: allianceauth/srp/templates/srp/data.html:101
#: allianceauth/srp/templates/srp/management.html:44
msgid "Actions"
msgstr "アクション"
#: allianceauth/authentication/templates/authentication/tokens.html:14
#: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112
#: allianceauth/corputils/templates/corputils/corpstats.html:156
#: allianceauth/corputils/templates/corputils/search.html:13
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:26
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
msgid "Character"
msgstr "キャラクター"
#: allianceauth/authentication/templates/authentication/tokens.html:28
msgid ""
"This page is a best attempt, but backups or database logs can still contain "
"your tokens. Always revoke tokens on "
"https://community.eveonline.com/support/third-party-applications/ where "
"possible."
msgstr ""
#: allianceauth/authentication/templates/public/login.html:6 #: allianceauth/authentication/templates/public/login.html:6
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:58 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:69
msgid "Login" msgid "Login"
msgstr "ログイン" msgstr "ログイン"
@@ -190,47 +238,49 @@ msgstr "登録"
msgid "Invalid or expired activation link." msgid "Invalid or expired activation link."
msgstr "アクティベーションリンクが無効か期限切れです。" msgstr "アクティベーションリンクが無効か期限切れです。"
#: allianceauth/authentication/views.py:77 #: allianceauth/authentication/views.py:118
#, python-format #, python-format
msgid "" msgid ""
"Cannot change main character to %(char)s: character owned by a different " "Cannot change main character to %(char)s: character owned by a different "
"account." "account."
msgstr "メインキャラクターを%(char)sへ変更できません。別のアカウントによって利用されています。" msgstr "メインキャラクターを%(char)sへ変更できません。別のアカウントによって利用されています。"
#: allianceauth/authentication/views.py:83 #: allianceauth/authentication/views.py:124
#, python-format #, python-format
msgid "Changed main character to %(char)s" msgid "Changed main character to %(char)s"
msgstr "メインキャラクターを%(char)sへ変更しました。" msgstr "メインキャラクターを%(char)sへ変更しました。"
#: allianceauth/authentication/views.py:92 #: allianceauth/authentication/views.py:133
#, python-format #, python-format
msgid "Added %(name)s to your account." msgid "Added %(name)s to your account."
msgstr "%(name)sをアカウントに追加しました。" msgstr "%(name)sをアカウントに追加しました。"
#: allianceauth/authentication/views.py:94 #: allianceauth/authentication/views.py:135
#, python-format #, python-format
msgid "Failed to add %(name)s to your account: they already have an account." msgid "Failed to add %(name)s to your account: they already have an account."
msgstr "%(name)sをアカウントに追加することができません。すでに他のアカウントを持っています。" msgstr "%(name)sをアカウントに追加することができません。すでに他のアカウントを持っています。"
#: allianceauth/authentication/views.py:133 #: allianceauth/authentication/views.py:178
msgid "Unable to authenticate as the selected character." msgid ""
msgstr "選択されたキャラクターの認証が行えませんでした。" "Unable to authenticate as the selected character. Please log in with the "
"main character associated with this account."
msgstr ""
#: allianceauth/authentication/views.py:197 #: allianceauth/authentication/views.py:244
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "Registrationトークンが有効期限切れです。" msgstr "Registrationトークンが有効期限切れです。"
#: allianceauth/authentication/views.py:252 #: allianceauth/authentication/views.py:302
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
msgstr "確認のメールを送信しました。メール内のリンクをご確認の上、メールアドレスの認証を完了させてください。" msgstr "確認のメールを送信しました。メール内のリンクをご確認の上、メールアドレスの認証を完了させてください。"
#: allianceauth/authentication/views.py:257 #: allianceauth/authentication/views.py:307
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "メールアドレスを確認しました。続行するにはログインしてください。" msgstr "メールアドレスを確認しました。続行するにはログインしてください。"
#: allianceauth/authentication/views.py:262 #: allianceauth/authentication/views.py:312
msgid "Registration of new accounts is not allowed at this time." msgid "Registration of new accounts is not allowed at this time."
msgstr "新規アカウントの登録は、現時点ではできません。" msgstr "新規アカウントの登録は、現時点ではできません。"
@@ -273,19 +323,6 @@ msgstr "未登録"
msgid "Last update:" msgid "Last update:"
msgstr "最終更新:" msgstr "最終更新:"
#: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112
#: allianceauth/corputils/templates/corputils/corpstats.html:156
#: allianceauth/corputils/templates/corputils/search.html:13
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:26
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
msgid "Character"
msgstr "キャラクター"
#: allianceauth/corputils/templates/corputils/corpstats.html:75 #: allianceauth/corputils/templates/corputils/corpstats.html:75
#: allianceauth/corputils/templates/corputils/search.html:14 #: allianceauth/corputils/templates/corputils/search.html:14
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
@@ -615,19 +652,24 @@ msgstr "{character.character_name} のフリート参加を登録できません
msgid "Group Management" msgid "Group Management"
msgstr "グループ管理" msgstr "グループ管理"
#: allianceauth/groupmanagement/forms.py:15 #: allianceauth/groupmanagement/forms.py:18
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35
msgid "Users"
msgstr "ユーザ"
#: allianceauth/groupmanagement/forms.py:52
msgid "This name has been reserved and can not be used for groups." msgid "This name has been reserved and can not be used for groups."
msgstr "この名前は予約済みで、グループには使用できません。" msgstr "この名前は予約済みで、グループには使用できません。"
#: allianceauth/groupmanagement/forms.py:25 #: allianceauth/groupmanagement/forms.py:62
msgid "(auto)" msgid "(auto)"
msgstr "(auto)" msgstr "(auto)"
#: allianceauth/groupmanagement/forms.py:34 #: allianceauth/groupmanagement/forms.py:71
msgid "There already exists a group with that name." msgid "There already exists a group with that name."
msgstr "その名前のグループが既に存在しています。" msgstr "その名前のグループが既に存在しています。"
#: allianceauth/groupmanagement/models.py:105 #: allianceauth/groupmanagement/models.py:104
msgid "" msgid ""
"Internal group, users cannot see, join or request to join this " "Internal group, users cannot see, join or request to join this "
"group.<br>Used for groups such as Members, Corp_*, Alliance_* " "group.<br>Used for groups such as Members, Corp_*, Alliance_* "
@@ -636,18 +678,18 @@ msgstr ""
"内部グループです。ユーザーはこのグループを表示したり、参加したり、参加をリクエストしたりすることはできません。<br>Members、Corp_*、Alliance_*などのグループに使用します。選択すると、非表示" "内部グループです。ユーザーはこのグループを表示したり、参加したり、参加をリクエストしたりすることはできません。<br>Members、Corp_*、Alliance_*などのグループに使用します。選択すると、非表示"
" オプションと 開く <br> <b> オプションが上書きされます。</b> " " オプションと 開く <br> <b> オプションが上書きされます。</b> "
#: allianceauth/groupmanagement/models.py:113 #: allianceauth/groupmanagement/models.py:112
msgid "Group is hidden from users but can still join with the correct link." msgid "Group is hidden from users but can still join with the correct link."
msgstr "グループはユーザーに表示されませんが、正しいリンク経由で参加することができます。" msgstr "グループはユーザーに表示されませんが、正しいリンク経由で参加することができます。"
#: allianceauth/groupmanagement/models.py:119 #: allianceauth/groupmanagement/models.py:118
msgid "" msgid ""
"Group is open and users will be automatically added upon request.<br>If the " "Group is open and users will be automatically added upon request.<br>If the "
"group is not open users will need their request manually approved." "group is not open users will need their request manually approved."
msgstr "" msgstr ""
"グループはオープンで、ユーザーはリクエストに応じて自動的に追加されます。<br>グループがオープンでない場合、ユーザーのリクエストは手動で承認する必要があります。" "グループはオープンで、ユーザーはリクエストに応じて自動的に追加されます。<br>グループがオープンでない場合、ユーザーのリクエストは手動で承認する必要があります。"
#: allianceauth/groupmanagement/models.py:126 #: allianceauth/groupmanagement/models.py:125
msgid "" msgid ""
"Group is public. Any registered user is able to join this group, with " "Group is public. Any registered user is able to join this group, with "
"visibility based on the other options set for this group.<br>Auth will not " "visibility based on the other options set for this group.<br>Auth will not "
@@ -657,13 +699,13 @@ msgstr ""
"グループは一般公開されています。登録ユーザーなら誰でもこのグループに参加でき、このグループに設定されている他のオプションに基づいて表示されます。<br>認証されなくなっても、Auth" "グループは一般公開されています。登録ユーザーなら誰でもこのグループに参加でき、このグループに設定されている他のオプションに基づいて表示されます。<br>認証されなくなっても、Auth"
" はユーザーをこのグループから自動的に削除しません。" " はユーザーをこのグループから自動的に削除しません。"
#: allianceauth/groupmanagement/models.py:135 #: allianceauth/groupmanagement/models.py:134
msgid "" msgid ""
"Group is restricted. This means that adding or removing users for this group" "Group is restricted. This means that adding or removing users for this group"
" requires a superuser admin." " requires a superuser admin."
msgstr "グループは参加が制限されています。つまり、このグループのユーザーを追加または削除するには、スーパーユーザー管理者が必要です。" msgstr "グループは参加が制限されています。つまり、このグループのユーザーを追加または削除するには、スーパーユーザー管理者が必要です。"
#: allianceauth/groupmanagement/models.py:144 #: allianceauth/groupmanagement/models.py:143
msgid "" msgid ""
"Group leaders can process requests for this group. Use the " "Group leaders can process requests for this group. Use the "
"<code>auth.group_management</code> permission to allow a user to manage all " "<code>auth.group_management</code> permission to allow a user to manage all "
@@ -672,7 +714,7 @@ msgstr ""
"グループリーダーは、このグループのリクエストを処理できます。<code>auth.group_management </code> " "グループリーダーは、このグループのリクエストを処理できます。<code>auth.group_management </code> "
"権限を使用して、ユーザーがすべてのグループを管理できるようにします。<br> " "権限を使用して、ユーザーがすべてのグループを管理できるようにします。<br> "
#: allianceauth/groupmanagement/models.py:154 #: allianceauth/groupmanagement/models.py:153
msgid "" msgid ""
"Members of leader groups can process requests for this group. Use the " "Members of leader groups can process requests for this group. Use the "
"<code>auth.group_management</code> permission to allow a user to manage all " "<code>auth.group_management</code> permission to allow a user to manage all "
@@ -681,46 +723,46 @@ msgstr ""
"リーダーグループのメンバーは、このグループのリクエストを処理できます。<code>auth.group_management </code> " "リーダーグループのメンバーは、このグループのリクエストを処理できます。<code>auth.group_management </code> "
"権限を使用して、ユーザーがすべてのグループを管理できるようにします。<br> " "権限を使用して、ユーザーがすべてのグループを管理できるようにします。<br> "
#: allianceauth/groupmanagement/models.py:163 #: allianceauth/groupmanagement/models.py:162
msgid "" msgid ""
"States listed here will have the ability to join this group provided they " "States listed here will have the ability to join this group provided they "
"have the proper permissions.<br>" "have the proper permissions.<br>"
msgstr "ここに記載されているStatesは、適切な許可があれば、このグループに参加できます。<br> " msgstr "ここに記載されているStatesは、適切な許可があれば、このグループに参加できます。<br> "
#: allianceauth/groupmanagement/models.py:171 #: allianceauth/groupmanagement/models.py:170
msgid "" msgid ""
"Short description <i>(max. 512 characters)</i> of the group shown to users." "Short description <i>(max. 512 characters)</i> of the group shown to users."
msgstr "ユーザーに表示されるグループの簡単な説明 <i> (最大 512 文字) </i>。" msgstr "ユーザーに表示されるグループの簡単な説明 <i> (最大 512 文字) </i>。"
#: allianceauth/groupmanagement/models.py:178 #: allianceauth/groupmanagement/models.py:177
msgid "Can request non-public groups" msgid "Can request non-public groups"
msgstr "非公開グループをリクエストできる" msgstr "非公開グループをリクエストできる"
#: allianceauth/groupmanagement/models.py:209 #: allianceauth/groupmanagement/models.py:208
msgid "name" msgid "name"
msgstr "名前" msgstr "名前"
#: allianceauth/groupmanagement/models.py:212 #: allianceauth/groupmanagement/models.py:211
msgid "Name that can not be used for groups." msgid "Name that can not be used for groups."
msgstr "グループには使用できない名前。" msgstr "グループには使用できない名前。"
#: allianceauth/groupmanagement/models.py:215 #: allianceauth/groupmanagement/models.py:214
msgid "reason" msgid "reason"
msgstr "理由" msgstr "理由"
#: allianceauth/groupmanagement/models.py:215 #: allianceauth/groupmanagement/models.py:214
msgid "Reason why this name is reserved." msgid "Reason why this name is reserved."
msgstr "この名前が使用予約されている理由。" msgstr "この名前が使用予約されている理由。"
#: allianceauth/groupmanagement/models.py:218 #: allianceauth/groupmanagement/models.py:217
msgid "created by" msgid "created by"
msgstr "作成者" msgstr "作成者"
#: allianceauth/groupmanagement/models.py:223 #: allianceauth/groupmanagement/models.py:222
msgid "created at" msgid "created at"
msgstr "作成日時" msgstr "作成日時"
#: allianceauth/groupmanagement/models.py:223 #: allianceauth/groupmanagement/models.py:222
msgid "Date when this entry was created" msgid "Date when this entry was created"
msgstr "このエントリが作成された日付" msgstr "このエントリが作成された日付"
@@ -947,86 +989,86 @@ msgstr "グループリクエスト"
msgid "Group Membership" msgid "Group Membership"
msgstr "グループメンバーシップ" msgstr "グループメンバーシップ"
#: allianceauth/groupmanagement/views.py:163 #: allianceauth/groupmanagement/views.py:166
#, python-format #, python-format
msgid "Removed user %(user)s from group %(group)s." msgid "Removed user %(user)s from group %(group)s."
msgstr "%(user)sを%(group)sから削除する。" msgstr "%(user)sを%(group)sから削除する。"
#: allianceauth/groupmanagement/views.py:165 #: allianceauth/groupmanagement/views.py:168
msgid "User does not exist in that group" msgid "User does not exist in that group"
msgstr "誰もグループに参加してません。" msgstr "誰もグループに参加してません。"
#: allianceauth/groupmanagement/views.py:168 #: allianceauth/groupmanagement/views.py:171
msgid "Group does not exist" msgid "Group does not exist"
msgstr "グループが存在しません。" msgstr "グループが存在しません。"
#: allianceauth/groupmanagement/views.py:195 #: allianceauth/groupmanagement/views.py:198
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to %(group)s." msgid "Accepted application from %(mainchar)s to %(group)s."
msgstr "%(mainchar)sからの%(group)sへの参加申請を承認しました。" msgstr "%(mainchar)sからの%(group)sへの参加申請を承認しました。"
#: allianceauth/groupmanagement/views.py:201 #: allianceauth/groupmanagement/views.py:204
#: allianceauth/groupmanagement/views.py:232 #: allianceauth/groupmanagement/views.py:235
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
"%(mainchar)s to %(group)s." "%(mainchar)s to %(group)s."
msgstr "%(mainchar)sからの%(group)sへの参加申請を処理中にエラーが発生しました。" msgstr "%(mainchar)sからの%(group)sへの参加申請を処理中にエラーが発生しました。"
#: allianceauth/groupmanagement/views.py:226 #: allianceauth/groupmanagement/views.py:229
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to %(group)s." msgid "Rejected application from %(mainchar)s to %(group)s."
msgstr "%(mainchar)sからの%(group)sへの参加申請は拒否されました。" msgstr "%(mainchar)sからの%(group)sへの参加申請は拒否されました。"
#: allianceauth/groupmanagement/views.py:261 #: allianceauth/groupmanagement/views.py:264
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to leave %(group)s." msgid "Accepted application from %(mainchar)s to leave %(group)s."
msgstr "%(mainchar)sからの%(group)sからの脱退申請は承認されました。" msgstr "%(mainchar)sからの%(group)sからの脱退申請は承認されました。"
#: allianceauth/groupmanagement/views.py:266 #: allianceauth/groupmanagement/views.py:269
#: allianceauth/groupmanagement/views.py:298 #: allianceauth/groupmanagement/views.py:301
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
"%(mainchar)s to leave %(group)s." "%(mainchar)s to leave %(group)s."
msgstr "%(mainchar)sからの%(group)sからの脱退申請を処理中にエラーが発生しました。" msgstr "%(mainchar)sからの%(group)sからの脱退申請を処理中にエラーが発生しました。"
#: allianceauth/groupmanagement/views.py:292 #: allianceauth/groupmanagement/views.py:295
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to leave %(group)s." msgid "Rejected application from %(mainchar)s to leave %(group)s."
msgstr "%(mainchar)sの%(group)sからの脱退申請は拒否されました。" msgstr "%(mainchar)sの%(group)sからの脱退申請は拒否されました。"
#: allianceauth/groupmanagement/views.py:336 #: allianceauth/groupmanagement/views.py:339
#: allianceauth/groupmanagement/views.py:346 #: allianceauth/groupmanagement/views.py:349
msgid "You cannot join that group" msgid "You cannot join that group"
msgstr "このGroupには入れません" msgstr "このGroupには入れません"
#: allianceauth/groupmanagement/views.py:341 #: allianceauth/groupmanagement/views.py:344
msgid "You are already a member of that group." msgid "You are already a member of that group."
msgstr "すでにその Group に参加してます。" msgstr "すでにその Group に参加してます。"
#: allianceauth/groupmanagement/views.py:358 #: allianceauth/groupmanagement/views.py:361
msgid "You already have a pending application for that group." msgid "You already have a pending application for that group."
msgstr "すでに参加申請を送付済みです。" msgstr "すでに参加申請を送付済みです。"
#: allianceauth/groupmanagement/views.py:367 #: allianceauth/groupmanagement/views.py:370
#, python-format #, python-format
msgid "Applied to group %(group)s." msgid "Applied to group %(group)s."
msgstr "%(group)sへの参加申請を送信しました。" msgstr "%(group)sへの参加申請を送信しました。"
#: allianceauth/groupmanagement/views.py:377 #: allianceauth/groupmanagement/views.py:380
msgid "You cannot leave that group" msgid "You cannot leave that group"
msgstr "この Group から脱退することはできません" msgstr "この Group から脱退することはできません"
#: allianceauth/groupmanagement/views.py:381 #: allianceauth/groupmanagement/views.py:384
msgid "You are not a member of that group" msgid "You are not a member of that group"
msgstr "あなたはその Group のメンバーではありません" msgstr "あなたはその Group のメンバーではありません"
#: allianceauth/groupmanagement/views.py:393 #: allianceauth/groupmanagement/views.py:396
msgid "You already have a pending leave request for that group." msgid "You already have a pending leave request for that group."
msgstr "すでに脱退申請を送信済みです。" msgstr "すでに脱退申請を送信済みです。"
#: allianceauth/groupmanagement/views.py:409 #: allianceauth/groupmanagement/views.py:412
#, python-format #, python-format
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "%(group)sからの脱退申請を送信しました。" msgstr "%(group)sからの脱退申請を送信しました。"
@@ -1088,16 +1130,6 @@ msgstr "申請を作成"
msgid "Username" msgid "Username"
msgstr "ユーザー名" msgstr "ユーザー名"
#: allianceauth/hrapplications/templates/hrapplications/management.html:28
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:127
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/hrapplications/templates/hrapplications/view.html:73
#: allianceauth/srp/templates/srp/data.html:101
#: allianceauth/srp/templates/srp/management.html:44
msgid "Actions"
msgstr "アクション"
#: allianceauth/hrapplications/templates/hrapplications/management.html:38 #: allianceauth/hrapplications/templates/hrapplications/management.html:38
#: allianceauth/hrapplications/templates/hrapplications/management.html:99 #: allianceauth/hrapplications/templates/hrapplications/management.html:99
#: allianceauth/hrapplications/templates/hrapplications/management.html:143 #: allianceauth/hrapplications/templates/hrapplications/management.html:143
@@ -1436,10 +1468,6 @@ msgstr "モデル"
msgid "Code Name" msgid "Code Name"
msgstr "コードネーム" msgstr "コードネーム"
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35
msgid "Users"
msgstr "ユーザ"
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41
msgid "States" msgid "States"
msgstr "States" msgstr "States"
@@ -2170,15 +2198,12 @@ msgstr ""
" " " "
#: allianceauth/templates/allianceauth/admin-status/overview.html:95 #: allianceauth/templates/allianceauth/admin-status/overview.html:95
#, python-format msgid "running"
msgid "" msgstr ""
"\n"
" %(queue_length)s queued tasks\n" #: allianceauth/templates/allianceauth/admin-status/overview.html:96
" " msgid "queued"
msgstr "" msgstr ""
"\n"
" %(queue_length)sキューに入っているタスク\n"
" "
#: allianceauth/templates/allianceauth/top-menu-admin.html:9 #: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin" msgid "Admin"
@@ -2193,11 +2218,11 @@ msgid "AA Support Discord"
msgstr "AA サポートディスコード" msgstr "AA サポートディスコード"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:14 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:16
msgid "User Menu" msgid "User Menu"
msgstr "ユーザーメニュー" msgstr "ユーザーメニュー"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:56 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:67
msgid "Logout" msgid "Logout"
msgstr "ログアウト" msgstr "ログアウト"
@@ -2253,22 +2278,30 @@ msgid "Objective"
msgstr "目標" msgstr "目標"
#: allianceauth/timerboard/form.py:64 #: allianceauth/timerboard/form.py:64
msgid "Absolute Timer"
msgstr ""
#: allianceauth/timerboard/form.py:65
msgid "Date and Time"
msgstr ""
#: allianceauth/timerboard/form.py:66
msgid "Days Remaining" msgid "Days Remaining"
msgstr "残り日数" msgstr "残り日数"
#: allianceauth/timerboard/form.py:65 #: allianceauth/timerboard/form.py:67
msgid "Hours Remaining" msgid "Hours Remaining"
msgstr "残り時間" msgstr "残り時間"
#: allianceauth/timerboard/form.py:67 #: allianceauth/timerboard/form.py:69
msgid "Minutes Remaining" msgid "Minutes Remaining"
msgstr "残り分数" msgstr "残り分数"
#: allianceauth/timerboard/form.py:69 #: allianceauth/timerboard/form.py:71
msgid "Important" msgid "Important"
msgstr "重要" msgstr "重要"
#: allianceauth/timerboard/form.py:70 #: allianceauth/timerboard/form.py:72
msgid "Corp-Restricted" msgid "Corp-Restricted"
msgstr "コーポレーション制限付き" msgstr "コーポレーション制限付き"

View File

@@ -4,22 +4,22 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
# Translators: # Translators:
# None None <khd1226543@gmail.com>, 2020 # Joel Falknau <ozirascal@gmail.com>, 2023
# Seowon Jung <seowon@hawaii.edu>, 2020 # None None <khd1226543@gmail.com>, 2023
# Olgeda Choi <undead.choi@gmail.com>, 2020 # ThatRagingKid, 2023
# Lahty <js03js70@gmail.com>, 2020 # Lahty <js03js70@gmail.com>, 2023
# Joel Falknau <ozirascal@gmail.com>, 2020 # Olgeda Choi <undead.choi@gmail.com>, 2023
# ThatRagingKid, 2022 # Seowon Jung <seowon@hawaii.edu>, 2023
# jackfrost, 2022 # Alpha, 2023
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-10-09 18:20+1000\n" "POT-Creation-Date: 2024-02-17 18:50+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: jackfrost, 2022\n" "Last-Translator: Alpha, 2023\n"
"Language-Team: Korean (Korea) (https://app.transifex.com/alliance-auth/teams/107430/ko_KR/)\n" "Language-Team: Korean (Korea) (https://app.transifex.com/alliance-auth/teams/107430/ko_KR/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -35,7 +35,7 @@ msgstr "Google 애널리틱스 유니버설"
msgid "Google Analytics V4" msgid "Google Analytics V4"
msgstr "Google 애널리틱스 V4" msgstr "Google 애널리틱스 V4"
#: allianceauth/authentication/decorators.py:37 #: allianceauth/authentication/decorators.py:49
msgid "A main character is required to perform that action. Add one below." msgid "A main character is required to perform that action. Add one below."
msgstr "해당 기능을 수행하려면 주 캐릭터가 요구됩니다. 아래에서 하나를 추가하시오." msgstr "해당 기능을 수행하려면 주 캐릭터가 요구됩니다. 아래에서 하나를 추가하시오."
@@ -48,63 +48,68 @@ msgstr "이메일"
msgid "You are not allowed to add or remove these restricted groups: %s" msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:80 #: allianceauth/authentication/models.py:71
msgid "English" msgid "English"
msgstr "영어" msgstr "영어"
#: allianceauth/authentication/models.py:81 #: allianceauth/authentication/models.py:72
msgid "German" msgid "German"
msgstr "독일어" msgstr "독일어"
#: allianceauth/authentication/models.py:82 #: allianceauth/authentication/models.py:73
msgid "Spanish" msgid "Spanish"
msgstr "스페인어" msgstr "스페인어"
#: allianceauth/authentication/models.py:83 #: allianceauth/authentication/models.py:74
msgid "Chinese Simplified" msgid "Chinese Simplified"
msgstr "간체자" msgstr "간체자"
#: allianceauth/authentication/models.py:84 #: allianceauth/authentication/models.py:75
msgid "Russian" msgid "Russian"
msgstr "러시아어" msgstr "러시아어"
#: allianceauth/authentication/models.py:85 #: allianceauth/authentication/models.py:76
msgid "Korean" msgid "Korean"
msgstr "한국어" msgstr "한국어"
#: allianceauth/authentication/models.py:86 #: allianceauth/authentication/models.py:77
msgid "French" msgid "French"
msgstr "프랑스어" msgstr "프랑스어"
#: allianceauth/authentication/models.py:87 #: allianceauth/authentication/models.py:78
msgid "Japanese" msgid "Japanese"
msgstr "일본어" msgstr "일본어"
#: allianceauth/authentication/models.py:88 #: allianceauth/authentication/models.py:79
msgid "Italian" msgid "Italian"
msgstr "이탈리아어" msgstr "이탈리아어"
#: allianceauth/authentication/models.py:91 #: allianceauth/authentication/models.py:80
msgid "Language" msgid "Ukrainian"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:96 #: allianceauth/authentication/models.py:96
msgid "Language"
msgstr ""
#: allianceauth/authentication/models.py:101
#: allianceauth/templates/allianceauth/night-toggle.html:6 #: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode" msgid "Night Mode"
msgstr "야간 모드" msgstr "야간 모드"
#: allianceauth/authentication/models.py:110 #: allianceauth/authentication/models.py:115
#, python-format #, python-format
msgid "State changed to: %s" msgid "State changed to: %s"
msgstr "상태가 %s로 변경됐습니다." msgstr "상태가 %s로 변경됐습니다."
#: allianceauth/authentication/models.py:111 #: allianceauth/authentication/models.py:116
#, python-format #, python-format
msgid "Your user's state is now: %(state)s" msgid "Your user's state is now: %(state)s"
msgstr "사용자의 상태는 %(state)s입니다." msgstr "사용자의 상태는 %(state)s입니다."
#: allianceauth/authentication/templates/authentication/dashboard.html:4 #: allianceauth/authentication/templates/authentication/dashboard.html:4
#: allianceauth/authentication/templates/authentication/dashboard.html:7 #: allianceauth/authentication/templates/authentication/dashboard.html:7
#: allianceauth/authentication/templates/authentication/tokens.html:4
#: allianceauth/templates/allianceauth/side-menu.html:10 #: allianceauth/templates/allianceauth/side-menu.html:10
msgid "Dashboard" msgid "Dashboard"
msgstr "대시보드" msgstr "대시보드"
@@ -163,8 +168,50 @@ msgstr "코퍼레이션"
msgid "Alliance" msgid "Alliance"
msgstr "얼라이언스" msgstr "얼라이언스"
#: allianceauth/authentication/templates/authentication/tokens.html:7
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62
msgid "Token Management"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:12
msgid "Scopes"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:13
#: allianceauth/hrapplications/templates/hrapplications/management.html:28
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:127
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/hrapplications/templates/hrapplications/view.html:73
#: allianceauth/srp/templates/srp/data.html:101
#: allianceauth/srp/templates/srp/management.html:44
msgid "Actions"
msgstr "활동"
#: allianceauth/authentication/templates/authentication/tokens.html:14
#: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112
#: allianceauth/corputils/templates/corputils/corpstats.html:156
#: allianceauth/corputils/templates/corputils/search.html:13
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:26
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
msgid "Character"
msgstr "캐릭터"
#: allianceauth/authentication/templates/authentication/tokens.html:28
msgid ""
"This page is a best attempt, but backups or database logs can still contain "
"your tokens. Always revoke tokens on "
"https://community.eveonline.com/support/third-party-applications/ where "
"possible."
msgstr ""
#: allianceauth/authentication/templates/public/login.html:6 #: allianceauth/authentication/templates/public/login.html:6
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:58 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:69
msgid "Login" msgid "Login"
msgstr "로그인" msgstr "로그인"
@@ -196,47 +243,49 @@ msgstr "등록"
msgid "Invalid or expired activation link." msgid "Invalid or expired activation link."
msgstr "유효하지 않거나 만료된 활성화 주소" msgstr "유효하지 않거나 만료된 활성화 주소"
#: allianceauth/authentication/views.py:77 #: allianceauth/authentication/views.py:118
#, python-format #, python-format
msgid "" msgid ""
"Cannot change main character to %(char)s: character owned by a different " "Cannot change main character to %(char)s: character owned by a different "
"account." "account."
msgstr "%(char)s를 주 캐릭터로 변경할 수 없음: 다른 계정이 해당 캐릭터를 소유하고 있습니다." msgstr "%(char)s를 주 캐릭터로 변경할 수 없음: 다른 계정이 해당 캐릭터를 소유하고 있습니다."
#: allianceauth/authentication/views.py:83 #: allianceauth/authentication/views.py:124
#, python-format #, python-format
msgid "Changed main character to %(char)s" msgid "Changed main character to %(char)s"
msgstr "주 캐릭터가 %(char)s로 변경됨" msgstr "주 캐릭터가 %(char)s로 변경됨"
#: allianceauth/authentication/views.py:92 #: allianceauth/authentication/views.py:133
#, python-format #, python-format
msgid "Added %(name)s to your account." msgid "Added %(name)s to your account."
msgstr "계정에 %(name)s를 추가했습니다." msgstr "계정에 %(name)s를 추가했습니다."
#: allianceauth/authentication/views.py:94 #: allianceauth/authentication/views.py:135
#, python-format #, python-format
msgid "Failed to add %(name)s to your account: they already have an account." msgid "Failed to add %(name)s to your account: they already have an account."
msgstr "계정에 %(name)s를 추가하지 못했습니다. 이미 다른 계정에 추가되었습니다." msgstr "계정에 %(name)s를 추가하지 못했습니다. 이미 다른 계정에 추가되었습니다."
#: allianceauth/authentication/views.py:133 #: allianceauth/authentication/views.py:178
msgid "Unable to authenticate as the selected character." msgid ""
msgstr "선택한 캐릭터로 인증할 수 없습니다." "Unable to authenticate as the selected character. Please log in with the "
"main character associated with this account."
msgstr ""
#: allianceauth/authentication/views.py:197 #: allianceauth/authentication/views.py:244
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "가입 토큰이 만료되었습니다." msgstr "가입 토큰이 만료되었습니다."
#: allianceauth/authentication/views.py:252 #: allianceauth/authentication/views.py:302
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
msgstr "확인 메일 전송됨. 다음 링크를 눌러 이메일 주소를 확인하세요." msgstr "확인 메일 전송됨. 다음 링크를 눌러 이메일 주소를 확인하세요."
#: allianceauth/authentication/views.py:257 #: allianceauth/authentication/views.py:307
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "이메일 주소가 확인되었습니다. 로그인 해주세요." msgstr "이메일 주소가 확인되었습니다. 로그인 해주세요."
#: allianceauth/authentication/views.py:262 #: allianceauth/authentication/views.py:312
msgid "Registration of new accounts is not allowed at this time." msgid "Registration of new accounts is not allowed at this time."
msgstr "현재 새로운 계정 등록은 받지않습니다." msgstr "현재 새로운 계정 등록은 받지않습니다."
@@ -279,19 +328,6 @@ msgstr "미등록"
msgid "Last update:" msgid "Last update:"
msgstr "마지막 업데이트:" msgstr "마지막 업데이트:"
#: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112
#: allianceauth/corputils/templates/corputils/corpstats.html:156
#: allianceauth/corputils/templates/corputils/search.html:13
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:26
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
msgid "Character"
msgstr "캐릭터"
#: allianceauth/corputils/templates/corputils/corpstats.html:75 #: allianceauth/corputils/templates/corputils/corpstats.html:75
#: allianceauth/corputils/templates/corputils/search.html:14 #: allianceauth/corputils/templates/corputils/search.html:14
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
@@ -621,19 +657,24 @@ msgstr ""
msgid "Group Management" msgid "Group Management"
msgstr "그룹 관리" msgstr "그룹 관리"
#: allianceauth/groupmanagement/forms.py:15 #: allianceauth/groupmanagement/forms.py:18
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35
msgid "Users"
msgstr "사용자"
#: allianceauth/groupmanagement/forms.py:52
msgid "This name has been reserved and can not be used for groups." msgid "This name has been reserved and can not be used for groups."
msgstr "이 이름은 이미 사용되었으며 그룹의 이름으로 사용될 수 없습니다." msgstr "이 이름은 이미 사용되었으며 그룹의 이름으로 사용될 수 없습니다."
#: allianceauth/groupmanagement/forms.py:25 #: allianceauth/groupmanagement/forms.py:62
msgid "(auto)" msgid "(auto)"
msgstr "(자동)" msgstr "(자동)"
#: allianceauth/groupmanagement/forms.py:34 #: allianceauth/groupmanagement/forms.py:71
msgid "There already exists a group with that name." msgid "There already exists a group with that name."
msgstr "이 이름을 가진 그룹이 이미 있습니다." msgstr "이 이름을 가진 그룹이 이미 있습니다."
#: allianceauth/groupmanagement/models.py:105 #: allianceauth/groupmanagement/models.py:104
msgid "" msgid ""
"Internal group, users cannot see, join or request to join this " "Internal group, users cannot see, join or request to join this "
"group.<br>Used for groups such as Members, Corp_*, Alliance_* " "group.<br>Used for groups such as Members, Corp_*, Alliance_* "
@@ -642,11 +683,11 @@ msgstr ""
"시스템 그룹, 유저들은 이 그룹을 보거나, 참여하거나, 지원할 수 없습니다. <br>멤버, 코퍼레이션_*, 얼라이언스_* 등에 " "시스템 그룹, 유저들은 이 그룹을 보거나, 참여하거나, 지원할 수 없습니다. <br>멤버, 코퍼레이션_*, 얼라이언스_* 등에 "
"사용됨.<br><b>선택된 경우 비공개와 공개 옵션을 무시함.</b>" "사용됨.<br><b>선택된 경우 비공개와 공개 옵션을 무시함.</b>"
#: allianceauth/groupmanagement/models.py:113 #: allianceauth/groupmanagement/models.py:112
msgid "Group is hidden from users but can still join with the correct link." msgid "Group is hidden from users but can still join with the correct link."
msgstr "비공개 그룹이지만 링크를 통해 참여할 수 있음." msgstr "비공개 그룹이지만 링크를 통해 참여할 수 있음."
#: allianceauth/groupmanagement/models.py:119 #: allianceauth/groupmanagement/models.py:118
msgid "" msgid ""
"Group is open and users will be automatically added upon request.<br>If the " "Group is open and users will be automatically added upon request.<br>If the "
"group is not open users will need their request manually approved." "group is not open users will need their request manually approved."
@@ -654,7 +695,7 @@ msgstr ""
"그룹은 공개되어 있으며 요청 시 유저는 자동적으로 추가됩니다.<br>그룹이 공개되어 있지 않은 경우, 유저는 직접 요청을 승인받아야 " "그룹은 공개되어 있으며 요청 시 유저는 자동적으로 추가됩니다.<br>그룹이 공개되어 있지 않은 경우, 유저는 직접 요청을 승인받아야 "
"합니다." "합니다."
#: allianceauth/groupmanagement/models.py:126 #: allianceauth/groupmanagement/models.py:125
msgid "" msgid ""
"Group is public. Any registered user is able to join this group, with " "Group is public. Any registered user is able to join this group, with "
"visibility based on the other options set for this group.<br>Auth will not " "visibility based on the other options set for this group.<br>Auth will not "
@@ -664,13 +705,13 @@ msgstr ""
"공개 그룹입니다. 등록된 모든 유저는 이 그룹에 참여할 수 있으며, 이 그룹의 설정에 따라 공개 여부가 달라집니다.<br>유저가 더 " "공개 그룹입니다. 등록된 모든 유저는 이 그룹에 참여할 수 있으며, 이 그룹의 설정에 따라 공개 여부가 달라집니다.<br>유저가 더 "
"이상 인증을 하지 않을 때, Auth는 이 그룹에서 유저를 자동 추방하지 않습니다." "이상 인증을 하지 않을 때, Auth는 이 그룹에서 유저를 자동 추방하지 않습니다."
#: allianceauth/groupmanagement/models.py:135 #: allianceauth/groupmanagement/models.py:134
msgid "" msgid ""
"Group is restricted. This means that adding or removing users for this group" "Group is restricted. This means that adding or removing users for this group"
" requires a superuser admin." " requires a superuser admin."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:144 #: allianceauth/groupmanagement/models.py:143
msgid "" msgid ""
"Group leaders can process requests for this group. Use the " "Group leaders can process requests for this group. Use the "
"<code>auth.group_management</code> permission to allow a user to manage all " "<code>auth.group_management</code> permission to allow a user to manage all "
@@ -679,7 +720,7 @@ msgstr ""
"그룹 리더는 이 그룹의 요청을 처리할 수 있습니다. <code>auth.group_management</code> 권한을 사용하여 " "그룹 리더는 이 그룹의 요청을 처리할 수 있습니다. <code>auth.group_management</code> 권한을 사용하여 "
"사용자가 모든 그룹을 관리할 수 있도록 합니다.<br>" "사용자가 모든 그룹을 관리할 수 있도록 합니다.<br>"
#: allianceauth/groupmanagement/models.py:154 #: allianceauth/groupmanagement/models.py:153
msgid "" msgid ""
"Members of leader groups can process requests for this group. Use the " "Members of leader groups can process requests for this group. Use the "
"<code>auth.group_management</code> permission to allow a user to manage all " "<code>auth.group_management</code> permission to allow a user to manage all "
@@ -688,46 +729,46 @@ msgstr ""
"리더 그룹의 구성원은 이 그룹에 대한 요청을 처리할 수 있습니다. <code>1auth.group_management1</code> " "리더 그룹의 구성원은 이 그룹에 대한 요청을 처리할 수 있습니다. <code>1auth.group_management1</code> "
"권한을 사용하여 사용자가 모든 그룹을 관리할 수 있도록 합니다.<br>" "권한을 사용하여 사용자가 모든 그룹을 관리할 수 있도록 합니다.<br>"
#: allianceauth/groupmanagement/models.py:163 #: allianceauth/groupmanagement/models.py:162
msgid "" msgid ""
"States listed here will have the ability to join this group provided they " "States listed here will have the ability to join this group provided they "
"have the proper permissions.<br>" "have the proper permissions.<br>"
msgstr "만약 그들이 적절한 권한을 가졌다면, 여기 목록에 있는 신분 상태는 이 그룹에 가입할 수 있습니다." msgstr "만약 그들이 적절한 권한을 가졌다면, 여기 목록에 있는 신분 상태는 이 그룹에 가입할 수 있습니다."
#: allianceauth/groupmanagement/models.py:171 #: allianceauth/groupmanagement/models.py:170
msgid "" msgid ""
"Short description <i>(max. 512 characters)</i> of the group shown to users." "Short description <i>(max. 512 characters)</i> of the group shown to users."
msgstr "사용자에게 나타나는 그룹에 대한 간단한 설명 <i>(최대 512자)</i> 입니다." msgstr "사용자에게 나타나는 그룹에 대한 간단한 설명 <i>(최대 512자)</i> 입니다."
#: allianceauth/groupmanagement/models.py:178 #: allianceauth/groupmanagement/models.py:177
msgid "Can request non-public groups" msgid "Can request non-public groups"
msgstr "공용 그룹에 가입할 수 없음" msgstr "공용 그룹에 가입할 수 없음"
#: allianceauth/groupmanagement/models.py:209 #: allianceauth/groupmanagement/models.py:208
msgid "name" msgid "name"
msgstr "이름" msgstr "이름"
#: allianceauth/groupmanagement/models.py:212 #: allianceauth/groupmanagement/models.py:211
msgid "Name that can not be used for groups." msgid "Name that can not be used for groups."
msgstr "그룹에 사용할 수 없는 이름입니다." msgstr "그룹에 사용할 수 없는 이름입니다."
#: allianceauth/groupmanagement/models.py:215 #: allianceauth/groupmanagement/models.py:214
msgid "reason" msgid "reason"
msgstr "원인" msgstr "원인"
#: allianceauth/groupmanagement/models.py:215 #: allianceauth/groupmanagement/models.py:214
msgid "Reason why this name is reserved." msgid "Reason why this name is reserved."
msgstr "이 이름이 예약된 이유입니다." msgstr "이 이름이 예약된 이유입니다."
#: allianceauth/groupmanagement/models.py:218 #: allianceauth/groupmanagement/models.py:217
msgid "created by" msgid "created by"
msgstr "생성자:" msgstr "생성자:"
#: allianceauth/groupmanagement/models.py:223 #: allianceauth/groupmanagement/models.py:222
msgid "created at" msgid "created at"
msgstr "생성일:" msgstr "생성일:"
#: allianceauth/groupmanagement/models.py:223 #: allianceauth/groupmanagement/models.py:222
msgid "Date when this entry was created" msgid "Date when this entry was created"
msgstr "이 항목이 생성된 날짜" msgstr "이 항목이 생성된 날짜"
@@ -954,86 +995,86 @@ msgstr "그룹 요청"
msgid "Group Membership" msgid "Group Membership"
msgstr "참가 중인 그룹" msgstr "참가 중인 그룹"
#: allianceauth/groupmanagement/views.py:163 #: allianceauth/groupmanagement/views.py:166
#, python-format #, python-format
msgid "Removed user %(user)s from group %(group)s." msgid "Removed user %(user)s from group %(group)s."
msgstr "유저 %(user)s이(가) %(group)s에서 제거됨." msgstr "유저 %(user)s이(가) %(group)s에서 제거됨."
#: allianceauth/groupmanagement/views.py:165 #: allianceauth/groupmanagement/views.py:168
msgid "User does not exist in that group" msgid "User does not exist in that group"
msgstr "사용자가 해당 그룹에 존재하지 않음." msgstr "사용자가 해당 그룹에 존재하지 않음."
#: allianceauth/groupmanagement/views.py:168 #: allianceauth/groupmanagement/views.py:171
msgid "Group does not exist" msgid "Group does not exist"
msgstr "그룹이 존재하지 않음." msgstr "그룹이 존재하지 않음."
#: allianceauth/groupmanagement/views.py:195 #: allianceauth/groupmanagement/views.py:198
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to %(group)s." msgid "Accepted application from %(mainchar)s to %(group)s."
msgstr "%(mainchar)s의 %(group)s 그룹 신청 수락" msgstr "%(mainchar)s의 %(group)s 그룹 신청 수락"
#: allianceauth/groupmanagement/views.py:201 #: allianceauth/groupmanagement/views.py:204
#: allianceauth/groupmanagement/views.py:232 #: allianceauth/groupmanagement/views.py:235
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
"%(mainchar)s to %(group)s." "%(mainchar)s to %(group)s."
msgstr "%(mainchar)s의 %(group)s 그룹 신청을 처리하는 중 알 수 없는 에러 발생" msgstr "%(mainchar)s의 %(group)s 그룹 신청을 처리하는 중 알 수 없는 에러 발생"
#: allianceauth/groupmanagement/views.py:226 #: allianceauth/groupmanagement/views.py:229
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to %(group)s." msgid "Rejected application from %(mainchar)s to %(group)s."
msgstr "%(mainchar)s의 %(group)s 그룹 신청 거절" msgstr "%(mainchar)s의 %(group)s 그룹 신청 거절"
#: allianceauth/groupmanagement/views.py:261 #: allianceauth/groupmanagement/views.py:264
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to leave %(group)s." msgid "Accepted application from %(mainchar)s to leave %(group)s."
msgstr "%(mainchar)s의 %(group)s 그룹 탈퇴 수락" msgstr "%(mainchar)s의 %(group)s 그룹 탈퇴 수락"
#: allianceauth/groupmanagement/views.py:266 #: allianceauth/groupmanagement/views.py:269
#: allianceauth/groupmanagement/views.py:298 #: allianceauth/groupmanagement/views.py:301
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
"%(mainchar)s to leave %(group)s." "%(mainchar)s to leave %(group)s."
msgstr "%(mainchar)s의 %(group)s 그룹 탈퇴를 처리하는 중 알 수 없는 에러 발생" msgstr "%(mainchar)s의 %(group)s 그룹 탈퇴를 처리하는 중 알 수 없는 에러 발생"
#: allianceauth/groupmanagement/views.py:292 #: allianceauth/groupmanagement/views.py:295
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to leave %(group)s." msgid "Rejected application from %(mainchar)s to leave %(group)s."
msgstr "%(mainchar)s의 %(group)s 그룹 탈퇴 거절" msgstr "%(mainchar)s의 %(group)s 그룹 탈퇴 거절"
#: allianceauth/groupmanagement/views.py:336 #: allianceauth/groupmanagement/views.py:339
#: allianceauth/groupmanagement/views.py:346 #: allianceauth/groupmanagement/views.py:349
msgid "You cannot join that group" msgid "You cannot join that group"
msgstr "해당 그룹에 참여할 수 없습니다." msgstr "해당 그룹에 참여할 수 없습니다."
#: allianceauth/groupmanagement/views.py:341 #: allianceauth/groupmanagement/views.py:344
msgid "You are already a member of that group." msgid "You are already a member of that group."
msgstr "이미 해당 그룹에 가입되어 있습니다." msgstr "이미 해당 그룹에 가입되어 있습니다."
#: allianceauth/groupmanagement/views.py:358 #: allianceauth/groupmanagement/views.py:361
msgid "You already have a pending application for that group." msgid "You already have a pending application for that group."
msgstr "해당 그룹에 대한 참여신청이 보류되었습니다." msgstr "해당 그룹에 대한 참여신청이 보류되었습니다."
#: allianceauth/groupmanagement/views.py:367 #: allianceauth/groupmanagement/views.py:370
#, python-format #, python-format
msgid "Applied to group %(group)s." msgid "Applied to group %(group)s."
msgstr "%(group)s그룹에 지원하였음." msgstr "%(group)s그룹에 지원하였음."
#: allianceauth/groupmanagement/views.py:377 #: allianceauth/groupmanagement/views.py:380
msgid "You cannot leave that group" msgid "You cannot leave that group"
msgstr "해당 그룹을 떠날 수 없습니다." msgstr "해당 그룹을 떠날 수 없습니다."
#: allianceauth/groupmanagement/views.py:381 #: allianceauth/groupmanagement/views.py:384
msgid "You are not a member of that group" msgid "You are not a member of that group"
msgstr "해당그룹의 멤버가 아닙니다." msgstr "해당그룹의 멤버가 아닙니다."
#: allianceauth/groupmanagement/views.py:393 #: allianceauth/groupmanagement/views.py:396
msgid "You already have a pending leave request for that group." msgid "You already have a pending leave request for that group."
msgstr "해당 그룹의 탈퇴 신청이 접수된 상태입니다." msgstr "해당 그룹의 탈퇴 신청이 접수된 상태입니다."
#: allianceauth/groupmanagement/views.py:409 #: allianceauth/groupmanagement/views.py:412
#, python-format #, python-format
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "%(group)s그룹의 탈퇴가 신청됨." msgstr "%(group)s그룹의 탈퇴가 신청됨."
@@ -1095,16 +1136,6 @@ msgstr "지원서 작성"
msgid "Username" msgid "Username"
msgstr "사용자명" msgstr "사용자명"
#: allianceauth/hrapplications/templates/hrapplications/management.html:28
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:127
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/hrapplications/templates/hrapplications/view.html:73
#: allianceauth/srp/templates/srp/data.html:101
#: allianceauth/srp/templates/srp/management.html:44
msgid "Actions"
msgstr "활동"
#: allianceauth/hrapplications/templates/hrapplications/management.html:38 #: allianceauth/hrapplications/templates/hrapplications/management.html:38
#: allianceauth/hrapplications/templates/hrapplications/management.html:99 #: allianceauth/hrapplications/templates/hrapplications/management.html:99
#: allianceauth/hrapplications/templates/hrapplications/management.html:143 #: allianceauth/hrapplications/templates/hrapplications/management.html:143
@@ -1443,10 +1474,6 @@ msgstr "모델"
msgid "Code Name" msgid "Code Name"
msgstr "코드명" msgstr "코드명"
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35
msgid "Users"
msgstr "사용자"
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41
msgid "States" msgid "States"
msgstr "상태" msgstr "상태"
@@ -2170,11 +2197,11 @@ msgid ""
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:95 #: allianceauth/templates/allianceauth/admin-status/overview.html:95
#, python-format msgid "running"
msgid "" msgstr ""
"\n"
" %(queue_length)s queued tasks\n" #: allianceauth/templates/allianceauth/admin-status/overview.html:96
" " msgid "queued"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/top-menu-admin.html:9 #: allianceauth/templates/allianceauth/top-menu-admin.html:9
@@ -2190,11 +2217,11 @@ msgid "AA Support Discord"
msgstr "AA Support Discord" msgstr "AA Support Discord"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:14 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:16
msgid "User Menu" msgid "User Menu"
msgstr "사용자 매뉴" msgstr "사용자 매뉴"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:56 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:67
msgid "Logout" msgid "Logout"
msgstr "로그아웃" msgstr "로그아웃"
@@ -2250,22 +2277,30 @@ msgid "Objective"
msgstr "목표 대상" msgstr "목표 대상"
#: allianceauth/timerboard/form.py:64 #: allianceauth/timerboard/form.py:64
msgid "Absolute Timer"
msgstr ""
#: allianceauth/timerboard/form.py:65
msgid "Date and Time"
msgstr ""
#: allianceauth/timerboard/form.py:66
msgid "Days Remaining" msgid "Days Remaining"
msgstr "남은 일수" msgstr "남은 일수"
#: allianceauth/timerboard/form.py:65 #: allianceauth/timerboard/form.py:67
msgid "Hours Remaining" msgid "Hours Remaining"
msgstr "남은 시간" msgstr "남은 시간"
#: allianceauth/timerboard/form.py:67 #: allianceauth/timerboard/form.py:69
msgid "Minutes Remaining" msgid "Minutes Remaining"
msgstr "남은 분" msgstr "남은 분"
#: allianceauth/timerboard/form.py:69 #: allianceauth/timerboard/form.py:71
msgid "Important" msgid "Important"
msgstr "중요" msgstr "중요"
#: allianceauth/timerboard/form.py:70 #: allianceauth/timerboard/form.py:72
msgid "Corp-Restricted" msgid "Corp-Restricted"
msgstr "코퍼레이션 제한" msgstr "코퍼레이션 제한"

View File

@@ -4,9 +4,9 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
# Translators: # Translators:
# Alexander Gess <de.alex.gess@gmail.com>, 2020 # Андрей Зубков <and.vareba81@gmail.com>, 2023
# Yuriy K <thedjcooltv@gmail.com>, 2020 # Yuriy K <thedjcooltv@gmail.com>, 2023
# Андрей Зубков <and.vareba81@gmail.com>, 2020 # Alexander Gess <de.alex.gess@gmail.com>, 2023
# Filipp Chertiev <f@fzfx.ru>, 2023 # Filipp Chertiev <f@fzfx.ru>, 2023
# #
#, fuzzy #, fuzzy
@@ -14,8 +14,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-10-09 18:20+1000\n" "POT-Creation-Date: 2024-02-17 18:50+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Filipp Chertiev <f@fzfx.ru>, 2023\n" "Last-Translator: Filipp Chertiev <f@fzfx.ru>, 2023\n"
"Language-Team: Russian (https://app.transifex.com/alliance-auth/teams/107430/ru/)\n" "Language-Team: Russian (https://app.transifex.com/alliance-auth/teams/107430/ru/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -32,7 +32,7 @@ msgstr "Google Analytics Universal"
msgid "Google Analytics V4" msgid "Google Analytics V4"
msgstr "Google Analytics V4" msgstr "Google Analytics V4"
#: allianceauth/authentication/decorators.py:37 #: allianceauth/authentication/decorators.py:49
msgid "A main character is required to perform that action. Add one below." msgid "A main character is required to perform that action. Add one below."
msgstr "" msgstr ""
"Для продолжения следует указать основного персонажа. Выберите его ниже." "Для продолжения следует указать основного персонажа. Выберите его ниже."
@@ -46,63 +46,68 @@ msgstr "Email"
msgid "You are not allowed to add or remove these restricted groups: %s" msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr "Вам не разрешено добавлять или удалять эти ограниченные группы: %s" msgstr "Вам не разрешено добавлять или удалять эти ограниченные группы: %s"
#: allianceauth/authentication/models.py:80 #: allianceauth/authentication/models.py:71
msgid "English" msgid "English"
msgstr "Английский" msgstr "Английский"
#: allianceauth/authentication/models.py:81 #: allianceauth/authentication/models.py:72
msgid "German" msgid "German"
msgstr "Немецкий" msgstr "Немецкий"
#: allianceauth/authentication/models.py:82 #: allianceauth/authentication/models.py:73
msgid "Spanish" msgid "Spanish"
msgstr "Испанский" msgstr "Испанский"
#: allianceauth/authentication/models.py:83 #: allianceauth/authentication/models.py:74
msgid "Chinese Simplified" msgid "Chinese Simplified"
msgstr "Китайский упрощённый" msgstr "Китайский упрощённый"
#: allianceauth/authentication/models.py:84 #: allianceauth/authentication/models.py:75
msgid "Russian" msgid "Russian"
msgstr "Русский" msgstr "Русский"
#: allianceauth/authentication/models.py:85 #: allianceauth/authentication/models.py:76
msgid "Korean" msgid "Korean"
msgstr "Корейский" msgstr "Корейский"
#: allianceauth/authentication/models.py:86 #: allianceauth/authentication/models.py:77
msgid "French" msgid "French"
msgstr "Французский" msgstr "Французский"
#: allianceauth/authentication/models.py:87 #: allianceauth/authentication/models.py:78
msgid "Japanese" msgid "Japanese"
msgstr "Японский" msgstr "Японский"
#: allianceauth/authentication/models.py:88 #: allianceauth/authentication/models.py:79
msgid "Italian" msgid "Italian"
msgstr "Итальянский" msgstr "Итальянский"
#: allianceauth/authentication/models.py:91 #: allianceauth/authentication/models.py:80
msgid "Ukrainian"
msgstr ""
#: allianceauth/authentication/models.py:96
msgid "Language" msgid "Language"
msgstr "Язык" msgstr "Язык"
#: allianceauth/authentication/models.py:96 #: allianceauth/authentication/models.py:101
#: allianceauth/templates/allianceauth/night-toggle.html:6 #: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode" msgid "Night Mode"
msgstr "Ночной режим" msgstr "Ночной режим"
#: allianceauth/authentication/models.py:110 #: allianceauth/authentication/models.py:115
#, python-format #, python-format
msgid "State changed to: %s" msgid "State changed to: %s"
msgstr "Статус изменен: %s" msgstr "Статус изменен: %s"
#: allianceauth/authentication/models.py:111 #: allianceauth/authentication/models.py:116
#, python-format #, python-format
msgid "Your user's state is now: %(state)s" msgid "Your user's state is now: %(state)s"
msgstr "Статус пилота: %(state)s" msgstr "Статус пилота: %(state)s"
#: allianceauth/authentication/templates/authentication/dashboard.html:4 #: allianceauth/authentication/templates/authentication/dashboard.html:4
#: allianceauth/authentication/templates/authentication/dashboard.html:7 #: allianceauth/authentication/templates/authentication/dashboard.html:7
#: allianceauth/authentication/templates/authentication/tokens.html:4
#: allianceauth/templates/allianceauth/side-menu.html:10 #: allianceauth/templates/allianceauth/side-menu.html:10
msgid "Dashboard" msgid "Dashboard"
msgstr "Панель показателей" msgstr "Панель показателей"
@@ -161,8 +166,50 @@ msgstr "Корпорация"
msgid "Alliance" msgid "Alliance"
msgstr "Альянс" msgstr "Альянс"
#: allianceauth/authentication/templates/authentication/tokens.html:7
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62
msgid "Token Management"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:12
msgid "Scopes"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:13
#: allianceauth/hrapplications/templates/hrapplications/management.html:28
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:127
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/hrapplications/templates/hrapplications/view.html:73
#: allianceauth/srp/templates/srp/data.html:101
#: allianceauth/srp/templates/srp/management.html:44
msgid "Actions"
msgstr "Действия"
#: allianceauth/authentication/templates/authentication/tokens.html:14
#: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112
#: allianceauth/corputils/templates/corputils/corpstats.html:156
#: allianceauth/corputils/templates/corputils/search.html:13
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:26
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
msgid "Character"
msgstr "Персонаж"
#: allianceauth/authentication/templates/authentication/tokens.html:28
msgid ""
"This page is a best attempt, but backups or database logs can still contain "
"your tokens. Always revoke tokens on "
"https://community.eveonline.com/support/third-party-applications/ where "
"possible."
msgstr ""
#: allianceauth/authentication/templates/public/login.html:6 #: allianceauth/authentication/templates/public/login.html:6
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:58 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:69
msgid "Login" msgid "Login"
msgstr "Вход" msgstr "Вход"
@@ -195,7 +242,7 @@ msgstr "Регистрация"
msgid "Invalid or expired activation link." msgid "Invalid or expired activation link."
msgstr "Ссылка активации устарела" msgstr "Ссылка активации устарела"
#: allianceauth/authentication/views.py:77 #: allianceauth/authentication/views.py:118
#, python-format #, python-format
msgid "" msgid ""
"Cannot change main character to %(char)s: character owned by a different " "Cannot change main character to %(char)s: character owned by a different "
@@ -203,40 +250,42 @@ msgid ""
msgstr "" msgstr ""
"Нельзя сменить основного персонажа на %(char)s: похоже, что Владелец не Вы. " "Нельзя сменить основного персонажа на %(char)s: похоже, что Владелец не Вы. "
#: allianceauth/authentication/views.py:83 #: allianceauth/authentication/views.py:124
#, python-format #, python-format
msgid "Changed main character to %(char)s" msgid "Changed main character to %(char)s"
msgstr "Основной персонаж заменен на %(char)s" msgstr "Основной персонаж заменен на %(char)s"
#: allianceauth/authentication/views.py:92 #: allianceauth/authentication/views.py:133
#, python-format #, python-format
msgid "Added %(name)s to your account." msgid "Added %(name)s to your account."
msgstr "Добавлен %(name)s на Ваш аккаунт." msgstr "Добавлен %(name)s на Ваш аккаунт."
#: allianceauth/authentication/views.py:94 #: allianceauth/authentication/views.py:135
#, python-format #, python-format
msgid "Failed to add %(name)s to your account: they already have an account." msgid "Failed to add %(name)s to your account: they already have an account."
msgstr "Персонаж %(name)s уже добавлен." msgstr "Персонаж %(name)s уже добавлен."
#: allianceauth/authentication/views.py:133 #: allianceauth/authentication/views.py:178
msgid "Unable to authenticate as the selected character." msgid ""
msgstr "Невозможно авторизировать этого персонажа. " "Unable to authenticate as the selected character. Please log in with the "
"main character associated with this account."
msgstr ""
#: allianceauth/authentication/views.py:197 #: allianceauth/authentication/views.py:244
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "Регистрационный токен просрочен." msgstr "Регистрационный токен просрочен."
#: allianceauth/authentication/views.py:252 #: allianceauth/authentication/views.py:302
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
msgstr "Отправить подтверждающее письмо. Пожалуйста, подтвердите почту. " msgstr "Отправить подтверждающее письмо. Пожалуйста, подтвердите почту. "
#: allianceauth/authentication/views.py:257 #: allianceauth/authentication/views.py:307
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "Подтвердите Ваш email адрес. Зайти для подтверждения. " msgstr "Подтвердите Ваш email адрес. Зайти для подтверждения. "
#: allianceauth/authentication/views.py:262 #: allianceauth/authentication/views.py:312
msgid "Registration of new accounts is not allowed at this time." msgid "Registration of new accounts is not allowed at this time."
msgstr "Регистрация новых аккаунтов в настоящее время невозможна." msgstr "Регистрация новых аккаунтов в настоящее время невозможна."
@@ -279,19 +328,6 @@ msgstr "Не зарегистрированы"
msgid "Last update:" msgid "Last update:"
msgstr "Последнее обновление: " msgstr "Последнее обновление: "
#: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112
#: allianceauth/corputils/templates/corputils/corpstats.html:156
#: allianceauth/corputils/templates/corputils/search.html:13
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:26
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
msgid "Character"
msgstr "Персонаж"
#: allianceauth/corputils/templates/corputils/corpstats.html:75 #: allianceauth/corputils/templates/corputils/corpstats.html:75
#: allianceauth/corputils/templates/corputils/search.html:14 #: allianceauth/corputils/templates/corputils/search.html:14
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
@@ -629,20 +665,25 @@ msgstr ""
msgid "Group Management" msgid "Group Management"
msgstr "Управление Группой" msgstr "Управление Группой"
#: allianceauth/groupmanagement/forms.py:15 #: allianceauth/groupmanagement/forms.py:18
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35
msgid "Users"
msgstr "Пользователи"
#: allianceauth/groupmanagement/forms.py:52
msgid "This name has been reserved and can not be used for groups." msgid "This name has been reserved and can not be used for groups."
msgstr "" msgstr ""
"Это имя является зарезервированным и не может быть использовано для групп." "Это имя является зарезервированным и не может быть использовано для групп."
#: allianceauth/groupmanagement/forms.py:25 #: allianceauth/groupmanagement/forms.py:62
msgid "(auto)" msgid "(auto)"
msgstr "(авто)" msgstr "(авто)"
#: allianceauth/groupmanagement/forms.py:34 #: allianceauth/groupmanagement/forms.py:71
msgid "There already exists a group with that name." msgid "There already exists a group with that name."
msgstr "Группа с таким именем уже существует." msgstr "Группа с таким именем уже существует."
#: allianceauth/groupmanagement/models.py:105 #: allianceauth/groupmanagement/models.py:104
msgid "" msgid ""
"Internal group, users cannot see, join or request to join this " "Internal group, users cannot see, join or request to join this "
"group.<br>Used for groups such as Members, Corp_*, Alliance_* " "group.<br>Used for groups such as Members, Corp_*, Alliance_* "
@@ -653,13 +694,13 @@ msgstr ""
"Members, Corp_*, Alliance_* и т. п.<br><b>Будучи выбранной, отменяет " "Members, Corp_*, Alliance_* и т. п.<br><b>Будучи выбранной, отменяет "
"настройки \"Скрытая\" и \"Открытая\".</b>" "настройки \"Скрытая\" и \"Открытая\".</b>"
#: allianceauth/groupmanagement/models.py:113 #: allianceauth/groupmanagement/models.py:112
msgid "Group is hidden from users but can still join with the correct link." msgid "Group is hidden from users but can still join with the correct link."
msgstr "" msgstr ""
"Группы скрыты от пользователей, но к ним всё ещё можно присоединиться с " "Группы скрыты от пользователей, но к ним всё ещё можно присоединиться с "
"помощью корректной ссылки." "помощью корректной ссылки."
#: allianceauth/groupmanagement/models.py:119 #: allianceauth/groupmanagement/models.py:118
msgid "" msgid ""
"Group is open and users will be automatically added upon request.<br>If the " "Group is open and users will be automatically added upon request.<br>If the "
"group is not open users will need their request manually approved." "group is not open users will need their request manually approved."
@@ -668,7 +709,7 @@ msgstr ""
"при отправке запроса.<br>Если группа не является открытой, запросы от " "при отправке запроса.<br>Если группа не является открытой, запросы от "
"пользователей будут требовать ручного подтверждения." "пользователей будут требовать ручного подтверждения."
#: allianceauth/groupmanagement/models.py:126 #: allianceauth/groupmanagement/models.py:125
msgid "" msgid ""
"Group is public. Any registered user is able to join this group, with " "Group is public. Any registered user is able to join this group, with "
"visibility based on the other options set for this group.<br>Auth will not " "visibility based on the other options set for this group.<br>Auth will not "
@@ -680,7 +721,7 @@ msgstr ""
"настройках данной группы.<br>Auth не будет удалять пользователей из этой " "настройках данной группы.<br>Auth не будет удалять пользователей из этой "
"группы автоматически при окончании срока их аутентификации." "группы автоматически при окончании срока их аутентификации."
#: allianceauth/groupmanagement/models.py:135 #: allianceauth/groupmanagement/models.py:134
msgid "" msgid ""
"Group is restricted. This means that adding or removing users for this group" "Group is restricted. This means that adding or removing users for this group"
" requires a superuser admin." " requires a superuser admin."
@@ -688,7 +729,7 @@ msgstr ""
"Группа является ограниченной. Это значит что добавление пользователей в эту " "Группа является ограниченной. Это значит что добавление пользователей в эту "
"группу или удаление из неё требует прав superuser admin." "группу или удаление из неё требует прав superuser admin."
#: allianceauth/groupmanagement/models.py:144 #: allianceauth/groupmanagement/models.py:143
msgid "" msgid ""
"Group leaders can process requests for this group. Use the " "Group leaders can process requests for this group. Use the "
"<code>auth.group_management</code> permission to allow a user to manage all " "<code>auth.group_management</code> permission to allow a user to manage all "
@@ -698,7 +739,7 @@ msgstr ""
"Используйте разрешение <code>auth.group_management</code>, чтобы позволить " "Используйте разрешение <code>auth.group_management</code>, чтобы позволить "
"пользователю управлять всеми группами.<br>" "пользователю управлять всеми группами.<br>"
#: allianceauth/groupmanagement/models.py:154 #: allianceauth/groupmanagement/models.py:153
msgid "" msgid ""
"Members of leader groups can process requests for this group. Use the " "Members of leader groups can process requests for this group. Use the "
"<code>auth.group_management</code> permission to allow a user to manage all " "<code>auth.group_management</code> permission to allow a user to manage all "
@@ -708,7 +749,7 @@ msgstr ""
"Используйте разрешение <code>auth.group_management</code>, чтобы позволить " "Используйте разрешение <code>auth.group_management</code>, чтобы позволить "
"пользователю управлять всеми группами.<br>" "пользователю управлять всеми группами.<br>"
#: allianceauth/groupmanagement/models.py:163 #: allianceauth/groupmanagement/models.py:162
msgid "" msgid ""
"States listed here will have the ability to join this group provided they " "States listed here will have the ability to join this group provided they "
"have the proper permissions.<br>" "have the proper permissions.<br>"
@@ -716,42 +757,42 @@ msgstr ""
"Статусы, перечисленные здесь, смогут присоединиться к группе, если у них " "Статусы, перечисленные здесь, смогут присоединиться к группе, если у них "
"есть соответствующие разрешения.<br>" "есть соответствующие разрешения.<br>"
#: allianceauth/groupmanagement/models.py:171 #: allianceauth/groupmanagement/models.py:170
msgid "" msgid ""
"Short description <i>(max. 512 characters)</i> of the group shown to users." "Short description <i>(max. 512 characters)</i> of the group shown to users."
msgstr "" msgstr ""
"Краткое описание <i>(макс. 512 символов)</i> группы, отображаемое " "Краткое описание <i>(макс. 512 символов)</i> группы, отображаемое "
"пользователям." "пользователям."
#: allianceauth/groupmanagement/models.py:178 #: allianceauth/groupmanagement/models.py:177
msgid "Can request non-public groups" msgid "Can request non-public groups"
msgstr "Можно отправлять запрос на непубличную группу." msgstr "Можно отправлять запрос на непубличную группу."
#: allianceauth/groupmanagement/models.py:209 #: allianceauth/groupmanagement/models.py:208
msgid "name" msgid "name"
msgstr "имя" msgstr "имя"
#: allianceauth/groupmanagement/models.py:212 #: allianceauth/groupmanagement/models.py:211
msgid "Name that can not be used for groups." msgid "Name that can not be used for groups."
msgstr "Имя, которое не может быть использовано для групп." msgstr "Имя, которое не может быть использовано для групп."
#: allianceauth/groupmanagement/models.py:215 #: allianceauth/groupmanagement/models.py:214
msgid "reason" msgid "reason"
msgstr "причина" msgstr "причина"
#: allianceauth/groupmanagement/models.py:215 #: allianceauth/groupmanagement/models.py:214
msgid "Reason why this name is reserved." msgid "Reason why this name is reserved."
msgstr "Причина, по которой это имя зарезервировано." msgstr "Причина, по которой это имя зарезервировано."
#: allianceauth/groupmanagement/models.py:218 #: allianceauth/groupmanagement/models.py:217
msgid "created by" msgid "created by"
msgstr "создано кем" msgstr "создано кем"
#: allianceauth/groupmanagement/models.py:223 #: allianceauth/groupmanagement/models.py:222
msgid "created at" msgid "created at"
msgstr "создано когда" msgstr "создано когда"
#: allianceauth/groupmanagement/models.py:223 #: allianceauth/groupmanagement/models.py:222
msgid "Date when this entry was created" msgid "Date when this entry was created"
msgstr "Дата, когда данное содержимое было создано" msgstr "Дата, когда данное содержимое было создано"
@@ -978,26 +1019,26 @@ msgstr "Групповой запрос"
msgid "Group Membership" msgid "Group Membership"
msgstr "Групповое участие" msgstr "Групповое участие"
#: allianceauth/groupmanagement/views.py:163 #: allianceauth/groupmanagement/views.py:166
#, python-format #, python-format
msgid "Removed user %(user)s from group %(group)s." msgid "Removed user %(user)s from group %(group)s."
msgstr "Пользователь %(user)s исключен из %(group)s." msgstr "Пользователь %(user)s исключен из %(group)s."
#: allianceauth/groupmanagement/views.py:165 #: allianceauth/groupmanagement/views.py:168
msgid "User does not exist in that group" msgid "User does not exist in that group"
msgstr "Пользователь не существует в этой группе." msgstr "Пользователь не существует в этой группе."
#: allianceauth/groupmanagement/views.py:168 #: allianceauth/groupmanagement/views.py:171
msgid "Group does not exist" msgid "Group does not exist"
msgstr "Группа не существует." msgstr "Группа не существует."
#: allianceauth/groupmanagement/views.py:195 #: allianceauth/groupmanagement/views.py:198
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to %(group)s." msgid "Accepted application from %(mainchar)s to %(group)s."
msgstr "Запрос от %(mainchar)sв %(group)s принят." msgstr "Запрос от %(mainchar)sв %(group)s принят."
#: allianceauth/groupmanagement/views.py:201 #: allianceauth/groupmanagement/views.py:204
#: allianceauth/groupmanagement/views.py:232 #: allianceauth/groupmanagement/views.py:235
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
@@ -1006,18 +1047,18 @@ msgstr ""
"Персонаж %(mainchar)s не может быть добавлен %(group)s, из-за непредвиденной" "Персонаж %(mainchar)s не может быть добавлен %(group)s, из-за непредвиденной"
" ошибки. " " ошибки. "
#: allianceauth/groupmanagement/views.py:226 #: allianceauth/groupmanagement/views.py:229
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to %(group)s." msgid "Rejected application from %(mainchar)s to %(group)s."
msgstr "%(mainchar)s исключен из %(group)s." msgstr "%(mainchar)s исключен из %(group)s."
#: allianceauth/groupmanagement/views.py:261 #: allianceauth/groupmanagement/views.py:264
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to leave %(group)s." msgid "Accepted application from %(mainchar)s to leave %(group)s."
msgstr "Утвержден выход %(mainchar)s из %(group)s. " msgstr "Утвержден выход %(mainchar)s из %(group)s. "
#: allianceauth/groupmanagement/views.py:266 #: allianceauth/groupmanagement/views.py:269
#: allianceauth/groupmanagement/views.py:298 #: allianceauth/groupmanagement/views.py:301
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
@@ -1026,42 +1067,42 @@ msgstr ""
"Возникла ошибка во время обработки %(mainchar)s на выход из группы " "Возникла ошибка во время обработки %(mainchar)s на выход из группы "
"%(group)s. Повторите позже." "%(group)s. Повторите позже."
#: allianceauth/groupmanagement/views.py:292 #: allianceauth/groupmanagement/views.py:295
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to leave %(group)s." msgid "Rejected application from %(mainchar)s to leave %(group)s."
msgstr "Прошение об исключении %(mainchar)s из %(group)s отклонено. " msgstr "Прошение об исключении %(mainchar)s из %(group)s отклонено. "
#: allianceauth/groupmanagement/views.py:336 #: allianceauth/groupmanagement/views.py:339
#: allianceauth/groupmanagement/views.py:346 #: allianceauth/groupmanagement/views.py:349
msgid "You cannot join that group" msgid "You cannot join that group"
msgstr "Вы не можете вступить" msgstr "Вы не можете вступить"
#: allianceauth/groupmanagement/views.py:341 #: allianceauth/groupmanagement/views.py:344
msgid "You are already a member of that group." msgid "You are already a member of that group."
msgstr "Вы уже участник этой группы." msgstr "Вы уже участник этой группы."
#: allianceauth/groupmanagement/views.py:358 #: allianceauth/groupmanagement/views.py:361
msgid "You already have a pending application for that group." msgid "You already have a pending application for that group."
msgstr "Вы уже подали заявку на вступление этой группы." msgstr "Вы уже подали заявку на вступление этой группы."
#: allianceauth/groupmanagement/views.py:367 #: allianceauth/groupmanagement/views.py:370
#, python-format #, python-format
msgid "Applied to group %(group)s." msgid "Applied to group %(group)s."
msgstr "Вступить в группу %(group)s." msgstr "Вступить в группу %(group)s."
#: allianceauth/groupmanagement/views.py:377 #: allianceauth/groupmanagement/views.py:380
msgid "You cannot leave that group" msgid "You cannot leave that group"
msgstr "Вы не можете покинуть эту группу" msgstr "Вы не можете покинуть эту группу"
#: allianceauth/groupmanagement/views.py:381 #: allianceauth/groupmanagement/views.py:384
msgid "You are not a member of that group" msgid "You are not a member of that group"
msgstr "Вы не участник группыы" msgstr "Вы не участник группыы"
#: allianceauth/groupmanagement/views.py:393 #: allianceauth/groupmanagement/views.py:396
msgid "You already have a pending leave request for that group." msgid "You already have a pending leave request for that group."
msgstr "Ваш запрос находится на рассмотрении" msgstr "Ваш запрос находится на рассмотрении"
#: allianceauth/groupmanagement/views.py:409 #: allianceauth/groupmanagement/views.py:412
#, python-format #, python-format
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "Запрос на выход из группы %(group)s." msgstr "Запрос на выход из группы %(group)s."
@@ -1123,16 +1164,6 @@ msgstr "Сделать запрос"
msgid "Username" msgid "Username"
msgstr "Пользователь" msgstr "Пользователь"
#: allianceauth/hrapplications/templates/hrapplications/management.html:28
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:127
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/hrapplications/templates/hrapplications/view.html:73
#: allianceauth/srp/templates/srp/data.html:101
#: allianceauth/srp/templates/srp/management.html:44
msgid "Actions"
msgstr "Действия"
#: allianceauth/hrapplications/templates/hrapplications/management.html:38 #: allianceauth/hrapplications/templates/hrapplications/management.html:38
#: allianceauth/hrapplications/templates/hrapplications/management.html:99 #: allianceauth/hrapplications/templates/hrapplications/management.html:99
#: allianceauth/hrapplications/templates/hrapplications/management.html:143 #: allianceauth/hrapplications/templates/hrapplications/management.html:143
@@ -1471,10 +1502,6 @@ msgstr "Модель"
msgid "Code Name" msgid "Code Name"
msgstr "Кодовое имя" msgstr "Кодовое имя"
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35
msgid "Users"
msgstr "Пользователи"
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41
msgid "States" msgid "States"
msgstr "Статусы" msgstr "Статусы"
@@ -2216,14 +2243,12 @@ msgstr ""
" Статус %(total)s обработанных задач • последние %(latest)s" " Статус %(total)s обработанных задач • последние %(latest)s"
#: allianceauth/templates/allianceauth/admin-status/overview.html:95 #: allianceauth/templates/allianceauth/admin-status/overview.html:95
#, python-format msgid "running"
msgid "" msgstr ""
"\n"
" %(queue_length)s queued tasks\n" #: allianceauth/templates/allianceauth/admin-status/overview.html:96
" " msgid "queued"
msgstr "" msgstr ""
"\n"
" %(queue_length)s запланированных задач"
#: allianceauth/templates/allianceauth/top-menu-admin.html:9 #: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin" msgid "Admin"
@@ -2238,11 +2263,11 @@ msgid "AA Support Discord"
msgstr "Discord поддержки AA" msgstr "Discord поддержки AA"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:14 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:16
msgid "User Menu" msgid "User Menu"
msgstr "Меню пользователя" msgstr "Меню пользователя"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:56 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:67
msgid "Logout" msgid "Logout"
msgstr "Выход" msgstr "Выход"
@@ -2298,22 +2323,30 @@ msgid "Objective"
msgstr "Задача" msgstr "Задача"
#: allianceauth/timerboard/form.py:64 #: allianceauth/timerboard/form.py:64
msgid "Absolute Timer"
msgstr ""
#: allianceauth/timerboard/form.py:65
msgid "Date and Time"
msgstr ""
#: allianceauth/timerboard/form.py:66
msgid "Days Remaining" msgid "Days Remaining"
msgstr "Дней осталось" msgstr "Дней осталось"
#: allianceauth/timerboard/form.py:65 #: allianceauth/timerboard/form.py:67
msgid "Hours Remaining" msgid "Hours Remaining"
msgstr "Часов осталось" msgstr "Часов осталось"
#: allianceauth/timerboard/form.py:67 #: allianceauth/timerboard/form.py:69
msgid "Minutes Remaining" msgid "Minutes Remaining"
msgstr "Минут осталось" msgstr "Минут осталось"
#: allianceauth/timerboard/form.py:69 #: allianceauth/timerboard/form.py:71
msgid "Important" msgid "Important"
msgstr "Важно" msgstr "Важно"
#: allianceauth/timerboard/form.py:70 #: allianceauth/timerboard/form.py:72
msgid "Corp-Restricted" msgid "Corp-Restricted"
msgstr "Корпорация зарегистрированна" msgstr "Корпорация зарегистрированна"

View File

@@ -4,6 +4,7 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
# Translators: # Translators:
# Denys Ivchenko, 2023
# Kristof Swensen, 2023 # Kristof Swensen, 2023
# #
#, fuzzy #, fuzzy
@@ -11,8 +12,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-10-09 18:20+1000\n" "POT-Creation-Date: 2024-02-17 18:50+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Kristof Swensen, 2023\n" "Last-Translator: Kristof Swensen, 2023\n"
"Language-Team: Ukrainian (https://app.transifex.com/alliance-auth/teams/107430/uk/)\n" "Language-Team: Ukrainian (https://app.transifex.com/alliance-auth/teams/107430/uk/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -29,10 +30,10 @@ msgstr "Універсальна Google Аналітика"
msgid "Google Analytics V4" msgid "Google Analytics V4"
msgstr "Google Analytics V4" msgstr "Google Analytics V4"
#: allianceauth/authentication/decorators.py:37 #: allianceauth/authentication/decorators.py:49
msgid "A main character is required to perform that action. Add one below." msgid "A main character is required to perform that action. Add one below."
msgstr "" msgstr ""
"Для виконання цієї дії потрібен головний персонаж. Додайте його нижче." "Для виконання цієї дії потрібен основний персонаж. Додайте його нижче."
#: allianceauth/authentication/forms.py:12 #: allianceauth/authentication/forms.py:12
msgid "Email" msgid "Email"
@@ -43,63 +44,68 @@ msgstr "Електронна пошта"
msgid "You are not allowed to add or remove these restricted groups: %s" msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr "Вам заборонено додавати або видаляти ці обмежені групи: %s" msgstr "Вам заборонено додавати або видаляти ці обмежені групи: %s"
#: allianceauth/authentication/models.py:80 #: allianceauth/authentication/models.py:71
msgid "English" msgid "English"
msgstr "Англійська" msgstr "Англійська"
#: allianceauth/authentication/models.py:81 #: allianceauth/authentication/models.py:72
msgid "German" msgid "German"
msgstr "Німецька" msgstr "Німецька"
#: allianceauth/authentication/models.py:82 #: allianceauth/authentication/models.py:73
msgid "Spanish" msgid "Spanish"
msgstr "Іспанська" msgstr "Іспанська"
#: allianceauth/authentication/models.py:83 #: allianceauth/authentication/models.py:74
msgid "Chinese Simplified" msgid "Chinese Simplified"
msgstr "Китайська спрощена" msgstr "Китайська спрощена"
#: allianceauth/authentication/models.py:84 #: allianceauth/authentication/models.py:75
msgid "Russian" msgid "Russian"
msgstr "Російська" msgstr "Російська"
#: allianceauth/authentication/models.py:85 #: allianceauth/authentication/models.py:76
msgid "Korean" msgid "Korean"
msgstr "Корейська" msgstr "Корейська"
#: allianceauth/authentication/models.py:86 #: allianceauth/authentication/models.py:77
msgid "French" msgid "French"
msgstr "Французька" msgstr "Французька"
#: allianceauth/authentication/models.py:87 #: allianceauth/authentication/models.py:78
msgid "Japanese" msgid "Japanese"
msgstr "Японська" msgstr "Японська"
#: allianceauth/authentication/models.py:88 #: allianceauth/authentication/models.py:79
msgid "Italian" msgid "Italian"
msgstr "Італійська" msgstr "Італійська"
#: allianceauth/authentication/models.py:91 #: allianceauth/authentication/models.py:80
msgid "Ukrainian"
msgstr ""
#: allianceauth/authentication/models.py:96
msgid "Language" msgid "Language"
msgstr "Мова" msgstr "Мова"
#: allianceauth/authentication/models.py:96 #: allianceauth/authentication/models.py:101
#: allianceauth/templates/allianceauth/night-toggle.html:6 #: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode" msgid "Night Mode"
msgstr "Нічний режим" msgstr "Нічний режим"
#: allianceauth/authentication/models.py:110 #: allianceauth/authentication/models.py:115
#, python-format #, python-format
msgid "State changed to: %s" msgid "State changed to: %s"
msgstr "Стан змінено на: %s" msgstr "Стан змінено на: %s"
#: allianceauth/authentication/models.py:111 #: allianceauth/authentication/models.py:116
#, python-format #, python-format
msgid "Your user's state is now: %(state)s" msgid "Your user's state is now: %(state)s"
msgstr "Стан вашого користувача зараз: %(state)s" msgstr "Стан вашого користувача зараз: %(state)s"
#: allianceauth/authentication/templates/authentication/dashboard.html:4 #: allianceauth/authentication/templates/authentication/dashboard.html:4
#: allianceauth/authentication/templates/authentication/dashboard.html:7 #: allianceauth/authentication/templates/authentication/dashboard.html:7
#: allianceauth/authentication/templates/authentication/tokens.html:4
#: allianceauth/templates/allianceauth/side-menu.html:10 #: allianceauth/templates/allianceauth/side-menu.html:10
msgid "Dashboard" msgid "Dashboard"
msgstr "Панель приладів" msgstr "Панель приладів"
@@ -124,7 +130,7 @@ msgstr "Додати персонажа"
#: allianceauth/authentication/templates/authentication/dashboard.html:115 #: allianceauth/authentication/templates/authentication/dashboard.html:115
msgid "Change Main" msgid "Change Main"
msgstr "Змінити головного персонажа" msgstr "Змінити основного персонажа"
#: allianceauth/authentication/templates/authentication/dashboard.html:125 #: allianceauth/authentication/templates/authentication/dashboard.html:125
msgid "Group Memberships" msgid "Group Memberships"
@@ -157,8 +163,50 @@ msgstr "Корпорація"
msgid "Alliance" msgid "Alliance"
msgstr "Альянс" msgstr "Альянс"
#: allianceauth/authentication/templates/authentication/tokens.html:7
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62
msgid "Token Management"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:12
msgid "Scopes"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:13
#: allianceauth/hrapplications/templates/hrapplications/management.html:28
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:127
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/hrapplications/templates/hrapplications/view.html:73
#: allianceauth/srp/templates/srp/data.html:101
#: allianceauth/srp/templates/srp/management.html:44
msgid "Actions"
msgstr "Дії"
#: allianceauth/authentication/templates/authentication/tokens.html:14
#: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112
#: allianceauth/corputils/templates/corputils/corpstats.html:156
#: allianceauth/corputils/templates/corputils/search.html:13
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:26
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
msgid "Character"
msgstr "Персонаж"
#: allianceauth/authentication/templates/authentication/tokens.html:28
msgid ""
"This page is a best attempt, but backups or database logs can still contain "
"your tokens. Always revoke tokens on "
"https://community.eveonline.com/support/third-party-applications/ where "
"possible."
msgstr ""
#: allianceauth/authentication/templates/public/login.html:6 #: allianceauth/authentication/templates/public/login.html:6
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:58 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:69
msgid "Login" msgid "Login"
msgstr "Увійти" msgstr "Увійти"
@@ -192,7 +240,7 @@ msgstr "Зареєструватися"
msgid "Invalid or expired activation link." msgid "Invalid or expired activation link."
msgstr "Невірне або прострочене посилання для активації." msgstr "Невірне або прострочене посилання для активації."
#: allianceauth/authentication/views.py:77 #: allianceauth/authentication/views.py:118
#, python-format #, python-format
msgid "" msgid ""
"Cannot change main character to %(char)s: character owned by a different " "Cannot change main character to %(char)s: character owned by a different "
@@ -201,32 +249,34 @@ msgstr ""
"Неможливо змінити основного персонажа на %(char)s: персонаж належить іншому " "Неможливо змінити основного персонажа на %(char)s: персонаж належить іншому "
"акаунту." "акаунту."
#: allianceauth/authentication/views.py:83 #: allianceauth/authentication/views.py:124
#, python-format #, python-format
msgid "Changed main character to %(char)s" msgid "Changed main character to %(char)s"
msgstr "Основний персонаж змінено на %(char)s" msgstr "Основний персонаж змінено на %(char)s"
#: allianceauth/authentication/views.py:92 #: allianceauth/authentication/views.py:133
#, python-format #, python-format
msgid "Added %(name)s to your account." msgid "Added %(name)s to your account."
msgstr "Додано %(name)s до вашого облікового запису." msgstr "Додано %(name)s до вашого облікового запису."
#: allianceauth/authentication/views.py:94 #: allianceauth/authentication/views.py:135
#, python-format #, python-format
msgid "Failed to add %(name)s to your account: they already have an account." msgid "Failed to add %(name)s to your account: they already have an account."
msgstr "" msgstr ""
"Не вдалося додати %(name)s до вашого облікового запису: у них вже є " "Не вдалося додати %(name)s до вашого облікового запису: у них вже є "
"обліковий запис." "обліковий запис."
#: allianceauth/authentication/views.py:133 #: allianceauth/authentication/views.py:178
msgid "Unable to authenticate as the selected character." msgid ""
msgstr "Не вдалося автентифікуватися як обраний персонаж." "Unable to authenticate as the selected character. Please log in with the "
"main character associated with this account."
msgstr ""
#: allianceauth/authentication/views.py:197 #: allianceauth/authentication/views.py:244
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "Токен реєстрації застарів." msgstr "Токен реєстрації застарів."
#: allianceauth/authentication/views.py:252 #: allianceauth/authentication/views.py:302
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
@@ -234,13 +284,13 @@ msgstr ""
"Відправлено лист з підтвердженням. Будь ласка, перейдіть за посиланням, щоб " "Відправлено лист з підтвердженням. Будь ласка, перейдіть за посиланням, щоб "
"підтвердити свою адресу електронної пошти." "підтвердити свою адресу електронної пошти."
#: allianceauth/authentication/views.py:257 #: allianceauth/authentication/views.py:307
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "" msgstr ""
"Підтверджено вашу адресу електронної пошти. Будь ласка, увійдіть, щоб " "Підтверджено вашу адресу електронної пошти. Будь ласка, увійдіть, щоб "
"продовжити." "продовжити."
#: allianceauth/authentication/views.py:262 #: allianceauth/authentication/views.py:312
msgid "Registration of new accounts is not allowed at this time." msgid "Registration of new accounts is not allowed at this time."
msgstr "Реєстрація нових облікових записів наразі не дозволена." msgstr "Реєстрація нових облікових записів наразі не дозволена."
@@ -283,19 +333,6 @@ msgstr "Незареєстровані"
msgid "Last update:" msgid "Last update:"
msgstr "Останнє оновлення:" msgstr "Останнє оновлення:"
#: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112
#: allianceauth/corputils/templates/corputils/corpstats.html:156
#: allianceauth/corputils/templates/corputils/search.html:13
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:26
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
msgid "Character"
msgstr "Персонаж"
#: allianceauth/corputils/templates/corputils/corpstats.html:75 #: allianceauth/corputils/templates/corputils/corpstats.html:75
#: allianceauth/corputils/templates/corputils/search.html:14 #: allianceauth/corputils/templates/corputils/search.html:14
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
@@ -352,7 +389,7 @@ msgstr "Не вдалося зібрати статистику корпорац
#: allianceauth/fleetactivitytracking/auth_hooks.py:9 #: allianceauth/fleetactivitytracking/auth_hooks.py:9
msgid "Fleet Activity Tracking" msgid "Fleet Activity Tracking"
msgstr "Відстеження активності флоту" msgstr "Відстеження активності флотів"
#: allianceauth/fleetactivitytracking/forms.py:6 allianceauth/srp/form.py:8 #: allianceauth/fleetactivitytracking/forms.py:6 allianceauth/srp/form.py:8
#: allianceauth/srp/templates/srp/management.html:35 #: allianceauth/srp/templates/srp/management.html:35
@@ -456,7 +493,7 @@ msgstr "Корабель"
#: allianceauth/timerboard/templates/timerboard/view.html:202 #: allianceauth/timerboard/templates/timerboard/view.html:202
#: allianceauth/timerboard/templates/timerboard/view.html:375 #: allianceauth/timerboard/templates/timerboard/view.html:375
msgid "Eve Time" msgid "Eve Time"
msgstr "Час в грі" msgstr "Ігровий час"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:33 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:33
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:36 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:36
@@ -560,16 +597,16 @@ msgstr "Fats"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:4 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:4
msgid "Fatlink Corp Statistics" msgid "Fatlink Corp Statistics"
msgstr "Статистика корпорації Fatlink" msgstr "Статистика фатів корпорації"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:23 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:23
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:24 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:24
msgid "Average fats" msgid "Average fats"
msgstr "Середній показник fats" msgstr "Середній показник фатів"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:4 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:4
msgid "Fatlink statistics" msgid "Fatlink statistics"
msgstr "Статистика Fatlink" msgstr "Статистика фатів"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:20 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:20
msgid "Ticker" msgid "Ticker"
@@ -625,7 +662,7 @@ msgid ""
"Cannot register the fleet participation for {character.character_name}. The " "Cannot register the fleet participation for {character.character_name}. The "
"character needs to be online." "character needs to be online."
msgstr "" msgstr ""
"Не можна зареєструвати участь в флоті для {character.character_name}. " "Не вдалося зареєструвати участь в флоті для {character.character_name}. "
"Персонаж повинен бути в мережі." "Персонаж повинен бути в мережі."
#: allianceauth/groupmanagement/auth_hooks.py:17 #: allianceauth/groupmanagement/auth_hooks.py:17
@@ -633,19 +670,24 @@ msgstr ""
msgid "Group Management" msgid "Group Management"
msgstr "Керування групами" msgstr "Керування групами"
#: allianceauth/groupmanagement/forms.py:15 #: allianceauth/groupmanagement/forms.py:18
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35
msgid "Users"
msgstr "Користувачі"
#: allianceauth/groupmanagement/forms.py:52
msgid "This name has been reserved and can not be used for groups." msgid "This name has been reserved and can not be used for groups."
msgstr "Це ім'я зарезервоване і не може бути використане для груп." msgstr "Це ім'я зарезервоване і не може бути використане для груп."
#: allianceauth/groupmanagement/forms.py:25 #: allianceauth/groupmanagement/forms.py:62
msgid "(auto)" msgid "(auto)"
msgstr "(авто)" msgstr "(авто)"
#: allianceauth/groupmanagement/forms.py:34 #: allianceauth/groupmanagement/forms.py:71
msgid "There already exists a group with that name." msgid "There already exists a group with that name."
msgstr "Група з таким ім'ям вже існує." msgstr "Група з таким ім'ям вже існує."
#: allianceauth/groupmanagement/models.py:105 #: allianceauth/groupmanagement/models.py:104
msgid "" msgid ""
"Internal group, users cannot see, join or request to join this " "Internal group, users cannot see, join or request to join this "
"group.<br>Used for groups such as Members, Corp_*, Alliance_* " "group.<br>Used for groups such as Members, Corp_*, Alliance_* "
@@ -656,13 +698,12 @@ msgstr ""
"\"Members, Corp_, Alliance_ і т.д.<br><b>Перевизначає параметри Hidden і \"\n" "\"Members, Corp_, Alliance_ і т.д.<br><b>Перевизначає параметри Hidden і \"\n"
"\"Open при виборі.</b>\"" "\"Open при виборі.</b>\""
#: allianceauth/groupmanagement/models.py:113 #: allianceauth/groupmanagement/models.py:112
msgid "Group is hidden from users but can still join with the correct link." msgid "Group is hidden from users but can still join with the correct link."
msgstr "" msgstr ""
"Група прихована від користувачів, але можна приєднатися з правильним " "Група прихована від користувачів, але можна приєднатися за посиланням."
"посиланням."
#: allianceauth/groupmanagement/models.py:119 #: allianceauth/groupmanagement/models.py:118
msgid "" msgid ""
"Group is open and users will be automatically added upon request.<br>If the " "Group is open and users will be automatically added upon request.<br>If the "
"group is not open users will need their request manually approved." "group is not open users will need their request manually approved."
@@ -671,7 +712,7 @@ msgstr ""
"запитом.<br>Якщо група закрита, користувачі повинні отримати ручне " "запитом.<br>Якщо група закрита, користувачі повинні отримати ручне "
"підтвердження запиту." "підтвердження запиту."
#: allianceauth/groupmanagement/models.py:126 #: allianceauth/groupmanagement/models.py:125
msgid "" msgid ""
"Group is public. Any registered user is able to join this group, with " "Group is public. Any registered user is able to join this group, with "
"visibility based on the other options set for this group.<br>Auth will not " "visibility based on the other options set for this group.<br>Auth will not "
@@ -683,7 +724,7 @@ msgstr ""
"групи.<br>Авторизація не буде автоматично видаляти користувачів з цієї " "групи.<br>Авторизація не буде автоматично видаляти користувачів з цієї "
"групи, коли вони більше не автентифіковані." "групи, коли вони більше не автентифіковані."
#: allianceauth/groupmanagement/models.py:135 #: allianceauth/groupmanagement/models.py:134
msgid "" msgid ""
"Group is restricted. This means that adding or removing users for this group" "Group is restricted. This means that adding or removing users for this group"
" requires a superuser admin." " requires a superuser admin."
@@ -691,7 +732,7 @@ msgstr ""
"Група обмежена. Це означає, що додавання або видалення користувачів для цієї" "Група обмежена. Це означає, що додавання або видалення користувачів для цієї"
" групи вимагає адміністратора-суперкористувача." " групи вимагає адміністратора-суперкористувача."
#: allianceauth/groupmanagement/models.py:144 #: allianceauth/groupmanagement/models.py:143
msgid "" msgid ""
"Group leaders can process requests for this group. Use the " "Group leaders can process requests for this group. Use the "
"<code>auth.group_management</code> permission to allow a user to manage all " "<code>auth.group_management</code> permission to allow a user to manage all "
@@ -701,7 +742,7 @@ msgstr ""
"<code>auth.group_management</code>, щоб дозволити користувачеві керувати " "<code>auth.group_management</code>, щоб дозволити користувачеві керувати "
"всіма групами.<br>" "всіма групами.<br>"
#: allianceauth/groupmanagement/models.py:154 #: allianceauth/groupmanagement/models.py:153
msgid "" msgid ""
"Members of leader groups can process requests for this group. Use the " "Members of leader groups can process requests for this group. Use the "
"<code>auth.group_management</code> permission to allow a user to manage all " "<code>auth.group_management</code> permission to allow a user to manage all "
@@ -711,7 +752,7 @@ msgstr ""
" дозвіл <code>auth.group_management</code>, щоб дозволити користувачеві " " дозвіл <code>auth.group_management</code>, щоб дозволити користувачеві "
"керувати всіма групами.<br>" "керувати всіма групами.<br>"
#: allianceauth/groupmanagement/models.py:163 #: allianceauth/groupmanagement/models.py:162
msgid "" msgid ""
"States listed here will have the ability to join this group provided they " "States listed here will have the ability to join this group provided they "
"have the proper permissions.<br>" "have the proper permissions.<br>"
@@ -719,42 +760,42 @@ msgstr ""
"Штати, перераховані тут, матимуть змогу приєднатися до цієї групи, якщо вони" "Штати, перераховані тут, матимуть змогу приєднатися до цієї групи, якщо вони"
" мають відповідні дозволи.<br>" " мають відповідні дозволи.<br>"
#: allianceauth/groupmanagement/models.py:171 #: allianceauth/groupmanagement/models.py:170
msgid "" msgid ""
"Short description <i>(max. 512 characters)</i> of the group shown to users." "Short description <i>(max. 512 characters)</i> of the group shown to users."
msgstr "" msgstr ""
"Короткий опис <i>(максимум 512 символів)</i> групи, що відображається " "Короткий опис <i>(максимум 512 символів)</i> групи, що відображається "
"користувачам." "користувачам."
#: allianceauth/groupmanagement/models.py:178 #: allianceauth/groupmanagement/models.py:177
msgid "Can request non-public groups" msgid "Can request non-public groups"
msgstr "Може запитувати непублічні групи" msgstr "Може запитувати непублічні групи"
#: allianceauth/groupmanagement/models.py:209 #: allianceauth/groupmanagement/models.py:208
msgid "name" msgid "name"
msgstr "назва" msgstr "назва"
#: allianceauth/groupmanagement/models.py:212 #: allianceauth/groupmanagement/models.py:211
msgid "Name that can not be used for groups." msgid "Name that can not be used for groups."
msgstr "Назва, яку неможна використовувати для груп." msgstr "Назва, яку неможна використовувати для груп."
#: allianceauth/groupmanagement/models.py:215 #: allianceauth/groupmanagement/models.py:214
msgid "reason" msgid "reason"
msgstr "причина" msgstr "причина"
#: allianceauth/groupmanagement/models.py:215 #: allianceauth/groupmanagement/models.py:214
msgid "Reason why this name is reserved." msgid "Reason why this name is reserved."
msgstr "Причина, чому ця назва зарезервована." msgstr "Причина, чому ця назва зарезервована."
#: allianceauth/groupmanagement/models.py:218 #: allianceauth/groupmanagement/models.py:217
msgid "created by" msgid "created by"
msgstr "створено користувачем" msgstr "створено користувачем"
#: allianceauth/groupmanagement/models.py:223 #: allianceauth/groupmanagement/models.py:222
msgid "created at" msgid "created at"
msgstr "створено о" msgstr "створено о"
#: allianceauth/groupmanagement/models.py:223 #: allianceauth/groupmanagement/models.py:222
msgid "Date when this entry was created" msgid "Date when this entry was created"
msgstr "Дата створення цього запису" msgstr "Дата створення цього запису"
@@ -981,26 +1022,26 @@ msgstr "Групові запити"
msgid "Group Membership" msgid "Group Membership"
msgstr "Членство в групі" msgstr "Членство в групі"
#: allianceauth/groupmanagement/views.py:163 #: allianceauth/groupmanagement/views.py:166
#, python-format #, python-format
msgid "Removed user %(user)s from group %(group)s." msgid "Removed user %(user)s from group %(group)s."
msgstr "Користувач %(user)s вилучений з групи %(group)s." msgstr "Користувач %(user)s вилучений з групи %(group)s."
#: allianceauth/groupmanagement/views.py:165 #: allianceauth/groupmanagement/views.py:168
msgid "User does not exist in that group" msgid "User does not exist in that group"
msgstr "Користувача не існує в цій групі" msgstr "Користувача не існує в цій групі"
#: allianceauth/groupmanagement/views.py:168 #: allianceauth/groupmanagement/views.py:171
msgid "Group does not exist" msgid "Group does not exist"
msgstr "Група не існує" msgstr "Група не існує"
#: allianceauth/groupmanagement/views.py:195 #: allianceauth/groupmanagement/views.py:198
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to %(group)s." msgid "Accepted application from %(mainchar)s to %(group)s."
msgstr "Заявка %(mainchar)s на вступ до %(group)s прийнята." msgstr "Заявка %(mainchar)s на вступ до %(group)s прийнята."
#: allianceauth/groupmanagement/views.py:201 #: allianceauth/groupmanagement/views.py:204
#: allianceauth/groupmanagement/views.py:232 #: allianceauth/groupmanagement/views.py:235
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
@@ -1009,18 +1050,18 @@ msgstr ""
"Під час обробки заявки %(mainchar)s на вступ до %(group)s виникла помилка, " "Під час обробки заявки %(mainchar)s на вступ до %(group)s виникла помилка, "
"яку не можна обробити." "яку не можна обробити."
#: allianceauth/groupmanagement/views.py:226 #: allianceauth/groupmanagement/views.py:229
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to %(group)s." msgid "Rejected application from %(mainchar)s to %(group)s."
msgstr "Заявка %(mainchar)s на вступ до %(group)s відхилена." msgstr "Заявка %(mainchar)s на вступ до %(group)s відхилена."
#: allianceauth/groupmanagement/views.py:261 #: allianceauth/groupmanagement/views.py:264
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to leave %(group)s." msgid "Accepted application from %(mainchar)s to leave %(group)s."
msgstr "Заявка %(mainchar)s на вихід з %(group)s прийнята." msgstr "Заявка %(mainchar)s на вихід з %(group)s прийнята."
#: allianceauth/groupmanagement/views.py:266 #: allianceauth/groupmanagement/views.py:269
#: allianceauth/groupmanagement/views.py:298 #: allianceauth/groupmanagement/views.py:301
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
@@ -1029,42 +1070,42 @@ msgstr ""
"Під час обробки заявки %(mainchar)s на вихід з %(group)s виникла помилка, " "Під час обробки заявки %(mainchar)s на вихід з %(group)s виникла помилка, "
"яку не можна обробити." "яку не можна обробити."
#: allianceauth/groupmanagement/views.py:292 #: allianceauth/groupmanagement/views.py:295
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to leave %(group)s." msgid "Rejected application from %(mainchar)s to leave %(group)s."
msgstr "Заявка %(mainchar)s на вихід з %(group)s відхилена." msgstr "Заявка %(mainchar)s на вихід з %(group)s відхилена."
#: allianceauth/groupmanagement/views.py:336 #: allianceauth/groupmanagement/views.py:339
#: allianceauth/groupmanagement/views.py:346 #: allianceauth/groupmanagement/views.py:349
msgid "You cannot join that group" msgid "You cannot join that group"
msgstr "Ви не можете приєднатись до цієї групи" msgstr "Ви не можете приєднатись до цієї групи"
#: allianceauth/groupmanagement/views.py:341 #: allianceauth/groupmanagement/views.py:344
msgid "You are already a member of that group." msgid "You are already a member of that group."
msgstr "Ви вже є членом цієї групи." msgstr "Ви вже є членом цієї групи."
#: allianceauth/groupmanagement/views.py:358 #: allianceauth/groupmanagement/views.py:361
msgid "You already have a pending application for that group." msgid "You already have a pending application for that group."
msgstr "У вас вже є очікуюча заявка на вступ до цієї групи." msgstr "Ви вже подали заявку на вступ до цієї групи."
#: allianceauth/groupmanagement/views.py:367 #: allianceauth/groupmanagement/views.py:370
#, python-format #, python-format
msgid "Applied to group %(group)s." msgid "Applied to group %(group)s."
msgstr "Подано заявку на групу %(group)s." msgstr "Подано заявку на групу %(group)s."
#: allianceauth/groupmanagement/views.py:377 #: allianceauth/groupmanagement/views.py:380
msgid "You cannot leave that group" msgid "You cannot leave that group"
msgstr "Ви не можете покинути цю групу" msgstr "Ви не можете покинути цю групу"
#: allianceauth/groupmanagement/views.py:381 #: allianceauth/groupmanagement/views.py:384
msgid "You are not a member of that group" msgid "You are not a member of that group"
msgstr "Ви не є учасником цієї групи" msgstr "Ви не є учасником цієї групи"
#: allianceauth/groupmanagement/views.py:393 #: allianceauth/groupmanagement/views.py:396
msgid "You already have a pending leave request for that group." msgid "You already have a pending leave request for that group."
msgstr "Ви вже маєте очікувану запит на вихід з цієї групи." msgstr "Ви вже подали запит на вихід з цієї групи."
#: allianceauth/groupmanagement/views.py:409 #: allianceauth/groupmanagement/views.py:412
#, python-format #, python-format
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "Подано заявку на вихід з групи %(group)s." msgstr "Подано заявку на вихід з групи %(group)s."
@@ -1126,16 +1167,6 @@ msgstr "Створити заявку"
msgid "Username" msgid "Username"
msgstr "Ім'я користувача" msgstr "Ім'я користувача"
#: allianceauth/hrapplications/templates/hrapplications/management.html:28
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:127
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/hrapplications/templates/hrapplications/view.html:73
#: allianceauth/srp/templates/srp/data.html:101
#: allianceauth/srp/templates/srp/management.html:44
msgid "Actions"
msgstr "Дії"
#: allianceauth/hrapplications/templates/hrapplications/management.html:38 #: allianceauth/hrapplications/templates/hrapplications/management.html:38
#: allianceauth/hrapplications/templates/hrapplications/management.html:99 #: allianceauth/hrapplications/templates/hrapplications/management.html:99
#: allianceauth/hrapplications/templates/hrapplications/management.html:143 #: allianceauth/hrapplications/templates/hrapplications/management.html:143
@@ -1321,7 +1352,7 @@ msgstr "Всі прочитані повідомлення видалено."
#: allianceauth/optimer/auth_hooks.py:10 #: allianceauth/optimer/auth_hooks.py:10
msgid "Fleet Operations" msgid "Fleet Operations"
msgstr "Операції флоту" msgstr "Флотові операції"
#: allianceauth/optimer/form.py:12 #: allianceauth/optimer/form.py:12
#: allianceauth/optimer/templates/optimer/fleetoptable.html:11 #: allianceauth/optimer/templates/optimer/fleetoptable.html:11
@@ -1345,7 +1376,7 @@ msgstr "Тип операції"
#: allianceauth/optimer/form.py:17 #: allianceauth/optimer/form.py:17
#: allianceauth/srp/templates/srp/management.html:38 #: allianceauth/srp/templates/srp/management.html:38
msgid "Fleet Commander" msgid "Fleet Commander"
msgstr "Командувач флоту" msgstr "Командир флоту"
#: allianceauth/optimer/form.py:22 allianceauth/srp/form.py:14 #: allianceauth/optimer/form.py:22 allianceauth/srp/form.py:14
#: allianceauth/srp/templates/srp/data.html:91 #: allianceauth/srp/templates/srp/data.html:91
@@ -1400,7 +1431,7 @@ msgstr "Немає наступних таймерів."
#: allianceauth/optimer/templates/optimer/management.html:33 #: allianceauth/optimer/templates/optimer/management.html:33
msgid "Past Fleet Operations" msgid "Past Fleet Operations"
msgstr "Минулі флотові операції" msgstr "Завершені флотові операції"
#: allianceauth/optimer/templates/optimer/management.html:37 #: allianceauth/optimer/templates/optimer/management.html:37
#: allianceauth/timerboard/templates/timerboard/view.html:535 #: allianceauth/timerboard/templates/timerboard/view.html:535
@@ -1474,17 +1505,13 @@ msgstr "Модель"
msgid "Code Name" msgid "Code Name"
msgstr "Кодова назва" msgstr "Кодова назва"
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35
msgid "Users"
msgstr "Користувачі"
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41
msgid "States" msgid "States"
msgstr "Стани" msgstr "Стани"
#: allianceauth/services/abstract.py:72 #: allianceauth/services/abstract.py:72
msgid "That service account already exists" msgid "That service account already exists"
msgstr "Такий обліковий запис сервісу вже існує" msgstr "Такий сервісний обліковий запис вже існує"
#: allianceauth/services/abstract.py:103 #: allianceauth/services/abstract.py:103
#, python-brace-format #, python-brace-format
@@ -1505,7 +1532,7 @@ msgstr "Командир флоту:"
#: allianceauth/services/forms.py:8 #: allianceauth/services/forms.py:8
msgid "Fleet Comms:" msgid "Fleet Comms:"
msgstr "Комунікації флоту:" msgstr "Голосовий канал флоту:"
#: allianceauth/services/forms.py:9 #: allianceauth/services/forms.py:9
msgid "Fleet Type:" msgid "Fleet Type:"
@@ -1545,7 +1572,7 @@ msgstr "Ні"
#: allianceauth/services/forms.py:16 #: allianceauth/services/forms.py:16
msgid "Important?*" msgid "Important?*"
msgstr "Важливо?*" msgstr "Важливий?*"
#: allianceauth/services/forms.py:21 allianceauth/services/forms.py:31 #: allianceauth/services/forms.py:21 allianceauth/services/forms.py:31
msgid "Password" msgid "Password"
@@ -1614,7 +1641,7 @@ msgstr "Ви не маєте прав на доступ до Discourse."
#: allianceauth/services/modules/discourse/views.py:34 #: allianceauth/services/modules/discourse/views.py:34
msgid "You must have a main character set to access Discourse." msgid "You must have a main character set to access Discourse."
msgstr "Ви повинні мати головний персонаж, щоб отримати доступ до Discourse." msgstr "Ви повинні мати основний персонаж, щоб отримати доступ до Discourse."
#: allianceauth/services/modules/discourse/views.py:44 #: allianceauth/services/modules/discourse/views.py:44
msgid "" msgid ""
@@ -1702,7 +1729,7 @@ msgstr "Відправлено трансляцію Jabber на %s"
#: allianceauth/services/modules/openfire/views.py:144 #: allianceauth/services/modules/openfire/views.py:144
msgid "Set jabber password." msgid "Set jabber password."
msgstr "Встановлення пароля Jabber." msgstr "Встановити пароль Jabber."
#: allianceauth/services/modules/phpbb3/views.py:34 #: allianceauth/services/modules/phpbb3/views.py:34
msgid "Activated forum account." msgid "Activated forum account."
@@ -1713,7 +1740,7 @@ msgstr "Активований обліковий запис форуму."
#: allianceauth/services/modules/phpbb3/views.py:78 #: allianceauth/services/modules/phpbb3/views.py:78
#: allianceauth/services/modules/phpbb3/views.py:101 #: allianceauth/services/modules/phpbb3/views.py:101
msgid "An error occurred while processing your forum account." msgid "An error occurred while processing your forum account."
msgstr "Виникла помилка під час обробки вашого облікового запису форуму." msgstr "Виникла помилка під час обробки вашого облікового запису на форумі."
#: allianceauth/services/modules/phpbb3/views.py:53 #: allianceauth/services/modules/phpbb3/views.py:53
msgid "Deactivated forum account." msgid "Deactivated forum account."
@@ -1721,11 +1748,11 @@ msgstr "Деактивований обліковий запис форуму."
#: allianceauth/services/modules/phpbb3/views.py:70 #: allianceauth/services/modules/phpbb3/views.py:70
msgid "Reset forum password." msgid "Reset forum password."
msgstr "Скидання пароля форуму." msgstr "Скинути пароль форуму."
#: allianceauth/services/modules/phpbb3/views.py:98 #: allianceauth/services/modules/phpbb3/views.py:98
msgid "Set forum password." msgid "Set forum password."
msgstr "Встановлення пароля форуму." msgstr "Встановити пароль форуму."
#: allianceauth/services/modules/smf/views.py:52 #: allianceauth/services/modules/smf/views.py:52
msgid "Activated SMF account." msgid "Activated SMF account."
@@ -1744,11 +1771,11 @@ msgstr "Деактивований обліковий запис SMF."
#: allianceauth/services/modules/smf/views.py:95 #: allianceauth/services/modules/smf/views.py:95
msgid "Reset SMF password." msgid "Reset SMF password."
msgstr "Скидання пароля SMF." msgstr "Скинути пароль SMF."
#: allianceauth/services/modules/smf/views.py:121 #: allianceauth/services/modules/smf/views.py:121
msgid "Set SMF password." msgid "Set SMF password."
msgstr "Встановлення пароля SMF." msgstr "Встановити пароль SMF."
#: allianceauth/services/modules/teamspeak3/forms.py:14 #: allianceauth/services/modules/teamspeak3/forms.py:14
#, python-format #, python-format
@@ -1761,7 +1788,7 @@ msgstr "Оновити групи TS3"
#: allianceauth/services/modules/teamspeak3/templates/services/teamspeak3/teamspeakjoin.html:5 #: allianceauth/services/modules/teamspeak3/templates/services/teamspeak3/teamspeakjoin.html:5
msgid "Verify Teamspeak" msgid "Verify Teamspeak"
msgstr "Перевірте Teamspeak" msgstr "Перевірити Teamspeak"
#: allianceauth/services/modules/teamspeak3/templates/services/teamspeak3/teamspeakjoin.html:10 #: allianceauth/services/modules/teamspeak3/templates/services/teamspeak3/teamspeakjoin.html:10
msgid "Verify Teamspeak Identity" msgid "Verify Teamspeak Identity"
@@ -1869,11 +1896,11 @@ msgstr "Керування послугами"
#: allianceauth/services/templates/services/services.html:9 #: allianceauth/services/templates/services/services.html:9
msgid "Available Services" msgid "Available Services"
msgstr "Доступні послуги" msgstr "Доступні сервіси"
#: allianceauth/services/templates/services/services.html:14 #: allianceauth/services/templates/services/services.html:14
msgid "Service" msgid "Service"
msgstr "Послуга" msgstr "Сервіс"
#: allianceauth/services/templates/services/services.html:16 #: allianceauth/services/templates/services/services.html:16
msgid "Domain" msgid "Domain"
@@ -1881,7 +1908,7 @@ msgstr "Домен"
#: allianceauth/srp/auth_hooks.py:13 #: allianceauth/srp/auth_hooks.py:13
msgid "Ship Replacement" msgid "Ship Replacement"
msgstr "Компенсація за корабель" msgstr "Компенсації"
#: allianceauth/srp/form.py:9 #: allianceauth/srp/form.py:9
#: allianceauth/srp/templates/srp/management.html:36 #: allianceauth/srp/templates/srp/management.html:36
@@ -2220,14 +2247,12 @@ msgstr ""
"Статус %(total)s виконаних завдань • останній %(latest)s" "Статус %(total)s виконаних завдань • останній %(latest)s"
#: allianceauth/templates/allianceauth/admin-status/overview.html:95 #: allianceauth/templates/allianceauth/admin-status/overview.html:95
#, python-format msgid "running"
msgid "" msgstr ""
"\n"
" %(queue_length)s queued tasks\n" #: allianceauth/templates/allianceauth/admin-status/overview.html:96
" " msgid "queued"
msgstr "" msgstr ""
"\n"
"%(queue_length)s завдань в черзі"
#: allianceauth/templates/allianceauth/top-menu-admin.html:9 #: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin" msgid "Admin"
@@ -2242,11 +2267,11 @@ msgid "AA Support Discord"
msgstr "Підтримка AA у Discord" msgstr "Підтримка AA у Discord"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:14 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:16
msgid "User Menu" msgid "User Menu"
msgstr "Меню Користувача" msgstr "Меню Користувача"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:56 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:67
msgid "Logout" msgid "Logout"
msgstr "Вихід" msgstr "Вихід"
@@ -2302,22 +2327,30 @@ msgid "Objective"
msgstr "Мета" msgstr "Мета"
#: allianceauth/timerboard/form.py:64 #: allianceauth/timerboard/form.py:64
msgid "Absolute Timer"
msgstr ""
#: allianceauth/timerboard/form.py:65
msgid "Date and Time"
msgstr ""
#: allianceauth/timerboard/form.py:66
msgid "Days Remaining" msgid "Days Remaining"
msgstr "Залишилося днів" msgstr "Залишилося днів"
#: allianceauth/timerboard/form.py:65 #: allianceauth/timerboard/form.py:67
msgid "Hours Remaining" msgid "Hours Remaining"
msgstr "Залишилося годин" msgstr "Залишилося годин"
#: allianceauth/timerboard/form.py:67 #: allianceauth/timerboard/form.py:69
msgid "Minutes Remaining" msgid "Minutes Remaining"
msgstr "Залишилося хвилин" msgstr "Залишилося хвилин"
#: allianceauth/timerboard/form.py:69 #: allianceauth/timerboard/form.py:71
msgid "Important" msgid "Important"
msgstr "Важливо" msgstr "Важливо"
#: allianceauth/timerboard/form.py:70 #: allianceauth/timerboard/form.py:72
msgid "Corp-Restricted" msgid "Corp-Restricted"
msgstr "Обмежено для корпорації" msgstr "Обмежено для корпорації"

View File

@@ -4,18 +4,19 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
# Translators: # Translators:
# Joel Falknau <ozirascal@gmail.com>, 2020 # Shen Yang, 2023
# Jesse . <sgeine@hotmail.com>, 2020 # Jesse . <sgeine@hotmail.com>, 2023
# Aaron BuBu <351793078@qq.com>, 2020 # Aaron BuBu <351793078@qq.com>, 2023
# Joel Falknau <ozirascal@gmail.com>, 2023
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-10-09 18:20+1000\n" "POT-Creation-Date: 2024-02-17 18:50+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Aaron BuBu <351793078@qq.com>, 2020\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" "Language-Team: Chinese Simplified (https://app.transifex.com/alliance-auth/teams/107430/zh-Hans/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -31,7 +32,7 @@ msgstr ""
msgid "Google Analytics V4" msgid "Google Analytics V4"
msgstr "" msgstr ""
#: allianceauth/authentication/decorators.py:37 #: allianceauth/authentication/decorators.py:49
msgid "A main character is required to perform that action. Add one below." msgid "A main character is required to perform that action. Add one below."
msgstr "只有主要角色才能执行这个操作。在下面添加一个" msgstr "只有主要角色才能执行这个操作。在下面添加一个"
@@ -44,63 +45,68 @@ msgstr "电子邮箱"
msgid "You are not allowed to add or remove these restricted groups: %s" msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:80 #: allianceauth/authentication/models.py:71
msgid "English" msgid "English"
msgstr "" msgstr "英语"
#: allianceauth/authentication/models.py:81 #: allianceauth/authentication/models.py:72
msgid "German" msgid "German"
msgstr "" msgstr "德语"
#: allianceauth/authentication/models.py:82 #: allianceauth/authentication/models.py:73
msgid "Spanish" msgid "Spanish"
msgstr "" msgstr "西班牙语"
#: allianceauth/authentication/models.py:83 #: allianceauth/authentication/models.py:74
msgid "Chinese Simplified" msgid "Chinese Simplified"
msgstr "" msgstr "简体中文"
#: allianceauth/authentication/models.py:84 #: allianceauth/authentication/models.py:75
msgid "Russian" msgid "Russian"
msgstr "" msgstr "俄语"
#: allianceauth/authentication/models.py:85 #: allianceauth/authentication/models.py:76
msgid "Korean" msgid "Korean"
msgstr "" msgstr "韩语"
#: allianceauth/authentication/models.py:86 #: allianceauth/authentication/models.py:77
msgid "French" msgid "French"
msgstr "" msgstr "法语"
#: allianceauth/authentication/models.py:87 #: allianceauth/authentication/models.py:78
msgid "Japanese" msgid "Japanese"
msgstr "" msgstr "日语"
#: allianceauth/authentication/models.py:88 #: allianceauth/authentication/models.py:79
msgid "Italian" msgid "Italian"
msgstr "" msgstr "意大利语"
#: allianceauth/authentication/models.py:91 #: allianceauth/authentication/models.py:80
msgid "Language" msgid "Ukrainian"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:96 #: allianceauth/authentication/models.py:96
msgid "Language"
msgstr "语言"
#: allianceauth/authentication/models.py:101
#: allianceauth/templates/allianceauth/night-toggle.html:6 #: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode" msgid "Night Mode"
msgstr "" msgstr "夜间模式"
#: allianceauth/authentication/models.py:110 #: allianceauth/authentication/models.py:115
#, python-format #, python-format
msgid "State changed to: %s" msgid "State changed to: %s"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:111 #: allianceauth/authentication/models.py:116
#, python-format #, python-format
msgid "Your user's state is now: %(state)s" msgid "Your user's state is now: %(state)s"
msgstr "" msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:4 #: allianceauth/authentication/templates/authentication/dashboard.html:4
#: allianceauth/authentication/templates/authentication/dashboard.html:7 #: allianceauth/authentication/templates/authentication/dashboard.html:7
#: allianceauth/authentication/templates/authentication/tokens.html:4
#: allianceauth/templates/allianceauth/side-menu.html:10 #: allianceauth/templates/allianceauth/side-menu.html:10
msgid "Dashboard" msgid "Dashboard"
msgstr "账户总览" msgstr "账户总览"
@@ -156,8 +162,50 @@ msgstr "所在公司"
msgid "Alliance" msgid "Alliance"
msgstr "所在联盟" msgstr "所在联盟"
#: allianceauth/authentication/templates/authentication/tokens.html:7
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62
msgid "Token Management"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:12
msgid "Scopes"
msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:13
#: allianceauth/hrapplications/templates/hrapplications/management.html:28
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:127
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/hrapplications/templates/hrapplications/view.html:73
#: allianceauth/srp/templates/srp/data.html:101
#: allianceauth/srp/templates/srp/management.html:44
msgid "Actions"
msgstr "操作"
#: allianceauth/authentication/templates/authentication/tokens.html:14
#: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112
#: allianceauth/corputils/templates/corputils/corpstats.html:156
#: allianceauth/corputils/templates/corputils/search.html:13
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:26
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
msgid "Character"
msgstr "角色"
#: allianceauth/authentication/templates/authentication/tokens.html:28
msgid ""
"This page is a best attempt, but backups or database logs can still contain "
"your tokens. Always revoke tokens on "
"https://community.eveonline.com/support/third-party-applications/ where "
"possible."
msgstr ""
#: allianceauth/authentication/templates/public/login.html:6 #: allianceauth/authentication/templates/public/login.html:6
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:58 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:69
msgid "Login" msgid "Login"
msgstr "登录" msgstr "登录"
@@ -189,47 +237,49 @@ msgstr "注册"
msgid "Invalid or expired activation link." msgid "Invalid or expired activation link."
msgstr "激活链接无效或过期" msgstr "激活链接无效或过期"
#: allianceauth/authentication/views.py:77 #: allianceauth/authentication/views.py:118
#, python-format #, python-format
msgid "" msgid ""
"Cannot change main character to %(char)s: character owned by a different " "Cannot change main character to %(char)s: character owned by a different "
"account." "account."
msgstr "不能修改主角色为%(char)s这个角色被另一个账户所拥有" msgstr "不能修改主角色为%(char)s这个角色被另一个账户所拥有"
#: allianceauth/authentication/views.py:83 #: allianceauth/authentication/views.py:124
#, python-format #, python-format
msgid "Changed main character to %(char)s" msgid "Changed main character to %(char)s"
msgstr "修改主要角色为%(char)s" msgstr "修改主要角色为%(char)s"
#: allianceauth/authentication/views.py:92 #: allianceauth/authentication/views.py:133
#, python-format #, python-format
msgid "Added %(name)s to your account." msgid "Added %(name)s to your account."
msgstr "添加%(name)s到您的账户" msgstr "添加%(name)s到您的账户"
#: allianceauth/authentication/views.py:94 #: allianceauth/authentication/views.py:135
#, python-format #, python-format
msgid "Failed to add %(name)s to your account: they already have an account." msgid "Failed to add %(name)s to your account: they already have an account."
msgstr "添加%(name)s到您的账户失败他们已经在一个账户中了" msgstr "添加%(name)s到您的账户失败他们已经在一个账户中了"
#: allianceauth/authentication/views.py:133 #: allianceauth/authentication/views.py:178
msgid "Unable to authenticate as the selected character." msgid ""
msgstr "无法作为选定的角色进行身份验证" "Unable to authenticate as the selected character. Please log in with the "
"main character associated with this account."
msgstr ""
#: allianceauth/authentication/views.py:197 #: allianceauth/authentication/views.py:244
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "注册令牌过期。" msgstr "注册令牌过期。"
#: allianceauth/authentication/views.py:252 #: allianceauth/authentication/views.py:302
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
msgstr "已经发送了确认邮件。请按照链接确定您的电邮地址" msgstr "已经发送了确认邮件。请按照链接确定您的电邮地址"
#: allianceauth/authentication/views.py:257 #: allianceauth/authentication/views.py:307
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "已确认您的电邮地址。请登录以继续" msgstr "已确认您的电邮地址。请登录以继续"
#: allianceauth/authentication/views.py:262 #: allianceauth/authentication/views.py:312
msgid "Registration of new accounts is not allowed at this time." msgid "Registration of new accounts is not allowed at this time."
msgstr "" msgstr ""
@@ -272,19 +322,6 @@ msgstr "未注册成员"
msgid "Last update:" msgid "Last update:"
msgstr "最后一次更新" msgstr "最后一次更新"
#: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112
#: allianceauth/corputils/templates/corputils/corpstats.html:156
#: allianceauth/corputils/templates/corputils/search.html:13
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:26
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:55
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
msgid "Character"
msgstr "角色"
#: allianceauth/corputils/templates/corputils/corpstats.html:75 #: allianceauth/corputils/templates/corputils/corpstats.html:75
#: allianceauth/corputils/templates/corputils/search.html:14 #: allianceauth/corputils/templates/corputils/search.html:14
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31
@@ -614,36 +651,41 @@ msgstr ""
msgid "Group Management" msgid "Group Management"
msgstr "用户组管理" msgstr "用户组管理"
#: allianceauth/groupmanagement/forms.py:15 #: allianceauth/groupmanagement/forms.py:18
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35
msgid "Users"
msgstr "用户"
#: allianceauth/groupmanagement/forms.py:52
msgid "This name has been reserved and can not be used for groups." msgid "This name has been reserved and can not be used for groups."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/forms.py:25 #: allianceauth/groupmanagement/forms.py:62
msgid "(auto)" msgid "(auto)"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/forms.py:34 #: allianceauth/groupmanagement/forms.py:71
msgid "There already exists a group with that name." msgid "There already exists a group with that name."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:105 #: allianceauth/groupmanagement/models.py:104
msgid "" msgid ""
"Internal group, users cannot see, join or request to join this " "Internal group, users cannot see, join or request to join this "
"group.<br>Used for groups such as Members, Corp_*, Alliance_* " "group.<br>Used for groups such as Members, Corp_*, Alliance_* "
"etc.<br><b>Overrides Hidden and Open options when selected.</b>" "etc.<br><b>Overrides Hidden and Open options when selected.</b>"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:113 #: allianceauth/groupmanagement/models.py:112
msgid "Group is hidden from users but can still join with the correct link." msgid "Group is hidden from users but can still join with the correct link."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:119 #: allianceauth/groupmanagement/models.py:118
msgid "" msgid ""
"Group is open and users will be automatically added upon request.<br>If the " "Group is open and users will be automatically added upon request.<br>If the "
"group is not open users will need their request manually approved." "group is not open users will need their request manually approved."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:126 #: allianceauth/groupmanagement/models.py:125
msgid "" msgid ""
"Group is public. Any registered user is able to join this group, with " "Group is public. Any registered user is able to join this group, with "
"visibility based on the other options set for this group.<br>Auth will not " "visibility based on the other options set for this group.<br>Auth will not "
@@ -651,66 +693,66 @@ msgid ""
"authenticated." "authenticated."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:135 #: allianceauth/groupmanagement/models.py:134
msgid "" msgid ""
"Group is restricted. This means that adding or removing users for this group" "Group is restricted. This means that adding or removing users for this group"
" requires a superuser admin." " requires a superuser admin."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:144 #: allianceauth/groupmanagement/models.py:143
msgid "" msgid ""
"Group leaders can process requests for this group. Use the " "Group leaders can process requests for this group. Use the "
"<code>auth.group_management</code> permission to allow a user to manage all " "<code>auth.group_management</code> permission to allow a user to manage all "
"groups.<br>" "groups.<br>"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:154 #: allianceauth/groupmanagement/models.py:153
msgid "" msgid ""
"Members of leader groups can process requests for this group. Use the " "Members of leader groups can process requests for this group. Use the "
"<code>auth.group_management</code> permission to allow a user to manage all " "<code>auth.group_management</code> permission to allow a user to manage all "
"groups.<br>" "groups.<br>"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:163 #: allianceauth/groupmanagement/models.py:162
msgid "" msgid ""
"States listed here will have the ability to join this group provided they " "States listed here will have the ability to join this group provided they "
"have the proper permissions.<br>" "have the proper permissions.<br>"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:171 #: allianceauth/groupmanagement/models.py:170
msgid "" msgid ""
"Short description <i>(max. 512 characters)</i> of the group shown to users." "Short description <i>(max. 512 characters)</i> of the group shown to users."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:178 #: allianceauth/groupmanagement/models.py:177
msgid "Can request non-public groups" msgid "Can request non-public groups"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:209 #: allianceauth/groupmanagement/models.py:208
msgid "name" msgid "name"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:212 #: allianceauth/groupmanagement/models.py:211
msgid "Name that can not be used for groups." msgid "Name that can not be used for groups."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:215 #: allianceauth/groupmanagement/models.py:214
msgid "reason" msgid "reason"
msgstr "" msgstr "原因"
#: allianceauth/groupmanagement/models.py:215 #: allianceauth/groupmanagement/models.py:214
msgid "Reason why this name is reserved." msgid "Reason why this name is reserved."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:218 #: allianceauth/groupmanagement/models.py:217
msgid "created by" msgid "created by"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:223 #: allianceauth/groupmanagement/models.py:222
msgid "created at" msgid "created at"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/models.py:223 #: allianceauth/groupmanagement/models.py:222
msgid "Date when this entry was created" msgid "Date when this entry was created"
msgstr "" msgstr ""
@@ -754,7 +796,7 @@ msgstr "操作者"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:48 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:48
msgid "Removed" msgid "Removed"
msgstr "" msgstr "已移除"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:60 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:60
msgid "All times displayed are EVE/UTC." msgid "All times displayed are EVE/UTC."
@@ -937,86 +979,86 @@ msgstr "用户组请求"
msgid "Group Membership" msgid "Group Membership"
msgstr "用户组成员" msgstr "用户组成员"
#: allianceauth/groupmanagement/views.py:163 #: allianceauth/groupmanagement/views.py:166
#, python-format #, python-format
msgid "Removed user %(user)s from group %(group)s." msgid "Removed user %(user)s from group %(group)s."
msgstr "已将用户%(user)s从用户组%(group)s中移除" msgstr "已将用户%(user)s从用户组%(group)s中移除"
#: allianceauth/groupmanagement/views.py:165 #: allianceauth/groupmanagement/views.py:168
msgid "User does not exist in that group" msgid "User does not exist in that group"
msgstr "那个用户组中不存在这个用户" msgstr "那个用户组中不存在这个用户"
#: allianceauth/groupmanagement/views.py:168 #: allianceauth/groupmanagement/views.py:171
msgid "Group does not exist" msgid "Group does not exist"
msgstr "用户组不存在" msgstr "用户组不存在"
#: allianceauth/groupmanagement/views.py:195 #: allianceauth/groupmanagement/views.py:198
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to %(group)s." msgid "Accepted application from %(mainchar)s to %(group)s."
msgstr "已接受用户%(mainchar)s加入%(group)s的申请" msgstr "已接受用户%(mainchar)s加入%(group)s的申请"
#: allianceauth/groupmanagement/views.py:201 #: allianceauth/groupmanagement/views.py:204
#: allianceauth/groupmanagement/views.py:232 #: allianceauth/groupmanagement/views.py:235
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
"%(mainchar)s to %(group)s." "%(mainchar)s to %(group)s."
msgstr "在处理用户%(mainchar)s加入%(group)s的申请的过程中出现了一个搞不定的错误" msgstr "在处理用户%(mainchar)s加入%(group)s的申请的过程中出现了一个搞不定的错误"
#: allianceauth/groupmanagement/views.py:226 #: allianceauth/groupmanagement/views.py:229
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to %(group)s." msgid "Rejected application from %(mainchar)s to %(group)s."
msgstr "%(mainchar)s加入%(group)s的申请已拒绝" msgstr "%(mainchar)s加入%(group)s的申请已拒绝"
#: allianceauth/groupmanagement/views.py:261 #: allianceauth/groupmanagement/views.py:264
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to leave %(group)s." msgid "Accepted application from %(mainchar)s to leave %(group)s."
msgstr "%(mainchar)s加入%(group)s的申请已通过" msgstr "%(mainchar)s加入%(group)s的申请已通过"
#: allianceauth/groupmanagement/views.py:266 #: allianceauth/groupmanagement/views.py:269
#: allianceauth/groupmanagement/views.py:298 #: allianceauth/groupmanagement/views.py:301
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
"%(mainchar)s to leave %(group)s." "%(mainchar)s to leave %(group)s."
msgstr "在处理%(mainchar)s离开%(group)s的程序时发生了未知的错误" msgstr "在处理%(mainchar)s离开%(group)s的程序时发生了未知的错误"
#: allianceauth/groupmanagement/views.py:292 #: allianceauth/groupmanagement/views.py:295
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to leave %(group)s." msgid "Rejected application from %(mainchar)s to leave %(group)s."
msgstr "%(mainchar)s离开%(group)s的请求已被拒绝" msgstr "%(mainchar)s离开%(group)s的请求已被拒绝"
#: allianceauth/groupmanagement/views.py:336 #: allianceauth/groupmanagement/views.py:339
#: allianceauth/groupmanagement/views.py:346 #: allianceauth/groupmanagement/views.py:349
msgid "You cannot join that group" msgid "You cannot join that group"
msgstr "你无法加入那个用户组" msgstr "你无法加入那个用户组"
#: allianceauth/groupmanagement/views.py:341 #: allianceauth/groupmanagement/views.py:344
msgid "You are already a member of that group." msgid "You are already a member of that group."
msgstr "你已经是那个群组的一员了。" msgstr "你已经是那个群组的一员了。"
#: allianceauth/groupmanagement/views.py:358 #: allianceauth/groupmanagement/views.py:361
msgid "You already have a pending application for that group." msgid "You already have a pending application for that group."
msgstr "你已经有了该组的未决申请" msgstr "你已经有了该组的未决申请"
#: allianceauth/groupmanagement/views.py:367 #: allianceauth/groupmanagement/views.py:370
#, python-format #, python-format
msgid "Applied to group %(group)s." msgid "Applied to group %(group)s."
msgstr "修改已经应用到%(group)s啦" msgstr "修改已经应用到%(group)s啦"
#: allianceauth/groupmanagement/views.py:377 #: allianceauth/groupmanagement/views.py:380
msgid "You cannot leave that group" msgid "You cannot leave that group"
msgstr "你无法离开那个用户组" msgstr "你无法离开那个用户组"
#: allianceauth/groupmanagement/views.py:381 #: allianceauth/groupmanagement/views.py:384
msgid "You are not a member of that group" msgid "You are not a member of that group"
msgstr "你不是那个用户组的成员" msgstr "你不是那个用户组的成员"
#: allianceauth/groupmanagement/views.py:393 #: allianceauth/groupmanagement/views.py:396
msgid "You already have a pending leave request for that group." msgid "You already have a pending leave request for that group."
msgstr "你已经有了该组的未决离开请求" msgstr "你已经有了该组的未决离开请求"
#: allianceauth/groupmanagement/views.py:409 #: allianceauth/groupmanagement/views.py:412
#, python-format #, python-format
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "已经离开群组%(group)s" msgstr "已经离开群组%(group)s"
@@ -1078,16 +1120,6 @@ msgstr "创建申请"
msgid "Username" msgid "Username"
msgstr "用户名" msgstr "用户名"
#: allianceauth/hrapplications/templates/hrapplications/management.html:28
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:127
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/hrapplications/templates/hrapplications/view.html:73
#: allianceauth/srp/templates/srp/data.html:101
#: allianceauth/srp/templates/srp/management.html:44
msgid "Actions"
msgstr "操作"
#: allianceauth/hrapplications/templates/hrapplications/management.html:38 #: allianceauth/hrapplications/templates/hrapplications/management.html:38
#: allianceauth/hrapplications/templates/hrapplications/management.html:99 #: allianceauth/hrapplications/templates/hrapplications/management.html:99
#: allianceauth/hrapplications/templates/hrapplications/management.html:143 #: allianceauth/hrapplications/templates/hrapplications/management.html:143
@@ -1198,11 +1230,11 @@ msgstr "添加评论"
#: allianceauth/notifications/models.py:21 #: allianceauth/notifications/models.py:21
msgid "danger" msgid "danger"
msgstr "" msgstr "危险"
#: allianceauth/notifications/models.py:22 #: allianceauth/notifications/models.py:22
msgid "warning" msgid "warning"
msgstr "" msgstr "警告"
#: allianceauth/notifications/models.py:23 #: allianceauth/notifications/models.py:23
msgid "info" msgid "info"
@@ -1343,7 +1375,7 @@ msgstr "当前EVE游戏内时间"
#: allianceauth/optimer/templates/optimer/management.html:26 #: allianceauth/optimer/templates/optimer/management.html:26
msgid "Next Fleet Operations" msgid "Next Fleet Operations"
msgstr "" msgstr "下一个舰队任务"
#: allianceauth/optimer/templates/optimer/management.html:30 #: allianceauth/optimer/templates/optimer/management.html:30
#: allianceauth/timerboard/templates/timerboard/view.html:362 #: allianceauth/timerboard/templates/timerboard/view.html:362
@@ -1352,7 +1384,7 @@ msgstr "没有快到的时间节点,歇一会吧"
#: allianceauth/optimer/templates/optimer/management.html:33 #: allianceauth/optimer/templates/optimer/management.html:33
msgid "Past Fleet Operations" msgid "Past Fleet Operations"
msgstr "" msgstr "过去的舰队任务"
#: allianceauth/optimer/templates/optimer/management.html:37 #: allianceauth/optimer/templates/optimer/management.html:37
#: allianceauth/timerboard/templates/timerboard/view.html:535 #: allianceauth/timerboard/templates/timerboard/view.html:535
@@ -1426,10 +1458,6 @@ msgstr "类型"
msgid "Code Name" msgid "Code Name"
msgstr "操作类型" msgstr "操作类型"
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35
msgid "Users"
msgstr "用户"
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41
msgid "States" msgid "States"
msgstr "声望" msgstr "声望"
@@ -2152,11 +2180,11 @@ msgid ""
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:95 #: allianceauth/templates/allianceauth/admin-status/overview.html:95
#, python-format msgid "running"
msgid "" msgstr ""
"\n"
" %(queue_length)s queued tasks\n" #: allianceauth/templates/allianceauth/admin-status/overview.html:96
" " msgid "queued"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/top-menu-admin.html:9 #: allianceauth/templates/allianceauth/top-menu-admin.html:9
@@ -2172,11 +2200,11 @@ msgid "AA Support Discord"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:14 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:16
msgid "User Menu" msgid "User Menu"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:56 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:67
msgid "Logout" msgid "Logout"
msgstr "登出" msgstr "登出"
@@ -2232,22 +2260,30 @@ msgid "Objective"
msgstr "声望" msgstr "声望"
#: allianceauth/timerboard/form.py:64 #: allianceauth/timerboard/form.py:64
msgid "Absolute Timer"
msgstr ""
#: allianceauth/timerboard/form.py:65
msgid "Date and Time"
msgstr ""
#: allianceauth/timerboard/form.py:66
msgid "Days Remaining" msgid "Days Remaining"
msgstr "剩余天数" msgstr "剩余天数"
#: allianceauth/timerboard/form.py:65 #: allianceauth/timerboard/form.py:67
msgid "Hours Remaining" msgid "Hours Remaining"
msgstr "剩余小时数" msgstr "剩余小时数"
#: allianceauth/timerboard/form.py:67 #: allianceauth/timerboard/form.py:69
msgid "Minutes Remaining" msgid "Minutes Remaining"
msgstr "剩余分钟" msgstr "剩余分钟"
#: allianceauth/timerboard/form.py:69 #: allianceauth/timerboard/form.py:71
msgid "Important" msgid "Important"
msgstr "重要信息" msgstr "重要信息"
#: allianceauth/timerboard/form.py:70 #: allianceauth/timerboard/form.py:72
msgid "Corp-Restricted" msgid "Corp-Restricted"
msgstr "受限制的公司" msgstr "受限制的公司"
@@ -2257,15 +2293,15 @@ msgstr ""
#: allianceauth/timerboard/models.py:15 #: allianceauth/timerboard/models.py:15
msgid "Shield" msgid "Shield"
msgstr "" msgstr "护盾"
#: allianceauth/timerboard/models.py:16 #: allianceauth/timerboard/models.py:16
msgid "Armor" msgid "Armor"
msgstr "" msgstr "装甲"
#: allianceauth/timerboard/models.py:17 #: allianceauth/timerboard/models.py:17
msgid "Hull" msgid "Hull"
msgstr "" msgstr "结构"
#: allianceauth/timerboard/models.py:18 #: allianceauth/timerboard/models.py:18
msgid "Final" msgid "Final"
@@ -2273,11 +2309,11 @@ msgstr ""
#: allianceauth/timerboard/models.py:19 #: allianceauth/timerboard/models.py:19
msgid "Anchoring" msgid "Anchoring"
msgstr "" msgstr "铆钉"
#: allianceauth/timerboard/models.py:20 #: allianceauth/timerboard/models.py:20
msgid "Unanchoring" msgid "Unanchoring"
msgstr "" msgstr "解锚"
#: allianceauth/timerboard/templates/timerboard/timer_confirm_delete.html:11 #: allianceauth/timerboard/templates/timerboard/timer_confirm_delete.html:11
msgid "Delete Timer" msgid "Delete Timer"

View File

@@ -1,3 +1 @@
from .core import notify # noqa: F401 from .core import notify # noqa: F401
default_app_config = 'allianceauth.notifications.apps.NotificationsConfig'

View File

@@ -15,18 +15,22 @@ class NotificationAdmin(admin.ModelAdmin):
ordering = ("-timestamp", ) ordering = ("-timestamp", )
search_fields = ["user__username", "user__profile__main_character__character_name"] search_fields = ["user__username", "user__profile__main_character__character_name"]
@admin.display(
ordering="user__profile__main_character__character_name"
)
def _main(self, obj): def _main(self, obj):
try: try:
return obj.user.profile.main_character return obj.user.profile.main_character
except AttributeError: except AttributeError:
return obj.user return obj.user
_main.admin_order_field = "user__profile__main_character__character_name"
@admin.display(
ordering="user__profile__state__name"
)
def _state(self, obj): def _state(self, obj):
return obj.user.profile.state return obj.user.profile.state
_state.admin_order_field = "user__profile__state__name"
def has_change_permission(self, request, obj=None): def has_change_permission(self, request, obj=None):
return False return False

View File

@@ -44,7 +44,7 @@ def notification_view(request, notif_id):
notif.mark_viewed() notif.mark_viewed()
return render(request, 'notifications/view.html', context) return render(request, 'notifications/view.html', context)
else: else:
logger.warn( logger.warning(
"User %s not authorized to view notif_id %s belonging to user %s", "User %s not authorized to view notif_id %s belonging to user %s",
request.user, request.user,
notif_id, notif.user notif_id, notif.user

View File

@@ -13,6 +13,10 @@ app = Celery('{{ project_name }}')
# the configuration object to child processes. # the configuration object to child processes.
app.config_from_object('django.conf:settings') app.config_from_object('django.conf:settings')
# Automatically try to establish the connection to the AMQP broker on
# Celery startup if it is unavailable.
app.conf.broker_connection_retry_on_startup = True
# setup priorities ( 0 Highest, 9 Lowest ) # setup priorities ( 0 Highest, 9 Lowest )
app.conf.broker_transport_options = { app.conf.broker_transport_options = {
'priority_steps': list(range(10)), # setup que to have 10 steps 'priority_steps': list(range(10)), # setup que to have 10 steps

View File

@@ -41,23 +41,23 @@ CELERYBEAT_SCHEDULER = "django_celery_beat.schedulers.DatabaseScheduler"
CELERYBEAT_SCHEDULE = { CELERYBEAT_SCHEDULE = {
'esi_cleanup_callbackredirect': { 'esi_cleanup_callbackredirect': {
'task': 'esi.tasks.cleanup_callbackredirect', 'task': 'esi.tasks.cleanup_callbackredirect',
'schedule': crontab(minute=0, hour='*/4'), 'schedule': crontab(minute='0', hour='*/4'),
}, },
'esi_cleanup_token': { 'esi_cleanup_token': {
'task': 'esi.tasks.cleanup_token', 'task': 'esi.tasks.cleanup_token',
'schedule': crontab(minute=0, hour=0), 'schedule': crontab(minute='0', hour='0'),
}, },
'run_model_update': { 'run_model_update': {
'task': 'allianceauth.eveonline.tasks.run_model_update', 'task': 'allianceauth.eveonline.tasks.run_model_update',
'schedule': crontab(minute=0, hour="*/6"), 'schedule': crontab(minute='0', hour="*/6"),
}, },
'check_all_character_ownership': { 'check_all_character_ownership': {
'task': 'allianceauth.authentication.tasks.check_all_character_ownership', 'task': 'allianceauth.authentication.tasks.check_all_character_ownership',
'schedule': crontab(minute=0, hour='*/4'), 'schedule': crontab(minute='0', hour='*/4'),
}, },
'analytics_daily_stats': { 'analytics_daily_stats': {
'task': 'allianceauth.analytics.tasks.analytics_daily_stats', 'task': 'allianceauth.analytics.tasks.analytics_daily_stats',
'schedule': crontab(minute=0, hour=2), 'schedule': crontab(minute='0', hour='2'),
} }
} }
@@ -172,7 +172,7 @@ MESSAGE_TAGS = {
CACHES = { CACHES = {
"default": { "default": {
"BACKEND": "django_redis.cache.RedisCache", "BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1" # change the 1 here to change the database used "LOCATION": "redis://127.0.0.1:6379/1" # change the 1 here for the DB used
} }
} }
@@ -202,6 +202,8 @@ LOGOUT_REDIRECT_URL = 'authentication:dashboard' # destination after logging ou
# scopes required on new tokens when logging in. Cannot be blank. # scopes required on new tokens when logging in. Cannot be blank.
LOGIN_TOKEN_SCOPES = ['publicData'] LOGIN_TOKEN_SCOPES = ['publicData']
EMAIL_TIMEOUT = 15
# number of days email verification links are valid for # number of days email verification links are valid for
ACCOUNT_ACTIVATION_DAYS = 1 ACCOUNT_ACTIVATION_DAYS = 1

View File

@@ -32,6 +32,13 @@ INSTALLED_APPS += [
# To change the logging level for extensions, uncomment the following line. # To change the logging level for extensions, uncomment the following line.
# LOGGING['handlers']['extension_file']['level'] = 'DEBUG' # LOGGING['handlers']['extension_file']['level'] = 'DEBUG'
# By default, apps are prevented from having public views for security reasons.
# To allow specific apps to have public views, add them to APPS_WITH_PUBLIC_VIEWS
# » The format is the same as in INSTALLED_APPS
# » The app developer must also explicitly allow public views for their app
APPS_WITH_PUBLIC_VIEWS = [
]
# Enter credentials to use MySQL/MariaDB. Comment out to use sqlite3 # Enter credentials to use MySQL/MariaDB. Comment out to use sqlite3
DATABASES['default'] = { DATABASES['default'] = {

View File

@@ -1,9 +1,8 @@
from django.conf.urls import include
from allianceauth import urls from allianceauth import urls
from django.urls import re_path from django.urls import include, path
urlpatterns = [ urlpatterns = [
re_path(r'', include(urls)), path('', include(urls)),
] ]
handler500 = 'allianceauth.views.Generic500Redirect' handler500 = 'allianceauth.views.Generic500Redirect'

View File

@@ -66,6 +66,8 @@ class NameFormatConfigAdmin(admin.ModelAdmin):
form = NameFormatConfigForm form = NameFormatConfigForm
list_display = ('service_name', 'get_state_display_string') list_display = ('service_name', 'get_state_display_string')
@admin.display(
description='States'
)
def get_state_display_string(self, obj): def get_state_display_string(self, obj):
return ', '.join([state.name for state in obj.states.all()]) return ', '.join([state.name for state in obj.states.all()])
get_state_display_string.short_description = 'States'

View File

@@ -1,15 +1,17 @@
from django.conf.urls import include from string import Formatter
from django.urls import re_path from typing import Iterable, Optional
from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.urls import include, re_path
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.conf import settings
from string import Formatter
from allianceauth.hooks import get_hooks from allianceauth.hooks import get_hooks
from .models import NameFormatConfig from .models import NameFormatConfig
def get_extension_logger(name): def get_extension_logger(name):
""" """
Takes the name of a plugin/extension and generates a child logger of the extensions logger Takes the name of a plugin/extension and generates a child logger of the extensions logger
@@ -156,8 +158,32 @@ class MenuItemHook:
class UrlHook: class UrlHook:
def __init__(self, urls, namespace, base_url): """A hook for registering the URLs of a Django app.
Args:
- urls: The urls module to include
- namespace: The URL namespace to apply. This is usually just the app name.
- base_url: The URL prefix to match against in regex form.
Example ``r'^app_name/'``.
This prefix will be applied in front of all URL patterns included.
It is possible to use the same prefix as existing apps (or no prefix at all),
but standard URL resolution ordering applies
(hook URLs are the last ones registered).
- excluded_views: Optional list of views to be excluded
from auto-decorating them with the
default ``main_character_required`` decorator, e.g. to make them public.
Views must be specified by their qualified name,
e.g. ``["example.views.my_public_view"]``
"""
def __init__(
self,
urls,
namespace: str,
base_url: str,
excluded_views : Optional[Iterable[str]] = None
):
self.include_pattern = re_path(base_url, include(urls, namespace=namespace)) self.include_pattern = re_path(base_url, include(urls, namespace=namespace))
self.excluded_views = set(excluded_views or [])
class NameFormatter: class NameFormatter:

View File

@@ -6,6 +6,7 @@ from ...admin import ServicesUserAdmin
from . import __title__ from . import __title__
from .models import DiscordUser from .models import DiscordUser
from .utils import LoggerAddTag from .utils import LoggerAddTag
from .auth_hooks import DiscordService
logger = LoggerAddTag(logging.getLogger(__name__), __title__) logger = LoggerAddTag(logging.getLogger(__name__), __title__)
@@ -27,6 +28,6 @@ class DiscordUserAdmin(ServicesUserAdmin):
@admin.display(description='Discord Username', ordering='username') @admin.display(description='Discord Username', ordering='username')
def _username(self, obj): def _username(self, obj):
if obj.username and obj.discriminator: return DiscordService.get_discord_username(
return f'{obj.username}#{obj.discriminator}' username=obj.username, discriminator=obj.discriminator
return '' )

View File

@@ -11,6 +11,9 @@ from .models import DiscordUser
from .urls import urlpatterns from .urls import urlpatterns
from .utils import LoggerAddTag from .utils import LoggerAddTag
from . import tasks, __title__ from . import tasks, __title__
from .app_settings import (
DISCORD_SYNC_NAMES
)
logger = LoggerAddTag(logging.getLogger(__name__), __title__) logger = LoggerAddTag(logging.getLogger(__name__), __title__)
@@ -30,6 +33,29 @@ class DiscordService(ServicesHook):
self.access_perm = 'discord.access_discord' self.access_perm = 'discord.access_discord'
self.name_format = '{character_name}' self.name_format = '{character_name}'
@staticmethod
def get_discord_username(username:str, discriminator:str) -> str:
"""
Determine the Discord username (Old and new format)
:param username:
:type username:
:param discriminator:
:type discriminator:
:return:
:rtype:
"""
if username and discriminator:
discord_username = f'{username}#{discriminator}'
# New Discord user name format
if discriminator == '0':
discord_username = f'@{username}'
else:
discord_username = ''
return discord_username
def delete_user(self, user: User, notify_user: bool = False) -> None: def delete_user(self, user: User, notify_user: bool = False) -> None:
if self.user_has_account(user): if self.user_has_account(user):
logger.debug('Deleting user %s %s account', user, self.name) logger.debug('Deleting user %s %s account', user, self.name)
@@ -43,10 +69,19 @@ class DiscordService(ServicesHook):
user_has_account = True user_has_account = True
username = request.user.discord.username username = request.user.discord.username
discriminator = request.user.discord.discriminator discriminator = request.user.discord.discriminator
if username and discriminator:
discord_username = f'{username}#{discriminator}' discord_username = self.get_discord_username(
else: username=username, discriminator=discriminator
discord_username = '' )
# if username and discriminator:
# discord_username = f'{username}#{discriminator}'
#
# # New Discord user name format
# if discriminator == '0':
# discord_username = f'@{username}'
# else:
# discord_username = ''
else: else:
discord_username = '' discord_username = ''
user_has_account = False user_has_account = False
@@ -67,17 +102,18 @@ class DiscordService(ServicesHook):
return has_perms return has_perms
def sync_nickname(self, user): def sync_nickname(self, user):
logger.debug('Syncing %s nickname for user %s', self.name, user) if DISCORD_SYNC_NAMES:
if self.user_has_account(user): logger.debug('Syncing %s nickname for user %s', self.name, user)
tasks.update_nickname.apply_async( if self.user_has_account(user):
kwargs={ tasks.update_nickname.apply_async(
'user_pk': user.pk, kwargs={
# since the new nickname is not yet in the DB we need to 'user_pk': user.pk,
# provide it manually to the task # since the new nickname is not yet in the DB we need to
'nickname': user_formatted_nick(user) # provide it manually to the task
}, 'nickname': user_formatted_nick(user)
priority=SINGLE_TASK_PRIORITY },
) priority=SINGLE_TASK_PRIORITY
)
def sync_nicknames_bulk(self, users: list): def sync_nicknames_bulk(self, users: list):
"""Sync nickname for a list of users in bulk. """Sync nickname for a list of users in bulk.

View File

@@ -588,16 +588,17 @@ class DiscordClient:
return None # User is no longer a member return None # User is no longer a member
guild_roles = RolesSet(self.guild_roles(guild_id=guild_id)) guild_roles = RolesSet(self.guild_roles(guild_id=guild_id))
logger.debug('Current guild roles: %s', guild_roles.ids()) logger.debug('Current guild roles: %s', guild_roles.ids())
_roles = set(member_info.roles)
if not guild_roles.has_roles(member_info.roles): if not guild_roles.has_roles(member_info.roles):
guild_roles = RolesSet( guild_roles = RolesSet(
self.guild_roles(guild_id=guild_id, use_cache=False) self.guild_roles(guild_id=guild_id, use_cache=False)
) )
if not guild_roles.has_roles(member_info.roles): if not guild_roles.has_roles(member_info.roles):
role_ids = set(member_info.roles).difference(guild_roles.ids()) role_ids = set(member_info.roles).difference(guild_roles.ids())
raise RuntimeError( logger.warning(f'Discord user {user_id} has unknown roles: {role_ids}')
f'Discord user {user_id} has unknown roles: {role_ids}' for _r in role_ids:
) _roles.remove(_r)
return guild_roles.subset(member_info.roles) return guild_roles.subset(_roles)
@classmethod @classmethod
def _is_member_unknown_error(cls, r: requests.Response) -> bool: def _is_member_unknown_error(cls, r: requests.Response) -> bool:

View File

@@ -899,8 +899,8 @@ class TestGuildMemberRoles(NoSocketsTestCase):
mock_guild_roles.return_value = {role_a, role_b} mock_guild_roles.return_value = {role_a, role_b}
client = DiscordClientStub(TEST_BOT_TOKEN, mock_redis) client = DiscordClientStub(TEST_BOT_TOKEN, mock_redis)
# when/then # when/then
with self.assertRaises(RuntimeError): roles = client.guild_member_roles(TEST_GUILD_ID, TEST_USER_ID)
client.guild_member_roles(TEST_GUILD_ID, TEST_USER_ID) self.assertEqual(roles, RolesSet([role_a]))
# TODO: Re-enable after adding Discord general error handling # TODO: Re-enable after adding Discord general error handling
# def test_should_raise_exception_if_member_info_is_invalid( # def test_should_raise_exception_if_member_info_is_invalid(

View File

View File

@@ -81,11 +81,18 @@ class TestDiscordService(NoSocketsTestCase):
self.assertFalse(DiscordUser.objects.filter(user=self.none_member).exists()) self.assertFalse(DiscordUser.objects.filter(user=self.none_member).exists())
@patch(MODULE_PATH + '.tasks.update_nickname') @patch(MODULE_PATH + '.tasks.update_nickname')
@patch(MODULE_PATH + '.auth_hooks.DISCORD_SYNC_NAMES', True)
def test_sync_nickname(self, mock_update_nickname): def test_sync_nickname(self, mock_update_nickname):
service = self.service() service = self.service()
service.sync_nickname(self.member) service.sync_nickname(self.member)
self.assertTrue(mock_update_nickname.apply_async.called) self.assertTrue(mock_update_nickname.apply_async.called)
@patch(MODULE_PATH + '.tasks.update_nickname')
def test_sync_nickname_no_setting(self, mock_update_nickname):
service = self.service()
service.sync_nickname(self.member)
self.assertFalse(mock_update_nickname.apply_async.called)
@patch(MODULE_PATH + '.tasks.update_nicknames_bulk') @patch(MODULE_PATH + '.tasks.update_nicknames_bulk')
def test_sync_nicknames_bulk(self, mock_update_nicknames_bulk): def test_sync_nicknames_bulk(self, mock_update_nicknames_bulk):
service = self.service() service = self.service()
@@ -150,3 +157,23 @@ class TestDiscordService(NoSocketsTestCase):
self.assertTemplateUsed(service.service_ctrl_template) self.assertTemplateUsed(service.service_ctrl_template)
self.assertIn('/discord/reset/', response) self.assertIn('/discord/reset/', response)
self.assertIn('/discord/deactivate/', response) self.assertIn('/discord/deactivate/', response)
def test_new_discord_username_format(self):
"""
Test if we get Discord's new username format
:return:
:rtype:
"""
# given
username = 'william_riker'
discriminator = '0' # Seems to be returned as 0 for Discord's new username format
# when
discord_username = DiscordService.get_discord_username(
username=username, discriminator=discriminator
)
# then
expected_username = '@william_riker'
self.assertEqual(first=discord_username, second=expected_username)

View File

@@ -164,6 +164,7 @@ class TestServiceFeatures(TransactionTestCase):
self.discord_user = DiscordUser.objects.create(user=self.user, uid=TEST_USER_ID) self.discord_user = DiscordUser.objects.create(user=self.user, uid=TEST_USER_ID)
self.assertTrue(DiscordUser.objects.user_has_account(self.user)) self.assertTrue(DiscordUser.objects.user_has_account(self.user))
@patch(MODULE_PATH + '.auth_hooks.DISCORD_SYNC_NAMES', True)
def test_when_name_of_main_changes_then_discord_nick_is_updated( def test_when_name_of_main_changes_then_discord_nick_is_updated(
self, requests_mocker self, requests_mocker
): ):
@@ -185,6 +186,7 @@ class TestServiceFeatures(TransactionTestCase):
self.assertTrue(nick_updated) self.assertTrue(nick_updated)
self.assertTrue(DiscordUser.objects.user_has_account(self.user)) self.assertTrue(DiscordUser.objects.user_has_account(self.user))
@patch(MODULE_PATH + '.auth_hooks.DISCORD_SYNC_NAMES', True)
def test_when_name_of_main_changes_and_user_deleted_then_account_is_deleted( def test_when_name_of_main_changes_and_user_deleted_then_account_is_deleted(
self, requests_mocker self, requests_mocker
): ):

View File

@@ -1,5 +1,4 @@
from django.conf.urls import include from django.urls import include, path
from django.urls import path
from . import views from . import views

View File

@@ -49,7 +49,7 @@ class DiscourseTasks:
DiscourseManager.update_groups(user) DiscourseManager.update_groups(user)
except Exception as e: except Exception as e:
logger.exception(e) logger.exception(e)
logger.warn("Discourse group sync failed for %s, retrying in 10 mins" % user) logger.warning("Discourse group sync failed for %s, retrying in 10 mins" % user)
raise self.retry(countdown=60 * 10) raise self.retry(countdown=60 * 10)
logger.debug("Updated user %s discourse groups." % user) logger.debug("Updated user %s discourse groups." % user)

View File

@@ -1,5 +1,4 @@
from django.conf.urls import include from django.urls import include, path
from django.urls import path
app_name = 'example' app_name = 'example'

View File

@@ -2,8 +2,7 @@ from django.contrib import admin
from .models import Ips4User from .models import Ips4User
@admin.register(Ips4User)
class Ips4UserAdmin(admin.ModelAdmin): class Ips4UserAdmin(admin.ModelAdmin):
list_display = ('user', 'username', 'id') list_display = ('user', 'username', 'id')
search_fields = ('user__username', 'username', 'id') search_fields = ('user__username', 'username', 'id')
admin.site.register(Ips4User, Ips4UserAdmin)

View File

@@ -1,5 +1,4 @@
from django.conf.urls import include from django.urls import include, path
from django.urls import path
from . import views from . import views

View File

@@ -1,5 +1,4 @@
from django.conf.urls import include from django.urls import include, path
from django.urls import path
from . import views from . import views

0
allianceauth/services/modules/openfire/manager.py Executable file → Normal file
View File

View File

@@ -1,5 +1,4 @@
from django.conf.urls import include from django.urls import include, path
from django.urls import path
from . import views from . import views

2
allianceauth/services/modules/phpbb3/manager.py Executable file → Normal file
View File

@@ -176,7 +176,7 @@ class Phpbb3Manager:
logger.debug(f"Proceeding to add phpbb user {username_clean} and pwhash starting with {pwhash[0:5]}") logger.debug(f"Proceeding to add phpbb user {username_clean} and pwhash starting with {pwhash[0:5]}")
# check if the username was simply revoked # check if the username was simply revoked
if Phpbb3Manager.check_user(username_clean): if Phpbb3Manager.check_user(username_clean):
logger.warn("Unable to add phpbb user with username %s - already exists. Updating user instead." % username) logger.warning("Unable to add phpbb user with username %s - already exists. Updating user instead." % username)
Phpbb3Manager.__update_user_info(username_clean, email, pwhash) Phpbb3Manager.__update_user_info(username_clean, email, pwhash)
else: else:
try: try:

View File

@@ -1,5 +1,4 @@
from django.conf.urls import include from django.urls import include, path
from django.urls import path
from . import views from . import views

View File

@@ -1,5 +1,4 @@
from django.conf.urls import include from django.urls import include, path
from django.urls import path
from . import views from . import views

View File

@@ -36,10 +36,12 @@ class AuthTSgroupAdmin(admin.ModelAdmin):
kwargs['queryset'] = TSgroup.objects.exclude(ts_group_name__in=ReservedGroupName.objects.values_list('name', flat=True)) kwargs['queryset'] = TSgroup.objects.exclude(ts_group_name__in=ReservedGroupName.objects.values_list('name', flat=True))
return super().formfield_for_manytomany(db_field, request, **kwargs) return super().formfield_for_manytomany(db_field, request, **kwargs)
@admin.display(
description='ts groups'
)
def _ts_group(self, obj): def _ts_group(self, obj):
return [x for x in obj.ts_group.all().order_by('ts_group_id')] return [x for x in obj.ts_group.all().order_by('ts_group_id')]
_ts_group.short_description = 'ts groups'
# _ts_group.admin_order_field = 'profile__state' # _ts_group.admin_order_field = 'profile__state'

0
allianceauth/services/modules/teamspeak3/manager.py Executable file → Normal file
View File

View File

@@ -1,5 +1,4 @@
from django.conf.urls import include from django.urls import include, path
from django.urls import path
from . import views from . import views

View File

0
allianceauth/services/modules/teamspeak3/util/ts3.py Executable file → Normal file
View File

View File

@@ -44,7 +44,7 @@ def activate_teamspeak3(request):
def verify_teamspeak3(request): def verify_teamspeak3(request):
logger.debug("verify_teamspeak3 called by user %s" % request.user) logger.debug("verify_teamspeak3 called by user %s" % request.user)
if not Teamspeak3Tasks.has_account(request.user): if not Teamspeak3Tasks.has_account(request.user):
logger.warn("Unable to validate user %s teamspeak: no teamspeak data" % request.user) logger.warning("Unable to validate user %s teamspeak: no teamspeak data" % request.user)
return redirect("services:services") return redirect("services:services")
if request.method == "POST": if request.method == "POST":
form = TeamspeakJoinForm(request.POST) form = TeamspeakJoinForm(request.POST)

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