Merge branch 'stable'

This commit is contained in:
Athanasius committed 2021-10-25 11:12:39 +01:00
commit 945baf7f53
75 files changed
+11454 -5511

No files matched your search

+1 -1
View File
@@ -28,7 +28,7 @@ jobs:
# based on.
- name: Checkout head commits
# https://github.com/actions/checkout
uses: actions/checkout@v2.3.4
uses: actions/checkout@v2.3.5
#with:
#ref: ${{github.head.sha}}
#repository: ${{github.event.pull_request.head.repo.full_name}}
+1 -1
View File
@@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2.3.4
- uses: actions/checkout@v2.3.5
with:
fetch-depth: 0
- name: Set up Python 3.9
+2 -2
View File
@@ -16,10 +16,10 @@ jobs:
shell: powershell
steps:
- uses: actions/checkout@v2.3.4
- uses: actions/checkout@v2.3.5
- uses: actions/setup-python@v2.2.2
with:
python-version: "3.9.6"
python-version: "3.9.7"
architecture: "x86"
- name: Install python tools
+1 -1
View File
@@ -1 +1 @@
3.9.6
3.9.7
+104 -1
View File
@@ -1,7 +1,15 @@
This is the master changelog for Elite Dangerous Market Connector. Entries are in reverse chronological order (latest first).
---
* We now test against, and package with, Python 3.9.6.
Copyrights
===
Please see the [docs/Licenses](docs/Licenses/) directory for copies of any
licenses for software we use with EDMarketConnector, either at runtime, or to
produce the Windows executables and installer.
---
* We now test against, and package with, Python 3.9.7.
**As a consequence of this we no longer support Windows 7.
This is due to
@@ -17,6 +25,101 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are
in the source (it's not distributed with the Windows installer) for the
currently used version in a given branch.
---
Release 5.2.0
===
* The 'Update' button is disabled if CQC/Arena is detected.
* Frontier CAPI queries now run in their own thread. There should be no
change in functionality for users. This affects both EDMarketConnector
(GUI) and EDMC (command-line).
* `File` > `Status` will now use cached CAPI data, rather than causing a fresh
query. **Currently if data has not yet been cached nothing will happen when
trying to use this**.
* Trying to use `File` > `Status` when the current commander is unknown, or
there is has been no CAPI data retrieval yet, will now result in the 'bad'
sound being played and an appropriate status line message.
* `File` > `Save Raw Data` also now uses the cached CAPI data, rather than
causing a fresh query. This will write an empty JSON `{}` if no data is
yet available.
* New [docs/Licenses/](docs/Licenses/) directory containing all relevant
third-party licenses for the software this application uses.
* `Settings` > `Output` > `File Location` 'Browse' button will now always be
available, even if no output options are active.
* The 'no git installed' logging when running from source is now at INFO
level, not ERROR. This will look less scary.
* EDMarketConnetor command-line arguments have been re-ordered into
logical groups for `--help` output.
* Support added for several new EDDN schemas relating to specific Journal
events. The live EDDN server has been updated to support these.
Schema support added for:
- `codexentry/1`
- `fssdiscoveryscan/1`
- `navbeaconscan/1`
- `navroute/1`
- `scanbarycentre/1`
* If a message to EDDN gets an 'unknown schema' response it will **NOT** be
saved in the replaylog for later retries, instead being discarded.
Bug Fixes
---
* Pressing the 'Update' button when in space (not docked, not on a body
surface) will no longer cause a spurious "Docked but unknown station: EDO
Settlement?" message.
* A bug preventing `--force-localserver-auth` from working has been fixed.
* `horizons` and `odyssey` flags should now always be set properly on *all*
EDDN messages. The `horizons` flag was missing from some.
Developers
---
* Now built using Python 3.9.7.
* New `journal_entry_cqc()` function for plugins to receive journal events
*specifically and **only** when the player is in CQC/Arena*. This allows
for tracking things that happen in CQC/Arena without polluting
`journal_entry()`. See [PLUGINS.md](PLUGINS.md) for details.
* Command-line argument `--trace-all` to force all possible `--trace-on` to be
active.
* Contributing.md has been updated for how to properly use `trace_on()`.
* EDMC.(py,exe) now also makes use of `--trace-on`.
* EDMarketConnector now has `--capi-pretend-down` to act as if the CAPI
server is down.
* Killswitches now have support for removing key/values entirely, or forcing
the value. See [docs/Killswitches.md](docs/Killswitches.md) for details.
* `state['Odyssey']` added, set from `LoadGame` journal event.
* You can now test against a different EDDN server using `--eddn-url`
command-line argument. This needs to be the *full* 'upload' URL, i.e. for
the live instance this is `https://eddn.edcd.io:4430/upload/`.
* New command-line argument `--eddn-tracking-ui` to track the EDDN plugin's
idea of the current BodyName and BodyID, from both the Journal and
Status.json.
---
Release 5.1.3
===
+23 -13
View File
@@ -247,10 +247,10 @@ from edmc_data import DEBUG_WEBSERVER_HOST, DEBUG_WEBSERVER_PORT
TARGET_URL = 'https://www.edsm.net/api-journal-v1'
if 'edsm' in debug_senders:
TARGET_URL = f'http://{DEBUG_WEBSERVER_HOST}:{DEBUG_WEBSERVER_PORT}/edsm'
TARGET_URL = f'http://{DEBUG_WEBSERVER_HOST}:{DEBUG_WEBSERVER_PORT}/edsm'
...
r = this.session.post(TARGET_URL, data=data, timeout=_TIMEOUT)
r = this.requests_session.post(TARGET_URL, data=data, timeout=_TIMEOUT)
```
Be sure to set a URL path in the `TARGET_URL` that denotes where the data
@@ -408,21 +408,31 @@ In addition to that we utilise one of the user-defined levels as:
command-line argument and `.bat` file for users to enable it. It cannot be
selected from Settings in the UI.
As well as just using bare `logger.trace(...)` you can also gate it to only
log if asked to at invocation time by utilising the `--trace-on ...`
command-line argument. e.g.
`EDMarketConnector.py --trace --trace-on edsm-cmdr-events`. Note how you
still need to include `--trace`. The code to check and log would be like:
**Do not use a bare `logger.trace(...)` call** unless you're 100% certain
it's only temporary **and will be removed before any code merge**. In
that case you would utilise `EDMarketConnector.py --trace` to see the output.
Instead, you should gate any TRACE logging using the `trace_if()` helper
method provided on `logger`:
```python
from config import trace_on
logger.trace_if('journal.event.scan', 'my-log-message')
```
The string used to identify this tracing should be related to the
**function of the code**, not the particular file, or class, that it is in.
This is so that the same string can be used to trace code that spans more
than one file, class, or other scope.
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'De-queued ({cmdr=}, {entry["event"]=})')
```
This would then be triggered by running EDMarketConnector with the
appropriate command-line arguments:
EDMarketConnector.py --trace-on journal.event.scan
This way you can set up TRACE logging that won't spam just because of
`--trace` being used.
Note that you do **not** also need to specify `--trace`, that's implied.
This way you can set up TRACE logging that won't spam just because `--trace`
is used.
---
+115 -31
View File
@@ -6,6 +6,7 @@ import argparse
import json
import locale
import os
import queue
import re
import sys
from os.path import getmtime, join
@@ -123,10 +124,25 @@ def main(): # noqa: C901, CCR001
help='Set the logging loglevel to one of: '
'CRITICAL, ERROR, WARNING, INFO, DEBUG, TRACE',
)
group_loglevel.add_argument('--trace',
help='Set the Debug logging loglevel to TRACE',
action='store_true',
)
parser.add_argument(
'--trace',
help='Set the Debug logging loglevel to TRACE',
action='store_true',
)
parser.add_argument(
'--trace-on',
help='Mark the selected trace logging as active. "*" or "all" is equivalent to --trace-all',
action='append',
)
parser.add_argument(
"--trace-all",
help='Force trace level logging, with all possible --trace-on values active.',
action='store_true'
)
parser.add_argument('-a', metavar='FILE', help='write ship loadout to FILE in Companion API json format')
parser.add_argument('-e', metavar='FILE', help='write ship loadout to FILE in E:D Shipyard plain text format')
parser.add_argument('-l', metavar='FILE', help='write ship locations to FILE in CSV format')
@@ -150,8 +166,18 @@ def main(): # noqa: C901, CCR001
return
if args.trace:
edmclogger.set_channels_loglevel(logging.TRACE)
level_to_set: Optional[int] = None
if args.trace or args.trace_on:
level_to_set = logging.TRACE # type: ignore # it exists
logger.info('Setting TRACE level debugging due to either --trace or a --trace-on')
if args.trace_all or (args.trace_on and ('*' in args.trace_on or 'all' in args.trace_on)):
level_to_set = logging.TRACE_ALL # type: ignore # it exists
logger.info('Setting TRACE_ALL level debugging due to either --trace-all or a --trace-on *|all')
if level_to_set is not None:
logger.setLevel(level_to_set)
edmclogger.set_channels_loglevel(level_to_set)
elif args.loglevel:
if args.loglevel not in ('CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG', 'TRACE'):
@@ -166,6 +192,12 @@ exec_prefix: {sys.exec_prefix}
executable: {sys.executable}
sys.path: {sys.path}'''
)
if args.trace_on and len(args.trace_on) > 0:
import config as conf_module
conf_module.trace_on = [x.casefold() for x in args.trace_on] # duplicate the list just in case
for d in conf_module.trace_on:
logger.info(f'marked {d} for TRACE')
log_locale('Initial Locale')
@@ -188,15 +220,15 @@ sys.path: {sys.path}'''
# Get state from latest Journal file
logger.debug('Getting state from latest journal file')
try:
logdir = config.get_str('journaldir', default=config.default_journal_dir)
if not logdir:
logdir = config.default_journal_dir
monitor.currentdir = config.get_str('journaldir', default=config.default_journal_dir)
if not monitor.currentdir:
monitor.currentdir = config.default_journal_dir
logger.debug(f'logdir = "{logdir}"')
logfiles = sorted((x for x in os.listdir(logdir) if JOURNAL_RE.search(x)),
logger.debug(f'logdir = "{monitor.currentdir}"')
logfiles = sorted((x for x in os.listdir(monitor.currentdir) if JOURNAL_RE.search(x)),
key=lambda x: x.split('.')[1:])
logfile = join(logdir, logfiles[-1])
logfile = join(monitor.currentdir, logfiles[-1])
logger.debug(f'Using logfile "{logfile}"')
with open(logfile, 'r', encoding='utf-8') as loghandle:
@@ -239,8 +271,38 @@ sys.path: {sys.path}'''
companion.session.login(monitor.cmdr, monitor.is_beta)
###################################################################
# Initiate CAPI queries
querytime = int(time())
data = companion.session.station()
companion.session.station(query_time=querytime)
# Wait for the response
_capi_request_timeout = 60
try:
capi_response = companion.session.capi_response_queue.get(
block=True, timeout=_capi_request_timeout
)
except queue.Empty:
logger.error(f'CAPI requests timed out after {_capi_request_timeout} seconds')
sys.exit(EXIT_SERVER)
###################################################################
# noinspection DuplicatedCode
if isinstance(capi_response, companion.EDMCCAPIFailedRequest):
logger.trace_if('capi.worker', f'Failed Request: {capi_response.message}')
if capi_response.exception:
raise capi_response.exception
else:
raise ValueError(capi_response.message)
logger.trace_if('capi.worker', 'Answer is not a Failure')
if not isinstance(capi_response, companion.EDMCCAPIResponse):
raise ValueError(f"Response was neither CAPIFailedRequest nor EDMCAPIResponse: {type(capi_response)}")
data = capi_response.capi_data
config.set('querytime', querytime)
# Validation
@@ -248,10 +310,10 @@ sys.path: {sys.path}'''
logger.error("No data['command']['name'] from CAPI")
sys.exit(EXIT_SERVER)
elif not deep_get(data, 'lastSystem', 'name') or \
data['commander'].get('docked') and not \
deep_get(data, 'lastStarport', 'name'): # Only care if docked
elif (
not deep_get(data, 'lastSystem', 'name') or
data['commander'].get('docked') and not deep_get(data, 'lastStarport', 'name')
): # Only care if docked
logger.error("No data['lastSystem']['name'] from CAPI")
sys.exit(EXIT_SERVER)
@@ -263,21 +325,20 @@ sys.path: {sys.path}'''
pass # Skip further validation
elif data['commander']['name'] != monitor.cmdr:
logger.error(f'Commander "{data["commander"]["name"]}" from CAPI doesn\'t match "{monitor.cmdr}" from Journal') # noqa: E501
sys.exit(EXIT_CREDENTIALS)
raise companion.CmdrError()
elif data['lastSystem']['name'] != monitor.system or \
((data['commander']['docked'] and data['lastStarport']['name'] or None) != monitor.station) or \
data['ship']['id'] != monitor.state['ShipID'] or \
data['ship']['name'].lower() != monitor.state['ShipType']:
logger.error('Mismatch(es) between CAPI and Journal for at least one of: StarSystem, Last Star Port, Ship ID or Ship Name/Type') # noqa: E501
sys.exit(EXIT_LAGGING)
elif (
data['lastSystem']['name'] != monitor.system or
((data['commander']['docked'] and data['lastStarport']['name'] or None) != monitor.station) or
data['ship']['id'] != monitor.state['ShipID'] or
data['ship']['name'].lower() != monitor.state['ShipType']
):
raise companion.ServerLagging()
# stuff we can do when not docked
if args.d:
logger.debug(f'Writing raw JSON data to "{args.d}"')
out = json.dumps(data, ensure_ascii=False, indent=2, sort_keys=True, separators=(',', ': '))
out = json.dumps(dict(data), ensure_ascii=False, indent=2, sort_keys=True, separators=(',', ': '))
with open(args.d, 'wb') as f:
f.write(out.encode("utf-8"))
@@ -377,21 +438,44 @@ sys.path: {sys.path}'''
try:
eddn_sender = eddn.EDDN(None)
logger.debug('Sending Market, Outfitting and Shipyard data to EDDN...')
eddn_sender.export_commodities(data, monitor.is_beta)
eddn_sender.export_outfitting(data, monitor.is_beta)
eddn_sender.export_shipyard(data, monitor.is_beta)
eddn_sender.export_commodities(data, monitor.is_beta, monitor.state['Odyssey'])
eddn_sender.export_outfitting(data, monitor.is_beta, monitor.state['Odyssey'])
eddn_sender.export_shipyard(data, monitor.is_beta, monitor.state['Odyssey'])
except Exception:
logger.exception('Failed to send data to EDDN')
except companion.ServerError:
logger.error('Frontier CAPI Server returned an error')
logger.exception('Frontier CAPI Server returned an error')
sys.exit(EXIT_SERVER)
except companion.ServerConnectionError:
logger.exception('Exception while contacting server')
sys.exit(EXIT_SERVER)
except companion.CredentialsError:
logger.error('Frontier CAPI Server: Invalid Credentials')
sys.exit(EXIT_CREDENTIALS)
# Companion API problem
except companion.ServerLagging:
logger.error(
'Mismatch(es) between CAPI and Journal for at least one of: '
'StarSystem, Last Star Port, Ship ID or Ship Name/Type'
)
sys.exit(EXIT_SERVER)
except companion.CmdrError: # Companion API return doesn't match Journal
logger.error(
f'Commander "{data["commander"]["name"]}" from CAPI doesn\'t match '
f'"{monitor.cmdr}" from Journal'
)
sys.exit(EXIT_SERVER)
except Exception:
logger.exception('"other" exception')
sys.exit(EXIT_SERVER)
if __name__ == '__main__':
main()
+30 -3
View File
@@ -42,12 +42,14 @@ import os
import pathlib
import tempfile
from contextlib import suppress
from fnmatch import fnmatch
# So that any warning about accessing a protected member is only in one place.
from sys import _getframe as getframe
from threading import get_native_id as thread_native_id
from traceback import print_exc
from typing import TYPE_CHECKING, Tuple, cast
import config as config_mod
from config import appcmdname, appname, config
# TODO: Tests:
@@ -77,8 +79,11 @@ _default_loglevel = logging.DEBUG
# Define a TRACE level
LEVEL_TRACE = 5
LEVEL_TRACE_ALL = 3
logging.addLevelName(LEVEL_TRACE, "TRACE")
logging.addLevelName(LEVEL_TRACE_ALL, "TRACE_ALL")
logging.TRACE = LEVEL_TRACE # type: ignore
logging.TRACE_ALL = LEVEL_TRACE_ALL # type: ignore
logging.Logger.trace = lambda self, message, *args, **kwargs: self._log( # type: ignore
logging.TRACE, # type: ignore
message,
@@ -86,6 +91,20 @@ logging.Logger.trace = lambda self, message, *args, **kwargs: self._log( # type
**kwargs
)
def _trace_if(self: logging.Logger, condition: str, message: str, *args, **kwargs) -> None:
if any(fnmatch(condition, p) for p in config_mod.trace_on):
self._log(logging.TRACE, message, args, **kwargs) # type: ignore # we added it
return
self._log(logging.TRACE_ALL, message, args, **kwargs) # type: ignore # we added it
logging.Logger.trace_if = _trace_if # type: ignore
# we cant hide this from `from xxx` imports and I'd really rather no-one other than `logging` had access to it
del _trace_if
if TYPE_CHECKING:
from types import FrameType
@@ -95,8 +114,16 @@ if TYPE_CHECKING:
"""LoggerMixin is a fake class that tells type checkers that trace exists on a given type."""
def trace(self, message, *args, **kwargs) -> None:
"""Fake trace method."""
return self._log(LEVEL_TRACE, message, args, **kwargs)
"""See implementation above."""
...
def trace_if(self, condition: str, message, *args, **kwargs) -> None:
"""
Fake trace if method, traces only if condition exists in trace_on.
See implementation above.
"""
...
class Logger:
@@ -492,7 +519,7 @@ class EDMCContextFilter(logging.Filter):
return module_name
def get_main_logger() -> 'LoggerMixin':
def get_main_logger(sublogger_name: str = '') -> 'LoggerMixin':
"""Return the correct logger for how the program is being run."""
if not os.getenv("EDMC_NO_UI"):
# GUI app being run
+296 -140
View File
@@ -4,9 +4,9 @@
import argparse
import html
import json
import locale
import pathlib
import queue
import re
import sys
# import threading
@@ -16,7 +16,7 @@ from os import chdir, environ
from os.path import dirname, join
from sys import platform
from time import localtime, strftime, time
from typing import TYPE_CHECKING, Optional, Tuple
from typing import TYPE_CHECKING, Optional, Tuple, Union
# Have this as early as possible for people running EDMarketConnector.exe
# from cmd.exe or a bat file or similar. Else they might not be in the correct
@@ -56,7 +56,6 @@ import killswitch
from config import appversion, appversion_nobuild, config, copyright
# isort: on
from companion import CAPIData, index_possibly_sparse_list
from EDMCLogging import edmclogger, logger, logging
from journal_lock import JournalLock, JournalLockResult
@@ -70,6 +69,28 @@ if __name__ == '__main__': # noqa: C901
"such as EDSM, Inara.cz and EDDB."
)
###########################################################################
# Permanent config changes
###########################################################################
parser.add_argument(
'--reset-ui',
help='reset UI theme and transparency to defaults',
action='store_true'
)
###########################################################################
###########################################################################
# User 'utility' args
###########################################################################
parser.add_argument('--suppress-dupe-process-popup',
help='Suppress the popup from when the application detects another instance already running',
action='store_true'
)
###########################################################################
###########################################################################
# Adjust logging
###########################################################################
parser.add_argument(
'--trace',
help='Set the Debug logging loglevel to TRACE',
@@ -77,32 +98,31 @@ if __name__ == '__main__': # noqa: C901
)
parser.add_argument(
'--reset-ui',
help='reset UI theme and transparency to defaults',
action='store_true'
'--trace-on',
help='Mark the selected trace logging as active. "*" or "all" is equivalent to --trace-all',
action='append',
)
parser.add_argument(
'--forget-frontier-auth',
help='resets all authentication tokens',
"--trace-all",
help='Force trace level logging, with all possible --trace-on values active.',
action='store_true'
)
parser.add_argument('--suppress-dupe-process-popup',
help='Suppress the popup from when the application detects another instance already running',
action='store_true'
)
parser.add_argument(
'--debug-sender',
help='Mark the selected sender as in debug mode. This generally results in data being written to disk',
action='append',
)
###########################################################################
###########################################################################
# Frontier Auth
###########################################################################
parser.add_argument(
'--trace-on',
help='Mark the selected trace logging as active.',
action='append',
'--forget-frontier-auth',
help='resets all authentication tokens',
action='store_true'
)
auth_options = parser.add_mutually_exclusive_group(required=False)
@@ -120,16 +140,58 @@ if __name__ == '__main__': # noqa: C901
help='Callback from Frontier Auth',
nargs='*'
)
###########################################################################
###########################################################################
# Developer 'utility' args
###########################################################################
parser.add_argument(
'--capi-pretend-down',
help='Force to raise ServerError on any CAPI query',
action='store_true'
)
parser.add_argument(
'--eddn-url',
help='Specify an alternate EDDN upload URL',
)
parser.add_argument(
'--eddn-tracking-ui',
help='Have EDDN plugin show what it is tracking',
action='store_true',
)
###########################################################################
args = parser.parse_args()
if args.trace:
logger.setLevel(logging.TRACE)
edmclogger.set_channels_loglevel(logging.TRACE)
if args.capi_pretend_down:
import config as conf_module
logger.info('Pretending CAPI is down')
conf_module.capi_pretend_down = True
level_to_set: Optional[int] = None
if args.trace or args.trace_on:
level_to_set = logging.TRACE # type: ignore # it exists
logger.info('Setting TRACE level debugging due to either --trace or a --trace-on')
if args.trace_all or (args.trace_on and ('*' in args.trace_on or 'all' in args.trace_on)):
level_to_set = logging.TRACE_ALL # type: ignore # it exists
logger.info('Setting TRACE_ALL level debugging due to either --trace-all or a --trace-on *|all')
if level_to_set is not None:
logger.setLevel(level_to_set)
edmclogger.set_channels_loglevel(level_to_set)
if args.force_localserver_for_auth:
config.set_auth_force_localserver()
if args.eddn_url:
config.set_eddn_url(args.eddn_url)
if args.eddn_tracking_ui:
config.set_eddn_tracking_ui()
if args.force_edmc_protocol:
if sys.platform == 'win32':
config.set_auth_force_edmc_protocol()
@@ -159,7 +221,7 @@ if __name__ == '__main__': # noqa: C901
def handle_edmc_callback_or_foregrounding() -> None: # noqa: CCR001
"""Handle any edmc:// auth callback, else foreground existing window."""
logger.trace('Begin...')
logger.trace_if('frontier-auth.windows', 'Begin...')
if platform == 'win32':
@@ -312,9 +374,9 @@ import tkinter.messagebox
from tkinter import ttk
import commodity
import companion
import plug
import prefs
import protocol
import stats
import td
from commodity import COMMODITY_CSV
@@ -323,7 +385,6 @@ from edmc_data import ship_name_map
from hotkey import hotkeymgr
from l10n import Translations
from monitor import monitor
from protocol import protocolhandler
from theme import theme
from ttkHyperlinkLabel import HyperlinkLabel
@@ -348,6 +409,7 @@ SHIPYARD_HTML_TEMPLATE = """
class AppWindow(object):
"""Define the main application window."""
_CAPI_RESPONSE_TK_EVENT_NAME = '<<CAPIResponse>>'
# Tkinter Event types
EVENT_KEYPRESS = 2
EVENT_BUTTON = 4
@@ -357,13 +419,16 @@ class AppWindow(object):
def __init__(self, master: tk.Tk): # noqa: C901, CCR001 # TODO - can possibly factor something out
self.holdofftime = config.get_int('querytime', default=0) + companion.holdoff
self.capi_query_holdoff_time = config.get_int('querytime', default=0) + companion.capi_query_cooldown
self.w = master
self.w.title(applongname)
self.w.rowconfigure(0, weight=1)
self.w.columnconfigure(0, weight=1)
# companion needs to be able to send <<CAPIResponse>> events
companion.session.set_tk_master(self.w)
self.prefsdialog = None
# if platform == 'win32':
@@ -459,8 +524,8 @@ class AppWindow(object):
theme.register_alternate((self.button, self.theme_button, self.theme_button),
{'row': ui_row, 'columnspan': 2, 'sticky': tk.NSEW})
self.status.grid(columnspan=2, sticky=tk.EW)
self.button.bind('<Button-1>', self.getandsend)
theme.button_bind(self.theme_button, self.getandsend)
self.button.bind('<Button-1>', self.capi_request_data)
theme.button_bind(self.theme_button, self.capi_request_data)
for child in frame.winfo_children():
child.grid_configure(padx=self.PADX, pady=(platform != 'win32' or isinstance(child, tk.Frame)) and 2 or 0)
@@ -620,9 +685,10 @@ class AppWindow(object):
self.w.bind('<FocusIn>', self.onenter) # Special handling for transparency
self.w.bind('<Leave>', self.onleave) # Special handling for transparency
self.w.bind('<FocusOut>', self.onleave) # Special handling for transparency
self.w.bind('<Return>', self.getandsend)
self.w.bind('<KP_Enter>', self.getandsend)
self.w.bind_all('<<Invoke>>', self.getandsend) # Hotkey monitoring
self.w.bind('<Return>', self.capi_request_data)
self.w.bind('<KP_Enter>', self.capi_request_data)
self.w.bind_all('<<Invoke>>', self.capi_request_data) # Ask for CAPI queries to be performed
self.w.bind_all(self._CAPI_RESPONSE_TK_EVENT_NAME, self.capi_handle_response)
self.w.bind_all('<<JournalEvent>>', self.journal_event) # Journal monitoring
self.w.bind_all('<<DashboardEvent>>', self.dashboard_event) # Dashboard monitoring
self.w.bind_all('<<PluginError>>', self.plugin_error) # Statusbar
@@ -630,7 +696,7 @@ class AppWindow(object):
self.w.bind_all('<<Quit>>', self.onexit) # Updater
# Start a protocol handler to handle cAPI registration. Requires main loop to be running.
self.w.after_idle(lambda: protocolhandler.start(self.w))
self.w.after_idle(lambda: protocol.protocolhandler.start(self.w))
# Load updater after UI creation (for WinSparkle)
import update
@@ -822,7 +888,7 @@ class AppWindow(object):
self.cooldown()
def export_market_data(self, data: CAPIData) -> bool: # noqa: CCR001
def export_market_data(self, data: 'CAPIData') -> bool: # noqa: CCR001
"""
Export CAPI market data.
@@ -860,29 +926,58 @@ class AppWindow(object):
return True
def getandsend(self, event=None, retrying: bool = False): # noqa: C901, CCR001
def capi_request_data(self, event=None) -> None:
"""
Perform CAPI data retrieval and associated actions.
This can be triggered by hitting the main UI 'Update' button,
automatically on docking, or due to a retry.
:param event: Tk generated event details.
"""
logger.trace_if('capi.worker', 'Begin')
auto_update = not event
play_sound = (auto_update or int(event.type) == self.EVENT_VIRTUAL) and not config.get_int('hotkey_mute')
play_bad = False
err: Optional[str] = None
if not monitor.cmdr or not monitor.mode or monitor.state['Captain'] or not monitor.system:
return # In CQC or on crew - do nothing
if not monitor.cmdr:
logger.trace_if('capi.worker', 'Aborting Query: Cmdr unknown')
# LANG: CAPI queries aborted because Cmdr name is unknown
self.status['text'] = _('CAPI query aborted: Cmdr name unknown')
return
if not monitor.mode:
logger.trace_if('capi.worker', 'Aborting Query: Game Mode unknown')
# LANG: CAPI queries aborted because game mode unknown
self.status['text'] = _('CAPI query aborted: Game mode unknown')
return
if not monitor.system:
logger.trace_if('capi.worker', 'Aborting Query: Current star system unknown')
# LANG: CAPI queries aborted because current star system name unknown
self.status['text'] = _('CAPI query aborted: Current system unknown')
return
if monitor.state['Captain']:
logger.trace_if('capi.worker', 'Aborting Query: In multi-crew')
# LANG: CAPI queries aborted because player is in multi-crew on other Cmdr's ship
self.status['text'] = _('CAPI query aborted: In other-ship multi-crew')
return
if monitor.mode == 'CQC':
logger.trace_if('capi.worker', 'Aborting Query: In CQC')
# LANG: CAPI queries aborted because player is in CQC (Arena)
self.status['text'] = _('CAPI query aborted: CQC (Arena) detected')
return
if companion.session.state == companion.Session.STATE_AUTH:
logger.trace_if('capi.worker', 'Auth in progress? Aborting query')
# Attempt another Auth
self.login()
return
if not retrying:
if time() < self.holdofftime: # Was invoked by key while in cooldown
if play_sound and (self.holdofftime - time()) < companion.holdoff * 0.75:
if not companion.session.retrying:
if time() < self.capi_query_holdoff_time: # Was invoked by key while in cooldown
if play_sound and (self.capi_query_holdoff_time - time()) < companion.capi_query_cooldown * 0.75:
self.status['text'] = ''
hotkeymgr.play_bad() # Don't play sound in first few seconds to prevent repeats
@@ -896,93 +991,125 @@ class AppWindow(object):
self.button['state'] = self.theme_button['state'] = tk.DISABLED
self.w.update_idletasks()
query_time = int(time())
logger.trace_if('capi.worker', 'Requesting full station data')
config.set('querytime', query_time)
logger.trace_if('capi.worker', 'Calling companion.session.station')
companion.session.station(
query_time=query_time, tk_response_event=self._CAPI_RESPONSE_TK_EVENT_NAME,
play_sound=play_sound
)
def capi_handle_response(self, event=None): # noqa: C901, CCR001
"""Handle the resulting data from a CAPI query."""
logger.trace_if('capi.worker', 'Handling response')
play_bad: bool = False
err: Optional[str] = None
capi_response: Union[companion.EDMCCAPIFailedRequest, companion.EDMCCAPIResponse]
try:
querytime = int(time())
data = companion.session.station()
config.set('querytime', querytime)
logger.trace_if('capi.worker', 'Pulling answer off queue')
capi_response = companion.session.capi_response_queue.get(block=False)
if isinstance(capi_response, companion.EDMCCAPIFailedRequest):
logger.trace_if('capi.worker', f'Failed Request: {capi_response.message}')
if capi_response.exception:
raise capi_response.exception
else:
raise ValueError(capi_response.message)
logger.trace_if('capi.worker', 'Answer is not a Failure')
if not isinstance(capi_response, companion.EDMCCAPIResponse):
msg = f'Response was neither CAPIFailedRequest nor EDMCAPIResponse: {type(capi_response)}'
logger.error(msg)
raise ValueError(msg)
# Validation
if 'commander' not in data:
if 'commander' not in capi_response.capi_data:
# This can happen with EGS Auth if no commander created yet
# LANG: No data was returned for the commander from the Frontier CAPI
err = self.status['text'] = _('CAPI: No commander data returned')
elif not data.get('commander', {}).get('name'):
elif not capi_response.capi_data.get('commander', {}).get('name'):
# LANG: We didn't have the commander name when we should have
err = self.status['text'] = _("Who are you?!") # Shouldn't happen
elif (not data.get('lastSystem', {}).get('name')
or (data['commander'].get('docked')
and not data.get('lastStarport', {}).get('name'))):
elif (not capi_response.capi_data.get('lastSystem', {}).get('name')
or (capi_response.capi_data['commander'].get('docked')
and not capi_response.capi_data.get('lastStarport', {}).get('name'))):
# LANG: We don't know where the commander is, when we should
err = self.status['text'] = _("Where are you?!") # Shouldn't happen
elif not data.get('ship', {}).get('name') or not data.get('ship', {}).get('modules'):
elif (
not capi_response.capi_data.get('ship', {}).get('name')
or not capi_response.capi_data.get('ship', {}).get('modules')
):
# LANG: We don't know what ship the commander is in, when we should
err = self.status['text'] = _("What are you flying?!") # Shouldn't happen
elif monitor.cmdr and data['commander']['name'] != monitor.cmdr:
elif monitor.cmdr and capi_response.capi_data['commander']['name'] != monitor.cmdr:
# Companion API Commander doesn't match Journal
logger.trace_if('capi.worker', 'Raising CmdrError()')
raise companion.CmdrError()
elif auto_update and not monitor.state['OnFoot'] and not data['commander'].get('docked'):
elif (
capi_response.auto_update and not monitor.state['OnFoot']
and not capi_response.capi_data['commander'].get('docked')
):
# auto update is only when just docked
logger.warning(f"{auto_update!r} and not {monitor.state['OnFoot']!r} and "
f"not {data['commander'].get('docked')!r}")
logger.warning(f"{capi_response.auto_update!r} and not {monitor.state['OnFoot']!r} and "
f"not {capi_response.capi_data['commander'].get('docked')!r}")
raise companion.ServerLagging()
elif data['lastSystem']['name'] != monitor.system:
elif capi_response.capi_data['lastSystem']['name'] != monitor.system:
# CAPI system must match last journal one
logger.warning(f"{data['lastSystem']['name']!r} != {monitor.system!r}")
logger.warning(f"{capi_response.capi_data['lastSystem']['name']!r} != {monitor.system!r}")
raise companion.ServerLagging()
elif data['lastStarport']['name'] != monitor.station:
elif capi_response.capi_data['lastStarport']['name'] != monitor.station:
if monitor.state['OnFoot'] and monitor.station:
logger.warning(f"({data['lastStarport']['name']!r} != {monitor.station!r}) AND "
logger.warning(f"({capi_response.capi_data['lastStarport']['name']!r} != {monitor.station!r}) AND "
f"{monitor.state['OnFoot']!r} and {monitor.station!r}")
raise companion.ServerLagging()
else:
last_station = None
if data['commander']['docked']:
last_station = data['lastStarport']['name']
elif capi_response.capi_data['commander']['docked'] and monitor.station is None:
# Likely (re-)Embarked on ship docked at an EDO settlement.
# Both Disembark and Embark have `"Onstation": false` in Journal.
# So there's nothing to tell us which settlement we're (still,
# or now, if we came here in Apex and then recalled ship) docked at.
logger.debug("docked AND monitor.station is None - so EDO settlement?")
raise companion.NoMonitorStation()
if monitor.station is None:
# Likely (re-)Embarked on ship docked at an EDO settlement.
# Both Disembark and Embark have `"Onstation": false` in Journal.
# So there's nothing to tell us which settlement we're (still,
# or now, if we came here in Apex and then recalled ship) docked at.
logger.debug("monitor.station is None - so EDO settlement?")
raise companion.NoMonitorStation()
self.capi_query_holdoff_time = capi_response.query_time + companion.capi_query_cooldown
if last_station != monitor.station:
# CAPI lastStarport must match
logger.warning(f"({data['lastStarport']['name']!r} != {monitor.station!r}) AND "
f"{last_station!r} != {monitor.station!r}")
raise companion.ServerLagging()
self.holdofftime = querytime + companion.holdoff
elif not monitor.state['OnFoot'] and data['ship']['id'] != monitor.state['ShipID']:
elif not monitor.state['OnFoot'] and capi_response.capi_data['ship']['id'] != monitor.state['ShipID']:
# CAPI ship must match
logger.warning(f"not {monitor.state['OnFoot']!r} and "
f"{data['ship']['id']!r} != {monitor.state['ShipID']!r}")
f"{capi_response.capi_data['ship']['id']!r} != {monitor.state['ShipID']!r}")
raise companion.ServerLagging()
elif not monitor.state['OnFoot'] and data['ship']['name'].lower() != monitor.state['ShipType']:
elif (
not monitor.state['OnFoot']
and capi_response.capi_data['ship']['name'].lower() != monitor.state['ShipType']
):
# CAPI ship type must match
logger.warning(f"not {monitor.state['OnFoot']!r} and "
f"{data['ship']['name'].lower()!r} != {monitor.state['ShipType']!r}")
f"{capi_response.capi_data['ship']['name'].lower()!r} != "
f"{monitor.state['ShipType']!r}")
raise companion.ServerLagging()
else:
# TODO: Change to depend on its own CL arg
if __debug__: # Recording
companion.session.dump_capi_data(data)
companion.session.dump_capi_data(capi_response.capi_data)
if not monitor.state['ShipType']: # Started game in SRV or fighter
self.ship['text'] = ship_name_map.get(data['ship']['name'].lower(), data['ship']['name'])
monitor.state['ShipID'] = data['ship']['id']
monitor.state['ShipType'] = data['ship']['name'].lower()
self.ship['text'] = ship_name_map.get(
capi_response.capi_data['ship']['name'].lower(),
capi_response.capi_data['ship']['name']
)
monitor.state['ShipID'] = capi_response.capi_data['ship']['id']
monitor.state['ShipType'] = capi_response.capi_data['ship']['name'].lower()
if not monitor.state['Modules']:
self.ship.configure(state=tk.DISABLED)
@@ -992,45 +1119,63 @@ class AppWindow(object):
self.ship.configure(state=True)
if monitor.state.get('SuitCurrent') is not None:
if (loadout := data.get('loadout')) is not None:
if (loadout := capi_response.capi_data.get('loadout')) is not None:
if (suit := loadout.get('suit')) is not None:
if (suitname := suit.get('edmcName')) is not None:
# We've been paranoid about loadout->suit->suitname, now just assume loadouts is there
loadout_name = index_possibly_sparse_list(
data['loadouts'], loadout['loadoutSlotId']
capi_response.capi_data['loadouts'], loadout['loadoutSlotId']
)['name']
self.suit['text'] = f'{suitname} ({loadout_name})'
self.suit_show_if_set()
# Update Odyssey Suit data
companion.session.suit_update(capi_response.capi_data)
if data['commander'].get('credits') is not None:
monitor.state['Credits'] = data['commander']['credits']
monitor.state['Loan'] = data['commander'].get('debt', 0)
if capi_response.capi_data['commander'].get('credits') is not None:
monitor.state['Credits'] = capi_response.capi_data['commander']['credits']
monitor.state['Loan'] = capi_response.capi_data['commander'].get('debt', 0)
# stuff we can do when not docked
err = plug.notify_newdata(data, monitor.is_beta)
err = plug.notify_newdata(capi_response.capi_data, monitor.is_beta)
self.status['text'] = err and err or ''
if err:
play_bad = True
# Export market data
if not self.export_market_data(data):
if not self.export_market_data(capi_response.capi_data):
err = 'Error: Exporting Market data'
play_bad = True
self.holdofftime = querytime + companion.holdoff
self.capi_query_holdoff_time = capi_response.query_time + companion.capi_query_cooldown
except queue.Empty:
logger.error('There was no response in the queue!')
# TODO: Set status text
return
except companion.ServerConnectionError:
# LANG: Frontier CAPI server error when fetching data
self.status['text'] = _('Frontier CAPI server error')
except companion.CredentialsError:
companion.session.retrying = False
companion.session.invalidate()
companion.session.login()
return # We need to give Auth time to complete, so can't set a timed retry
# Companion API problem
except companion.ServerLagging as e:
err = str(e)
if retrying:
if companion.session.retrying:
self.status['text'] = err
play_bad = True
else:
# Retry once if Companion server is unresponsive
self.w.after(int(SERVER_RETRY * 1000), lambda: self.getandsend(event, True))
companion.session.retrying = True
self.w.after(int(SERVER_RETRY * 1000), lambda: self.capi_request_data(event))
return # early exit to avoid starting cooldown count
except companion.CmdrError as e: # Companion API return doesn't match Journal
@@ -1051,14 +1196,16 @@ class AppWindow(object):
if not err: # not self.status['text']: # no errors
# LANG: Time when we last obtained Frontier CAPI data
self.status['text'] = strftime(_('Last updated at %H:%M:%S'), localtime(querytime))
self.status['text'] = strftime(_('Last updated at %H:%M:%S'), localtime(capi_response.query_time))
if play_sound and play_bad:
if capi_response.play_sound and play_bad:
hotkeymgr.play_bad()
logger.trace_if('capi.worker', 'Updating suit and cooldown...')
self.update_suit_text()
self.suit_show_if_set()
self.cooldown()
logger.trace_if('capi.worker', '...done')
def journal_event(self, event): # noqa: C901, CCR001 # Currently not easily broken up.
"""
@@ -1090,7 +1237,7 @@ class AppWindow(object):
entry = monitor.get_entry()
if not entry:
# This is expected due to some monitor.py code that appends `None`
# logger.trace('No entry from monitor.get_entry()')
logger.trace_if('journal.queue', 'No entry from monitor.get_entry()')
return
# Update main window
@@ -1171,9 +1318,18 @@ class AppWindow(object):
config.set('cmdrs', config.get_list('cmdrs', default=[]) + [monitor.cmdr])
self.login()
if monitor.mode == 'CQC' and entry['event']:
err = plug.notify_journal_entry_cqc(monitor.cmdr, monitor.is_beta, entry, monitor.state)
if err:
self.status['text'] = err
if not config.get_int('hotkey_mute'):
hotkeymgr.play_bad()
return # in CQC
if not entry['event'] or not monitor.mode:
# logger.trace('Startup or in CQC, returning')
return # Startup or in CQC
logger.trace_if('journal.queue', 'Startup, returning')
return # Startup
if entry['event'] in ['StartUp', 'LoadGame'] and monitor.started:
logger.info('Startup or LoadGame event')
@@ -1226,7 +1382,7 @@ class AppWindow(object):
auto_update = True
if auto_update:
self.w.after(int(SERVER_RETRY * 1000), self.getandsend)
self.w.after(int(SERVER_RETRY * 1000), self.capi_request_data)
if entry['event'] == 'ShutDown':
# Enable WinSparkle automatic update checks
@@ -1325,16 +1481,19 @@ class AppWindow(object):
def cooldown(self) -> None:
"""Display and update the cooldown timer for 'Update' button."""
if time() < self.holdofftime:
if time() < self.capi_query_holdoff_time:
# Update button in main window
self.button['text'] = self.theme_button['text'] \
= _('cooldown {SS}s').format(SS=int(self.holdofftime - time())) # LANG: Cooldown on 'Update' button
= _('cooldown {SS}s').format( # LANG: Cooldown on 'Update' button
SS=int(self.capi_query_holdoff_time - time())
)
self.w.after(1000, self.cooldown)
else:
self.button['text'] = self.theme_button['text'] = _('Update') # LANG: Update button in main window
self.button['state'] = self.theme_button['state'] = (monitor.cmdr and
monitor.mode and
monitor.mode != 'CQC' and
not monitor.state['Captain'] and
monitor.system and
tk.NORMAL or tk.DISABLED)
@@ -1455,47 +1614,32 @@ class AppWindow(object):
self.destroy()
self.__class__.showing = False
def save_raw(self) -> None: # noqa: CCR001 # Not easily broken up.
"""Save newly acquired CAPI data in the configured file."""
# LANG: Status - Attempting to retrieve data from Frontier CAPI to save to file
self.status['text'] = _('Fetching data...')
self.w.update_idletasks()
def save_raw(self) -> None:
"""
Save any CAPI data already acquired to a file.
try:
data: CAPIData = companion.session.station()
self.status['text'] = ''
default_extension: str = ''
This specifically does *not* cause new queries to be performed, as the
purpose is to aid in diagnosing any issues that occurred during 'normal'
queries.
"""
default_extension: str = ''
if platform == 'darwin':
default_extension = '.json'
if platform == 'darwin':
default_extension = '.json'
last_system: str = data.get("lastSystem", {}).get("name", "Unknown")
last_starport: str = ''
timestamp: str = strftime('%Y-%m-%dT%H.%M.%S', localtime())
f = tkinter.filedialog.asksaveasfilename(
parent=self.w,
defaultextension=default_extension,
filetypes=[('JSON', '.json'), ('All Files', '*')],
initialdir=config.get_str('outdir'),
initialfile=f'{monitor.system}{monitor.station}.{timestamp}'
)
if not f:
return
if data['commander'].get('docked'):
last_starport = '.' + data.get('lastStarport', {}).get('name', 'Unknown')
timestamp: str = strftime('%Y-%m-%dT%H.%M.%S', localtime())
f = tkinter.filedialog.asksaveasfilename(
parent=self.w,
defaultextension=default_extension,
filetypes=[('JSON', '.json'), ('All Files', '*')],
initialdir=config.get_str('outdir'),
initialfile=f'{last_system}{last_starport}.{timestamp}'
)
if f:
with open(f, 'wb') as h:
h.write(json.dumps(dict(data),
ensure_ascii=False,
indent=2,
sort_keys=True,
separators=(',', ': ')).encode('utf-8'))
except companion.ServerError as e:
self.status['text'] = str(e)
except Exception as e:
logger.debug('"other" exception', exc_info=e)
self.status['text'] = str(e)
with open(f, 'wb') as h:
h.write(str(companion.session.capi_raw_data).encode(encoding='utf-8'))
# def exit_tray(self, systray: 'SysTrayIcon') -> None:
# """Tray icon is shutting down."""
@@ -1538,6 +1682,10 @@ class AppWindow(object):
logger.info('Unregistering hotkey manager...')
hotkeymgr.unregister()
# Now the CAPI query thread
logger.info('Closing CAPI query thread...')
companion.session.capi_query_close_worker()
# Now the main programmatic input methods
logger.info('Closing dashboard...')
dashboard.close()
@@ -1547,7 +1695,7 @@ class AppWindow(object):
# Frontier auth/CAPI handling
logger.info('Closing protocol handler...')
protocolhandler.close()
protocol.protocolhandler.close()
logger.info('Closing Frontier CAPI sessions...')
companion.session.close()
@@ -1578,7 +1726,7 @@ class AppWindow(object):
def oniconify(self, event=None) -> None:
"""Handle minimization of the application."""
self.w.overrideredirect(0) # Can't iconize while overrideredirect
self.w.overrideredirect(False) # Can't iconize while overrideredirect
self.w.iconify()
self.w.update_idletasks() # Size and windows styles get recalculated here
self.w.wait_visibility() # Need main window to be re-created before returning
@@ -1744,11 +1892,19 @@ sys.path: {sys.path}'''
else:
log_locale('After switching to UTF-8 encoding (same language)')
# HACK: n/a | 2021-11-24: --force-localserver-auth does not work if companion is imported early -cont.
# HACK: n/a | 2021-11-24: as we modify config before this is used.
import companion
from companion import CAPIData, index_possibly_sparse_list
# Do this after locale silliness, just in case
if args.forget_frontier_auth:
logger.info("Dropping all fdev tokens as --forget-frontier-auth was passed")
companion.Auth.invalidate(None)
# Create protocol handler
protocol.protocolhandler = protocol.get_handler_impl()()
# TODO: unittests in place of these
# logger.debug('Test from __main__')
# test_logging()
@@ -1800,7 +1956,7 @@ sys.path: {sys.path}'''
ui_scale = 100
config.set('ui_scale', ui_scale)
theme.default_ui_scale = root.tk.call('tk', 'scaling')
logger.trace(f'Default tk scaling = {theme.default_ui_scale}')
logger.trace_if('tk', f'Default tk scaling = {theme.default_ui_scale}')
theme.startup_ui_scale = ui_scale
root.tk.call('tk', 'scaling', theme.default_ui_scale * float(ui_scale) / 100.0)
app = AppWindow(root)
+195 -204
View File
@@ -1,172 +1,166 @@
/* Language name */
"!Language" = "Čeština";
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:171; */
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:220; */
"Error: Frontier CAPI didn't respond" = "Chyba: Frontier CAPI neodpovídá";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Chyba: Server Frontieru nejede";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Chyba: Server Frontieru laguje";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Chyba: Chybné přihlašovací údaje";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "Chyba: Nesprávný CMDR";
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:341; companion.py:422; */
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:405; companion.py:490; */
"Error" = "Chyba";
/* [inara.py] */
"Error: Can't connect to Inara" = "Chyba: Nelze se připojit k Inaře";
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:380; companion.py:385; */
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:448; companion.py:453; */
"Error: Couldn't check token customer_id" = "Chyba: Nejde ověřit token customer_id";
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:391; */
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:459; */
"Error: customer_id doesn't match!" = "Chyba: customer_id nesouhlasí!";
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:413; */
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:481; */
"Error: unable to get token" = "Chyba: nepovedlo se získat token";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:575; */
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:793; */
"Frontier CAPI query failure" = "Dotaz na Frontier CAPI selhal";
/* companion.py: Frontier CAPI data retrieval failed with 5XX code; In files: companion.py:591; */
"Frontier CAPI server error" = "Chyba Frontier CAPI serveru";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Aktualizovat";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Vždy navrchu";
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:636; */
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:730; */
"Unknown" = "Neznámý";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Cmdr";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Role";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Loď";
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:809; */
"Suit" = "Oblek";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "Systém";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Stanice";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Soubor";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Upravit";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Zobrazit";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Okno";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Nápověda";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "O {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Zkontrolovat aktualizace...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Uložit surová data...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Status";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Zásady ochrany osobních údajů";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Poznámky k verzi";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Nastavení";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Ukončit";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Dokumentace";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Kopírovat";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Přihlašování...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Přihlášení bylo úspěšné";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "Nejste zadokováni ve stanici!";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "Stanice nenabízí žádné služby!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "Stanice nemá obchod!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Načítání dat...";
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:880; */
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1031; */
"CAPI: No commander data returned" = "CAPI: Nebyla vrácena žádná data komandéra";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Kdo jste?";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Kde zrovna jste?";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "S jakou lodí létáte?";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Frontier CAPI server error when fetching data; In files: EDMarketConnector.py:1171; */
"Frontier CAPI server error" = "Chyba Frontier CAPI serveru";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Poslední aktualizace %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Fighter";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Gunner";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Helm";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "Počkej ještě {SS}s";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "OK";
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1489; */
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1677; */
"Shutting down..." = "Vypínání...";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Jeden nebo více aktivních pluginů ještě stále nepodporuje Python 3.x. Podívejte se na jejich seznam v záložce '{PLUGINS}' v '{FILE}' > '{SETTINGS}'. Zkontrolujte si jestli není dostupná novější verze pluginu, pokud ne, tak kontaktujte vývojáře pluginu o tom, že musí upravit jejich plugin pro Python 3.x.\n\nPlugin můžete vypnout přidáním '{DISABLED}' na konec názvu jeho složky.";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Pluginy";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Pluginy, které nepodporují Python 3.x";
/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:206; */
@@ -181,7 +175,7 @@
/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:232; */
"Ignore" = "Ignorovat";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Výchozí";
/* coriolis.py: 'Auto' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - auto; In files: coriolis.py:52; coriolis.py:55; coriolis.py:101; coriolis.py:117; coriolis.py:123; */
@@ -214,416 +208,413 @@
/* eddb.py: Journal Processing disabled due to an active killswitch; In files: eddb.py:100; */
"EDDB Journal processing disabled. See Log." = "Zpracování EDDB deníku je deaktivováno. Zkontrolujte log.";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Odesílání dat do EDDN...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Chyba: Nelze se připojit k EDDN";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Odeslat data o stanici do Elite Dangerous Data Network";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Odeslat sken a data o systému do Elite Dangerous Data Network";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Pozdržet odeslání po zadokování";
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:785; */
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:1222; */
"EDDN journal handler disabled. See Log." = "Obsluha EDDN deníku je deaktivována. Zkontrolujte log.";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "Odesílat letový log a status CMDRa do EDSM";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Přihlašovací údaje Elite Dangerous Star Map";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Jméno CMDRa";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "API klíč";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Žádná";
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:358; */
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:401; */
"EDSM Handler disabled. See Log." = "Obsluha EDSM deaktivována. Zkontrolujte log.";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Chyba: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Chyba: Nelze se připojit k EDSM";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Odesílat letový log a status CMDRa na Inaru";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Přihlašovací údaje k Inaře";
/* inara.py: INARA support disabled via killswitch; In files: inara.py:335; */
/* inara.py: INARA support disabled via killswitch; In files: inara.py:341; */
"Inara disabled. See Log." = "Inara deaktivována. Zkontrolujte log.";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "Chyba: Server Frontieru SKU problém";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "Chyba: Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Nastavení";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Vyberte, která data chcete ukládat";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Obchodní data ve formátu CSV";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Obchodní data ve formátu Trade Dangerous";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Konfigurace lodi";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Automaticky aktualizovat při zadokování";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Cesta k souboru";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Změnit...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Procházet...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Výstup";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "E:D umístění souboru deníku";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Klávesová zkratka";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Klávesová zkratka";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Restartujte {APP} pro aktivaci klávesových zkratek";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} vyžaduje oprávnění pro použití klávesových zkratek";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Otevřít Předvolby systému";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Pouze pokud je Elite: Dangerous aktivní";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Přehrát zvuk";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "Vypnout automatickou kontrolu aktualizací aplikace, pokud jste ve hře";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "Preferované stránky";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Shipyard";
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:592; */
"Use alternate URL method" = "Použít alternativní URL metodu";
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:644; */
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:645; */
"Log Level" = "Míra logování";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Nastavení";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Soukromí";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Normální text";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Zvýrazněný text";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Jazyk";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Schéma";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Tmavé";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Průhledné";
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:770; */
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:793; */
"UI Scale Percentage" = "Procenta UI škálování";
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:791; */
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:814; */
"100 means Default{CR}Restart Required for{CR}changes to take effect!" = "100 je výchozí hodnota{CR}je potřeba restartovat,{CR}aby se změna projevila!";
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:801; */
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:824; */
"Main window transparency" = "Průhlednost hlavního okna";
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:821:824; */
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:844:847; */
"100 means fully opaque.{CR}Window is updated in real time" = "100 znamená plně neprůhledné.{CR}Okno se aktualizuje v reálném čase";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Vzhled";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Složka pluginů";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Otevřít";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Tip: Plugin můžete vypnout přidáním{CR}'{EXT}' do názvu jeho složky";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Zapnuté pluginy";
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:921; */
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:944; */
"Plugins Without Python 3.x Support:" = "Pluginy bez podpory Python 3.x:";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "Informace jak migrovat pluginy.";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Vypnuté pluginy";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Zůstatek";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Půjčka";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Combat";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Trade";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Explorer";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Federation";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Empire";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Powerplay";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Harmless";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Mostly Harmless";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Competent";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Master";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Dangerous";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Deadly";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Penniless";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Mostly Penniless";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Peddler";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Dealer";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Merchant";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Broker";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Entrepreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Tycoon";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Aimless";
/* Appearance setting. [EDMarketConnector.py] */
"Minimize to system tray" = "Minimalizovat do lišty";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Mostly Aimless";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Scout";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Surveyor";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Trailblazer";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Pathfinder";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Ranger";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pioneer";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Helpless";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amateur";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Hero";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiator";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recruit";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Midshipman";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Poddůstojník";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Chief Petty Officer";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Warrant Officer";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Ensign";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Lieutenant";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Lieutenant Commander";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Post Commander";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Post Captain";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Rear Admiral";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Outsider";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Serf";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Squire";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Knight";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Count";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Duke";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "King";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Rating 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Rating 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Rating 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Rating 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Rating 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Cena";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Lodě";
+233 -211
View File
@@ -1,180 +1,190 @@
/* Generic 'Check', as in 'Check E:D journal file location' [EDMarketConnector.py] */
"Check" = "Prüfe";
/* Language name */
"!Language" = "Deutsch";
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:171; */
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:220; */
"Error: Frontier CAPI didn't respond" = "Fehler: Frontier CAPI antwortet nicht";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Fehler: Frontier-Server ist offline";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Fehler: Frontier-Server ist überlastet";
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:205; */
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:255; */
"Docked but unknown station: EDO Settlement?" = "Angedockt aber unbekannte Station: EDO-Siedlung?";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Fehler: Ungültige Anmeldedaten";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "Fehler: Falscher Kdt.";
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:341; companion.py:422; */
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:405; companion.py:490; */
"Error" = "Fehler";
/* [inara.py] */
"Error: Can't connect to Inara" = "Fehler: Verbindung zu Inara fehlgeschlagen";
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:380; companion.py:385; */
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:448; companion.py:453; */
"Error: Couldn't check token customer_id" = "Fehler: Konnte das Token customer_id nicht prüfen";
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:391; */
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:459; */
"Error: customer_id doesn't match!" = "Fehler: customer_id stimmt nicht überein!";
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:413; */
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:481; */
"Error: unable to get token" = "Fehler: konnte Token nicht erhalten";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:575; */
/* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:781; */
"Frontier CAPI down for maintenance" = "Frontier CAPI offline wegen Wartung";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:793; */
"Frontier CAPI query failure" = "Frontier CAPI Anfrage gescheitert";
/* companion.py: Frontier CAPI data retrieval failed with 5XX code; In files: companion.py:591; */
"Frontier CAPI server error" = "Frontier CAPI Server-Fehler";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Aktualisieren";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Immer im Vordergrund";
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:636; */
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:730; */
"Unknown" = "Unbekannt";
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:705; */
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:799; */
"Error: Check E:D journal file location" = "Fehler: Prüfe E:D Journal Dateispeicherort";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Kdt.";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Rolle";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Schiff";
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:809; */
"Suit" = "Anzug";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "System";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Station";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Datei";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Bearbeiten";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Ansicht";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Fenster";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Hilfe";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "Über {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Auf Aktualisierungen überprüfen...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Speichere Originaldaten...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Status";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Datenschutzrichtlinie";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Anmerkungen";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Einstellungen";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Beenden";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Dokumentation";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Kopieren";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Anmelden...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Authentifizierung erfolgreich";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "Du bist an keiner Station angedockt!";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "Diese Station hat nichts!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "Diese Station hat keinen Markt!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: CAPI queries aborted because Cmdr name is unknown; In files: EDMarketConnector.py:945; */
"CAPI query aborted: Cmdr name unknown" = "CAPI Anfrage abgebrochen: Kdt. Name unbekannt";
/* EDMarketConnector.py: CAPI queries aborted because game mode unknown; In files: EDMarketConnector.py:951; */
"CAPI query aborted: Game mode unknown" = "CAPI Anfrage abgebrochen: Spielmodus unbekannt";
/* EDMarketConnector.py: CAPI queries aborted because current star system name unknown; In files: EDMarketConnector.py:957; */
"CAPI query aborted: Current system unknown" = "CAPI Anfrage abgebrochen: Aktuelles System unbekannt";
/* EDMarketConnector.py: CAPI queries aborted because player is in multi-crew on other Cmdr's ship; In files: EDMarketConnector.py:963; */
"CAPI query aborted: In other-ship multi-crew" = "CAPI Anfrage abgebrochen: In anderem Schiff in Multicrew";
/* EDMarketConnector.py: CAPI queries aborted because player is in CQC (Arena); In files: EDMarketConnector.py:969; */
"CAPI query aborted: CQC (Arena) detected" = "CAPI Anfrage abgebrochen: CQC (Arena) erkannt";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Daten werden abgerufen...";
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:880; */
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1031; */
"CAPI: No commander data returned" = "CAPI: Keine Kommandanten-Daten erhalten";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Wer bist du?!";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Wo bist du?!";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "Was fliegst du?!";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Frontier CAPI server error when fetching data; In files: EDMarketConnector.py:1171; */
"Frontier CAPI server error" = "Frontier CAPI Server-Fehler";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Zuletzt aktualisiert um %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Fighter";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Kanonier";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Steuer";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "Wartezeit {SS}s";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "OK";
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1489; */
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1677; */
"Shutting down..." = "Programm schließt...";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Eins oder mehr deiner aktivierten Plugins hat noch keinen Support für Python 3.x. Du kannst dir die Liste im '{PLUGINS}'-Tab unter '{FILE}' > '{SETTINGS}' ansehen. Du solltest prüfen, ob es für diese Updates gibt und ansonsten dem Entwickler Bescheid geben, dass sie ihren Code für Python 3.x aktualisieren müssen.\n\nDu kannst ein Plugin deaktivieren, indem du dessen Ordner ein '{DISABLED}' am Ende des Namens anhängst.";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Plugins";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Plugins ohne Python 3.x Support";
/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:206; */
@@ -189,7 +199,7 @@
/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:232; */
"Ignore" = "Ignorieren";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Standard";
/* coriolis.py: 'Auto' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - auto; In files: coriolis.py:52; coriolis.py:55; coriolis.py:101; coriolis.py:117; coriolis.py:123; */
@@ -222,425 +232,437 @@
/* eddb.py: Journal Processing disabled due to an active killswitch; In files: eddb.py:100; */
"EDDB Journal processing disabled. See Log." = "EDDB Journal-Verarbeitung deaktiviert. Siehe Log.";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Daten werden an das EDDN gesendet...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Fehler: Keine Verbindung zum EDDN";
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:282; */
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:330; */
"EDDN Error: EDMC is too old for EDDN. Please update." = "EDDN-Fehler: EDMC ist zu alt für EDDN. Bitte aktualisieren.";
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:288; */
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:336; */
"EDDN Error: Validation Failed (EDMC Too Old?). See Log" = "EDDN-Fehler: Validierung fehlgeschlagen (EDMC zu alt?). Siehe Log";
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:293; */
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:341; */
"EDDN Error: Returned {STATUS} status code" = "EDDN-Fehler: {STATUS} Statuscode zurückgegeben";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Schicke Stationsdaten an das Elite Dangerous Data Netzwerk";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Sende System- und Scandaten zum Elite Dangerous Data Network";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Senden verzögern bis angedockt";
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:785; */
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:1222; */
"EDDN journal handler disabled. See Log." = "EDDN Journal-Handler deaktiviert. Siehe Log.";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "Sende Fluglog und CMDR-Status an EDSM";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Elite: Dangerous Star Map Anmeldedaten";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Kommandantenname";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "API Schlüssel";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Keine Zuweisung";
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:358; */
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:401; */
"EDSM Handler disabled. See Log." = "EDSM-Handler deaktiviert. Siehe Log.";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Fehler: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Fehler: Kann keine Verbindung zu EDSM aufbauen";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Sende Fluglog und CMDR-Status an Inara";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Inara-Anmeldedaten";
/* inara.py: INARA support disabled via killswitch; In files: inara.py:335; */
/* inara.py: INARA support disabled via killswitch; In files: inara.py:341; */
"Inara disabled. See Log." = "Inara deaktiviert. Siehe Log.";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "Fehler: Frontier-Server SKU Problem";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "Fehler: Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Einstellungen";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Bitte wähle zu speichernde Daten aus";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Marktdaten als CSV Datei";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Marktdaten als Trade-Dangerous Datei";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Schiffsausstattung";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Automatisch beim Andocken aktualisieren";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Speicherort";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Ordner...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Durchsuchen...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Ausgabe";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "E:D Journal Dateispeicherort";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Makro";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Hotkey";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Starte {APP} neu, um den Tastenkürzel nutzen zu können";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} benötigt für Tastenkürzel Systemrechte (Bedienungshilfen)";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Öffne Systemeinstellungen";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Nur wenn Elite: Dangerous geöffnet ist";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Ton abspielen";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "Während das Spiel läuft nicht auf Updates überprüfen";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "Favorisierte Webseiten";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Werft";
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:592; */
"Use alternate URL method" = "Alternative URL-Methode benutzen";
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:644; */
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:645; */
"Log Level" = "Log-Level";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Konfiguration";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: UI elements privacy section header in privacy tab of preferences; In files: prefs.py:682; */
"Main UI privacy options" = "Haupt-UI-Datenschutzoptionen";
/* prefs.py: Hide private group owner name from UI checkbox; In files: prefs.py:687; */
"Hide private group name in UI" = "Private Gruppe-Name im UI verstecken";
/* prefs.py: Hide multicrew captain name from main UI checkbox; In files: prefs.py:691; */
"Hide multi-crew captain name" = "Multi-Crew Kapitänsnamen verstecken";
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Datenschutz";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Normaler Text";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Hervorgehobener Text";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Sprache";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Theme";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Dunkel";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Transparent";
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:770; */
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:793; */
"UI Scale Percentage" = "UI-Skalierung in Prozent";
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:791; */
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:814; */
"100 means Default{CR}Restart Required for{CR}changes to take effect!" = "100 bedeutet Standardwert{CR}Neustart erforderlich, um{CR}Änderungen zu übernehmen!";
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:801; */
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:824; */
"Main window transparency" = "Durchsichtigkeit Hauptfenster";
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:821:824; */
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:844:847; */
"100 means fully opaque.{CR}Window is updated in real time" = "100 bedeutet komplett undurchsichtig.{CR}Fenster wird in Echtzeit aktualisiert";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Aussehen";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Plugin-Ordner";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Öffnen";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Tipp: Du kannst ein Plugin deaktivieren, indem{CR}du '{EXT}' zu seinem Ordnernamen hinzufügst";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Aktivierte Plugins";
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:921; */
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:944; */
"Plugins Without Python 3.x Support:" = "Plugins ohne Python 3.x Support";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "Informationen zum Migrieren von Plugins";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Deaktivierte Plugins";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Kontostand";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Kredit";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Kampfrang";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Handelsrang";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Erkunderrang";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC-Rang";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Föderation";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Imperium";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Machtspiele";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Harmlos";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Zumeist Harmlos";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Neuling";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Kompetent";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Experte";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Meister";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Gefährlich";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Tödlich";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Bettelarm";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Sehr Arm";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Krämer";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Kleinhändler";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Kaufmann";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Großhändler";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Unternehmer";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Magnat";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Total planlos";
/* Appearance setting. [EDMarketConnector.py] */
"Minimize to system tray" = "In die Taskleiste minimieren";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Fast Planlos";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Späher";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Landkundiger";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Wegebner";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Pistensucher";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Aufseher";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pionier";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Hilflos";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Zumeist Hilflos";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Anfänger";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Halbprofi";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Profi";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Sieger";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Held";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiator";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Rekrut";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Kadett";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Fähnrich";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Maat";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Obermaat";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Feldwebel";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Leutnant";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Kapitänleutnant";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Korvettenleutnant";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Fregattenkapitän";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Kapitän";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Konteradmiral";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vizeadmiral";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Fremder";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Leibeigener";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Knappe";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Ritter";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Fürst";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Graf";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Marquise";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Herzog";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Prinz";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "König";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Wertung 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Wertung 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Wertung 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Wertung 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Wertung 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Current commander unknown when trying to use 'File' > 'Status'; In files: stats.py:280; */
"Status: Don't yet know your Commander name" = "Status: Dein Kommandanten-Name ist noch nicht bekannt";
/* stats.py: No Frontier CAPI data yet when trying to use 'File' > 'Status'; In files: stats.py:288; */
"Status: No CAPI data yet" = "Status: Noch keine CAPI-Daten";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Wert";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Schiffe";
+409 -385
View File
File diff suppressed because it is too large. Load diff
+200 -211
View File
@@ -1,180 +1,172 @@
/* Generic 'Check', as in 'Check E:D journal file location' [EDMarketConnector.py] */
"Check" = "Comprobar";
/* Language name */
"!Language" = "Español";
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:171; */
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:220; */
"Error: Frontier CAPI didn't respond" = "Error: El CAPI de Frontier no respondió";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Error: El servidor de Frontier está caído";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Error: El servidor de Frontier está retrasado";
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:205; */
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:255; */
"Docked but unknown station: EDO Settlement?" = "Atracado pero estación desconocida: ¿Asentamiento EDO?";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Error: Credenciales Inválidas";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "Error: Cmdt Incorrecto";
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:341; companion.py:422; */
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:405; companion.py:490; */
"Error" = "Error";
/* [inara.py] */
"Error: Can't connect to Inara" = "Error: No se puede conectar con Inara";
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:380; companion.py:385; */
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:448; companion.py:453; */
"Error: Couldn't check token customer_id" = "Error: No se pudo comprobar el token customer_id";
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:391; */
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:459; */
"Error: customer_id doesn't match!" = "Error: ¡customer_id no coincide!";
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:413; */
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:481; */
"Error: unable to get token" = "Error: no se pudo conseguir el token";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:575; */
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:793; */
"Frontier CAPI query failure" = "Fallo de consulta del CAPI de Frontier";
/* companion.py: Frontier CAPI data retrieval failed with 5XX code; In files: companion.py:591; */
"Frontier CAPI server error" = "Error de servidor CAPI de Frontier";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Actualizar";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Siempre visible";
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:636; */
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:730; */
"Unknown" = "Desconocido";
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:705; */
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:799; */
"Error: Check E:D journal file location" = "Error: Comprueba la localización del fichero journal de E:D";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Cmdt";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Rol";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Nave";
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:809; */
"Suit" = "Traje";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "Sistema";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Estación";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Archivo";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Editar";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Visualización";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Ventana";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Ayuda";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "Acerca de {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Buscar Actualizaciones...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Guardar Datos Sin Procesar...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Estado";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Política de Privacidad";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Notas de la versión";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Configuración";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Salir";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Documentación";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Copiar";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Identificándose...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Autenticación correcta";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "¡No estás atracado en una estación!";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "¡La estación no tiene nada!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "¡La estación no tiene mercado!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Recopilando datos...";
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:880; */
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1031; */
"CAPI: No commander data returned" = "CAPI: No se devolvió datos de comandante";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "¿Quién eres?";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "¿Dónde estás?";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "¿Qué estás volando?";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Frontier CAPI server error when fetching data; In files: EDMarketConnector.py:1171; */
"Frontier CAPI server error" = "Error de servidor CAPI de Frontier";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Última actualización: %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Caza";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Artillero";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Timón";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "Espere {SS}s";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "Aceptar";
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1489; */
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1677; */
"Shutting down..." = "Apagando...";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Uno o más de tus plugins habilitados aún no tienen soporte para Python 3.x. Por favor, consulta la lista en la pestaña '{PLUGINS}' de '{FILE}' > '{SETTINGS}'. Deberías comprobar si hay una versión actualizada disponible, si no, avisa al desarrollador de que necesita actualizar el código para Python 3.x.\n\nPuedes deshabilitar un plugin cambiando el nombre de su carpeta para que tenga '{DISABLED}' al final del nombre.";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Plugins";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Plugins Sin Soporte para Python 3.x";
/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:206; */
@@ -189,7 +181,7 @@
/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:232; */
"Ignore" = "Ignorar";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Por defecto";
/* coriolis.py: 'Auto' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - auto; In files: coriolis.py:52; coriolis.py:55; coriolis.py:101; coriolis.py:117; coriolis.py:123; */
@@ -222,425 +214,422 @@
/* eddb.py: Journal Processing disabled due to an active killswitch; In files: eddb.py:100; */
"EDDB Journal processing disabled. See Log." = "Procesamiento de Journal para EDDB desactivado. Ver Log.";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Enviando datos a EDDN...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Error: No se puede conectar a EDDN";
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:282; */
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:330; */
"EDDN Error: EDMC is too old for EDDN. Please update." = "Error EDDN: EDMC es demasiado antiguo para EDDN. Actualiza por favor.";
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:288; */
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:336; */
"EDDN Error: Validation Failed (EDMC Too Old?). See Log" = "Error EDDN: Validación Fallida (¿EDMC Demasiado Antiguo?). Revisa el Log";
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:293; */
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:341; */
"EDDN Error: Returned {STATUS} status code" = "Error EDDN: Devolvió código de estado {STATUS}";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Enviar datos de la estación a Elite Dangerous Data Network";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Enviar datos de sistema y escáner a Elite Dangerous Data Network";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Retrasar envío hasta el atraque";
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:785; */
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:1222; */
"EDDN journal handler disabled. See Log." = "Manejo de Journal para EDDN desactivado. Ver Log.";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "Enviar Registro de Vuelo y estado del CMDT a EDSM";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Credenciales de Elite Dangerous Star Map";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Nombre de Comandante";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "Llave API";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Ninguna";
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:358; */
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:401; */
"EDSM Handler disabled. See Log." = "Manejo de Journal para EDSM desactivado. Ver Log.";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Error: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Error: No se puede conectar a EDSM";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Enviar Registro de Vuelo y estado del CMDT a Inara";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Credenciales de Inara";
/* inara.py: INARA support disabled via killswitch; In files: inara.py:335; */
/* inara.py: INARA support disabled via killswitch; In files: inara.py:341; */
"Inara disabled. See Log." = "Inara desactivado. Ver Log.";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "Error: Problema de SKU en el servidor de Frontier";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "Error: Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Preferencias";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Seleccione qué datos quiere guardar";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Datos de mercado en formato CSV";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Datos de mercado en formato Trade Dangerous";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Equipamiento de la Nave";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Actualizar automáticamente al atracar";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Localización de archivos";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Cambiar...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Examinar...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Salida";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "Localización del archivo de Journal de E:D";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Tecla de acceso directo";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Tecla de acceso directo";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Reinicie {APP} para usar los accesos directos de teclado";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} necesita permisos para usar teclas de acceso directo";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Abrir Preferencias del Sistema";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Solo cuando Elite: Dangerous es la aplicación activa";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Reproducir sonido";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "Desactivar Comprobación Automática de Actualizaciones de la Aplicación mientras juega";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "Sitios Web preferidos";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Astillero";
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:592; */
"Use alternate URL method" = "Usar método URL alternativo";
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:644; */
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:645; */
"Log Level" = "Nivel de registro";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Configuración";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Privacidad";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Texto normal";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Texto resaltado";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Idioma";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Tema";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Oscuro";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Transparente";
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:770; */
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:793; */
"UI Scale Percentage" = "Porcentaje escala UI";
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:791; */
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:814; */
"100 means Default{CR}Restart Required for{CR}changes to take effect!" = "100 significa Por Defecto{CR}Se requiere reiniciar{CR}para que los cambios surtan efecto!";
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:801; */
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:824; */
"Main window transparency" = "Transparencia de la ventana principal";
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:821:824; */
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:844:847; */
"100 means fully opaque.{CR}Window is updated in real time" = "100 significa completamente opaco.{CR}La ventana se actualiza en tiempo real.";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Apariencia";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Carpeta de Plugins";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Abrir";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Puedes desactivar un plugin añadiendo{CR}'{EXT}' al nombre de su carpeta";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Plugins Activados";
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:921; */
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:944; */
"Plugins Without Python 3.x Support:" = "Plugins sin soporte para Python 3.x:";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "Información sobre migración de plugins";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Plugins Desactivados";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Saldo";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Préstamo";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Combate";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Comercio";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Exploración";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Federación";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Imperio";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Powerplay";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Inofensivo";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Casi inofensivo";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novato";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Competente";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Experto";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Maestro";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Peligroso";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Letal";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Élite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Pobre";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Casi pobre";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Buhonero";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Distribuidor";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Mercader";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Bróker";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Empresario";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Magnate";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Perdido";
/* Appearance setting. [EDMarketConnector.py] */
"Minimize to system tray" = "Minimizar a la bandeja de sistema";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Casi perdido";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Explorador";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Topógrafo";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Rastreador";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Guía";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Descubridor";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pionero";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Indefenso";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Casi indefenso";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Aficionado";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semiprofessional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Profesional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Campeón";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Héroe";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiador";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recluta";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Cadete";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Guardiamarina";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Sargento";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Sargento primero";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Subteniente";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Alférez de fragata";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Teniente de navío";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Capitán de corbeta";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Capitán de fragata";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Capitán de navío";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Contraalmirante";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vicealmirante";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Almirante";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Forastero";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Siervo";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Escudero";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Caballero";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Señor";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Barón";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Vizconde";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Conde";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Conde Palatino";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Marqués";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Duque";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Príncipe";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "Rey";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Nivel 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Nivel 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Nivel 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Nivel 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Nivel 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Valor";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Naves";
+195 -204
View File
@@ -1,172 +1,166 @@
/* Language name */
"!Language" = "Suomi";
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:171; */
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:220; */
"Error: Frontier CAPI didn't respond" = "Virhe: Frontier CAPI ei vastaa.";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Virhe: Frontierin palvelin ei vastaa";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Virhe: Frontierin palvelin vastaa vanhoilla tiedoilla";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Virhe: kirjautuminen ei kelpaa";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "Virhe: väärä komentaja";
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:341; companion.py:422; */
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:405; companion.py:490; */
"Error" = "Virhe";
/* [inara.py] */
"Error: Can't connect to Inara" = "Virhe: Ei yhteyttä Inaraan";
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:380; companion.py:385; */
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:448; companion.py:453; */
"Error: Couldn't check token customer_id" = "Virhe: Ei kyetty tarkastamaan polettia customer_id";
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:391; */
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:459; */
"Error: customer_id doesn't match!" = "Virhe: customer_id ei löydy vastaavuutta!";
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:413; */
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:481; */
"Error: unable to get token" = "Virhe: ei kyetty saamaan polettia";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:575; */
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:793; */
"Frontier CAPI query failure" = "Frontier CAPI kyselyvirhe.";
/* companion.py: Frontier CAPI data retrieval failed with 5XX code; In files: companion.py:591; */
"Frontier CAPI server error" = "Frontier CAPI palvelinvirhe.";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Päivitä";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Aina päällimmäisenä";
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:636; */
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:730; */
"Unknown" = "Tuntematon";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Cmdr";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Rooli";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Alus";
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:809; */
"Suit" = "Asuste";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "Järjestelmä";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Asema";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Tiedosto";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Muokkaa";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Näytä";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Ikkuna";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Apua";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "Ohjelmasta {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Tarkista päivitykset...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Tallenna raakadata...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Tila";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Tietosuojakäytäntö";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Julkaisutiedot";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Valinnat";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Lopeta";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Dokumentaatio";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Kopioi";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Kirjaudutaan...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Todennus onnistui";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "Et ole telakoituneena asemalle!";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "Asemalla ei ole mitään!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "Asemalla ei ole kaupankäyntiä!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Noudetaan tietoja...";
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:880; */
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1031; */
"CAPI: No commander data returned" = "CAPI: tietoja ei löytynyt";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Kuka olet?!";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Missä olet?!";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "Mitä alusta lennät?!";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Frontier CAPI server error when fetching data; In files: EDMarketConnector.py:1171; */
"Frontier CAPI server error" = "Frontier CAPI palvelinvirhe.";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Päivitetty viimeksi %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Hävittäjä";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Aseiden käyttäjä";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Pilotti";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "Jäähtymisaika {SS}s";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "OK";
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1489; */
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1677; */
"Shutting down..." = "Sulkeutuu...";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Yksi tai useampi käyttämistäsi lisäosista ei sisällä vielä Pyhton 3.x -tukea. Tarkista tiedoston '{FILE}' > '{SETTINGS}' välilehti '{PLUGINS}' lisäosista, onko niistä uudempaa versiota saatavilla; muussa tapauksessa ota yhteyttä sen kehittäjään ja kerro, että sen lähdekoodi on päivitettävä Python 3.x -tasolle.\n\nVoit estää lisäosan toiminnan nimeämällä sen hakemiston siten, että se päättyy tekstiin '{DISABLED}'.";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Lisäosat";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Lisäosat ilman Python 3.x -tukea";
/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:206; */
@@ -181,422 +175,419 @@
/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:232; */
"Ignore" = "Älä huomioi";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Oletus";
/* eddb.py: Journal Processing disabled due to an active killswitch; In files: eddb.py:100; */
"EDDB Journal processing disabled. See Log." = "EDDB lokikirjan käsittely ei käytössä. Katso lokitiedot.";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Lähetetään tietoja EDDN:ään...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Virhe: ei saatu yhteyttä EDDN:ään";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Lähetä asematiedot Elite Dangerous Data Network -palveluun";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Lähetä järjestelmä- ja skannaustiedot Elite Dangerous Data Network -palveluun";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Lähetä tiedot vasta telakoitumisen jälkeen";
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:785; */
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:1222; */
"EDDN journal handler disabled. See Log." = "EDDB lokikirjan käsittelijä ei käytössä. Katso lokitiedot.";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "Lähetä lentoloki ja komentajatiedot EDSM:ään";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Elite Dangerous Star Map -kirjautuminen";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Komentajanimi";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "API avain";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Ei määritelty";
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:358; */
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:401; */
"EDSM Handler disabled. See Log." = "ESDM käsittelijä ei käytössä. Katso lokitiedot.";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Virhe: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Virhe: ei saatu yhteyttä EDSM:ään";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Lähetä lentoloki ja komentajatiedot Inaraan";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Inaran kirjautuminen";
/* inara.py: INARA support disabled via killswitch; In files: inara.py:335; */
/* inara.py: INARA support disabled via killswitch; In files: inara.py:341; */
"Inara disabled. See Log." = "Inara ei käytössä. Katso lokitiedot.";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "Virhe: Frontier -palvelimen SKU-ongelma";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "Inaran virhe: {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Valinnat";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Valitse mitkä tiedot tallennetaan";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Markkinadata CSV -formaatissa";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Markkinadata Trade Dangerous -formaatissa";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Aluksen konfiguraatio";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Päivitä automaattisesti telakoituessa";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Tiedostosijainti";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Muuta...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Selaa...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Tallennus";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "E:D lokikirjan tiedostosijainti";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Näppäimistöoikopolku";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Pikanäppäin";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Käynnistä {APP} uudelleen käyttääksesi pikanäppäimiä";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} tarvitsee lupasi pikakuvakkeiden käyttämiseen";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Avaa järjestelmän asetukset";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Vain jos Elite:Dangerous on käynnissä";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Toista ääni";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "Estä automaattiset päivitystarkastukset pelaamisen aikana";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "Ensisijaiset sivustot";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Telakka";
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:592; */
"Use alternate URL method" = "Käytä vaihtoehtoista URL-metodia";
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:644; */
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:645; */
"Log Level" = "Lokin syvyys";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Valinnat";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Yksityisyys";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Normaali teksti";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Korostettu teksti";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Kieli";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Teema";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Tumma";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Läpinäkyvä";
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:770; */
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:793; */
"UI Scale Percentage" = "Käyttöliittymän skaalausprosentti";
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:791; */
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:814; */
"100 means Default{CR}Restart Required for{CR}changes to take effect!" = "100 tarkoittaa oletusta{CR}Muutosten käyttöönotto{CR}edellyttää uudelleenkäynnistystä!";
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:801; */
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:824; */
"Main window transparency" = "Pääikkunan läpinäkyvyys";
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:821:824; */
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:844:847; */
"100 means fully opaque.{CR}Window is updated in real time" = "100 tarkoittaa täysin peittävää.{CR}Ikkuna päivittyy reaaliajassa.";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Ulkoasu";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Lisäosien hakemistosijainti";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Avaa";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Vihje: Voit poistaa lisäosan käytöstä{CR}lisäämällä '{EXT}' sen hakemistonimeen";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Käytössä olevat liitännäiset";
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:921; */
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:944; */
"Plugins Without Python 3.x Support:" = "Lisäosat, joissa ei ole Python 3.x -tukea:";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "Tietoja lisäosien siirrosta";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Estetyt liitännäiset";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Saldo";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Lainaa jäljellä";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Taistelija -ranking";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Kaupankäynti -ranking";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Tutkimusmatkailija -ranking";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC -ranking";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Federaation sotilasarvosi";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Imperiumin sotilasarvosi";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Valtapeli -ranking";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Harmless";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Mostly Harmless";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Competent";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Master";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Dangerous";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Deadly";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Penniless";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Mostly Penniless";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Peddler";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Dealer";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Merchant";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Broker";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Entrepreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Tycoon";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Aimless";
/* Appearance setting. [EDMarketConnector.py] */
"Minimize to system tray" = "Pienennä tehtäväpalkkiin";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Mostly Aimless";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Scout";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Surveyor";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Trailblazer";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Pathfinder";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Ranger";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pioneer";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Helpless";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amateur";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Hero";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiator";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recruit";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Midshipman";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Petty Officer";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Chief Petty Officer";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Warrant Officer";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Ensign";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Lieutenant";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Lieutenant Commander";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Post Commander";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Post Captain";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Rear Admiral";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Outsider";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Serf";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Squire";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Knight";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Count";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Duke";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "King";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Luokitus 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Luokitus 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Luokitus 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Luokitus 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Luokitus 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Arvo";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Alukset";
+173 -179
View File
@@ -1,524 +1,518 @@
/* Language name */
"!Language" = "Français";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Erreur : Le serveur Frontier est indisponible";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Erreur : Le serveur Frontier ne répond pas";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Erreur : Identifiants invalides";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "Erreur : Cmdr incorrect";
/* [inara.py] */
"Error: Can't connect to Inara" = "Erreur : Connexion impossible à Inara";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Mettre à jour";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Toujours visible";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Cmd";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Rôle";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Vaisseau";
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:809; */
"Suit" = "Combinaison";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "Système";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Station";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Fichier";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Édition";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Présentation";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Fenêtre";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Aide";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "À propos de {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Chercher une mise à jour...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Sauvegarder les Données Brutes...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "État";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Politique de Confidentialité";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Notes de publication";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Paramètres";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Quitter";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Documentation";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Copier";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Connexion en cours...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Authentification réussie";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "Vous n'êtes pas amarré à une station !";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "La station n'a rien du tout !";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "La station n'a pas de marché !";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Récupération des données...";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Qui êtes-vous ?";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Où êtes-vous ?";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "Avec quoi volez-vous ?";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Dernière mise à jour à %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Chasseur";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Artilleur";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Pilote";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "Temps de recharge {SS}s";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "OK";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Un ou plusieurs de vos plugins activés ne sont pas encore compatibles avec Python 3.x. Regardez la liste sur l'onglet '{PLUGINS}' de '{FILE}' > '{SETTINGS}'. Vous devriez vérifier s'il y a une version mise à jour, sinon alertez le développeur qu'il doit mettre à jour le code pour Python 3.x.\n\nVous pouvez désactiver un plugin en renommant son dossier pour qu'il ait '{DISABLED}' à la fin du nom.";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Plugins";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Plugins non compatibles avec Python 3.x";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Par défaut";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Envoi des données à EDDN...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Erreur : Connexion impossible à EDDN";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Envoyer les données de la station à Elite Dangerous Data Network";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Envoyer les systèmes et les informations de scan à Elite Dangerous Data Network";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Retarder l'envoi jusqu'à l'amarrage";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "Envoyer le journal de vol et le statut Cmdr à EDSM";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Informations d'identification pour Elite Dangerous Star Map";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Nom du commandant";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "Clé API";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Aucun";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Erreur : EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Erreur : Connexion impossible à EDSM";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Envoyer le journal de vol et le statut Cmdr à Inara";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Informations d'identification pour Inara";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "Erreur : Le serveur Frontier a un problème de SKU";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "Erreur : Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Préférences";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Veuillez choisir les données à sauvegarder";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Données du marché au format CSV";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Données du marché au format Trade Dangerous";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Équipements du vaisseau";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Mettre à jour automatiquement à l'amarrage";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Emplacement des fichiers";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Spécifier...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Parcourir...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Sorties";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "Emplacement du journal E:D";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Raccourci clavier";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Raccourci clavier";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Rédémarrez {APP} pour utiliser les raccourcis";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} a besoin de permissions pour utiliser les raccourcis";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Ouvrir Préférences Système";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Seulement quand Elite: Dangerous est l'application active";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Jouer un son";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "Désactiver la vérification automatique des mises à jour quand vous êtes en jeu";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "Sites préférés";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Chantier naval";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Configuration";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Confidentialité";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Texte normal";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Texte en surbrillance";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Langue";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Thème";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Foncé";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Transparent";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Apparence";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Répertoire des plugins";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Ouvrir";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Astuce : Vous pouvez désactiver un plugin en{CR}ajoutant '{EXT}' à son nom de répertoire";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Plugins activés";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "Informations sur la migration des plugins";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Plugins désactivés";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Solde";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Emprunt";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Combattant";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Commerçant";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Explorateur";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Fédération";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Empire";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Powerplay";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Inoffensif";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Bleu";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Compétent";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Vilain";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Vétéran";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Létal";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Élite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Sans-le-sou";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Mendiant";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Boutiquier";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Revendeur";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Marchand";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Courtier";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Entrepreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Magnat";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Vagabond";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Touriste";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Voyageur";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Éclaireur";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Prospecteur";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Découvreur";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Navigateur";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pionnier";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Helpless";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amateur";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Hero";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiator";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recrue";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Matelot";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Second Maître";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Premier Maître";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Major";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Enseigne";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Lieutenant";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Capitaine de Corvette";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Capitaine de Frégate";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Capitaine de Vaisseau";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Contre-Amiral";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vice-Amiral";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Amiral";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Étranger";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Serf";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Écuyer";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Chevalier";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Banneret";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Vicomte";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Comte";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Duc";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Archiduc";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "Roi";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Rang 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Rang 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Rang 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Rang 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Rang 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Valeur";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Vaisseaux";
+168 -174
View File
@@ -1,509 +1,503 @@
/* Language name */
"!Language" = "Magyar";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Hiba:Frontier szerver nem elérhető";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Hiba:Frontier szerver laggol";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Hiba:Érvénytelen hitelesítő adatok";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "Hiba:Rossz parancsnok";
/* [inara.py] */
"Error: Can't connect to Inara" = "Hiba:Nem lehet kapcsolódni az Inarához";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Frissítés";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Mindig felül";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Parancsnok";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Szerep";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Hajó";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "Rendszer";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Állomás";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Fájl";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Szerkeszt";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Nézet";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Ablak";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Segítség";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "Az {APP} névjegye";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Frissítések keresése";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Nyers adat elmentése";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Státusz";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Adatvédelmi irányelvek";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Kiadási megjegyzések";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Beállítások";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Kilépés";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Dokumentáció";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Másol";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Bejelentkezés";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "A hitelesítés sikerült";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = " Nem dokkoltál az állomáson";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "Az állomáson nincs semmi!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "Nincs piac az állomáson!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Adatok lekérése";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Ki vagy?";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Hol vagy?";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "Mivel repülsz?";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Utoljára frissítve %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Vadászgép";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Lövész";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Kormányos";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "Lehűl {SS} másodperc";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "Ok";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Pluginok";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Alap";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Adatok küldése az EDDN-nek...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Hiba:Nem lehet kapcsolódni az EDDN-hez";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Állomás adatok küldése az EDDN-nek";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Rendszer és szken adatok küldése az EDDN-nek";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Küldés késletetése amig dokkolsz";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "Repülési napló és Parancsnok státusz küldése az EDSM-nek";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Elite Dangerous Csillag térkép hitelesítése";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Parancsnok név";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "API kulcs";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Egyik sem";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Hiba:EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Hiba:nem lehet kapcsólodni az EDSM-hez";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Repülési napló és Parancsnok státusz küldése az Inarának";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Inara hitelesitő adatok";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "Hiba:Frontier szerver SKU probléma";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "Hiba:Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Beállítások";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Kérem válassza ki a menteni kivánt adatokat.";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Piaci adat CSV fájlban";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Piaci adat Trade Dangerous fájlban";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Hajó felszerelése";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Automatikusan frissit dokkolásnál";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Fálj helye";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Módosítás...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Böngész";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Kimenet";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "E:D journal fájl helye";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Billentyűparancsok";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Gyorsgomb";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Újranidítás {APP} parancsikonok használatával";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} engedély szükséges a parancsikon használatához";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Rendszerbeállítások megnyitáss";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Csak ha az Elite Dangerous fut";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Zene be";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "Preferált weboldalak";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Hajógyár";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Konfiguráció";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Titkosítás";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Normál txt";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Kiemelt szöveg";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Nyelv";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Téma";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Sötét";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Átlárható";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Megjelenés";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Plugin mappa";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Nyisd ki";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Tipp:a pluginokat kikapcsolhatod hozzà{CR}adsz a mappa nevében egy '{EXT}'";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Pluginok engedélyezése";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Plugin kikapcsolása";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Egyenleg";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Kölcsön";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Harc";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Kereskedés";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Felfedező";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Föderáció";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Birodalom";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Powerplay";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "ártalmatlan";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Többnyire ártalmatlan";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Kezdő";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Képesített";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Szakértő";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Mester";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Veszélyes";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Halálos";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elit";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Nincstelen";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Többnyire nincstelen";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Házaló ügynők";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Kereskedő";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Kereskedő";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Bróker";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Vállalkozó";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Iparmágnás";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Céltalan";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Tøbnyire céltalan";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Felderítő";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Megfigyelő";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Útkereső";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Útkereső";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Vándor";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Utász";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "tehetetlen";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Többnyire tehetetlen";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amatőr";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Fél profi";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Szakember";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Bajnok";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Hős";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiátor";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Újonc";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Kadét";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Tengerészkadét";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Tizedes";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Törzs zászlós";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Tiszthelyettes";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Zászlós";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Hadnagy";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Főhadnagy";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Ezredes";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Ellentengernagy";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "FőEllentengernagy";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Altengernagy";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Admirális";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Kivűlálló";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Jobbágy";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Földesúr";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Lovag";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Báró";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Vicomte";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Számol";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Gróf";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Őrgróf";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Herceg";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Herceg";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "Király";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Osztákgozás 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Osztályozás 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Osztályozás 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Osztályozás 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Osztályozás 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Érték";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Hajók";
+188 -199
View File
@@ -1,159 +1,151 @@
/* Generic 'Check', as in 'Check E:D journal file location' [EDMarketConnector.py] */
"Check" = "Controlla";
/* Language name */
"!Language" = "Italiano";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Errore: Il Server Frontier è offline";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Errore: il server Frontier sta laggando";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Errore: Credenziali non valide";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "Errore: Cmdr sbagliato";
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:341; companion.py:422; */
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:405; companion.py:490; */
"Error" = "Errore";
/* [inara.py] */
"Error: Can't connect to Inara" = "Errore: Non riesco a connettermi a Inara";
/* companion.py: Frontier CAPI data retrieval failed with 5XX code; In files: companion.py:591; */
"Frontier CAPI server error" = "Errore nel server Frontier CAPI";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Recupera";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Sempre in primo piano";
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:636; */
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:730; */
"Unknown" = "Sconosciuto";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Cmdr";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Ruolo";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Nave";
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:809; */
"Suit" = "Tuta";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "Sistema";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Stazione";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "File";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Appunti";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Vista";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Finestra";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Guida";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "Informazioni su {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Controlla aggiornamenti...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Salva i Dati Grezzi...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Status";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Informativa sulla privacy";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Note di rilascio";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Impostazioni";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Esci";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Documentazione";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Copia";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Mi sto loggando...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Autenticazione riuscita";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "Non sei parcheggiato in nessuna stazione !";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "La Stazione non ha niente !";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "La Stazione non ha un Market !";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Sto raccogliendo i dati...";
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:880; */
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1031; */
"CAPI: No commander data returned" = "CAPI: Nessun dato sul commandante";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Chi sei ?!";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Dove sei finito ?!";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "Stai volando ?!";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Frontier CAPI server error when fetching data; In files: EDMarketConnector.py:1171; */
"Frontier CAPI server error" = "Errore nel server Frontier CAPI";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Ultimo aggiornamento alle %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Cacciatore";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Artigliere";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Timoniere";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "disponibile tra {SS} secondi";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "OK";
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1489; */
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1677; */
"Shutting down..." = "Spegnimento...";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Uno o più dei tuoi plugin non ha ancora il supporto per Python 3.x. Per favore guarda la lista '{PLUGINS}' nella tab a '{FILE}' > '{SETTINGS}'. Dovresti controllare se ci sono aggiornamenti, altrimenti avvisa gli sviluppatori che devono aggiornare il codice a Python 3.x.\n\nPuoi disabilitare il plugin rinominando la cartella aggiungendo '{DISABLED}' alla fine del nome.";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Plugins";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Plugins senza Supporto Python 3.x";
/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:206; */
@@ -168,7 +160,7 @@
/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:232; */
"Ignore" = "Ignora";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Predefinito";
/* coriolis.py: 'Auto' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - auto; In files: coriolis.py:52; coriolis.py:55; coriolis.py:101; coriolis.py:117; coriolis.py:123; */
@@ -195,410 +187,407 @@
/* eddb.py: Journal Processing disabled due to an active killswitch; In files: eddb.py:100; */
"EDDB Journal processing disabled. See Log." = "Elaborazione di EDDB Journal disabilitata. Guarda il Log.";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Sto inviando i dati a EDDN...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Errore: Non riesco a connettermi a EDDN";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Manda i dati della stazione a Elite Dangerous Data Network";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Manda il sistema e i dati scansionati a EDDN";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Ritarda l'invio fino a che si è ormeggiati";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "Manda il flight log e lo stato Cmdr a EDSM";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Credenziali per Elite Dangerous Star Map";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Nome Commandante";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "API Key";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Nessuna";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Errore: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Errore: Non riesco a connettermi a EDSM";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Manda il flight log e lo stato Cmdr a Inara";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Credenziali per Inara";
/* inara.py: INARA support disabled via killswitch; In files: inara.py:335; */
/* inara.py: INARA support disabled via killswitch; In files: inara.py:341; */
"Inara disabled. See Log." = "Inara disabilitato. Vedi il Log.";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "Errore: il server Frontier ha un problema SKU";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "Errore: Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Preferenze";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Si prega di scegliere che dati salvare";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Market data in formato CSV";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Market data in formato Trade Dangerous";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Equipaggiamento della nave";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Auto-aggiornamento all'ormeggio";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Percorso del file";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Cambia...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Sfoglia...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Output";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "locazione del file E:D journal";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Scorciatoia di tastiera";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Hotkey";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Riavvia {APP} per usare le scorciatoie";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} ha bisogno dei permessi per usare le scorciatoie";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Apri Preferenze di Sistema";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Solo quando “Elite: Dangerous” è in primo piano";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Notifica sonora";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "Disabilita gli aggiornamenti automatici quando sei in-game";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "Sito web preferito";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Spazioporto";
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:592; */
"Use alternate URL method" = "Usare metodo URL alternativo";
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:644; */
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:645; */
"Log Level" = "Livello di Log";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Configurazione";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Dati personali";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Testo normale";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Testo evidenziato";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Lingua";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Tema";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Scuro";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Trasparente";
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:770; */
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:793; */
"UI Scale Percentage" = "Percentuale zoom della UI";
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:791; */
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:814; */
"100 means Default{CR}Restart Required for{CR}changes to take effect!" = "100 significa Default{CR}Riavvio Richiesto per{CR}applicare i cambiamenti!";
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:801; */
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:824; */
"Main window transparency" = "Trasparenza della finestra principale";
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:821:824; */
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:844:847; */
"100 means fully opaque.{CR}Window is updated in real time" = "100 stà per completamente opaco.{CR}Finestra è aggiornata in tempo reale";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Aspetto";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Cartella dei plugins";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Apri";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Suggerimento: è possibile disabilitare un plugin {CR}aggiungendo '{EXT}' nel nome della sua cartella";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Plugin abilitati";
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:921; */
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:944; */
"Plugins Without Python 3.x Support:" = "Plugin senza il supporto a Python 3.x :";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "Informazioni sulla migrazione dei plugins";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Plugin disabilitati";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Saldo";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Prestito";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Combat";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Trade";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Explorer";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Federazione";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Impero";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Powerplay";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Harmless";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Mostly Harmless";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Competent";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Master";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Dangerous";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Deadly";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Penniless";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Mostly Penniless";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Peddler";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Dealer";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Merchant";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Broker";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Entrepreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Tycoon";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Aimless";
/* Appearance setting. [EDMarketConnector.py] */
"Minimize to system tray" = "Riduci a icona nel Vassoio di sistema";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Mostly Aimless";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Scout";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Surveyor";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Trailblazer";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Pathfinder";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Ranger";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pioneer";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Helpless";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amateur";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Hero";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiator";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recruit";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Midshipman";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Petty Officer";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Chief Petty Officer";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Warrant Officer";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Ensign";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Lieutenant";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Lieutenant Commander";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Post Commander";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Post Captain";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Rear Admiral";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Outsider";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Serf";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Squire";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Knight";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Count";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Duke";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "King";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Rating 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Rating 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Rating 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Rating 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Rating 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Valore";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Navi";
+233 -211
View File
@@ -1,180 +1,190 @@
/* Generic 'Check', as in 'Check E:D journal file location' [EDMarketConnector.py] */
"Check" = "確認";
/* Language name */
"!Language" = "日本語";
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:171; */
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:220; */
"Error: Frontier CAPI didn't respond" = "エラー: Frontier CAPIからの応答がありません";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "エラー: Frontier社のサーバがダウンしています";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "エラー: Frontier社のサーバが混雑しています";
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:205; */
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:255; */
"Docked but unknown station: EDO Settlement?" = "不明なステーションに着艦: EDOの基地?";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "エラー: 認証情報に誤りがあります";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "エラー: 不適切なCmdr";
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:341; companion.py:422; */
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:405; companion.py:490; */
"Error" = "エラー";
/* [inara.py] */
"Error: Can't connect to Inara" = "エラー: Inaraに接続できません";
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:380; companion.py:385; */
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:448; companion.py:453; */
"Error: Couldn't check token customer_id" = "エラー: customer_idトークンを確認できませんでした";
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:391; */
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:459; */
"Error: customer_id doesn't match!" = "エラー: customer_idがマッチしません!";
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:413; */
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:481; */
"Error: unable to get token" = "エラー: トークンが取得できません";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:575; */
/* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:781; */
"Frontier CAPI down for maintenance" = "Frontier CAPIがメンテナンスのため停止中";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:793; */
"Frontier CAPI query failure" = "Frontier CAPIクエリ失敗";
/* companion.py: Frontier CAPI data retrieval failed with 5XX code; In files: companion.py:591; */
"Frontier CAPI server error" = "Frontier CAPIサーバエラー";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "更新";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "常に最前面に表示する";
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:636; */
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:730; */
"Unknown" = "不明";
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:705; */
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:799; */
"Error: Check E:D journal file location" = "エラー: E:Dジャーナルファイルの場所を確認してください";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "コマンダー";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "役割";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "船";
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:809; */
"Suit" = "スーツ";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "星系";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "ステーション";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "ファイル";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "編集";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "表示";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "ウィンドウ";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "ヘルプ";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "{APP} について";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "更新の確認...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "生データの保存...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "ステータス";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "プライバシーポリシー";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "リリースノート";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "設定";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "終了";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "ドキュメント";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "コピー";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "ログイン中...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "認証成功";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "ステーションにドッキングしていません!";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "このステーションには何も商品がありません!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "このステーションには市場がありません!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: CAPI queries aborted because Cmdr name is unknown; In files: EDMarketConnector.py:945; */
"CAPI query aborted: Cmdr name unknown" = "CAPIクエリ中止: CMDR名が不明";
/* EDMarketConnector.py: CAPI queries aborted because game mode unknown; In files: EDMarketConnector.py:951; */
"CAPI query aborted: Game mode unknown" = "CAPIクエリ中止: ゲームモードが不明";
/* EDMarketConnector.py: CAPI queries aborted because current star system name unknown; In files: EDMarketConnector.py:957; */
"CAPI query aborted: Current system unknown" = "CAPIクエリ中止: 現システムが不明";
/* EDMarketConnector.py: CAPI queries aborted because player is in multi-crew on other Cmdr's ship; In files: EDMarketConnector.py:963; */
"CAPI query aborted: In other-ship multi-crew" = "CAPIクエリ中止: 他の船でマルチクルー中";
/* EDMarketConnector.py: CAPI queries aborted because player is in CQC (Arena); In files: EDMarketConnector.py:969; */
"CAPI query aborted: CQC (Arena) detected" = "CAPIクエリ中止: CQC(Arena)が検出";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "データを取得中...";
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:880; */
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1031; */
"CAPI: No commander data returned" = "CAPI: コマンダーのデータが返ってきませんでした";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "どなたですか?!";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "どこにいますか?!";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "どの船で飛行していますか?!";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Frontier CAPI server error when fetching data; In files: EDMarketConnector.py:1171; */
"Frontier CAPI server error" = "Frontier CAPIサーバエラー";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "最終更新時間 %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Fighter";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Gunner";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Helm";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "次回更新まであと {SS}秒";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "了解";
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1489; */
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1677; */
"Shutting down..." = "終了します...";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "有効にしている1つ以上のプラグインがPython 3.xをサポートしていません。'{FILE}' > '{SETTINGS}'\nメニューで表示される設定ダイアログの'{PLUGINS}' タブの一覧を確認してください。更新済みのバージョンがあるかを確認し、なければ開発者にPython 3.xに対応するように開発者に連絡してください。\n\nプラグインを無効にするにはフォルダ名の最後に'{DISABLED}'を追加してください。";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "プラグイン";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: プラグインがPython 3.xをサポートしていません";
/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:206; */
@@ -189,7 +199,7 @@
/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:232; */
"Ignore" = "無視";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "デフォルト";
/* coriolis.py: 'Auto' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - auto; In files: coriolis.py:52; coriolis.py:55; coriolis.py:101; coriolis.py:117; coriolis.py:123; */
@@ -222,425 +232,437 @@
/* eddb.py: Journal Processing disabled due to an active killswitch; In files: eddb.py:100; */
"EDDB Journal processing disabled. See Log." = "EDDBジャーナル処理が無効です。ログを確認してください。";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "EDDNにデータ送信中...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "エラー: EDDNに接続できません";
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:282; */
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:330; */
"EDDN Error: EDMC is too old for EDDN. Please update." = "EDDNエラー: EDDNで使用するにはEDMCのバージョンが古すぎます。更新してください。";
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:288; */
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:336; */
"EDDN Error: Validation Failed (EDMC Too Old?). See Log" = "EDDNエラー: 検証に失敗しました(EDMCが古すぎる?)。ログを確認してください。";
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:293; */
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:341; */
"EDDN Error: Returned {STATUS} status code" = "EDDNエラー: ステータスコード {STATUS} が返されました";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Elite Dangerous Data Networkにステーションデータを送信する";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Elite Dangerous Data Networkに星系やスキャンした星のデータを送信する";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "ドッキングするまでデータを送信しない";
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:785; */
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:1222; */
"EDDN journal handler disabled. See Log." = "EDDNジャーナルハンドラーが無効です。ログを確認してください。";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "フライトログとCMDRステータスをEDSMへ送信する";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Elite Dangerous Star Mapの認証情報";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "コマンダー名";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "APIキー";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "設定なし";
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:358; */
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:401; */
"EDSM Handler disabled. See Log." = "EDSMハンドラーが無効です。ログを確認してください。";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "エラー: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "エラー: EDSMに接続できません";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "フライトログとCMDRステータスをInaraへ送信する";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Inara認証情報";
/* inara.py: INARA support disabled via killswitch; In files: inara.py:335; */
/* inara.py: INARA support disabled via killswitch; In files: inara.py:341; */
"Inara disabled. See Log." = "Inaraが無効です。ログを確認してください。";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "エラー: Frontier社のサーバで非ゲーム所有者と判断されました";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "エラー: Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "環境設定";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "保存するデータの種類を選択して下さい";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "市場データをCSV形式で記録する";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "市場データをTrade Dangerous形式で記録する";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "船の装備構成";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "ドッキングした際に自動でデータを更新する";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "ファイルの出力先";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "変更...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "参照...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "出力";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "E:Dゲームクライアントのジャーナルファイル出力先";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "ショートカット";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "ホットキー";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "ショートカットを利用するには {APP} を再起動してください";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} がショートカットを利用するには許可が必要です";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "システム環境設定を開く";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Elite: Dangerousがアクティブの時だけ有効";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "音を鳴らす";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "ゲーム中の自動アプリケーション更新チェックを無効にする";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "お気に入りのウェブサイト";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "造船所";
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:592; */
"Use alternate URL method" = "別のURL方式を使用する";
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:644; */
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:645; */
"Log Level" = "ログレベル";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "環境設定";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: UI elements privacy section header in privacy tab of preferences; In files: prefs.py:682; */
"Main UI privacy options" = "メインUIプライバシーオプション";
/* prefs.py: Hide private group owner name from UI checkbox; In files: prefs.py:687; */
"Hide private group name in UI" = "UIでプライベートグループ名を表示しない";
/* prefs.py: Hide multicrew captain name from main UI checkbox; In files: prefs.py:691; */
"Hide multi-crew captain name" = "マルチクルー船長名を表示しない";
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "プライバシー";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "通常表示";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "強調表示";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "言語";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "テーマ";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "ダーク";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "透明";
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:770; */
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:793; */
"UI Scale Percentage" = "UIスケール比率";
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:791; */
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:814; */
"100 means Default{CR}Restart Required for{CR}changes to take effect!" = "100はデフォルトを意味します{CR}変更した値を反映するには{CR}再起動が必要です!";
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:801; */
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:824; */
"Main window transparency" = "メインウィンドウの透明度";
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:821:824; */
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:844:847; */
"100 means fully opaque.{CR}Window is updated in real time" = "100は完全に不透明であることを意味します。{CR}ウィンドウはリアルタイムで更新されます";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "表示";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "プラグインフォルダ";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "開く";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "ヒント: プラグインを無効にするには{CR}フォルダ名に '{EXT}' を追加してください";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "有効なプラグイン";
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:921; */
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:944; */
"Plugins Without Python 3.x Support:" = "Python 3.xサポートのないプラグイン:";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "プラグインの移行に関する情報";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "無効なプラグイン";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "口座残高";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "負債";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "戦闘ランク";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "交易ランク";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "探索ランク";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQCランク";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "連邦ランク";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "帝国ランク";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "パワープレイ";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Harmless";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Mostly Harmless";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Competent";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Master";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Dangerous";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Deadly";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Penniless";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Mostly Penniless";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Peddler";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Dealer";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Merchant";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Broker";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Entrepreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Tycoon";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Aimless";
/* Appearance setting. [EDMarketConnector.py] */
"Minimize to system tray" = "システムトレイに最小化する";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Mostly Aimless";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Scout";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Surveyor";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Trailblazer";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Pathfinder";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Ranger";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pioneer";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Helpless";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amateur";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Hero";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiator";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recruit";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Midshipman";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Petty Officer";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Chief Petty Officer";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Warrant Officer";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Ensign";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Lieutenant";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Lieutenant Commander";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Post Commander";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Post Captain";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Rear Admiral";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Outsider";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Serf";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Squire";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Knight";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Count";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Duke";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "King";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Rating 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Rating 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Rating 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Rating 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Rating 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Current commander unknown when trying to use 'File' > 'Status'; In files: stats.py:280; */
"Status: Don't yet know your Commander name" = "状態: あなたのコマンダー名が不明です";
/* stats.py: No Frontier CAPI data yet when trying to use 'File' > 'Status'; In files: stats.py:288; */
"Status: No CAPI data yet" = "状態: CAPIデータがありません";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "価値";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "所有船";
+237 -215
View File
@@ -1,180 +1,190 @@
/* Generic 'Check', as in 'Check E:D journal file location' [EDMarketConnector.py] */
"Check" = "확인";
/* Language name */
"!Language" = "한국어(Korean)";
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:171; */
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:220; */
"Error: Frontier CAPI didn't respond" = "오류: Frontier CAPI가 응답이 없음";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "오류: Frontier 서버 CAPI 연결 불가";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "오류: Frontier 서버 응답이 지연되고 있음";
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:205; */
"Docked but unknown station: EDO Settlement?" = "도킹되었지만 알 수 없는 정거장임: 엘리트: 데인저러스 오디세이의 지상 기지입니까? (의역이니 확인 바람)";
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:255; */
"Docked but unknown station: EDO Settlement?" = "알 수 없는 정거장에 도킹함: Odyssey 지상 기지입니까?";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "오류: 잘못된 자격 증명";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "오류: 잘못된 커맨더";
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:341; companion.py:422; */
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:405; companion.py:490; */
"Error" = "오류";
/* [inara.py] */
"Error: Can't connect to Inara" = "오류: Inara에 연결할 수 없음";
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:380; companion.py:385; */
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:448; companion.py:453; */
"Error: Couldn't check token customer_id" = "오류: customer_id 토큰을 확인할 수 없었음";
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:391; */
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:459; */
"Error: customer_id doesn't match!" = "오류: customer_id가 일치하지 않습니다!";
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:413; */
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:481; */
"Error: unable to get token" = "오류: 토큰을 받지 못함";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:575; */
/* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:781; */
"Frontier CAPI down for maintenance" = "Frontier CAPI 점검으로 접속 불가";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:793; */
"Frontier CAPI query failure" = "Frontier CAPI 쿼리 실패";
/* companion.py: Frontier CAPI data retrieval failed with 5XX code; In files: companion.py:591; */
"Frontier CAPI server error" = "Frontier CAPI 서버 에러";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "새로 고침";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "항상 위에 보이기";
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:636; */
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:730; */
"Unknown" = "알 수 없음";
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:705; */
"Error: Check E:D journal file location" = "에러: 엘리트:데인저러스 journal file 위치를 확인해 주십시요";
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:799; */
"Error: Check E:D journal file location" = "오류: E:D 저널 파일의 위치를 확인하십시오";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "커맨더";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Role";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "함선";
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:809; */
"Suit" = "슈트";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "성계";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "스테이션";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "파일";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "편집";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "보기";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "창";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "도움말";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "{APP} 정보";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "업데이트 확인하기...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Raw 데이터 저장하기...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "상태";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "개인정보처리방침";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "릴리즈 노트";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "설정";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "종료";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "문서 자료";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "복사";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "로그인하는 중...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "인증 성공";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "스테이션에 도킹되어 있지 않습니다!";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "스테이션에 아무것도 없습니다!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "스테이션에 마켓이 없습니다!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: CAPI queries aborted because Cmdr name is unknown; In files: EDMarketConnector.py:945; */
"CAPI query aborted: Cmdr name unknown" = "CAPI 쿼리 중단: 커맨더 이름 알 수 없음";
/* EDMarketConnector.py: CAPI queries aborted because game mode unknown; In files: EDMarketConnector.py:951; */
"CAPI query aborted: Game mode unknown" = "CAPI 쿼리 중단: 게임 모드 알 수 없음";
/* EDMarketConnector.py: CAPI queries aborted because current star system name unknown; In files: EDMarketConnector.py:957; */
"CAPI query aborted: Current system unknown" = "CAPI 쿼리 중단: 현재 성계 알 수 없음";
/* EDMarketConnector.py: CAPI queries aborted because player is in multi-crew on other Cmdr's ship; In files: EDMarketConnector.py:963; */
"CAPI query aborted: In other-ship multi-crew" = "CAPI 쿼리 중단: 다른 함선의 멀티크루로 참여중";
/* EDMarketConnector.py: CAPI queries aborted because player is in CQC (Arena); In files: EDMarketConnector.py:969; */
"CAPI query aborted: CQC (Arena) detected" = "CAPI 쿼리 중단: CQC(아레나) 감지됨";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "데이터 가져오는 중...";
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:880; */
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1031; */
"CAPI: No commander data returned" = "CAPI: 커맨더 정보가 반환되지 않음";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "당신은 누구시죠?!";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "어디 계신거죠?!";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "지금 어떤 함선을 몰고 계신 건가요?!";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Frontier CAPI server error when fetching data; In files: EDMarketConnector.py:1171; */
"Frontier CAPI server error" = "Frontier CAPI 서버 오류";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "마지막 업데이트: %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Fighter";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Gunner";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Helm";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "쿨다운 {SS}s";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "OK";
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1489; */
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1677; */
"Shutting down..." = "종료하는 중...";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "활성화된 플러그인 중 1개 이상이 Python 3.x를 지원하지 않습니다. '{FILE}' > '{SETTINGS}' 에서 '{PLUGINS}' 탭에 들어가 활성화되어있는 플러그인 목록을 확인하십시오. 플러그인들 중 새 버전이 나온 것이 있는지도 확인해보시고, 만약 3.x를 지원하지도, 새 버전도 없다면 해당 플러그인의 개발자에게 코드를 수정하기를 문의하십시오.\n\n플러그인을 비활성화하려면 '{DISABLED}'를 폴더명 뒤에 추가하면 됩니다.";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "플러그인";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Python 3.x을 지원하지 않는 플러그인";
/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:206; */
@@ -189,7 +199,7 @@
/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:232; */
"Ignore" = "무시하기";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "기본값";
/* coriolis.py: 'Auto' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - auto; In files: coriolis.py:52; coriolis.py:55; coriolis.py:101; coriolis.py:117; coriolis.py:123; */
@@ -222,425 +232,437 @@
/* eddb.py: Journal Processing disabled due to an active killswitch; In files: eddb.py:100; */
"EDDB Journal processing disabled. See Log." = "EDDB 저널 처리 비활성화됨. 로그 참고 바람.";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "EDDN에 정보 전송하는 중...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "오류: EDDN에 연결할 수 없음";
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:282; */
"EDDN Error: EDMC is too old for EDDN. Please update." = "EDDN 오류: EDMC 가 구버전 입니다. 업데이트 해주세요";
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:330; */
"EDDN Error: EDMC is too old for EDDN. Please update." = "EDDN 오류: EDDN에 접속하기에 EDMC의 버전이 너무 오래되었습니다. 업데이트하시기 바랍니다.";
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:288; */
"EDDN Error: Validation Failed (EDMC Too Old?). See Log" = "EDDN 오류: 검증 실패 (EDMC 가 구버전입니까?). 로그 참고 바람";
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:336; */
"EDDN Error: Validation Failed (EDMC Too Old?). See Log" = "EDDN 오류: 인증 실패 (EDMC가 너무 오래되었을 수 있음). 로그 참고";
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:293; */
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:341; */
"EDDN Error: Returned {STATUS} status code" = "EDDN 오류: 상태 코드 {STATUS}가 반환됨";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Elite Dangerous Data Network에 스테이션 정보 전송하기";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Elite Dangerous Data Network에 시스템 및 스캔 정보 전송하기";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "도킹시까지 서버에 정보 전송을 미루기";
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:785; */
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:1222; */
"EDDN journal handler disabled. See Log." = "EDDN 저널 처리 비활성화됨. 로그 참고 바람.";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "EDSM에 flight 로그와 커맨더 상태 정보 전송하기";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Elite Dangerous Star Map 계정";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "커맨더 이름";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "API 키";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "없음";
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:358; */
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:401; */
"EDSM Handler disabled. See Log." = "EDSM Handler 비활성화됨. 로그 참고 바람.";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "오류: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "오류: EDSM에 연결할 수 없음";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Inara에 flight 로그와 커맨더 상태 정보 전송하기";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Inara 계정 정보";
/* inara.py: INARA support disabled via killswitch; In files: inara.py:335; */
/* inara.py: INARA support disabled via killswitch; In files: inara.py:341; */
"Inara disabled. See Log." = "Inara 비활성화됨. 로그 참고 바람.";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "오류: Frontier 서버 SKU 문제 발생";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "오류: Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "설정";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "어느 데이터를 저장할 지 선택해주세요";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "CSV 형식 파일의 마켓 정보";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Trade Dangerous 형식 파일의 마켓 정보";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "함선 피팅";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "도킹시 자동으로 서버에 정보 업데이트하기";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "파일 위치";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "바꾸기...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "찾아보기...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "출력";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "E:D 저널(journal) 파일 위치";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "단축키 설정";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "단축키";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "단축키를 사용하려면 {APP}을(를) 다시 시작하십시오";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "단축기 사용을 위해선 {APP}이 권한 허용을 필요로 합니다";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "시스템 설정 열기";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Elite: Dangerous가 활성 창 상태일때만";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "소리 재생하기";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "게임이 실행중일 때 프로그램 업데이트 확인하지 않기";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "선호하는 사이트";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "쉽야드";
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:592; */
"Use alternate URL method" = "다른 URL 형식 사용하기";
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:644; */
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:645; */
"Log Level" = "로깅 수준";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "환경 설정";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: UI elements privacy section header in privacy tab of preferences; In files: prefs.py:682; */
"Main UI privacy options" = "메인 UI 개인정보 설정";
/* prefs.py: Hide private group owner name from UI checkbox; In files: prefs.py:687; */
"Hide private group name in UI" = "UI에서 프라이빗 그룹 이름 숨기가";
/* prefs.py: Hide multicrew captain name from main UI checkbox; In files: prefs.py:691; */
"Hide multi-crew captain name" = "멀티크루 함장 이름 숨기기";
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "개인정보";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "일반 텍스트";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "강조된 텍스트";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "언어";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "테마";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "어둡게";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "투명하게";
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:770; */
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:793; */
"UI Scale Percentage" = "UI 스케일 백분율";
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:791; */
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:814; */
"100 means Default{CR}Restart Required for{CR}changes to take effect!" = "100은 '기본 설정'을 의미하며{CR}변경사항 적용을 위해{CR}재시작이 요구됩니다!";
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:801; */
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:824; */
"Main window transparency" = "메인 창 투명도";
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:821:824; */
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:844:847; */
"100 means fully opaque.{CR}Window is updated in real time" = "100은 완전히 불투명함을 의미합니다.{CR}창은 실시간으로 업데이트됨";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "스타일";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "플러그인 폴더";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "열기";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "팁: 플러그인을 비활성화하려면{CR} '{EXT}'를 폴더명 뒤에 추가하면 됨";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "활성 플러그인";
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:921; */
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:944; */
"Plugins Without Python 3.x Support:" = "Python 3.x을 지원하지 않는 플러그인:";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "플러그인 위치 변경에 대한 정보";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "비활성 플러그인";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "잔고";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "대출";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Combat";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Trade";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Explorer";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Federation";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Empire";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Powerplay";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Harmless";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Mostly Harmless";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Competent";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Master";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Dangerous";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Deadly";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Penniless";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Mostly Penniless";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Peddler";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Dealer";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Merchant";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Broker";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Entrepreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Tycoon";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Aimless";
/* Appearance setting. [EDMarketConnector.py] */
"Minimize to system tray" = "시스템 트레이로 최소화";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Mostly Aimless";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Scout";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Surveyor";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Trailblazer";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Pathfinder";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Ranger";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pioneer";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Helpless";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amateur";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Hero";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiator";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recruit";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Midshipman";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Petty Officer";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Chief Petty Officer";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Warrant Officer";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Ensign";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Lieutenant";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Lieutenant Commander";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Post Commander";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Post Captain";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Rear Admiral";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Outsider";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Serf";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Squire";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Knight";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Count";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Duke";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "King";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Rating 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Rating 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Rating 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Rating 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Rating 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Current commander unknown when trying to use 'File' > 'Status'; In files: stats.py:280; */
"Status: Don't yet know your Commander name" = "상태: 아직 커맨더 이름이 확인되지 않음";
/* stats.py: No Frontier CAPI data yet when trying to use 'File' > 'Status'; In files: stats.py:288; */
"Status: No CAPI data yet" = "상태: 아직 CAPI 정보 없음";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "가치";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "함선(들)";
+161 -161
View File
@@ -1,482 +1,482 @@
/* Language name */
"!Language" = "Latviešu";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Kļūda: Frontier serveris nav aktīvs";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Kļūda: Frontier serveris aizkavējas";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Kļūda: Nederīga lietotāja informācija";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Atjaunināt";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Vienmēr virspusē";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Cmdr";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Loma";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Kuģis";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "Sistēma";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Stacija";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Fails";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Labot";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Skats";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Logs";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Palīdzība";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "Par {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Pārbaudīt atjauninājumus...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Saglabāt sākotnējos datus...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Statuss";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Privātuma politika";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Informācija par laidienu";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Iestatījumi";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Iziet";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Dokumentācija";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Kopēt";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Autorizējas...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Autentifikācija sekmīga";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "Jūs neesat stacijā!";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "Stacijā nekā nav!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "Stacijā nav tirgus!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Iegūst datus...";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Kas tu esi?";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Kur tu esi?";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "Ar ko tu lido?";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Pēdējo reizi atjaunināts %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Cīnītājs";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Ložmetējnieks";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Stūre";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "Atskaite {SS}";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "Labi";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Spraudņi";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Noklusējuma";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Sūta datus uz EDDN...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Kļūda: Nevar savienoties ar EDDN";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Sūtīt stacijas datus uz Elite Dangerous Data Network";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Sūtīt stacijas datus uz Elite Dangerous Data Network";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Aizkavēt sūtīšanu līdz nosēšanai";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Elite Dangerous zvaigžņu kartes informācija";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Komandiera vārds";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "API atslēga";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Neviens";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Kļūda: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Kļūda: Nevar savienoties ar EDSM";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Iestatījumi";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Lūdzu izvēlaties kādus datus saglabāt";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Tirgus dati CSV formātā";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Tirgus dati Trade Dangerous formātā";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Kuģa loadout";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Automtiski atjaunoties nosēžoties.";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Faila atrašanās vieta";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Mainīt...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Pārlūkot...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Izvade";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "E:D žurnāla faila atrašanās vieta";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Ātrais taustiņš";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Ātrais taustiņš";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Restartējiet {APP} lai izmantotu īssceļus";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} vajag atļaujas lai izmantotu īssceļus";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Atvērt sistēmas iestatījumus";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Tikai kad Elite: Dangerous ir aktīvā aplikācija";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Atskaņot skaņu";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Kuģu būvētava";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Konfigurācija";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Privātums";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Normālais teksts";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Izceltais teksts";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Valoda";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Dizains";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Tumša";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Caurspīdīga";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Izskats";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Spraudņu mape";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Atvērt";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Iespējoti Spraudņi";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Atspējoti Spraudņi";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Bilance";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Aizdevums";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Combat";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Trade";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Explorer";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Federation";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Empire";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Powerplay";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Nekaitīgs";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Mostly Harmless";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Competent";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Master";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Dangerous";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Deadly";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Penniless";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Mostly Penniless";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Peddler";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Dealer";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Merchant";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Broker";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Entrepreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Tycoon";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Aimless";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Mostly Aimless";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Scout";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Surveyor";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Trailblazer";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Pathfinder";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Ranger";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pioneer";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Bezpalīdzīgs";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amateur";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Varonis";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiators";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recruit";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Midshipman";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Petty Officer";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Chief Petty Officer";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Warrant Officer";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Ensign";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Leitnants";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Lieutenant Commander";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Post Commander";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Post Captain";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Rear Admiral";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Outsider";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Serf";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Squire";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Bruņinieks";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Count";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Duke";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "Karalis";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Rating 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Rating 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Rating 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Rating 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Rating 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Vērtība";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Kuģi";
+173 -179
View File
@@ -1,524 +1,518 @@
/* Language name */
"!Language" = "Nederlands";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Fout: Frontier server is offline";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Fout: Frontier server is vertraagd";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Fout: Ongeldige inlog gegevens";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "Fout: Verkeerde Cmdr";
/* [inara.py] */
"Error: Can't connect to Inara" = "Fout: Kan geen verbinding maken met Inara";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Bijwerken";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Altijd op voorgrond";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Cmdr";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Rol";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Schip";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "Systeem";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Station";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Bestand";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Bewerken";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Beeld";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Venster";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Help";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "Over {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Controleren op updates...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Sla onbewerkte gegevens op...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Status";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Privacybeleid";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Release opmerkingen";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Instellingen";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Afsluiten";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Documentatie";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Kopieëren";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Bezig met inloggen...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Authenticatie voltooid";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "Je bent niet gedockt in een station!";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "Station heeft helemaal niets!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "Station heeft geen markt!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Data wordt opgehaald...";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Wie ben je?!";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Waar ben je?!";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "Waar vlieg je in?!";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Voor het laatst bijgewerkt om %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Gevechtsvlieger";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Schutter";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Stuurman";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "wachtperiode {SS}s";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "OK";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Een of meer ingeschakelde plugins hebben nog geen Python 3.x ondersteuning. Kijk op de lijst op de '{PLUGINS}' tab van '{FILE}' > '{SETTINGS}'. Check of er een bijgewerkte versie beschikbaar is. Laat anders de developer weten dat ze de code moeten updaten voor Python 3.x.\n\nJe kan de plugin uitschakelen door het mapje te hernoemen met '{DISABLED}' aan het eind van de naam.";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Plugins";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMS: Plugins zonder Python 3.x ondersteuning";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Standaard";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Bezig data te versturen naar EDDN...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Fout: Kan geen verbinding maken met EDDN";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Stuur station gegevens naar het Elite Dangerous Data Network";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Stuur systeem en scan gegevens naar het Elite Dangerous Data Network";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Stel verzending uit tot na het docken";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "Stuur vlucht logboek en Cmdr status naar EDSM";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Elite Dangerous Star Map inlog gegevens";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Commander naam";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "API Key";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Geen";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Fout: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Fout: Kan geen verbinding maken met EDSM";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Stuur vlucht logboek en Cmdr status naar Inara";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Inara inlog gegevens";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "Fout: Frontier server SKU probleem";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "Fout: Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Preferences";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Welke gegevens wilt u opslaan?";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Markt data in CSV bestand formaat";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Markt data in Trade Dangerous bestand formaat";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Schip inrichting";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Automatisch bijwerken na de landing";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Bestand locatie";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Wijzigen...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Bladeren...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Uitvoer";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "E:D journaal bestand locatie";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Toetscombinaties";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Hotkey";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "{APP} heropstarten om toetscombinaties te gebruiken";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} heeft toestemming nodig om toetscombinaties te gebruiken";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Open Systeemvoorkeuren";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Alleen wanneer Elite: Dangerous de actieve applicatie is";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Geluid afspelen";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "Schakel Automatische update check uit wanneer in-game";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "Voorkeur websites";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Scheepswerf";
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:592; */
"Use alternate URL method" = "Gebruik andere URL methode";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Configuratie";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Privacy";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Normale tekst";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Gemarkeerde tekst";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Taal";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Thema";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Donker";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Transparent";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Vormgeving";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Plugins map";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Openen";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Tip: Je kan een plugin deactiveren door '{EXT}'{CR}toe te voegen aan de map naam";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Geactiveerde plugins";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "Informatie over plugins migreren";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Gedeactiveerde plugins";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Balans";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Lening";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Gevechts rang";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Handels rang";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Ontdekkingsreiziger rang";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Federation";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Empire";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Powerplay";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Harmless";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Mostly Harmless";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Competent";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Master";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Dangerous";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Deadly";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Penniless";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Mostly Penniless";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Peddler";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Dealer";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Merchant";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Broker";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Entrepreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Tycoon";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Aimless";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Mostly Aimless";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Scout";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Surveyor";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Trailblazer";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Pathfinder";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Ranger";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pioneer";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Helpless";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amateur";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Hero";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiator";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recruit";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Midshipman";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Petty Officer";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Chief Petty Officer";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Warrant Officer";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Ensign";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Lieutenant";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Lieutenant Commander";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Post Commander";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Post Captain";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Rear Admiral";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Outsider";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Serf";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Squire";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Knight";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Count";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Duke";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "King";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Rating 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Rating 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Rating 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Rating 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Rating 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Waarde";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Schepen";
+233 -211
View File
@@ -1,180 +1,190 @@
/* Generic 'Check', as in 'Check E:D journal file location' [EDMarketConnector.py] */
"Check" = "Sprawdź";
/* Language name */
"!Language" = "Polski";
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:171; */
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:220; */
"Error: Frontier CAPI didn't respond" = "Błąd: Brak odpowiedzi od CAPI Frontier";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Błąd: Serwer Frontiera nie odpowiada";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Błąd: Serwer Frontiera laguje";
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:205; */
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:255; */
"Docked but unknown station: EDO Settlement?" = "Zadokowany na nieznanej stacji: czyżby kolonia EDO?";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Błąd: Dane uwierzytelniające niepoprawne";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "Błąd: Niepoprawny Cmdr";
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:341; companion.py:422; */
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:405; companion.py:490; */
"Error" = "Błąd";
/* [inara.py] */
"Error: Can't connect to Inara" = "Błąd: Nie można połączyć się z serwisem Inara";
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:380; companion.py:385; */
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:448; companion.py:453; */
"Error: Couldn't check token customer_id" = "Błąd: Nie można sprawdzić ID klienta z tokenu";
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:391; */
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:459; */
"Error: customer_id doesn't match!" = "Błąd: ID klienta nie pasuje!";
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:413; */
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:481; */
"Error: unable to get token" = "Błąd: Nie można pobrać tokenu";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:575; */
/* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:781; */
"Frontier CAPI down for maintenance" = "CAPI w trakcie prac serwisowych";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:793; */
"Frontier CAPI query failure" = "Błąd zapytania CAPI Frontier";
/* companion.py: Frontier CAPI data retrieval failed with 5XX code; In files: companion.py:591; */
"Frontier CAPI server error" = "Błąd serwera CAPI Frontier";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Aktualizacja";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Zawsze na wierzchu";
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:636; */
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:730; */
"Unknown" = "Nieznany";
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:705; */
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:799; */
"Error: Check E:D journal file location" = "Błąd: Sprawdź lokalizację pliku dziennika E:D";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Cmdr";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Rola";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Statek";
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:809; */
"Suit" = "Kombinezon";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "System";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Stacja";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Plik";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Edycja";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Widok";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Okno";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Pomoc";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "{APP}...";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Sprawdź aktualizacje...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Zapisz Nieprzetworzone Dane...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Status";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Polityka prywatności";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Informacje o wersji";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Ustawienia";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Zakończ";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Dokumentacja";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Kopiuj";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Logowanie...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Autoryzacja pomyślna";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "Nie jesteś zadokowany do stacji!";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "Stacja jest pusta!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "W stacji nie ma giełdy towarowej!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: CAPI queries aborted because Cmdr name is unknown; In files: EDMarketConnector.py:945; */
"CAPI query aborted: Cmdr name unknown" = "Zapytanie CAPI anulowane: nazwa komandora nieznana";
/* EDMarketConnector.py: CAPI queries aborted because game mode unknown; In files: EDMarketConnector.py:951; */
"CAPI query aborted: Game mode unknown" = "Zapytanie CAPI anulowane: tryb gry nieznany";
/* EDMarketConnector.py: CAPI queries aborted because current star system name unknown; In files: EDMarketConnector.py:957; */
"CAPI query aborted: Current system unknown" = "Zapytanie CAPI anulowane: obecny system nieznany";
/* EDMarketConnector.py: CAPI queries aborted because player is in multi-crew on other Cmdr's ship; In files: EDMarketConnector.py:963; */
"CAPI query aborted: In other-ship multi-crew" = "Zapytanie CAPI anulowane: jako załogant w innym statku";
/* EDMarketConnector.py: CAPI queries aborted because player is in CQC (Arena); In files: EDMarketConnector.py:969; */
"CAPI query aborted: CQC (Arena) detected" = "Zapytanie CAPI anulowane: wykryto arenę CQC";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Pobieranie danych...";
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:880; */
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1031; */
"CAPI: No commander data returned" = "CAPI: Nie zwrócono danych dowódcy";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Kim jesteś?!";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Gdzie jesteś?!";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "Czym latasz?!";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Frontier CAPI server error when fetching data; In files: EDMarketConnector.py:1171; */
"Frontier CAPI server error" = "Błąd serwera CAPI Frontier";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Ostatnia aktualizacja %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Fighter";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Gunner";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Helm";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "Oczekiwanie {SS} sek.";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "OK";
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1489; */
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1677; */
"Shutting down..." = "Wyłączanie...";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Co najmniej jeden z uruchomionych pluginów nie wspiera Python 3.x. Sprawdź listę w '{FILE}' > '{SETTINGS}', sekcja '{PLUGINS}'. Upewnij się, że dostępna jest aktualna wersja pluginu, w przeciwnym razie poinformuj twórcę, że należy zaktualizować kod do wersji Python 3.x.\n\nMożesz wyłączyć plugin, dodając '{DISABLED}' na koniec nazwy jego folderu.";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Pluginy";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Pluginy Nie Wspierające Python 3.x";
/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:206; */
@@ -189,7 +199,7 @@
/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:232; */
"Ignore" = "Zignoruj";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Domyślne";
/* coriolis.py: 'Auto' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - auto; In files: coriolis.py:52; coriolis.py:55; coriolis.py:101; coriolis.py:117; coriolis.py:123; */
@@ -222,425 +232,437 @@
/* eddb.py: Journal Processing disabled due to an active killswitch; In files: eddb.py:100; */
"EDDB Journal processing disabled. See Log." = "Wyłączone przetwarzanie dziennika EDDB. Sprawdź logi.";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Wysłanie danych do EDDN...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Błąd: Brak połączenia z EDDN";
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:282; */
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:330; */
"EDDN Error: EDMC is too old for EDDN. Please update." = "Błąd EDDN: Zbyt stara wersja EDMC. Zaktualizuj do nowszej wersji.";
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:288; */
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:336; */
"EDDN Error: Validation Failed (EDMC Too Old?). See Log" = "Błąd EDDN: Nieudana weryfikacja (stara wersja EDDN?). Sprawdź logi.";
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:293; */
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:341; */
"EDDN Error: Returned {STATUS} status code" = "Błąd EDDN: Zwrócono kod {STATUS}";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Wyślij dane do Elite Dangerous Data Network";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Wyślij dane skanowań do EDDN";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Czekaj z wysłaniem na zadokowanie";
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:785; */
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:1222; */
"EDDN journal handler disabled. See Log." = "Wyłączona obsługa dziennika EDDB. Sprawdź logi.";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "Wyślij zapis lotu i status pilota do EDSM";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Dane uwierzytelniające Elite Dangerous Star Map";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Commander Name";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "Klucz API";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Brak";
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:358; */
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:401; */
"EDSM Handler disabled. See Log." = "Wyłączona obsługa EDDB. Sprawdź logi.";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Błąd: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Błąd: Brak połączenia z EDSM";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Wyślij zapis lotu i status pilota do Inary";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Inara - uprawnienia";
/* inara.py: INARA support disabled via killswitch; In files: inara.py:335; */
/* inara.py: INARA support disabled via killswitch; In files: inara.py:341; */
"Inara disabled. See Log." = "Inara jest wyłączona. Sprawdź logi.";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "Błąd w odpowiedzi serwera autoryzacyjnego.";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "Błąd: Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Preferencje";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Jakie dane zapisywać";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Dane rynkowe w formacie CSV";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Dane rynkowe w formacie Trade Dangerous";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Wyposażenie statku";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Aktualizuj automatycznie po zadokowaniu";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Położenie pliku";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Zmień...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Przeglądaj...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Wyjście";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "E:D Lokacja pliku dziennika";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Skrót klawiaturowy";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Skr. Klaw.";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Zrestartuj {APP} by użyć{CR}skrótu klawiszowego.";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} wymaga uprawnień by{CR}móc korzystać ze skrótów klawiszowych.";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Otwórz Preferencje systemowe";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Tylko gdy Elite: Dangerous jest aplikacją aktywną";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Odtwórz dźwięk";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "Wyłącz automatyczne wyszukiwanie aktualizacji, gdy jesteś w grze";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "Preferowane strony";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Stocznia";
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:592; */
"Use alternate URL method" = "Użyj alternatywnej metody URL";
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:644; */
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:645; */
"Log Level" = "Poziom logowania";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Konfiguracja";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: UI elements privacy section header in privacy tab of preferences; In files: prefs.py:682; */
"Main UI privacy options" = "Opcje prywatności UI";
/* prefs.py: Hide private group owner name from UI checkbox; In files: prefs.py:687; */
"Hide private group name in UI" = "Ukruj nazwę grupy prywatnej w UI";
/* prefs.py: Hide multicrew captain name from main UI checkbox; In files: prefs.py:691; */
"Hide multi-crew captain name" = "Ukryj nazwę kapitana w \"multi-crew\"";
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Prywatność";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Zwykły tekst";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Podświetlony tekst";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Język";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Schemat kolorystyczny";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Ciemny";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Przezroczyste";
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:770; */
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:793; */
"UI Scale Percentage" = "Skalowanie UI";
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:791; */
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:814; */
"100 means Default{CR}Restart Required for{CR}changes to take effect!" = "100 oznacza wartość domyślną{CR}Zmiany zostaną wprowadzone po{CR}ponownym uruchomieniu programu!";
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:801; */
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:824; */
"Main window transparency" = "Przeźroczystość okna głównego";
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:821:824; */
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:844:847; */
"100 means fully opaque.{CR}Window is updated in real time" = "100 oznacza nieprzeźroczyste.{CR}Okno aktualizowane w czasie rzeczywistym.";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Wygląd";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Folder pluginów";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Otwórz";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Wskazówka: Możesz wyłączyć pluginy{CR}dodając '{EXT}' do nazwy folderu";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Włączone pluginy";
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:921; */
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:944; */
"Plugins Without Python 3.x Support:" = "Pluginy nie obsługiwane przez Python 3.x:";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "Informacja o migracji pluginów";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Pluginy wyłączone";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Saldo";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Pożyczka";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Combat";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Trade";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Explorer";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Federacja";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Imperium";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Powerplay";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Harmless";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Mostly Harmless";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Competent";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Master";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Dangerous";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Deadly";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Penniless";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Mostly Penniless";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Peddler";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Dealer";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Merchant";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Broker";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Entrepreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Tycoon";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Aimless";
/* Appearance setting. [EDMarketConnector.py] */
"Minimize to system tray" = "Zminimalizuj do zasobnika systemowego";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Mostly Aimless";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Scout";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Surveyor";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Trailblazer";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Pathfinder";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Ranger";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pioneer";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Helpless";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amateur";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Hero";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiator";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recruit";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Midshipman";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Petty Officer";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Chief Petty Officer";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Warrant Officer";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Ensign";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Lieutenant";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Lieutenant Commander";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Post Commander";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Post Captain";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Rear Admiral";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Outsider";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Serf";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Squire";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Knight";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Count";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Duke";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "King";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Ocena 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Ocena 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Ocena 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Ocena 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Ocena 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Current commander unknown when trying to use 'File' > 'Status'; In files: stats.py:280; */
"Status: Don't yet know your Commander name" = "Status: Nieznana nazwa komandora";
/* stats.py: No Frontier CAPI data yet when trying to use 'File' > 'Status'; In files: stats.py:288; */
"Status: No CAPI data yet" = "Status: Brak danych CAPI";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Wartość";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Statki";
+233 -211
View File
@@ -1,180 +1,190 @@
/* Generic 'Check', as in 'Check E:D journal file location' [EDMarketConnector.py] */
"Check" = "Verificar";
/* Language name */
"!Language" = "Português (Brasil)";
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:171; */
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:220; */
"Error: Frontier CAPI didn't respond" = "Erro: o CAPI da Frontier não respondeu";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Erro: O servidor da Frontier está offline";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Erro: O servidor da Frontier está com lag";
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:205; */
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:255; */
"Docked but unknown station: EDO Settlement?" = "Docado, mas estação desconhecida: assentamento Odyssey?";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Erro: Credenciais Inválidas";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "Erro: Cmdt Errado";
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:341; companion.py:422; */
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:405; companion.py:490; */
"Error" = "Erro";
/* [inara.py] */
"Error: Can't connect to Inara" = "Erro: Não é possível conectar-se a Inara";
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:380; companion.py:385; */
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:448; companion.py:453; */
"Error: Couldn't check token customer_id" = "Erro: não foi possível verificar o token customer_id";
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:391; */
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:459; */
"Error: customer_id doesn't match!" = "Erro: customer_id diferente!";
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:413; */
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:481; */
"Error: unable to get token" = "Erro: não foi possível obter o token";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:575; */
/* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:781; */
"Frontier CAPI down for maintenance" = "CAPI da Frontier indisponível por manutenção";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:793; */
"Frontier CAPI query failure" = "Falha na requisição ao CAPI da Frontier";
/* companion.py: Frontier CAPI data retrieval failed with 5XX code; In files: companion.py:591; */
"Frontier CAPI server error" = "Erro de servidor do CAPI da Frontier";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Atualizar";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Sempre no topo";
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:636; */
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:730; */
"Unknown" = "Desconhecido";
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:705; */
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:799; */
"Error: Check E:D journal file location" = "Erro: Verifique a localicação dos arquivos de Jornais E:D";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Cmdt";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Função";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Nave";
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:809; */
"Suit" = "Traje";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "Sistema";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Estação";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Arquivo";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Editar";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Visualizar";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Janela";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Ajuda";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "Sobre {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Verificar por Atualizações...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Salvar dados brutos...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Status";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Política de Privacidade";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Notas de atualização";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Configurações";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Sair";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Documentação";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Copiar";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Efetuando login...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Autenticação bem-sucedida";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "Você não está docado na estação!";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "A estação não tem nada!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "A estação não tem um mercado!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: CAPI queries aborted because Cmdr name is unknown; In files: EDMarketConnector.py:945; */
"CAPI query aborted: Cmdr name unknown" = "Requisição CAPI cancelada: nome de CMDT desconhecido";
/* EDMarketConnector.py: CAPI queries aborted because game mode unknown; In files: EDMarketConnector.py:951; */
"CAPI query aborted: Game mode unknown" = "Requisição CAPI cancelada: modo de jogo desconhecido";
/* EDMarketConnector.py: CAPI queries aborted because current star system name unknown; In files: EDMarketConnector.py:957; */
"CAPI query aborted: Current system unknown" = "Requisição CAPI cancelada: sistema atual desconhecido";
/* EDMarketConnector.py: CAPI queries aborted because player is in multi-crew on other Cmdr's ship; In files: EDMarketConnector.py:963; */
"CAPI query aborted: In other-ship multi-crew" = "Requisição CAPI cancelada: em multi-crew em outra nave";
/* EDMarketConnector.py: CAPI queries aborted because player is in CQC (Arena); In files: EDMarketConnector.py:969; */
"CAPI query aborted: CQC (Arena) detected" = "Requisição CAPI cancelada: CQC (Arena) detectado";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Obtendo dados...";
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:880; */
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1031; */
"CAPI: No commander data returned" = "CAPI: Nenhum dado de comandante retornado";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Quem é você?!";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Onde está você?!";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "No que você está voando?!";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Frontier CAPI server error when fetching data; In files: EDMarketConnector.py:1171; */
"Frontier CAPI server error" = "Erro de servidor do CAPI da Frontier";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Última atualização %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Caça";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Artilheiro";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Comando";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "aguarde {SS}s";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "OK";
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1489; */
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1677; */
"Shutting down..." = "Encerrando...";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Um ou mais dos plugins habilitados não possuem suporte ao Python 3.x. Você pode ver a lista na guia '{PLUGINS}' em '{FILE}' > '{SETTINGS}'. Você deve verificar se existe versão atualizada ou então avisar o desenvolvedor de que ele precisa atualizar o código para o Python 3.x.\n\nVocê pode desabilitar um plugin renomeando sua pasta para que seu nome termine com '{DISABLED}'.";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Plugins";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Plugins sem Suporte ao Python 3.x";
/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:206; */
@@ -189,7 +199,7 @@
/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:232; */
"Ignore" = "Ignorar";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Padrão";
/* coriolis.py: 'Auto' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - auto; In files: coriolis.py:52; coriolis.py:55; coriolis.py:101; coriolis.py:117; coriolis.py:123; */
@@ -222,425 +232,437 @@
/* eddb.py: Journal Processing disabled due to an active killswitch; In files: eddb.py:100; */
"EDDB Journal processing disabled. See Log." = "Processamento de Jornais no EDDB desativado. Verifique o Log.";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Enviando log para o EDDN...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Erro: Não é possível conectar-se ao EDDN";
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:282; */
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:330; */
"EDDN Error: EDMC is too old for EDDN. Please update." = "Erro EDDN: o EDMC é muito antigo para o EDDN. Por favor, atualize.";
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:288; */
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:336; */
"EDDN Error: Validation Failed (EDMC Too Old?). See Log" = "Erro EDDN: Validação falhou (EDMC antigo?). Verifique o log.";
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:293; */
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:341; */
"EDDN Error: Returned {STATUS} status code" = "Erro EDDN: retornou o código {STATUS}.";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Enviar log da estação para o EDDN";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Enviar sistemas e dados escaneados para o EDDN";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Atrasar o envio até estar docado";
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:785; */
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:1222; */
"EDDN journal handler disabled. See Log." = "Manipulador de Jornais do EDDN desativado. Verique o Log.";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "Enviar dados de voo e status do cmdt para o EDSM";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Credenciais do Elite Dangerous Star Map (EDSM)";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Nome do Comandante";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "Chave da API";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Nenhum";
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:358; */
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:401; */
"EDSM Handler disabled. See Log." = "Manipulador do EDSM desativado. Verifique o Log.";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Erro: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Erro: Não é possível conectar-se ao EDSM";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Enviar dados de voo e status do cmdt para o Inara";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Credenciais do Inara";
/* inara.py: INARA support disabled via killswitch; In files: inara.py:335; */
/* inara.py: INARA support disabled via killswitch; In files: inara.py:341; */
"Inara disabled. See Log." = "Inara desativado. Verifique o Log.";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "Erro: Problema de SKU no servidor da Frontier";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "Erro: Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Preferências";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Por favor, escolha quais dados para salvar";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Dados de mercado no arquivo de formato CSV";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Dados de mercado no arquivo de formato Trade Dangerous";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Modulação da nave";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Atualizar automaticamente na docagem";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Localização do Arquivo";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Alterar...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Procurar...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Saída";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "Localização dos arquivos de Jornais E:D";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Atalho de teclado";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Tecla de atalho";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Reinicie o {APP} para usar os atalhos";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} precisa de permissão para usar atalhos";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Abrir preferências do sistema";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Somente quando o Elite: Dangerous é o aplicativo ativo";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Tocar som";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "Desativar Verificação Automática de Atualizações do EDMC enquanto jogo";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "Website preferido";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Estaleiro";
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:592; */
"Use alternate URL method" = "Usar URL alternativa";
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:644; */
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:645; */
"Log Level" = "Nível de Log";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Configuração";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: UI elements privacy section header in privacy tab of preferences; In files: prefs.py:682; */
"Main UI privacy options" = "Opções de privacidade da IU";
/* prefs.py: Hide private group owner name from UI checkbox; In files: prefs.py:687; */
"Hide private group name in UI" = "Ocultar nome do grupo privado na IU";
/* prefs.py: Hide multicrew captain name from main UI checkbox; In files: prefs.py:691; */
"Hide multi-crew captain name" = "Ocultar nome do capitão em multi-crew.";
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Privacidade";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Texto normal";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Texto destacado";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Idioma";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Tema";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Escuro";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Transparente";
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:770; */
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:793; */
"UI Scale Percentage" = "Porcentagem de escala da IU";
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:791; */
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:814; */
"100 means Default{CR}Restart Required for{CR}changes to take effect!" = "100 significa Padrão{CR}Necessário Reiniciar para as{CR}alterações entrarem em vigor!";
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:801; */
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:824; */
"Main window transparency" = "Transparência da janela principal";
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:821:824; */
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:844:847; */
"100 means fully opaque.{CR}Window is updated in real time" = "100 significa totalmente opaco.{CR}A janela é atualizada em tempo real.";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Aparência";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Pasta dos plugins";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Abrir";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Dica: Você pode desativar um plugin{CR}adicionando '{EXT}' ao nome da pasta";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Plugins Habilitados";
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:921; */
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:944; */
"Plugins Without Python 3.x Support:" = "Plugins sem suporte a Python 3.x:";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "Informações de migração de plugins";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Plugins desabilitados";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Balanço";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Empréstimo";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Combate";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Comércio";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Exploração";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Federação";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Império";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Poderes da galáxia";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Inofensivo";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Quase Inofensivo";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novato";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Competente";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Experiente";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Mestre";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Perigoso";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Letal";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Pobre";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Quase pobre";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Camelô";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Negociante";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Mercador";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Corretor";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Empresário";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Magnata";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Perdido";
/* Appearance setting. [EDMarketConnector.py] */
"Minimize to system tray" = "Minimizar para a área de notificação";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Quase perdido";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Explorador";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Cartógrafo";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Desbravador";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Descobridor";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Patrulheiro";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pioneiro";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Indefeso";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Quase Indefeso";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amador";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semi-profissional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Profissional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Campeão";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Herói";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiador";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recruta";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Aspirante";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Cabo";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Terceiro-Sargento";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Segundo-Sargento";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Primeiro-Sargento";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Suboficial";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Tenente";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Tenente Comandante";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Capitão de Corveta";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Capitão de Fragata";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Contra-Almirante";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vice-Almirante";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Almirante";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Forasteiro";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Servo";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Escudeiro";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Cavaleiro";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Lorde";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Barão";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Visconde";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Conde";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Marquês";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Duque";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Arqui-Duque";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Príncipe";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "Rei";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Nível 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Nível 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Nível 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Nível 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Nível 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Current commander unknown when trying to use 'File' > 'Status'; In files: stats.py:280; */
"Status: Don't yet know your Commander name" = "Status: Nome de CMDT ainda desconhecido";
/* stats.py: No Frontier CAPI data yet when trying to use 'File' > 'Status'; In files: stats.py:288; */
"Status: No CAPI data yet" = "Status: ainda sem dados CAPI";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Valor";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Naves";
+233 -211
View File
@@ -1,180 +1,190 @@
/* Generic 'Check', as in 'Check E:D journal file location' [EDMarketConnector.py] */
"Check" = "Verificar";
/* Language name */
"!Language" = "Português (Portugal)";
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:171; */
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:220; */
"Error: Frontier CAPI didn't respond" = "Erro: CAPI da Frontier não respondeu.";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Erro: O servidor da Frontier está offline";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Erro: O servidor da Frontier está atrasado";
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:205; */
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:255; */
"Docked but unknown station: EDO Settlement?" = "Atracado numa estação desconhecida. É uma colónia EDO?";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Erro: Credenciais Inválidas";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "Erro: Cmdt errado";
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:341; companion.py:422; */
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:405; companion.py:490; */
"Error" = "Erro";
/* [inara.py] */
"Error: Can't connect to Inara" = "Erro: Não é possível conectar ao Inara";
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:380; companion.py:385; */
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:448; companion.py:453; */
"Error: Couldn't check token customer_id" = "Erro: Impossível verificar o token de customer_id";
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:391; */
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:459; */
"Error: customer_id doesn't match!" = "Erro: customer_id não foi encontrado!";
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:413; */
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:481; */
"Error: unable to get token" = "Erro: Não é possível obter o token";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:575; */
/* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:781; */
"Frontier CAPI down for maintenance" = "CAPI da Frontier em manutenção.";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:793; */
"Frontier CAPI query failure" = "Falha ao consultar a CAPI da Frontier.";
/* companion.py: Frontier CAPI data retrieval failed with 5XX code; In files: companion.py:591; */
"Frontier CAPI server error" = "Erro do servidor CAPI da Frontier.";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Actualizar";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Sempre por cima";
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:636; */
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:730; */
"Unknown" = "Desconhecido";
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:705; */
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:799; */
"Error: Check E:D journal file location" = "Erro: Verifique a localização do ficheiro do diário E:D";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Cmdt";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Função";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Nave";
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:809; */
"Suit" = "Fato";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "Sistema";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Estação";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Ficheiro";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Editar";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Ver";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Janela";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Ajuda";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "Sobre {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Procurar por Actualizações...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Salvar dados em bruto...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Estado";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Política de Privacidade";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Notas da Versão";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Definições";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Sair";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Documentação";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Copiar";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Realizando login...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Autenticação bem-sucedida";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "Não está atracado numa Estação";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "A Estação não tem nada!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "A Estação não possui um mercado!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: CAPI queries aborted because Cmdr name is unknown; In files: EDMarketConnector.py:945; */
"CAPI query aborted: Cmdr name unknown" = "Consulta à CAPI abortada: Nome do Comandante desconhecido";
/* EDMarketConnector.py: CAPI queries aborted because game mode unknown; In files: EDMarketConnector.py:951; */
"CAPI query aborted: Game mode unknown" = "Consulta à CAPI abortada: Modo de Jogo desconhecido";
/* EDMarketConnector.py: CAPI queries aborted because current star system name unknown; In files: EDMarketConnector.py:957; */
"CAPI query aborted: Current system unknown" = "Consulta à CAPI abortada: Sistema actual desconhecido";
/* EDMarketConnector.py: CAPI queries aborted because player is in multi-crew on other Cmdr's ship; In files: EDMarketConnector.py:963; */
"CAPI query aborted: In other-ship multi-crew" = "Consulta à CAPI abortada: Jogador em multi-tripulação noutra nave.";
/* EDMarketConnector.py: CAPI queries aborted because player is in CQC (Arena); In files: EDMarketConnector.py:969; */
"CAPI query aborted: CQC (Arena) detected" = "Consulta à CAPI abortada: CQC (Arena) detectada.";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Obtendo dados...";
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:880; */
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1031; */
"CAPI: No commander data returned" = "CAPI: Dados do Comandante não recebidos";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Quem é você?";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Onde é que está?";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "No que é que está a voar?";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Frontier CAPI server error when fetching data; In files: EDMarketConnector.py:1171; */
"Frontier CAPI server error" = "Erro do servidor CAPI da Frontier.";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Última actualização: %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Caça";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Artilheiro";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Comando";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "aguarde {SS}s";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "OK";
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1489; */
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1677; */
"Shutting down..." = "A Desligar...";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Um ou mais dos plugins activados não possui ainda suporte para Python 3.x. Por favor verifique a lista na aba '{PLUGINS}' em '{FILE}' > '{SETTINGS}'. Deverá verificar se está disponível uma versão mais actualizada, caso contrário, informe o desenvolvedor de que necessita de actualizar o código para suportar Python 3.x.\n\nPode desactivar um plugin colocando '{DISABLED}' no fim do nome da pasta correspondente.";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Plugins";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Plugins sem suporte para Python 3.x";
/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:206; */
@@ -189,7 +199,7 @@
/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:232; */
"Ignore" = "Ignorar";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Predefinido";
/* coriolis.py: 'Auto' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - auto; In files: coriolis.py:52; coriolis.py:55; coriolis.py:101; coriolis.py:117; coriolis.py:123; */
@@ -222,425 +232,437 @@
/* eddb.py: Journal Processing disabled due to an active killswitch; In files: eddb.py:100; */
"EDDB Journal processing disabled. See Log." = "Processamento do diário do EDDB desactivado. Verifique o ficheiro de registos.";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "A enviar dados para o EDDN...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Erro: Não é possível conectar ao EDDN";
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:282; */
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:330; */
"EDDN Error: EDMC is too old for EDDN. Please update." = "Erro EDDN: Versão do EDMC é demasiado antiga para usar com a EDDN. Por favor actualize.";
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:288; */
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:336; */
"EDDN Error: Validation Failed (EDMC Too Old?). See Log" = "Erro EDDN: Validação falhou (Versão do EDMC demasiado antiga?). Verifique os ficheiros de registo.";
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:293; */
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:341; */
"EDDN Error: Returned {STATUS} status code" = "Erro EDDN: Recebido código de estado {STATUS}";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Enviar dados da estação para o Elite Dangerous Data Network";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Envia dados do Sistema e Scans efectuados para o Elite Dangerous Data Network";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Atrasar o envio até estar atracado";
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:785; */
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:1222; */
"EDDN journal handler disabled. See Log." = "Gestor do diário do EDDN desactivado. Verifique o ficheiro de registos.";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "Enviar dados de voo e o estado do CMDT para o EDSM";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Credenciais do Elite Dangerous Star Map (EDSM)";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Nome do Comandante";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "Chave API";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Nenhum";
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:358; */
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:401; */
"EDSM Handler disabled. See Log." = "Gestor do EDSM desactivado. Verifique o ficheiro de registos.";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Erro: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Erro: Não é possível conectar ao EDSM";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Enviar dados de voo e o estado do CMDT para o Inara";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Credenciais Inara";
/* inara.py: INARA support disabled via killswitch; In files: inara.py:335; */
/* inara.py: INARA support disabled via killswitch; In files: inara.py:341; */
"Inara disabled. See Log." = "Inara desactivado. Verifique o ficheiro de registos.";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "Erro: Problema de SKU no servidor da Frontier";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "Erro: Inara: {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Preferências";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Por favor escolher quais os dados a guardar";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Ficheiro dos dados de Mercado no formato CSV";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Ficheiro dos dados de Mercado no formato Trade Dangerous";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Módulos da nave";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Actualizar automaticamente ao atracar";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Localização do Ficheiro";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Alterar...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Procurar...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Saída";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "Localização do ficheiro do diário E:D";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Atalho de Teclado";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Tecla Rápida";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Reinicie o {APP} para usar os atalhos";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "A {APP} precisa de autorização para usar atalhos";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Abrir Preferências do Sistema";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Apenas quando o Elite:Dangerous é a aplicação activa";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Reproduzir som";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "Desactivar Verificação de Updates Automáticos da Aplicação enquanto joga";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "Websites preferidos";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Estaleiro";
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:592; */
"Use alternate URL method" = "Usar método URL alternativo.";
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:644; */
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:645; */
"Log Level" = "Nível de Log";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Configuração";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: UI elements privacy section header in privacy tab of preferences; In files: prefs.py:682; */
"Main UI privacy options" = "Opções Privacidade UI principal";
/* prefs.py: Hide private group owner name from UI checkbox; In files: prefs.py:687; */
"Hide private group name in UI" = "Esconder nome do grupo privado na UI";
/* prefs.py: Hide multicrew captain name from main UI checkbox; In files: prefs.py:691; */
"Hide multi-crew captain name" = "Esconder nome de capitão em multi-tripulação.";
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Privacidade";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Texto normal";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Texto destacado";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Linguagem";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Tema";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Escuro";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Transparente";
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:770; */
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:793; */
"UI Scale Percentage" = "Percentagem da escala de UI";
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:791; */
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:814; */
"100 means Default{CR}Restart Required for{CR}changes to take effect!" = "100 significa Predefinido{CR}Requer reinício para{CR}que as mudanças façam efeito!";
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:801; */
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:824; */
"Main window transparency" = "Transparência da janela principal";
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:821:824; */
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:844:847; */
"100 means fully opaque.{CR}Window is updated in real time" = "100 é completamente opaco.{CR}A janela é actualizada em tempo real.";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Aparência";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Pasta dos Plugins";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Abrir";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Dica: Pode desactivar um plugin{CR}ao adicionar '{EXT}' ao nome da sua pasta";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Plugins Activados";
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:921; */
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:944; */
"Plugins Without Python 3.x Support:" = "Plugins sem suporte para Python 3.x";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "Informação para migração de plugins";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Plugins Desactivados";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Balanço";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Empréstimo";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Combate";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Comércio";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Exploração";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Federação";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Império";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Jogos de Poder";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Inofensivo";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Praticamente Inofensivo";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novato";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Competente";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Perito";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Mestre";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Perigoso";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Mortal";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Falido";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Praticamente Pobre";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Vendedor";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Negociante";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Mercador";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Corretor";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Empreendedor";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Magnata";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Sem Destino";
/* Appearance setting. [EDMarketConnector.py] */
"Minimize to system tray" = "Minimizar para a barra de tarefas";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Quase sem destino";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Batedor";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Cartógrafo";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Guia";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Descobridor";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Patrulheiro";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pioneiro";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Indefeso";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Praticamente Indefeso";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amador";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semi Profissional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Profissional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Campeão";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Herói";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiador";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recruta";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Cadete";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Aspirante";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Subsargento";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Segundo-Sargento";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Sargento-mor";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Subtenente";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Tenente";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Capitão-tenente";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Tenente de Fragata";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Capitão de Fragata";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Contra-Almirante";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vice-Almirante";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Almirante";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Forasteiro";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Servo";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Escudeiro";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Cavaleiro";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Lorde";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Barão";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Visconde";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Conde";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Marquês";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Duque";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Príncipe";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "Rei";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Nível 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Nível 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Nível 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Nível 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Nível 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Current commander unknown when trying to use 'File' > 'Status'; In files: stats.py:280; */
"Status: Don't yet know your Commander name" = "Estado: Nome de Comandante ainda desconhecido.";
/* stats.py: No Frontier CAPI data yet when trying to use 'File' > 'Status'; In files: stats.py:288; */
"Status: No CAPI data yet" = "Estado: Ainda sem dados CAPI";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Valor";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Naves";
+233 -211
View File
@@ -1,180 +1,190 @@
/* Generic 'Check', as in 'Check E:D journal file location' [EDMarketConnector.py] */
"Check" = "Проверка";
/* Language name */
"!Language" = "Русский";
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:171; */
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:220; */
"Error: Frontier CAPI didn't respond" = "Ошибка: CAPI Frontier не отвечает";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Ошибка: сервера Frontier недоступны";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Ошибка: сервера Frontier нестабильны";
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:205; */
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:255; */
"Docked but unknown station: EDO Settlement?" = "Неизвестный тип станции: поселение EDO?";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Ошибка: неизвестное имя пользователя или неверный пароль";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "Ошибка: неверное имя командира";
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:341; companion.py:422; */
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:405; companion.py:490; */
"Error" = "Ошибка";
/* [inara.py] */
"Error: Can't connect to Inara" = "Ошибка: не удается подключиться к Inara";
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:380; companion.py:385; */
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:448; companion.py:453; */
"Error: Couldn't check token customer_id" = "Ошибка: невозможно проверить токен customer_id";
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:391; */
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:459; */
"Error: customer_id doesn't match!" = "Ошибка: customer_id не совпадает!";
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:413; */
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:481; */
"Error: unable to get token" = "Ошибка: не удается получить токен";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:575; */
/* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:781; */
"Frontier CAPI down for maintenance" = "Frontier CAPI остановлен для технического обслуживания";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:793; */
"Frontier CAPI query failure" = "Неудача при запросе к Frontier CAPI";
/* companion.py: Frontier CAPI data retrieval failed with 5XX code; In files: companion.py:591; */
"Frontier CAPI server error" = "Серверная ошибка Frontier CAPI";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Обновить данные";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Поверх остальных окон";
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:636; */
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:730; */
"Unknown" = "Неизвестно";
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:705; */
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:799; */
"Error: Check E:D journal file location" = "Ошибка: проверьте расположение журналов E:D";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "КМДР";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Роль";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Корабль";
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:809; */
"Suit" = "Костюм";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "Система";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Станция";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Файл";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Правка";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Вид";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Окно";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Дополнительно";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "О программе {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Проверить наличие обновлений...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Сохранить \"сырые\" данные..";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Статус";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Политика конфиденциальности";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Заметки о текущем релизе";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Настройки";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Выход";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Информация о плагине";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Копировать";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Идет подключение...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Аутентификация успешно завершена";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "Ваш корабль не пристыкован к станции!";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "На текущей станции никакие услуги не предоставляются!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "На текущей станции рынок недоступен!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: CAPI queries aborted because Cmdr name is unknown; In files: EDMarketConnector.py:945; */
"CAPI query aborted: Cmdr name unknown" = "Запрос CAPI прерван: Имя командира неизвестно";
/* EDMarketConnector.py: CAPI queries aborted because game mode unknown; In files: EDMarketConnector.py:951; */
"CAPI query aborted: Game mode unknown" = "Запрос CAPI прерван: Игровой режим неизвестен";
/* EDMarketConnector.py: CAPI queries aborted because current star system name unknown; In files: EDMarketConnector.py:957; */
"CAPI query aborted: Current system unknown" = "Запрос CAPI прерван: Текущая система неизвестна";
/* EDMarketConnector.py: CAPI queries aborted because player is in multi-crew on other Cmdr's ship; In files: EDMarketConnector.py:963; */
"CAPI query aborted: In other-ship multi-crew" = "Запрос CAPI прерван: В мультиэкипаже другого корабля";
/* EDMarketConnector.py: CAPI queries aborted because player is in CQC (Arena); In files: EDMarketConnector.py:969; */
"CAPI query aborted: CQC (Arena) detected" = "Запрос CAPI прерван: Обнаружен CQC (Арена)";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Получение данных...";
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:880; */
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1031; */
"CAPI: No commander data returned" = "CAPI: Нет данных пилота";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Невозможно определить личность командира!";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Невозможно определить местоположение!";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "Невозможно определить тип корабля!";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Frontier CAPI server error when fetching data; In files: EDMarketConnector.py:1171; */
"Frontier CAPI server error" = "Серверная ошибка Frontier CAPI";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Последнее обновление в %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Истребитель";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Стрелок";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Командир корабля";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "пауза {SS} сек";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "OK";
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1489; */
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1677; */
"Shutting down..." = "Выключение...";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Один или несколько ваших подключённых плагинов ещё не имеют поддержки Python 3.x. Пожалуйста, ознакомьтесь со списком во вкладке '{PLUGINS}' '{FILE}' > '{SETTINGS}'. Вы должны проверить наличие обновлённой версии, в противном случае предупредите разработчика о необходимости обновления кода на Python 3.x.\n\nВы можете отключить плагин, переименовав его папку в '{DISABLED}'.";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Плагины";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Без поддержки Python 3.x";
/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:206; */
@@ -189,7 +199,7 @@
/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:232; */
"Ignore" = "Игнорировать";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "По умолчанию";
/* coriolis.py: 'Auto' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - auto; In files: coriolis.py:52; coriolis.py:55; coriolis.py:101; coriolis.py:117; coriolis.py:123; */
@@ -222,425 +232,437 @@
/* eddb.py: Journal Processing disabled due to an active killswitch; In files: eddb.py:100; */
"EDDB Journal processing disabled. See Log." = "Обработка журнала EDDB отключена. См. логи.";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Отправка данных на EDDN...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Ошибка: не удается подключиться к EDDN";
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:282; */
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:330; */
"EDDN Error: EDMC is too old for EDDN. Please update." = "Ошибка EDDN: старая версия EDMC, обновитесь до последней.";
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:288; */
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:336; */
"EDDN Error: Validation Failed (EDMC Too Old?). See Log" = "Ошибка EDDN: Неудачная валидация (старая версия EDMC?). См. логи.";
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:293; */
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:341; */
"EDDN Error: Returned {STATUS} status code" = "Ошибка EDDN: Возвращён статус код {STATUS}";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Отправлять информацию о станциях на Elite Dangerous Data Network";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Отправлять данные о системе и данные сканирования в Elite Dangerous Data Network";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Отложить отправку данных до завершения стыковки";
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:785; */
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:1222; */
"EDDN journal handler disabled. See Log." = "Обработчик журнала EDDN отключен. См. логи.";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "Отправлять данные журнала полёта и информацию статусе командира в EDSM";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Учётные данные Elite Dangerous Star Map";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Имя командира";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "Ключ API";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Не назначено";
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:358; */
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:401; */
"EDSM Handler disabled. See Log." = "Обработчик журнала EDSM отключен. См. логи.";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Ошибка: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Ошибка: не удается подключиться к EDSM";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Отправлять данные журнала полёта и информацию статусе командира в Inara";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Учётные данные Inara";
/* inara.py: INARA support disabled via killswitch; In files: inara.py:335; */
/* inara.py: INARA support disabled via killswitch; In files: inara.py:341; */
"Inara disabled. See Log." = "Inara отключена. См. логи.";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "Ошибка: проблема с сервером аутентификации Frontier";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "Ошибка: Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Настройки";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Выберите какие данные стоит сохранять";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Данные рынков в формате CSV";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Данные рынков в формате Trade Dangerous";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Оборудование корабля";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Автоматически обновлять данные при стыковке";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Путь хранения файлов";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Обзор...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Просмотреть...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Данные";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "Расположение файла журнала E:D";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Сочетание клавиш";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Горячая клавиша";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Перезапустите {APP}, чтобы использовать сочетание клавиш";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} требуется разрешение на использование глобальных сочетаний клавиш";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Открыты «Настройки системы»";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Только когда окно Elite: Dangerous активно";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Звуковое оповещение";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "Отключить автоматическое обновление приложения во время нахождения в игре";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "Предпочитаемые сайты";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Верфи";
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:592; */
"Use alternate URL method" = "Альтернативный URL (адрес)";
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:644; */
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:645; */
"Log Level" = "Уровень лога";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Конфигурация";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: UI elements privacy section header in privacy tab of preferences; In files: prefs.py:682; */
"Main UI privacy options" = "Настройки приватности главного окна";
/* prefs.py: Hide private group owner name from UI checkbox; In files: prefs.py:687; */
"Hide private group name in UI" = "Скрывать название приватной группы в главном окне";
/* prefs.py: Hide multicrew captain name from main UI checkbox; In files: prefs.py:691; */
"Hide multi-crew captain name" = "Скрывать ник капитана мультикрю сессии в главном окне";
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Конфиденциальность";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Обычный текст";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Выделенный текст";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Язык";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Тема оформления";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Тёмная";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Прозрачная";
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:770; */
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:793; */
"UI Scale Percentage" = "Процент масштабирования интерфейса";
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:791; */
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:814; */
"100 means Default{CR}Restart Required for{CR}changes to take effect!" = "100 - значение по умолчанию{CR}требуется перезапуск для вступления в силу изменений{CR}!";
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:801; */
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:824; */
"Main window transparency" = "Прозрачность главного окна";
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:821:824; */
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:844:847; */
"100 means fully opaque.{CR}Window is updated in real time" = "100 означает полностью непрозрачный.{CR}Окно обновляется в режиме реального времени.";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Внешний вид";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Папка плагинов";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Открыть";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Подсказка: Отключить конкретный плагин можно {CR} добавив '{EXT}' к названию папки";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Включённые плагины";
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:921; */
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:944; */
"Plugins Without Python 3.x Support:" = "Плагины без поддержки Python 3.x";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "Информация о мигрирующих плагинах";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Отключенные плагины";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Баланс";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Долг";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Боевой";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Торговый";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Исследовательский";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Федерация";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Империя";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Ранг у галактических держав";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Безвредный";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "В целом безвредный";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Новичок";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Специалист";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Эксперт";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Мастер";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Опасный";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Смертоносный";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Элита";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Нищий";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Полунищий";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Мелкий торговец";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Агент";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Коммерсант";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Брокер";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Предприниматель";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Магнат";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Бесцельный";
/* Appearance setting. [EDMarketConnector.py] */
"Minimize to system tray" = "Сворачивать в системный трей";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Почти бесцельный";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Разведчик";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Изыскатель";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Путешественник";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Следопыт";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Скиталец";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Первооткрыватель";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Беспомощный";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Почти беспомощный";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Любитель";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Полупрофессионал";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Профессионал";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Чемпион";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Герой";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Гладиатор";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Новобранец";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Кадет";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Гардемарин";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Старшина";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Главный старшина";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Уорент-офицер";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Энсин";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Лейтенант";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Капитан-лейтенант";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Начальник гарнизона";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Командир корабля";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Контр-адмирал";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Вице-адмирал";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Адмирал";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Чужак";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Крепостной";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Оруженосец";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Рыцарь";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Лорд";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Барон";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Виконт";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Граф";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Эрл";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Маркиз";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Герцог";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Принц";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "Король";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Ранг 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Ранг 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Ранг 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Ранг 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Ранг 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Current commander unknown when trying to use 'File' > 'Status'; In files: stats.py:280; */
"Status: Don't yet know your Commander name" = "Статус: На текущий момент имя командира неизвестно";
/* stats.py: No Frontier CAPI data yet when trying to use 'File' > 'Status'; In files: stats.py:288; */
"Status: No CAPI data yet" = "Статус: На текущий момент данные CAPI отсутствуют";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Стоимость";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Корабли";
+145 -142
View File
@@ -1,431 +1,434 @@
/* Language name */
"!Language" = "Slovenščina";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Napaka: napačno uporabniški ime ali geslo";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Osveži";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Vedno na vrhu";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Cmdr";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Vloga";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Ladja";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "Sistem";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Postaja";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Datoteka";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Uredi";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Pogled";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Okno";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Pomoč";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "O {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Preveri posodobitve...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Shrani Izvirne Podatke...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Status";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Pravilnik o zasebnosti";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Opombe ob izdaji";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Nastavitve";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Izhod";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Dokumentacija";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Kopiraj";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Prijava v teku... ";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Preverjanje pristnosti je bilo uspešno";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "Nahajš se v postaji!";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "Postaja nima ničesar";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "Postaja nima trga";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Nalagam podatke...";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Kdo si";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Kje se nahajaš";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "S čim letiš";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Zadnja osvežitev podatkov %H:%M:%S ";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "Posodobitev v {SS}s";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "Potrdi";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Privzeta";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Pošiljam podatke na EDDN";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Napaka: povezava z EDDN ni mogoča";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Pošlji podatke postaje na EDDN";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "EDStarMap uporabniški podatki";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Commander ime";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "API ključ";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Brez";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Napaka: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Napaka: Povezava z EDSM ni mogoča";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Nastavitve";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Izberite podatke, ki jih želite shraniti";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Podatki trga v CSV formatu";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Podatki trga v Trade Dangerous formatu";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Oprema ladje";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Lokacija datoteke";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Spremeni...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Prebrskaj...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Izpis";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Bližnjica";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Bližnjica";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Ponovno poženi {APP} za uporabo bližnjic";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} potrebuje dovoljenja za uporabo bližnjic";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Odpri sistemske nastavitve";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Samo ko je Elite:Dangerous aktivna aplikacija ";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Sproži zvok";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Konfiguracija";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Privatno";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Jezik";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Tema";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Temno";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Prosojno";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Videz";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Ravnotežje";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Posojilo";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Combat";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Trgovanje";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Explorer";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Federacija";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Cesarstvo";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Igra moči";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Harmless";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Mostly Harmless";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Competent";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Master";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Dangerous";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Deadly";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Peniless";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Mostly peniless";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Peddler";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Dealer";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Merchant";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Broker";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Enterpreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Tycoon";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Aimless";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Mostly Aimless";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Scout";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Surveyor";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Trailblazer";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Pathfinder";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Ranger";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pioneer";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Helpless";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amateur";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Hero";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiator";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recruit";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Midshipman";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Petty Officer";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Chief Petty Officer";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Warrant Officer";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Ensign";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "LIeutenant";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Lieutenant Commander";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Post Commander";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Post Captain";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Read Admiral";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Outsider";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Serif";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Squire";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Knight";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Count";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Duke";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "King";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Ocena 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Ocena 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Ocena 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Ocena 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Ocena 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Vrednost";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Ladje";
+209 -211
View File
@@ -1,180 +1,172 @@
/* Generic 'Check', as in 'Check E:D journal file location' [EDMarketConnector.py] */
"Check" = "Provjera";
/* Language name */
"!Language" = "Srpski (Latinica, Bosna i Hercegovina)";
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:171; */
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:220; */
"Error: Frontier CAPI didn't respond" = "Greška: Frontier CAPI nije odgovorio";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Greška: Frontier server je nedostupan";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Greška: Frontier server je usporen";
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:205; */
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:255; */
"Docked but unknown station: EDO Settlement?" = "Pristali ste, ali stanica je nepoznata: EDO naselje?";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Greška: Neispravni kredencijali";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "Greška: Pogrešan Cmdr";
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:341; companion.py:422; */
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:405; companion.py:490; */
"Error" = "Greška";
/* [inara.py] */
"Error: Can't connect to Inara" = "Greška: Nemoguće povezivanje sa Inara";
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:380; companion.py:385; */
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:448; companion.py:453; */
"Error: Couldn't check token customer_id" = "Greška: Nemoguća provjera tokena customer_id";
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:391; */
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:459; */
"Error: customer_id doesn't match!" = "Greška: customer_id se ne poklapa!";
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:413; */
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:481; */
"Error: unable to get token" = "Greška: Nemoguće dobaviti token";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:575; */
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:793; */
"Frontier CAPI query failure" = "Frontier CAPI neuspješan upit";
/* companion.py: Frontier CAPI data retrieval failed with 5XX code; In files: companion.py:591; */
"Frontier CAPI server error" = "Frontier CAPI serverska greška";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Osvježi";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Uvijek na vrhu";
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:636; */
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:730; */
"Unknown" = "Nepoznato";
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:705; */
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:799; */
"Error: Check E:D journal file location" = "Greška: Provjerite lokaciju E:D journal fajla";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Cmdr";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Uloga";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Brod";
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:809; */
"Suit" = "Odijelo";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "Sistem";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Stanica";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Fajl";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Uredi";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Pogled";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Prozor";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Pomoć";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "O {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Provjeri nadogradnje...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Snimi sirove podatke...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Status";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Politika privatnosti";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Informacije o verziji";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Podešavanja";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Izlaz";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Dokumentacija";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Kopiraj";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Prijavljivanje...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Autentifikacija uspješna";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "Niste pristali na stanicu";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "Stanica nema ništa!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "Stanica nema market!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Preuzimanje podataka...";
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:880; */
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1031; */
"CAPI: No commander data returned" = "CAPI: Nema podataka o komandantu";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Ko ste vi?!";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Gdje se nalazite?!";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "U čemu letite?!";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Frontier CAPI server error when fetching data; In files: EDMarketConnector.py:1171; */
"Frontier CAPI server error" = "Frontier CAPI serverska greška";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Posljednji put osvježeno %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Fighter";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Gunner";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Helm";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "pauza {SS}s";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "OK";
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1489; */
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1677; */
"Shutting down..." = "Zatvaranje programa...";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Jedan ili više aktiviranih dodataka (plugins) nemaju podršku za Python 3.x. Pogledajte listu u '{PLUGINS}' tabu u '{FILE}' > '{SETTINGS}'. Provjerite da li postoji nadograđena verzija ili obavijesite autora da treba da promijeni kod za Python 3.x.\n\nMožete deaktivirati dodatak (plugin) dodavanjem '{DISABLED}' na kraju imena njegovog foldera.";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Dodaci (plugins)";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Dodaci (plugins) bez Python 3.x podrške";
/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:206; */
@@ -189,7 +181,7 @@
/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:232; */
"Ignore" = "Ignoriši";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Standardna";
/* coriolis.py: 'Auto' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - auto; In files: coriolis.py:52; coriolis.py:55; coriolis.py:101; coriolis.py:117; coriolis.py:123; */
@@ -222,425 +214,431 @@
/* eddb.py: Journal Processing disabled due to an active killswitch; In files: eddb.py:100; */
"EDDB Journal processing disabled. See Log." = "EDDB obrada journala je deaktivirana. Pogledajte Log.";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Slanje podataka na EDDN...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Greška: Nemoguće povezivanje sa EDDN";
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:282; */
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:330; */
"EDDN Error: EDMC is too old for EDDN. Please update." = "EDDN Greška: EDMC je prestar za EDDN. Molimo ažurirajte.";
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:288; */
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:336; */
"EDDN Error: Validation Failed (EDMC Too Old?). See Log" = "EDDN Greška: Validacija nije uspjela (EDMC prestar?). Pogledajte log.";
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:293; */
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:341; */
"EDDN Error: Returned {STATUS} status code" = "EDDN Greška: Statusni kod {STATUS}";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Slanje podataka o stanici na Elite Dangerous Data Network";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Slanje podataka o sistemu i skeniranju na Elite Dangerous Data Network";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Odgodi slanje do pristajanja";
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:785; */
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:1222; */
"EDDN journal handler disabled. See Log." = "EDDN obrada journala je deaktivirana. Pogledajte Log.";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "Pošalji log leta i Cmdr status na EDSM";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Kredencijali za Elite Dangerous Star Map";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Ime komandanta";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "API ključ";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Nije definisano";
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:358; */
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:401; */
"EDSM Handler disabled. See Log." = "EDSM obrada je deaktivirana. Pogledajte Log.";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Greška: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Greška: Nemoguće povezivanje sa EDSM";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Pošalji log leta i Cmdr status na Inara";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Kredencijali za Inara";
/* inara.py: INARA support disabled via killswitch; In files: inara.py:335; */
/* inara.py: INARA support disabled via killswitch; In files: inara.py:341; */
"Inara disabled. See Log." = "Inara je deaktivirana. Pogledajte Log.";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "Greška: SKU problem na Frontier serveru";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "Greška: Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Podešavanja";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Izaberite koji podaci se snimaju";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Fajl sa market podacima u CSV formatu";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Fajl sa market podacima u Trade Dangerous formatu";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Brodska oprema";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Automatsko slanje nakon pristajanja";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Lokacija fajlova";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Promijeni...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Potraži...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Izvoz";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "Lokacija E:D journal fajlova";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Prečica";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Prečica";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Restartujte {APP} da bi ste koristili prečice";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} traži dozvolu da koristi prečice";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Otvori sistemska podešavanja";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Samo kada je Elite: Dangerous aktivna aplikacija";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Zvučni efekat";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "Isključi automatsku provjeru nadogradnji za vrijeme igranja";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "Preferirani web sajtovi";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Brodogradilište";
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:592; */
"Use alternate URL method" = "Koristi alternativni URL metod";
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:644; */
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:645; */
"Log Level" = "Log nivo";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Konfiguracija";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: UI elements privacy section header in privacy tab of preferences; In files: prefs.py:682; */
"Main UI privacy options" = "Podešavanja privatnosti glavnog prozora";
/* prefs.py: Hide private group owner name from UI checkbox; In files: prefs.py:687; */
"Hide private group name in UI" = "Ne prikazuj naziv privatne grupe";
/* prefs.py: Hide multicrew captain name from main UI checkbox; In files: prefs.py:691; */
"Hide multi-crew captain name" = "Ne prikazuj ime kapetana u višečlanoj posadi";
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Privatnost";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Normalan tekst";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Označeni tekst";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Jezik";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Tema";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Tamna";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Prozirna";
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:770; */
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:793; */
"UI Scale Percentage" = "Procenat UI skaliranja";
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:791; */
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:814; */
"100 means Default{CR}Restart Required for{CR}changes to take effect!" = "100 je standardna vrijednost{CR}Potreban je restart{CR}za primjenu podešavanja!";
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:801; */
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:824; */
"Main window transparency" = "Prozirnost glavnog prozora";
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:821:824; */
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:844:847; */
"100 means fully opaque.{CR}Window is updated in real time" = "100 znači potpuno neprozirno.{CR}Prozor se osvježava u realnom vremenu";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Izgled";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Folder za dodatke (plugins)";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Otvori";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Savjet: Možete da deaktivirate dodatak (plugin){CR}dodavanjem '{EXT}' na ime njegovog foldera";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Aktivirani dodaci (plugins)";
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:921; */
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:944; */
"Plugins Without Python 3.x Support:" = "Dodaci (plugins) bez Python 3.x podrške:";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "Informacije o migraciji dodataka (plugins)";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Deaktivirani dodaci (plugins)";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Balans";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Zajam";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Borba (Combat)";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Trgovina (Trade)";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Explorer";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Federacija (Federation)";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Imperija (Empire)";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Powerplay";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Harmless";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Mostly Harmless";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Competent";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Master";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Dangerous";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Deadly";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Penniless";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Mostly Penniless";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Peddler";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Dealer";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Merchant";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Broker";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Entrepreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Tycoon";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Aimless";
/* Appearance setting. [EDMarketConnector.py] */
"Minimize to system tray" = "Minimiziranje u system tray";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Mostly Aimless";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Scout";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Surveyor";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Trailblazer";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Pathfinder";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Ranger";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pioneer";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Helpless";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amateur";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Hero";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiator";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recruit";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Midshipman";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Petty Officer";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Chief Petty Officer";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Warrant Officer";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Ensign";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Lieutenant";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Lieutenant Commander";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Post Commander";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Post Captain";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Rear Admiral";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Outsider";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Serf";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Squire";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Knight";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Count";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Duke";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "King";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Rating 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Rating 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Rating 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Rating 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Rating 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Vrijednost";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Brodovi";
+233 -211
View File
@@ -1,180 +1,190 @@
/* Generic 'Check', as in 'Check E:D journal file location' [EDMarketConnector.py] */
"Check" = "Provera";
/* Language name */
"!Language" = "Srpski (Latinica)";
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:171; */
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:220; */
"Error: Frontier CAPI didn't respond" = "Greška: Frontier CAPI nije odgovorio";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Greška: Frontier server je nedostupan";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Greška: Frontier server je usporen";
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:205; */
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:255; */
"Docked but unknown station: EDO Settlement?" = "Dokovan ali stanica nepoznata: EDO Naselje?";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Greška: Pogrešni kredencijali";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "Greška: Pogrešan Cmdr";
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:341; companion.py:422; */
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:405; companion.py:490; */
"Error" = "Greška";
/* [inara.py] */
"Error: Can't connect to Inara" = "Greška: Nemoguće povezivanje na Inara";
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:380; companion.py:385; */
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:448; companion.py:453; */
"Error: Couldn't check token customer_id" = "Greška: Nemoguća provera tokena customer_id";
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:391; */
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:459; */
"Error: customer_id doesn't match!" = "Greška: customer_id se ne poklapa!";
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:413; */
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:481; */
"Error: unable to get token" = "Greška: nemoguće dobaviti token";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:575; */
/* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:781; */
"Frontier CAPI down for maintenance" = "Frontier CAPI isključen radi održavanja";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:793; */
"Frontier CAPI query failure" = "Greška pri Frontier CAPI upitu";
/* companion.py: Frontier CAPI data retrieval failed with 5XX code; In files: companion.py:591; */
"Frontier CAPI server error" = "Greška na Frontier CAPI serveru";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Osveži";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Uvek na vrhu";
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:636; */
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:730; */
"Unknown" = "Nepoznato";
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:705; */
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:799; */
"Error: Check E:D journal file location" = "Greška: Proverite lokaciju E:D žurnal fajla";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Cmdr";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Uloga";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Brod";
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:809; */
"Suit" = "Odelo";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "Sistem";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Stanica";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Fajl";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Izmeni";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Pogled";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Prozor";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Pomoć";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "O {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Proveri da li postoje izmene...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Snimi sirove podatke...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Status";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Polisa o privatnosti";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Informacije o ovoj verziji";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Podešavanja";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Izlaz";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Dokumentacija";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Kopiraj";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Prijavljivanje...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Autentifikacija uspešna";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "Niste pristali na stanicu!";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "Stanica nema ništa!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "Stanica nema market!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: CAPI queries aborted because Cmdr name is unknown; In files: EDMarketConnector.py:945; */
"CAPI query aborted: Cmdr name unknown" = "CAPI upit prekinut: Ime komandira nepoznato";
/* EDMarketConnector.py: CAPI queries aborted because game mode unknown; In files: EDMarketConnector.py:951; */
"CAPI query aborted: Game mode unknown" = "CAPI upit prekinut: Režim igre nepoznat";
/* EDMarketConnector.py: CAPI queries aborted because current star system name unknown; In files: EDMarketConnector.py:957; */
"CAPI query aborted: Current system unknown" = "CAPI upit prekinut: Trenutni sistem nepoznat";
/* EDMarketConnector.py: CAPI queries aborted because player is in multi-crew on other Cmdr's ship; In files: EDMarketConnector.py:963; */
"CAPI query aborted: In other-ship multi-crew" = "CAPI upit prekinut: U multi-posadi drugog broda";
/* EDMarketConnector.py: CAPI queries aborted because player is in CQC (Arena); In files: EDMarketConnector.py:969; */
"CAPI query aborted: CQC (Arena) detected" = "CAPI upit prekinut: CQC (Arena) detektovana";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Preuzimanje podataka...";
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:880; */
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1031; */
"CAPI: No commander data returned" = "CAPI: Nema podataka o komandiru";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Ko ste vi?";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Gde se nalazite?";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "U čemu letite?";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Frontier CAPI server error when fetching data; In files: EDMarketConnector.py:1171; */
"Frontier CAPI server error" = "Greška na Frontier CAPI serveru";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Poslednji put osveženo %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Fighter";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Gunner";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Helm";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "cooldown {SS}s";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "OK";
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1489; */
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1677; */
"Shutting down..." = "Gasim...";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Jedan ili više aktiviranih dodataka (plugins) nemaju podršku za Python 3.x. Pogledajte listu u '{PLUGINS}' tabu u '{FILE}' > '{SETTINGS}'. Proverite da li postoji nadograđena verzija ili obavesite autora da treba da promeni kod za Python 3.x.\n\nMožete deaktivirati dodatak (plugin) dodavanjem '{DISABLED}' na kraju imena njegovog foldera.";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Dodaci (plugins)";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Dodaci (plugins) bez Python 3.x podrške";
/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:206; */
@@ -189,7 +199,7 @@
/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:232; */
"Ignore" = "Ignoriši";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Podrazumevano";
/* coriolis.py: 'Auto' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - auto; In files: coriolis.py:52; coriolis.py:55; coriolis.py:101; coriolis.py:117; coriolis.py:123; */
@@ -222,425 +232,437 @@
/* eddb.py: Journal Processing disabled due to an active killswitch; In files: eddb.py:100; */
"EDDB Journal processing disabled. See Log." = "Obrada žurnala za EDDB je deaktivirana. Pogledajte Log.";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Slanje podataka na EDDN...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Greška: Nemoguće povezivanje na EDDN";
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:282; */
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:330; */
"EDDN Error: EDMC is too old for EDDN. Please update." = "EDDN Greška: EDMC je prestar za EDDN. Molimo ažurirajte.";
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:288; */
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:336; */
"EDDN Error: Validation Failed (EDMC Too Old?). See Log" = "EDDN Greška: Validacija nije uspela (EDMC prestar?). Pogledajte log.";
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:293; */
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:341; */
"EDDN Error: Returned {STATUS} status code" = "EDDN Greška: Vraćen {STATUS} statusni kod.";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Slanje podataka o stanici na Elite Dangerous Data Network";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Slanje podataka o sistemu i skeniranju na Elite Dangerous Data Network";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Odloži slanje pre pristajanja";
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:785; */
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:1222; */
"EDDN journal handler disabled. See Log." = "Obrada žurnala za EDDN je deaktivirana. Pogledajte Log.";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "Pošalji log leta i Cmdr status na EDSM";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Kredencijali za Elite Dangerous Star Map";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Ime komandira";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "API Ključ";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Ništa";
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:358; */
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:401; */
"EDSM Handler disabled. See Log." = "EDSM obrada je deaktivirana. Pogledajte Log.";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Greška: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Greška: Nemoguće povezivanje na EDSM";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Pošalji log leta i Cmdr status na Inara";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Inara kredencijali";
/* inara.py: INARA support disabled via killswitch; In files: inara.py:335; */
/* inara.py: INARA support disabled via killswitch; In files: inara.py:341; */
"Inara disabled. See Log." = "Inara je deaktivirana. Pogledajte Log.";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "Greška: SKU problem na Frontier Serveru.";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "Greška: Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Podešavanja";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Izaberite koji se podaci snimaju";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Fajl sa market podacima u CSV formatu";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Fajl sa market podacima u Trade Dangerous formatu";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Oprema na brodu";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Automatsko slanje prilikom pristajanja";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Lokacija fajlova";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Izmeni...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Potraži...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Izlaz";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "Lokacija E:D Journal fajlova";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Skraćenica";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Skraćenica";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Restartujte {APP} da bi ste koristili skraćenice";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} traži dozvolu da koristi skraćenice";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Otvori sistemska podešavanja";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Samo kada je Elite: Dangerous aktivna aplikacija";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Zvučni efekat";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "Isključi automatsko proveravanje izmena aplikacije za vreme igranja";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "Željeni web sajtovi";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Shipyard";
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:592; */
"Use alternate URL method" = "Koristi alternativni URL metod";
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:644; */
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:645; */
"Log Level" = "Log Nivo";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Konfiguracija";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: UI elements privacy section header in privacy tab of preferences; In files: prefs.py:682; */
"Main UI privacy options" = "Podešavanja privatnosti za osnovni pogled";
/* prefs.py: Hide private group owner name from UI checkbox; In files: prefs.py:687; */
"Hide private group name in UI" = "Ukloni ime privatne grupe iz osnovnog pogleda";
/* prefs.py: Hide multicrew captain name from main UI checkbox; In files: prefs.py:691; */
"Hide multi-crew captain name" = "Ukloni ime kapetana iz višečlane posade";
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Privatnost";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Normalan tekst";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Označeni tekst";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Jezik";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Tema";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Tamno";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Transparentno";
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:770; */
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:793; */
"UI Scale Percentage" = "Procenat UI skaliranja";
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:791; */
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:814; */
"100 means Default{CR}Restart Required for{CR}changes to take effect!" = "100 znači podrazumevano{CR}Restart je potreban{CR}da bi se promene primenile!";
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:801; */
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:824; */
"Main window transparency" = "Prozirnost glavnog prozora";
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:821:824; */
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:844:847; */
"100 means fully opaque.{CR}Window is updated in real time" = "100 znači potpuno neprozirno.{CR}Prozor se osvežava u realnom vremenu.";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Izgled";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Folder za dodatke (plugins)";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Otvori";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Tip: Možete deaktivirati dodatak (plugin) dodavanjem{CR}'{EXT}' na ime njegovog foldera";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Aktivirani dodaci (plugins)";
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:921; */
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:944; */
"Plugins Without Python 3.x Support:" = "Pluginovi bez podrške za Python 3.x:";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "Informacije o migraciji dodataka (plugins)";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Deaktivirani dodaci (plugins)";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Balans";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Pozajmica";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Borba (Combat)";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Trgovina (Trade)";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Istraživanje (Explorer)";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Federacija";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Imperija";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Powerplay";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Harmless";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Mostly Harmless";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Competent";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Master";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Dangerous";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Deadly";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Penniless";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Mostly Penniless";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Peddler";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Dealer";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Merchant";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Broker";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Entrepreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Tycoon";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Aimless";
/* Appearance setting. [EDMarketConnector.py] */
"Minimize to system tray" = "Minimizuj u sistemsku paletu (SysTray)";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Mostly Aimless";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Scout";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Surveyor";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Trailblazer";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Pathfinder";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Ranger";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pioneer";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Helpless";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amateur";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Hero";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiator";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recruit";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Midshipman";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Petty Officer";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Chief Petty Officer";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Warrant Officer";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Ensign";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Lieutenant";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Lieutenant Commander";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Post Commander";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Post Captain";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Rear Admiral";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Outsider";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Serf";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Squire";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Knight";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Count";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Duke";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "King";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Rejting 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Rejting 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Rejting 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Rejting 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Rejting 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Current commander unknown when trying to use 'File' > 'Status'; In files: stats.py:280; */
"Status: Don't yet know your Commander name" = "Status: Još uvek nije poznato ime vašeg komandira";
/* stats.py: No Frontier CAPI data yet when trying to use 'File' > 'Status'; In files: stats.py:288; */
"Status: No CAPI data yet" = "Status: Još uvek nema CAPI podataka";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Vrednost";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Brodovi";
+169 -178
View File
@@ -1,521 +1,512 @@
/* Language name */
"!Language" = "Svenska";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Fel: Frontier server okontaktbar";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Fel: Frontier lag på server";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Fel: ogiltligt användarnamn eller lösenord";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "Fel: Fel användare. Har du flera konton eller en gammal API-nyckel från ett nollställt konto?";
/* [inara.py] */
"Error: Can't connect to Inara" = "Fel: Kan inte ansluta till Inara";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Uppdatera";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Alltid överst";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Cmdr";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Roll";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Skepp";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "System";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Station";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Fil";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Ändra";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "View";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Fönster";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Hjälp";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "Om {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Sök efter uppdateringar...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Lagra rådata...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Status";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Integritetspolicy";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Versionsinformation";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Inställningar";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Avsluta";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Dokumentation";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Kopiera";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Loggar in...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Autentisering lyckad";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "Du är inte dockad vid en station!";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "Stationen är tom!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "Stationen har ingen marknad!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Hämtar data...";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Vem är du? (felmeddelande)";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Vart är du? (felmeddelande)";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "Okänt skepp? (felmeddelande)";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Senaste uppdatering: %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Fighter";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Gunner";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Helm";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "Vänta {SS}s";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "OK";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "En eller flera aktiverade plugins har inte stöd för Python 3.x. Var vänlig kontrollera listan med plugins under fliken '{PLUGINS}' under '{FILE}' > '{SETTINGS}'. Kontrollera om det finns en nyare version tillgänglig eller informera utvecklaren.\n\nDu kan också avaktivera din plugin genom att ändra slutet av namnet på mappen till '{DISABLED}'";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Plugins";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Plugins utan stöd för Python 3.x";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Standard";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Skickar data till EDDN...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Fel: Kan inte ansluta till EDDN";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Skicka stationsdata till Elite Dangerous Data Network";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Skicka system och scan-data till Elite Dangerous Data Network";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Skicka bara uppdateringar till EDDN när du är dockad";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "Skicka flight log-data och Cmdr-status till EDSM";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Elite Dangerous Star Map användaruppgifter";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "CMDR namn";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "API Nyckel";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Ingen";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Fel: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Fel: Kan inte ansluta till EDSM";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Skicka flight log-data och Cmdr-status till Inara";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Inara autentiseringsuppgifter";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "Fel: Frontier server SKU problem (licensnyckel)";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "Fel: Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Inställningar";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Välj vilket data som skall lagras";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Marknadsdata i CSV-formaterad fil";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Marknadsdata i Trade Dangerous-formaterad fil";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Översikt av skepp";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Automatisk uppdatering vid dockning";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Filsökväg";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Ändra...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Bläddra...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Exportdata";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "E:D journal-fil sökväg";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Genväg, tangentbord";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Snabbkommando";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Starta om {APP} för att använda genvägar";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} behöver rättigheter för att använda genvägar";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Öppna systeminställningar";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Bara när: Elite Dangerous är det aktiva programmet";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Spela ljud";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "Leta inte efter programuppdateringar när spelet körs";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "Föredragna webbsidor";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Översikt av skepp";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Konfiguration";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Normal text";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Markerad text";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Språk";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Tema";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Mörk";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Transparent";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Utseende";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Mapp för plugins";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Öppna";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Tips: du kan avaktivera en plugin genom{CR}att lägga till '{EXT}' på slutet av mappens namn";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Aktiverade plugins";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "Information om migrering av plugins";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Avaktiverade plugins";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Balance";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Lån";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Combat";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Trade";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Explorer";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Federation";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Empire";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Powerplay";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Harmless";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Mostly Harmless";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Competent";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Master";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Dangerous";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Deadly";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Penniless";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Mostly Penniless";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Peddler";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Dealer";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Merchant";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Broker";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Entrepreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Tycoon";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Aimless";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Mostly Aimless";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Scout";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Surveyor";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Trailblazer";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Pathfinder";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Ranger";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pioneer";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Helpless";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amatör";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Hero";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiator";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recruit";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Midshipman";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Petty Officer";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Chief Petty Officer";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Warrant Officer";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Ensign";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Lieutenant";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Lieutenant Commander";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Post Commander";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Post Captain";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Rear Admiral";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Outsider";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Serf";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Squire";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Knight";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Count";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Duke";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "King";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Rating 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Rating 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Rating 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Rating 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Rating 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Värde";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Skepp";
+187 -196
View File
@@ -1,163 +1,157 @@
/* Language name */
"!Language" = "Українська";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Помилка, Сервер гри не доступний!";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "Помилка: З`єднання з сервером гри з затримками!";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "Помилка: Невірні облікові дані!";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "Помилка! Не той обліковий запис!";
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:341; companion.py:422; */
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:405; companion.py:490; */
"Error" = "Помилка";
/* [inara.py] */
"Error: Can't connect to Inara" = "Помилка: Немає з'єднання з Inara";
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:380; companion.py:385; */
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:448; companion.py:453; */
"Error: Couldn't check token customer_id" = "Помилка: Не вдалося перевірити токен customer_id";
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:391; */
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:459; */
"Error: customer_id doesn't match!" = "Error: customer_id не співпадає!";
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:413; */
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:481; */
"Error: unable to get token" = "Помилка: не вдалося отримати токен";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "Оновлення";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "Поверх інших вікон";
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:636; */
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:730; */
"Unknown" = "Невідомо";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "Км-др";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "Посада";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "Корабель";
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:809; */
"Suit" = "Костюм";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "Система";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "Станція";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "Файл";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "Редагувати";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "Вид";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "Вікно";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "Довідка";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "Про {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "Перевірка оновлень...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "Зберегти необроблені дані...";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "Статус";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "Політика конфіденційності";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "Інформація про реліз";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "Налаштування";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "Вихід";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "Документація";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "Копіювати";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "Вхід в...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "Автентифікацію пройдено успішно";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "Ви не стиковані з станцією!";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "На станції немає нічого!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "На станції немає ринку!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "Отримання даних...";
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:880; */
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1031; */
"CAPI: No commander data returned" = "CAPI: Не отримано данних пілота";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "Хто ти?!";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "Де ми?!";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "На чому летимо?!";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "Останнє оновлення було %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "Винищувач";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "Стрілець";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "Керівник";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "очікування {SS} сек";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "Згода";
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1489; */
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1677; */
"Shutting down..." = "Закриття...";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Один або кілька увімкнених плагінів ще не підтримують Python 3.x. Перегляньте список на вкладці '{PLUGINS}' в '{FILE}' > '{SETTINGS}'. Ви повинні перевірити, чи є в наявності оновлена ​​версія, інакше повідомити розробника плагіну про те, що їм потрібно оновити код для Python 3.x.\n\nВи можете відключити плагін, перейменувавши його папку додавши '{DISABLED}' в кінці назви.";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "Плагіни";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Плагіни без підтримки Python 3.x!";
/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:206; */
@@ -172,410 +166,407 @@
/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:232; */
"Ignore" = "Ігнорувати";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "Стандартне налаштування";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "Відправка даних до EDDN...";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "Помилка: Немає зв'язку з EDDN!";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "Надсилати дані станцій до Elite Dangerous Data Network";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "Відправляти систему і результати сканування в Elite Dangerous Data Network";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "Відкласти відправку даних до стикування";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "Відправляти дані бортового журналу до EDSM";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Дані Elite Dangerous Star Map";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "Ім`я пілота";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "API Ключ";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "Нічого";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "Помилка: EDSM {MSG}!";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "Помилка: Немає з`єднання з EDSM!";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "Відправляти дані бортового журналу до Inara";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Обліковий запис Inara";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "Помилка! Проблема SKU сервера Frontier";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "Помилка: Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Уподобання";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "Оберіть дані які буде збережено";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "Ринкові дані у форматі CSV файлу";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "Ринкові дані у форматі Trade Dangerous файлу";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "Технічні дані корабля";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "Автоматичне оновлювання при стикуванні зі станцією";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "Розташування файлу";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "Внесення змін...";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "Перегляд...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "Вивід";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "Розташування файлу-журналу E:D";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "Сполучення клавіш";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "Гаряча клавіша";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "Перезавантажте {APP} для використання ярликів";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} необхідні дозволи для використання ярликів";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "Відкрити налаштування системи";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "Тільки тоді, коли Elite: Dangerous є активним додатком";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "Грати звук";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "Вимкнути автоматичні перевірки оновлення додатку, коли в грі";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "Обрані веб-сайти";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "Корабельна верф";
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:592; */
"Use alternate URL method" = "Використовувати альтернативний URL-метод";
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:644; */
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:645; */
"Log Level" = "Рівень подробиць журналу";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "Конфігурація";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "Конфіденційність";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "Нормальний текст";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "Виділений текст";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "Мова";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "Тема";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "Темний";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "Прозора";
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:770; */
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:793; */
"UI Scale Percentage" = "Відсоток шкали інтерфейсу користувача";
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:791; */
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:814; */
"100 means Default{CR}Restart Required for{CR}changes to take effect!" = "100 означає, що {CR} потрібно перезапустити за замовчуванням, щоб зміни вступили в силу {CR}!";
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:801; */
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:824; */
"Main window transparency" = "Прозорість головного вікна";
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:821:824; */
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:844:847; */
"100 means fully opaque.{CR}Window is updated in real time" = "100 означає повністю непрозоре. {CR} Вікно буде оновлюватись в режимі реального часу";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "Зовнішній вигляд";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "Сховище плагінів";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "Відкрити";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Підказка: Ви можете відключити плагін через {CR} додання '{EXT}' до назви папки";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "Увімкнені плагіни";
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:921; */
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:944; */
"Plugins Without Python 3.x Support:" = "Плагіни без підтримки Python 3.x:";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "Інформація про міграцію плагінів";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "Вимкнені плагіни";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "Баланс";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "Борг";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "Бойовий";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "Торговий";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "Дослідницький";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "Близький бій (CQC)";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "Федерація";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "Імперія";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "Змагання";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Безпечний";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Здебільшого Безпечний";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Новачок";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Компетентний";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Експерт";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Майстер";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Небезпечний";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Убивчий";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Еліта";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Злидень";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Здебільшого Нужденний";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Штовхач";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Дилер";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Торговець";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Брокер";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Підприємець";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Магнат";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Безцільний";
/* Appearance setting. [EDMarketConnector.py] */
"Minimize to system tray" = "Згорнути програму";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Здебільшого Безцільний";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Розвідник";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Геодезист";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Новатор";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Слідопит";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Рейнджер";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Піонер";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Безпорадний";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Здебільшого Безпомічний";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Аматор";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Напів-професійний";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Професійний";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Чемпіон";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Герой";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Гладіатор";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Рекрут";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Кадет";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Гардемарин";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Унтер Офіцер";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Старший Унтер Офіцер";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Старший сержант";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Прапорщик";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Лейтенант";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Капітан III рангу";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Капітан II рангу";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Капітан I рангу";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Контр-адмірал";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Віце-адмірал";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Адмірал";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Чужинець";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Кріпак";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Зброєносець";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Лицар";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Пан";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Барон";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Віконт";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Граф";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Дворянин";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Маркіз";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Герцог";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Принц";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "Цар";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Рейтинг 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Рейтинг 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Рейтинг 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Рейтинг 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Рейтинг 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "Вартість";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "Кораблі";
+210 -212
View File
@@ -1,180 +1,172 @@
/* Generic 'Check', as in 'Check E:D journal file location' [EDMarketConnector.py] */
"Check" = "检查";
/* Language name */
"!Language" = "简体中文";
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:171; */
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:220; */
"Error: Frontier CAPI didn't respond" = "错误:Frontier CAPI 无响应";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "错误:Frontier 服务器不可用";
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:239; */
"Error: Frontier server is lagging" = "错误:Frontier 服务器繁忙";
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:205; */
/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:255; */
"Docked but unknown station: EDO Settlement?" = "已靠站但站点未知:可能是 ED: Odyssey 的地面设施?";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:265; */
"Error: Invalid Credentials" = "错误:无效的登录凭证";
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:281; */
"Error: Wrong Cmdr" = "错误:指挥官不一致";
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:341; companion.py:422; */
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:405; companion.py:490; */
"Error" = "错误";
/* [inara.py] */
"Error: Can't connect to Inara" = "错误:无法连接到 Inara";
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:380; companion.py:385; */
/* companion.py: Frontier auth, no 'usr' section in returned data; companion.py: Frontier auth, no 'customer_id' in 'usr' section in returned data; In files: companion.py:448; companion.py:453; */
"Error: Couldn't check token customer_id" = "错误:无法检查 customer_id 令牌";
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:391; */
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:459; */
"Error: customer_id doesn't match!" = "错误:customer_id 不匹配!";
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:413; */
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:481; */
"Error: unable to get token" = "错误:无法获取令牌";
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:575; */
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:793; */
"Frontier CAPI query failure" = "无法访问 Frontier CAPI";
/* companion.py: Frontier CAPI data retrieval failed with 5XX code; In files: companion.py:591; */
"Frontier CAPI server error" = "Frontier CAPI 服务器错误";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:517; EDMarketConnector.py:812; EDMarketConnector.py:1504; */
"Update" = "更新";
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:507; prefs.py:843; */
/* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:600; prefs.py:866; */
"Always on top" = "永远在最前";
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:636; */
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:730; */
"Unknown" = "未知";
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:705; */
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:799; */
"Error: Check E:D journal file location" = "错误:请检查 E:D 日志文件位置";
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:712; edsm.py:219; stats.py:50; theme.py:227; */
/* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:806; edsm.py:257; stats.py:52; theme.py:227; */
"Cmdr" = "指挥官";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:714; EDMarketConnector.py:1072; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:808; EDMarketConnector.py:1263; */
"Role" = "角色";
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:714; EDMarketConnector.py:1082; EDMarketConnector.py:1105; stats.py:363; */
/* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: 'Ship' label in main UI; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:808; EDMarketConnector.py:1273; EDMarketConnector.py:1296; stats.py:367; */
"Ship" = "飞船";
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:809; */
"Suit" = "套装";
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:716; prefs.py:605; stats.py:365; */
/* EDMarketConnector.py: Label for 'System' line in main UI; prefs.py: Configuration - Label for selection of 'System' provider website; stats.py: Main window; In files: EDMarketConnector.py:810; prefs.py:606; stats.py:369; */
"System" = "星系";
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:717; prefs.py:623; prefs.py:738; stats.py:366; */
/* EDMarketConnector.py: Label for 'Station' line in main UI; prefs.py: Configuration - Label for selection of 'Station' provider website; prefs.py: Appearance - Example 'Normal' text; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:811; prefs.py:624; prefs.py:761; stats.py:370; */
"Station" = "站点";
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:720; EDMarketConnector.py:735; EDMarketConnector.py:738; EDMarketConnector.py:1791; */
/* EDMarketConnector.py: 'File' menu title on OSX; EDMarketConnector.py: 'File' menu title; EDMarketConnector.py: 'File' menu; In files: EDMarketConnector.py:814; EDMarketConnector.py:829; EDMarketConnector.py:832; EDMarketConnector.py:1991; */
"File" = "文件";
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:815; EDMarketConnector.py:830; EDMarketConnector.py:833; */
"Edit" = "编辑";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:816; */
"View" = "显示";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:817; */
"Window" = "窗口";
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:818; EDMarketConnector.py:831; EDMarketConnector.py:834; */
"Help" = "帮助";
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:821; EDMarketConnector.py:847; EDMarketConnector.py:1550; */
"About {APP}" = "关于 {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:823; EDMarketConnector.py:846; */
"Check for Updates..." = "检查版本更新…";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:824; EDMarketConnector.py:838; */
"Save Raw Data..." = "保存原始数据…";
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:825; EDMarketConnector.py:837; stats.py:364; */
"Status" = "状态";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:826; EDMarketConnector.py:844; */
"Privacy Policy" = "隐私政策";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:827; EDMarketConnector.py:845; EDMarketConnector.py:1584; */
"Release Notes" = "更新说明";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:839; EDMarketConnector.py:1992; prefs.py:254; */
"Settings" = "设置";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:840; */
"Exit" = "退出";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:843; */
"Documentation" = "帮助文档";
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:756; ttkHyperlinkLabel.py:42; */
/* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:850; ttkHyperlinkLabel.py:42; */
"Copy" = "复制";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:856; */
"Logging in..." = "登录中…";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:872; EDMarketConnector.py:1415; */
"Authentication successful" = "身份验证成功";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:903; */
"You're not docked at a station!" = "你尚未靠站!";
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:911; */
"Station doesn't have anything!" = "此站点没有任何货物!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:916; */
"Station doesn't have a market!" = "此站点没有货物市场!";
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI to save to file; stats.py: Fetching data from Frontier CAPI in order to display on File > Status; In files: EDMarketConnector.py:867; EDMarketConnector.py:1428; stats.py:279; */
/* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:990; */
"Fetching data..." = "取得数据…";
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:880; */
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1031; */
"CAPI: No commander data returned" = "CAPI:没有指挥官数据";
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:884; stats.py:297; */
/* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1035; stats.py:298; */
"Who are you?!" = "你是谁?!";
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:890; stats.py:307; */
/* EDMarketConnector.py: We don't know where the commander is, when we should; stats.py: Unknown location; In files: EDMarketConnector.py:1041; stats.py:308; */
"Where are you?!" = "你在哪里?!";
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:894; stats.py:312; */
/* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1048; stats.py:316; */
"What are you flying?!" = "你在飞什么?!";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
/* EDMarketConnector.py: Frontier CAPI server error when fetching data; In files: EDMarketConnector.py:1171; */
"Frontier CAPI server error" = "Frontier CAPI 服务器错误";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1210; */
"Last updated at %H:%M:%S" = "最后更新于 %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1238; */
"Fighter" = "舰载机驾驶员";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1239; */
"Gunner" = "炮手";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1240; */
"Helm" = "舵手";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1498; */
"cooldown {SS}s" = "距离下次更新还有 {SS} 秒";
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1610; prefs.py:305; */
"OK" = "确定";
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1489; */
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1677; */
"Shutting down..." = "应用关闭中…";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1980:1986; */
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "一项或多项你所启用的插件尚不支持 Python 3.x,详情请见 {FILE} > {SETTINGS} > {PLUGINS}。请检查上述插件是否有可用的更新,若没有,则应与插件的开发者就 Python 3.x 的支持问题取得联系。\n\n你也可以禁用某一项插件,只需在其文件夹名称的末尾添加 {DISABLED} 即可。";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1990; prefs.py:976; */
"Plugins" = "插件";
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2001; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC:不支持 Python 3.x 的插件";
/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:206; */
@@ -189,7 +181,7 @@
/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:232; */
"Ignore" = "忽略";
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:466; prefs.py:678; prefs.py:711; */
/* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:194; prefs.py:467; prefs.py:701; prefs.py:734; */
"Default" = "默认";
/* coriolis.py: 'Auto' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - auto; In files: coriolis.py:52; coriolis.py:55; coriolis.py:101; coriolis.py:117; coriolis.py:123; */
@@ -222,425 +214,431 @@
/* eddb.py: Journal Processing disabled due to an active killswitch; In files: eddb.py:100; */
"EDDB Journal processing disabled. See Log." = "EDDB Journal Processing 已禁用。请查看诊断日志。";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:251; eddn.py:695; eddn.py:1428; */
"Sending data to EDDN..." = "正在向 EDDN 发送数据…";
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:312; eddn.py:1364; eddn.py:1399; eddn.py:1440; */
"Error: Can't connect to EDDN" = "错误:无法连接到 EDDN";
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:282; */
/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:330; */
"EDDN Error: EDMC is too old for EDDN. Please update." = "EDDN 错误:EDDN 禁止了此旧版本的 EDMC 应用。请更新应用。";
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:288; */
/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:336; */
"EDDN Error: Validation Failed (EDMC Too Old?). See Log" = "EDDN 错误:数据有效性检查失败。可能是 EDMC 应用版本过旧,请查看诊断日志。";
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:293; */
/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:341; */
"EDDN Error: Returned {STATUS} status code" = "EDDN 错误:返回错误代码 {STATUS}";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:1111; */
"Send station data to the Elite Dangerous Data Network" = "发送站点数据到 Elite Dangerous Data Network";
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:1122; */
"Send system and scan data to the Elite Dangerous Data Network" = "发送星系和扫描数据到 Elite Dangerous Data Network";
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:721; */
/* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:1133; */
"Delay sending until docked" = "延时更新,靠站时再发送";
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:785; */
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:1222; */
"EDDN journal handler disabled. See Log." = "EDDN Journal Handler 已禁用。请查看诊断日志。";
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:236; */
"Send flight log and Cmdr status to EDSM" = "发送航行日志和指挥官状态到 EDSM";
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:246; */
"Elite Dangerous Star Map credentials" = "Elite Dangerous Star Map 授权凭证";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:265; */
"Commander Name" = "指挥官名称";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:273; inara.py:243; */
"API Key" = "API Key";
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
/* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:300; prefs.py:519; prefs.py:1173; prefs.py:1206; stats.py:119; stats.py:138; stats.py:157; stats.py:174; */
"None" = "无";
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:358; */
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:401; */
"EDSM Handler disabled. See Log." = "EDSM Handler 已禁用。请查看诊断日志。";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:746; edsm.py:874; */
"Error: EDSM {MSG}" = "错误:EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:783; edsm.py:869; */
"Error: Can't connect to EDSM" = "错误:无法连接到 EDSM";
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:222; */
"Send flight log and Cmdr status to Inara" = "发送航行日志和指挥官状态到 Inara";
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:234; */
"Inara credentials" = "Inara 授权凭证";
/* inara.py: INARA support disabled via killswitch; In files: inara.py:335; */
/* inara.py: INARA support disabled via killswitch; In files: inara.py:341; */
"Inara disabled. See Log." = "Inara 已禁用。请查看诊断日志。";
/* Raised when the Companion API server thinks that the user has not purchased E:D. i.e. doesn't have the correct 'SKU'. [companion.py] */
"Error: Frontier server SKU problem" = "错误:Frontier 服务器检测到 SKU 不匹配";
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1580; inara.py:1593; */
"Error: Inara {MSG}" = "错误:Inara {MSG}";
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "偏好";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:347; */
"Please choose what data to save" = "请选择想要保存的数据";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
/* prefs.py: Settings > Output option; In files: prefs.py:353; */
"Market data in CSV format file" = "货物市场数据,以 CSV 文件格式";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
/* prefs.py: Settings > Output option; In files: prefs.py:362; */
"Market data in Trade Dangerous format file" = "货物市场数据,以 Trade Dangerous 文件格式";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
/* prefs.py: Settings > Output option; In files: prefs.py:372; */
"Ship loadout" = "飞船配置";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
/* prefs.py: Settings > Output option; In files: prefs.py:382; */
"Automatically update on docking" = "靠站时自动更新";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:391; prefs.py:410; */
"File location" = "保存位置";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:399; prefs.py:449; */
"Change..." = "更改…";
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:401; prefs.py:451; */
/* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:402; prefs.py:452; */
"Browse..." = "浏览…";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:417; */
"Output" = "导出";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:443; prefs.py:458; */
"E:D journal file location" = "E:D 日志文件位置";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:483; */
"Keyboard shortcut" = "键盘快捷键";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:485; */
"Hotkey" = "快捷键";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:494; */
"Re-start {APP} to use shortcuts" = "重启 {APP} 以使用快捷键";
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:503; */
"{APP} needs permission to use shortcuts" = "{APP} 需要权限以使用快捷键";
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:508; */
"Open System Preferences" = "打开系统偏好设置";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:530; */
"Only when Elite: Dangerous is the active app" = "仅当 Elite: Dangerous 在前台运行时生效";
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:541; */
"Play sound" = "发出提示音";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:556; */
"Disable Automatic Application Updates Check when in-game" = "当我在玩游戏时,禁止此应用自动检查版本更新。";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:569; */
"Preferred websites" = "首选网站";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:580; */
"Shipyard" = "配船";
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:592; */
"Use alternate URL method" = "若链接过长无法打开,请勾选此项";
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:644; */
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:645; */
"Log Level" = "诊断模式";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:673; */
"Configuration" = "通用";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
/* prefs.py: UI elements privacy section header in privacy tab of preferences; In files: prefs.py:682; */
"Main UI privacy options" = "用户界面隐私选项";
/* prefs.py: Hide private group owner name from UI checkbox; In files: prefs.py:687; */
"Hide private group name in UI" = "在用户界面中隐藏私人组 (private group) 名称";
/* prefs.py: Hide multicrew captain name from main UI checkbox; In files: prefs.py:691; */
"Hide multi-crew captain name" = "在用户界面中隐藏多人共乘 (multi-crew) 时的舰长名称";
/* prefs.py: Preferences privacy tab title; In files: prefs.py:695; */
"Privacy" = "隐私";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:708; */
"Normal text" = "普通文本";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:710; */
"Highlighted text" = "重点文本";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:719; */
"Language" = "语言";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:729; */
"Theme" = "主题";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:740; */
"Dark" = "深色";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:747; */
"Transparent" = "透明";
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:770; */
"UI Scale Percentage" = "UI 缩放比例";
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:793; */
"UI Scale Percentage" = "用户界面缩放比例";
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:791; */
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:814; */
"100 means Default{CR}Restart Required for{CR}changes to take effect!" = "100 为默认设置{CR}需要重启应用{CR}以使修改生效";
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:801; */
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:824; */
"Main window transparency" = "主窗口透明度";
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:821:824; */
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:844:847; */
"100 means fully opaque.{CR}Window is updated in real time" = "100 为完全不透明{CR}效果实时更新";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:883; */
"Appearance" = "外观";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:898; */
"Plugins folder" = "插件文件夹";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:905; */
"Open" = "打开";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:913; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "提示:想要禁用某一项插件,{CR}你可以添加 {EXT} 到其文件夹名称中";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:924; */
"Enabled Plugins" = "已启用插件";
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:921; */
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:944; */
"Plugins Without Python 3.x Support:" = "不支持 Python 3.x 的插件:";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:952; */
"Information on migrating plugins" = "关于插件迁移";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:967; */
"Disabled Plugins" = "已禁用插件";
/* stats.py: Cmdr stats; In files: stats.py:51; */
/* stats.py: Cmdr stats; In files: stats.py:53; */
"Balance" = "资金结余";
/* stats.py: Cmdr stats; In files: stats.py:52; */
/* stats.py: Cmdr stats; In files: stats.py:54; */
"Loan" = "贷款";
/* stats.py: Ranking; In files: stats.py:57; */
/* stats.py: Ranking; In files: stats.py:59; */
"Combat" = "战斗等级";
/* stats.py: Ranking; In files: stats.py:58; */
/* stats.py: Ranking; In files: stats.py:60; */
"Trade" = "贸易等级";
/* stats.py: Ranking; In files: stats.py:59; */
/* stats.py: Ranking; In files: stats.py:61; */
"Explorer" = "探索等级";
/* stats.py: Ranking; In files: stats.py:60; */
/* stats.py: Ranking; In files: stats.py:62; */
"CQC" = "竞技场等级";
/* stats.py: Ranking; In files: stats.py:61; */
/* stats.py: Ranking; In files: stats.py:63; */
"Federation" = "联邦军衔";
/* stats.py: Ranking; In files: stats.py:62; */
/* stats.py: Ranking; In files: stats.py:64; */
"Empire" = "帝国头衔";
/* stats.py: Ranking; In files: stats.py:63; */
/* stats.py: Ranking; In files: stats.py:65; */
"Powerplay" = "势力";
/* stats.py: Combat rank; In files: stats.py:71; */
/* stats.py: Combat rank; In files: stats.py:73; */
"Harmless" = "Harmless";
/* stats.py: Combat rank; In files: stats.py:72; */
/* stats.py: Combat rank; In files: stats.py:74; */
"Mostly Harmless" = "Mostly Harmless";
/* stats.py: Combat rank; In files: stats.py:73; */
/* stats.py: Combat rank; In files: stats.py:75; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
/* stats.py: Combat rank; In files: stats.py:76; */
"Competent" = "Competent";
/* stats.py: Combat rank; In files: stats.py:75; */
/* stats.py: Combat rank; In files: stats.py:77; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:78; stats.py:141; */
"Master" = "Master";
/* stats.py: Combat rank; In files: stats.py:77; */
/* stats.py: Combat rank; In files: stats.py:79; */
"Dangerous" = "Dangerous";
/* stats.py: Combat rank; In files: stats.py:78; */
/* stats.py: Combat rank; In files: stats.py:80; */
"Deadly" = "Deadly";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
/* stats.py: Top rank; In files: stats.py:81; stats.py:92; stats.py:103; stats.py:114; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
/* stats.py: Trade rank; In files: stats.py:84; */
"Penniless" = "Penniless";
/* stats.py: Trade rank; In files: stats.py:83; */
/* stats.py: Trade rank; In files: stats.py:85; */
"Mostly Penniless" = "Mostly Penniless";
/* stats.py: Trade rank; In files: stats.py:84; */
/* stats.py: Trade rank; In files: stats.py:86; */
"Peddler" = "Peddler";
/* stats.py: Trade rank; In files: stats.py:85; */
/* stats.py: Trade rank; In files: stats.py:87; */
"Dealer" = "Dealer";
/* stats.py: Trade rank; In files: stats.py:86; */
/* stats.py: Trade rank; In files: stats.py:88; */
"Merchant" = "Merchant";
/* stats.py: Trade rank; In files: stats.py:87; */
/* stats.py: Trade rank; In files: stats.py:89; */
"Broker" = "Broker";
/* stats.py: Trade rank; In files: stats.py:88; */
/* stats.py: Trade rank; In files: stats.py:90; */
"Entrepreneur" = "Entrepreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
/* stats.py: Trade rank; In files: stats.py:91; */
"Tycoon" = "Tycoon";
/* stats.py: Explorer rank; In files: stats.py:93; */
/* stats.py: Explorer rank; In files: stats.py:95; */
"Aimless" = "Aimless";
/* Appearance setting. [EDMarketConnector.py] */
"Minimize to system tray" = "最小化到系统托盘";
/* stats.py: Explorer rank; In files: stats.py:94; */
/* stats.py: Explorer rank; In files: stats.py:96; */
"Mostly Aimless" = "Mostly Aimless";
/* stats.py: Explorer rank; In files: stats.py:95; */
/* stats.py: Explorer rank; In files: stats.py:97; */
"Scout" = "Scout";
/* stats.py: Explorer rank; In files: stats.py:96; */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Surveyor" = "Surveyor";
/* stats.py: Explorer rank; In files: stats.py:97; */
/* stats.py: Explorer rank; In files: stats.py:99; */
"Trailblazer" = "Trailblazer";
/* stats.py: Explorer rank; In files: stats.py:98; */
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pathfinder" = "Pathfinder";
/* stats.py: Explorer rank; In files: stats.py:99; */
/* stats.py: Explorer rank; In files: stats.py:101; */
"Ranger" = "Ranger";
/* stats.py: Explorer rank; In files: stats.py:100; */
/* stats.py: Explorer rank; In files: stats.py:102; */
"Pioneer" = "Pioneer";
/* stats.py: CQC rank; In files: stats.py:104; */
/* stats.py: CQC rank; In files: stats.py:106; */
"Helpless" = "Helpless";
/* stats.py: CQC rank; In files: stats.py:105; */
/* stats.py: CQC rank; In files: stats.py:107; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
/* stats.py: CQC rank; In files: stats.py:108; */
"Amateur" = "Amateur";
/* stats.py: CQC rank; In files: stats.py:107; */
/* stats.py: CQC rank; In files: stats.py:109; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
/* stats.py: CQC rank; In files: stats.py:110; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
/* stats.py: CQC rank; In files: stats.py:111; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
/* stats.py: CQC rank; In files: stats.py:112; */
"Hero" = "Hero";
/* stats.py: CQC rank; In files: stats.py:111; */
/* stats.py: CQC rank; In files: stats.py:113; */
"Gladiator" = "Gladiator";
/* stats.py: Federation rank; In files: stats.py:118; */
/* stats.py: Federation rank; In files: stats.py:120; */
"Recruit" = "Recruit";
/* stats.py: Federation rank; In files: stats.py:119; */
/* stats.py: Federation rank; In files: stats.py:121; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
/* stats.py: Federation rank; In files: stats.py:122; */
"Midshipman" = "Midshipman";
/* stats.py: Federation rank; In files: stats.py:121; */
/* stats.py: Federation rank; In files: stats.py:123; */
"Petty Officer" = "Petty Officer";
/* stats.py: Federation rank; In files: stats.py:122; */
/* stats.py: Federation rank; In files: stats.py:124; */
"Chief Petty Officer" = "Chief Petty Officer";
/* stats.py: Federation rank; In files: stats.py:123; */
/* stats.py: Federation rank; In files: stats.py:125; */
"Warrant Officer" = "Warrant Officer";
/* stats.py: Federation rank; In files: stats.py:124; */
/* stats.py: Federation rank; In files: stats.py:126; */
"Ensign" = "Ensign";
/* stats.py: Federation rank; In files: stats.py:125; */
/* stats.py: Federation rank; In files: stats.py:127; */
"Lieutenant" = "Lieutenant";
/* stats.py: Federation rank; In files: stats.py:126; */
/* stats.py: Federation rank; In files: stats.py:128; */
"Lieutenant Commander" = "Lieutenant Commander";
/* stats.py: Federation rank; In files: stats.py:127; */
/* stats.py: Federation rank; In files: stats.py:129; */
"Post Commander" = "Post Commander";
/* stats.py: Federation rank; In files: stats.py:128; */
/* stats.py: Federation rank; In files: stats.py:130; */
"Post Captain" = "Post Captain";
/* stats.py: Federation rank; In files: stats.py:129; */
/* stats.py: Federation rank; In files: stats.py:131; */
"Rear Admiral" = "Rear Admiral";
/* stats.py: Federation rank; In files: stats.py:130; */
/* stats.py: Federation rank; In files: stats.py:132; */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Federation rank; In files: stats.py:131; */
/* stats.py: Federation rank; In files: stats.py:133; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
/* stats.py: Empire rank; In files: stats.py:139; */
"Outsider" = "Outsider";
/* stats.py: Empire rank; In files: stats.py:138; */
/* stats.py: Empire rank; In files: stats.py:140; */
"Serf" = "Serf";
/* stats.py: Empire rank; In files: stats.py:140; */
/* stats.py: Empire rank; In files: stats.py:142; */
"Squire" = "Squire";
/* stats.py: Empire rank; In files: stats.py:141; */
/* stats.py: Empire rank; In files: stats.py:143; */
"Knight" = "Knight";
/* stats.py: Empire rank; In files: stats.py:142; */
/* stats.py: Empire rank; In files: stats.py:144; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
/* stats.py: Empire rank; In files: stats.py:145; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
/* stats.py: Empire rank; In files: stats.py:146; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
/* stats.py: Empire rank; In files: stats.py:147; */
"Count" = "Count";
/* stats.py: Empire rank; In files: stats.py:146; */
/* stats.py: Empire rank; In files: stats.py:148; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
/* stats.py: Empire rank; In files: stats.py:149; */
"Marquis" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:148; */
/* stats.py: Empire rank; In files: stats.py:150; */
"Duke" = "Duke";
/* stats.py: Empire rank; In files: stats.py:149; */
/* stats.py: Empire rank; In files: stats.py:151; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
/* stats.py: Empire rank; In files: stats.py:152; */
"King" = "King";
/* stats.py: Power rank; In files: stats.py:156; */
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 1" = "Rating 1";
/* stats.py: Power rank; In files: stats.py:157; */
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 2" = "Rating 2";
/* stats.py: Power rank; In files: stats.py:158; */
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 3" = "Rating 3";
/* stats.py: Power rank; In files: stats.py:159; */
/* stats.py: Power rank; In files: stats.py:161; */
"Rating 4" = "Rating 4";
/* stats.py: Power rank; In files: stats.py:160; */
/* stats.py: Power rank; In files: stats.py:162; */
"Rating 5" = "Rating 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:371; */
"Value" = "价值";
/* stats.py: Status dialog title; In files: stats.py:376; */
/* stats.py: Status dialog title; In files: stats.py:380; */
"Ships" = "所有飞船";
+156 -110
View File
@@ -1,6 +1,6 @@
# Developer Plugin Documentation
Plugins allow you to customise and extend the behavior of EDMC.
Plugins allow you to customise and extend the behavior of EDMarketConnector.
## Installing a Plugin
@@ -12,28 +12,31 @@ wiki.
Check [Releasing.md](docs/Releasing.md#environment) to be sure of the current
version of Python that we've tested against.
Plugins are loaded when EDMC starts up.
Plugins are loaded when EDMarketConnector starts up.
Each plugin has it's own folder in the `plugins` directory:
- Windows: `%LOCALAPPDATA%\EDMarketConnector\plugins`
- Mac: `~/Library/Application Support/EDMarketConnector/plugins`
- Linux: `$XDG_DATA_HOME/EDMarketConnector/plugins`, or `~/.local/share/EDMarketConnector/plugins` if `$XDG_DATA_HOME` is unset.
- Linux: `$XDG_DATA_HOME/EDMarketConnector/plugins`, or
`~/.local/share/EDMarketConnector/plugins` if `$XDG_DATA_HOME` is unset.
Plugins are python files. The plugin folder must have a file named `load.py`
that must provide one module level function and optionally provide a few
others.
If you're running from source (which allows for debugging with e.g. [PyCharm](https://www.jetbrains.com/pycharm/features/))
If you're running from source (which allows for debugging with e.g.
[PyCharm](https://www.jetbrains.com/pycharm/features/))
then you'll need to be using an appropriate version of Python. The current
version is listed in the [Environment section of Releasing.md](https://github.com/EDCD/EDMarketConnector/blob/main/docs/Releasing.md#environment).
version is listed in the
[Environment section of Releasing.md](https://github.com/EDCD/EDMarketConnector/blob/main/docs/Releasing.md#environment).
If you're developing your plugin simply against an install of EDMarketConnector
then you'll be relying on the bundled version of Python (it's baked
into the .exe via the py2exe build process).
Please be sure to read the [Avoiding potential pitfalls](#avoiding-potential-pitfalls)
section, else you might inadvertently cause issues for the core EDMC code
including whole application crashes.
section, else you might inadvertently cause issues for the core
EDMarketConnector code including whole application crashes.
It is highly advisable to ensure you are aware of all EDMarketConnector
releases, including the pre-releases. The -beta and -rc changelogs will
@@ -125,15 +128,16 @@ the packaged executeable all output is redirected to a log file. See
[Reporting a problem](https://github.com/EDCD/EDMarketConnector/wiki/Troubleshooting#reporting-a-problem)
for the location of this log file.
EDMC now implements proper logging using the Python `logging` module. Plugin
developers should now use the following code instead of simple `print(...)`
statements.
EDMarketConnector now implements proper logging using the Python `logging`
module. Plugin developers should now use the following code instead of simple
`print(...)` statements.
Insert this at the top-level of your load.py file (so not inside
`plugin_start3()`):
```python
import logging
import os
from config import appname
@@ -167,13 +171,14 @@ exactly the folder name. Our custom `qualname` and `class` formatters won't
work with a 'bare' logger, and will cause your code to throw exceptions if
you're not using our supplied logger.
If running with 4.1.0-beta1 or later of EDMC the logging setup happens in
the core code and will include the extra logfile destinations. If your
plugin is run under a pre-4.1.0 version of EDMC then the above will set up
basic logging only to the console (and thus redirected to the log file).
If running with 4.1.0-beta1 or later of EDMarketConnector the logging setup
happens in the core code and will include the extra logfile destinations. If
your plugin is run under a pre-4.1.0 version of EDMarketConnector then the
above will set up basic logging only to the console (and thus redirected to
the log file).
If you're certain your plugin will only be run under EDMC 4.1.0 or newer then
you can remove the `if` clause.
If you're certain your plugin will only be run under EDMarketConnector 4.1.0
or newer then you can remove the `if` clause.
Replace all `print(...)` statements with one of the following:
@@ -233,26 +238,26 @@ from config import appversion
# Yes, just blow up if config.appverison is neither str or callable
logger.info(f'Core EDMC version: {core_version}')
logger.info(f'Core EDMarketConnector version: {core_version}')
# And then compare like this
if core_version < semantic_version.Version('5.0.0-beta1'):
logger.info('EDMC core version is before 5.0.0-beta1')
logger.info('EDMarketConnector core version is before 5.0.0-beta1')
else:
logger.info('EDMC core version is at least 5.0.0-beta1')
logger.info('EDMarketConnector core version is at least 5.0.0-beta1')
```
---
## Startup
EDMC will import the `load.py` file as a module and then call the
EDMarketConnector will import the `load.py` file as a module and then call the
`plugin_start3()` function.
```python
def plugin_start3(plugin_dir: str) -> str:
"""
Load this plugin into EDMC
Load this plugin into EDMarketConnector
"""
print(f"I am loaded! My plugin folder is {plugin_dir}")
return "Test"
@@ -274,8 +279,8 @@ Mac, and `$TMP/EDMarketConnector.log` on Linux.
## Avoiding potential pitfalls
There are a number of things that your code should either do or avoiding
doing so as to play nicely with the core EDMC code and not risk causing
application crashes or hangs.
doing so as to play nicely with the core EDMarketConnector code and not risk
causing application crashes or hangs.
### Be careful about the name of your plugin directory
@@ -351,15 +356,17 @@ So instead use:
### Configuration
If you want your plugin to be configurable via the GUI you can define a frame
(panel) to be displayed on its own tab in EDMC's settings dialog. The tab
title will be the value that you returned from `plugin_start3`. Use widgets
from EDMC's myNotebook.py for the correct look-and-feel. You can be notified
when the settings dialog is closed so you can save your settings.
(panel) to be displayed on its own tab in EDMarketConnector's settings dialog.
The tab title will be the value that you returned from `plugin_start3`. Use
widgets from EDMarketConnector's myNotebook.py for the correct look-and-feel.
You can be notified when the settings dialog is closed, so you can save your
settings.
You can use `set()` and `get_$type()` (where type is one of: `int`, `bool`,
`str`, `list`) from EDMC's `config.config` object to retrieve your plugin's
settings in a platform-independent way. Previously this was done with a single
set and two get methods, the new methods provide better type safety.
`str`, `list`) from EDMarketConnector's `config.config` object to retrieve
your plugin's settings in a platform-independent way. Previously this was done
with a single set and two get methods, the new methods provide better type
safety.
If you want to maintain compatibility with pre-5.0.0 versions of this
application (please encourage plugin users to update!) then you'll need to
@@ -384,12 +391,12 @@ if not hasattr(config, 'get_list'):
```
**Be sure to use a unique prefix for any settings you save so as not to clash
with core EDMC or other plugins.**
with core EDMarketConnector or other plugins.**
Use `number_from_string()` from EDMC's `l10n.Locale` object to parse input
numbers in a locale-independent way. NB: the old CamelCase versions of
`number_from_string` and `string_from_number` do still exist, but are
deprecated. They will continue to work, but will throw warnings.
Use `number_from_string()` from EDMarketConnector's `l10n.Locale` object to
parse input numbers in a locale-independent way. NB: the old CamelCase
versions of `number_from_string` and `string_from_number` do still exist, but
are deprecated. They will continue to work, but will throw warnings.
Note that in the following example the function signature defines that it
returns `Optional[tk.Frame]` only because we need to allow for `None` if
@@ -399,7 +406,6 @@ as in the code below.
```python
import tkinter as tk
from tkinter import ttk
import myNotebook as nb
from config import config
from typing import Optional
@@ -408,7 +414,7 @@ my_setting: Optional[tk.IntVar] = None
def plugin_prefs(parent: nb.Notebook, cmdr: str, is_beta: bool) -> Optional[tk.Frame]:
"""
Return a TK Frame for adding to the EDMC settings dialog.
Return a TK Frame for adding to the EDMarketConnector settings dialog.
"""
global my_setting
my_setting = tk.IntVar(value=config.get_int("MyPluginSetting")) # Retrieve saved value from config
@@ -445,15 +451,15 @@ def prefs_changed(cmdr: str, is_beta: bool) -> None:
### Display
You can also have your plugin add an item to the EDMC main window and update
from your event hooks. This works in the same way as `plugin_prefs()`. For a
simple one-line item return a `tk.Label` widget or a 2 tuple of widgets.
For a more complicated item create a tk.Frame widget and populate it with other
ttk widgets. Return `None` if you just want to use this as a callback after the
main window and all other plugins are initialised.
You can also have your plugin add an item to the EDMarketConnector main window
and update from your event hooks. This works in the same way as
`plugin_prefs()`. For a simple one-line item return a `tk.Label` widget or a 2
tuple of widgets. For a more complicated item create a tk.Frame widget and
populate it with other ttk widgets. Return `None` if you just want to use this
as a callback after the main window and all other plugins are initialised.
You can use `string_from_number()` from EDMC's `l10n.Locale` object to format
numbers in your widgets in a locale-independent way.
You can use `string_from_number()` from EDMarketConnector's `l10n.Locale`
object to format numbers in your widgets in a locale-independent way.
```python
from typing import Optional, Tuple
@@ -464,12 +470,12 @@ status: Optional[tk.Label]
def plugin_app(parent: tk.Frame) -> Tuple[tk.Label, tk.Label]:
"""
Create a pair of TK widgets for the EDMC main window
Create a pair of TK widgets for the EDMarketConnector main window
"""
global status
label = tk.Label(parent, text="Status:") # By default widgets inherit the current theme's colors
status = tk.Label(parent, text="", foreground="yellow") # Override theme's foreground color
return (label, status)
return label, status
# later on your event functions can update the contents of these widgets
def some_other_function() -> None:
@@ -480,7 +486,7 @@ def some_other_function() -> None:
| Parameter | Type | Description |
| :-------- | :---------------------------------------------: | :---------------------------------------------------------- |
| `parent` | `tk.Frame` | The root EDMC window |
| `parent` | `tk.Frame` | The root EDMarketConnector window |
| `RETURN` | `Union[tk.Widget, Tuple[tk.Widget, tk.Widget]]` | A widget to add to the main window. See below for more info |
The return from `plugin_app()` can either be any widget (`Frame`, `Label`,
@@ -494,7 +500,7 @@ You can dynamically add and remove widgets on the main window by returning a
of that frame.
```python
from typing import Option
from typing import Optional
import tkinter as tk
from theme import theme
@@ -503,7 +509,7 @@ frame: Optional[tk.Frame] = None
def plugin_app(parent: tk.Frame) -> tk.Frame:
"""
Create a frame for the EDMC main window
Create a frame for the EDMarketConnector main window
"""
global frame
frame = tk.Frame(parent)
@@ -526,9 +532,10 @@ See [Avoiding potential pitfalls](#avoiding-potential-pitfalls).
### Events
Once you have created your plugin and EDMC has loaded it there are three other
functions you can define to be notified by EDMC when something happens:
`journal_entry()`, `dashboard_entry()` and `cmdr_data()`.
Once you have created your plugin and EDMarketConnector has loaded it there
are four other functions you can define to be notified by EDMarketConnector
when something happens: `journal_entry()`, `journal_entry_cqc()`,
`dashboard_entry()` and `cmdr_data()`.
Your events all get called on the main Tkinter loop so be sure not to block for
very long or the app will appear to freeze. If you have a long running
@@ -558,7 +565,7 @@ def journal_entry(
logger.info(f'Arrived at {entry["StarSystem"]}')
```
This gets called when EDMC sees a new entry in the game's journal.
This gets called when EDMarketConnector sees a new entry in the game's journal.
| Parameter | Type | Description |
| :-------- | :--------------: | :--------------------------------------------------------------------- |
@@ -659,13 +666,12 @@ New in version 5.0.1:
`Odyssey` boolean based on the presence of such a flag in the `LoadGame`
event. Defaults to `False`, i.e. if no such key in the event.
The previously undocumented`Horizons` boolean is similarly from `LoadGame`,
but blindly retrieves the value rather than having a strict default. There's
The previously undocumented `Horizons` boolean is similarly from `LoadGame`,
but blindly retrieves the value rather than having a strict default. There'd
be an exception if it wasn't there, and the value would be `None`. Note that
this is **NOT** the same as the return from
[plugins/eddn.py:is_horizons()](./plugins/eddn.py). That function is necessary
because CAPI data doesn't (didn't always?) have an indication of Horizons or
not.
[plugins/eddn.py:capi_is_horizons()](./plugins/eddn.py). That function is
necessary because CAPI data doesn't have a simple indication of Horizons-ness.
New in version 5.0.3:
@@ -685,12 +691,14 @@ New in version 5.1.1:
`state` now has a `ShipLockerJSON` member containing the un-changed, loaded,
JSON from the `ShipLockerJSON.json` file.
___
##### Synthetic Events
A special "StartUp" entry is sent if EDMC is started while the game is already
running. In this case you won't receive initial events such as "LoadGame",
"Rank", "Location", etc. However the `state` dictionary will reflect the
cumulative effect of these missed events.
A special "StartUp" entry is sent if EDMarketConnector is started while the
game is already running. In this case you won't receive initial events such as
"LoadGame", "Rank", "Location", etc. However the `state` dictionary will
reflect the cumulative effect of these missed events.
**NB: Any of the values in this might be `None` if the Cmdr has loaded into
Arena (CQC) from the Main Menu.**
@@ -704,9 +712,14 @@ react to either in your plugin code then either compare in a case insensitive
manner or check for both. The difference in case allows you to differentiate
between the two scenarios.
This event is not sent when EDMC is running on a different
**NB: Any of these events are passing to `journal_entry_cqc` rather than to
`journal_entry` if player has loaded into Arena (CQC).**
This event is not sent when EDMarketConnector is running on a different
machine so you should not *rely* on receiving this event.
---
##### Augmented Events
In some cases we augment the events, as seen in the Journal, with extra data.
@@ -744,6 +757,37 @@ Examples of this are:
---
### Journal entry in CQC
New in version 5.2.0
```python
def journal_entry_cqc(cmdr: str, is_beta: bool, entry: Dict[str, Any], state: Dict[str, Any]) -> None:
if entry['event'] == 'Location':
# We loaded to CQC match, lets detect map!
cqc_maps = { # dict to map systems names to CQC maps, ref: https://forums.frontier.co.uk/threads/cqc-systems.234394/
'Bleae Aewsy GA-Y d1-14': 'Asteria Point',
'Eta Cephei': 'Cluster Compound',
'Theta Ursae Majoris': 'Elevate',
'Boepp SU-E d12-818': 'Ice Field',
}
cqc_map = cqc_maps.get(entry['StarSystem'])
logger.info(f'Loaded to CQC map {cqc_map}')
```
This is called for new journal entries, instead of `journal_entry()`, when the
player is in Arena (CQC).
| Parameter | Type | Description |
| :-------- | :--------------: | :--------------------------------------------------------------------- |
| `cmdr` | `str` | Current commander name |
| `is_beta` | `bool` | Is the game currently in beta |
| `entry` | `Dict[str, Any]` | The journal event |
| `state` | `Dict[str, Any]` | More info about the commander, their ship, and their cargo (see below) |
The content of `state` will be the same as for [`journal_entry`](#journal-entry),
so check there for documentation.
---
### Shutdown
This gets called when the user closes the program:
@@ -751,7 +795,7 @@ This gets called when the user closes the program:
```python
def plugin_stop() -> None:
"""
EDMC is closing
EDMarketConnector is closing
"""
print("Farewell cruel world!")
```
@@ -765,8 +809,6 @@ before returning from this function.
### Player Dashboard
```python
import plug
def dashboard_entry(cmdr: str, is_beta: bool, entry: Dict[str, Any]):
is_deployed = entry['Flags'] & edmc_data.FlagsHardpointsDeployed
sys.stderr.write("Hardpoints {}\n".format(is_deployed and "deployed" or "stowed"))
@@ -878,9 +920,7 @@ def inara_notify_ship(event_data):
`event_data` holds the response to an addCommanderShip or setCommanderShip event https://inara.cz/inara-api-docs/#event-11
"""
if event_data.get('shipInaraID'):
logger.info(
f'Now in Inara ship {event_data['shipInaraID'],} at {event_data['shipInaraURL']}
)
logger.info(f'Now in Inara ship {event_data["shipInaraID"],} at {event_data["shipInaraURL"]}')
```
If the player has chosen to "Send flight log and Cmdr status to Inara" this
@@ -895,23 +935,23 @@ time after the corresponding `journal_entry()` event.
## Error messages
You can display an error in EDMC's status area by returning a string from your
`journal_entry()`, `dashboard_entry()` or `cmdr_data()` function, or
asynchronously (e.g. from a "worker" thread that is performing a long running
operation) by calling `plug.show_error()`. Either method will cause the "bad"
sound to be played (unless the user has muted sound).
You can display an error in EDMarketConnector's status area by returning a
string from your `journal_entry()`, `dashboard_entry()` or `cmdr_data()`
function, or asynchronously (e.g. from a "worker" thread that is performing a
long-running operation) by calling `plug.show_error()`. Either method will
cause the "bad" sound to be played (unless the user has muted sound).
The status area is shared between EDMC itself and all other plugins, so your
message won't be displayed for very long. Create a dedicated widget if you need
to display routine status information.
The status area is shared between EDMarketConnector itself and all other
plugins, so your message won't be displayed for very long. Create a dedicated
widget if you need to display routine status information.
---
## Localisation
You can localise your plugin to one of the languages that EDMC itself supports.
Add the following boilerplate near the top of each source file that contains
strings that needs translating:
You can localise your plugin to one of the languages that EDMarketConnector
itself supports. Add the following boilerplate near the top of each source
file that contains strings that needs translating:
```python
import l10n
@@ -925,9 +965,9 @@ Wrap each string that needs translating with the `_()` function, e.g.:
status["text"] = _('Happy!') # Main window status
```
If you display localized strings in EDMC's main window you should refresh them
in your `prefs_changed` function in case the user has changed their preferred
language.
If you display localized strings in EDMarketConnector's main window you should
refresh them in your `prefs_changed` function in case the user has changed
their preferred language.
Translation files should reside in folder named `L10n` inside your plugin's
folder. Files must be in macOS/iOS ".strings" format, encoded as UTF-8. You can
@@ -936,7 +976,7 @@ in your plugin's folder. This extracts all the translatable strings from Python
files in your plugin's folder and places them in a file named `en.template` in
the `L10n` folder. Rename this file as `<language_code>.strings` and edit it.
See EDMC's own [`L10n`](https://github.com/EDCD/EDMarketConnector/tree/main/L10n)
See EDMarketConnector's own [`L10n`](https://github.com/EDCD/EDMarketConnector/tree/main/L10n)
folder for the list of supported language codes and for example translation
files.
@@ -945,9 +985,9 @@ files.
## Python Package Plugins
A _Package Plugin_ is both a standard Python package (i.e. contains an
`__init__.py` file) and an EDMC plugin (i.e. contains a `load.py` file
providing at minimum a `plugin_start3()` function). These plugins are loaded
before any non-Package plugins.
`__init__.py` file) and an EDMarketConnector plugin (i.e. contains a `load.py`
file providing at minimum a `plugin_start3()` function). These plugins are
loaded before any non-Package plugins.
Other plugins can access features in a Package Plugin by `import`ing the
package by name in the usual way.
@@ -1054,16 +1094,20 @@ step for the extra module(s) until it works.
You can debug your http post requests using the builtin debug webserver.
To add support for said debug webserver to your plugin, you need to check `config.debug_senders` (`list[str]`) for
some indicator string for your plugin. `debug_senders` is generated from args to `--debug-sender` on the invocation
command line.
To add support for said debug webserver to your plugin, you need to check
`config.debug_senders` (`list[str]`) for some indicator string for your
plugin. `debug_senders` is generated from args to `--debug-sender` on the
invocation command line.
If said string exists, `DEBUG_WEBSERVER_HOST` and `DEBUG_WEBSERVER_PORT` in
`edmc_data` will contain the host and port for the currently running local webserver. Simply redirect your requests
there, and your requests will be logged to disk. For organisation, rewrite your request path to simply be `/pluginname`.
`edmc_data` will contain the host and port for the currently running local
webserver. Simply redirect your requests there, and your requests will be
logged to disk. For organisation, rewrite your request path to simply be
`/pluginname`.
Logs exist in `$TEMP/EDMarketConnector/http_debug/$path.log`. If somehow you manage to cause a directory traversal, your
data will not be saved to disk at all. You will see this in EDMCs log.
Logs exist in `$TEMP/EDMarketConnector/http_debug/$path.log`. If somehow you
manage to cause a directory traversal, your data will not be saved to disk at
all. You will see this in EDMarketConnectors log.
The simplest way to go about adding support is:
@@ -1079,15 +1123,16 @@ if 'my_plugin' in debug_senders:
```
For returned data, you can modify `debug_webserver.DEFAULT_RESPONSES` (`dict[str, Union[Callable[[str], str]], str])`
with either a function that accepts a single string (the raw post data) and returns a single string
(the response to send), or with a string if your required response is simple.
For returned data, you can modify `debug_webserver.DEFAULT_RESPONSES`
(`dict[str, Union[Callable[[str], str]], str])` with either a function that
accepts a single string (the raw post data) and returns a single string (the
response to send), or with a string if your required response is simple.
## Disable a plugin
EDMC now lets you disable a plugin without deleting it, simply rename the
plugin folder to append ".disabled". Eg,
"SuperSpaceHelper" -> "SuperSpaceHelper.disabled"
EDMarketConnector now lets you disable a plugin without deleting it, simply
rename the plugin folder to append ".disabled". Eg, "SuperSpaceHelper" ->
"SuperSpaceHelper.disabled"
Disabled and enabled plugins are listed on the "Plugins" Settings tab
@@ -1095,18 +1140,19 @@ Disabled and enabled plugins are listed on the "Plugins" Settings tab
## Migration from Python 2.7
Starting with pre-release 3.5 EDMC used Python 3.7. The first full
release under Python 3.7 was 4.0.0.0. The 4.2.x series was the last to use
Python 3.7, with releases moving on to the latest Python 3.9.x after that.
Starting with pre-release 3.5 EDMarketConnector used Python 3.7. The first
full release under Python 3.7 was 4.0.0.0. The 4.2.x series was the last to
use Python 3.7, with releases moving on to the latest Python 3.9.x after that.
This is a brief outline of the steps required to migrate a plugin from earlier
versions of EDMC:
versions of EDMarketConnector:
- Rename the function `plugin_start` to `plugin_start3(plugin_dir)`.
Plugins without a `plugin_start3` function are listed as disabled on EDMC's
"Plugins" tab and a message like "plugin SuperSpaceHelper needs migrating"
appears in the log. Such plugins are also listed in a section "Plugins
Without Python 3.x Support:" on the Settings > Plugins tab.
Plugins without a `plugin_start3` function are listed as disabled on
EDMarketConnector's "Plugins" tab and a message like "plugin
SuperSpaceHelper needs migrating" appears in the log. Such plugins are
also listed in a section "Plugins Without Python 3.x Support:" on the
`Settings` > `Plugins` tab.
- Check that callback functions `plugin_prefs`, `prefs_changed`,
`journal_entry`, `dashboard_entry` and `cmdr_data`, if used, are declared
@@ -1119,5 +1165,5 @@ versions of EDMC:
We advise *against* making any attempt to have a plugin's code work under
both Python 2.7 and 3.x. We no longer maintain the Python 2.7-based
versions of this application and you shouldn't support use of them with
versions of this application, and you shouldn't support use of them with
your plugin.
+442 -204
View File
@@ -9,26 +9,31 @@ protocol used for the callback.
import base64
import collections
import csv
import datetime
import hashlib
import json
import numbers
import os
import random
import threading
import time
import tkinter as tk
import urllib.parse
import webbrowser
from builtins import object, range, str
from email.utils import parsedate
from os.path import join
from queue import Queue
from typing import TYPE_CHECKING, Any, Dict, List, Mapping, Optional, OrderedDict, TypeVar, Union
import requests
import config as conf_module
import protocol
from config import appname, appversion, config
from edmc_data import companion_category_map as category_map
from EDMCLogging import get_main_logger
from monitor import monitor
from protocol import protocolhandler
logger = get_main_logger()
@@ -43,26 +48,16 @@ else:
# Define custom type for the dicts that hold CAPI data
# CAPIData = NewType('CAPIData', Dict)
holdoff = 60 # be nice
timeout = 10 # requests timeout
capi_query_cooldown = 60 # Minimum time between (sets of) CAPI queries
capi_default_requests_timeout = 10
auth_timeout = 30 # timeout for initial auth
# Currently the "Elite Dangerous Market Connector (EDCD/Athanasius)" one in
# Athanasius' Frontier account
# Obtain from https://auth.frontierstore.net/client/signup
CLIENT_ID = os.getenv('CLIENT_ID') or 'fb88d428-9110-475f-a3d2-dc151c2b9c7a'
SERVER_AUTH = 'https://auth.frontierstore.net'
URL_AUTH = '/auth'
URL_TOKEN = '/token'
URL_DECODE = '/decode'
# Used by both class Auth and Session
FRONTIER_AUTH_SERVER = 'https://auth.frontierstore.net'
USER_AGENT = f'EDCD-{appname}-{appversion()}'
SERVER_LIVE = 'https://companion.orerve.net'
SERVER_BETA = 'https://pts-companion.orerve.net'
URL_QUERY = '/profile'
URL_MARKET = '/market'
URL_SHIPYARD = '/shipyard'
commodity_map: Dict = {}
@@ -70,7 +65,10 @@ commodity_map: Dict = {}
class CAPIData(UserDict):
"""CAPI Response."""
def __init__(self, data: Union[str, Dict[str, Any], 'CAPIData', None] = None, source_endpoint: str = None) -> None:
def __init__(
self,
data: Union[str, Dict[str, Any], 'CAPIData', None] = None, source_endpoint: str = None
) -> None:
if data is None:
super().__init__()
elif isinstance(data, str):
@@ -85,7 +83,7 @@ class CAPIData(UserDict):
if source_endpoint is None:
return
if source_endpoint == URL_SHIPYARD and self.data.get('lastStarport'):
if source_endpoint == Session.FRONTIER_CAPI_PATH_SHIPYARD and self.data.get('lastStarport'):
# All the other endpoints may or may not have a lastStarport, but definitely wont have valid data
# for this check, which means it'll just make noise for no reason while we're working on other things
self.check_modules_ships()
@@ -127,6 +125,57 @@ class CAPIData(UserDict):
self.data['lastStarport']['ships'] = {'shipyard_list': {}, 'unavailable_list': []}
class CAPIDataEncoder(json.JSONEncoder):
"""Allow for json dumping via specified encoder."""
def default(self, o):
"""Tell JSON encoder that we're actually just a dict."""
return o.__dict__
class CAPIDataRawEndpoint:
"""Last received CAPI response for a specific endpoint."""
def __init__(self, raw_data: str, query_time: datetime.datetime):
self.query_time = query_time
self.raw_data = raw_data
# TODO: Maybe requests.response status ?
class CAPIDataRaw:
"""The last obtained raw CAPI response for each endpoint."""
raw_data: Dict[str, CAPIDataRawEndpoint] = {}
def record_endpoint(
self, endpoint: str,
raw_data: str,
query_time: datetime.datetime
):
"""Record the latest raw data for the given endpoint."""
self.raw_data[endpoint] = CAPIDataRawEndpoint(raw_data, query_time)
def __str__(self):
"""Return a more readable string form of the data."""
capi_data_str = '{'
for k, v in self.raw_data.items():
capi_data_str += f'"{k}":\n{{\n\t"query_time": "{v.query_time}",\n\t' \
f'"raw_data": {v.raw_data}\n}},\n\n'
capi_data_str = capi_data_str.removesuffix(',\n\n')
capi_data_str += '\n\n}'
return capi_data_str
def __iter__(self):
"""Make this iterable on its raw_data dict."""
yield from self.raw_data
def __getitem__(self, item):
"""Make the raw_data dict's items get'able."""
return self.raw_data.__getitem__(item)
def listify(thing: Union[List, Dict]) -> List:
"""
Convert actual JSON array or int-indexed dict into a Python list.
@@ -235,17 +284,26 @@ class CmdrError(Exception):
class Auth(object):
"""Handles authentication with the Frontier CAPI service via oAuth2."""
# Currently the "Elite Dangerous Market Connector (EDCD/Athanasius)" one in
# Athanasius' Frontier account
# Obtain from https://auth.frontierstore.net/client/signup
CLIENT_ID = os.getenv('CLIENT_ID') or 'fb88d428-9110-475f-a3d2-dc151c2b9c7a'
FRONTIER_AUTH_PATH_AUTH = '/auth'
FRONTIER_AUTH_PATH_TOKEN = '/token'
FRONTIER_AUTH_PATH_DECODE = '/decode'
def __init__(self, cmdr: str) -> None:
self.cmdr: str = cmdr
self.session = requests.Session()
self.session.headers['User-Agent'] = USER_AGENT
self.requests_session = requests.Session()
self.requests_session.headers['User-Agent'] = USER_AGENT
self.verifier: Union[bytes, None] = None
self.state: Union[str, None] = None
def __del__(self) -> None:
"""Ensure our Session is closed if we're being deleted."""
if self.session:
self.session.close()
if self.requests_session:
self.requests_session.close()
def refresh(self) -> Optional[str]:
"""
@@ -270,13 +328,17 @@ class Auth(object):
logger.debug('We have a refresh token for that idx')
data = {
'grant_type': 'refresh_token',
'client_id': CLIENT_ID,
'client_id': self.CLIENT_ID,
'refresh_token': tokens[idx],
}
logger.debug('Attempting refresh with Frontier...')
try:
r = self.session.post(SERVER_AUTH + URL_TOKEN, data=data, timeout=auth_timeout)
r = self.requests_session.post(
FRONTIER_AUTH_SERVER + self.FRONTIER_AUTH_PATH_TOKEN,
data=data,
timeout=auth_timeout
)
if r.status_code == requests.codes.ok:
data = r.json()
tokens[idx] = data.get('refresh_token', '')
@@ -306,14 +368,14 @@ class Auth(object):
logger.info(f'Trying auth from scratch for Commander "{self.cmdr}"')
challenge = self.base64_url_encode(hashlib.sha256(self.verifier).digest())
webbrowser.open(
f'{SERVER_AUTH}{URL_AUTH}?response_type=code'
f'{FRONTIER_AUTH_SERVER}{self.FRONTIER_AUTH_PATH_AUTH}?response_type=code'
f'&audience=frontier,steam,epic'
f'&scope=auth capi'
f'&client_id={CLIENT_ID}'
f'&client_id={self.CLIENT_ID}'
f'&code_challenge={challenge}'
f'&code_challenge_method=S256'
f'&state={self.state}'
f'&redirect_uri={protocolhandler.redirect}'
f'&redirect_uri={protocol.protocolhandler.redirect}'
)
return None
@@ -347,10 +409,10 @@ class Auth(object):
logger.debug('Got code, posting it back...')
request_data = {
'grant_type': 'authorization_code',
'client_id': CLIENT_ID,
'client_id': self.CLIENT_ID,
'code_verifier': self.verifier,
'code': data['code'][0],
'redirect_uri': protocolhandler.redirect,
'redirect_uri': protocol.protocolhandler.redirect,
}
# import http.client as http_client
@@ -360,12 +422,16 @@ class Auth(object):
# requests_log.setLevel(logging.DEBUG)
# requests_log.propagate = True
r = self.session.post(SERVER_AUTH + URL_TOKEN, data=request_data, timeout=auth_timeout)
r = self.requests_session.post(
FRONTIER_AUTH_SERVER + self.FRONTIER_AUTH_PATH_TOKEN,
data=request_data,
timeout=auth_timeout
)
data_token = r.json()
if r.status_code == requests.codes.ok:
# Now we need to /decode the token to check the customer_id against FID
r = self.session.get(
SERVER_AUTH + URL_DECODE,
r = self.requests_session.get(
FRONTIER_AUTH_SERVER + self.FRONTIER_AUTH_PATH_DECODE,
headers={
'Authorization': f'Bearer {data_token.get("access_token", "")}',
'Content-Type': 'application/json',
@@ -462,30 +528,127 @@ class Auth(object):
return base64.urlsafe_b64encode(text).decode().replace('=', '')
class EDMCCAPIReturn:
"""Base class for Request, Failure or Response."""
def __init__(
self, query_time: int, tk_response_event: Optional[str] = None,
play_sound: bool = False, auto_update: bool = False
):
self.tk_response_event = tk_response_event # Name of tk event to generate when response queued.
self.query_time: int = query_time # When this query is considered to have started (time_t).
self.play_sound: bool = play_sound # Whether to play good/bad sounds for success/failure.
self.auto_update: bool = auto_update # Whether this was automatically triggered.
class EDMCCAPIRequest(EDMCCAPIReturn):
"""Encapsulates a request for CAPI data."""
REQUEST_WORKER_SHUTDOWN = '__EDMC_WORKER_SHUTDOWN'
def __init__(
self, endpoint: str, query_time: int,
tk_response_event: Optional[str] = None,
play_sound: bool = False, auto_update: bool = False
):
super().__init__(
query_time=query_time, tk_response_event=tk_response_event,
play_sound=play_sound, auto_update=auto_update
)
self.endpoint: str = endpoint # The CAPI query to perform.
class EDMCCAPIResponse(EDMCCAPIReturn):
"""Encapsulates a response from CAPI quer(y|ies)."""
def __init__(
self, capi_data: CAPIData,
query_time: int, play_sound: bool = False, auto_update: bool = False
):
super().__init__(query_time=query_time, play_sound=play_sound, auto_update=auto_update)
self.capi_data: CAPIData = capi_data # Frontier CAPI response, possibly augmented (station query)
class EDMCCAPIFailedRequest(EDMCCAPIReturn):
"""CAPI failed query error class."""
def __init__(
self, message: str,
query_time: int, play_sound: bool = False, auto_update: bool = False,
exception=None
):
super().__init__(query_time=query_time, play_sound=play_sound, auto_update=auto_update)
self.message: str = message # User-friendly reason for failure.
self.exception: int = exception # Exception that recipient should raise.
class Session(object):
"""Methods for handling an oAuth2 session."""
"""Methods for handling Frontier Auth and CAPI queries."""
STATE_INIT, STATE_AUTH, STATE_OK = list(range(3))
FRONTIER_CAPI_PATH_PROFILE = '/profile'
FRONTIER_CAPI_PATH_MARKET = '/market'
FRONTIER_CAPI_PATH_SHIPYARD = '/shipyard'
# This is a dummy value, to signal to Session.capi_query_worker that we
# the 'station' triplet of queries.
_CAPI_PATH_STATION = '_edmc_station'
def __init__(self) -> None:
self.state = Session.STATE_INIT
self.server: Optional[str] = None
self.credentials: Optional[Dict[str, Any]] = None
self.session: Optional[requests.Session] = None
self.requests_session: Optional[requests.Session] = None
self.auth: Optional[Auth] = None
self.retrying = False # Avoid infinite loop when successful auth / unsuccessful query
self.tk_master: Optional[tk.Tk] = None
def login(self, cmdr: str = None, is_beta: Union[None, bool] = None) -> bool:
self.capi_raw_data = CAPIDataRaw() # Cache of raw replies from CAPI service
# Queue that holds requests for CAPI queries, the items should always
# be EDMCCAPIRequest objects.
self.capi_request_queue: Queue[EDMCCAPIRequest] = Queue()
# This queue is used to pass the result, possibly a failure, of CAPI
# queries back to the requesting code (technically anything checking
# this queue, but it should be either EDMarketConnector.AppWindow or
# EDMC.py). Items may be EDMCCAPIResponse or EDMCCAPIFailedRequest.
self.capi_response_queue: Queue[Union[EDMCCAPIResponse, EDMCCAPIFailedRequest]] = Queue()
logger.debug('Starting CAPI queries thread...')
self.capi_query_thread = threading.Thread(
target=self.capi_query_worker,
daemon=True,
name='CAPI worker'
)
self.capi_query_thread.start()
logger.debug('Done')
def set_tk_master(self, master: tk.Tk) -> None:
"""Set a reference to main UI Tk root window."""
self.tk_master = master
######################################################################
# Frontier Authorization
######################################################################
def start_frontier_auth(self, access_token: str) -> None:
"""Start an oAuth2 session."""
logger.debug('Starting session')
self.requests_session = requests.Session()
self.requests_session.headers['Authorization'] = f'Bearer {access_token}'
self.requests_session.headers['User-Agent'] = USER_AGENT
self.state = Session.STATE_OK
def login(self, cmdr: str = None, is_beta: Optional[bool] = None) -> bool:
"""
Attempt oAuth2 login.
:return: True if login succeeded, False if re-authorization initiated.
"""
if not CLIENT_ID:
logger.error('CLIENT_ID is None')
if not Auth.CLIENT_ID:
logger.error('self.CLIENT_ID is None')
raise CredentialsError('cannot login without a valid Client ID')
# TODO: WTF is the intent behind this logic ?
# Perhaps to do with not even trying to auth if we're not sure if
# it's beta, but that's moot for *auth* since oAuth2.
if not cmdr or is_beta is None:
# Use existing credentials
if not self.credentials:
@@ -515,7 +678,7 @@ class Session(object):
if access_token:
logger.debug('We have an access_token')
self.auth = None
self.start(access_token)
self.start_frontier_auth(access_token)
return True
else:
@@ -535,7 +698,7 @@ class Session(object):
try:
logger.debug('Trying authorize with payload from handler')
self.start(self.auth.authorize(protocolhandler.lastpayload)) # type: ignore
self.start_frontier_auth(self.auth.authorize(protocol.protocolhandler.lastpayload)) # type: ignore
self.auth = None
except Exception:
@@ -544,174 +707,263 @@ class Session(object):
self.auth = None
raise # Bad thing happened
def start(self, access_token: str) -> None:
"""Start an oAuth2 session."""
logger.debug('Starting session')
self.session = requests.Session()
self.session.headers['Authorization'] = f'Bearer {access_token}'
self.session.headers['User-Agent'] = USER_AGENT
self.state = Session.STATE_OK
def close(self) -> None:
"""Close Frontier authorization session."""
self.state = Session.STATE_INIT
if self.requests_session:
try:
self.requests_session.close()
def query(self, endpoint: str) -> CAPIData: # noqa: CCR001
"""Perform a query against the specified CAPI endpoint."""
logger.trace(f'Performing query for endpoint "{endpoint}"')
if self.state == Session.STATE_INIT:
if self.login():
return self.query(endpoint)
except Exception as e:
logger.debug('Frontier Auth: closing', exc_info=e)
elif self.state == Session.STATE_AUTH:
logger.error('cannot make a query when unauthorized')
raise CredentialsError('cannot make a query when unauthorized')
self.requests_session = None
try:
logger.trace('Trying...')
r = self.session.get(self.server + endpoint, timeout=timeout) # type: ignore
def invalidate(self) -> None:
"""Invalidate Frontier authorization credentials."""
logger.debug('Forcing a full re-authentication')
# Force a full re-authentication
self.close()
Auth.invalidate(self.credentials['cmdr']) # type: ignore
######################################################################
except requests.ConnectionError as e:
logger.warning(f'Unable to resolve name for CAPI: {e} (for request: {endpoint})')
raise ServerConnectionError(f'Unable to connect to endpoint {endpoint}') from e
######################################################################
# CAPI queries
######################################################################
def capi_query_worker(self): # noqa: C901, CCR001
"""Worker thread that performs actual CAPI queries."""
logger.debug('CAPI worker thread starting')
except Exception as e:
logger.debug('Attempting GET', exc_info=e)
# LANG: Frontier CAPI data retrieval failed
raise ServerError(f'{_("Frontier CAPI query failure")}: {endpoint}') from e
def capi_single_query( # noqa: CCR001
capi_endpoint: str, timeout: int = capi_default_requests_timeout
) -> CAPIData:
"""
Perform a *single* CAPI endpoint query within the thread worker.
if r.url.startswith(SERVER_AUTH):
logger.info('Redirected back to Auth Server')
# Redirected back to Auth server - force full re-authentication
self.dump(r)
self.invalidate()
self.retrying = False
self.login()
raise CredentialsError()
:param capi_endpoint: An actual Frontier CAPI endpoint to query.
:param timeout: requests query timeout to use.
:return: The resulting CAPI data, of type CAPIData.
"""
capi_data: CAPIData
try:
logger.trace_if('capi.worker', 'Sending HTTP request...')
if conf_module.capi_pretend_down:
raise ServerConnectionError(f'Pretending CAPI down: {capi_endpoint}')
elif 500 <= r.status_code < 600:
# Server error. Typically 500 "Internal Server Error" if server is down
logger.debug('500 status back from CAPI')
self.dump(r)
# LANG: Frontier CAPI data retrieval failed with 5XX code
raise ServerError(f'{_("Frontier CAPI server error")}: {r.status_code}')
r = self.requests_session.get(self.server + capi_endpoint, timeout=timeout) # type: ignore
logger.trace_if('capi.worker', '... got result...')
r.raise_for_status() # Typically 403 "Forbidden" on token expiry
# May also fail here if token expired since response is empty
# r.status_code = 401
# raise requests.HTTPError
capi_json = r.json()
capi_data = CAPIData(capi_json, capi_endpoint)
self.capi_raw_data.record_endpoint(
capi_endpoint, r.content.decode(encoding='utf-8'),
datetime.datetime.utcnow()
)
try:
r.raise_for_status() # Typically 403 "Forbidden" on token expiry
data = CAPIData(r.json(), endpoint) # May also fail here if token expired since response is empty
except requests.ConnectionError as e:
logger.warning(f'Request {capi_endpoint}: {e}')
raise ServerConnectionError(f'Unable to connect to endpoint: {capi_endpoint}') from e
except (requests.HTTPError, ValueError) as e:
logger.exception('Frontier CAPI Auth: GET ')
self.dump(r)
self.close()
except requests.HTTPError as e: # In response to raise_for_status()
logger.exception(f'Frontier CAPI Auth: GET {capi_endpoint}')
self.dump(r)
if self.retrying: # Refresh just succeeded but this query failed! Force full re-authentication
logger.error('Frontier CAPI Auth: query failed after refresh')
self.invalidate()
self.retrying = False
self.login()
raise CredentialsError('query failed after refresh') from e
if r.status_code == 401: # CAPI doesn't think we're Auth'd
# No need for translation, we'll go straight into trying new Auth
# and thus any message would be overwritten.
raise CredentialsError('Frontier CAPI said Auth required') from e
elif self.login(): # Maybe our token expired. Re-authorize in any case
logger.debug('Initial query failed, but login() just worked, trying again...')
self.retrying = True
return self.query(endpoint)
if r.status_code == 418: # "I'm a teapot" - used to signal maintenance
# LANG: Frontier CAPI returned 418, meaning down for maintenance
raise ServerError(_("Frontier CAPI down for maintenance")) from e
logger.exception('Frontier CAPI: Misc. Error')
raise ServerError('Frontier CAPI: Misc. Error') from e
except ValueError as e:
logger.exception(f'decoding CAPI response content:\n{r.content.decode(encoding="utf-8")}\n')
raise ServerError("Frontier CAPI response: couldn't decode JSON") from e
except Exception as e:
logger.debug('Attempting GET', exc_info=e)
# LANG: Frontier CAPI data retrieval failed
raise ServerError(f'{_("Frontier CAPI query failure")}: {capi_endpoint}') from e
if capi_endpoint == self.FRONTIER_CAPI_PATH_PROFILE and 'commander' not in capi_data:
logger.error('No commander in returned data')
if 'timestamp' not in capi_data:
capi_data['timestamp'] = time.strftime(
'%Y-%m-%dT%H:%M:%SZ', parsedate(r.headers['Date']) # type: ignore
)
return capi_data
def capi_station_queries(timeout: int = capi_default_requests_timeout) -> CAPIData: # noqa: CCR001
"""
Perform all 'station' queries for the caller.
A /profile query is performed to check that we are docked (or on foot)
and the station name and marketid match the prior Docked event.
If they do match, and the services list says they're present, also
retrieve CAPI market and/or shipyard/outfitting data and merge into
the /profile data.
:param timeout: requests timeout to use.
:return: CAPIData instance with what we retrieved.
"""
station_data = capi_single_query(self.FRONTIER_CAPI_PATH_PROFILE, timeout=timeout)
if not station_data['commander'].get('docked') and not monitor.state['OnFoot']:
return station_data
# Sanity checks in case data isn't as we expect, and maybe 'docked' flag
# is also lagging.
if (last_starport := station_data.get('lastStarport')) is None:
logger.error("No lastStarport in data!")
return station_data
if (
(last_starport_name := last_starport.get('name')) is None
or last_starport_name == ''
):
# This could well be valid if you've been out exploring for a long
# time.
logger.warning("No lastStarport name!")
return station_data
# WORKAROUND: n/a | 06-08-2021: Issue 1198 and https://issues.frontierstore.net/issue-detail/40706
# -- strip "+" chars off star port names returned by the CAPI
last_starport_name = last_starport["name"] = last_starport_name.rstrip(" +")
services = last_starport.get('services', {})
if not isinstance(services, dict):
# Odyssey Alpha Phase 3 4.0.0.20 has been observed having
# this be an empty list when you've jumped to another system
# and not yet docked. As opposed to no services key at all
# or an empty dict.
logger.error(f'services is "{type(services)}", not dict !')
# TODO: Change this to be dependent on its own CL arg
if __debug__:
self.dump_capi_data(station_data)
# Set an empty dict so as to not have to retest below.
services = {}
last_starport_id = int(last_starport.get('id'))
if services.get('commodities'):
market_data = capi_single_query(self.FRONTIER_CAPI_PATH_MARKET, timeout=timeout)
if last_starport_id != int(market_data['id']):
logger.warning(f"{last_starport_id!r} != {int(market_data['id'])!r}")
raise ServerLagging()
else:
market_data['name'] = last_starport_name
station_data['lastStarport'].update(market_data)
if services.get('outfitting') or services.get('shipyard'):
shipyard_data = capi_single_query(self.FRONTIER_CAPI_PATH_SHIPYARD, timeout=timeout)
if last_starport_id != int(shipyard_data['id']):
logger.warning(f"{last_starport_id!r} != {int(shipyard_data['id'])!r}")
raise ServerLagging()
else:
shipyard_data['name'] = last_starport_name
station_data['lastStarport'].update(shipyard_data)
# WORKAROUND END
return station_data
while True:
query = self.capi_request_queue.get()
logger.trace_if('capi.worker', 'De-queued request')
if not isinstance(query, EDMCCAPIRequest):
logger.error("Item from queue wasn't an EDMCCAPIRequest")
break
if query.endpoint == query.REQUEST_WORKER_SHUTDOWN:
logger.info(f'endpoint {query.REQUEST_WORKER_SHUTDOWN}, exiting...')
break
logger.trace_if('capi.worker', f'Processing query: {query.endpoint}')
capi_data: CAPIData
try:
if query.endpoint == self._CAPI_PATH_STATION:
capi_data = capi_station_queries()
else:
capi_data = capi_single_query(self.FRONTIER_CAPI_PATH_PROFILE)
except Exception as e:
self.capi_response_queue.put(
EDMCCAPIFailedRequest(
message=str(e.args),
exception=e,
query_time=query.query_time,
play_sound=query.play_sound,
auto_update=query.auto_update
)
)
else:
self.retrying = False
logger.error('Frontier CAPI Auth: HTTP error or invalid JSON')
raise CredentialsError('HTTP error or invalid JSON') from e
self.capi_response_queue.put(
EDMCCAPIResponse(
capi_data=capi_data,
query_time=query.query_time,
play_sound=query.play_sound,
auto_update=query.auto_update
)
)
self.retrying = False
if 'timestamp' not in data:
# logger.trace('timestamp not in data, adding from response headers')
data['timestamp'] = time.strftime('%Y-%m-%dT%H:%M:%SZ', parsedate(r.headers['Date'])) # type: ignore
# If the query came from EDMC.(py|exe) there's no tk to send an
# event too, so assume it will be polling there response queue.
if query.tk_response_event is not None:
logger.trace_if('capi.worker', 'Sending <<CAPIResponse>>')
self.tk_master.event_generate('<<CAPIResponse>>')
# Update Odyssey Suit data
if endpoint == URL_QUERY:
self.suit_update(data)
logger.info('CAPI worker thread DONE')
return data
def capi_query_close_worker(self) -> None:
"""Ask the CAPI query thread to finish."""
self.capi_request_queue.put(
EDMCCAPIRequest(
endpoint=EDMCCAPIRequest.REQUEST_WORKER_SHUTDOWN,
query_time=int(time.time())
)
)
def profile(self) -> CAPIData:
"""Perform general CAPI /profile endpoint query."""
data = self.query(URL_QUERY)
if 'commander' not in data:
logger.error('No commander in returned data')
return data
def station(self) -> CAPIData: # noqa: CCR001
def station(
self, query_time: int, tk_response_event: Optional[str] = None,
play_sound: bool = False, auto_update: bool = False
) -> None:
"""
Perform CAPI quer(y|ies) for station data.
A /profile query is performed to check that we are docked (or on foot)
and the station name and marketid match the prior Docked event.
If they do match, and the services list says they're present, also
retrieve CAPI market and/or shipyard/outfitting data and merge into
the /profile data.
:return: Possibly augmented CAPI data.
:param query_time: When this query was initiated.
:param tk_response_event: Name of tk event to generate when response queued.
:param play_sound: Whether the app should play a sound on error.
:param auto_update: Whether this request was triggered automatically.
"""
data = self.query(URL_QUERY)
if 'commander' not in data:
logger.error('No commander in returned data')
return data
if not data['commander'].get('docked') and not monitor.state['OnFoot']:
return data
# Sanity checks in case data isn't as we expect, and maybe 'docked' flag
# is also lagging.
if (last_starport := data.get('lastStarport')) is None:
logger.error("No lastStarport in data!")
return data
if ((last_starport_name := last_starport.get('name')) is None
or last_starport_name == ''):
# This could well be valid if you've been out exploring for a long
# time.
logger.warning("No lastStarport name!")
return data
# WORKAROUND: n/a | 06-08-2021: Issue 1198 and https://issues.frontierstore.net/issue-detail/40706
# -- strip "+" chars off star port names returned by the CAPI
last_starport_name = last_starport["name"] = last_starport_name.rstrip(" +")
services = last_starport.get('services', {})
if not isinstance(services, dict):
# Odyssey Alpha Phase 3 4.0.0.20 has been observed having
# this be an empty list when you've jumped to another system
# and not yet docked. As opposed to no services key at all
# or an empty dict.
logger.error(f'services is "{type(services)}", not dict !')
if __debug__:
self.dump_capi_data(data)
# Set an empty dict so as to not have to retest below.
services = {}
last_starport_id = int(last_starport.get('id'))
if services.get('commodities'):
marketdata = self.query(URL_MARKET)
if last_starport_id != int(marketdata['id']):
logger.warning(f"{last_starport_id!r} != {int(marketdata['id'])!r}")
raise ServerLagging()
else:
marketdata['name'] = last_starport_name
data['lastStarport'].update(marketdata)
if services.get('outfitting') or services.get('shipyard'):
shipdata = self.query(URL_SHIPYARD)
if last_starport_id != int(shipdata['id']):
logger.warning(f"{last_starport_id!r} != {int(shipdata['id'])!r}")
raise ServerLagging()
else:
shipdata['name'] = last_starport_name
data['lastStarport'].update(shipdata)
# WORKAROUND END
return data
# Ask the thread worker to perform all three queries
logger.trace_if('capi.worker', 'Enqueueing request')
self.capi_request_queue.put(
EDMCCAPIRequest(
endpoint=self._CAPI_PATH_STATION,
tk_response_event=tk_response_event,
query_time=query_time,
play_sound=play_sound,
auto_update=auto_update
)
)
######################################################################
######################################################################
# Utility functions
######################################################################
def suit_update(self, data: CAPIData) -> None:
"""
Update monitor.state suit data.
@@ -749,25 +1001,6 @@ class Session(object):
else:
monitor.state['SuitLoadouts'] = suit_loadouts
def close(self) -> None:
"""Close CAPI authorization session."""
self.state = Session.STATE_INIT
if self.session:
try:
self.session.close()
except Exception as e:
logger.debug('Frontier CAPI Auth: closing', exc_info=e)
self.session = None
def invalidate(self) -> None:
"""Invalidate oAuth2 credentials."""
logger.debug('Forcing a full re-authentication')
# Force a full re-authentication
self.close()
Auth.invalidate(self.credentials['cmdr']) # type: ignore
# noinspection PyMethodMayBeStatic
def dump(self, r: requests.Response) -> None:
"""Log, as error, status of requests.Response from CAPI request."""
@@ -794,13 +1027,17 @@ class Session(object):
timestamp = time.strftime('%Y-%m-%dT%H.%M.%S', time.localtime())
with open(f'dump/{system}{station}.{timestamp}.json', 'wb') as h:
h.write(json.dumps(dict(data),
h.write(json.dumps(data, cls=CAPIDataEncoder,
ensure_ascii=False,
indent=2,
sort_keys=True,
separators=(',', ': ')).encode('utf-8'))
######################################################################
######################################################################
# Non-class utility functions
######################################################################
def fixup(data: CAPIData) -> CAPIData: # noqa: C901, CCR001 # Can't be usefully simplified
"""
Fix up commodity names to English & miscellaneous anomalies fixes.
@@ -937,6 +1174,7 @@ def index_possibly_sparse_list(data: Union[Mapping[str, V], List[V]], key: int)
else:
raise ValueError(f'Unexpected data type {type(data)}')
######################################################################
# singleton
+30 -1
View File
@@ -33,7 +33,7 @@ appcmdname = 'EDMC'
# <https://semver.org/#semantic-versioning-specification-semver>
# Major.Minor.Patch(-prerelease)(+buildmetadata)
# NB: Do *not* import this, use the functions appversion() and appversion_nobuild()
_static_appversion = '5.1.3'
_static_appversion = '5.2.0'
_cached_version: Optional[semantic_version.Version] = None
copyright = '© 2015-2019 Jonathan Harris, 2020-2021 EDCD'
@@ -45,6 +45,7 @@ debug_senders: List[str] = []
# *all* if only interested in some things.
trace_on: List[str] = []
capi_pretend_down: bool = False
# This must be done here in order to avoid an import cycle with EDMCLogging.
# Other code should use EDMCLogging.get_main_logger
if os.getenv("EDMC_NO_UI"):
@@ -206,6 +207,8 @@ class AbstractConfig(abc.ABC):
__in_shutdown = False # Is the application currently shutting down ?
__auth_force_localserver = False # Should we use localhost for auth callback ?
__auth_force_edmc_protocol = False # Should we force edmc:// protocol ?
__eddn_url = None # Non-default EDDN URL
__eddn_tracking_ui = False # Show EDDN tracking UI ?
def __init__(self) -> None:
self.home_path = pathlib.Path.home()
@@ -249,6 +252,32 @@ class AbstractConfig(abc.ABC):
"""
return self.__auth_force_edmc_protocol
def set_eddn_url(self, eddn_url: str):
"""Set the specified eddn URL."""
self.__eddn_url = eddn_url
@property
def eddn_url(self) -> Optional[str]:
"""
Provide the custom EDDN URL.
:return: str - Custom EDDN URL to use.
"""
return self.__eddn_url
def set_eddn_tracking_ui(self):
"""Activate EDDN tracking UI."""
self.__eddn_tracking_ui = True
@property
def eddn_tracking_ui(self) -> bool:
"""
Determine if the EDDN tracking UI be shown.
:return: bool - Should tracking UI be active?
"""
return self.__eddn_tracking_ui
@property
def app_dir(self) -> str:
"""Return a string version of app_dir."""
+29 -13
View File
@@ -1,12 +1,36 @@
# Introduction
Instead of building manually as laid out by [Releasing](https://github.com/EDCD/EDMarketConnector/blob/main/docs/Releasing.md), you can build the EDMC installer using GitHub actions.
Instead of building manually as laid out by
[Releasing](https://github.com/EDCD/EDMarketConnector/blob/main/docs/Releasing.md),
you can build the EDMarketConnector installer using GitHub actions.
## Initiating a workflow run
Starting a workflow run is done from the Actions tab at the top of the main GitHub UI
### Automatically on tag push
Once you are sure you have a branch all ready for release as a new version you
should be adding a `Release/<semantic version>` tag at that HEAD. Pushing
such a tag to GitHub will cause the
[the GitHub Windows Build Action file](../.github/workflows/windows-build.yml)
to build an installer and create a draft release, with the pre-release box
pre-ticked. This ensures you don't accidentally create a new non-pre
release which will always become the target of the `latest` shortcut on GitHub.
NB: The branch you want to build must have the workflow file (`.github/workflows/windows-build.yml`), and the version of the file in that branch is the version that will be used for the build (e.g. for different python versions)
You can monitor such an auto-build from the Actions tab on GitHub. If it
completes successfully then check the Releases tab on GitHub for the draft
that was created.
See [Releasing.md#Distribution](./Releasing.md#distribution) for details on
how to fully publish an automatic release so that running EDMarketConnector.exe
clients pick it up as an update.
### Manually
Starting a workflow run is done from the Actions tab at the top of the main
GitHub UI
NB: The branch you want to build must have the workflow file
(`.github/workflows/windows-build.yml`), and the version of the file in that
branch is the version that will be used for the build (e.g. for different
python versions)
1. Select the Actions tab at the top of the main GitHub interface
2. Select the `Build EDMC for Windows` workflow on the left
@@ -16,7 +40,8 @@ NB: The branch you want to build must have the workflow file (`.github/workflows
## Downloading built installer files
When the workflow is (successfully) completed, it will upload the msi file it built as a "Workflow Artifact". You can find the artifacts as follows:
When the workflow is (successfully) completed, it will upload the msi file it
built as a "Workflow Artifact". You can find the artifacts as follows:
1. Select `All workflows` on the left
2. Select the `Build EDMC for Windows` action
@@ -26,12 +51,3 @@ When the workflow is (successfully) completed, it will upload the msi file it bu
Within the `Built Files` zip file is the installer msi
**Please ensure you test the built msi before creating a release.**
## Automatic release creation
Github Actions can automatically create a release after finishing a build (as mentioned above). To make this happen,
simply push a tag to the repo with the format `v1.2.3` where 1.2.3 is the semver for the version (Note that this is
**DISTINCT** from the normal `Release/1.2.3` format for release tags).
Once the push is completed, a build will start, and once that is complete, a draft release will be created. Edit the
release as needed and publish it. **Note that you should still test the built msi before publishing the release**
+207 -29
View File
@@ -1,62 +1,240 @@
# Kill Switches
EDMarketConnector implements a Kill Switch system that allows us to disable features based on a version mask. Meaning that we can stop major bugs from affecting the services we support, at the expense of disabling that support.
EDMarketConnector implements a Kill Switch system that allows us to disable
features based on a version mask. Meaning that we can stop major bugs from
affecting the services we support, at the expense of disabling that support.
## Format
Killswitches are stored in a JSON file that is queried by EDMC on startup. The format is as follows:
Killswitches are stored in a JSON file that is queried by EDMC on startup.
The format is as follows:
| Key | Type | Description |
| --------------: | :------: | :------------------------------------------------------------ |
| `version` | `int` | the version of the Kill Switch JSON file, always 1 |
| `last_updated` | `string` | When last the kill switches were updated (for human use only) |
| `kill_switches` | `array` | The kill switches this file contains (expanded below) |
| Key | Type | Description |
| --------------: | :------: | :------------------------------------------------------------------------------------------- |
| `version` | `int` | the version of the Kill Switch JSON file, always 2, 1 exists and will be upgraded if needed. |
| `last_updated` | `string` | When last the kill switches were updated (for human use only) |
| `kill_switches` | `array` | The kill switches this file contains (expanded below) |
The `kill_switches` array contains kill switch objects. Each contains two fields:
The `kill_switches` array contains kill switch objects. Each contains the
following fields:
| Key | Type | Description |
| --------: | :---------------------------: | :--------------------------------------------------------------------------- |
| `version` | `version spec (see Versions)` | The version of EDMC these kill switches apply to (Must be valid semver spec) |
| `kills` | `Dict[str, Dict[...]]` | The various keys disabled -> definition of the killswitch behaviour |
Each entry in `kills` must contain at least a `reason` field describing why the
killswitch was added. EDMC will show this to the user
(for internal killswitches, anyway).
| Key (* = required) | Type | Description |
| -----------------: | :--------------: | :-------------------------------------------------------------------------------------------- |
| `reason`* | `str` | The reason that this killswitch was added |
| `set_fields` | `Dict[str, Any]` | A map of key -> contents to update (or overwrite) existing data with |
| `redact_fields` | `List[str]` | A list of traversal paths to redact. This is the same as using set with a value of "REDACTED" |
| `delete_fields` | `List[str]` | A list of traversal paths in the matching event to be removed, if they exist. |
The order listed above is the precedence for actions. i.e. All set fields are
set, then all redact fields are redacted then all delete fields are deleted.
| Key | Type | Description |
| --------: | :--------------: | :--------------------------------------------------------------------------- |
| `version` | `version spec` | The version of EDMC these kill switches apply to (Must be valid semver spec) |
| `kills` | `Dict[str, str]` | The different keys to disable, and the reason for the disable |
An example follows:
```json
{
"version": 1,
"last_updated": "19 October 2020",
"version": 2,
"last_updated": "3 July 2021",
"kill_switches": [
{
"version": "1.0.0",
"kills": {
"plugins.eddn.send": "some reason"
"plugins.eddn.send": {
"reason": "some reason",
"delete_fields": ["world_domination_plans"],
"set_fields": {
"bad_bases_for_systems_of_government": ["Strange women lying in ponds distributing swords"],
"ruler_map": {"emperor": "scimitar"}
},
"redact_fields": ["relation_to_thargoids"]
},
"plugins.some_plugin.some_thing": {
"reason": "Some thing is disabled pending investigation of NMLA relations."
}
}
}
]
}
```
- `plugins.edsm.send` will have fields deleted, set, and redacted, and then
will *not* be halted, the send will continue with the modified data.
- `plugins.some_plugin.some_thing` will never be allowed to continue
(as all fields are blank)
Indexing of lists (and any other `Sequence`) is done with numbers as normal.
Negative numbers do work to reference the end of sequences.
### Traversal paths
`set_fields`, `delete_fields`, and `redact_fields` all accept a single traversal
path to target particular fields.
When following paths, there are some caveats one should know.
- If a field (for example `a.b`) exists in the data dict
(ie, `{'a.b': True}`) it will be the thing accessed by a killswitch that
includes `a.b` at the current "level". This means that if both a key `a.b`
and a nested key exist with the same name (`{'a.b': 0, 'a': { 'b': 1 }}`),
the former is always referenced. No backtracking takes place to attempt to
resolve conflicts, even if the dotted field name is not at the end of a key.
- Traversal can and will error, especially if you attempt to pass though keys
that do not exist (eg past the end of a `Sequence` or a key that does not
exist in a `Mapping`).
- If any exception occurs during your traversal, **the entire killswitch is**
**assumed to be faulty, and will be treated as a permanent killswitch**
### Individual action rules
All actions (as noted above) can fail during traversal to their targets. If this
happens, the entire killswitch is assumed to be a permanent one and execution
stops.
#### Deletes
For both `MutableMapping` and `MutableSequence` targets, deletes never fail.
If a key doesn't exist it simply is a no-op.
#### Sets
Sets always succeed for `MutableMapping` objects, either creating new keys
or updating existing ones. For `MutableSequence`s, however, a set can fail if
the index is not within `len(target)`. If the index is exactly `len(target)`,
`append` is used.
You can set values other than strings, but you are limited to what json itself
supports, and the translation thereof to python. In general this means that only
JSON primitives and their python equivalents
(`int`, `float`, `string`, `bool`, and `None` (json `null`)), and
json compound types (`object -- {}` and `array -- []`) may be set.
### Testing
Killswitch files can be tested using the script in `scripts/killswitch_test.py`.
Providing a file as an argument or `-` for stdin will output the behaviour of
the provided file, including indicating typos, if applicable.
### Versions
Versions are checked using contains checks on `semantic_version.SimpleSpec` instances.
Versions are checked using contains checks on `semantic_version.SimpleSpec`
instances. SimpleSpec supports both specific versions (`1.2.3`), non-specific
ranges (`1.0` will match `1.0.1` and `1.0.5` etc), wildcards (`1.2.*`),
and ranges (`<1.0.0`, `>=2.0.0`)
## Plugin support
Plugins may use the killswitch system simply by hosting their own version of the killswitch file, and fetching it
using `killswitch.get_kill_switches(target='https://example.com/myplugin_killswitches.json')`. The returned object can
be used to query the kill switch set, see the docstrings for more information on specifying versions.
Plugins may use the killswitch system simply by hosting their own version of the
killswitch file, and fetching it using
`killswitch.get_kill_switches(target='https://example.com/myplugin_killswitches.json')`.
The returned object can be used to query the kill switch set, see the docstrings
for more information on specifying versions.
A helper method `killswitch.get_kill_switch_thread` is provided to allow for
simple nonblocking requests for KillSwitches. It starts a new thread, performs
the HTTP request, and sends the results to the given callback.
**Note that your callback is invoked off-thread. Take precaution for locking**
**if required, and do _NOT_ use tkinter methods**
The version of the JSON file will be automatically upgraded if possible by the
code KillSwitch code. No behaviour changes will occur, any killswitches defined
in older versions will simply become unconditional kills in the new version.
## Currently supported killswitch strings
The current recognised (to EDMC and its internal plugins) killswitch strings are as follows:
| Kill Switch | Description |
| :--------------------------------------------------- | :------------------------------------------------------------------------------------------- |
| `plugins.eddn.send` | Disables all use of the send method on EDDN (effectively disables EDDN updates) |
| `plugins.(eddn\|inara\|edsm\|eddb).journal` | Disables all journal processing for EDDN/EDSM/INARA |
| `plugins.(edsm\|inara).worker` | Disables the EDSM/INARA worker thread (effectively disables updates) (does not close thread) |
| `plugins.(eddn\|inara\|edsm).journal.event.$eventname`| Specific events to disable processing for |
The current recognised (to EDMC and its internal plugins) killswitch strings are
as follows:
| Kill Switch | Supported Plugins | Description |
| :------------------------------------------- | :---------------------: | :---------------------------------------------------------------------------------------- |
| `plugins.eddn.send` | eddn | Disables all use of the send method on EDDN (effectively disables EDDN updates) |
| `plugins.<plugin>.journal` | eddn, inara, edsm, eddb | Disables all journal processing for the plugin |
| `plugins.<plugin>.worker` | edsm, *inara | Disables the plugins worker thread (effectively disables updates) (does not close thread) |
| `plugins.<plugin>.worker.<eventname>` | edsm, inara | Disables the plugin worker for the given eventname |
| `plugins.<plugin>.journal.event.<eventname>` | eddn, inara, edsm | Specific events to disable processing for. |
Killswitches marked with `*` do **not** support modification of their values via
set/redact/delete. And as such any match will simply stop processing.
For `plugin.inara.worker`, events are checked individually later by the
eventname version. Use that to modify individual inara events. This is due to
inara event batching meaning that the data that would be passed to `.worker`
would not be in a form that could be easily understood (except to blank it)
## File location
The main killswitch file is kept in the `releases` branch on the EDMC github repo. The file should NEVER be committed to
any other repos. In the case that the killswitch file is found in other repos, the one in releases should always
be taken as correct regardless of others.
The main killswitch file (`killswitches_v2.json`) is kept in the `releases`
branch on the EDMC github repo. The file should NEVER be committed to any other
repos. In the case that the killswitch file is found in other repos, the one in
releases should always be taken as correct regardless of others.
## In depth example
In a hypothetical situation where we have released version 1.0.0 with a bug that
means `FSDJump` events are not correctly stripped of extraneous data, such as
the user specific `HomeSystem` field in the `Factions` object.
The simplest way to go about this is to remove the field whenever the event is
passed to `eddn.py`s `journal_entry` function.
`journal_entry` checks against both `plugins.eddn.journal` and
`plugins.eddn.journal.event.<eventname>`. As we just want to modify a single
events handling, we can use the latter form.
The killswitch definition is as follows (this is just for this hypothetical,
it is not a full valid file, see below)
```json
{
"plugins.eddn.journal.event.FSDJump": {
"reason": "EDMC Does not correctly strip the user specific HomeSystem field from Factions",
"delete_fields": ["Factions.HomeSystem"]
}
}
```
This can be slotted into a full killswitch (using a modified version of the
example at the top of this file)
```json
{
"version": 2,
"last_updated": "23 August 2021",
"kill_switches": [{
"version": "1.0.0",
"kills": {
"plugins.eddn.journal.event.FSDJump": {
"reason": "EDMC 1.0.0 Does not correctly strip the user specific HomeSystem field from Factions",
"delete_fields": ["Factions.HomeSystem"]
}
}
}]
}
Running the above example though `killswitch_test.py` returns:
```plaintext
Kills matching version mask 1.0.0
- plugins.eddn.journal.event.FSDJump
Reason specified is: 'EDMC Does not correctly strip the user specific HomeSystem field from Factions'
The folowing changes are required for plugins.eddn.journal.event.FSDJump execution to continue
Deletes 1 fields:
- Factions.HomeSystem
```
Telling us that we have not made any typos, and that our killswitch matches the
expected version, and does the expected actions.
Now that we're sure that everything is right, we can place this in the correct
location (see above for paths). Once there, EDMC instances will begin to behave
as expected, filtering out the field during EDDN processing.
+28
View File
@@ -0,0 +1,28 @@
Copyright (c) .NET Foundation and contributors.
This software is released under the Microsoft Reciprocal License (MS-RL) (the "License"); you may not use the software except in compliance with the License.
The text of the Microsoft Reciprocal License (MS-RL) can be found online at:
http://opensource.org/licenses/ms-rl
Microsoft Reciprocal License (MS-RL)
This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.
1. Definitions
The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law.
A "contribution" is the original software, or any additions or changes to the software.
A "contributor" is any person that distributes its contribution under this license.
"Licensed patents" are a contributor's patent claims that read directly on its contribution.
2. Grant of Rights
(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.
(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.
3. Conditions and Limitations
(A) Reciprocal Grants- For any file you distribute that contains code from the software (in source code or binary format), you must provide recipients the source code to that file along with a copy of this license, which license will govern that file. You may license other files that are entirely your own work and do not contain code from the software under any terms you choose.
(B) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.
(C) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.
(D) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.
(E) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.
(F) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.
+25
View File
@@ -0,0 +1,25 @@
Copyright (c) 2009-2021 Vaclav Slavik
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
This product includes software developed by the OpenSSL Project
for use in the OpenSSL Toolkit (http://www.openssl.org/).
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,325 @@
{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033\deflangfe1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}{\f1\fswiss\fprq2\fcharset0 Tahoma;}}
{\colortbl ;\red0\green0\blue255;\red0\green0\blue0;\red255\green255\blue255;}
{\*\generator Riched20 10.0.15038}{\*\mmathPr\mdispDef1\mwrapIndent1440 }\viewkind4\uc1
\pard\widctlpar\f0\fs22\par
CREDITS AND THIRD-PARTY SOFTWARE NOTICES AND INFORMATION\par
\par
This software is based on or incorporates material from the files listed below (collectively, \ldblquote Third Party Code\rdblquote ).\~\b Please Note\b0 : Microsoft is not the original author of the Third Party Code. The URL for the original file source, the original copyright notice and the license under which Microsoft received Third Party Code are set forth below together with the full text of such license. Such notices and license are provided solely for your information. Microsoft, not the third party, licenses this Third Party Code to you under the terms set forth in the Microsoft Software License Terms for the Microsoft Windows Software Development Kit for Windows 10 (the \ldblquote Microsoft Program\rdblquote ). Unless applicable law gives you more rights, Microsoft reserves all other rights not expressly granted under this agreement, whether by implication, estoppel or otherwise. \par
\par
The Microsoft Program includes files from certain third party software developed by their respective authors, as follows:\par
\par
BERKELEY YACC NOTICES AND INFORMATION BEGIN HERE\par
Upstream source {{\field{\*\fldinst{HYPERLINK http://dickey.his.com/byacc/byacc.html }}{\fldrslt{http://dickey.his.com/byacc/byacc.html\ul0\cf0}}}}\f0\fs22\par
=========================================\par
\par
Berkeley Yacc is in the public domain; changes made to it by the current\par
maintainer are likewise unrestricted. That applies to most of the files.\par
A few files (currently those related to autoconf scripting) have other\par
licenses as noted here.\par
\par
Current byacc upstream maintainer: Thomas Dickey <dickey@invisible-island.net>\par
\par
Public domain notice and no warranty:\par
-------------------------------------------------------------------------------\par
Berkeley Yacc is an LALR(1) parser generator. Berkeley Yacc has been made\par
as compatible as possible with AT&T Yacc. Berkeley Yacc can accept any input\par
specification that conforms to the AT&T Yacc documentation. Specifications\par
that take advantage of undocumented features of AT&T Yacc will probably be\par
rejected.\par
\par
Berkeley Yacc is distributed with no warranty whatever. The code\par
is certain to contain errors. Neither the author nor any contributor\par
takes responsibility for any consequences of its use.\par
\par
Berkeley Yacc is in the public domain. The data structures and algorithms\par
used in Berkeley Yacc are all either taken from documents available to the\par
general public or are inventions of the author. Anyone may freely distribute\par
source or binary forms of Berkeley Yacc whether unchanged or modified.\par
Distributers may charge whatever fees they can obtain for Berkeley Yacc.\par
Programs generated by Berkeley Yacc may be distributed freely.\par
\par
Please report bugs to\par
\par
\tab\tab\tab robert.corbett@eng.Sun.COM\par
\par
Include a small example if possible. Please include the banner string from\par
skeleton.c with the bug report. Do not expect rapid responses.\par
=========================================\par
END OF BERKELEY YACC NOTICES AND INFORMATION\par
\par
ALLJOYN NOTICES AND INFORMATION BEGIN HERE\par
=========================================\par
%%AllSeen Alliance's AllJoyn files, available at {{\field{\*\fldinst{HYPERLINK "https://git.allseenalliance.org/gerrit/"}}{\fldrslt{\ul\cf1\cf1\ul https://git.allseenalliance.org/gerrit/#/admin/projects/}}}}\f0\fs22\par
\par
\'a9 2009-2014, AllSeen Alliance\par
\par
\pard\widctlpar\sb144\sa288\sl408\slmult1 Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\par
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\par
\pard\widctlpar ALLJOYN NOTICES AND INFORMATION END HERE\par
=========================================\par
\par
DISCUTILS NOTICES AND INFORMATION BEGIN HERE\par
\pard\widctlpar\sa200\sl276\slmult1\lang9 DiscUtils ({{\field{\*\fldinst{HYPERLINK http://discutils.codeplex.com/license }}{\fldrslt{http://discutils.codeplex.com/license\ul0\cf0}}}}\f0\fs22 )\par
\pard\widctlpar\lang1033 =========================================\par
\pard\widctlpar\sa200\sl276\slmult1\lang9 Copyright (c) 2008 Kenneth Bell\line\line Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\line\line The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\line\fs19\line THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\fs22\lang1033\par
\pard\widctlpar =========================================\par
\par
END OF DISCUTILS NOTICES AND INFORMATION\par
\par
\pard\widctlpar\sa200\sl276\slmult1 -------------------------------------------------------------------------\par
GM.DLS NOTICES AND INFORMATION BEGIN HERE\par
=========================================\par
GMREADME.TXT\par
Copyright (c) Microsoft Corporation.\~ All Rights Reserved.\par
------------\par
The GM.DLS file contains the Roland SoundCanvas Sound Set which is \par
protected under the following copyright: \par
Roland GS Sound Set/Microsoft (P) 1996 Roland Corporation U.S.\~ \par
The Roland SoundCanvas Sound Set is licensed under Microsoft's \par
End User License Agreement for use with Microsoft operating \par
system products only.\~ All other uses require a separate written \par
license from Roland.\par
\pard\widctlpar =========================================\par
\par
END OF GM.DLS NOTICES AND INFORMATION\par
___________________________________________________\par
\par
BOOST NOTICES AND INFORMATION BEGIN HERE\par
\par
============================================\par
\pard\cbpat3\widctlpar\sa100\sl252\slmult1\cf2\f1\fs20 Boost\fs18\par
\fs20 Provided for Informational Purposes Only\line\line Boost Software License - Version 1.0 - August 17th, 2003\line\line Permission is hereby granted, free of charge, to any person or organization\line obtaining a copy of the software and accompanying documentation covered by\line this license (the "Software") to use, reproduce, display, distribute,\line execute, and transmit the Software, and to prepare derivative works of the\line Software, and to permit third-parties to whom the Software is furnished to\line do so, all subject to the following:\line\line The copyright notices in the Software and this entire statement, including\line the above license grant, this restriction and the following disclaimer,\line must be included in all copies of the Software, in whole or in part, and\line all derivative works of the Software, unless such copies or derivative\line works are solely in the form of machine-executable object code generated by\line a source language processor.\line\line THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\line IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\line FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\line SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\line FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\line ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\line DEALINGS IN THE SOFTWARE.\fs18\par
=========================================\par
END OF BOOST NOTICES AND INFORMATION\par
-------------------------------------------------------------------------\par
W3C NOTICES AND INFORMATION BEGIN HERE\par
=========================================\par
W3C\par
\par
Portions of this software are based in part on the work of W3C. Because Microsoft has included the W3C software in this product, Microsoft is required to include the following text that accompanied such software:\par
W3C \'ae SOFTWARE NOTICE AND LICENSE\par
{\cf0{\field{\*\fldinst{HYPERLINK http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 }}{\fldrslt{http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231\ul0\cf0}}}}\f1\fs18\par
This work (and included software, documentation such as READMEs, or other related items) is being provided by the copyright holders under the following license. By obtaining, using and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.\par
Permission to copy, modify, and distribute this software and its documentation, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the software and documentation or portions thereof, including modifications:\par
1.\tab The full text of this NOTICE in a location viewable to users of the redistributed or derivative work. \par
2.\tab Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software Short Notice should be included (hypertext is preferred, text is permitted) within the body of any redistributed or derivative code. \par
3.\tab Notice of any changes or modifications to the files, including the date changes were made. (We recommend you provide URLs to the location from which the code is derived.) \par
THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS", AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.\par
COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.\par
The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the software without specific, written prior permission. Title to copyright in this software and any associated documentation will at all times remain with copyright holders.\par
\par
=========================================\par
END OF W3C NOTICES \par
\par
==============================================================================\par
Microsoft/DirectXShaderCompiler\par
\par
THIRD-PARTY SOFTWARE NOTICES AND INFORMATION\par
\par
Do Not Translate or Localize\par
\par
This project incorporates components from the projects listed below. The original copyright notices and the licenses under which Microsoft received such components are set forth below. Microsoft reserves all rights not expressly granted herein, whether by implication, estoppel or otherwise.\par
\par
LLVM\par
\par
==============================================================================\par
LLVM Release License\par
==============================================================================\par
University of Illinois/NCSA\par
Open Source License\par
\par
Copyright (c) 2003-2015 University of Illinois at Urbana-Champaign.\par
All rights reserved.\par
\par
Developed by:\par
\par
LLVM Team\par
\par
University of Illinois at Urbana-Champaign\par
\par
{{\field{\*\fldinst{HYPERLINK http://llvm.org }}{\fldrslt{http://llvm.org\ul0\cf0}}}}\f1\fs18\par
\par
Permission is hereby granted, free of charge, to any person obtaining a copy of\par
this software and associated documentation files (the "Software"), to deal with\par
the Software without restriction, including without limitation the rights to\par
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\par
of the Software, and to permit persons to whom the Software is furnished to do\par
so, subject to the following conditions:\par
\par
* Redistributions of source code must retain the above copyright notice,\par
this list of conditions and the following disclaimers.\par
\par
* Redistributions in binary form must reproduce the above copyright notice,\par
this list of conditions and the following disclaimers in the\par
documentation and/or other materials provided with the distribution.\par
\par
* Neither the names of the LLVM Team, University of Illinois at\par
Urbana-Champaign, nor the names of its contributors may be used to\par
endorse or promote products derived from this Software without specific\par
prior written permission.\par
\par
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\par
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\par
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\par
CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\par
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\par
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\par
SOFTWARE.\par
\par
==============================================================================\par
Copyrights and Licenses for Third Party Software Distributed with LLVM:\par
==============================================================================\par
The LLVM software contains code written by third parties. Such software will\par
have its own individual LICENSE.TXT file in the directory in which it appears.\par
This file will describe the copyrights, license, and restrictions which apply\par
to that code.\par
\par
The disclaimer of warranty in the University of Illinois Open Source License\par
applies to all code in the LLVM Distribution, and nothing in any of the\par
other licenses gives permission to use the names of the LLVM Team or the\par
University of Illinois to endorse or promote products derived from this\par
Software.\par
\par
The following pieces of software have additional or alternate copyrights,\par
licenses, and/or restrictions:\par
\par
\par
CLANG\par
\par
==============================================================================\par
LLVM Release License\par
==============================================================================\par
University of Illinois/NCSA\par
Open Source License\par
\par
Copyright (c) 2007-2015 University of Illinois at Urbana-Champaign.\par
All rights reserved.\par
\par
Developed by:\par
\par
LLVM Team\par
\par
University of Illinois at Urbana-Champaign\par
\par
{{\field{\*\fldinst{HYPERLINK http://llvm.org }}{\fldrslt{http://llvm.org\ul0\cf0}}}}\f1\fs18\par
\par
Permission is hereby granted, free of charge, to any person obtaining a copy of\par
this software and associated documentation files (the "Software"), to deal with\par
the Software without restriction, including without limitation the rights to\par
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\par
of the Software, and to permit persons to whom the Software is furnished to do\par
so, subject to the following conditions:\par
\par
* Redistributions of source code must retain the above copyright notice,\par
this list of conditions and the following disclaimers.\par
\par
* Redistributions in binary form must reproduce the above copyright notice,\par
this list of conditions and the following disclaimers in the\par
documentation and/or other materials provided with the distribution.\par
\par
* Neither the names of the LLVM Team, University of Illinois at\par
Urbana-Champaign, nor the names of its contributors may be used to\par
endorse or promote products derived from this Software without specific\par
prior written permission.\par
\par
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\par
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\par
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\par
CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\par
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\par
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\par
SOFTWARE.\par
\par
==============================================================================\par
The LLVM software contains code written by third parties. Such software will\par
have its own individual LICENSE.TXT file in the directory in which it appears.\par
This file will describe the copyrights, license, and restrictions which apply\par
to that code.\par
\par
The disclaimer of warranty in the University of Illinois Open Source License\par
applies to all code in the LLVM Distribution, and nothing in any of the\par
other licenses gives permission to use the names of the LLVM Team or the\par
University of Illinois to endorse or promote products derived from this\par
Software.\par
\par
\par
LLVM System Interface Library\par
-------------------------------------------------------------------------------\par
The LLVM System Interface Library is licensed under the Illinois Open Source\par
License and has the following additional copyright:\par
\par
Copyright (C) 2004 eXtensible Systems, Inc.\par
\par
OpenBSD regex\par
\par
$OpenBSD: COPYRIGHT,v 1.3 2003/06/02 20:18:36 millert Exp $\par
\par
Copyright 1992, 1993, 1994 Henry Spencer. All rights reserved.\par
This software is not subject to any license of the American Telephone\par
and Telegraph Company or of the Regents of the University of California.\par
\par
Permission is granted to anyone to use this software for any purpose on\par
any computer system, and to alter it and redistribute it, subject\par
to the following restrictions:\par
\par
1. The author is not responsible for the consequences of use of this\par
software, no matter how awful, even if they arise from flaws in it.\par
\par
2. The origin of this software must not be misrepresented, either by\par
explicit claim or by omission. Since few users ever read sources,\par
credits must appear in the documentation.\par
\par
3. Altered versions must be plainly marked as such, and must not be\par
misrepresented as being the original software. Since few users\par
ever read sources, credits must appear in the documentation.\par
\par
4. This notice may not be removed or altered.\par
\par
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\par
/*-\par
* Copyright (c) 1994\par
* The Regents of the University of California. All rights reserved.\par
*\par
* Redistribution and use in source and binary forms, with or without\par
* modification, are permitted provided that the following conditions\par
* are met:\par
* 1. Redistributions of source code must retain the above copyright\par
* notice, this list of conditions and the following disclaimer.\par
* 2. Redistributions in binary form must reproduce the above copyright\par
* notice, this list of conditions and the following disclaimer in the\par
* documentation and/or other materials provided with the distribution.\par
* 3. Neither the name of the University nor the names of its contributors\par
* may be used to endorse or promote products derived from this software\par
* without specific prior written permission.\par
*\par
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND\par
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\par
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\par
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE\par
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\par
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\par
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\par
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\par
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\par
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\par
* SUCH DAMAGE.\par
*\par
* @(#)COPYRIGHT 8.1 (Berkeley) 3/16/94\par
*/\par
\par
END OF THIRD-PARTY NOTICES FOR Microsoft/DirectXShaderCompiler\par
==============================================================================\par
\par
\par
For additional Microsoft Third-Party Notices see: {\cf0{\field{\*\fldinst{HYPERLINK https://aka.ms/thirdpartynotices }}{\fldrslt{https://aka.ms/thirdpartynotices\ul0\cf0}}}}\f1\fs18\par
}
+6
View File
@@ -0,0 +1,6 @@
The files source/MemoryModule.c and source/MemoryModule.h are licensed
under the Mozilla Public License Version 2.0, see
MPL2-License.txt.
All other files are licensed under the MIT/X11 License,
see MIT-License.txt.
+21
View File
@@ -0,0 +1,21 @@
Copyright (c) 2000-2021 Thomas Heller, Mark Hammond, Jimmy Retzlaff,
Alberto Sottile
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+373
View File
@@ -0,0 +1,373 @@
Mozilla Public License Version 2.0
==================================
1. Definitions
--------------
1.1. "Contributor"
means each individual or legal entity that creates, contributes to
the creation of, or owns Covered Software.
1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution.
1.3. "Contribution"
means Covered Software of a particular Contributor.
1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case
including portions thereof.
1.5. "Incompatible With Secondary Licenses"
means
(a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or
(b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the
terms of a Secondary License.
1.6. "Executable Form"
means any form of the work other than Source Code Form.
1.7. "Larger Work"
means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software.
1.8. "License"
means this document.
1.9. "Licensable"
means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License.
1.10. "Modifications"
means any of the following:
(a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered
Software; or
(b) any new file in Source Code Form that contains any Covered
Software.
1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its
Contributor Version.
1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those
licenses.
1.13. "Source Code Form"
means the form of the work preferred for making modifications.
1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity.
2. License Grants and Conditions
--------------------------------
2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:
(a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and
(b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version.
2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.
2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:
(a) for any code that a Contributor has removed from Covered Software;
or
(b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor
Version); or
(c) under Patent Claims infringed by Covered Software in the absence of
its Contributions.
This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).
2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).
2.5. Representation
Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use
This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.
2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.
3. Responsibilities
-------------------
3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.
3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).
3.4. Notices
You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.
4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.
5. Termination
--------------
5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.
************************************************************************
* *
* 6. Disclaimer of Warranty *
* ------------------------- *
* *
* Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. *
* *
************************************************************************
************************************************************************
* *
* 7. Limitation of Liability *
* -------------------------- *
* *
* Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. *
* *
************************************************************************
8. Litigation
-------------
Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.
9. Miscellaneous
----------------
This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.
10. Versions of the License
---------------------------
10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.
10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.
10.3. Modified Versions
If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses
If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice
-------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.
You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0.
@@ -0,0 +1,21 @@
This package contains a modified version of ca-bundle.crt:
ca-bundle.crt -- Bundle of CA Root Certificates
Certificate data from Mozilla as of: Thu Nov 3 19:04:19 2011#
This is a bundle of X.509 certificates of public Certificate Authorities
(CA). These were automatically extracted from Mozilla's root certificates
file (certdata.txt). This file can be found in the mozilla source tree:
http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1#
It contains the certificates in PEM format and therefore
can be directly used with curl / libcurl / php_curl, or with
an Apache+mod_ssl webserver for SSL client authentication.
Just configure this file as the SSLCACertificateFile.#
***** BEGIN LICENSE BLOCK *****
This Source Code Form is subject to the terms of the Mozilla Public License,
v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain
one at http://mozilla.org/MPL/2.0/.
***** END LICENSE BLOCK *****
@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019 TAHRI Ahmed R.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -0,0 +1,29 @@
BSD 3-Clause License
Copyright (c) 2013-2021, Kim Davies
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,30 @@
Unless stated in the specfic source file, this work is
Copyright (c) 1994-2008, Mark Hammond
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the distribution.
Neither name of Mark Hammond nor the name of contributors may be used
to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,20 @@
License for Scintilla and SciTE
Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation.
NEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
OR PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,505 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
@@ -0,0 +1,30 @@
Unless stated in the specfic source file, this work is
Copyright (c) 1996-2008, Greg Stein and Mark Hammond.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the distribution.
Neither names of Greg Stein, Mark Hammond nor the name of contributors may be used
to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,30 @@
Unless stated in the specfic source file, this work is
Copyright (c) 1994-2008, Mark Hammond
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the distribution.
Neither name of Mark Hammond nor the name of contributors may be used
to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,175 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
@@ -0,0 +1,22 @@
Copyright (c) The python-semanticversion project
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2008-2020 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -0,0 +1,14 @@
Copyright 2011 Yesudeep Mangalapilly <yesudeep@gmail.com>
Copyright 2012 Google, Inc & contributors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
@@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+649
View File
@@ -0,0 +1,649 @@
A. HISTORY OF THE SOFTWARE
==========================
Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC. Guido remains Python's
principal author, although it includes many contributions from others.
In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.
In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team. In October of the same
year, the PythonLabs team moved to Digital Creations, which became
Zope Corporation. In 2001, the Python Software Foundation (PSF, see
https://www.python.org/psf/) was formed, a non-profit organization
created specifically to own Python-related Intellectual Property.
Zope Corporation was a sponsoring member of the PSF.
All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition). Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.
Release Derived Year Owner GPL-
from compatible? (1)
0.9.0 thru 1.2 1991-1995 CWI yes
1.3 thru 1.5.2 1.2 1995-1999 CNRI yes
1.6 1.5.2 2000 CNRI no
2.0 1.6 2000 BeOpen.com no
1.6.1 1.6 2001 CNRI yes (2)
2.1 2.0+1.6.1 2001 PSF no
2.0.1 2.0+1.6.1 2001 PSF yes
2.1.1 2.1+2.0.1 2001 PSF yes
2.1.2 2.1.1 2002 PSF yes
2.1.3 2.1.2 2002 PSF yes
2.2 and above 2.1.1 2001-now PSF yes
Footnotes:
(1) GPL-compatible doesn't mean that we're distributing Python under
the GPL. All Python licenses, unlike the GPL, let you distribute
a modified version without making your changes open source. The
GPL-compatible licenses make it possible to combine Python with
other software that is released under the GPL; the others don't.
(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
because its license has a choice of law clause. According to
CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
is "not incompatible" with the GPL.
Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.
B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================
Python software and documentation are licensed under the
Python Software Foundation License Version 2.
Starting with Python 3.8.6, examples, recipes, and other code in
the documentation are dual licensed under the PSF License Version 2
and the Zero-Clause BSD license.
Some software incorporated into Python is under different licenses.
The licenses are listed with code falling under that license.
PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------
1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.
2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Python Software Foundation;
All Rights Reserved" are retained in Python alone or in any derivative version
prepared by Licensee.
3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.
4. PSF is making Python available to Licensee on an "AS IS"
basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.
5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.
7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee. This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.
8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.
BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------
BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").
2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.
3. BeOpen is making the Software available to Licensee on an "AS IS"
basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.
4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.
6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions. Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee. This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party. As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.
7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.
CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------
1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.
2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee. Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement. This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013. This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".
3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.
4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.
5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.
7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee. This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.
8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.
ACCEPT
CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------
Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands. All rights reserved.
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.
STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION
----------------------------------------------------------------------
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
Additional Conditions for this Windows binary build
---------------------------------------------------
This program is linked with and uses Microsoft Distributable Code,
copyrighted by Microsoft Corporation. The Microsoft Distributable Code
is embedded in each .exe, .dll and .pyd file as a result of running
the code through a linker.
If you further distribute programs that include the Microsoft
Distributable Code, you must comply with the restrictions on
distribution specified by Microsoft. In particular, you must require
distributors and external end users to agree to terms that protect the
Microsoft Distributable Code at least as much as Microsoft's own
requirements for the Distributable Code. See Microsoft's documentation
(included in its developer tools and on its website at microsoft.com)
for specific details.
Redistribution of the Windows binary build of the Python interpreter
complies with this agreement, provided that you do not:
- alter any copyright, trademark or patent notice in Microsoft's
Distributable Code;
- use Microsoft's trademarks in your programs' names or in a way that
suggests your programs come from or are endorsed by Microsoft;
- distribute Microsoft's Distributable Code to run on a platform other
than Microsoft operating systems, run-time technologies or application
platforms; or
- include Microsoft Distributable Code in malicious, deceptive or
unlawful programs.
These restrictions apply only to the Microsoft Distributable Code as
defined above, not to Python itself or any programs running on the
Python interpreter. The redistribution of the Python interpreter and
libraries is governed by the Python Software License included with this
file, or by other licenses as marked.
--------------------------------------------------------------------------
This program, "bzip2", the associated library "libbzip2", and all
documentation, are copyright (C) 1996-2010 Julian R Seward. All
rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. The origin of this software must not be misrepresented; you must
not claim that you wrote the original software. If you use this
software in a product, an acknowledgment in the product
documentation would be appreciated but is not required.
3. Altered source versions must be plainly marked as such, and must
not be misrepresented as being the original software.
4. The name of the author may not be used to endorse or promote
products derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Julian Seward, jseward@bzip.org
bzip2/libbzip2 version 1.0.6 of 6 September 2010
--------------------------------------------------------------------------
LICENSE ISSUES
==============
The OpenSSL toolkit stays under a double license, i.e. both the conditions of
the OpenSSL License and the original SSLeay license apply to the toolkit.
See below for the actual license texts.
OpenSSL License
---------------
/* ====================================================================
* Copyright (c) 1998-2019 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* openssl-core@openssl.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
Original SSLeay License
-----------------------
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
* by Eric Young (eay@cryptsoft.com).
* The implementation was written so as to conform with Netscapes SSL.
*
* This library is free for commercial and non-commercial use as long as
* the following conditions are aheared to. The following conditions
* apply to all code found in this distribution, be it the RC4, RSA,
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
* included with this distribution is covered by the same copyright terms
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
*
* Copyright remains Eric Young's, and as such any Copyright notices in
* the code are not to be removed.
* If this package is used in a product, Eric Young should be given attribution
* as the author of the parts of the library used.
* This can be in the form of a textual message at program startup or
* in documentation (online or textual) provided with the package.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* "This product includes cryptographic software written by
* Eric Young (eay@cryptsoft.com)"
* The word 'cryptographic' can be left out if the rouines from the library
* being used are not cryptographic related :-).
* 4. If you include any Windows specific code (or a derivative thereof) from
* the apps directory (application code) you must include an acknowledgement:
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
*
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* The licence and distribution terms for any publically available version or
* derivative of this code cannot be changed. i.e. this code cannot simply be
* copied and put under another distribution licence
* [including the GNU Public Licence.]
*/
libffi - Copyright (c) 1996-2014 Anthony Green, Red Hat, Inc and others.
See source files for details.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
``Software''), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
This software is copyrighted by the Regents of the University of
California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState
Corporation and other parties. The following terms apply to all files
associated with the software unless explicitly disclaimed in
individual files.
The authors hereby grant permission to use, copy, modify, distribute,
and license this software and its documentation for any purpose, provided
that existing copyright notices are retained in all copies and that this
notice is included verbatim in any distributions. No written agreement,
license, or royalty fee is required for any of the authorized uses.
Modifications to this software may be copyrighted by their authors
and need not follow the licensing terms described here, provided that
the new terms are clearly indicated on the first page of each file where
they apply.
IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
MODIFICATIONS.
GOVERNMENT USE: If you are acquiring this software on behalf of the
U.S. government, the Government shall have only "Restricted Rights"
in the software and related documentation as defined in the Federal
Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you
are acquiring the software on behalf of the Department of Defense, the
software shall be classified as "Commercial Computer Software" and the
Government shall have only "Restricted Rights" as defined in Clause
252.227-7014 (b) (3) of DFARs. Notwithstanding the foregoing, the
authors grant the U.S. Government and others acting in its behalf
permission to use and distribute the software in accordance with the
terms specified in this license.
This software is copyrighted by the Regents of the University of
California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState
Corporation, Apple Inc. and other parties. The following terms apply to
all files associated with the software unless explicitly disclaimed in
individual files.
The authors hereby grant permission to use, copy, modify, distribute,
and license this software and its documentation for any purpose, provided
that existing copyright notices are retained in all copies and that this
notice is included verbatim in any distributions. No written agreement,
license, or royalty fee is required for any of the authorized uses.
Modifications to this software may be copyrighted by their authors
and need not follow the licensing terms described here, provided that
the new terms are clearly indicated on the first page of each file where
they apply.
IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
MODIFICATIONS.
GOVERNMENT USE: If you are acquiring this software on behalf of the
U.S. government, the Government shall have only "Restricted Rights"
in the software and related documentation as defined in the Federal
Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you
are acquiring the software on behalf of the Department of Defense, the
software shall be classified as "Commercial Computer Software" and the
Government shall have only "Restricted Rights" as defined in Clause
252.227-7013 (b) (3) of DFARs. Notwithstanding the foregoing, the
authors grant the U.S. Government and others acting in its behalf
permission to use and distribute the software in accordance with the
terms specified in this license.
Copyright (c) 1993-1999 Ioi Kim Lam.
Copyright (c) 2000-2001 Tix Project Group.
Copyright (c) 2004 ActiveState
This software is copyrighted by the above entities
and other parties. The following terms apply to all files associated
with the software unless explicitly disclaimed in individual files.
The authors hereby grant permission to use, copy, modify, distribute,
and license this software and its documentation for any purpose, provided
that existing copyright notices are retained in all copies and that this
notice is included verbatim in any distributions. No written agreement,
license, or royalty fee is required for any of the authorized uses.
Modifications to this software may be copyrighted by their authors
and need not follow the licensing terms described here, provided that
the new terms are clearly indicated on the first page of each file where
they apply.
IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
MODIFICATIONS.
GOVERNMENT USE: If you are acquiring this software on behalf of the
U.S. government, the Government shall have only "Restricted Rights"
in the software and related documentation as defined in the Federal
Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you
are acquiring the software on behalf of the Department of Defense, the
software shall be classified as "Commercial Computer Software" and the
Government shall have only "Restricted Rights" as defined in Clause
252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the
authors grant the U.S. Government and others acting in its behalf
permission to use and distribute the software in accordance with the
terms specified in this license.
----------------------------------------------------------------------
Parts of this software are based on the Tcl/Tk software copyrighted by
the Regents of the University of California, Sun Microsystems, Inc.,
and other parties. The original license terms of the Tcl/Tk software
distribution is included in the file docs/license.tcltk.
Parts of this software are based on the HTML Library software
copyrighted by Sun Microsystems, Inc. The original license terms of
the HTML Library software distribution is included in the file
docs/license.html_lib.
+180 -126
View File
@@ -1,6 +1,15 @@
# Introduction
This document aims to enable anyone to quickly get up to speed on how to:
Builds can, **and must in normal operation** be run automatically from GitHub
Actions. For more information on that process
see [Automatic Builds](https://github.com/EDCD/EDMarketConnector/blob/main/docs/Automatic%20Builds.md).
This allows us to state that the files we distribute never touched anything
but GitHub servers before a user downloaded them, which means no
possibility of malware on a developer's machine infecting the resulting files.
Obviously you might still need to run a manual build on your own hardware
in order to test changes and/or diagnose build issues. As such
this document aims to enable anyone to quickly get up to speed on how to:
1. Build a Windows .exe for the application
1. Package that .exe into an .msi file for distribution
@@ -10,7 +19,6 @@ This document aims to enable anyone to quickly get up to speed on how to:
Note that for Windows only a 32-bit application is supported at this time.
This is principally due to the Windows Registry handling in config.py.
Builds can be run automatically from GitHub Actions. For more information on that process, see [Automatic Builds](https://github.com/EDCD/EDMarketConnector/blob/main/docs/Automatic%20Builds.md).
# Environment
@@ -41,14 +49,14 @@ You will need several pieces of software installed, or the files from their
`requirements-dev.txt`.
1. You'll now need to 'pip install' several python modules.
1. Ensure you have `pip` installed. If needs be see
[Installing pip](https://pip.pypa.io/en/stable/installing/)
1. The easiest way is to utilise the `requirements-dev.txt` file:
`python -m pip install --user -r requirements-dev.txt`. This will install
all dependencies plus anything required for development.
1. Else check the contents of both `requirements.txt` and `requirements-dev.txt`,
and ensure the modules listed there are installed as per the version
requirements.
1. Ensure you have `pip` installed. If needs be see
[Installing pip](https://pip.pypa.io/en/stable/installing/)
1. The easiest way is to utilise the `requirements-dev.txt` file:
`python -m pip install --user -r requirements-dev.txt`. This will install
all dependencies plus anything required for development.
1. Else check the contents of both `requirements.txt` and `requirements-dev.txt`,
and ensure the modules listed there are installed as per the version
requirements.
If you are using different versions of any of these tools then please ensure
that the paths where they're installed match the associated lines in
@@ -71,7 +79,7 @@ version strings.
a wider audience to test forthcoming changes.
1. `-rc<serial>`, i.e. `-rc1`. This is used when testing has shown this
code should be ready for full release, but you want even wider testing.
In both these cases simply increment `<serial>` for each new release. *Do*
start from `1` again when beginning `-rc` releases.
@@ -80,6 +88,7 @@ version strings.
There are some things that you should always change before running your own
version of EDMC
1. The Frontier CAPI client ID. This is hardcoded in companion.py, but can be
overridden by setting a CLIENT_ID environment variable.
@@ -96,34 +105,36 @@ that.
1. Application names, version and URL of the file with latest release
information. These are all in the `config.py` file. See the
`from config import ...` lines in setup.py.
1. `appname`: The short appname, e.g. 'EDMarketConnector'
1. `applongname`: The long appname, e.g. 'E:D Market Connector'
1. `appcmdname`: The CLI appname, e.g. 'EDMC'
1. `appversion`: The current version, e.g. `4.0.2`. **You MUST make
this something like `4.0.2+<myversion>` to differentiate it from
upstream.** Whatever is in this field is what will be reported if
sending messages to EDDN, or any of the third-party website APIs.
This is utilising the 'build metadata' part of a Semantic version.
1. `copyright`: The Copyright string.
1. `update_feed`: The URL where the application looks for current latest
version information. This URL should be hosting a renamed (so the full
URL doesn't change over application versions) version of the
appcast_win_<version>.xml file. The original upstream value is
`https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/edmarketconnector.xml`.
1. Location of release files. This needs to be cited correctly in the
1. `appname`: The short appname, e.g. 'EDMarketConnector'
2. `applongname`: The long appname, e.g. 'E:D Market Connector'
3. `appcmdname`: The CLI appname, e.g. 'EDMC'
4. `_static_appversion`: The current version, e.g. `4.0.2`. **You MUST
make this something like `4.0.2+<myversion>` to differentiate it from
upstream.** Whatever is in this field is what will be reported if
sending messages to EDDN, or any of the third-party website APIs.
This is utilising the 'build metadata' part of a Semantic version.
5. `copyright`: The Copyright string.
6. `update_feed`: The URL where the application looks for current latest
version information. This URL should be hosting a renamed (so the full
URL doesn't change over application versions) version of the
appcast_win_<version>.xml file. The original upstream value is
`https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/edmarketconnector.xml`.
2. Location of release files. This needs to be cited correctly in the
`edmarketconnector.xml` file, which is what the application queries to
see if there is a newer version.
Look for the `url="...` line in the `<enclosure ...` that is like:
<enclosure
url="https://github.com/EDCD/EDMarketConnector/releases/download/Release/4.2.3/EDMarketConnector_win_4.2.3.msi"
sparkle:os="windows"
sparkle:installerArguments="/passive LAUNCH=yes"
sparkle:version="4.2.3"
length="11382784"
type="application/octet-stream"
/>
```xml
<enclosure
url="https://github.com/EDCD/EDMarketConnector/releases/download/Release/4.2.3/EDMarketConnector_win_4.2.3.msi"
sparkle:os="windows"
sparkle:installerArguments="/passive LAUNCH=yes"
sparkle:version="4.2.3"
length="11382784"
type="application/octet-stream"
/>
```
## Adding a new file
@@ -142,28 +153,33 @@ You will *also* need to add the file to the `EDMarketConnector.wxs` file so
that it's actually included in the installer.
1. Location the the appropriate part of the:
```xml
<Directory Id="ProgramFilesFolder">
```
section and add a new sub-section:
```xml
<Component Id="<valid_component_id>" Guid=""*">
<File KeyPath="yes" Source="SourceDir\\<file name>" />
</Component>
```
Note that you only need `Id="<valid_component_id>"` if the filename itself
is not a valid Id, e.g. because it contains spaces.
If the new file is in a new sub-directory then you'll need to add that as
well. See the `L10n` example.
1. Now find the:
2. Now find the:
```xml
<Feature Id='Complete' Level='1'>
```
section and add an appropriate line to it. Remember to use either the
specific Id you set above or the filename (without directory) for this:
```xml
<ComponentRef Id="<valid_component_id>" />
```
@@ -193,10 +209,10 @@ which branch (stable or beta) you'll be ultimately updating.
1. So as to make backing out any mistakes easier create a new branch for this
release, using a name like `release-4.0.2`. Do not use the tag
`Release/4.0.2` form, that could cause confusion.
1. `git checkout stable` # Or whichever other branch is appropriate.
1. `git pull origin` # Ensures local branch is up to date.
1. `git checkout -b release-4.0.2`
1. `git checkout stable` # Or whichever other branch is appropriate.
1. `git pull origin` # Ensures local branch is up to date.
1. `git checkout -b release-4.0.2`
1. Get all the relevant code changes into this branch. This might mean
merging from another branch, such as an issue-specific one, or possibly
cherry-picking commits. See [Contributing Guidelines](../Contributing.md)
@@ -210,25 +226,12 @@ commit for this change.**
1. Prepare a changelog text for the release. You'll need this both for the
GitHub release and the contents of the `edmarketconnector.xml` file if making
a `stable` release, as well as any social media posts you make.
1. The primary location of the changelog is [Changelog.md](../Changelog.md) -
update this first.
1. To be sure you include all the changes look at the git log since the
prior appropriate (pre-)release.
1. **Only if making a `stable` release.** Update `edmarketconnector.xml` to
add this changelog text to the correct section(s).
1. Use the following to generate HTML from the MarkDown (`pip
install grip` first if you need to):
grip ChangeLog.md --export ChangeLog.html
1. If there's still a Mac OS section scroll down past it to the Windows
section.
1. You'll need to change the `<title>` and `<description>` texts to
reflect the latest version and the additional changelog.
1. Update the `url` and `sparkle:version` elements of the `<enclosure>`
section. **NB: Yes, sparkle:version should be the Semantic Version
string, not the Windows A.B.C.D form.**
1. As you're working in a version-specific branch, `release-4.0.2`, you
can safely commit these changes and push to GitHub.
1. The primary location of the changelog is [Changelog.md](../Changelog.md) -
update this first.
1. To be sure you include all the changes look at the git log since the
prior appropriate (pre-)release.
1. As you're working in a version-specific branch, `release-4.0.2`, you
can safely commit these changes and push to GitHub.
**Do not merge the branch with `releases` until the GitHub release is in place.**
If you're wondering, you needed to get the changelog prepared before building
@@ -240,7 +243,10 @@ the .exe and .msi because ChangeLog.md is bundled with the install.
If anything in this new release addresses a bug that causes, e.g. bad data
to be sent over EDDN, then you should add an appropriate entry to the
killswitches.json file *in the `releases` branch*. That file **must only ever
be commited to the `releases` branch!!!** See [docs/Killswitches.md](Killswitches.md).
be committed to the `releases` branch!!!** See [docs/Killswitches.md](Killswitches.md).
Killswitch files can and should be verified using the `killswitch_test.py`
script in the `scripts` directory
# Packaging & Installer Generation
@@ -249,36 +255,44 @@ a 'Git bash' window. The 'Terminal' tab of PyCharm works fine.
Assuming the correct python.exe is associated with .py files then simply run:
setup.py py2exe
```batch
setup.py py2exe
```
else you might need this, which assumes correct python.exe is in your PATH:
python.exe setup.py py2exe
```batch
python.exe setup.py py2exe
```
else you'll have to specify the path to python.exe, e.g.:
"C:\Program Files \(x86)\Python38-32\python.exe" setup.py py2exe
```batch
"C:\Program Files \(x86)\Python38-32\python.exe" setup.py py2exe
```
Output will be something like (`...` denoting parts elided for brevity):
running py2exe
...
Building 'dist.win32\EDMC.exe'.
Building 'dist.win32\EDMarketConnector.exe'.
Building shared code archive 'dist.win32\library.zip'.
...
Windows Installer XML Toolset Compiler version 3.11.1.2318
Copyright (c) .NET Foundation and contributors. All rights reserved.
...
Package language = 1033,1029,1031,1034,1035,1036,1038,1040,1041,1043,1045,1046,1049,1058,1062,2052,2070,2074,0, ProductLanguage = 1029, Database codepage = 0
MsiTran V 5.0
Copyright (c) Microsoft Corporation. All Rights Reserved
...
DonePackage language = 1033,1029,1031,1034,1035,1036,1038,1040,1041,1043,1045,1046,1049,1058,1062,2052,2070,2074,0, ProductLanguage = 0, Database codepage = 0
MsiTran V 5.0
Copyright (c) Microsoft Corporation. All Rights Reserved
```plaintext
running py2exe
...
Building 'dist.win32\EDMC.exe'.
Building 'dist.win32\EDMarketConnector.exe'.
Building shared code archive 'dist.win32\library.zip'.
...
Windows Installer XML Toolset Compiler version 3.11.1.2318
Copyright (c) .NET Foundation and contributors. All rights reserved.
...
Package language = 1033,1029,1031,1034,1035,1036,1038,1040,1041,1043,1045,1046,1049,1058,1062,2052,2070,2074,0, ProductLanguage = 1029, Database codepage = 0
MsiTran V 5.0
Copyright (c) Microsoft Corporation. All Rights Reserved
...
DonePackage language = 1033,1029,1031,1034,1035,1036,1038,1040,1041,1043,1045,1046,1049,1058,1062,2052,2070,2074,0, ProductLanguage = 0, Database codepage = 0
MsiTran V 5.0
Copyright (c) Microsoft Corporation. All Rights Reserved
Done
Done
```
**Do check the output** for things like not properly specifying extra files
to be included in the install. If they're not picked up by current rules in
@@ -304,61 +318,100 @@ The git commit for this should end up being the release tag as below.
# Distribution
Once you have tested the new .msi file:
Whether you built it manually or automatically you **MUST** test the `.msi`
installer file prior to making the release live.
Once that is done then for manually built installers:
1. Add a git tag for the release, which you'll refer to when actually creating
the release:
1. This should be named `Release/A.B.C`, e.g. `Release/4.0.2.` as per
the version string.
the release:
1. This should be named `Release/A.B.C`, e.g. `Release/4.0.2.` as per
the version string.
1. Now push the release-specific branch to GitHub.
1. Check which of your remotes is for github with `git remotes -v`. It
should really be `origin` and the following assumes that.
1. `git push --set-upstream --tags origin release-4.0.2`
**Do NOT add this tag until you're sure you're ready. Pushing a tag to
GitHub that matches the pattern `Release/*` (double-check this in
[the GitHub Windows Build Action file](../.github/workflows/windows-build.yml))
will cause an auto-build and creation of a draft release.**
1. Merge the release-specific branch into the appropriate `stable` or `beta`
Yes, this does mean you should really just be using this auto-build setup
when creating an installer for release to users. You'll at least need to
edit the draft release that it creates:
1. Swap out its `.msi` for the one that you built.
2. Create a matching `hashes.sum` file for your `.msi` file:
sha256sum EDMarketConnector_win*.msi > ./hashes.sum
and replace the one in the draft release with this.
But, **again, you should just be using the auto-build
mechanism**.
3. Now push the release-specific branch to GitHub.
1. Check which of your remotes is for github with `git remotes -v`. It
should really be `origin` and the following assumes that.
1. `git push --set-upstream --tags origin release-4.0.2`
4. Merge the release-specific branch into the appropriate `stable` or `beta`
branch. You can either do this locally and push the changes, or do it on
GitHub. You'll want to reference `stable` or `beta` in the next step, *not
the release-4.0.2 branch, as it's temporary.*
1. Craft a [new github Release](https://github.com/EDCD/EDMarketConnector/releases/new),
5. **You should no longer need to manually create a release, due to
auto-building of any release tag, but you'll probably still need to edit
in the ChangeLog, so...**
Craft a [new github Release](https://github.com/EDCD/EDMarketConnector/releases/new),
1. Use the new tag so as to reference the correct commit, along with the
appropriate `stable` or `beta` branch as the 'Target'.
1. Use the changelog text you already prepared to fill in the 'Release
2. Use the changelog text you already prepared to fill in the 'Release
title' and description.
1. Attach the `EDMarketConnector_win_<version>.msi` file for Windows (the
3. Attach the `EDMarketConnector_win_<version>.msi` file for Windows (the
Source Code files are added by github based on the release tag).
1. **If you are making a `beta` or otherwise pre-release you MUST tick the
4. **If you are making a `beta` or otherwise pre-release you MUST tick the
`[ ] This is a pre-release` box.** Not doing so will cause this release
to be point to by the 'latest' URL.
to be pointed to by the 'latest' URL.
5. We always create a discussion for any new release, so tick the
`Create a discussion for this release` box, and check it's targeted at
the `Announcement` category.
1. **Check that the URL for the release that you specified in
`edmarketconnector.xml` actually matches where github has placed the `EDMarketConnector_win_<version>.msi`
file.** If, for instance, you fail to *update* this URL then upon running the
'new' installer it will silently fail, because you made people try to install
the old version over the old version.
Once the release is created, then **only if making a `stable` release**
update `edmarketconnector.xml` **in the `releases` branch only** to add this
changelog text to the correct section(s):
1. `git checkout releases`
2. `git merge stable` - You should have merged the new release branch
into `stable` above.
3. Use the following to generate HTML from the MarkDown (`pip
install grip` first if you need to):
`grip --export ChangeLog.md`
Fix it if needs be and make a new commit. It's only in the `edmarketconnector.xml`
file so no need to redo the build. As this file is only important in the
`releases` branch you also don't need to redo the GitHub release, i.e.
the release tag doesn't need updating to point to this new commit.
4. Open `edmarketconnector.xml` in your editor.
5. If there's still a Mac OS section croll down past it to the Windows
section.
6. You'll need to change the `<title>` and `<description>` texts to
reflect the latest version and the additional changelog.
7. Update the `url` and `sparkle:version` elements of the `<enclosure>`
section.
1. The `url` needs to match what GitHub created in the Release for the
`.msi` file. Check it!
1. **Now merge the new release branch into `releases`.**
This is the final step that fully publishes the release for running
EDMC instances to pick up on 'Check for Updates'. The WinSparkle check for
updates specifically targets
If, for instance, you fail to *update* this URL then upon running the 'new'
installer it will silently fail, because you made people try to install
the old version over the old version.
2. Yes, `sparkle:version` should be the Semantic Version string,
not the Windows A.B.C.D form.
8. `git push origin`
This is the final step that fully publishes the release for running
EDMC instances to pick up on 'Check for Updates'. The WinSparkle check for
updates specifically targets:
`https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/edmarketconnector.xml`
as per `config.py` `update_feed`.
1. `git checkout releases`
1. `git merge release-4.0.2`
1. `git push origin`
(Or merge on GitHub).
NB: It can take some time for GitHub to show the changed
edmarketconnector.xml contents to all users.
as per `config.py` `update_feed`.
NB: It can take some time for GitHub to show the changed
edmarketconnector.xml contents to all users.
**You should now update [Known Issues](https://github.com/EDCD/EDMarketConnector/issues/618)
to reflect anything now fixed in latest release.**
@@ -367,8 +420,9 @@ to reflect anything now fixed in latest release.**
If you are making a pre-release then:
1. **DO NOT** Edit edmarketconnector.xml at all. No, not even if you think you
won't accidentally merge it into `releases`. Just don't change it at all.
1. **DO NOT** Edit `edmarketconnector.xml` at all. No, not even if you
think you won't accidentally merge it into `releases`. Just don't change it
at all.
1. **DO NOT** merge into `releases`.
1. **DO NOT** merge into `stable`.
1. *Do* merge the code into `beta` after you have made a 'pre-release' on
@@ -384,11 +438,11 @@ When changing the Python version (Major.Minor.Patch) used:
1. `.github/workflows/windows-build.yml` needs updating to have the GitHub
based build use the correct version.
1. Major or Minor level changes:
1. `setup.py` will need its version check updating.
1. `EDMarketConnector.wxs` will need updating to reference the correct
2. `EDMarketConnector.wxs` will need updating to reference the correct
pythonXX.dll file.
1. `.pre-commit-config.yaml` will need the `default_language_version`
3. `.pre-commit-config.yaml` will need the `default_language_version`
section updated to the appropriate version.
+10 -10
View File
@@ -56,7 +56,7 @@ class JournalLock:
def open_journal_dir_lockfile(self) -> bool:
"""Open journal_dir lockfile ready for locking."""
self.journal_dir_lockfile_name = self.journal_dir_path / 'edmc-journal-lock.txt' # type: ignore
logger.trace(f'journal_dir_lockfile_name = {self.journal_dir_lockfile_name!r}')
logger.trace_if('journal-lock', f'journal_dir_lockfile_name = {self.journal_dir_lockfile_name!r}')
try:
self.journal_dir_lockfile = open(self.journal_dir_lockfile_name, mode='w+', encoding='utf-8')
@@ -95,7 +95,7 @@ class JournalLock:
:return: LockResult - See the class Enum definition
"""
if platform == 'win32':
logger.trace('win32, using msvcrt')
logger.trace_if('journal-lock', 'win32, using msvcrt')
# win32 doesn't have fcntl, so we have to use msvcrt
import msvcrt
@@ -108,7 +108,7 @@ class JournalLock:
return JournalLockResult.ALREADY_LOCKED
else: # pytest coverage only sees this on !win32
logger.trace('NOT win32, using fcntl')
logger.trace_if('journal-lock', 'NOT win32, using fcntl')
try:
import fcntl
@@ -128,7 +128,7 @@ class JournalLock:
self.journal_dir_lockfile.write(f"Path: {self.journal_dir}\nPID: {os_getpid()}\n")
self.journal_dir_lockfile.flush()
logger.trace('Done')
logger.trace_if('journal-lock', 'Done')
self.locked = True
return JournalLockResult.LOCKED
@@ -144,7 +144,7 @@ class JournalLock:
unlocked = False
if platform == 'win32':
logger.trace('win32, using msvcrt')
logger.trace_if('journal-lock', 'win32, using msvcrt')
# win32 doesn't have fcntl, so we have to use msvcrt
import msvcrt
@@ -161,7 +161,7 @@ class JournalLock:
unlocked = True
else: # pytest coverage only sees this on !win32
logger.trace('NOT win32, using fcntl')
logger.trace_if('journal-lock', 'NOT win32, using fcntl')
try:
import fcntl
@@ -235,19 +235,19 @@ class JournalLock:
def retry(self) -> None:
"""Handle user electing to Retry obtaining the lock."""
logger.trace('User selected: Retry')
logger.trace_if('journal-lock_if', 'User selected: Retry')
self.destroy()
self.callback(True, self.parent)
def ignore(self) -> None:
"""Handle user electing to Ignore failure to obtain the lock."""
logger.trace('User selected: Ignore')
logger.trace_if('journal-lock', 'User selected: Ignore')
self.destroy()
self.callback(False, self.parent)
def _destroy(self) -> None:
"""Destroy the Retry/Ignore popup."""
logger.trace('User force-closed popup, treating as Ignore')
logger.trace_if('journal-lock', 'User force-closed popup, treating as Ignore')
self.ignore()
def update_lock(self, parent: tk.Tk) -> None:
@@ -277,7 +277,7 @@ class JournalLock:
:param retry: - does the user want to retry? Comes from the dialogue choice.
:param parent: - The parent tkinter window.
"""
logger.trace(f'We should retry: {retry}')
logger.trace_if('journal-lock', f'We should retry: {retry}')
if not retry:
return
+355 -41
View File
@@ -1,54 +1,236 @@
"""Fetch kill switches from EDMC Repo."""
from typing import Dict, List, NamedTuple, Optional, Union, cast
from __future__ import annotations
import threading
from copy import deepcopy
from typing import (
TYPE_CHECKING, Any, Callable, Dict, List, Mapping, MutableMapping, MutableSequence, NamedTuple, Optional, Sequence,
Tuple, TypedDict, TypeVar, Union, cast
)
import requests
import semantic_version
from semantic_version.base import Version
import config
import EDMCLogging
logger = EDMCLogging.get_main_logger()
DEFAULT_KILLSWITCH_URL = 'https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/killswitches.json'
OLD_KILLSWITCH_URL = 'https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/killswitches.json'
DEFAULT_KILLSWITCH_URL = 'https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/killswitches_v2.json'
CURRENT_KILLSWITCH_VERSION = 2
UPDATABLE_DATA = Union[Mapping, Sequence]
_current_version: semantic_version.Version = config.appversion_nobuild()
T = TypeVar('T', bound=UPDATABLE_DATA)
class KillSwitch(NamedTuple):
class SingleKill(NamedTuple):
"""A single KillSwitch. Possibly with additional rules."""
match: str
reason: str
redact_fields: Optional[List[str]] = None
delete_fields: Optional[List[str]] = None
set_fields: Optional[Dict[str, Any]] = None
@property
def has_rules(self) -> bool:
"""Return whether or not this SingleKill can apply rules to a dict to make it safe to use."""
return any(x is not None for x in (self.redact_fields, self.delete_fields, self.set_fields))
def apply_rules(self, target: T) -> T:
"""
Apply the rules this SingleKill instance has to make some data okay to send.
Note that this MODIFIES DATA IN PLACE.
:param target: data to apply a rule to
:raises: Any and all exceptions _deep_apply and _apply can raise.
"""
for key, value in (self.set_fields if self .set_fields is not None else {}).items():
_deep_apply(target, key, value)
for key in (self.redact_fields if self.redact_fields is not None else []):
_deep_apply(target, key, "REDACTED")
for key in (self.delete_fields if self.delete_fields is not None else []):
_deep_apply(target, key, delete=True)
return target
def _apply(target: UPDATABLE_DATA, key: str, to_set: Any = None, delete: bool = False):
"""
Set or delete the given target key on the given target.
:param target: The thing to set data on
:param key: the key or index to set the data to
:param to_set: the data to set, if any, defaults to None
:param delete: whether or not to delete the key or index, defaults to False
:raises ValueError: when an unexpected target type is passed
:raises IndexError: when an invalid index is set or deleted
"""
if isinstance(target, MutableMapping):
if delete:
target.pop(key, None)
else:
target[key] = to_set
elif isinstance(target, MutableSequence):
idx = _get_int(key)
if idx is None:
raise ValueError(f'Cannot use string {key!r} as int for index into Sequence')
if delete and len(target) > 0:
length = len(target)
if idx in range(-length, length):
target.pop(idx)
elif len(target) == idx:
target.append(to_set)
else:
target[idx] = to_set # this can raise, that's fine
else:
raise ValueError(f'Dont know how to apply data to {type(target)} {target!r}')
def _deep_apply(target: UPDATABLE_DATA, path: str, to_set=None, delete=False): # noqa: CCR001 # Recursive silliness.
"""
Set the given path to the given value, if it exists.
if the path has dots (ascii period -- '.'), it will be successively split
if possible for deeper indices into target
:param target: the dict to modify
:param to_set: the data to set, defaults to None
:param delete: whether or not to delete the key rather than set it
:raises IndexError: when an invalid index is traversed into
:raises KeyError: when an invalid key is traversed into
"""
current = target
key: str = ""
while '.' in path:
if path in current:
# it exists on this level, dont go further
break
elif isinstance(current, Mapping) and any('.' in k and path.startswith(k) for k in current.keys()):
# there is a dotted key in here that can be used for this
# if theres a dotted key in here (must be a mapping), use that if we can
keys = current.keys()
for k in filter(lambda x: '.' in x, keys):
if path.startswith(k):
key = k
path = path.removeprefix(k)
# we assume that the `.` here is for "accessing" the next key.
if path[0] == '.':
path = path[1:]
if len(path) == 0:
path = key
break
else:
key, _, path = path.partition('.')
if isinstance(current, Mapping):
current = current[key] # type: ignore # I really dont know at this point what you want from me mypy.
elif isinstance(current, Sequence):
target_idx = _get_int(key) # mypy is broken. doesn't like := here.
if target_idx is not None:
current = current[target_idx]
else:
raise ValueError(f'Cannot index sequence with non-int key {key!r}')
else:
raise ValueError(f'Dont know how to index a {type(current)} ({current!r})')
_apply(current, path, to_set, delete)
def _get_int(s: str) -> Optional[int]:
try:
return int(s)
except ValueError:
return None
class KillSwitches(NamedTuple):
"""One version's set of kill switches."""
version: semantic_version.SimpleSpec
kills: Dict[str, str]
kills: Dict[str, SingleKill]
@staticmethod
def from_dict(data: KillSwitchSetJSON) -> KillSwitches:
"""Create a KillSwitches instance from a dictionary."""
ks = {}
for match, ks_data in data['kills'].items():
ks[match] = SingleKill(
match=match,
reason=ks_data['reason'],
redact_fields=ks_data.get('redact_fields'),
set_fields=ks_data.get('set_fields'),
delete_fields=ks_data.get('delete_fields')
)
return KillSwitches(version=semantic_version.SimpleSpec(data['version']), kills=ks)
class DisabledResult(NamedTuple):
"""DisabledResult is the result returned from various is_disabled calls."""
disabled: bool
reason: str
kill: Optional[SingleKill]
@property
def reason(self) -> str:
"""Reason provided for why this killswitch exists."""
return self.kill.reason if self.kill is not None else ""
def has_kill(self) -> bool:
"""Return whether or not this DisabledResult has a Kill associated with it."""
return self.kill is not None
def has_rules(self) -> bool:
"""Return whether or not the kill on this Result contains rules."""
# HACK: 2021-07-09 # Python/mypy/pyright does not support type guards like this yet. self.kill will always
# be non-None at the point it is evaluated
return self.has_kill() and self.kill.has_rules # type: ignore
class KillSwitchSet:
"""Queryable set of kill switches."""
def __init__(self, kill_switches: List[KillSwitch]) -> None:
def __init__(self, kill_switches: List[KillSwitches]) -> None:
self.kill_switches = kill_switches
def get_disabled(self, id: str, *, version=_current_version) -> DisabledResult:
def get_disabled(self, id: str, *, version: Union[Version, str] = _current_version) -> DisabledResult:
"""
Return whether or not the given feature ID is disabled by a killswitch for the given version.
:param id: The feature ID to check
:param version: The version to check killswitches for, defaults to the current EDMC version
:param version: The version to check killswitches for, defaults to the
current EDMC version
:return: a namedtuple indicating status and reason, if any
"""
if isinstance(version, str):
version = semantic_version.Version.coerce(version)
for ks in self.kill_switches:
if version not in ks.version:
continue
return DisabledResult(id in ks.kills, ks.kills.get(id, ""))
return DisabledResult(id in ks.kills, ks.kills.get(id, None))
return DisabledResult(False, "")
return DisabledResult(False, None)
def is_disabled(self, id: str, *, version: semantic_version.Version = _current_version) -> bool:
"""Return whether or not a given feature ID is disabled for the given version."""
@@ -58,7 +240,7 @@ class KillSwitchSet:
"""Return a reason for why the given id is disabled for the given version, if any."""
return self.get_disabled(id, version=version).reason
def kills_for_version(self, version: semantic_version.Version = _current_version) -> List[KillSwitch]:
def kills_for_version(self, version: semantic_version.Version = _current_version) -> List[KillSwitches]:
"""
Get all killswitch entries that apply to the given version.
@@ -67,6 +249,58 @@ class KillSwitchSet:
"""
return [k for k in self.kill_switches if version in k.version]
def check_killswitch(
self, name: str, data: T, log=logger, version=_current_version
) -> Tuple[bool, T]:
"""
Check whether or not a killswitch is enabled. If it is, apply rules if any.
:param name: The killswitch to check
:param data: The data to modify if needed
:return: A two tuple consisting of: A bool indicating if the caller should return, and either the
original data or a *COPY* that has been modified by rules
"""
res = self.get_disabled(name, version=version)
if not res.disabled:
return False, data
log.info(f'Killswitch {name} is enabled. Checking if rules exist to make use safe')
if not res.has_rules():
logger.info('No rules exist. Stopping processing')
return True, data
if TYPE_CHECKING: # pyright, mypy, please -_-
assert res.kill is not None
try:
new_data = res.kill.apply_rules(deepcopy(data))
except Exception as e:
log.exception(f'Exception occurred while attempting to apply rules! bailing out! {e=}')
return True, data
log.info('Rules applied successfully, allowing execution to continue')
return False, new_data
def check_multiple_killswitches(self, data: T, *names: str, log=logger, version=_current_version) -> Tuple[bool, T]:
"""
Check multiple killswitches in order.
Note that the names are applied in the order passed, and that the first true
return from check_killswitch causes this to return
:param data: the data to update
:param log: the logger to use, defaults to the standard EDMC main logger
:return: A two tuple of bool and updated data, where the bool is true when the caller _should_ halt processing
"""
for name in names:
should_return, data = self.check_killswitch(name=name, data=data, log=log, version=version)
if should_return:
return True, data
return False, data
def __str__(self) -> str:
"""Return a string representation of KillSwitchSet."""
return f'KillSwitchSet: {str(self.kill_switches)}'
@@ -76,17 +310,28 @@ class KillSwitchSet:
return f'KillSwitchSet(kill_switches={self.kill_switches!r})'
KILL_SWITCH_JSON = List[Dict[str, Union[str, List[str]]]]
KILL_SWITCH_JSON_DICT = Dict[
str, Union[
str, # Last updated
int, # Version
KILL_SWITCH_JSON # kills
]
]
class BaseSingleKillSwitch(TypedDict): # noqa: D101
reason: str
def fetch_kill_switches(target=DEFAULT_KILLSWITCH_URL) -> Optional[KILL_SWITCH_JSON_DICT]:
class SingleKillSwitchJSON(BaseSingleKillSwitch, total=False): # noqa: D101
redact_fields: list[str] # set fields to "REDACTED"
delete_fields: list[str] # remove fields entirely
set_fields: dict[str, Any] # set fields to given data
class KillSwitchSetJSON(TypedDict): # noqa: D101
version: str
kills: Dict[str, SingleKillSwitchJSON]
class KillSwitchJSONFile(TypedDict): # noqa: D101
version: int
last_updated: str
kill_switches: List[KillSwitchSetJSON]
def fetch_kill_switches(target=DEFAULT_KILLSWITCH_URL) -> Optional[KillSwitchJSONFile]:
"""
Fetch the JSON representation of our kill switches.
@@ -101,46 +346,81 @@ def fetch_kill_switches(target=DEFAULT_KILLSWITCH_URL) -> Optional[KILL_SWITCH_J
logger.warning(f"Failed to get kill switches, data was invalid: {e}")
return None
except (requests.exceptions.BaseHTTPError, requests.exceptions.ConnectionError) as e:
except (requests.exceptions.BaseHTTPError, requests.exceptions.ConnectionError) as e: # type: ignore
logger.warning(f"unable to connect to {target!r}: {e}")
return None
return data
def parse_kill_switches(data: KILL_SWITCH_JSON_DICT) -> List[KillSwitch]:
class _KillSwitchV1(TypedDict):
version: str
kills: Dict[str, str]
class _KillSwitchJSONFileV1(TypedDict):
version: int
last_updated: str
kill_switches: List[_KillSwitchV1]
def _upgrade_kill_switch_dict(data: KillSwitchJSONFile) -> KillSwitchJSONFile:
version = data['version']
if version == CURRENT_KILLSWITCH_VERSION:
return data
if version == 1:
logger.info('Got an old version killswitch file (v1) upgrading!')
to_return: KillSwitchJSONFile = deepcopy(data)
data_v1 = cast(_KillSwitchJSONFileV1, data)
to_return['kill_switches'] = [
cast(KillSwitchSetJSON, { # I need to cheat here a touch. It is this I promise
'version': d['version'],
'kills': {
match: {'reason': reason} for match, reason in d['kills'].items()
}
})
for d in data_v1['kill_switches']
]
to_return['version'] = CURRENT_KILLSWITCH_VERSION
return to_return
raise ValueError(f'Unknown Killswitch version {data["version"]}')
def parse_kill_switches(data: KillSwitchJSONFile) -> List[KillSwitches]:
"""
Parse kill switch dict to List of KillSwitches.
:param data: dict containing raw killswitch data
:return: a list of all provided killswitches
"""
data = _upgrade_kill_switch_dict(data)
last_updated = data['last_updated']
ks_version = data['version']
logger.info(f'Kill switches last updated {last_updated}')
if ks_version != 1:
logger.warning(f'Unknown killswitch version {ks_version}. Bailing out')
if ks_version != CURRENT_KILLSWITCH_VERSION:
logger.warning(f'Unknown killswitch version {ks_version} (expected {CURRENT_KILLSWITCH_VERSION}). Bailing out')
return []
kill_switches = cast(KILL_SWITCH_JSON, data['kill_switches'])
out: List[KillSwitch] = []
kill_switches = data['kill_switches']
out = []
for idx, ks_data in enumerate(kill_switches):
try:
ver = semantic_version.SimpleSpec(ks_data['version'])
ks = KillSwitches.from_dict(ks_data)
out.append(ks)
except ValueError as e:
logger.warning(f'could not parse killswitch idx {idx}: {e}')
continue
ks = KillSwitch(version=ver, kills=cast(Dict[str, str], ks_data['kills']))
out.append(ks)
except Exception as e:
logger.exception(f'Could not parse killswitch idx {idx}: {e}')
return out
def get_kill_switches(target=DEFAULT_KILLSWITCH_URL) -> Optional[KillSwitchSet]:
def get_kill_switches(target=DEFAULT_KILLSWITCH_URL, fallback: Optional[str] = None) -> Optional[KillSwitchSet]:
"""
Get a kill switch set object.
@@ -148,12 +428,33 @@ def get_kill_switches(target=DEFAULT_KILLSWITCH_URL) -> Optional[KillSwitchSet]:
:return: the KillSwitchSet for the URL, or None if there was an error
"""
if (data := fetch_kill_switches(target)) is None:
logger.warning('could not get killswitches')
return None
if fallback is not None:
logger.warning('could not get killswitches, trying fallback')
data = fetch_kill_switches(fallback)
if data is None:
logger.warning('Could not get killswitches.')
return None
return KillSwitchSet(parse_kill_switches(data))
def get_kill_switches_thread(
target, callback: Callable[[Optional[KillSwitchSet]], None], fallback: Optional[str] = None,
) -> None:
"""
Threaded version of get_kill_switches. Request is performed off thread, and callback is called when it is available.
:param target: Target killswitch file
:param callback: The callback to pass the newly created KillSwitchSet
:param fallback: Fallback killswitch file, if any, defaults to None
"""
def make_request():
callback(get_kill_switches(target, fallback=fallback))
threading.Thread(target=make_request, daemon=True).start()
active: KillSwitchSet = KillSwitchSet([])
@@ -163,12 +464,15 @@ def setup_main_list():
Plugins should NOT call this EVER.
"""
if (data := fetch_kill_switches()) is None:
if (data := get_kill_switches(DEFAULT_KILLSWITCH_URL, OLD_KILLSWITCH_URL)) is None:
logger.warning("Unable to fetch kill switches. Setting global set to an empty set")
return
global active
active = KillSwitchSet(parse_kill_switches(data))
active = data
logger.trace(f'{len(active.kill_switches)} Active Killswitches:')
for v in active.kill_switches:
logger.trace(v)
def get_disabled(id: str, *, version: semantic_version.Version = _current_version) -> DisabledResult:
@@ -180,6 +484,16 @@ def get_disabled(id: str, *, version: semantic_version.Version = _current_versio
return active.get_disabled(id, version=version)
def check_killswitch(name: str, data: T, log=logger) -> Tuple[bool, T]:
"""Query the global KillSwitchSet#check_killswitch method."""
return active.check_killswitch(name, data, log)
def check_multiple_killswitches(data: T, *names: str, log=logger) -> tuple[bool, T]:
"""Query the global KillSwitchSet#check_multiple method."""
return active.check_multiple_killswitches(data, *names, log=log)
def is_disabled(id: str, *, version: semantic_version.Version = _current_version) -> bool:
"""Query the global KillSwitchSet#is_disabled method."""
return active.is_disabled(id, version=version)
@@ -190,6 +504,6 @@ def get_reason(id: str, *, version: semantic_version.Version = _current_version)
return active.get_reason(id, version=version)
def kills_for_version(version: semantic_version.Version = _current_version) -> List[KillSwitch]:
def kills_for_version(version: semantic_version.Version = _current_version) -> List[KillSwitches]:
"""Query the global KillSwitchSet for kills matching a particular version."""
return active.kills_for_version(version)
+4 -1
View File
@@ -13,7 +13,10 @@ import util_ships
def export(data, filename=None):
string = json.dumps(companion.ship(data), ensure_ascii=False, indent=2, sort_keys=True, separators=(',', ': ')) # pretty print
string = json.dumps(
companion.ship(data), cls=companion.CAPIDataEncoder,
ensure_ascii=False, indent=2, sort_keys=True, separators=(',', ': ')
) # pretty print
if filename:
with open(filename, 'wt') as h:
+27 -22
View File
@@ -19,11 +19,12 @@ if TYPE_CHECKING:
import tkinter
import util_ships
from config import config, trace_on
from config import config
from edmc_data import edmc_suit_shortnames, edmc_suit_symbol_localised
from EDMCLogging import get_main_logger
logger = get_main_logger()
STARTUP = 'journal.startup'
if TYPE_CHECKING:
def _(x: str) -> str:
@@ -335,8 +336,8 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
for line in loghandle:
try:
# if b'"event":"Location"' in line:
# logger.trace('"Location" event in the past at startup')
if b'"event":"Location"' in line:
logger.trace_if('journal.locations', '"Location" event in the past at startup')
self.parse_entry(line) # Some events are of interest even in the past
@@ -416,22 +417,22 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
if b'"event":"Continue"' in line:
for _ in range(10):
logger.trace("****")
logger.trace('Found a Continue event, its being added to the list, we will finish this file up'
' and then continue with the next')
logger.trace_if('journal.continuation', "****")
logger.trace_if('journal.continuation', 'Found a Continue event, its being added to the list, '
'we will finish this file up and then continue with the next')
self.event_queue.put(line)
if not self.event_queue.empty():
if not config.shutting_down:
# logger.trace('Sending <<JournalEvent>>')
logger.trace_if('journal.queue', 'Sending <<JournalEvent>>')
self.root.event_generate('<<JournalEvent>>', when="tail")
log_pos = loghandle.tell()
if logfile != newlogfile:
for _ in range(10):
logger.trace("****")
logger.trace_if('journal.file', "****")
logger.info(f'New Journal File. Was "{logfile}", now "{newlogfile}"')
logfile = newlogfile
if loghandle:
@@ -463,7 +464,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
)
if not config.shutting_down:
# logger.trace('Sending <<JournalEvent>>')
logger.trace_if('journal.queue', 'Sending <<JournalEvent>>')
self.root.event_generate('<<JournalEvent>>', when="tail")
self.game_was_running = False
@@ -518,8 +519,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.live = True # First event in 3.0
self.cmdr = entry['Name']
self.state['FID'] = entry['FID']
if 'startup' in trace_on:
logger.trace(f'"Commander" event, {monitor.cmdr=}, {monitor.state["FID"]=}')
logger.trace_if(STARTUP, f'"Commander" event, {monitor.cmdr=}, {monitor.state["FID"]=}')
elif event_type == 'loadgame':
# Odyssey Release Update 5 -- This contains data that doesn't match the format used in FileHeader above
@@ -529,7 +529,13 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
# Odyssey: bool
self.cmdr = entry['Commander']
# 'Open', 'Solo', 'Group', or None for CQC (and Training - but no LoadGame event)
self.mode = entry.get('GameMode')
if not entry.get('Ship') and not entry.get('GameMode') or entry.get('GameMode', '').lower() == 'cqc':
logger.trace_if('journal.loadgame.cqc', f'loadgame to cqc: {entry}')
self.mode = 'CQC'
else:
self.mode = entry.get('GameMode')
self.group = entry.get('Group')
self.planet = None
self.system = None
@@ -561,8 +567,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
if entry.get('Ship') is not None and self._RE_SHIP_ONFOOT.search(entry['Ship']):
self.state['OnFoot'] = True
if 'startup' in trace_on:
logger.trace(f'"LoadGame" event, {monitor.cmdr=}, {monitor.state["FID"]=}')
logger.trace_if(STARTUP, f'"LoadGame" event, {monitor.cmdr=}, {monitor.state["FID"]=}')
elif event_type == 'newcommander':
self.cmdr = entry['Name']
@@ -759,8 +764,8 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.state['Body'] = entry.get('Body')
self.state['BodyType'] = entry.get('BodyType')
# if event_type == 'location':
# logger.trace('"Location" event')
if event_type == 'location':
logger.trace_if('journal.locations', '"Location" event')
elif event_type == 'fsdjump':
self.planet = None
@@ -1864,16 +1869,16 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
logger.debug('Called whilst self.thread is None, returning')
return None
# logger.trace('Begin')
logger.trace_if('journal.queue', 'Begin')
if self.event_queue.empty() and self.game_running():
logger.error('event_queue is empty whilst game_running, this should not happen, returning')
return None
# logger.trace('event_queue NOT empty')
logger.trace_if('journal.queue', 'event_queue NOT empty')
entry = self.parse_entry(self.event_queue.get_nowait())
# if entry['event'] == 'Location':
# logger.trace('"Location" event')
if entry['event'] == 'Location':
logger.trace_if('journal.locations', '"Location" event')
if not self.live and entry['event'] not in (None, 'Fileheader'):
# Game not running locally, but Journal has been updated
@@ -1901,8 +1906,8 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
('SystemAddress', self.systemaddress),
])
# if entry['event'] == 'Location':
# logger.trace('Appending "Location" event to event_queue')
if entry['event'] == 'Location':
logger.trace_if('journal.locations', 'Appending "Location" event to event_queue')
self.event_queue.put(json.dumps(entry, separators=(', ', ':')))
+28 -2
View File
@@ -1,6 +1,7 @@
"""
Plugin hooks for EDMC - Ian Norton, Jonathan Harris
"""
import copy
import importlib
import logging
import operator
@@ -256,8 +257,8 @@ def notify_journal_entry(cmdr, is_beta, system, station, entry, state):
:param is_beta: whether the player is in a Beta universe.
:returns: Error message from the first plugin that returns one (if any)
"""
# if entry['event'] in ('Location'):
# logger.trace('Notifying plugins of "Location" event')
if entry['event'] in ('Location'):
logger.trace_if('journal.locations', 'Notifying plugins of "Location" event')
error = None
for plugin in PLUGINS:
@@ -272,6 +273,31 @@ def notify_journal_entry(cmdr, is_beta, system, station, entry, state):
return error
def notify_journal_entry_cqc(cmdr, is_beta, entry, state):
"""
Send a journal entry to each plugin.
:param cmdr: The Cmdr name, or None if not yet known
:param entry: The journal entry as a dictionary
:param state: A dictionary containing info about the Cmdr, current ship and cargo
:param is_beta: whether the player is in a Beta universe.
:returns: Error message from the first plugin that returns one (if any)
"""
error = None
for plugin in PLUGINS:
cqc_callback = plugin._get_func('journal_entry_cqc')
if cqc_callback is not None and callable(cqc_callback):
try:
# Pass a copy of the journal entry in case the callee modifies it
newerror = cqc_callback(cmdr, is_beta, copy.deepcopy(entry), copy.deepcopy(state))
error = error or newerror
except Exception:
logger.exception(f'Plugin "{plugin.name}" failed while handling CQC mode journal entry')
return error
def notify_dashboard_entry(cmdr, is_beta, entry):
"""
Send a status entry to each plugin.
+4 -4
View File
@@ -94,14 +94,14 @@ def prefs_changed(cmdr, is_beta):
def journal_entry(cmdr, is_beta, system, station, entry, state):
if (ks := killswitch.get_disabled('plugins.eddb.journal')).disabled:
logger.warning(f'Journal processing for EDDB has been disabled: {ks.reason}')
should_return, new_entry = killswitch.check_killswitch('plugins.eddb.journal', entry)
if should_return:
# LANG: Journal Processing disabled due to an active killswitch
plug.show_error(_('EDDB Journal processing disabled. See Log.'))
return
elif (ks := killswitch.get_disabled(f'plugins.eddb.journal.event.{entry["event"]}')).disabled:
logger.warning(f'Processing of event {entry["event"]} has been disabled: {ks.reason}')
should_return, new_entry = killswitch.check_killswitch(f'plugins.eddb.journal.event.{entry["event"]}', new_entry)
if should_return:
return
this.on_foot = state['OnFoot']
+557 -78
View File
@@ -12,7 +12,7 @@ from os.path import join
from platform import system
from typing import TYPE_CHECKING, Any, Dict, Iterator, List, Mapping, MutableMapping, Optional
from typing import OrderedDict as OrderedDictT
from typing import TextIO, Tuple
from typing import TextIO, Tuple, Union
import requests
@@ -46,13 +46,18 @@ class This:
# Track if we're on foot
self.on_foot = False
# Horizons ?
self.horizons = False
# Running under Odyssey?
self.odyssey = False
# Track location to add to Journal events
self.systemaddress: Optional[str] = None
self.coordinates: Optional[Tuple] = None
self.planet: Optional[str] = None
self.body_name: Optional[str] = None
self.body_id: Optional[int] = None
# Track Status.json data
self.status_body_name: Optional[str] = None
# Avoid duplicates
self.marketId: Optional[str] = None
@@ -76,31 +81,46 @@ class This:
self.eddn_delay: tk.IntVar
self.eddn_delay_button: nb.Checkbutton
# Tracking UI
self.ui: tk.Frame
self.ui_j_body_name: tk.Label
self.ui_j_body_id: tk.Label
self.ui_s_body_name: tk.Label
this = This()
HORIZ_SKU = 'ELITE_HORIZONS_V_PLANETARY_LANDINGS'
# This SKU is tagged on any module or ship that you must have Horizons for.
HORIZONS_SKU = 'ELITE_HORIZONS_V_PLANETARY_LANDINGS'
# ELITE_HORIZONS_V_COBRA_MK_IV_1000` is for the Cobra Mk IV, but
# is also available in the base game, if you have entitlement.
# `ELITE_HORIZONS_V_GUARDIAN_FSDBOOSTER` is for the Guardian FSD Boosters,
# which you need Horizons in order to unlock, but could be on sale even in the
# base game due to entitlement.
# Thus do **NOT** use either of these in addition to the PLANETARY_LANDINGS
# one.
# TODO: a good few of these methods are static or could be classmethods. they should be created as such.
class EDDN:
"""EDDN Data export."""
DEBUG = 'eddn' in debug_senders
SERVER = 'https://eddn.edcd.io:4430'
if DEBUG:
SERVER = f'http://{edmc_data.DEBUG_WEBSERVER_HOST}:{edmc_data.DEBUG_WEBSERVER_PORT}'
UPLOAD = f'{SERVER}/upload/'
if DEBUG:
UPLOAD = f'{SERVER}/eddn'
DEFAULT_URL = 'https://eddn.edcd.io:4430/upload/'
if 'eddn' in debug_senders:
DEFAULT_URL = f'http://{edmc_data.DEBUG_WEBSERVER_HOST}:{edmc_data.DEBUG_WEBSERVER_PORT}/eddn'
REPLAYPERIOD = 400 # Roughly two messages per second, accounting for send delays [ms]
REPLAYFLUSH = 20 # Update log on disk roughly every 10 seconds
TIMEOUT = 10 # requests timeout
MODULE_RE = re.compile(r'^Hpt_|^Int_|Armour_', re.IGNORECASE)
CANONICALISE_RE = re.compile(r'\$(.+)_name;')
UNKNOWN_SCHEMA_RE = re.compile(
r"^FAIL: \[JsonValidationException\('Schema "
r"https://eddn.edcd.io/schemas/(?P<schema_name>.+)/(?P<schema_version>[0-9]+) is unknown, "
r"unable to validate.',\)\]$"
)
def __init__(self, parent: tk.Tk):
self.parent: tk.Tk = parent
@@ -108,6 +128,12 @@ class EDDN:
self.replayfile: Optional[TextIO] = None # For delayed messages
self.replaylog: List[str] = []
if config.eddn_url is not None:
self.eddn_url = config.eddn_url
else:
self.eddn_url = self.DEFAULT_URL
def load_journal_replay(self) -> bool:
"""
Load cached journal entries from disk.
@@ -167,10 +193,13 @@ class EDDN:
:param cmdr: the CMDR to use as the uploader ID.
:param msg: the payload to send.
"""
if (res := killswitch.get_disabled('plugins.eddn.send')).disabled:
logger.warning(f"eddn.send has been disabled via killswitch. Returning. ({res.reason})")
should_return, new_data = killswitch.check_killswitch('plugins.eddn.send', msg)
if should_return:
logger.warning('eddn.send has been disabled via killswitch. Returning.')
return
msg = new_data
uploader_id = cmdr
to_send: OrderedDictT[str, OrderedDict[str, Any]] = OrderedDict([
@@ -183,7 +212,7 @@ class EDDN:
('message', msg['message']),
])
r = self.session.post(self.UPLOAD, data=json.dumps(to_send), timeout=self.TIMEOUT)
r = self.session.post(self.eddn_url, data=json.dumps(to_send), timeout=self.TIMEOUT)
if r.status_code != requests.codes.ok:
# Check if EDDN is still objecting to an empty commodities list
@@ -193,17 +222,18 @@ class EDDN:
and msg['message']['commodities'] == []
and r.text == "FAIL: [<ValidationError: '[] is too short'>]"
):
logger.trace("EDDN is still objecting to empty commodities data")
logger.trace_if('plugin.eddn', "EDDN is still objecting to empty commodities data")
return # We want to silence warnings otherwise
logger.debug(
f'''Status from POST wasn't OK:
if not self.UNKNOWN_SCHEMA_RE.match(r.text):
logger.debug(
f'''Status from POST wasn't OK:
Status\t{r.status_code}
URL\t{r.url}
Headers\t{r.headers}
Content:\n{r.text}
Msg:\n{msg}'''
)
)
r.raise_for_status()
@@ -261,8 +291,20 @@ Msg:\n{msg}'''
if not len(self.replaylog) % self.REPLAYFLUSH:
self.flush()
# TODO: Something here needs to handle, e.g. HTTP 400, and take the message
# in question out of replaylog, else we'll keep retrying a bad message
# forever.
except requests.exceptions.HTTPError as e:
status['text'] = self.http_error_to_log(e)
if unknown_schema := self.UNKNOWN_SCHEMA_RE.match(e.response.text):
logger.debug(f"EDDN doesn't (yet?) know about schema: {unknown_schema['schema_name']}"
f"/{unknown_schema['schema_version']}")
# NB: This dropping is to cater for the time when EDDN
# doesn't *yet* support a new schema.
self.replaylog.pop(0) # Drop the message
self.flush() # Truncates the file, then writes the extant data
else:
status['text'] = self.http_error_to_log(e)
except requests.exceptions.RequestException as e:
logger.debug('Failed sending', exc_info=e)
@@ -298,15 +340,25 @@ Msg:\n{msg}'''
# LANG: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number
return _('EDDN Error: Returned {STATUS} status code').format(status_code)
def export_commodities(self, data: Mapping[str, Any], is_beta: bool, is_odyssey: bool) -> None: # noqa: CCR001
def export_commodities(self, data: Mapping[str, Any], is_beta: bool) -> None: # noqa: CCR001
"""
Update EDDN with the commodities on the current (lastStarport) station.
Once the send is complete, this.commodities is updated with the new data.
NB: This does *not* go through the replaylog, unlike most of the
Journal-sourced data. This kind of timely data is often rejected by
listeners if 'too old' anyway, so little point.
:param data: a dict containing the starport data
:param is_beta: whether or not we're currently in beta mode
"""
modules, ships = self.safe_modules_and_ships(data)
horizons: bool = capi_is_horizons(
data['lastStarport'].get('economies', {}),
modules,
ships
)
commodities: List[OrderedDictT[str, Any]] = []
for commodity in data['lastStarport'].get('commodities') or []:
# Check 'marketable' and 'not prohibited'
@@ -341,7 +393,8 @@ Msg:\n{msg}'''
('stationName', data['lastStarport']['name']),
('marketId', data['lastStarport']['id']),
('commodities', commodities),
('odyssey', is_odyssey),
('horizons', horizons),
('odyssey', this.odyssey),
])
if 'economies' in data['lastStarport']:
@@ -399,12 +452,16 @@ Msg:\n{msg}'''
return modules, ships
def export_outfitting(self, data: CAPIData, is_beta: bool, is_odyssey: bool) -> None:
def export_outfitting(self, data: CAPIData, is_beta: bool) -> None:
"""
Update EDDN with the current (lastStarport) station's outfitting options, if any.
Once the send is complete, this.outfitting is updated with the given data.
NB: This does *not* go through the replaylog, unlike most of the
Journal-sourced data. This kind of timely data is often rejected by
listeners if 'too old' anyway, so little point.
:param data: dict containing the outfitting data
:param is_beta: whether or not we're currently in beta mode
"""
@@ -412,15 +469,15 @@ Msg:\n{msg}'''
# Horizons flag - will hit at least Int_PlanetApproachSuite other than at engineer bases ("Colony"),
# prison or rescue Megaships, or under Pirate Attack etc
horizons: bool = is_horizons(
horizons: bool = capi_is_horizons(
data['lastStarport'].get('economies', {}),
modules,
ships
)
to_search: Iterator[Mapping[str, Any]] = filter(
lambda m: self.MODULE_RE.search(m['name']) and m.get('sku') in (None, HORIZ_SKU) and
m['name'] != 'Int_PlanetApproachSuite',
lambda m: self.MODULE_RE.search(m['name']) and m.get('sku') in (None, HORIZONS_SKU)
and m['name'] != 'Int_PlanetApproachSuite', # noqa: E131
modules.values()
)
@@ -439,24 +496,28 @@ Msg:\n{msg}'''
('marketId', data['lastStarport']['id']),
('horizons', horizons),
('modules', outfitting),
('odyssey', is_odyssey),
('odyssey', this.odyssey),
]),
})
this.outfitting = (horizons, outfitting)
def export_shipyard(self, data: CAPIData, is_beta: bool, is_odyssey: bool) -> None:
def export_shipyard(self, data: CAPIData, is_beta: bool) -> None:
"""
Update EDDN with the current (lastStarport) station's outfitting options, if any.
Once the send is complete, this.shipyard is updated to the new data.
NB: This does *not* go through the replaylog, unlike most of the
Journal-sourced data. This kind of timely data is often rejected by
listeners if 'too old' anyway, so little point.
:param data: dict containing the shipyard data
:param is_beta: whether or not we are in beta mode
"""
modules, ships = self.safe_modules_and_ships(data)
horizons: bool = is_horizons(
horizons: bool = capi_is_horizons(
data['lastStarport'].get('economies', {}),
modules,
ships
@@ -479,7 +540,7 @@ Msg:\n{msg}'''
('marketId', data['lastStarport']['id']),
('horizons', horizons),
('ships', shipyard),
('odyssey', is_odyssey),
('odyssey', this.odyssey),
]),
})
@@ -491,6 +552,10 @@ Msg:\n{msg}'''
As a side effect, it also updates this.commodities with the data.
NB: This does *not* go through the replaylog, unlike most of the
Journal-sourced data. This kind of timely data is often rejected by
listeners if 'too old' anyway, so little point.
:param cmdr: The commander to send data under
:param is_beta: whether or not we're in beta mode
:param entry: the journal entry containing the commodities data
@@ -522,7 +587,8 @@ Msg:\n{msg}'''
('stationName', entry['StationName']),
('marketId', entry['MarketID']),
('commodities', commodities),
('odyssey', entry['odyssey'])
('horizons', this.horizons),
('odyssey', this.odyssey),
]),
})
@@ -534,6 +600,10 @@ Msg:\n{msg}'''
As a side effect, it also updates this.outfitting with the data.
NB: This does *not* go through the replaylog, unlike most of the
Journal-sourced data. This kind of timely data is often rejected by
listeners if 'too old' anyway, so little point.
:param cmdr: The commander to send data under
:param is_beta: Whether or not we're in beta mode
:param entry: The relevant journal entry
@@ -569,6 +639,10 @@ Msg:\n{msg}'''
As a side effect, this.shipyard is updated with the data.
NB: This does *not* go through the replaylog, unlike most of the
Journal-sourced data. This kind of timely data is often rejected by
listeners if 'too old' anyway, so little point.
:param cmdr: the commander to send this update under
:param is_beta: Whether or not we're in beta mode
:param entry: the relevant journal entry
@@ -593,21 +667,17 @@ Msg:\n{msg}'''
# this.shipyard = (horizons, shipyard)
def export_journal_entry(self, cmdr: str, is_beta: bool, entry: Mapping[str, Any]) -> None:
def export_journal_entry(self, cmdr: str, entry: Mapping[str, Any], msg: Mapping[str, Any]) -> None:
"""
Update EDDN with an event from the journal.
Additionally if additional lines are cached, it may send those as well.
Additionally if other lines have been saved for retry, it may send
those as well.
:param cmdr: the commander under which this upload is made
:param is_beta: whether or not we are in beta mode
:param entry: the journal entry to send
:param cmdr: Commander name as passed in through `journal_entry()`.
:param entry: The full journal event dictionary (due to checks in this function).
:param msg: The EDDN message body to be sent.
"""
msg = {
'$schemaRef': f'https://eddn.edcd.io/schemas/journal/1{"/test" if is_beta else ""}',
'message': entry
}
if self.replayfile or self.load_journal_replay():
# Store the entry
self.replaylog.append(json.dumps([cmdr, msg]))
@@ -627,6 +697,295 @@ Msg:\n{msg}'''
self.send(cmdr, msg)
self.parent.children['status']['text'] = ''
def export_journal_generic(self, cmdr: str, is_beta: bool, entry: Mapping[str, Any]) -> None:
"""
Send an EDDN event on the journal schema.
:param cmdr: the commander under which this upload is made
:param is_beta: whether or not we are in beta mode
:param entry: the journal entry to send
"""
msg = {
'$schemaRef': f'https://eddn.edcd.io/schemas/journal/1{"/test" if is_beta else ""}',
'message': entry
}
this.eddn.export_journal_entry(cmdr, entry, msg)
def entry_augment_system_data(
self,
entry: MutableMapping[str, Any],
system_name: str
) -> Union[str, MutableMapping[str, Any]]:
"""
Augment a journal entry with necessary system data.
:param entry: The journal entry to be augmented.
:param system_name: Name of current star system.
:param systemname_field_name: Name of journal key for system name.
:return: The augmented version of entry.
"""
# If 'SystemName' or 'System' is there, it's directly from a journal event.
# If they're not there *and* 'StarSystem' isn't either, then we add the latter.
if 'SystemName' not in entry and 'System' not in entry and 'StarSystem' not in entry:
entry['StarSystem'] = system_name
if 'SystemAddress' not in entry:
if this.systemaddress is None:
logger.warning("this.systemaddress is None, can't add SystemAddress")
return "this.systemaddress is None, can't add SystemAddress"
entry['SystemAddress'] = this.systemaddress
if 'StarPos' not in entry:
if not this.coordinates:
logger.warning("this.coordinates is None, can't add StarPos")
return "this.coordinates is None, can't add StarPos"
entry['StarPos'] = list(this.coordinates)
return entry
def export_journal_fssdiscoveryscan(
self, cmdr: str, system: str, is_beta: bool, entry: Mapping[str, Any]
) -> Optional[str]:
"""
Send an FSSDiscoveryScan to EDDN on the correct schema.
:param cmdr: the commander under which this upload is made
:param is_beta: whether or not we are in beta mode
:param entry: the journal entry to send
"""
#######################################################################
# Elisions
entry = filter_localised(entry)
entry.pop('Progress')
#######################################################################
#######################################################################
# Augmentations
#######################################################################
ret = this.eddn.entry_augment_system_data(entry, system)
if isinstance(ret, str):
return ret
entry = ret
#######################################################################
msg = {
'$schemaRef': f'https://eddn.edcd.io/schemas/fssdiscoveryscan/1{"/test" if is_beta else ""}',
'message': entry
}
this.eddn.export_journal_entry(cmdr, entry, msg)
return None
def export_journal_navbeaconscan(
self, cmdr: str, system_name: str, is_beta: bool, entry: Mapping[str, Any]
) -> Optional[str]:
"""
Send an NavBeaconScan to EDDN on the correct schema.
:param cmdr: the commander under which this upload is made
:param system_name: Name of the current system.
:param is_beta: whether or not we are in beta mode
:param entry: the journal entry to send
"""
# { "timestamp":"2021-09-24T13:57:24Z", "event":"NavBeaconScan", "SystemAddress":670417626481, "NumBodies":18 }
#######################################################################
# Elisions
entry = filter_localised(entry)
#######################################################################
#######################################################################
# Augmentations
#######################################################################
ret = this.eddn.entry_augment_system_data(entry, system_name)
if isinstance(ret, str):
return ret
entry = ret
#######################################################################
msg = {
'$schemaRef': f'https://eddn.edcd.io/schemas/navbeaconscan/1{"/test" if is_beta else ""}',
'message': entry
}
this.eddn.export_journal_entry(cmdr, entry, msg)
return None
def export_journal_codexentry(
self, cmdr: str, is_beta: bool, entry: MutableMapping[str, Any]
) -> Optional[str]:
"""
Send a CodexEntry to EDDN on the correct schema.
:param cmdr: the commander under which this upload is made
:param is_beta: whether or not we are in beta mode
:param entry: the journal entry to send
"""
# {
# "timestamp":"2021-09-26T12:29:39Z",
# "event":"CodexEntry",
# "EntryID":1400414,
# "Name":"$Codex_Ent_Gas_Vents_SilicateVapourGeysers_Name;",
# "Name_Localised":"Silicate Vapour Gas Vent",
# "SubCategory":"$Codex_SubCategory_Geology_and_Anomalies;",
# "SubCategory_Localised":"Geology and anomalies",
# "Category":"$Codex_Category_Biology;",
# "Category_Localised":"Biological and Geological",
# "Region":"$Codex_RegionName_18;",
# "Region_Localised":"Inner Orion Spur",
# "System":"Bestia",
# "SystemAddress":147916327267,
# "Latitude":23.197777, "Longitude":51.803349,
# "IsNewEntry":true,
# "VoucherAmount":50000
# }
#######################################################################
# Elisions
entry = filter_localised(entry)
# Keys specific to this event
for k in ('IsNewEntry', 'NewTraitsDiscovered'):
if k in entry:
del entry[k]
#######################################################################
#######################################################################
# Augmentations
#######################################################################
# General 'system' augmentations
ret = this.eddn.entry_augment_system_data(entry, entry['System'])
if isinstance(ret, str):
return ret
entry = ret
# Set BodyName if it's available from Status.json
if this.status_body_name is not None:
entry['BodyName'] = this.status_body_name
# Only set BodyID if journal BodyName matches the Status.json one.
# This avoids binary body issues.
if this.status_body_name == this.body_name:
entry['BodyID'] = this.body_id
#######################################################################
msg = {
'$schemaRef': f'https://eddn.edcd.io/schemas/codexentry/1{"/test" if is_beta else ""}',
'message': entry
}
this.eddn.export_journal_entry(cmdr, entry, msg)
return None
def export_journal_scanbarycentre(
self, cmdr: str, is_beta: bool, entry: Mapping[str, Any]
) -> Optional[str]:
"""
Send a ScanBaryCentre to EDDN on the correct schema.
:param cmdr: the commander under which this upload is made
:param is_beta: whether or not we are in beta mode
:param entry: the journal entry to send
"""
# {
# "timestamp":"2021-09-26T11:55:03Z",
# "event":"ScanBaryCentre",
# "StarSystem":"Khruvani",
# "SystemAddress":13864557159793,
# "BodyID":21,
# "SemiMajorAxis":863683605194.091797,
# "Eccentricity":0.001446,
# "OrbitalInclination":-0.230714,
# "Periapsis":214.828581,
# "OrbitalPeriod":658474677.801132,
# "AscendingNode":21.188568,
# "MeanAnomaly":208.765388
# }
#######################################################################
# Elisions
entry = filter_localised(entry)
#######################################################################
#######################################################################
# Augmentations
#######################################################################
ret = this.eddn.entry_augment_system_data(entry, entry['StarSystem'])
if isinstance(ret, str):
return ret
entry = ret
#######################################################################
msg = {
'$schemaRef': f'https://eddn.edcd.io/schemas/scanbarycentre/1{"/test" if is_beta else ""}',
'message': entry
}
this.eddn.export_journal_entry(cmdr, entry, msg)
return None
def export_journal_navroute(
self, cmdr: str, is_beta: bool, entry: MutableMapping[str, Any]
) -> Optional[str]:
"""
Send a NavRoute to EDDN on the correct schema.
:param cmdr: the commander under which this upload is made
:param is_beta: whether or not we are in beta mode
:param entry: the journal entry to send
"""
# {
# "timestamp":"2021-09-24T14:33:15Z",
# "event":"NavRoute",
# "Route":[
# {
# "StarSystem":"Ross 332",
# "SystemAddress":3657198211778,
# "StarPos":[-43.62500,-23.15625,-74.12500],
# "StarClass":"K"
# },
# {
# "StarSystem":"BD+44 1040",
# "SystemAddress":2832564490946,
# "StarPos":[-31.56250,1.84375,-92.37500],
# "StarClass":"K"
# },
# {
# "StarSystem":"Aonga",
# "SystemAddress":6680855188162,
# "StarPos":[-34.46875,9.53125,-90.87500],
# "StarClass":"M"
# }
# ]
# }
#######################################################################
# Elisions
#######################################################################
# WORKAROUND WIP EDDN schema | 2021-10-17: This will reject with the Odyssey or Horizons flags present
if 'odyssey' in entry:
del entry['odyssey']
if 'horizons' in entry:
del entry['horizons']
# END WORKAROUND
#######################################################################
#######################################################################
# Augmentations
#######################################################################
# None
#######################################################################
msg = {
'$schemaRef': f'https://eddn.edcd.io/schemas/navroute/1{"/test" if is_beta else ""}',
'message': entry
}
this.eddn.export_journal_entry(cmdr, entry, msg)
return None
def canonicalise(self, item: str) -> str:
"""
Canonicalise the given commodity name.
@@ -650,7 +1009,7 @@ def plugin_start3(plugin_dir: str) -> str:
return 'EDDN'
def plugin_app(parent: tk.Tk) -> None:
def plugin_app(parent: tk.Tk) -> Optional[tk.Frame]:
"""
Set up any plugin-specific UI.
@@ -661,6 +1020,7 @@ def plugin_app(parent: tk.Tk) -> None:
necessary.
:param parent: tkinter parent frame.
:return: Optional tk.Frame, if the tracking UI is active.
"""
this.parent = parent
this.eddn = EDDN(parent)
@@ -669,6 +1029,52 @@ def plugin_app(parent: tk.Tk) -> None:
# Shouldn't happen - don't bother localizing
this.parent.children['status']['text'] = 'Error: Is another copy of this app already running?'
if config.eddn_tracking_ui:
this.ui = tk.Frame(parent)
row = this.ui.grid_size()[1]
journal_body_name_label = tk.Label(this.ui, text="J:BodyName:")
journal_body_name_label.grid(row=row, column=0, sticky=tk.W)
this.ui_j_body_name = tk.Label(this.ui, name='eddn_track_j_body_name', anchor=tk.W)
this.ui_j_body_name.grid(row=row, column=1, sticky=tk.E)
row += 1
journal_body_id_label = tk.Label(this.ui, text="J:BodyID:")
journal_body_id_label.grid(row=row, column=0, sticky=tk.W)
this.ui_j_body_id = tk.Label(this.ui, name='eddn_track_j_body_id', anchor=tk.W)
this.ui_j_body_id.grid(row=row, column=1, sticky=tk.E)
row += 1
status_body_name_label = tk.Label(this.ui, text="S:BodyName:")
status_body_name_label.grid(row=row, column=0, sticky=tk.W)
this.ui_s_body_name = tk.Label(this.ui, name='eddn_track_s_body_name', anchor=tk.W)
this.ui_s_body_name.grid(row=row, column=1, sticky=tk.E)
row += 1
return this.ui
return None
def tracking_ui_update() -> None:
"""Update the Tracking UI with current data, if required."""
if not config.eddn_tracking_ui:
return
this.ui_j_body_name['text'] = '≪None≫'
if this.body_name is not None:
this.ui_j_body_name['text'] = this.body_name
this.ui_j_body_id['text'] = '≪None≫'
if this.body_id is not None:
this.ui_j_body_id['text'] = str(this.body_id)
this.ui_s_body_name['text'] = '≪None≫'
if this.status_body_name is not None:
this.ui_s_body_name['text'] = this.status_body_name
this.ui.update_idletasks()
def plugin_prefs(parent, cmdr: str, is_beta: bool) -> Frame:
"""
@@ -767,6 +1173,31 @@ def plugin_stop() -> None:
logger.debug('Done.')
# Recursively filter '*_Localised' keys from dict
def filter_localised(d: Mapping[str, Any]) -> OrderedDictT[str, Any]:
"""
Remove any dict keys with names ending `_Localised` from a dict.
:param d: Dict to filter keys of.
:return: The filtered dict.
"""
filtered: OrderedDictT[str, Any] = OrderedDict()
for k, v in d.items():
if k.endswith('_Localised'):
pass
elif hasattr(v, 'items'): # dict -> recurse
filtered[k] = filter_localised(v)
elif isinstance(v, list): # list of dicts -> recurse
filtered[k] = [filter_localised(x) if hasattr(x, 'items') else x for x in v]
else:
filtered[k] = v
return filtered
def journal_entry( # noqa: C901, CCR001
cmdr: str,
is_beta: bool,
@@ -786,46 +1217,37 @@ def journal_entry( # noqa: C901, CCR001
:param state: `dict` - Current `monitor.state` data.
:return: `str` - Error message, or `None` if no errors.
"""
if (ks := killswitch.get_disabled("plugins.eddn.journal")).disabled:
logger.warning(f'EDDN journal handler has been disabled via killswitch: {ks.reason}')
should_return, new_data = killswitch.check_killswitch('plugins.eddn.journal', entry)
if should_return:
plug.show_error(_('EDDN journal handler disabled. See Log.')) # LANG: Killswitch disabled EDDN
return None
elif (ks := killswitch.get_disabled(f'plugins.eddn.journal.event.{entry["event"]}')).disabled:
logger.warning(f'Handling of event {entry["event"]} disabled via killswitch: {ks.reason}')
should_return, new_data = killswitch.check_killswitch(f'plugins.eddn.journal.event.{entry["event"]}', new_data)
if should_return:
return None
# Recursively filter '*_Localised' keys from dict
def filter_localised(d: Mapping[str, Any]) -> OrderedDictT[str, Any]:
filtered: OrderedDictT[str, Any] = OrderedDict()
for k, v in d.items():
if k.endswith('_Localised'):
pass
elif hasattr(v, 'items'): # dict -> recurse
filtered[k] = filter_localised(v)
elif isinstance(v, list): # list of dicts -> recurse
filtered[k] = [filter_localised(x) if hasattr(x, 'items') else x for x in v]
else:
filtered[k] = v
return filtered
entry = new_data
this.on_foot = state['OnFoot']
# Note if we're under Odyssey
# The only event this is already in is `LoadGame` which isn't sent to EDDN.
# Note if we're under Horizons and/or Odyssey
# The only event these are already in is `LoadGame` which isn't sent to EDDN.
this.horizons = entry['horizons'] = state['Horizons']
this.odyssey = entry['odyssey'] = state['Odyssey']
# Track location
if entry['event'] in ('Location', 'FSDJump', 'Docked', 'CarrierJump'):
if entry['event'] in ('Location', 'CarrierJump'):
this.planet = entry.get('Body') if entry.get('BodyType') == 'Planet' else None
if entry.get('BodyType') == 'Planet':
this.body_name = entry.get('Body')
this.body_id = entry.get('BodyID')
else:
this.body_name = None
elif entry['event'] == 'FSDJump':
this.planet = None
this.body_name = None
this.body_id = None
if 'StarPos' in entry:
this.coordinates = tuple(entry['StarPos'])
@@ -836,12 +1258,41 @@ def journal_entry( # noqa: C901, CCR001
this.systemaddress = entry.get('SystemAddress') # type: ignore
elif entry['event'] == 'ApproachBody':
this.planet = entry['Body']
this.body_name = entry['Body']
this.body_id = entry.get('BodyID')
elif entry['event'] in ('LeaveBody', 'SupercruiseEntry'):
this.planet = None
elif entry['event'] == 'LeaveBody':
# NB: **NOT** SupercruiseEntry, because we won't get a fresh
# ApproachBody if we don't leave Orbital Cruise and land again.
# *This* is triggered when you go above Orbital Cruise altitude.
# Status.json BodyName clears when the OC/Glide HUD is deactivated.
this.body_name = None
this.body_id = None
# Send interesting events to EDDN, but not when on a crew
elif entry['event'] == 'Music':
if entry['MusicTrack'] == 'MainMenu':
this.body_name = None
this.body_id = None
this.status_body_name = None
# Events with their own EDDN schema
if config.get_int('output') & config.OUT_SYS_EDDN and not state['Captain']:
if entry['event'].lower() == 'fssdiscoveryscan':
return this.eddn.export_journal_fssdiscoveryscan(cmdr, system, is_beta, entry)
if entry['event'].lower() == 'navbeaconscan':
return this.eddn.export_journal_navbeaconscan(cmdr, system, is_beta, entry)
if entry['event'].lower() == 'codexentry':
return this.eddn.export_journal_codexentry(cmdr, is_beta, entry)
if entry['event'].lower() == 'scanbarycentre':
return this.eddn.export_journal_scanbarycentre(cmdr, is_beta, entry)
if entry['event'].lower() == 'navroute':
return this.eddn.export_journal_navroute(cmdr, is_beta, entry)
# Send journal schema events to EDDN, but not when on a crew
if (config.get_int('output') & config.OUT_SYS_EDDN and not state['Captain'] and
(entry['event'] in ('Location', 'FSDJump', 'Docked', 'Scan', 'SAASignalsFound', 'CarrierJump')) and
('StarPos' in entry or this.coordinates)):
@@ -873,8 +1324,8 @@ def journal_entry( # noqa: C901, CCR001
]
# add planet to Docked event for planetary stations if known
if entry['event'] == 'Docked' and this.planet:
entry['Body'] = this.planet
if entry['event'] == 'Docked' and this.body_name:
entry['Body'] = this.body_name
entry['BodyType'] = 'Planet'
# add mandatory StarSystem, StarPos and SystemAddress properties to Scan events
@@ -906,7 +1357,7 @@ def journal_entry( # noqa: C901, CCR001
entry['SystemAddress'] = this.systemaddress
try:
this.eddn.export_journal_entry(cmdr, is_beta, filter_localised(entry))
this.eddn.export_journal_generic(cmdr, is_beta, filter_localised(entry))
except requests.exceptions.RequestException as e:
logger.debug('Failed in export_journal_entry', exc_info=e)
@@ -951,6 +1402,8 @@ def journal_entry( # noqa: C901, CCR001
logger.debug(f'Failed exporting {entry["event"]}', exc_info=e)
return str(e)
tracking_ui_update()
return None
@@ -975,9 +1428,9 @@ def cmdr_data(data: CAPIData, is_beta: bool) -> Optional[str]: # noqa: CCR001
status['text'] = _('Sending data to EDDN...') # LANG: Status text shown while attempting to send data
status.update_idletasks()
this.eddn.export_commodities(data, is_beta, this.odyssey)
this.eddn.export_outfitting(data, is_beta, this.odyssey)
this.eddn.export_shipyard(data, is_beta, this.odyssey)
this.eddn.export_commodities(data, is_beta)
this.eddn.export_outfitting(data, is_beta)
this.eddn.export_shipyard(data, is_beta)
if not old_status:
status['text'] = ''
status.update_idletasks()
@@ -996,10 +1449,19 @@ def cmdr_data(data: CAPIData, is_beta: bool) -> Optional[str]: # noqa: CCR001
MAP_STR_ANY = Mapping[str, Any]
def is_horizons(economies: MAP_STR_ANY, modules: MAP_STR_ANY, ships: MAP_STR_ANY) -> bool:
def capi_is_horizons(economies: MAP_STR_ANY, modules: MAP_STR_ANY, ships: MAP_STR_ANY) -> bool:
"""
Indicate if the supplied data indicates a player has Horizons access.
This is to be used **only** for CAPI-sourced data and **MUST** be used
for CAPI data!!!
If the account has Horizons access then CAPI `/shipyard` will always see
the Horizons-only modules/ships. You can**NOT** use the Journal horizons
flag for this! If logged in to the base game on an account with Horizons,
which is all of them now, CAPI `/shipyard` will *still* return all of the
Horizons-only modules and ships.
:param economies: Economies of where the Cmdr is docked.
:param modules: Modules available at the docked station.
:param ships: Ships available at the docked station.
@@ -1016,7 +1478,7 @@ def is_horizons(economies: MAP_STR_ANY, modules: MAP_STR_ANY, ships: MAP_STR_ANY
logger.error(f'economies type is {type(economies)}')
if isinstance(modules, dict):
modules_horizons = any(module.get('sku') == HORIZ_SKU for module in modules.values())
modules_horizons = any(module.get('sku') == HORIZONS_SKU for module in modules.values())
else:
logger.error(f'modules type is {type(modules)}')
@@ -1024,7 +1486,7 @@ def is_horizons(economies: MAP_STR_ANY, modules: MAP_STR_ANY, ships: MAP_STR_ANY
if isinstance(ships, dict):
if ships.get('shipyard_list') is not None:
if isinstance(ships.get('shipyard_list'), dict):
ship_horizons = any(ship.get('sku') == HORIZ_SKU for ship in ships['shipyard_list'].values())
ship_horizons = any(ship.get('sku') == HORIZONS_SKU for ship in ships['shipyard_list'].values())
else:
logger.debug('ships["shipyard_list"] is not dict - FC or Damaged Station?')
@@ -1036,3 +1498,20 @@ def is_horizons(economies: MAP_STR_ANY, modules: MAP_STR_ANY, ships: MAP_STR_ANY
logger.error(f'ships type is {type(ships)}')
return economies_colony or modules_horizons or ship_horizons
def dashboard_entry(cmdr: str, is_beta: bool, entry: Dict[str, Any]) -> None:
"""
Process Status.json data to track things like current Body.
:param cmdr: Current Commander name.
:param is_beta: Whether non-live game version was detected.
:param entry: The latest Status.json data.
"""
if 'BodyName' in entry:
this.status_body_name = entry['BodyName']
else:
this.status_body_name = None
tracking_ui_update()
+97 -79
View File
@@ -15,7 +15,7 @@ import tkinter as tk
from queue import Queue
from threading import Thread
from time import sleep
from typing import TYPE_CHECKING, Any, List, Literal, Mapping, MutableMapping, Optional, Set, Tuple, Union
from typing import TYPE_CHECKING, Any, List, Literal, Mapping, MutableMapping, Optional, Set, Tuple, Union, cast
import requests
@@ -23,7 +23,7 @@ import killswitch
import myNotebook as nb # noqa: N813
import plug
from companion import CAPIData
from config import applongname, appversion, config, debug_senders, trace_on
from config import applongname, appversion, config, debug_senders
from edmc_data import DEBUG_WEBSERVER_HOST, DEBUG_WEBSERVER_PORT
from EDMCLogging import get_main_logger
from ttkHyperlinkLabel import HyperlinkLabel
@@ -38,6 +38,9 @@ EDSM_POLL = 0.1
_TIMEOUT = 20
DISCARDED_EVENTS_SLEEP = 10
# trace-if events
CMDR_EVENTS = 'plugin.edsm.cmdr-events'
class This:
"""Holds module globals."""
@@ -360,8 +363,7 @@ def credentials(cmdr: str) -> Optional[Tuple[str, str]]:
:param cmdr: The commander to get credentials for
:return: The credentials, or None
"""
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'{cmdr=}')
logger.trace_if(CMDR_EVENTS, f'{cmdr=}')
# Credentials for cmdr
if not cmdr:
@@ -380,15 +382,12 @@ def credentials(cmdr: str) -> Optional[Tuple[str, str]]:
if idx >= len(edsm_usernames) or idx >= len(edsm_apikeys):
return None
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'{cmdr=}: returning ({edsm_usernames[idx]=}, {edsm_apikeys[idx]=})')
logger.trace_if(CMDR_EVENTS, f'{cmdr=}: returning ({edsm_usernames[idx]=}, {edsm_apikeys[idx]=})')
return (edsm_usernames[idx], edsm_apikeys[idx])
else:
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'{cmdr=}: returning None')
logger.trace_if(CMDR_EVENTS, f'{cmdr=}: returning None')
return None
@@ -396,25 +395,31 @@ def journal_entry( # noqa: C901, CCR001
cmdr: str, is_beta: bool, system: str, station: str, entry: MutableMapping[str, Any], state: Mapping[str, Any]
) -> None:
"""Journal Entry hook."""
if (ks := killswitch.get_disabled('plugins.edsm.journal')).disabled:
logger.warning(f'EDSM Journal handler disabled via killswitch: {ks.reason}')
should_return, new_entry = killswitch.check_killswitch('plugins.edsm.journal', entry, logger)
if should_return:
# LANG: EDSM plugin - Journal handling disabled by killswitch
plug.show_error(_('EDSM Handler disabled. See Log.'))
return
elif (ks := killswitch.get_disabled(f'plugins.edsm.journal.event.{entry["event"]}')).disabled:
logger.warning(f'Handling of event {entry["event"]} has been disabled via killswitch: {ks.reason}')
should_return, new_entry = killswitch.check_killswitch(
f'plugins.edsm.journal.event.{entry["event"]}', data=new_entry, log=logger
)
if should_return:
return
entry = new_entry
this.on_foot = state['OnFoot']
# if entry['event'] in ('CarrierJump', 'FSDJump', 'Location', 'Docked'):
# logger.trace(f'''{entry["event"]}
# Commander: {cmdr}
# System: {system}
# Station: {station}
# state: {state!r}
# entry: {entry!r}'''
# )
if entry['event'] in ('CarrierJump', 'FSDJump', 'Location', 'Docked'):
logger.trace_if(
'journal.locations', f'''{entry["event"]}
Commander: {cmdr}
System: {system}
Station: {station}
state: {state!r}
entry: {entry!r}'''
)
# Always update our system address even if we're not currently the provider for system or station, but dont update
# on events that contain "future" data, such as FSDTarget
if entry['event'] in ('Location', 'Docked', 'CarrierJump', 'FSDJump'):
@@ -515,17 +520,16 @@ def journal_entry( # noqa: C901, CCR001
'Encoded': [{'Name': k, 'Count': v} for k, v in state['Encoded'].items()],
}
materials.update(transient)
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'"LoadGame" event, queueing Materials: {cmdr=}')
logger.trace_if(CMDR_EVENTS, f'"LoadGame" event, queueing Materials: {cmdr=}')
this.queue.put((cmdr, materials))
# if entry['event'] in ('CarrierJump', 'FSDJump', 'Location', 'Docked'):
# logger.trace(f'''{entry["event"]}
# Queueing: {entry!r}'''
# )
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'"{entry["event"]=}" event, queueing: {cmdr=}')
if entry['event'] in ('CarrierJump', 'FSDJump', 'Location', 'Docked'):
logger.trace_if(
'journal.locations', f'''{entry["event"]}
Queueing: {entry!r}'''
)
logger.trace_if(CMDR_EVENTS, f'"{entry["event"]=}" event, queueing: {cmdr=}')
this.queue.put((cmdr, entry))
@@ -632,51 +636,66 @@ def worker() -> None: # noqa: CCR001 C901 # Cant be broken up currently
item: Optional[Tuple[str, Mapping[str, Any]]] = this.queue.get()
if item:
(cmdr, entry) = item
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'De-queued ({cmdr=}, {entry["event"]=})')
logger.trace_if(CMDR_EVENTS, f'De-queued ({cmdr=}, {entry["event"]=})')
else:
logger.debug('Empty queue message, setting closing = True')
closing = True # Try to send any unsent events before we close
entry = {'event': 'ShutDown'} # Dummy to allow for `entry['event']` below
entry = {'event': 'ShutDown'} # Dummy to allow for `uentry['event']` belowt
retrying = 0
while retrying < 3:
if (res := killswitch.get_disabled("plugins.edsm.worker")).disabled:
logger.warning(
f'EDSM worker has been disabled via kill switch. Not uploading data. ({res.reason})'
)
should_skip, new_item = killswitch.check_killswitch(
'plugins.edsm.worker',
item if item is not None else cast(Tuple[str, Mapping[str, Any]], ("", {})),
logger
)
if should_skip:
break
if item is not None:
item = new_item
try:
if item and entry['event'] not in this.discarded_events:
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'({cmdr=}, {entry["event"]=}): not in discarded_events, appending to pending')
logger.trace_if(
CMDR_EVENTS, f'({cmdr=}, {entry["event"]=}): not in discarded_events, appending to pending')
pending.append(entry)
if pending and should_send(pending, entry['event']):
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'({cmdr=}, {entry["event"]=}): should_send() said True')
pendings = [f"{p}\n" for p in pending]
logger.trace(f'pending contains:\n{pendings}')
# drop events if required by killswitch
new_pending = []
for e in pending:
skip, new = killswitch.check_killswitch(f'plugin.edsm.worker.{e["event"]}', e, logger)
if skip:
continue
if 'edsm-locations' in trace_on and \
any(p for p in pending if p['event'] in ('CarrierJump', 'FSDJump', 'Location', 'Docked')):
logger.trace("pending has at least one of "
"('CarrierJump', 'FSDJump', 'Location', 'Docked')"
" and it passed should_send()")
new_pending.append(new)
pending = new_pending
if pending and should_send(pending, entry['event']):
logger.trace_if(CMDR_EVENTS, f'({cmdr=}, {entry["event"]=}): should_send() said True')
logger.trace_if(CMDR_EVENTS, f'pending contains:\n{chr(0x0A).join(str(p) for p in pending)}')
if any(p for p in pending if p['event'] in ('CarrierJump', 'FSDJump', 'Location', 'Docked')):
logger.trace_if('journal.locations', "pending has at least one of "
"('CarrierJump', 'FSDJump', 'Location', 'Docked')"
" and it passed should_send()")
for p in pending:
if p['event'] in ('Location'):
logger.trace('"Location" event in pending passed should_send(), '
f'timestamp: {p["timestamp"]}')
logger.trace_if(
'journal.locations',
f'"Location" event in pending passed should_send(),timestamp: {p["timestamp"]}'
)
creds = credentials(cmdr) # TODO: possibly unbound
creds = credentials(cmdr)
if creds is None:
raise ValueError("Unexpected lack of credentials")
username, apikey = creds
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'({cmdr=}, {entry["event"]=}): Using {username=} from credentials()')
logger.trace_if(CMDR_EVENTS, f'({cmdr=}, {entry["event"]=}): Using {username=} from credentials()')
data = {
'commanderName': username.encode('utf-8'),
@@ -686,26 +705,31 @@ def worker() -> None: # noqa: CCR001 C901 # Cant be broken up currently
'message': json.dumps(pending, ensure_ascii=False).encode('utf-8'),
}
if 'edsm-locations' in trace_on and \
any(p for p in pending if p['event'] in ('CarrierJump', 'FSDJump', 'Location', 'Docked')):
if any(p for p in pending if p['event'] in ('CarrierJump', 'FSDJump', 'Location', 'Docked')):
data_elided = data.copy()
data_elided['apiKey'] = '<elided>'
logger.trace(
"pending has at least one of "
"('CarrierJump', 'FSDJump', 'Location', 'Docked')"
data_elided['message'] = data_elided['message'].decode('utf-8')
data_elided['commanderName'] = data_elided['commanderName'].decode('utf-8')
logger.trace_if(
'journal.locations',
"pending has at least one of ('CarrierJump', 'FSDJump', 'Location', 'Docked')"
" Attempting API call with the following events:"
)
for p in pending:
logger.trace(f"Event: {p!r}")
logger.trace_if('journal.locations', f"Event: {p!r}")
if p['event'] in ('Location'):
logger.trace('Attempting API call for "Location" event with timestamp: '
f'{p["timestamp"]}')
logger.trace_if(
'journal.locations',
f'Attempting API call for "Location" event with timestamp: {p["timestamp"]}'
)
logger.trace(f'Overall POST data (elided) is:\n{data_elided}')
logger.trace_if(
'journal.locations', f'Overall POST data (elided) is:\n{json.dumps(data_elided, indent=2)}'
)
r = this.session.post(TARGET_URL, data=data, timeout=_TIMEOUT)
# logger.trace(f'API response content: {r.content}')
logger.trace_if('plugin.edsm.api', f'API response content: {r.content!r}')
r.raise_for_status()
reply = r.json()
@@ -724,11 +748,11 @@ def worker() -> None: # noqa: CCR001 C901 # Cant be broken up currently
else:
if msg_num // 100 == 1:
# logger.trace('Overall OK')
logger.trace_if('plugin.edsm.api', 'Overall OK')
pass
elif msg_num // 100 == 5:
# logger.trace('Event(s) not currently processed, but saved for later')
logger.trace_if('plugin.edsm.api', 'Event(s) not currently processed, but saved for later')
pass
else:
@@ -761,8 +785,7 @@ def worker() -> None: # noqa: CCR001 C901 # Cant be broken up currently
if entry['event'].lower() in ('shutdown', 'commander', 'fileheader'):
# Game shutdown or new login so we MUST not hang on to pending
pending = []
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'Blanked pending because of event: {entry["event"]}')
logger.trace_if(CMDR_EVENTS, f'Blanked pending because of event: {entry["event"]}')
if closing:
logger.debug('closing, so returning.')
@@ -776,12 +799,12 @@ def should_send(entries: List[Mapping[str, Any]], event: str) -> bool: # noqa:
Whether or not any of the given entries should be sent to EDSM.
:param entries: The entries to check
:param event: The latest event being processed
:return: bool indicating whether or not to send said entries
"""
# We MUST flush pending on logout, in case new login is a different Commander
if event.lower() in ('shutdown', 'fileheader'):
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'True because {event=}')
logger.trace_if(CMDR_EVENTS, f'True because {event=}')
return True
@@ -790,8 +813,7 @@ def should_send(entries: List[Mapping[str, Any]], event: str) -> bool: # noqa:
if entries and entries[-1]['event'] == 'Scan':
this.navbeaconscan -= 1
if this.navbeaconscan:
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'False because {this.navbeaconscan=}')
logger.trace_if(CMDR_EVENTS, f'False because {this.navbeaconscan=}')
return False
@@ -807,8 +829,7 @@ def should_send(entries: List[Mapping[str, Any]], event: str) -> bool: # noqa:
# Cargo is the last event on startup, unless starting when docked in which case Docked is the last event
this.newgame = False
this.newgame_docked = False
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'True because {entry["event"]=}')
logger.trace_if(CMDR_EVENTS, f'True because {entry["event"]=}')
return True
@@ -819,17 +840,14 @@ def should_send(entries: List[Mapping[str, Any]], event: str) -> bool: # noqa:
'CommunityGoal', # Spammed periodically
'ModuleBuy', 'ModuleSell', 'ModuleSwap', # will be shortly followed by "Loadout"
'ShipyardBuy', 'ShipyardNew', 'ShipyardSwap'): # "
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'True because {entry["event"]=}')
logger.trace_if(CMDR_EVENTS, f'True because {entry["event"]=}')
return True
else:
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'{entry["event"]=}, {this.newgame_docked=}')
logger.trace_if(CMDR_EVENTS, f'{entry["event"]=}, {this.newgame_docked=}')
if 'edsm-cmdr-events' in trace_on:
logger.trace(f'False as default: {this.newgame_docked=}')
logger.trace_if(CMDR_EVENTS, f'False as default: {this.newgame_docked=}')
return False
+31 -6
View File
@@ -5,6 +5,7 @@ import threading
import time
import tkinter as tk
from collections import OrderedDict, defaultdict, deque
from dataclasses import dataclass
from operator import itemgetter
from threading import Lock, Thread
from typing import TYPE_CHECKING, Any, Callable, Deque, Dict, List, Mapping, NamedTuple, Optional
@@ -47,7 +48,8 @@ class Credentials(NamedTuple):
EVENT_DATA = Union[Mapping[str, Any], Sequence[Mapping[str, Any]]]
class Event(NamedTuple):
@dataclass
class Event:
"""Event represents an event for the Inara API."""
name: str
@@ -334,16 +336,21 @@ def journal_entry( # noqa: C901, CCR001
:return: str - empty if no error, else error string.
"""
if (ks := killswitch.get_disabled('plugins.inara.journal')).disabled:
logger.warning(f'Inara support has been disabled via killswitch: {ks.reason}')
should_return, new_entry = killswitch.check_killswitch('plugins.inara.journal', entry, logger)
if should_return:
plug.show_error(_('Inara disabled. See Log.')) # LANG: INARA support disabled via killswitch
logger.trace('returning due to killswitch match')
return ''
elif (ks := killswitch.get_disabled(f'plugins.inara.journal.event.{entry["event"]}')).disabled:
logger.warning(f'event {entry["event"]} processing has been disabled via killswitch: {ks.reason}')
should_return, new_entry = killswitch.check_killswitch(
f'plugins.inara.journal.event.{entry["event"]}', new_entry, logger
)
if should_return:
logger.trace('returning due to killswitch match')
# this can and WILL break state, but if we're concerned about it sending bad data, we'd disable globally anyway
return ''
entry = new_entry
this.on_foot = state['OnFoot']
event_name: str = entry['event']
this.cmdr = cmdr
@@ -1461,6 +1468,21 @@ def new_add_event(
this.events[key].append(Event(name, timestamp, data))
def clean_event_list(event_list: List[Event]) -> List[Event]:
"""Check for killswitched events and remove or modify them as requested."""
out = []
for e in event_list:
bad, new_event = killswitch.check_killswitch(f'plugins.inara.worker.{e.name}', e.data, logger)
if bad:
continue
e.data = new_event
out.append(e)
return out
def new_worker():
"""
Handle sending events to the Inara API.
@@ -1475,6 +1497,7 @@ def new_worker():
continue
for creds, event_list in events.items():
event_list = clean_event_list(event_list)
if not event_list:
continue
@@ -1490,8 +1513,10 @@ def new_worker():
{'eventName': e.name, 'eventTimestamp': e.timestamp, 'eventData': e.data} for e in event_list
]
}
logger.info(f'sending {len(data["events"])} events for {creds.cmdr}')
logger.trace(f'Events:\n{json.dumps(data)}\n')
logger.trace_if('plugin.inara.events', f'Events:\n{json.dumps(data)}\n')
try_send_data(TARGET_URL, data)
time.sleep(WORKER_WAIT_TIME)
-6
View File
@@ -1015,12 +1015,6 @@ class PreferencesDialog(tk.Toplevel):
self.out_td_button['state'] = tk.NORMAL
self.out_ship_button['state'] = tk.NORMAL
local = any((self.out_td.get(), self.out_csv.get(), self.out_ship.get()))
self.out_auto_button['state'] = tk.NORMAL if local and logvalid else tk.DISABLED
self.outdir_label['state'] = tk.NORMAL if local else tk.DISABLED
self.outbutton['state'] = tk.NORMAL if local else tk.DISABLED
self.outdir_entry['state'] = tk.NORMAL if local else tk.DISABLED
def filebrowse(self, title, pathvar):
"""
Open a directory selection dialog.
+30 -25
View File
@@ -1,12 +1,13 @@
"""protocol handler for cAPI authorisation."""
# spell-checker: words ntdll GURL alloc wfile instantiatable pyright
import os
import sys
import threading
import urllib.error
import urllib.parse
import urllib.request
from typing import TYPE_CHECKING, Optional
from typing import TYPE_CHECKING, Optional, Type
from config import config
from constants import appname, protocolhandler_redirect
@@ -48,7 +49,7 @@ class GenericProtocolHandler:
"""Generate an auth event."""
self.lastpayload = url
logger.trace(f'Payload: {self.lastpayload}')
logger.trace_if('frontier-auth', f'Payload: {self.lastpayload}')
if not config.shutting_down:
logger.debug('event_generate("<<CompanionAuthEvent>>")')
self.master.event_generate('<<CompanionAuthEvent>>', when="tail")
@@ -115,10 +116,10 @@ if sys.platform == 'darwin' and getattr(sys, 'frozen', False): # noqa: C901 # i
elif (config.auth_force_edmc_protocol
or (
sys.platform == 'win32'
and getattr(sys, 'frozen', False)
and not is_wine
and not config.auth_force_localserver
sys.platform == 'win32'
and getattr(sys, 'frozen', False)
and not is_wine
and not config.auth_force_localserver
)):
# spell-checker: words HBRUSH HICON WPARAM wstring WNDCLASS HMENU HGLOBAL
from ctypes import windll # type: ignore
@@ -298,7 +299,7 @@ elif (config.auth_force_edmc_protocol
msg = MSG()
# Calls GetMessageW: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getmessagew
while GetMessageW(byref(msg), None, 0, 0) != 0:
logger.trace(f'DDE message of type: {msg.message}')
logger.trace_if('frontier-auth.windows', f'DDE message of type: {msg.message}')
if msg.message == WM_DDE_EXECUTE:
# GlobalLock does some sort of "please dont move this?"
# https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-globallock
@@ -306,7 +307,7 @@ elif (config.auth_force_edmc_protocol
GlobalUnlock(msg.lParam) # Unlocks the GlobalLock-ed object
if args.lower().startswith('open("') and args.endswith('")'):
logger.trace(f'args are: {args}')
logger.trace_if('frontier-auth.windows', f'args are: {args}')
url = urllib.parse.unquote(args[6:-2]).strip()
if url.startswith(self.redirect):
logger.debug(f'Message starts with {self.redirect}')
@@ -384,7 +385,7 @@ else: # Linux / Run from source
def parse(self) -> bool:
"""Parse a request."""
logger.trace(f'Got message on path: {self.path}')
logger.trace_if('frontier-auth.http', f'Got message on path: {self.path}')
url = urllib.parse.unquote(self.path)
if url.startswith('/auth'):
logger.debug('Request starts with /auth, sending to protocolhandler.event()')
@@ -415,20 +416,24 @@ else: # Linux / Run from source
pass
# singleton
def get_handler_impl() -> Type[GenericProtocolHandler]:
"""
Get the appropriate GenericProtocolHandler for the current system and config.
:return: An instantiatable GenericProtocolHandler
"""
if sys.platform == 'darwin' and getattr(sys, 'frozen', False):
return DarwinProtocolHandler # pyright: reportUnboundVariable=false
elif (
(sys.platform == 'win32' and config.auth_force_edmc_protocol)
or (getattr(sys, 'frozen', False) and not is_wine and not config.auth_force_localserver)
):
return WindowsProtocolHandler
else:
return LinuxProtocolHandler
# *late init* singleton
protocolhandler: GenericProtocolHandler
if sys.platform == 'darwin' and getattr(sys, 'frozen', False):
protocolhandler = DarwinProtocolHandler() # pyright: reportUnboundVariable=false
elif (
sys.platform == 'win32'
and config.auth_force_edmc_protocol or (
getattr(sys, 'frozen', False)
and not is_wine
and not config.auth_force_localserver
)
):
protocolhandler = WindowsProtocolHandler()
else:
protocolhandler = LinuxProtocolHandler()
+12 -12
View File
@@ -3,22 +3,22 @@
wheel
# Static analysis tools
flake8==3.9.2
flake8==4.0.1
flake8-annotations-coverage==0.0.5
flake8-cognitive-complexity==0.1.0
flake8-comprehensions==3.5.0
flake8-comprehensions==3.7.0
flake8-docstrings==1.6.0
isort==5.9.3
flake8-isort==4.0.0
flake8-isort==4.1.1
flake8-json==21.7.0
flake8-noqa==1.1.0
flake8-noqa==1.2.0
flake8-polyfill==1.0.2
flake8-use-fstring==1.1
flake8-use-fstring==1.3
mypy==0.910
pep8-naming==0.12.0
pep8-naming==0.12.1
safety==1.10.3
types-requests==2.25.2
types-requests==2.25.11
# Code formatting tools
autopep8==1.5.7
@@ -28,14 +28,14 @@ grip==4.5.2
# Packaging
# We only need py2exe on windows.
py2exe==0.10.4.0; sys_platform == 'win32'
py2exe==0.10.4.1; sys_platform == 'win32'
# Testing
pytest==6.2.4
pytest-cov==2.12.1 # Pytest code coverage support
coverage[toml]==5.5 # pytest-cov dep. This is here to ensure that it includes TOML support for pyproject.toml configs
pytest==6.2.5
pytest-cov==3.0.0 # Pytest code coverage support
coverage[toml]==6.0.2 # pytest-cov dep. This is here to ensure that it includes TOML support for pyproject.toml configs
# For manipulating folder permissions and the like.
pywin32==301; sys_platform == 'win32'
pywin32==302; sys_platform == 'win32'
# All of the normal requirements
+2 -2
View File
@@ -1,6 +1,6 @@
certifi==2021.5.30
certifi==2021.10.8
requests==2.26.0
watchdog==2.1.3
watchdog==2.1.6
# Commented out because this doesn't package well with py2exe
# infi.systray==0.1.12; sys_platform == 'win32'
# argh==0.26.2 watchdog dep
+128
View File
@@ -0,0 +1,128 @@
"""Print information about killswitch json files."""
import json
import sys
# Yes this is gross. No I cant fix it. EDMC doesn't use python modules currently and changing that would be messy.
sys.path.append('.')
from killswitch import KillSwitchSet, SingleKill, parse_kill_switches # noqa: E402
KNOWN_KILLSWITCH_NAMES: list[str] = [
# edsm
'plugins.edsm.worker',
'plugins.edsm.worker.$event',
'plugins.edsm.journal',
'plugins.edsm.journal.event.$event',
# inara
'plugins.inara.journal',
'plugins.inara.journal.event.$event',
'plugins.inara.worker',
'plugins.inara.worker.$event',
# eddn
'plugins.eddn.send',
'plugins.eddn.journal',
'plugins.eddn.journal.event.$event',
# eddb
'plugins.eddb.journal',
'plugins.eddb.journal.event.$event'
]
SPLIT_KNOWN_NAMES = list(map(lambda x: x.split('.'), KNOWN_KILLSWITCH_NAMES))
def match_exists(match: str) -> tuple[bool, str]:
"""Check that a match matching the above defined known list exists."""
split_match = match.split('.')
highest_match = 0
closest = []
for known_split in SPLIT_KNOWN_NAMES:
if len(known_split) != len(split_match):
continue # couldn't possibly match this
if known_split == split_match:
return True, ""
matched_fields = sum(1 for k, s in zip(known_split, split_match) if k == s or k[0] == '$')
if matched_fields == len(known_split):
return True, ''
if highest_match < matched_fields:
matched_fields = highest_match
closest = list(known_split)
if matched_fields == len(known_split):
return True, ""
return False, ".".join(closest)
def show_killswitch_set_info(ks: KillSwitchSet) -> None:
"""Show information about the given KillSwitchSet."""
for kill_version in ks.kill_switches:
print(f'Kills matching version mask {kill_version.version}')
for kill in kill_version.kills.values():
print_singlekill_info(kill)
def print_singlekill_info(s: SingleKill):
"""Print info about a single SingleKill instance."""
ok, closest_match = match_exists(s.match)
if ok:
print(f'\t- {s.match}')
else:
print(
f'\t- {s.match} -- Does not match existing killswitches! '
f'Typo or out of date script? (closest: {closest_match!r})'
)
print(f'\t\tReason specified is: {s.reason!r}')
print()
if not s.has_rules:
print(f'\t\tDoes not set, redact, or delete fields. This will always stop execution for {s.match}')
return
print(f'\t\tThe folowing changes are required for {s.match} execution to continue')
if s.set_fields:
max_field_len = max(len(f) for f in s.set_fields) + 3
print(f'\t\tSets {len(s.set_fields)} fields:')
for f, c in s.set_fields.items():
print(f'\t\t\t- {f.ljust(max_field_len)} -> {c}')
print()
if s.redact_fields:
max_field_len = max(len(f) for f in s.redact_fields) + 3
print(f'\t\tRedacts {len(s.redact_fields)} fields:')
for f in s.redact_fields:
print(f'\t\t\t- {f.ljust(max_field_len)} -> "REDACTED"')
print()
if s.delete_fields:
print(f'\t\tDeletes {len(s.delete_fields)} fields:')
for f in s.delete_fields:
print(f'\t\t\t- {f}')
print()
if __name__ == '__main__':
if len(sys.argv) == 1:
print("killswitch_test.py [file or - for stdin]")
sys.exit(1)
file_name = sys.argv[1]
if file_name == '-':
file = sys.stdin
else:
file = open(file_name)
res = json.load(file)
file.close()
show_killswitch_set_info(KillSwitchSet(parse_kill_switches(res)))
+24 -20
View File
@@ -1,5 +1,6 @@
"""CMDR Status information."""
import csv
import json
import tkinter
import tkinter as tk
from sys import platform
@@ -10,6 +11,7 @@ import companion
import EDMCLogging
import myNotebook as nb # noqa: N813
from edmc_data import ship_name_map
from hotkey import hotkeymgr
from l10n import Locale
from monitor import monitor
@@ -273,47 +275,49 @@ class StatsDialog():
def showstats(self) -> None:
"""Show the status window for the current cmdr."""
if not monitor.cmdr:
hotkeymgr.play_bad()
# LANG: Current commander unknown when trying to use 'File' > 'Status'
self.status['text'] = _("Status: Don't yet know your Commander name")
return
# LANG: Fetching data from Frontier CAPI in order to display on File > Status
self.status['text'] = _('Fetching data...')
self.parent.update_idletasks()
try:
data = companion.session.profile()
except companion.ServerError as e:
self.status['text'] = str(e)
# TODO: This needs to use cached data
if companion.session.FRONTIER_CAPI_PATH_PROFILE not in companion.session.capi_raw_data:
logger.info('No cached data, aborting...')
hotkeymgr.play_bad()
# LANG: No Frontier CAPI data yet when trying to use 'File' > 'Status'
self.status['text'] = _("Status: No CAPI data yet")
return
except Exception as e:
logger.exception("error while attempting to show status")
self.status['text'] = str(e)
return
capi_data = json.loads(
companion.session.capi_raw_data[companion.session.FRONTIER_CAPI_PATH_PROFILE].raw_data
)
if not data.get('commander') or not data['commander'].get('name', '').strip():
if not capi_data.get('commander') or not capi_data['commander'].get('name', '').strip():
# Shouldn't happen
# LANG: Unknown commander
self.status['text'] = _("Who are you?!")
elif (
not data.get('lastSystem')
or not data['lastSystem'].get('name', '').strip()
or not data.get('lastStarport')
or not data['lastStarport'].get('name', '').strip()
not capi_data.get('lastSystem')
or not capi_data['lastSystem'].get('name', '').strip()
or not capi_data.get('lastStarport')
or not capi_data['lastStarport'].get('name', '').strip()
):
# Shouldn't happen
# LANG: Unknown location
self.status['text'] = _("Where are you?!")
elif not data.get('ship') or not data['ship'].get('modules') or not data['ship'].get('name', '').strip():
elif (
not capi_data.get('ship') or not capi_data['ship'].get('modules')
or not capi_data['ship'].get('name', '').strip()
):
# Shouldn't happen
# LANG: Unknown ship
self.status['text'] = _("What are you flying?!")
else:
self.status['text'] = ''
StatsResults(self.parent, data)
StatsResults(self.parent, capi_data)
class StatsResults(tk.Toplevel):
+90
View File
@@ -0,0 +1,90 @@
"""Test the apply functions used by killswitch to modify data."""
import copy
from typing import Any, Optional
import pytest
import killswitch
from killswitch import UPDATABLE_DATA
@pytest.mark.parametrize(
('source', 'key', 'action', 'to_set', 'result'),
[
(['this', 'is', 'a', 'test'], '1', 'delete', None, ['this', 'a', 'test']),
(['this', 'is', 'a', 'test'], '1', '', None, ['this', None, 'a', 'test']),
({'now': 'with', 'a': 'dict'}, 'now', 'delete', None, {'a': 'dict'}),
({'now': 'with', 'a': 'dict'}, 'now', '', None, {'now': None, 'a': 'dict'}),
(['test append'], '1', '', 'yay', ['test append', 'yay']),
(['test neg del'], '-1', 'delete', None, []),
(['test neg del'], '-1337', 'delete', None, ['test neg del']),
(['test neg del'], '-2', 'delete', None, ['test neg del']),
(['test too high del'], '30', 'delete', None, ['test too high del']),
]
)
def test_apply(source: UPDATABLE_DATA, key: str, action: str, to_set: Any, result: UPDATABLE_DATA) -> None:
"""Test that a single level apply works as expected."""
cpy = copy.deepcopy(source)
killswitch._apply(target=cpy, key=key, to_set=to_set, delete=action == 'delete')
assert cpy == result
def test_apply_errors() -> None:
"""_apply should fail when passed something that isn't a Sequence or MutableMapping."""
with pytest.raises(ValueError, match=r'Dont know how to'):
killswitch._apply(set(), '0', None, False) # type: ignore # Its intentional that its broken
killswitch._apply(None, '', None) # type: ignore # Its intentional that its broken
with pytest.raises(ValueError, match=r'Cannot use string'):
killswitch._apply([], 'test', None, False)
def test_apply_no_error() -> None:
"""
_apply should not raise when deleting keys that dont exist, nor should it raise on setting keys that dont exist.
The only exception here is for lists. if a list is malformed to what a killswitch expects, it SHOULD explode,
thus causing the killswitch to fail and eat the entire message.
"""
killswitch._apply([], '0', None, True)
killswitch._apply({}, '0', None, True)
killswitch._apply({}, "this doesn't exist", None, True)
with pytest.raises(IndexError):
killswitch._apply([], '1', 'bang?')
@pytest.mark.parametrize(
('input', 'expected'),
[
('1', 1), ('1337', 1337), ('no.', None), ('0x10', None), ('010', 10),
(False, 0), (str((1 << 63)-1), (1 << 63)-1), (True, 1), (str(1 << 1337), 1 << 1337)
]
)
def test_get_int(input: str, expected: Optional[int]) -> None:
"""Check that _get_int doesn't throw when handed bad data."""
assert expected == killswitch._get_int(input)
@pytest.mark.parametrize(
('source', 'key', 'action', 'to_set', 'result'),
[
(['this', 'is', 'a', 'test'], '1', 'delete', None, ['this', 'a', 'test']),
(['this', 'is', 'a', 'test'], '1', '', None, ['this', None, 'a', 'test']),
({'now': 'with', 'a': 'dict'}, 'now', 'delete', None, {'a': 'dict'}),
({'now': 'with', 'a': 'dict'}, 'now', '', None, {'now': None, 'a': 'dict'}),
({'depth': {'is': 'important'}}, 'depth.is', '', 'nonexistent', {'depth': {'is': 'nonexistent'}}),
([{'test': ['stuff']}], '0.test.0', '', 'things', [{'test': ['things']}]),
(({'test': {'with': ['a', 'tuple']}},), '0.test.with.0', 'delete', '', ({'test': {'with': ['tuple']}},)),
({'test': ['with a', {'set', 'of', 'stuff'}]}, 'test.1', 'delete', '', {'test': ['with a']}),
({'keys.can.have.': 'dots!'}, 'keys.can.have.', '', '.s!', {'keys.can.have.': '.s!'}),
({'multilevel.keys': {'with.dots': False}}, 'multilevel.keys.with.dots',
'', True, {'multilevel.keys': {'with.dots': True}}),
({'dotted.key.one.level': False}, 'dotted.key.one.level', '', True, {'dotted.key.one.level': True}),
],
)
def test_deep_get(source: UPDATABLE_DATA, key: str, action: str, to_set: Any, result: UPDATABLE_DATA) -> None:
"""Test _deep_get behaves as expected."""
cpy = copy.deepcopy(source)
killswitch._deep_apply(target=cpy, path=key, to_set=to_set, delete=action == 'delete')
assert cpy == result
+93
View File
@@ -0,0 +1,93 @@
"""Tests of killswitch behaviour."""
import copy
from typing import Optional
import pytest
import semantic_version
import killswitch
TEST_SET = killswitch.KillSwitchSet([
killswitch.KillSwitches(
version=semantic_version.SimpleSpec('1.0.0'),
kills={
'no-actions': killswitch.SingleKill('no-actions', 'test'),
'delete-action': killswitch.SingleKill('delete-action', 'remove stuff', delete_fields=['a', 'b.c']),
'delete-action-l': killswitch.SingleKill('delete-action-l', 'remove stuff', delete_fields=['2', '0']),
'set-action': killswitch.SingleKill('set-action', 'set stuff', set_fields={'a': False, 'b.c': True}),
'redact-action': killswitch.SingleKill('redact-action', 'redact stuff', redact_fields=['a', 'b.c'])
}
)
])
@pytest.mark.parametrize(
('input', 'kill', 'should_pass', 'result', 'version'),
[
([], 'doesnt-exist', True, None, '1.0.0'),
# should fail, attempts to use 'a' to index a list
(['a', 'b', 'c'], 'delete-action', False, ['a', 'b', 'c'], '1.0.0'),
(['a', 'b', 'c'], 'delete-action-l', True, ['b'], '1.0.0'),
(set(), 'delete-action-l', False, None, '1.0.0'), # set should be thrown out because it cant be indext
(['a', 'b'], 'delete-action-l', True, ['b'], '1.0.0'), # has a missing value, but that's fine for delete
(['a', 'b'], 'delete-action-l', True, ['a', 'b'], '1.1.0'), # wrong version
],
)
def test_killswitch(
input: killswitch.UPDATABLE_DATA, kill: str, should_pass: bool, result: Optional[killswitch.UPDATABLE_DATA],
version: str
) -> None:
"""Simple killswitch tests."""
should_return, res = TEST_SET.check_killswitch(kill, input, version=version)
assert (not should_return) == should_pass, (
f'expected to {"pass" if should_pass else "fail"}, but {"passed" if not should_pass else "failed"}'
)
if result is None:
return # we didn't expect any result
assert res == result
@pytest.mark.parametrize(
('kill_dict', 'input', 'result'),
[
({'set_fields': {'test': None}}, {}, {'test': None}),
({'set_fields': {'test': None}, 'delete_fields': ['test']}, {}, {}),
({'set_fields': {'test': None}, 'redact_fields': ['test']}, {}, {'test': 'REDACTED'}),
({'set_fields': {'test': None}, 'redact_fields': ['test'], 'delete_fields': ['test']}, {}, {}),
],
)
def test_operator_precedence(
kill_dict: killswitch.SingleKillSwitchJSON, input: killswitch.UPDATABLE_DATA, result: killswitch.UPDATABLE_DATA
) -> None:
"""Ensure that operators are being applied in the correct order."""
kill = killswitch.SingleKill(
"", "", kill_dict.get('redact_fields'), kill_dict.get('delete_fields'), kill_dict.get('set_fields')
)
cpy = copy.deepcopy(input)
kill.apply_rules(cpy)
assert cpy == result
@pytest.mark.parametrize(
('names', 'input', 'result', 'expected_return'),
[
(['no-actions', 'delete-action'], {'a': 1}, {'a': 1}, True),
# this is true because delete-action keyerrors, thus causing failsafe
(['delete-action'], {'a': 1}, {'a': 1}, True),
(['delete-action'], {'a': 1, 'b': {'c': 2}}, {'b': {}}, False),
]
)
def test_check_multiple(
names: list[str], input: killswitch.UPDATABLE_DATA, result: killswitch.UPDATABLE_DATA, expected_return: bool
) -> None:
"""Check that order is correct when checking multiple killswitches."""
should_return, data = TEST_SET.check_multiple_killswitches(input, *names, version='1.0.0')
assert should_return == expected_return
assert data == result