1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-06-05 18:03:17 +03:00

Merge branch 'develop'

This commit is contained in:
Athanasius 2021-07-29 20:23:49 +01:00
commit bf3cd86e26
No known key found for this signature in database
GPG Key ID: AE3E527847057C7D
46 changed files with 12391 additions and 11645 deletions

View File

@ -19,7 +19,7 @@ jobs:
- uses: actions/checkout@v2.3.4
- uses: actions/setup-python@v2.2.2
with:
python-version: "3.9.5"
python-version: "3.9.6"
architecture: "x86"
- name: Install python tools

View File

@ -1 +1 @@
3.9.5
3.9.6

View File

@ -1,7 +1,7 @@
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.5.
* We now test against, and package with, Python 3.9.6.
**As a consequence of this we no longer support Windows 7.
This is due to
@ -17,6 +17,45 @@ 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.1.2
===
* A Journal event change in EDO Update 6 will have caused some translated
suit names to not be properly mapped to their sane versions. This change
has now been addressed and suit names should always come out as intended in
the EDMarketConnector.exe UI.
* There is a new command-line argument to cause all Frontier Authorisation to
be forgotten: `EDMarketConnector.exe --forget-frontier-auth`.
* Situations where Frontier CAPI data doesn't agree on the location we have
tracked from Journal events will now log more useful information.
Bug Fixes
---
* The code should now be robust against the case of any Journal event name
changing.
Plugin Developers
---
* We now store `GameLanguage`, `GameVersion` and `GameBuild` in the `state`
passed to `journal_entry()` from the `LoadGame` event.
* Various suit data, i.e. class and mods, is now stored from relevant
Journal events, rather than only being available from CAPI data. In
general we now consider the Journal to be the canonical source of suit
data, with CAPI only as a backup.
* Backpack contents should now track correctly if using the 'Resupply' option
available on the ship boarding menu.
* We now cache the main application version when first determined, so
that subsequent references to `config.appversion()` won't cause extra log
spam (which was possible when, e.g. having a git command but using non-git
source).
Release 5.1.1
===

View File

@ -388,10 +388,6 @@ sys.path: {sys.path}'''
logger.error('Frontier CAPI Server returned an error')
sys.exit(EXIT_SERVER)
except companion.SKUError:
logger.error('Frontier CAPI Server SKU problem')
sys.exit(EXIT_SERVER)
except companion.CredentialsError:
logger.error('Frontier CAPI Server: Invalid Credentials')
sys.exit(EXIT_CREDENTIALS)

View File

@ -82,11 +82,23 @@ if __name__ == '__main__': # noqa: C901
action='store_true'
)
parser.add_argument(
'--forget-frontier-auth',
help='resets all authentication tokens',
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',
)
auth_options = parser.add_mutually_exclusive_group(required=False)
auth_options.add_argument('--force-localserver-for-auth',
help='Force EDMC to use a localhost webserver for Frontier Auth callback',
@ -123,6 +135,17 @@ if __name__ == '__main__': # noqa: C901
parser.print_help()
exit(1)
if args.debug_sender and len(args.debug_sender) > 0:
import config as conf_module
import debug_webserver
from edmc_data import DEBUG_WEBSERVER_HOST, DEBUG_WEBSERVER_PORT
conf_module.debug_senders = [x.casefold() for x in args.debug_sender] # duplicate the list just in case
for d in conf_module.debug_senders:
logger.info(f'marked {d} for debug')
debug_webserver.run_listener(DEBUG_WEBSERVER_HOST, DEBUG_WEBSERVER_PORT)
def handle_edmc_callback_or_foregrounding() -> None: # noqa: CCR001
"""Handle any edmc:// auth callback, else foreground existing window."""
logger.trace('Begin...')
@ -497,6 +520,7 @@ class AppWindow(object):
self.always_ontop = tk.BooleanVar(value=bool(config.get_int('always_ontop')))
self.system_menu = tk.Menu(self.menubar, name='system', tearoff=tk.FALSE)
self.system_menu.add_separator()
# LANG: Appearance - Label for checkbox to select if application always on top
self.system_menu.add_checkbutton(label=_('Always on top'),
variable=self.always_ontop,
command=self.ontop_changed) # Appearance setting
@ -715,9 +739,11 @@ class AppWindow(object):
self.menubar.entryconfigure(3, label=_('View')) # LANG: 'View' menu title on OSX
self.menubar.entryconfigure(4, label=_('Window')) # LANG: 'Window' menu title on OSX
self.menubar.entryconfigure(5, label=_('Help')) # LANG: Help' menu title on OSX
self.system_menu.entryconfigure(0, label=_("About {APP}").format(
APP=applongname)) # LANG: App menu entry on OSX
self.system_menu.entryconfigure(1, label=_("Check for Updates...")) # LANG: Help > Check for Updates
self.system_menu.entryconfigure(
0,
label=_("About {APP}").format(APP=applongname) # LANG: App menu entry on OSX
)
self.system_menu.entryconfigure(1, label=_("Check for Updates...")) # LANG: Help > Check for Updates...
self.file_menu.entryconfigure(0, label=_('Save Raw Data...')) # LANG: File > Save Raw Data...
self.view_menu.entryconfigure(0, label=_('Status')) # LANG: File > Status
self.help_menu.entryconfigure(1, label=_('Privacy Policy')) # LANG: Help > Privacy Policy
@ -733,7 +759,7 @@ class AppWindow(object):
# File menu
self.file_menu.entryconfigure(0, label=_('Status')) # LANG: File > Status
self.file_menu.entryconfigure(1, label=_('Save Raw Data...')) # LANG: File > Save Raw Data...
self.file_menu.entryconfigure(2, label=_('Settings')) # LANG: File > Settings (Windows)
self.file_menu.entryconfigure(2, label=_('Settings')) # LANG: File > Settings
self.file_menu.entryconfigure(4, label=_('Exit')) # LANG: File > Exit
# Help menu
@ -744,11 +770,12 @@ class AppWindow(object):
self.help_menu.entryconfigure(4, label=_("About {APP}").format(APP=applongname)) # LANG: Help > About App
# Edit menu
self.edit_menu.entryconfigure(0, label=_('Copy')) # LANG: As in Copy and Paste
self.edit_menu.entryconfigure(0, label=_('Copy')) # LANG: Label for 'Copy' as in 'Copy and Paste'
def login(self):
"""Initiate CAPI/Frontier login and set other necessary state."""
if not self.status['text']:
# LANG: Status - Attempting to get a Frontier Auth Access Token
self.status['text'] = _('Logging in...')
self.button['state'] = self.theme_button['state'] = tk.DISABLED
@ -803,10 +830,12 @@ class AppWindow(object):
elif (config.get_int('output') & config.OUT_MKT_EDDN) \
and not (data['lastStarport'].get('commodities') or data['lastStarport'].get('modules')):
if not self.status['text']:
# LANG: Status - Either no market or no modules data for station from Frontier CAPI
self.status['text'] = _("Station doesn't have anything!")
elif not data['lastStarport'].get('commodities'):
if not self.status['text']:
# LANG: Status - No station market data from Frontier CAPI
self.status['text'] = _("Station doesn't have a market!")
elif config.get_int('output') & (config.OUT_MKT_CSV | config.OUT_MKT_TD):
@ -851,6 +880,7 @@ class AppWindow(object):
elif play_sound:
hotkeymgr.play_good()
# LANG: Status - Attempting to retrieve data from Frontier CAPI
self.status['text'] = _('Fetching data...')
self.button['state'] = self.theme_button['state'] = tk.DISABLED
self.w.update_idletasks()
@ -886,14 +916,19 @@ class AppWindow(object):
elif auto_update and not monitor.state['OnFoot'] and not 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}")
raise companion.ServerLagging()
elif data['lastSystem']['name'] != monitor.system:
# CAPI system must match last journal one
logger.warning(f"{data['lastSystem']['name']!r} != {monitor.system!r}")
raise companion.ServerLagging()
elif data['lastStarport']['name'] != monitor.station:
if monitor.state['OnFoot'] and monitor.station:
logger.warning(f"({data['lastStarport']['name']!r} != {monitor.station!r}) AND "
f"{monitor.state['OnFoot']!r} and {monitor.station!r}")
raise companion.ServerLagging()
else:
@ -901,18 +936,32 @@ class AppWindow(object):
if data['commander']['docked']:
last_station = data['lastStarport']['name']
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()
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']:
# CAPI ship must match
logger.warning(f"not {monitor.state['OnFoot']!r} and "
f"{data['ship']['id']!r} != {monitor.state['ShipID']!r}")
raise companion.ServerLagging()
elif not monitor.state['OnFoot'] and 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}")
raise companion.ServerLagging()
else:
@ -1263,7 +1312,7 @@ class AppWindow(object):
if time() < self.holdofftime:
# Update button in main window
self.button['text'] = self.theme_button['text'] \
= _('cooldown {SS}s').format(SS=int(self.holdofftime - time()))
= _('cooldown {SS}s').format(SS=int(self.holdofftime - time())) # LANG: Cooldown on 'Update' button
self.w.after(1000, self.cooldown)
else:
@ -1311,6 +1360,7 @@ class AppWindow(object):
tk.Toplevel.__init__(self, parent)
self.parent = parent
# LANG: Help > About App
self.title(_('About {APP}').format(APP=applongname))
if parent.winfo_viewable():
@ -1344,6 +1394,7 @@ class AppWindow(object):
row += 1
self.appversion_label = tk.Label(frame, text=appversion())
self.appversion_label.grid(row=row, column=0, sticky=tk.E)
# LANG: Help > Release Notes
self.appversion = HyperlinkLabel(frame, compound=tk.RIGHT, text=_('Release Notes'),
url='https://github.com/EDCD/EDMarketConnector/releases/tag/Release/'
f'{appversion_nobuild()}',
@ -1369,6 +1420,7 @@ class AppWindow(object):
# OK button to close the window
ttk.Label(frame).grid(row=row, column=0) # spacer
row += 1
# LANG: Generic 'OK' button label
button = ttk.Button(frame, text=_('OK'), command=self.apply)
button.grid(row=row, column=2, sticky=tk.E)
button.bind("<Return>", lambda event: self.apply())
@ -1389,6 +1441,7 @@ class AppWindow(object):
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()
@ -1675,6 +1728,11 @@ sys.path: {sys.path}'''
else:
log_locale('After switching to UTF-8 encoding (same language)')
# 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)
# TODO: unittests in place of these
# logger.debug('Test from __main__')
# test_logging()
@ -1735,6 +1793,7 @@ sys.path: {sys.path}'''
"""Display message about plugins not updated for Python 3.x."""
plugins_not_py3_last = config.get_int('plugins_not_py3_last', default=0)
if (plugins_not_py3_last + 86400) < int(time()) and len(plug.PLUGINS_not_py3):
# LANG: Popup-text about 'active' plugins without Python 3.x support
popup_text = _(
"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 "
@ -1744,14 +1803,18 @@ sys.path: {sys.path}'''
)
# Substitute in the other words.
# LANG: 'Plugins' tab / 'File' menu / 'File' > 'Settings'
popup_text = popup_text.format(PLUGINS=_('Plugins'), FILE=_('File'), SETTINGS=_('Settings'),
DISABLED='.disabled')
popup_text = popup_text.format(
PLUGINS=_('Plugins'), # LANG: Settings > Plugins tab
FILE=_('File'), # LANG: 'File' menu
SETTINGS=_('Settings'), # LANG: File > Settings
DISABLED='.disabled'
)
# And now we do need these to be actual \r\n
popup_text = popup_text.replace('\\n', '\n')
popup_text = popup_text.replace('\\r', '\r')
tk.messagebox.showinfo(
# LANG: Popup window title for list of 'enabled' plugins that don't work with Python 3.x
_('EDMC: Plugins Without Python 3.x Support'),
popup_text
)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,397 +1,406 @@
/* Language name */
"!Language" = "English";
/* In files: companion.py:170; */
/* companion.py: Frontier CAPI didn't respond; In files: companion.py:171; */
"Error: Frontier CAPI didn't respond" = "Error: Frontier CAPI didn't respond";
/* In files: companion.py:183; */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
"Error: Frontier server is lagging" = "Error: Frontier server is lagging";
/* In files: companion.py:196; */
"Error: Frontier server SKU problem" = "Error: Frontier server SKU problem";
/* 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?" = "Docked but unknown station: EDO Settlement?";
/* In files: companion.py:205; */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
"Error: Invalid Credentials" = "Error: Invalid Credentials";
/* In files: companion.py:220; */
/* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:230; */
"Error: Wrong Cmdr" = "Error: Wrong Cmdr";
/* In files: companion.py:330; companion.py:406; */
/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:341; companion.py:422; */
"Error" = "Error";
/* In files: companion.py:368; companion.py:372; */
/* 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; */
"Error: Couldn't check token customer_id" = "Error: Couldn't check token customer_id";
/* In files: companion.py:377; */
/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:391; */
"Error: customer_id doesn't match!" = "Error: customer_id doesn't match!";
/* In files: companion.py:398; */
/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:413; */
"Error: unable to get token" = "Error: unable to get token";
/* In files: companion.py:542; */
/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:575; */
"Frontier CAPI query failure" = "Frontier CAPI query failure";
/* In files: companion.py:557; */
/* companion.py: Frontier CAPI data retrieval failed with 5XX code; In files: companion.py:591; */
"Frontier CAPI server error" = "Frontier CAPI server error";
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:418; EDMarketConnector.py:711; EDMarketConnector.py:1259; */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
"Update" = "Update";
/* In files: EDMarketConnector.py:500; prefs.py:788; */
/* 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; */
"Always on top" = "Always on top";
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:629; */
/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:636; */
"Unknown" = "Unknown";
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:698; */
/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:705; */
"Error: Check E:D journal file location" = "Error: Check E:D journal file location";
/* EDMarketConnector.py: Main window; stats.py: Cmdr stats; In files: EDMarketConnector.py:705; edsm.py:216; stats.py:50; theme.py:226; */
/* 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; */
"Cmdr" = "Cmdr";
/* EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:707; EDMarketConnector.py:1029; */
/* 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; */
"Role" = "Role";
/* EDMarketConnector.py: Main window; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:707; EDMarketConnector.py:1039; EDMarketConnector.py:1062; stats.py:362; */
/* 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; */
"Ship" = "Ship";
/* EDMarketConnector.py: Main window; In files: EDMarketConnector.py:708; */
/* EDMarketConnector.py: Label for 'Suit' line in main UI; In files: EDMarketConnector.py:715; */
"Suit" = "Suit";
/* EDMarketConnector.py: Main window; stats.py: Main window; In files: EDMarketConnector.py:709; prefs.py:567; stats.py:364; */
/* 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; */
"System" = "System";
/* EDMarketConnector.py: Main window; stats.py: Status dialog subtitle; In files: EDMarketConnector.py:710; prefs.py:584; prefs.py:688; stats.py:365; */
/* 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; */
"Station" = "Station";
/* EDMarketConnector.py: Menu title on OSX; EDMarketConnector.py: Menu title; EDMarketConnector.py: words for use in python 2 plugin error; In files: EDMarketConnector.py:713; EDMarketConnector.py:726; EDMarketConnector.py:729; EDMarketConnector.py:1736; */
/* 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; */
"File" = "File";
/* EDMarketConnector.py: Menu title on OSX; EDMarketConnector.py: Menu title; In files: EDMarketConnector.py:714; EDMarketConnector.py:727; EDMarketConnector.py:730; */
/* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:721; EDMarketConnector.py:736; EDMarketConnector.py:739; */
"Edit" = "Edit";
/* EDMarketConnector.py: Menu title on OSX; In files: EDMarketConnector.py:715; */
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
"View" = "View";
/* EDMarketConnector.py: Menu title on OSX; In files: EDMarketConnector.py:716; */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
"Window" = "Window";
/* EDMarketConnector.py: Menu title on OSX; EDMarketConnector.py: Menu title; In files: EDMarketConnector.py:717; EDMarketConnector.py:728; EDMarketConnector.py:731; */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
"Help" = "Help";
/* EDMarketConnector.py: Menu title on OSX; EDMarketConnector.py: App menu entry; In files: EDMarketConnector.py:718; EDMarketConnector.py:744; EDMarketConnector.py:1303; */
/* EDMarketConnector.py: App menu entry on OSX; EDMarketConnector.py: Help > About App; In files: EDMarketConnector.py:727; EDMarketConnector.py:753; EDMarketConnector.py:1347; */
"About {APP}" = "About {APP}";
/* EDMarketConnector.py: Menu item; In files: EDMarketConnector.py:720; EDMarketConnector.py:743; */
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
"Check for Updates..." = "Check for Updates...";
/* EDMarketConnector.py: Menu item; In files: EDMarketConnector.py:721; EDMarketConnector.py:735; */
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
"Save Raw Data..." = "Save Raw Data...";
/* EDMarketConnector.py: Menu item; stats.py: Status dialog title; In files: EDMarketConnector.py:722; EDMarketConnector.py:734; stats.py:359; */
/* EDMarketConnector.py: File > Status; stats.py: Status dialog title; In files: EDMarketConnector.py:731; EDMarketConnector.py:743; stats.py:360; */
"Status" = "Status";
/* EDMarketConnector.py: Help menu item; In files: EDMarketConnector.py:723; EDMarketConnector.py:741; */
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
"Privacy Policy" = "Privacy Policy";
/* EDMarketConnector.py: Help menu item; In files: EDMarketConnector.py:724; EDMarketConnector.py:742; EDMarketConnector.py:1336; */
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
"Release Notes" = "Release Notes";
/* EDMarketConnector.py: Item in the File menu on Windows; EDMarketConnector.py: words for use in python 2 plugin error; In files: EDMarketConnector.py:736; EDMarketConnector.py:1736; prefs.py:248; */
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
"Settings" = "Settings";
/* EDMarketConnector.py: Item in the File menu on Windows; In files: EDMarketConnector.py:737; */
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
"Exit" = "Exit";
/* EDMarketConnector.py: Help menu item; In files: EDMarketConnector.py:740; */
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
"Documentation" = "Documentation";
/* EDMarketConnector.py: As in Copy and Paste; In files: EDMarketConnector.py:747; ttkHyperlinkLabel.py:41; */
/* 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; */
"Copy" = "Copy";
/* In files: EDMarketConnector.py:752; */
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
"Logging in..." = "Logging in...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:768; EDMarketConnector.py:1172; */
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
"Authentication successful" = "Authentication successful";
/* In files: EDMarketConnector.py:798; */
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
"You're not docked at a station!" = "You're not docked at a station!";
/* In files: EDMarketConnector.py:805; */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
"Station doesn't have anything!" = "Station doesn't have anything!";
/* In files: EDMarketConnector.py:809; */
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
"Station doesn't have a market!" = "Station doesn't have a market!";
/* In files: EDMarketConnector.py:853; EDMarketConnector.py:1381; stats.py:278; */
/* 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; */
"Fetching data..." = "Fetching data...";
/* In files: EDMarketConnector.py:865; */
/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:880; */
"CAPI: No commander data returned" = "CAPI: No commander data returned";
/* stats.py: Unknown commander; In files: EDMarketConnector.py:868; stats.py:296; */
/* 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; */
"Who are you?!" = "Who are you?!";
/* stats.py: Unknown location; In files: EDMarketConnector.py:873; stats.py:306; */
/* 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; */
"Where are you?!" = "Where are you?!";
/* stats.py: Unknown ship; In files: EDMarketConnector.py:876; stats.py:311; */
/* 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; */
"What are you flying?!" = "What are you flying?!";
/* In files: EDMarketConnector.py:983; */
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
"Last updated at %H:%M:%S" = "Last updated at %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1009; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
"Fighter" = "Fighter";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1010; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
"Gunner" = "Gunner";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1011; */
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
"Helm" = "Helm";
/* In files: EDMarketConnector.py:1255; */
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
"cooldown {SS}s" = "cooldown {SS}s";
/* In files: EDMarketConnector.py:1361; prefs.py:297; */
/* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1407; prefs.py:304; */
"OK" = "OK";
/* In files: EDMarketConnector.py:1441; */
/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1489; */
"Shutting down..." = "Shutting down...";
/* In files: EDMarketConnector.py:1726:1732; */
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
"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." = "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.";
/* EDMarketConnector.py: words for use in python 2 plugin error; In files: EDMarketConnector.py:1736; prefs.py:888; */
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
"Plugins" = "Plugins";
/* In files: EDMarketConnector.py:1743; */
/* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:1801; */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Plugins Without Python 3.x Support";
/* In files: journal_lock.py:205; */
/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:206; */
"Journal directory already locked" = "Journal directory already locked";
/* In files: journal_lock.py:221:222; */
/* journal_lock.py: Text for when newly selected Journal directory is already locked; In files: journal_lock.py:223:224; */
"The new Journal Directory location is already locked.{CR}You can either attempt to resolve this and then Retry, or choose to Ignore this." = "The new Journal Directory location is already locked.{CR}You can either attempt to resolve this and then Retry, or choose to Ignore this.";
/* In files: journal_lock.py:225; */
/* journal_lock.py: Generic 'Retry' button label; In files: journal_lock.py:228; */
"Retry" = "Retry";
/* In files: journal_lock.py:228; */
/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:232; */
"Ignore" = "Ignore";
/* In files: l10n.py:193; prefs.py:438; prefs.py:636; prefs.py:664; */
/* 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; */
"Default" = "Default";
/* In files: coriolis.py:51; coriolis.py:51; coriolis.py:88; coriolis.py:104; coriolis.py:110; */
/* 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; */
"Auto" = "Auto";
/* In files: coriolis.py:51; coriolis.py:88; coriolis.py:102; */
/* coriolis.py: 'Normal' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - normal; In files: coriolis.py:53; coriolis.py:99; coriolis.py:115; */
"Normal" = "Normal";
/* In files: coriolis.py:51; coriolis.py:88; coriolis.py:103; */
/* coriolis.py: 'Beta' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - beta; In files: coriolis.py:54; coriolis.py:100; coriolis.py:116; */
"Beta" = "Beta";
/* In files: coriolis.py:64:66; */
/* coriolis.py: Settings>Coriolis: Help/hint for changing coriolis URLs; In files: coriolis.py:69:71; */
"Set the URL to use with coriolis.io ship loadouts. Note that this MUST end with '/import?data='" = "Set the URL to use with coriolis.io ship loadouts. Note that this MUST end with '/import?data='";
/* In files: coriolis.py:69; */
/* coriolis.py: Settings>Coriolis: Label for 'NOT alpha/beta game version' URL; In files: coriolis.py:75; */
"Normal URL" = "Normal URL";
/* In files: coriolis.py:71; coriolis.py:78; */
/* coriolis.py: Generic 'Reset' button label; In files: coriolis.py:78; coriolis.py:87; */
"Reset" = "Reset";
/* In files: coriolis.py:76; */
/* coriolis.py: Settings>Coriolis: Label for 'alpha/beta game version' URL; In files: coriolis.py:84; */
"Beta URL" = "Beta URL";
/* In files: coriolis.py:83; */
/* coriolis.py: Settings>Coriolis: Label for selection of using Normal, Beta or 'auto' Coriolis URL; In files: coriolis.py:94; */
"Override Beta/Normal Selection" = "Override Beta/Normal Selection";
/* In files: coriolis.py:120; */
/* coriolis.py: Settings>Coriolis - invalid override mode found; In files: coriolis.py:134; */
"Invalid Coriolis override mode!" = "Invalid Coriolis override mode!";
/* In files: eddb.py:99; */
/* eddb.py: Journal Processing disabled due to an active killswitch; In files: eddb.py:100; */
"EDDB Journal processing disabled. See Log." = "EDDB Journal processing disabled. See Log.";
/* In files: eddn.py:215; eddn.py:593; eddn.py:940; */
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
"Sending data to EDDN..." = "Sending data to EDDN...";
/* In files: eddn.py:260; eddn.py:878; eddn.py:913; eddn.py:952; */
/* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:264; eddn.py:907; eddn.py:942; eddn.py:981; */
"Error: Can't connect to EDDN" = "Error: Can't connect to EDDN";
/* In files: eddn.py:672; */
/* 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 Error: EDMC is too old for EDDN. Please update.";
/* 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 Error: Validation Failed (EDMC Too Old?). See 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 Error: Returned {STATUS} status code" = "EDDN Error: Returned {STATUS} status code";
/* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:699; */
"Send station data to the Elite Dangerous Data Network" = "Send station data to the Elite Dangerous Data Network";
/* In files: eddn.py:682; */
/* eddn.py: Enable EDDN support for system and other scan data checkbox label; In files: eddn.py:710; */
"Send system and scan data to the Elite Dangerous Data Network" = "Send system and scan data to the Elite Dangerous Data Network";
/* In files: eddn.py:692; */
/* 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; */
"Delay sending until docked" = "Delay sending until docked";
/* In files: eddn.py:756; */
/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:785; */
"EDDN journal handler disabled. See Log." = "EDDN journal handler disabled. See Log.";
/* In files: edsm.py:197; */
/* edsm.py: Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:198; */
"Send flight log and Cmdr status to EDSM" = "Send flight log and Cmdr status to EDSM";
/* In files: edsm.py:206; */
/* edsm.py: Settings>EDSM - Label on header/URL to EDSM API key page; In files: edsm.py:208; */
"Elite Dangerous Star Map credentials" = "Elite Dangerous Star Map credentials";
/* In files: edsm.py:223; */
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
"Commander Name" = "Commander Name";
/* In files: edsm.py:230; inara.py:233; */
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
"API Key" = "API Key";
/* stats.py: No rank; In files: edsm.py:256; prefs.py:487; prefs.py:1091; prefs.py:1123; 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:262; prefs.py:518; prefs.py:1156; prefs.py:1189; stats.py:117; stats.py:136; stats.py:155; stats.py:172; */
"None" = "None";
/* In files: edsm.py:351; */
/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:358; */
"EDSM Handler disabled. See Log." = "EDSM Handler disabled. See Log.";
/* In files: edsm.py:632; edsm.py:734; */
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
"Error: EDSM {MSG}" = "Error: EDSM {MSG}";
/* In files: edsm.py:668; edsm.py:730; */
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
"Error: Can't connect to EDSM" = "Error: Can't connect to EDSM";
/* In files: inara.py:215; */
/* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:216; */
"Send flight log and Cmdr status to Inara" = "Send flight log and Cmdr status to Inara";
/* In files: inara.py:225; */
/* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:228; */
"Inara credentials" = "Inara credentials";
/* In files: inara.py:331; */
/* inara.py: INARA support disabled via killswitch; In files: inara.py:335; */
"Inara disabled. See Log." = "Inara disabled. See Log.";
/* In files: inara.py:1537; inara.py:1549; */
/* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
"Error: Inara {MSG}" = "Error: Inara {MSG}";
/* In files: prefs.py:248; */
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Preferences";
/* In files: prefs.py:338; */
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
"Please choose what data to save" = "Please choose what data to save";
/* In files: prefs.py:344; */
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
"Market data in CSV format file" = "Market data in CSV format file";
/* In files: prefs.py:353; */
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
"Market data in Trade Dangerous format file" = "Market data in Trade Dangerous format file";
/* In files: prefs.py:363; */
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
"Ship loadout" = "Ship loadout";
/* In files: prefs.py:373; */
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
"Automatically update on docking" = "Automatically update on docking";
/* In files: prefs.py:381; prefs.py:391; */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
"File location" = "File location";
/* In files: prefs.py:390; prefs.py:429; */
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
"Change..." = "Change...";
/* In files: prefs.py:390; prefs.py:429; */
/* 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; */
"Browse..." = "Browse...";
/* In files: prefs.py:397; */
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
"Output" = "Output";
/* In files: prefs.py:422; prefs.py:430; */
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
"E:D journal file location" = "E:D journal file location";
/* In files: prefs.py:454; */
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
"Keyboard shortcut" = "Keyboard shortcut";
/* In files: prefs.py:456; */
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
"Hotkey" = "Hotkey";
/* In files: prefs.py:464; */
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
"Re-start {APP} to use shortcuts" = "Re-start {APP} to use shortcuts";
/* In files: prefs.py:472; */
/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:502; */
"{APP} needs permission to use shortcuts" = "{APP} needs permission to use shortcuts";
/* In files: prefs.py:477; */
/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:507; */
"Open System Preferences" = "Open System Preferences";
/* In files: prefs.py:497; */
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
"Only when Elite: Dangerous is the active app" = "Only when Elite: Dangerous is the active app";
/* In files: prefs.py:507; */
/* prefs.py: Configuration - play sound when hotkey used; In files: prefs.py:540; */
"Play sound" = "Play sound";
/* In files: prefs.py:521; */
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
"Disable Automatic Application Updates Check when in-game" = "Disable Automatic Application Updates Check when in-game";
/* In files: prefs.py:533; */
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
"Preferred websites" = "Preferred websites";
/* In files: prefs.py:543; */
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
"Shipyard" = "Shipyard";
/* In files: prefs.py:554; */
/* prefs.py: Label for checkbox to utilise alternative Coriolis URL method; In files: prefs.py:591; */
"Use alternate URL method" = "Use alternate URL method";
/* In files: prefs.py:604; */
/* prefs.py: Configuration - Label for selection of Log Level; In files: prefs.py:644; */
"Log Level" = "Log Level";
/* In files: prefs.py:631; */
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
"Configuration" = "Configuration";
/* In files: prefs.py:642; */
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
"Normal text" = "Normal text";
/* In files: prefs.py:643; */
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
"Highlighted text" = "Highlighted text";
/* In files: prefs.py:651; */
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
"Language" = "Language";
/* In files: prefs.py:660; */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
"Theme" = "Theme";
/* In files: prefs.py:669; */
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
"Dark" = "Dark";
/* In files: prefs.py:675; */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
"Transparent" = "Transparent";
/* In files: prefs.py:719; */
/* prefs.py: Appearance - Label for selection of UI scaling; In files: prefs.py:770; */
"UI Scale Percentage" = "UI Scale Percentage";
/* In files: prefs.py:739; */
/* prefs.py: Appearance - Help/hint text for UI scaling selection; In files: prefs.py:791; */
"100 means Default{CR}Restart Required for{CR}changes to take effect!" = "100 means Default{CR}Restart Required for{CR}changes to take effect!";
/* In files: prefs.py:748; */
/* prefs.py: Appearance - Label for selection of main window transparency; In files: prefs.py:801; */
"Main window transparency" = "Main window transparency";
/* In files: prefs.py:767:770; */
/* prefs.py: Appearance - Help/hint text for Main window transparency selection; In files: prefs.py:821:824; */
"100 means fully opaque.{CR}Window is updated in real time" = "100 means fully opaque.{CR}Window is updated in real time";
/* In files: prefs.py:804; */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
"Appearance" = "Appearance";
/* In files: prefs.py:815; */
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
"Plugins folder" = "Plugins folder";
/* In files: prefs.py:823; */
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
"Open" = "Open";
/* In files: prefs.py:830; */
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
"Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name";
/* In files: prefs.py:840; */
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
"Enabled Plugins" = "Enabled Plugins";
/* In files: prefs.py:859; */
/* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:921; */
"Plugins Without Python 3.x Support:" = "Plugins Without Python 3.x Support:";
/* In files: prefs.py:866; */
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
"Information on migrating plugins" = "Information on migrating plugins";
/* In files: prefs.py:880; */
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
"Disabled Plugins" = "Disabled Plugins";
/* stats.py: Cmdr stats; In files: stats.py:51; */
@ -616,17 +625,8 @@
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 5" = "Rating 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:366; */
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
"Value" = "Value";
/* stats.py: Status dialog title; In files: stats.py:375; */
/* stats.py: Status dialog title; In files: stats.py:376; */
"Ships" = "Ships";
/* EDDN returned schema too old warning [plugins/eddn.py] */
"EDDN Error: EDMC is too old for EDDN. Please update." = "EDDN Error: EDMC is too old for EDDN. Please update.";
/* EDDN returned 400 status code [plugins/eddn.py] */
"EDDN Error: Validation Failed (EDMC Too Old?). See Log" = "EDDN Error: Validation Failed (EDMC Too Old?). See Log";
/* EDDN returned unknown HTTP status code [plugins/eddn.py] */
"EDDN Error: Returned {STATUS} status code" = "EDDN Error: Returned {STATUS} status code";

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,510 +1,509 @@
/* Language name */
"!Language" = "Magyar";
/* App menu entry on OSX. [EDMarketConnector.py] */
"About {APP}" = "Az {APP} névjegye";
/* Federation rank. [stats.py] */
"Admiral" = "Admirális";
/* Explorer rank. [stats.py] */
"Aimless" = "Céltalan";
/* Appearance setting. [EDMarketConnector.py] */
"Always on top" = "Mindig felül";
/* CQC rank. [stats.py] */
"Amateur" = "Amatőr";
/* EDSM setting. [edsm.py] */
"API Key" = "API kulcs";
/* Tab heading in settings. [prefs.py] */
"Appearance" = "Megjelenés";
/* Successfully authenticated with the Frontier website. [EDMarketConnector.py] */
"Authentication successful" = "A hitelesítés sikerült";
/* Output setting. [prefs.py] */
"Automatically update on docking" = "Automatikusan frissit dokkolásnál";
/* Cmdr stats. [stats.py] */
"Balance" = "Egyenleg";
/* Empire rank. [stats.py] */
"Baron" = "Báró";
/* Trade rank. [stats.py] */
"Broker" = "Bróker";
/* Folder selection button on Windows. [prefs.py] */
"Browse..." = "Böngész";
/* Federation rank. [stats.py] */
"Cadet" = "Kadét";
/* CQC rank. [stats.py] */
"Champion" = "Bajnok";
/* Folder selection button on OSX. [prefs.py] */
"Change..." = "Módosítás...";
/* Menu item. [EDMarketConnector.py] */
"Check for Updates..." = "Frissítések keresése";
/* Federation rank. [stats.py] */
"Chief Petty Officer" = "Törzs zászlós";
/* Main window. [EDMarketConnector.py] */
"Cmdr" = "Parancsnok";
/* Ranking. [stats.py] */
"Combat" = "Harc";
/* EDSM setting. [edsm.py] */
"Commander Name" = "Parancsnok név";
/* Combat rank. [stats.py] */
"Competent" = "Képesített";
/* Tab heading in settings. [prefs.py] */
"Configuration" = "Konfiguráció";
/* Update button in main window. [EDMarketConnector.py] */
"cooldown {SS}s" = "Lehűl {SS} másodperc";
/* As in Copy and Paste. [EDMarketConnector.py] */
"Copy" = "Másol";
/* Empire rank. [stats.py] */
"Count" = "Számol";
/* Ranking. [stats.py] */
"CQC" = "CQC";
/* Combat rank. [stats.py] */
"Dangerous" = "Veszélyes";
/* Appearance theme setting. [prefs.py] */
"Dark" = "Sötét";
/* Combat rank. [stats.py] */
"Deadly" = "Halálos";
/* Trade rank. [stats.py] */
"Dealer" = "Kereskedő";
/* Appearance theme and language setting. [l10n.py] */
"Default" = "Alap";
/* Output setting under 'Send system and scan data to the Elite Dangerous Data Network' new in E:D 2.2. [eddn.py] */
"Delay sending until docked" = "Küldés késletetése amig dokkolsz";
/* List of plugins in settings. [prefs.py] */
"Disabled Plugins" = "Plugin kikapcsolása";
/* Help menu item. [EDMarketConnector.py] */
"Documentation" = "Dokumentáció";
/* Empire rank. [stats.py] */
"Duke" = "Herceg";
/* Location of the new Journal file in E:D 2.2. [EDMarketConnector.py] */
"E:D journal file location" = "E:D journal fájl helye";
/* Empire rank. [stats.py] */
"Earl" = "Gróf";
/* Menu title. [EDMarketConnector.py] */
"Edit" = "Szerkeszt";
/* Top rank. [stats.py] */
"Elite" = "Elit";
/* Section heading in settings. [edsm.py] */
"Elite Dangerous Star Map credentials" = "Elite Dangerous Csillag térkép hitelesítése";
/* Ranking. [stats.py] */
"Empire" = "Birodalom";
/* List of plugins in settings. [prefs.py] */
"Enabled Plugins" = "Pluginok engedélyezése";
/* Federation rank. [stats.py] */
"Ensign" = "Zászlós";
/* Trade rank. [stats.py] */
"Entrepreneur" = "Vállalkozó";
/* [eddn.py] */
"Error: Can't connect to EDDN" = "Hiba:Nem lehet kapcsolódni az EDDN-hez";
/* [edsm.py] */
"Error: Can't connect to EDSM" = "Hiba:nem lehet kapcsólodni az EDSM-hez";
/* [inara.py] */
"Error: Can't connect to Inara" = "Hiba:Nem lehet kapcsolódni az Inarához";
/* [edsm.py] */
"Error: EDSM {MSG}" = "Hiba:EDSM {MSG}";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Hiba:Frontier szerver nem elérhető";
/* Raised when Companion API server is returning old data, e.g. when the servers are too busy. [companion.py] */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
"Error: Frontier server is lagging" = "Hiba:Frontier szerver laggol";
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"Edit" = "Szerkeszt";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
"View" = "Nézet";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
"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; */
"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; */
"About {APP}" = "Az {APP} névjegye";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
"Check for Updates..." = "Frissítések keresése";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
"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; */
"Status" = "Státusz";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
"Privacy Policy" = "Adatvédelmi irányelvek";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
"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; */
"Settings" = "Beállítások";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
"Exit" = "Kilépés";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
"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; */
"Copy" = "Másol";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
"Logging in..." = "Bejelentkezés";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"What are you flying?!" = "Mivel repülsz?";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
"Last updated at %H:%M:%S" = "Utoljára frissítve %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
"Fighter" = "Vadászgép";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
"Gunner" = "Lövész";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
"Helm" = "Kormányos";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
"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; */
"OK" = "Ok";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
"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; */
"Default" = "Alap";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"None" = "Egyik sem";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
"Error: EDSM {MSG}" = "Hiba:EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
"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; */
"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 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.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
"Error: Inara {MSG}" = "Hiba:Inara {MSG}";
/* [companion.py] */
"Error: Invalid Credentials" = "Hiba:Érvénytelen hitelesítő adatok";
/* Raised when the user has multiple accounts and the username/password setting is not for the account they're currently playing OR the user has reset their Cmdr and the Companion API server is still returning data for the old Cmdr. [companion.py] */
"Error: Wrong Cmdr" = "Hiba:Rossz parancsnok";
/* Item in the File menu on Windows. [EDMarketConnector.py] */
"Exit" = "Kilépés";
/* Combat rank. [stats.py] */
"Expert" = "Szakértő";
/* Ranking. [stats.py] */
"Explorer" = "Felfedező";
/* Ranking. [stats.py] */
"Federation" = "Föderáció";
/* [EDMarketConnector.py] */
"Fetching data..." = "Adatok lekérése";
/* Multicrew role. [EDMarketConnector.py] */
"Fighter" = "Vadászgép";
/* Menu title. [EDMarketConnector.py] */
"File" = "Fájl";
/* Section heading in settings. [prefs.py] */
"File location" = "Fálj helye";
/* CQC rank. [stats.py] */
"Gladiator" = "Gladiátor";
/* Multicrew role. [EDMarketConnector.py] */
"Gunner" = "Lövész";
/* Combat rank. [stats.py] */
"Harmless" = "ártalmatlan";
/* Multicrew role. [EDMarketConnector.py] */
"Helm" = "Kormányos";
/* Menu title. [EDMarketConnector.py] */
"Help" = "Segítség";
/* CQC rank. [stats.py] */
"Helpless" = "tehetetlen";
/* CQC rank. [stats.py] */
"Hero" = "Hős";
/* Dark theme color setting. [prefs.py] */
"Highlighted text" = "Kiemelt szöveg";
/* Hotkey/Shortcut settings prompt on Windows. [prefs.py] */
"Hotkey" = "Gyorsgomb";
/* Section heading in settings. [inara.py] */
"Inara credentials" = "Inara hitelesitő adatok";
/* Hotkey/Shortcut settings prompt on OSX. [prefs.py] */
"Keyboard shortcut" = "Billentyűparancsok";
/* Empire rank. [stats.py] */
"King" = "Király";
/* Empire rank. [stats.py] */
"Knight" = "Lovag";
/* Appearance setting prompt. [prefs.py] */
"Language" = "Nyelv";
/* [EDMarketConnector.py] - Leave '%H:%M:%S' as-is */
"Last updated at %H:%M:%S" = "Utoljára frissítve %H:%M:%S";
/* Federation rank. [stats.py] */
"Lieutenant" = "Hadnagy";
/* Federation rank. [stats.py] */
"Lieutenant Commander" = "Főhadnagy";
/* Cmdr stats. [stats.py] */
"Loan" = "Kölcsön";
/* [EDMarketConnector.py] */
"Logging in..." = "Bejelentkezés";
/* Empire rank. [stats.py] */
"Lord" = "Lord";
/* [prefs.py] */
"Market data in CSV format file" = "Piaci adat CSV fájlban";
/* [prefs.py] */
"Market data in Trade Dangerous format file" = "Piaci adat Trade Dangerous fájlban";
/* Empire rank. [stats.py] */
"Marquis" = "Őrgróf";
/* Combat rank. [stats.py] */
"Master" = "Mester";
/* Trade rank. [stats.py] */
"Merchant" = "Kereskedő";
/* Federation rank. [stats.py] */
"Midshipman" = "Tengerészkadét";
/* Explorer rank. [stats.py] */
"Mostly Aimless" = "Tøbnyire céltalan";
/* Combat rank. [stats.py] */
"Mostly Harmless" = "Többnyire ártalmatlan";
/* CQC rank. [stats.py] */
"Mostly Helpless" = "Többnyire tehetetlen";
/* Trade rank. [stats.py] */
"Mostly Penniless" = "Többnyire nincstelen";
/* No hotkey/shortcut currently defined. [prefs.py] */
"None" = "Egyik sem";
/* Dark theme color setting. [prefs.py] */
"Normal text" = "Normál txt";
/* Combat rank. [stats.py] */
"Novice" = "Kezdő";
/* [prefs.py] */
"OK" = "Ok";
/* Hotkey/Shortcut setting. [prefs.py] */
"Only when Elite: Dangerous is the active app" = "Csak ha az Elite Dangerous fut";
/* Button that opens a folder in Explorer/Finder. [prefs.py] */
"Open" = "Nyisd ki";
/* Shortcut settings button on OSX. [prefs.py] */
"Open System Preferences" = "Rendszerbeállítások megnyitáss";
/* Tab heading in settings. [prefs.py] */
"Output" = "Kimenet";
/* Empire rank. [stats.py] */
"Outsider" = "Kivűlálló";
/* Explorer rank. [stats.py] */
"Pathfinder" = "Útkereső";
/* Trade rank. [stats.py] */
"Peddler" = "Házaló ügynők";
/* Trade rank. [stats.py] */
"Penniless" = "Nincstelen";
/* Federation rank. [stats.py] */
"Petty Officer" = "Tizedes";
/* Explorer rank. [stats.py] */
"Pioneer" = "Utász";
/* Hotkey/Shortcut setting. [prefs.py] */
"Play sound" = "Zene be";
/* [prefs.py] */
"Please choose what data to save" = "Kérem válassza ki a menteni kivánt adatokat.";
/* Tab heading in settings. [prefs.py] */
"Plugins" = "Pluginok";
/* Section heading in settings. [prefs.py] */
"Plugins folder" = "Plugin mappa";
/* Federation rank. [stats.py] */
"Post Captain" = "Ellentengernagy";
/* Federation rank. [stats.py] */
"Post Commander" = "Ezredes";
/* Ranking. [stats.py] */
"Powerplay" = "Powerplay";
/* [prefs.py] */
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Beállítások";
/* Settings prompt for preferred ship loadout, system and station info websites. [prefs.py] */
"Preferred websites" = "Preferált weboldalak";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
"Please choose what data to save" = "Kérem válassza ki a menteni kivánt adatokat.";
/* Empire rank. [stats.py] */
"Prince" = "Herceg";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
"Market data in CSV format file" = "Piaci adat CSV fájlban";
/* Help menu item. [EDMarketConnector.py] */
"Privacy Policy" = "Adatvédelmi irányelvek";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
"Market data in Trade Dangerous format file" = "Piaci adat Trade Dangerous fájlban";
/* CQC rank. [stats.py] */
"Professional" = "Szakember";
/* Explorer rank. [stats.py] */
"Ranger" = "Vándor";
/* Power rank. [stats.py] */
"Rating 1" = "Osztákgozás 1";
/* Power rank. [stats.py] */
"Rating 2" = "Osztályozás 2";
/* Power rank. [stats.py] */
"Rating 3" = "Osztályozás 3";
/* Power rank. [stats.py] */
"Rating 4" = "Osztályozás 4";
/* Power rank. [stats.py] */
"Rating 5" = "Osztályozás 5";
/* Shortcut settings prompt on OSX. [prefs.py] */
"Re-start {APP} to use shortcuts" = "Újranidítás {APP} parancsikonok használatával";
/* Federation rank. [stats.py] */
"Rear Admiral" = "FőEllentengernagy";
/* Federation rank. [stats.py] */
"Recruit" = "Újonc";
/* Help menu item. [EDMarketConnector.py] */
"Release Notes" = "Kiadási megjegyzések";
/* Multicrew role label in main window. [EDMarketConnector.py] */
"Role" = "Szerep";
/* Menu item. [EDMarketConnector.py] */
"Save Raw Data..." = "Nyers adat elmentése";
/* Explorer rank. [stats.py] */
"Scout" = "Felderítő";
/* CQC rank. [stats.py] */
"Semi Professional" = "Fél profi";
/* [edsm.py] */
"Send flight log and Cmdr status to EDSM" = "Repülési napló és Parancsnok státusz küldése az EDSM-nek";
/* [inara.py] */
"Send flight log and Cmdr status to Inara" = "Repülési napló és Parancsnok státusz küldése az Inarának";
/* Output setting. [eddn.py] */
"Send station data to the Elite Dangerous Data Network" = "Állomás adatok küldése az EDDN-nek";
/* Output setting new in E:D 2.2. [eddn.py] */
"Send system and scan data to the Elite Dangerous Data Network" = "Rendszer és szken adatok küldése az EDDN-nek";
/* [eddn.py] */
"Sending data to EDDN..." = "Adatok küldése az EDDN-nek...";
/* Empire rank. [stats.py] */
"Serf" = "Jobbágy";
/* Item in the File menu on Windows. [EDMarketConnector.py] */
"Settings" = "Beállítások";
/* Main window. [EDMarketConnector.py] */
"Ship" = "Hajó";
/* Output setting. [prefs.py] */
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
"Ship loadout" = "Hajó felszerelése";
/* Status dialog title. [stats.py] */
"Ships" = "Hajók";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
"Automatically update on docking" = "Automatikusan frissit dokkolásnál";
/* Setting to decide which ship outfitting website to link to - either E:D Shipyard or Coriolis. [prefs.py] */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
"File location" = "Fálj helye";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
"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; */
"Browse..." = "Böngész";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
"Output" = "Kimenet";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
"E:D journal file location" = "E:D journal fájl helye";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
"Keyboard shortcut" = "Billentyűparancsok";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
"Hotkey" = "Gyorsgomb";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
"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; */
"{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; */
"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; */
"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; */
"Play sound" = "Zene be";
/* prefs.py: Label for preferred shipyard, system and station 'providers'; In files: prefs.py:568; */
"Preferred websites" = "Preferált weboldalak";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
"Shipyard" = "Hajógyár";
/* Empire rank. [stats.py] */
"Squire" = "Földesúr";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
"Configuration" = "Konfiguráció";
/* Main window. [EDMarketConnector.py] */
"Station" = "Állomás";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
"Normal text" = "Normál txt";
/* [EDMarketConnector.py] */
"Station doesn't have a market!" = "Nincs piac az állomáson!";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
"Highlighted text" = "Kiemelt szöveg";
/* [EDMarketConnector.py] */
"Station doesn't have anything!" = "Az állomáson nincs semmi!";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
"Language" = "Nyelv";
/* Menu item. [EDMarketConnector.py] */
"Status" = "Státusz";
/* Explorer rank. [stats.py] */
"Surveyor" = "Megfigyelő";
/* Main window. [EDMarketConnector.py] */
"System" = "Rendszer";
/* Appearance setting. [prefs.py] */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
"Theme" = "Téma";
/* Help text in settings. [prefs.py] */
"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 for 'Dark' theme radio button; In files: prefs.py:717; */
"Dark" = "Sötét";
/* Ranking. [stats.py] */
"Trade" = "Kereskedés";
/* Explorer rank. [stats.py] */
"Trailblazer" = "Útkereső";
/* Appearance theme setting. [prefs.py] */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
"Transparent" = "Átlárható";
/* Trade rank. [stats.py] */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
"Appearance" = "Megjelenés";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
"Plugins folder" = "Plugin mappa";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
"Open" = "Nyisd ki";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
"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; */
"Enabled Plugins" = "Pluginok engedélyezése";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
"Disabled Plugins" = "Plugin kikapcsolása";
/* stats.py: Cmdr stats; In files: stats.py:51; */
"Balance" = "Egyenleg";
/* stats.py: Cmdr stats; In files: stats.py:52; */
"Loan" = "Kölcsön";
/* stats.py: Ranking; In files: stats.py:57; */
"Combat" = "Harc";
/* stats.py: Ranking; In files: stats.py:58; */
"Trade" = "Kereskedés";
/* stats.py: Ranking; In files: stats.py:59; */
"Explorer" = "Felfedező";
/* stats.py: Ranking; In files: stats.py:60; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
"Federation" = "Föderáció";
/* stats.py: Ranking; In files: stats.py:62; */
"Empire" = "Birodalom";
/* stats.py: Ranking; In files: stats.py:63; */
"Powerplay" = "Powerplay";
/* stats.py: Combat rank; In files: stats.py:71; */
"Harmless" = "ártalmatlan";
/* stats.py: Combat rank; In files: stats.py:72; */
"Mostly Harmless" = "Többnyire ártalmatlan";
/* stats.py: Combat rank; In files: stats.py:73; */
"Novice" = "Kezdő";
/* stats.py: Combat rank; In files: stats.py:74; */
"Competent" = "Képesített";
/* stats.py: Combat rank; In files: stats.py:75; */
"Expert" = "Szakértő";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
"Master" = "Mester";
/* stats.py: Combat rank; In files: stats.py:77; */
"Dangerous" = "Veszélyes";
/* stats.py: Combat rank; In files: stats.py:78; */
"Deadly" = "Halálos";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
"Elite" = "Elit";
/* stats.py: Trade rank; In files: stats.py:82; */
"Penniless" = "Nincstelen";
/* stats.py: Trade rank; In files: stats.py:83; */
"Mostly Penniless" = "Többnyire nincstelen";
/* stats.py: Trade rank; In files: stats.py:84; */
"Peddler" = "Házaló ügynők";
/* stats.py: Trade rank; In files: stats.py:85; */
"Dealer" = "Kereskedő";
/* stats.py: Trade rank; In files: stats.py:86; */
"Merchant" = "Kereskedő";
/* stats.py: Trade rank; In files: stats.py:87; */
"Broker" = "Bróker";
/* stats.py: Trade rank; In files: stats.py:88; */
"Entrepreneur" = "Vállalkozó";
/* stats.py: Trade rank; In files: stats.py:89; */
"Tycoon" = "Iparmágnás";
/* Update button in main window. [EDMarketConnector.py] */
"Update" = "Frissítés";
/* stats.py: Explorer rank; In files: stats.py:93; */
"Aimless" = "Céltalan";
/* Status dialog subtitle - CR value of ship. [stats.py] */
"Value" = "Érték";
/* stats.py: Explorer rank; In files: stats.py:94; */
"Mostly Aimless" = "Tøbnyire céltalan";
/* Federation rank. [stats.py] */
"Vice Admiral" = "Altengernagy";
/* stats.py: Explorer rank; In files: stats.py:95; */
"Scout" = "Felderítő";
/* Menu title on OSX. [EDMarketConnector.py] */
"View" = "Nézet";
/* stats.py: Explorer rank; In files: stats.py:96; */
"Surveyor" = "Megfigyelő";
/* Empire rank. [stats.py] */
"Viscount" = "Vicomte";
/* stats.py: Explorer rank; In files: stats.py:97; */
"Trailblazer" = "Útkereső";
/* Federation rank. [stats.py] */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Pathfinder" = "Útkereső";
/* stats.py: Explorer rank; In files: stats.py:99; */
"Ranger" = "Vándor";
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pioneer" = "Utász";
/* stats.py: CQC rank; In files: stats.py:104; */
"Helpless" = "tehetetlen";
/* stats.py: CQC rank; In files: stats.py:105; */
"Mostly Helpless" = "Többnyire tehetetlen";
/* stats.py: CQC rank; In files: stats.py:106; */
"Amateur" = "Amatőr";
/* stats.py: CQC rank; In files: stats.py:107; */
"Semi Professional" = "Fél profi";
/* stats.py: CQC rank; In files: stats.py:108; */
"Professional" = "Szakember";
/* stats.py: CQC rank; In files: stats.py:109; */
"Champion" = "Bajnok";
/* stats.py: CQC rank; In files: stats.py:110; */
"Hero" = "Hős";
/* stats.py: CQC rank; In files: stats.py:111; */
"Gladiator" = "Gladiátor";
/* stats.py: Federation rank; In files: stats.py:118; */
"Recruit" = "Újonc";
/* stats.py: Federation rank; In files: stats.py:119; */
"Cadet" = "Kadét";
/* stats.py: Federation rank; In files: stats.py:120; */
"Midshipman" = "Tengerészkadét";
/* stats.py: Federation rank; In files: stats.py:121; */
"Petty Officer" = "Tizedes";
/* stats.py: Federation rank; In files: stats.py:122; */
"Chief Petty Officer" = "Törzs zászlós";
/* stats.py: Federation rank; In files: stats.py:123; */
"Warrant Officer" = "Tiszthelyettes";
/* Shouldn't happen. [EDMarketConnector.py] */
"What are you flying?!" = "Mivel repülsz?";
/* stats.py: Federation rank; In files: stats.py:124; */
"Ensign" = "Zászlós";
/* Shouldn't happen. [EDMarketConnector.py] */
"Where are you?!" = "Hol vagy?";
/* stats.py: Federation rank; In files: stats.py:125; */
"Lieutenant" = "Hadnagy";
/* Shouldn't happen. [EDMarketConnector.py] */
"Who are you?!" = "Ki vagy?";
/* stats.py: Federation rank; In files: stats.py:126; */
"Lieutenant Commander" = "Főhadnagy";
/* Menu title on OSX. [EDMarketConnector.py] */
"Window" = "Ablak";
/* stats.py: Federation rank; In files: stats.py:127; */
"Post Commander" = "Ezredes";
/* [EDMarketConnector.py] */
"You're not docked at a station!" = " Nem dokkoltál az állomáson";
/* stats.py: Federation rank; In files: stats.py:128; */
"Post Captain" = "Ellentengernagy";
/* Shortcut settings prompt on OSX. [prefs.py] */
"{APP} needs permission to use shortcuts" = "{APP} engedély szükséges a parancsikon használatához";
/* stats.py: Federation rank; In files: stats.py:129; */
"Rear Admiral" = "FőEllentengernagy";
/* stats.py: Federation rank; In files: stats.py:130; */
"Vice Admiral" = "Altengernagy";
/* stats.py: Federation rank; In files: stats.py:131; */
"Admiral" = "Admirális";
/* stats.py: Empire rank; In files: stats.py:137; */
"Outsider" = "Kivűlálló";
/* stats.py: Empire rank; In files: stats.py:138; */
"Serf" = "Jobbágy";
/* stats.py: Empire rank; In files: stats.py:140; */
"Squire" = "Földesúr";
/* stats.py: Empire rank; In files: stats.py:141; */
"Knight" = "Lovag";
/* stats.py: Empire rank; In files: stats.py:142; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
"Baron" = "Báró";
/* stats.py: Empire rank; In files: stats.py:144; */
"Viscount" = "Vicomte";
/* stats.py: Empire rank; In files: stats.py:145; */
"Count" = "Számol";
/* stats.py: Empire rank; In files: stats.py:146; */
"Earl" = "Gróf";
/* stats.py: Empire rank; In files: stats.py:147; */
"Marquis" = "Őrgróf";
/* stats.py: Empire rank; In files: stats.py:148; */
"Duke" = "Herceg";
/* stats.py: Empire rank; In files: stats.py:149; */
"Prince" = "Herceg";
/* stats.py: Empire rank; In files: stats.py:150; */
"King" = "Király";
/* stats.py: Power rank; In files: stats.py:156; */
"Rating 1" = "Osztákgozás 1";
/* stats.py: Power rank; In files: stats.py:157; */
"Rating 2" = "Osztályozás 2";
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 3" = "Osztályozás 3";
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 4" = "Osztályozás 4";
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 5" = "Osztályozás 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
"Value" = "Érték";
/* stats.py: Status dialog title; In files: stats.py:376; */
"Ships" = "Hajók";

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,483 +1,482 @@
/* Language name */
"!Language" = "Latviešu";
/* App menu entry on OSX. [EDMarketConnector.py] */
"About {APP}" = "Par {APP}";
/* Federation rank. [stats.py] */
"Admiral" = "Admiral";
/* Explorer rank. [stats.py] */
"Aimless" = "Aimless";
/* Appearance setting. [EDMarketConnector.py] */
"Always on top" = "Vienmēr virspusē";
/* CQC rank. [stats.py] */
"Amateur" = "Amateur";
/* EDSM setting. [edsm.py] */
"API Key" = "API atslēga";
/* Tab heading in settings. [prefs.py] */
"Appearance" = "Izskats";
/* Successfully authenticated with the Frontier website. [EDMarketConnector.py] */
"Authentication successful" = "Autentifikācija sekmīga";
/* Output setting. [prefs.py] */
"Automatically update on docking" = "Automtiski atjaunoties nosēžoties.";
/* Cmdr stats. [stats.py] */
"Balance" = "Bilance";
/* Empire rank. [stats.py] */
"Baron" = "Baron";
/* Trade rank. [stats.py] */
"Broker" = "Broker";
/* Folder selection button on Windows. [prefs.py] */
"Browse..." = "Pārlūkot...";
/* Federation rank. [stats.py] */
"Cadet" = "Cadet";
/* CQC rank. [stats.py] */
"Champion" = "Champion";
/* Folder selection button on OSX. [prefs.py] */
"Change..." = "Mainīt...";
/* Menu item. [EDMarketConnector.py] */
"Check for Updates..." = "Pārbaudīt atjauninājumus...";
/* Federation rank. [stats.py] */
"Chief Petty Officer" = "Chief Petty Officer";
/* Main window. [EDMarketConnector.py] */
"Cmdr" = "Cmdr";
/* Ranking. [stats.py] */
"Combat" = "Combat";
/* EDSM setting. [edsm.py] */
"Commander Name" = "Komandiera vārds";
/* Combat rank. [stats.py] */
"Competent" = "Competent";
/* Tab heading in settings. [prefs.py] */
"Configuration" = "Konfigurācija";
/* Update button in main window. [EDMarketConnector.py] */
"cooldown {SS}s" = "Atskaite {SS}";
/* As in Copy and Paste. [EDMarketConnector.py] */
"Copy" = "Kopēt";
/* Empire rank. [stats.py] */
"Count" = "Count";
/* Ranking. [stats.py] */
"CQC" = "CQC";
/* Combat rank. [stats.py] */
"Dangerous" = "Dangerous";
/* Appearance theme setting. [prefs.py] */
"Dark" = "Tumša";
/* Combat rank. [stats.py] */
"Deadly" = "Deadly";
/* Trade rank. [stats.py] */
"Dealer" = "Dealer";
/* Appearance theme and language setting. [l10n.py] */
"Default" = "Noklusējuma";
/* Output setting under 'Send system and scan data to the Elite Dangerous Data Network' new in E:D 2.2. [eddn.py] */
"Delay sending until docked" = "Aizkavēt sūtīšanu līdz nosēšanai";
/* List of plugins in settings. [prefs.py] */
"Disabled Plugins" = "Atspējoti Spraudņi";
/* Help menu item. [EDMarketConnector.py] */
"Documentation" = "Dokumentācija";
/* Empire rank. [stats.py] */
"Duke" = "Duke";
/* Location of the new Journal file in E:D 2.2. [EDMarketConnector.py] */
"E:D journal file location" = "E:D žurnāla faila atrašanās vieta";
/* Empire rank. [stats.py] */
"Earl" = "Earl";
/* Menu title. [EDMarketConnector.py] */
"Edit" = "Labot";
/* Top rank. [stats.py] */
"Elite" = "Elite";
/* Section heading in settings. [edsm.py] */
"Elite Dangerous Star Map credentials" = "Elite Dangerous zvaigžņu kartes informācija";
/* Ranking. [stats.py] */
"Empire" = "Empire";
/* List of plugins in settings. [prefs.py] */
"Enabled Plugins" = "Iespējoti Spraudņi";
/* Federation rank. [stats.py] */
"Ensign" = "Ensign";
/* Trade rank. [stats.py] */
"Entrepreneur" = "Entrepreneur";
/* [eddn.py] */
"Error: Can't connect to EDDN" = "Kļūda: Nevar savienoties ar EDDN";
/* [edsm.py] */
"Error: Can't connect to EDSM" = "Kļūda: Nevar savienoties ar EDSM";
/* [edsm.py] */
"Error: EDSM {MSG}" = "Kļūda: EDSM {MSG}";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Kļūda: Frontier serveris nav aktīvs";
/* Raised when Companion API server is returning old data, e.g. when the servers are too busy. [companion.py] */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
"Error: Frontier server is lagging" = "Kļūda: Frontier serveris aizkavējas";
/* [companion.py] */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
"Error: Invalid Credentials" = "Kļūda: Nederīga lietotāja informācija";
/* Item in the File menu on Windows. [EDMarketConnector.py] */
"Exit" = "Iziet";
/* Combat rank. [stats.py] */
"Expert" = "Expert";
/* Ranking. [stats.py] */
"Explorer" = "Explorer";
/* Ranking. [stats.py] */
"Federation" = "Federation";
/* [EDMarketConnector.py] */
"Fetching data..." = "Iegūst datus...";
/* Multicrew role. [EDMarketConnector.py] */
"Fighter" = "Cīnītājs";
/* Menu title. [EDMarketConnector.py] */
"File" = "Fails";
/* Section heading in settings. [prefs.py] */
"File location" = "Faila atrašanās vieta";
/* CQC rank. [stats.py] */
"Gladiator" = "Gladiators";
/* Multicrew role. [EDMarketConnector.py] */
"Gunner" = "Ložmetējnieks";
/* Combat rank. [stats.py] */
"Harmless" = "Nekaitīgs";
/* Multicrew role. [EDMarketConnector.py] */
"Helm" = "Stūre";
/* Menu title. [EDMarketConnector.py] */
"Help" = "Palīdzība";
/* CQC rank. [stats.py] */
"Helpless" = "Bezpalīdzīgs";
/* CQC rank. [stats.py] */
"Hero" = "Varonis";
/* Dark theme color setting. [prefs.py] */
"Highlighted text" = "Izceltais teksts";
/* Hotkey/Shortcut settings prompt on Windows. [prefs.py] */
"Hotkey" = "Ātrais taustiņš";
/* Hotkey/Shortcut settings prompt on OSX. [prefs.py] */
"Keyboard shortcut" = "Ātrais taustiņš";
/* Empire rank. [stats.py] */
"King" = "Karalis";
/* Empire rank. [stats.py] */
"Knight" = "Bruņinieks";
/* Appearance setting prompt. [prefs.py] */
"Language" = "Valoda";
/* [EDMarketConnector.py] - Leave '%H:%M:%S' as-is */
"Last updated at %H:%M:%S" = "Pēdējo reizi atjaunināts %H:%M:%S";
/* Federation rank. [stats.py] */
"Lieutenant" = "Leitnants";
/* Federation rank. [stats.py] */
"Lieutenant Commander" = "Lieutenant Commander";
/* Cmdr stats. [stats.py] */
"Loan" = "Aizdevums";
/* [EDMarketConnector.py] */
"Logging in..." = "Autorizējas...";
/* Empire rank. [stats.py] */
"Lord" = "Lord";
/* [prefs.py] */
"Market data in CSV format file" = "Tirgus dati CSV formātā";
/* [prefs.py] */
"Market data in Trade Dangerous format file" = "Tirgus dati Trade Dangerous formātā";
/* Empire rank. [stats.py] */
"Marquis" = "Marquis";
/* Combat rank. [stats.py] */
"Master" = "Master";
/* Trade rank. [stats.py] */
"Merchant" = "Merchant";
/* Federation rank. [stats.py] */
"Midshipman" = "Midshipman";
/* Explorer rank. [stats.py] */
"Mostly Aimless" = "Mostly Aimless";
/* Combat rank. [stats.py] */
"Mostly Harmless" = "Mostly Harmless";
/* CQC rank. [stats.py] */
"Mostly Helpless" = "Mostly Helpless";
/* Trade rank. [stats.py] */
"Mostly Penniless" = "Mostly Penniless";
/* No hotkey/shortcut currently defined. [prefs.py] */
"None" = "Neviens";
/* Dark theme color setting. [prefs.py] */
"Normal text" = "Normālais teksts";
/* Combat rank. [stats.py] */
"Novice" = "Novice";
/* [prefs.py] */
"OK" = "Labi";
/* Hotkey/Shortcut setting. [prefs.py] */
"Only when Elite: Dangerous is the active app" = "Tikai kad Elite: Dangerous ir aktīvā aplikācija";
/* Button that opens a folder in Explorer/Finder. [prefs.py] */
"Open" = "Atvērt";
/* Shortcut settings button on OSX. [prefs.py] */
"Open System Preferences" = "Atvērt sistēmas iestatījumus";
/* Tab heading in settings. [prefs.py] */
"Output" = "Izvade";
/* Empire rank. [stats.py] */
"Outsider" = "Outsider";
/* Explorer rank. [stats.py] */
"Pathfinder" = "Pathfinder";
/* Trade rank. [stats.py] */
"Peddler" = "Peddler";
/* Trade rank. [stats.py] */
"Penniless" = "Penniless";
/* Federation rank. [stats.py] */
"Petty Officer" = "Petty Officer";
/* Explorer rank. [stats.py] */
"Pioneer" = "Pioneer";
/* Hotkey/Shortcut setting. [prefs.py] */
"Play sound" = "Atskaņot skaņu";
/* [prefs.py] */
"Please choose what data to save" = "Lūdzu izvēlaties kādus datus saglabāt";
/* Tab heading in settings. [prefs.py] */
"Plugins" = "Spraudņi";
/* Section heading in settings. [prefs.py] */
"Plugins folder" = "Spraudņu mape";
/* Federation rank. [stats.py] */
"Post Captain" = "Post Captain";
/* Federation rank. [stats.py] */
"Post Commander" = "Post Commander";
/* Ranking. [stats.py] */
"Powerplay" = "Powerplay";
/* [prefs.py] */
"Preferences" = "Iestatījumi";
/* Empire rank. [stats.py] */
"Prince" = "Prince";
/* Help menu item. [EDMarketConnector.py] */
"Privacy Policy" = "Privātuma politika";
/* CQC rank. [stats.py] */
"Professional" = "Professional";
/* Explorer rank. [stats.py] */
"Ranger" = "Ranger";
/* Power rank. [stats.py] */
"Rating 1" = "Rating 1";
/* Power rank. [stats.py] */
"Rating 2" = "Rating 2";
/* Power rank. [stats.py] */
"Rating 3" = "Rating 3";
/* Power rank. [stats.py] */
"Rating 4" = "Rating 4";
/* Power rank. [stats.py] */
"Rating 5" = "Rating 5";
/* Shortcut settings prompt on OSX. [prefs.py] */
"Re-start {APP} to use shortcuts" = "Restartējiet {APP} lai izmantotu īssceļus";
/* Federation rank. [stats.py] */
"Rear Admiral" = "Rear Admiral";
/* Federation rank. [stats.py] */
"Recruit" = "Recruit";
/* Help menu item. [EDMarketConnector.py] */
"Release Notes" = "Informācija par laidienu";
/* Multicrew role label in main window. [EDMarketConnector.py] */
"Role" = "Loma";
/* Menu item. [EDMarketConnector.py] */
"Save Raw Data..." = "Saglabāt sākotnējos datus...";
/* Explorer rank. [stats.py] */
"Scout" = "Scout";
/* CQC rank. [stats.py] */
"Semi Professional" = "Semi Professional";
/* Output setting. [eddn.py] */
"Send station data to the Elite Dangerous Data Network" = "Sūtīt stacijas datus uz Elite Dangerous Data Network";
/* Output setting new in E:D 2.2. [eddn.py] */
"Send system and scan data to the Elite Dangerous Data Network" = "Sūtīt stacijas datus uz Elite Dangerous Data Network";
/* [eddn.py] */
"Sending data to EDDN..." = "Sūta datus uz EDDN...";
/* Empire rank. [stats.py] */
"Serf" = "Serf";
/* Item in the File menu on Windows. [EDMarketConnector.py] */
"Settings" = "Iestatījumi";
/* Main window. [EDMarketConnector.py] */
"Ship" = "Kuģis";
/* Output setting. [prefs.py] */
"Ship loadout" = "Kuģa loadout";
/* Status dialog title. [stats.py] */
"Ships" = "Kuģi";
/* Setting to decide which ship outfitting website to link to - either E:D Shipyard or Coriolis. [prefs.py] */
"Shipyard" = "Kuģu būvētava";
/* Empire rank. [stats.py] */
"Squire" = "Squire";
/* Main window. [EDMarketConnector.py] */
"Station" = "Stacija";
/* [EDMarketConnector.py] */
"Station doesn't have a market!" = "Stacijā nav tirgus!";
/* [EDMarketConnector.py] */
"Station doesn't have anything!" = "Stacijā nekā nav!";
/* Menu item. [EDMarketConnector.py] */
"Status" = "Statuss";
/* Explorer rank. [stats.py] */
"Surveyor" = "Surveyor";
/* Main window. [EDMarketConnector.py] */
"System" = "Sistēma";
/* Appearance setting. [prefs.py] */
"Theme" = "Dizains";
/* Ranking. [stats.py] */
"Trade" = "Trade";
/* Explorer rank. [stats.py] */
"Trailblazer" = "Trailblazer";
/* Appearance theme setting. [prefs.py] */
"Transparent" = "Caurspīdīga";
/* Trade rank. [stats.py] */
"Tycoon" = "Tycoon";
/* Update button in main window. [EDMarketConnector.py] */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
"Update" = "Atjaunināt";
/* Status dialog subtitle - CR value of ship. [stats.py] */
"Value" = "Vērtība";
/* 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; */
"Always on top" = "Vienmēr virspusē";
/* Federation rank. [stats.py] */
"Vice Admiral" = "Vice Admiral";
/* 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; */
"Cmdr" = "Cmdr";
/* Menu title on OSX. [EDMarketConnector.py] */
/* 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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"Edit" = "Labot";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
"View" = "Skats";
/* Empire rank. [stats.py] */
"Viscount" = "Viscount";
/* Federation rank. [stats.py] */
"Warrant Officer" = "Warrant Officer";
/* Shouldn't happen. [EDMarketConnector.py] */
"What are you flying?!" = "Ar ko tu lido?";
/* Shouldn't happen. [EDMarketConnector.py] */
"Where are you?!" = "Kur tu esi?";
/* Shouldn't happen. [EDMarketConnector.py] */
"Who are you?!" = "Kas tu esi?";
/* Menu title on OSX. [EDMarketConnector.py] */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
"Window" = "Logs";
/* [EDMarketConnector.py] */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
"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; */
"About {APP}" = "Par {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
"Check for Updates..." = "Pārbaudīt atjauninājumus...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
"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; */
"Status" = "Statuss";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
"Privacy Policy" = "Privātuma politika";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
"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; */
"Settings" = "Iestatījumi";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
"Exit" = "Iziet";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
"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; */
"Copy" = "Kopēt";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
"Logging in..." = "Autorizējas...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
"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; */
"You're not docked at a station!" = "Jūs neesat stacijā!";
/* Shortcut settings prompt on OSX. [prefs.py] */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
"Station doesn't have anything!" = "Stacijā nekā nav!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
"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; */
"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; */
"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; */
"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; */
"What are you flying?!" = "Ar ko tu lido?";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
"Last updated at %H:%M:%S" = "Pēdējo reizi atjaunināts %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
"Fighter" = "Cīnītājs";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
"Gunner" = "Ložmetējnieks";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
"Helm" = "Stūre";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
"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; */
"OK" = "Labi";
/* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:1790; prefs.py:953; */
"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; */
"Default" = "Noklusējuma";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"None" = "Neviens";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
"Error: EDSM {MSG}" = "Kļūda: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
"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; */
"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; */
"Market data in CSV format file" = "Tirgus dati CSV formātā";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
"Market data in Trade Dangerous format file" = "Tirgus dati Trade Dangerous formātā";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
"Ship loadout" = "Kuģa loadout";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
"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; */
"File location" = "Faila atrašanās vieta";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
"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; */
"Browse..." = "Pārlūkot...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
"Output" = "Izvade";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
"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; */
"Keyboard shortcut" = "Ātrais taustiņš";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
"Hotkey" = "Ātrais taustiņš";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
"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; */
"{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; */
"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; */
"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; */
"Play sound" = "Atskaņot skaņu";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
"Shipyard" = "Kuģu būvētava";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
"Configuration" = "Konfigurācija";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
"Normal text" = "Normālais teksts";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
"Highlighted text" = "Izceltais teksts";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
"Language" = "Valoda";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
"Theme" = "Dizains";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
"Dark" = "Tumša";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
"Transparent" = "Caurspīdīga";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
"Appearance" = "Izskats";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
"Plugins folder" = "Spraudņu mape";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
"Open" = "Atvērt";
/* prefs.py: Label on list of enabled plugins; In files: prefs.py:901; */
"Enabled Plugins" = "Iespējoti Spraudņi";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
"Disabled Plugins" = "Atspējoti Spraudņi";
/* stats.py: Cmdr stats; In files: stats.py:51; */
"Balance" = "Bilance";
/* stats.py: Cmdr stats; In files: stats.py:52; */
"Loan" = "Aizdevums";
/* stats.py: Ranking; In files: stats.py:57; */
"Combat" = "Combat";
/* stats.py: Ranking; In files: stats.py:58; */
"Trade" = "Trade";
/* stats.py: Ranking; In files: stats.py:59; */
"Explorer" = "Explorer";
/* stats.py: Ranking; In files: stats.py:60; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
"Federation" = "Federation";
/* stats.py: Ranking; In files: stats.py:62; */
"Empire" = "Empire";
/* stats.py: Ranking; In files: stats.py:63; */
"Powerplay" = "Powerplay";
/* stats.py: Combat rank; In files: stats.py:71; */
"Harmless" = "Nekaitīgs";
/* stats.py: Combat rank; In files: stats.py:72; */
"Mostly Harmless" = "Mostly Harmless";
/* stats.py: Combat rank; In files: stats.py:73; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
"Competent" = "Competent";
/* stats.py: Combat rank; In files: stats.py:75; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
"Master" = "Master";
/* stats.py: Combat rank; In files: stats.py:77; */
"Dangerous" = "Dangerous";
/* stats.py: Combat rank; In files: stats.py:78; */
"Deadly" = "Deadly";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
"Penniless" = "Penniless";
/* stats.py: Trade rank; In files: stats.py:83; */
"Mostly Penniless" = "Mostly Penniless";
/* stats.py: Trade rank; In files: stats.py:84; */
"Peddler" = "Peddler";
/* stats.py: Trade rank; In files: stats.py:85; */
"Dealer" = "Dealer";
/* stats.py: Trade rank; In files: stats.py:86; */
"Merchant" = "Merchant";
/* stats.py: Trade rank; In files: stats.py:87; */
"Broker" = "Broker";
/* stats.py: Trade rank; In files: stats.py:88; */
"Entrepreneur" = "Entrepreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
"Tycoon" = "Tycoon";
/* stats.py: Explorer rank; In files: stats.py:93; */
"Aimless" = "Aimless";
/* stats.py: Explorer rank; In files: stats.py:94; */
"Mostly Aimless" = "Mostly Aimless";
/* stats.py: Explorer rank; In files: stats.py:95; */
"Scout" = "Scout";
/* stats.py: Explorer rank; In files: stats.py:96; */
"Surveyor" = "Surveyor";
/* stats.py: Explorer rank; In files: stats.py:97; */
"Trailblazer" = "Trailblazer";
/* stats.py: Explorer rank; In files: stats.py:98; */
"Pathfinder" = "Pathfinder";
/* stats.py: Explorer rank; In files: stats.py:99; */
"Ranger" = "Ranger";
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pioneer" = "Pioneer";
/* stats.py: CQC rank; In files: stats.py:104; */
"Helpless" = "Bezpalīdzīgs";
/* stats.py: CQC rank; In files: stats.py:105; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
"Amateur" = "Amateur";
/* stats.py: CQC rank; In files: stats.py:107; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
"Hero" = "Varonis";
/* stats.py: CQC rank; In files: stats.py:111; */
"Gladiator" = "Gladiators";
/* stats.py: Federation rank; In files: stats.py:118; */
"Recruit" = "Recruit";
/* stats.py: Federation rank; In files: stats.py:119; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
"Midshipman" = "Midshipman";
/* stats.py: Federation rank; In files: stats.py:121; */
"Petty Officer" = "Petty Officer";
/* stats.py: Federation rank; In files: stats.py:122; */
"Chief Petty Officer" = "Chief Petty Officer";
/* stats.py: Federation rank; In files: stats.py:123; */
"Warrant Officer" = "Warrant Officer";
/* stats.py: Federation rank; In files: stats.py:124; */
"Ensign" = "Ensign";
/* stats.py: Federation rank; In files: stats.py:125; */
"Lieutenant" = "Leitnants";
/* stats.py: Federation rank; In files: stats.py:126; */
"Lieutenant Commander" = "Lieutenant Commander";
/* stats.py: Federation rank; In files: stats.py:127; */
"Post Commander" = "Post Commander";
/* stats.py: Federation rank; In files: stats.py:128; */
"Post Captain" = "Post Captain";
/* stats.py: Federation rank; In files: stats.py:129; */
"Rear Admiral" = "Rear Admiral";
/* stats.py: Federation rank; In files: stats.py:130; */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Federation rank; In files: stats.py:131; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
"Outsider" = "Outsider";
/* stats.py: Empire rank; In files: stats.py:138; */
"Serf" = "Serf";
/* stats.py: Empire rank; In files: stats.py:140; */
"Squire" = "Squire";
/* stats.py: Empire rank; In files: stats.py:141; */
"Knight" = "Bruņinieks";
/* stats.py: Empire rank; In files: stats.py:142; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
"Count" = "Count";
/* stats.py: Empire rank; In files: stats.py:146; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
"Marquis" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:148; */
"Duke" = "Duke";
/* stats.py: Empire rank; In files: stats.py:149; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
"King" = "Karalis";
/* stats.py: Power rank; In files: stats.py:156; */
"Rating 1" = "Rating 1";
/* stats.py: Power rank; In files: stats.py:157; */
"Rating 2" = "Rating 2";
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 3" = "Rating 3";
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 4" = "Rating 4";
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 5" = "Rating 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
"Value" = "Vērtība";
/* stats.py: Status dialog title; In files: stats.py:376; */
"Ships" = "Kuģi";

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,432 +1,431 @@
/* Language name */
"!Language" = "Slovenščina";
/* App menu entry on OSX. [EDMarketConnector.py] */
"About {APP}" = "O {APP}";
/* Federation rank. [stats.py] */
"Admiral" = "Admiral";
/* Explorer rank. [stats.py] */
"Aimless" = "Aimless";
/* Appearance setting. [EDMarketConnector.py] */
"Always on top" = "Vedno na vrhu";
/* CQC rank. [stats.py] */
"Amateur" = "Amateur";
/* EDSM setting. [edsm.py] */
"API Key" = "API ključ";
/* Tab heading in settings. [prefs.py] */
"Appearance" = "Videz";
/* Successfully authenticated with the Frontier website. [EDMarketConnector.py] */
"Authentication successful" = "Preverjanje pristnosti je bilo uspešno";
/* Cmdr stats. [stats.py] */
"Balance" = "Ravnotežje";
/* Empire rank. [stats.py] */
"Baron" = "Baron";
/* Trade rank. [stats.py] */
"Broker" = "Broker";
/* Folder selection button on Windows. [prefs.py] */
"Browse..." = "Prebrskaj...";
/* Federation rank. [stats.py] */
"Cadet" = "Cadet";
/* CQC rank. [stats.py] */
"Champion" = "Champion";
/* Folder selection button on OSX. [prefs.py] */
"Change..." = "Spremeni...";
/* Menu item. [EDMarketConnector.py] */
"Check for Updates..." = "Preveri posodobitve...";
/* Federation rank. [stats.py] */
"Chief Petty Officer" = "Chief Petty Officer";
/* Main window. [EDMarketConnector.py] */
"Cmdr" = "Cmdr";
/* Ranking. [stats.py] */
"Combat" = "Combat";
/* EDSM setting. [edsm.py] */
"Commander Name" = "Commander ime";
/* Combat rank. [stats.py] */
"Competent" = "Competent";
/* Tab heading in settings. [prefs.py] */
"Configuration" = "Konfiguracija";
/* Update button in main window. [EDMarketConnector.py] */
"cooldown {SS}s" = "Posodobitev v {SS}s";
/* As in Copy and Paste. [EDMarketConnector.py] */
"Copy" = "Kopiraj";
/* Empire rank. [stats.py] */
"Count" = "Count";
/* Ranking. [stats.py] */
"CQC" = "CQC";
/* Combat rank. [stats.py] */
"Dangerous" = "Dangerous";
/* Appearance theme setting. [prefs.py] */
"Dark" = "Temno";
/* Combat rank. [stats.py] */
"Deadly" = "Deadly";
/* Trade rank. [stats.py] */
"Dealer" = "Dealer";
/* Appearance theme and language setting. [l10n.py] */
"Default" = "Privzeta";
/* Help menu item. [EDMarketConnector.py] */
"Documentation" = "Dokumentacija";
/* Empire rank. [stats.py] */
"Duke" = "Duke";
/* Empire rank. [stats.py] */
"Earl" = "Earl";
/* Menu title. [EDMarketConnector.py] */
"Edit" = "Uredi";
/* Top rank. [stats.py] */
"Elite" = "Elite";
/* Section heading in settings. [edsm.py] */
"Elite Dangerous Star Map credentials" = "EDStarMap uporabniški podatki";
/* Ranking. [stats.py] */
"Empire" = "Cesarstvo";
/* Federation rank. [stats.py] */
"Ensign" = "Ensign";
/* Trade rank. [stats.py] */
"Entrepreneur" = "Enterpreneur";
/* [eddn.py] */
"Error: Can't connect to EDDN" = "Napaka: povezava z EDDN ni mogoča";
/* [edsm.py] */
"Error: Can't connect to EDSM" = "Napaka: Povezava z EDSM ni mogoča";
/* [edsm.py] */
"Error: EDSM {MSG}" = "Napaka: EDSM {MSG}";
/* [companion.py] */
/* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:214; */
"Error: Invalid Credentials" = "Napaka: napačno uporabniški ime ali geslo";
/* Item in the File menu on Windows. [EDMarketConnector.py] */
"Exit" = "Izhod";
/* Combat rank. [stats.py] */
"Expert" = "Expert";
/* Ranking. [stats.py] */
"Explorer" = "Explorer";
/* Ranking. [stats.py] */
"Federation" = "Federacija";
/* [EDMarketConnector.py] */
"Fetching data..." = "Nalagam podatke...";
/* Menu title. [EDMarketConnector.py] */
"File" = "Datoteka";
/* Section heading in settings. [prefs.py] */
"File location" = "Lokacija datoteke";
/* CQC rank. [stats.py] */
"Gladiator" = "Gladiator";
/* Combat rank. [stats.py] */
"Harmless" = "Harmless";
/* Menu title. [EDMarketConnector.py] */
"Help" = "Pomoč";
/* CQC rank. [stats.py] */
"Helpless" = "Helpless";
/* CQC rank. [stats.py] */
"Hero" = "Hero";
/* Hotkey/Shortcut settings prompt on Windows. [prefs.py] */
"Hotkey" = "Bližnjica";
/* Hotkey/Shortcut settings prompt on OSX. [prefs.py] */
"Keyboard shortcut" = "Bližnjica";
/* Empire rank. [stats.py] */
"King" = "King";
/* Empire rank. [stats.py] */
"Knight" = "Knight";
/* Appearance setting prompt. [prefs.py] */
"Language" = "Jezik";
/* [EDMarketConnector.py] - Leave '%H:%M:%S' as-is */
"Last updated at %H:%M:%S" = "Zadnja osvežitev podatkov %H:%M:%S ";
/* Federation rank. [stats.py] */
"Lieutenant" = "LIeutenant";
/* Federation rank. [stats.py] */
"Lieutenant Commander" = "Lieutenant Commander";
/* Cmdr stats. [stats.py] */
"Loan" = "Posojilo";
/* [EDMarketConnector.py] */
"Logging in..." = "Prijava v teku... ";
/* Empire rank. [stats.py] */
"Lord" = "Lord";
/* [prefs.py] */
"Market data in CSV format file" = "Podatki trga v CSV formatu";
/* [prefs.py] */
"Market data in Trade Dangerous format file" = "Podatki trga v Trade Dangerous formatu";
/* Empire rank. [stats.py] */
"Marquis" = "Marquis";
/* Combat rank. [stats.py] */
"Master" = "Master";
/* Trade rank. [stats.py] */
"Merchant" = "Merchant";
/* Federation rank. [stats.py] */
"Midshipman" = "Midshipman";
/* Explorer rank. [stats.py] */
"Mostly Aimless" = "Mostly Aimless";
/* Combat rank. [stats.py] */
"Mostly Harmless" = "Mostly Harmless";
/* CQC rank. [stats.py] */
"Mostly Helpless" = "Mostly Helpless";
/* Trade rank. [stats.py] */
"Mostly Penniless" = "Mostly peniless";
/* No hotkey/shortcut currently defined. [prefs.py] */
"None" = "Brez";
/* Combat rank. [stats.py] */
"Novice" = "Novice";
/* [prefs.py] */
"OK" = "Potrdi";
/* Hotkey/Shortcut setting. [prefs.py] */
"Only when Elite: Dangerous is the active app" = "Samo ko je Elite:Dangerous aktivna aplikacija ";
/* Shortcut settings button on OSX. [prefs.py] */
"Open System Preferences" = "Odpri sistemske nastavitve";
/* Tab heading in settings. [prefs.py] */
"Output" = "Izpis";
/* Empire rank. [stats.py] */
"Outsider" = "Outsider";
/* Explorer rank. [stats.py] */
"Pathfinder" = "Pathfinder";
/* Trade rank. [stats.py] */
"Peddler" = "Peddler";
/* Trade rank. [stats.py] */
"Penniless" = "Peniless";
/* Federation rank. [stats.py] */
"Petty Officer" = "Petty Officer";
/* Explorer rank. [stats.py] */
"Pioneer" = "Pioneer";
/* Hotkey/Shortcut setting. [prefs.py] */
"Play sound" = "Sproži zvok";
/* [prefs.py] */
"Please choose what data to save" = "Izberite podatke, ki jih želite shraniti";
/* Federation rank. [stats.py] */
"Post Captain" = "Post Captain";
/* Federation rank. [stats.py] */
"Post Commander" = "Post Commander";
/* Ranking. [stats.py] */
"Powerplay" = "Igra moči";
/* [prefs.py] */
"Preferences" = "Nastavitve";
/* Empire rank. [stats.py] */
"Prince" = "Prince";
/* Help menu item. [EDMarketConnector.py] */
"Privacy Policy" = "Pravilnik o zasebnosti";
/* CQC rank. [stats.py] */
"Professional" = "Professional";
/* Explorer rank. [stats.py] */
"Ranger" = "Ranger";
/* Power rank. [stats.py] */
"Rating 1" = "Ocena 1";
/* Power rank. [stats.py] */
"Rating 2" = "Ocena 2";
/* Power rank. [stats.py] */
"Rating 3" = "Ocena 3";
/* Power rank. [stats.py] */
"Rating 4" = "Ocena 4";
/* Power rank. [stats.py] */
"Rating 5" = "Ocena 5";
/* Shortcut settings prompt on OSX. [prefs.py] */
"Re-start {APP} to use shortcuts" = "Ponovno poženi {APP} za uporabo bližnjic";
/* Federation rank. [stats.py] */
"Rear Admiral" = "Read Admiral";
/* Federation rank. [stats.py] */
"Recruit" = "Recruit";
/* Help menu item. [EDMarketConnector.py] */
"Release Notes" = "Opombe ob izdaji";
/* Multicrew role label in main window. [EDMarketConnector.py] */
"Role" = "Vloga";
/* Menu item. [EDMarketConnector.py] */
"Save Raw Data..." = "Shrani Izvirne Podatke...";
/* Explorer rank. [stats.py] */
"Scout" = "Scout";
/* CQC rank. [stats.py] */
"Semi Professional" = "Semi Professional";
/* Output setting. [eddn.py] */
"Send station data to the Elite Dangerous Data Network" = "Pošlji podatke postaje na EDDN";
/* [eddn.py] */
"Sending data to EDDN..." = "Pošiljam podatke na EDDN";
/* Empire rank. [stats.py] */
"Serf" = "Serif";
/* Item in the File menu on Windows. [EDMarketConnector.py] */
"Settings" = "Nastavitve";
/* Main window. [EDMarketConnector.py] */
"Ship" = "Ladja";
/* Output setting. [prefs.py] */
"Ship loadout" = "Oprema ladje";
/* Status dialog title. [stats.py] */
"Ships" = "Ladje";
/* Empire rank. [stats.py] */
"Squire" = "Squire";
/* Main window. [EDMarketConnector.py] */
"Station" = "Postaja";
/* [EDMarketConnector.py] */
"Station doesn't have a market!" = "Postaja nima trga";
/* [EDMarketConnector.py] */
"Station doesn't have anything!" = "Postaja nima ničesar";
/* Menu item. [EDMarketConnector.py] */
"Status" = "Status";
/* Explorer rank. [stats.py] */
"Surveyor" = "Surveyor";
/* Main window. [EDMarketConnector.py] */
"System" = "Sistem";
/* Appearance setting. [prefs.py] */
"Theme" = "Tema";
/* Ranking. [stats.py] */
"Trade" = "Trgovanje";
/* Explorer rank. [stats.py] */
"Trailblazer" = "Trailblazer";
/* Appearance theme setting. [prefs.py] */
"Transparent" = "Prosojno";
/* Trade rank. [stats.py] */
"Tycoon" = "Tycoon";
/* Update button in main window. [EDMarketConnector.py] */
/* EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:424; EDMarketConnector.py:718; EDMarketConnector.py:1302; */
"Update" = "Osveži";
/* Status dialog subtitle - CR value of ship. [stats.py] */
"Value" = "Vrednost";
/* 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; */
"Always on top" = "Vedno na vrhu";
/* Federation rank. [stats.py] */
"Vice Admiral" = "Vice Admiral";
/* 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; */
"Cmdr" = "Cmdr";
/* Menu title on OSX. [EDMarketConnector.py] */
/* 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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"Edit" = "Uredi";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
"View" = "Pogled";
/* Empire rank. [stats.py] */
"Viscount" = "Viscount";
/* Federation rank. [stats.py] */
"Warrant Officer" = "Warrant Officer";
/* Shouldn't happen. [EDMarketConnector.py] */
"What are you flying?!" = "S čim letiš";
/* Shouldn't happen. [EDMarketConnector.py] */
"Where are you?!" = "Kje se nahajaš";
/* Shouldn't happen. [EDMarketConnector.py] */
"Who are you?!" = "Kdo si";
/* Menu title on OSX. [EDMarketConnector.py] */
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
"Window" = "Okno";
/* [EDMarketConnector.py] */
/* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:724; EDMarketConnector.py:737; EDMarketConnector.py:740; */
"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; */
"About {APP}" = "O {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
"Check for Updates..." = "Preveri posodobitve...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
"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; */
"Status" = "Status";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
"Privacy Policy" = "Pravilnik o zasebnosti";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
"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; */
"Settings" = "Nastavitve";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
"Exit" = "Izhod";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
"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; */
"Copy" = "Kopiraj";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
"Logging in..." = "Prijava v teku... ";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
"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; */
"You're not docked at a station!" = "Nahajš se v postaji!";
/* Shortcut settings prompt on OSX. [prefs.py] */
/* EDMarketConnector.py: Status - Either no market or no modules data for station from Frontier CAPI; In files: EDMarketConnector.py:817; */
"Station doesn't have anything!" = "Postaja nima ničesar";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
"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; */
"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; */
"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; */
"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; */
"What are you flying?!" = "S čim letiš";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
"Last updated at %H:%M:%S" = "Zadnja osvežitev podatkov %H:%M:%S ";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
"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; */
"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; */
"Default" = "Privzeta";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
"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; */
"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; */
"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; */
"Elite Dangerous Star Map credentials" = "EDStarMap uporabniški podatki";
/* edsm.py: EDSM Commander name label in EDSM settings; In files: edsm.py:227; */
"Commander Name" = "Commander ime";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
"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; */
"None" = "Brez";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
"Error: EDSM {MSG}" = "Napaka: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
"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; */
"Please choose what data to save" = "Izberite podatke, ki jih želite shraniti";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
"Market data in CSV format file" = "Podatki trga v CSV formatu";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
"Market data in Trade Dangerous format file" = "Podatki trga v Trade Dangerous formatu";
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
"Ship loadout" = "Oprema ladje";
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
"File location" = "Lokacija datoteke";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
"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; */
"Browse..." = "Prebrskaj...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
"Output" = "Izpis";
/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:482; */
"Keyboard shortcut" = "Bližnjica";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
"Hotkey" = "Bližnjica";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
"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; */
"{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; */
"Open System Preferences" = "Odpri sistemske nastavitve";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
"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; */
"Play sound" = "Sproži zvok";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
"Configuration" = "Konfiguracija";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
"Language" = "Jezik";
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
"Theme" = "Tema";
/* prefs.py: Label for 'Dark' theme radio button; In files: prefs.py:717; */
"Dark" = "Temno";
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
"Transparent" = "Prosojno";
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
"Appearance" = "Videz";
/* stats.py: Cmdr stats; In files: stats.py:51; */
"Balance" = "Ravnotežje";
/* stats.py: Cmdr stats; In files: stats.py:52; */
"Loan" = "Posojilo";
/* stats.py: Ranking; In files: stats.py:57; */
"Combat" = "Combat";
/* stats.py: Ranking; In files: stats.py:58; */
"Trade" = "Trgovanje";
/* stats.py: Ranking; In files: stats.py:59; */
"Explorer" = "Explorer";
/* stats.py: Ranking; In files: stats.py:60; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
"Federation" = "Federacija";
/* stats.py: Ranking; In files: stats.py:62; */
"Empire" = "Cesarstvo";
/* stats.py: Ranking; In files: stats.py:63; */
"Powerplay" = "Igra moči";
/* stats.py: Combat rank; In files: stats.py:71; */
"Harmless" = "Harmless";
/* stats.py: Combat rank; In files: stats.py:72; */
"Mostly Harmless" = "Mostly Harmless";
/* stats.py: Combat rank; In files: stats.py:73; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
"Competent" = "Competent";
/* stats.py: Combat rank; In files: stats.py:75; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
"Master" = "Master";
/* stats.py: Combat rank; In files: stats.py:77; */
"Dangerous" = "Dangerous";
/* stats.py: Combat rank; In files: stats.py:78; */
"Deadly" = "Deadly";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
"Penniless" = "Peniless";
/* stats.py: Trade rank; In files: stats.py:83; */
"Mostly Penniless" = "Mostly peniless";
/* stats.py: Trade rank; In files: stats.py:84; */
"Peddler" = "Peddler";
/* stats.py: Trade rank; In files: stats.py:85; */
"Dealer" = "Dealer";
/* stats.py: Trade rank; In files: stats.py:86; */
"Merchant" = "Merchant";
/* stats.py: Trade rank; In files: stats.py:87; */
"Broker" = "Broker";
/* stats.py: Trade rank; In files: stats.py:88; */
"Entrepreneur" = "Enterpreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
"Tycoon" = "Tycoon";
/* stats.py: Explorer rank; In files: stats.py:93; */
"Aimless" = "Aimless";
/* stats.py: Explorer rank; In files: stats.py:94; */
"Mostly Aimless" = "Mostly Aimless";
/* stats.py: Explorer rank; In files: stats.py:95; */
"Scout" = "Scout";
/* stats.py: Explorer rank; In files: stats.py:96; */
"Surveyor" = "Surveyor";
/* stats.py: Explorer rank; In files: stats.py:97; */
"Trailblazer" = "Trailblazer";
/* stats.py: Explorer rank; In files: stats.py:98; */
"Pathfinder" = "Pathfinder";
/* stats.py: Explorer rank; In files: stats.py:99; */
"Ranger" = "Ranger";
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pioneer" = "Pioneer";
/* stats.py: CQC rank; In files: stats.py:104; */
"Helpless" = "Helpless";
/* stats.py: CQC rank; In files: stats.py:105; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
"Amateur" = "Amateur";
/* stats.py: CQC rank; In files: stats.py:107; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
"Hero" = "Hero";
/* stats.py: CQC rank; In files: stats.py:111; */
"Gladiator" = "Gladiator";
/* stats.py: Federation rank; In files: stats.py:118; */
"Recruit" = "Recruit";
/* stats.py: Federation rank; In files: stats.py:119; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
"Midshipman" = "Midshipman";
/* stats.py: Federation rank; In files: stats.py:121; */
"Petty Officer" = "Petty Officer";
/* stats.py: Federation rank; In files: stats.py:122; */
"Chief Petty Officer" = "Chief Petty Officer";
/* stats.py: Federation rank; In files: stats.py:123; */
"Warrant Officer" = "Warrant Officer";
/* stats.py: Federation rank; In files: stats.py:124; */
"Ensign" = "Ensign";
/* stats.py: Federation rank; In files: stats.py:125; */
"Lieutenant" = "LIeutenant";
/* stats.py: Federation rank; In files: stats.py:126; */
"Lieutenant Commander" = "Lieutenant Commander";
/* stats.py: Federation rank; In files: stats.py:127; */
"Post Commander" = "Post Commander";
/* stats.py: Federation rank; In files: stats.py:128; */
"Post Captain" = "Post Captain";
/* stats.py: Federation rank; In files: stats.py:129; */
"Rear Admiral" = "Read Admiral";
/* stats.py: Federation rank; In files: stats.py:130; */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Federation rank; In files: stats.py:131; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
"Outsider" = "Outsider";
/* stats.py: Empire rank; In files: stats.py:138; */
"Serf" = "Serif";
/* stats.py: Empire rank; In files: stats.py:140; */
"Squire" = "Squire";
/* stats.py: Empire rank; In files: stats.py:141; */
"Knight" = "Knight";
/* stats.py: Empire rank; In files: stats.py:142; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
"Count" = "Count";
/* stats.py: Empire rank; In files: stats.py:146; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
"Marquis" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:148; */
"Duke" = "Duke";
/* stats.py: Empire rank; In files: stats.py:149; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
"King" = "King";
/* stats.py: Power rank; In files: stats.py:156; */
"Rating 1" = "Ocena 1";
/* stats.py: Power rank; In files: stats.py:157; */
"Rating 2" = "Ocena 2";
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 3" = "Ocena 3";
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 4" = "Ocena 4";
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 5" = "Ocena 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
"Value" = "Vrednost";
/* stats.py: Status dialog title; In files: stats.py:376; */
"Ships" = "Ladje";

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,522 +1,521 @@
/* Language name */
"!Language" = "Svenska";
/* App menu entry on OSX. [EDMarketConnector.py] */
"About {APP}" = "Om {APP}";
/* Federation rank. [stats.py] */
"Admiral" = "Admiral";
/* Explorer rank. [stats.py] */
"Aimless" = "Aimless";
/* Appearance setting. [EDMarketConnector.py] */
"Always on top" = "Alltid överst";
/* CQC rank. [stats.py] */
"Amateur" = "Amatör";
/* EDSM setting. [edsm.py] */
"API Key" = "API Nyckel";
/* Tab heading in settings. [prefs.py] */
"Appearance" = "Utseende";
/* Successfully authenticated with the Frontier website. [EDMarketConnector.py] */
"Authentication successful" = "Autentisering lyckad";
/* Output setting. [prefs.py] */
"Automatically update on docking" = "Automatisk uppdatering vid dockning";
/* Cmdr stats. [stats.py] */
"Balance" = "Balance";
/* Empire rank. [stats.py] */
"Baron" = "Baron";
/* Trade rank. [stats.py] */
"Broker" = "Broker";
/* Folder selection button on Windows. [prefs.py] */
"Browse..." = "Bläddra...";
/* Federation rank. [stats.py] */
"Cadet" = "Cadet";
/* CQC rank. [stats.py] */
"Champion" = "Champion";
/* Folder selection button on OSX. [prefs.py] */
"Change..." = "Ändra...";
/* Menu item. [EDMarketConnector.py] */
"Check for Updates..." = "Sök efter uppdateringar...";
/* Federation rank. [stats.py] */
"Chief Petty Officer" = "Chief Petty Officer";
/* Main window. [EDMarketConnector.py] */
"Cmdr" = "Cmdr";
/* Ranking. [stats.py] */
"Combat" = "Combat";
/* EDSM setting. [edsm.py] */
"Commander Name" = "CMDR namn";
/* Combat rank. [stats.py] */
"Competent" = "Competent";
/* Tab heading in settings. [prefs.py] */
"Configuration" = "Konfiguration";
/* Update button in main window. [EDMarketConnector.py] */
"cooldown {SS}s" = "Vänta {SS}s";
/* As in Copy and Paste. [EDMarketConnector.py] */
"Copy" = "Kopiera";
/* Empire rank. [stats.py] */
"Count" = "Count";
/* Ranking. [stats.py] */
"CQC" = "CQC";
/* Combat rank. [stats.py] */
"Dangerous" = "Dangerous";
/* Appearance theme setting. [prefs.py] */
"Dark" = "Mörk";
/* Combat rank. [stats.py] */
"Deadly" = "Deadly";
/* Trade rank. [stats.py] */
"Dealer" = "Dealer";
/* Appearance theme and language setting. [l10n.py] */
"Default" = "Standard";
/* Output setting under 'Send system and scan data to the Elite Dangerous Data Network' new in E:D 2.2. [eddn.py] */
"Delay sending until docked" = "Skicka bara uppdateringar till EDDN när du är dockad";
/* Option to disabled Automatic Check For Updates whilst in-game [prefs.py] */
"Disable Automatic Application Updates Check when in-game" = "Leta inte efter programuppdateringar när spelet körs";
/* List of plugins in settings. [prefs.py] */
"Disabled Plugins" = "Avaktiverade plugins";
/* Help menu item. [EDMarketConnector.py] */
"Documentation" = "Dokumentation";
/* Empire rank. [stats.py] */
"Duke" = "Duke";
/* Location of the new Journal file in E:D 2.2. [EDMarketConnector.py] */
"E:D journal file location" = "E:D journal-fil sökväg";
/* Empire rank. [stats.py] */
"Earl" = "Earl";
/* Menu title. [EDMarketConnector.py] */
"Edit" = "Ändra";
/* Popup title: Warning about plugins without Python 3.x support [EDMarketConnector.py] */
"EDMC: Plugins Without Python 3.x Support" = "EDMC: Plugins utan stöd för Python 3.x";
/* Top rank. [stats.py] */
"Elite" = "Elite";
/* Section heading in settings. [edsm.py] */
"Elite Dangerous Star Map credentials" = "Elite Dangerous Star Map användaruppgifter";
/* Ranking. [stats.py] */
"Empire" = "Empire";
/* List of plugins in settings. [prefs.py] */
"Enabled Plugins" = "Aktiverade plugins";
/* Federation rank. [stats.py] */
"Ensign" = "Ensign";
/* Trade rank. [stats.py] */
"Entrepreneur" = "Entrepreneur";
/* [eddn.py] */
"Error: Can't connect to EDDN" = "Fel: Kan inte ansluta till EDDN";
/* [edsm.py] */
"Error: Can't connect to EDSM" = "Fel: Kan inte ansluta till EDSM";
/* [inara.py] */
"Error: Can't connect to Inara" = "Fel: Kan inte ansluta till Inara";
/* [edsm.py] */
"Error: EDSM {MSG}" = "Fel: EDSM {MSG}";
/* OLD: Raised when cannot contact the Companion API server. [companion.py] */
"Error: Frontier server is down" = "Fel: Frontier server okontaktbar";
/* Raised when Companion API server is returning old data, e.g. when the servers are too busy. [companion.py] */
/* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:190; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"Edit" = "Ändra";
/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:722; */
"View" = "View";
/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:723; */
"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; */
"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; */
"About {APP}" = "Om {APP}";
/* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:729; EDMarketConnector.py:752; */
"Check for Updates..." = "Sök efter uppdateringar...";
/* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:730; EDMarketConnector.py:744; */
"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; */
"Status" = "Status";
/* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:732; EDMarketConnector.py:750; */
"Privacy Policy" = "Integritetspolicy";
/* EDMarketConnector.py: Help > Release Notes; In files: EDMarketConnector.py:733; EDMarketConnector.py:751; EDMarketConnector.py:1381; */
"Release Notes" = "Versionsinformation";
/* EDMarketConnector.py: File > Settings; prefs.py: File > Settings (macOS); In files: EDMarketConnector.py:745; EDMarketConnector.py:1792; prefs.py:254; */
"Settings" = "Inställningar";
/* EDMarketConnector.py: File > Exit; In files: EDMarketConnector.py:746; */
"Exit" = "Avsluta";
/* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:749; */
"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; */
"Copy" = "Kopiera";
/* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:762; */
"Logging in..." = "Loggar in...";
/* EDMarketConnector.py: Successfully authenticated with the Frontier website; In files: EDMarketConnector.py:778; EDMarketConnector.py:1215; */
"Authentication successful" = "Autentisering lyckad";
/* EDMarketConnector.py: Player is not docked at a station, when we expect them to be; In files: EDMarketConnector.py:809; */
"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; */
"Station doesn't have anything!" = "Stationen är tom!";
/* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:822; */
"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; */
"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; */
"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; */
"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; */
"What are you flying?!" = "Okänt skepp? (felmeddelande)";
/* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1026; */
"Last updated at %H:%M:%S" = "Senaste uppdatering: %H:%M:%S";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1052; */
"Fighter" = "Fighter";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1053; */
"Gunner" = "Gunner";
/* EDMarketConnector.py: Multicrew role; In files: EDMarketConnector.py:1054; */
"Helm" = "Helm";
/* EDMarketConnector.py: Cooldown on 'Update' button; In files: EDMarketConnector.py:1298; */
"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; */
"OK" = "OK";
/* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:1780:1786; */
"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; */
"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; */
"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; */
"Default" = "Standard";
/* eddn.py: Status text shown while attempting to send data; In files: eddn.py:215; eddn.py:619; eddn.py:969; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"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; */
"Commander Name" = "CMDR namn";
/* edsm.py: EDSM API key label; inara.py: Inara API key label; In files: edsm.py:235; inara.py:237; */
"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; */
"None" = "Ingen";
/* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:640; edsm.py:745; */
"Error: EDSM {MSG}" = "Fel: EDSM {MSG}";
/* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:677; edsm.py:740; */
"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; */
"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 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.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1549; inara.py:1562; */
"Error: Inara {MSG}" = "Fel: Inara {MSG}";
/* [companion.py] */
"Error: Invalid Credentials" = "Fel: ogiltligt användarnamn eller lösenord";
/* Raised when the user has multiple accounts and the username/password setting is not for the account they're currently playing OR the user has reset their Cmdr and the Companion API server is still returning data for the old Cmdr. [companion.py] */
"Error: Wrong Cmdr" = "Fel: Fel användare. Har du flera konton eller en gammal API-nyckel från ett nollställt konto?";
/* Item in the File menu on Windows. [EDMarketConnector.py] */
"Exit" = "Avsluta";
/* Combat rank. [stats.py] */
"Expert" = "Expert";
/* Ranking. [stats.py] */
"Explorer" = "Explorer";
/* Ranking. [stats.py] */
"Federation" = "Federation";
/* [EDMarketConnector.py] */
"Fetching data..." = "Hämtar data...";
/* Multicrew role. [EDMarketConnector.py] */
"Fighter" = "Fighter";
/* Menu title. [EDMarketConnector.py] */
"File" = "Fil";
/* Section heading in settings. [prefs.py] */
"File location" = "Filsökväg";
/* CQC rank. [stats.py] */
"Gladiator" = "Gladiator";
/* Multicrew role. [EDMarketConnector.py] */
"Gunner" = "Gunner";
/* Combat rank. [stats.py] */
"Harmless" = "Harmless";
/* Multicrew role. [EDMarketConnector.py] */
"Helm" = "Helm";
/* Menu title. [EDMarketConnector.py] */
"Help" = "Hjälp";
/* CQC rank. [stats.py] */
"Helpless" = "Helpless";
/* CQC rank. [stats.py] */
"Hero" = "Hero";
/* Dark theme color setting. [prefs.py] */
"Highlighted text" = "Markerad text";
/* Hotkey/Shortcut settings prompt on Windows. [prefs.py] */
"Hotkey" = "Snabbkommando";
/* Section heading in settings. [inara.py] */
"Inara credentials" = "Inara autentiseringsuppgifter";
/* Settings>Plugins>Information on migrating plugins [prefs.py] */
"Information on migrating plugins" = "Information om migrering av plugins";
/* Hotkey/Shortcut settings prompt on OSX. [prefs.py] */
"Keyboard shortcut" = "Genväg, tangentbord";
/* Empire rank. [stats.py] */
"King" = "King";
/* Empire rank. [stats.py] */
"Knight" = "Knight";
/* Appearance setting prompt. [prefs.py] */
"Language" = "Språk";
/* [EDMarketConnector.py] - Leave '%H:%M:%S' as-is */
"Last updated at %H:%M:%S" = "Senaste uppdatering: %H:%M:%S";
/* Federation rank. [stats.py] */
"Lieutenant" = "Lieutenant";
/* Federation rank. [stats.py] */
"Lieutenant Commander" = "Lieutenant Commander";
/* Cmdr stats. [stats.py] */
"Loan" = "Lån";
/* [EDMarketConnector.py] */
"Logging in..." = "Loggar in...";
/* Empire rank. [stats.py] */
"Lord" = "Lord";
/* [prefs.py] */
"Market data in CSV format file" = "Marknadsdata i CSV-formaterad fil";
/* [prefs.py] */
"Market data in Trade Dangerous format file" = "Marknadsdata i Trade Dangerous-formaterad fil";
/* Empire rank. [stats.py] */
"Marquis" = "Marquis";
/* Combat rank. [stats.py] */
"Master" = "Master";
/* Trade rank. [stats.py] */
"Merchant" = "Merchant";
/* Federation rank. [stats.py] */
"Midshipman" = "Midshipman";
/* Explorer rank. [stats.py] */
"Mostly Aimless" = "Mostly Aimless";
/* Combat rank. [stats.py] */
"Mostly Harmless" = "Mostly Harmless";
/* CQC rank. [stats.py] */
"Mostly Helpless" = "Mostly Helpless";
/* Trade rank. [stats.py] */
"Mostly Penniless" = "Mostly Penniless";
/* No hotkey/shortcut currently defined. [prefs.py] */
"None" = "Ingen";
/* Dark theme color setting. [prefs.py] */
"Normal text" = "Normal text";
/* Combat rank. [stats.py] */
"Novice" = "Novice";
/* [prefs.py] */
"OK" = "OK";
/* Popup body: Warning about plugins without Python 3.x support [EDMarketConnector.py] */
"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}'";
/* Hotkey/Shortcut setting. [prefs.py] */
"Only when Elite: Dangerous is the active app" = "Bara när: Elite Dangerous är det aktiva programmet";
/* Button that opens a folder in Explorer/Finder. [prefs.py] */
"Open" = "Öppna";
/* Shortcut settings button on OSX. [prefs.py] */
"Open System Preferences" = "Öppna systeminställningar";
/* Tab heading in settings. [prefs.py] */
"Output" = "Exportdata";
/* Empire rank. [stats.py] */
"Outsider" = "Outsider";
/* Explorer rank. [stats.py] */
"Pathfinder" = "Pathfinder";
/* Trade rank. [stats.py] */
"Peddler" = "Peddler";
/* Trade rank. [stats.py] */
"Penniless" = "Penniless";
/* Federation rank. [stats.py] */
"Petty Officer" = "Petty Officer";
/* Explorer rank. [stats.py] */
"Pioneer" = "Pioneer";
/* Hotkey/Shortcut setting. [prefs.py] */
"Play sound" = "Spela ljud";
/* [prefs.py] */
"Please choose what data to save" = "Välj vilket data som skall lagras";
/* Tab heading in settings. [prefs.py] */
"Plugins" = "Plugins";
/* Section heading in settings. [prefs.py] */
"Plugins folder" = "Mapp för plugins";
/* Federation rank. [stats.py] */
"Post Captain" = "Post Captain";
/* Federation rank. [stats.py] */
"Post Commander" = "Post Commander";
/* Ranking. [stats.py] */
"Powerplay" = "Powerplay";
/* [prefs.py] */
/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:250; */
"Preferences" = "Inställningar";
/* Settings prompt for preferred ship loadout, system and station info websites. [prefs.py] */
"Preferred websites" = "Föredragna webbsidor";
/* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:346; */
"Please choose what data to save" = "Välj vilket data som skall lagras";
/* Empire rank. [stats.py] */
"Prince" = "Prince";
/* prefs.py: Settings > Output option; In files: prefs.py:352; */
"Market data in CSV format file" = "Marknadsdata i CSV-formaterad fil";
/* Help menu item. [EDMarketConnector.py] */
"Privacy Policy" = "Integritetspolicy";
/* prefs.py: Settings > Output option; In files: prefs.py:361; */
"Market data in Trade Dangerous format file" = "Marknadsdata i Trade Dangerous-formaterad fil";
/* CQC rank. [stats.py] */
"Professional" = "Professional";
/* Explorer rank. [stats.py] */
"Ranger" = "Ranger";
/* Power rank. [stats.py] */
"Rating 1" = "Rating 1";
/* Power rank. [stats.py] */
"Rating 2" = "Rating 2";
/* Power rank. [stats.py] */
"Rating 3" = "Rating 3";
/* Power rank. [stats.py] */
"Rating 4" = "Rating 4";
/* Power rank. [stats.py] */
"Rating 5" = "Rating 5";
/* Shortcut settings prompt on OSX. [prefs.py] */
"Re-start {APP} to use shortcuts" = "Starta om {APP} för att använda genvägar";
/* Federation rank. [stats.py] */
"Rear Admiral" = "Rear Admiral";
/* Federation rank. [stats.py] */
"Recruit" = "Recruit";
/* Help menu item. [EDMarketConnector.py] */
"Release Notes" = "Versionsinformation";
/* Multicrew role label in main window. [EDMarketConnector.py] */
"Role" = "Roll";
/* Menu item. [EDMarketConnector.py] */
"Save Raw Data..." = "Lagra rådata...";
/* Explorer rank. [stats.py] */
"Scout" = "Scout";
/* CQC rank. [stats.py] */
"Semi Professional" = "Semi Professional";
/* [edsm.py] */
"Send flight log and Cmdr status to EDSM" = "Skicka flight log-data och Cmdr-status till EDSM";
/* [inara.py] */
"Send flight log and Cmdr status to Inara" = "Skicka flight log-data och Cmdr-status till Inara";
/* Output setting. [eddn.py] */
"Send station data to the Elite Dangerous Data Network" = "Skicka stationsdata till Elite Dangerous Data Network";
/* Output setting new in E:D 2.2. [eddn.py] */
"Send system and scan data to the Elite Dangerous Data Network" = "Skicka system och scan-data till Elite Dangerous Data Network";
/* [eddn.py] */
"Sending data to EDDN..." = "Skickar data till EDDN...";
/* Empire rank. [stats.py] */
"Serf" = "Serf";
/* Item in the File menu on Windows. [EDMarketConnector.py] */
"Settings" = "Inställningar";
/* Main window. [EDMarketConnector.py] */
"Ship" = "Skepp";
/* Output setting. [prefs.py] */
/* prefs.py: Settings > Output option; In files: prefs.py:371; */
"Ship loadout" = "Översikt av skepp";
/* Status dialog title. [stats.py] */
"Ships" = "Skepp";
/* prefs.py: Settings > Output option; In files: prefs.py:381; */
"Automatically update on docking" = "Automatisk uppdatering vid dockning";
/* Setting to decide which ship outfitting website to link to - either E:D Shipyard or Coriolis. [prefs.py] */
/* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:390; prefs.py:409; */
"File location" = "Filsökväg";
/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:398; prefs.py:448; */
"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; */
"Browse..." = "Bläddra...";
/* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:416; */
"Output" = "Exportdata";
/* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:442; prefs.py:457; */
"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; */
"Keyboard shortcut" = "Genväg, tangentbord";
/* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:484; */
"Hotkey" = "Snabbkommando";
/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:493; */
"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; */
"{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; */
"Open System Preferences" = "Öppna systeminställningar";
/* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:529; */
"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; */
"Play sound" = "Spela ljud";
/* prefs.py: Configuration - disable checks for app updates when in-game; In files: prefs.py:555; */
"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; */
"Preferred websites" = "Föredragna webbsidor";
/* prefs.py: Label for Shipyard provider selection; In files: prefs.py:579; */
"Shipyard" = "Översikt av skepp";
/* Empire rank. [stats.py] */
"Squire" = "Squire";
/* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:672; */
"Configuration" = "Konfiguration";
/* Main window. [EDMarketConnector.py] */
"Station" = "Station";
/* prefs.py: Label for Settings > Appeareance > selection of 'normal' text colour; In files: prefs.py:685; */
"Normal text" = "Normal text";
/* [EDMarketConnector.py] */
"Station doesn't have a market!" = "Stationen har ingen marknad!";
/* prefs.py: Label for Settings > Appeareance > selection of 'highlightes' text colour; In files: prefs.py:687; */
"Highlighted text" = "Markerad text";
/* [EDMarketConnector.py] */
"Station doesn't have anything!" = "Stationen är tom!";
/* prefs.py: Appearance - Label for selection of application display language; In files: prefs.py:696; */
"Language" = "Språk";
/* Menu item. [EDMarketConnector.py] */
"Status" = "Status";
/* Explorer rank. [stats.py] */
"Surveyor" = "Surveyor";
/* Main window. [EDMarketConnector.py] */
"System" = "System";
/* Appearance setting. [prefs.py] */
/* prefs.py: Label for Settings > Appearance > Theme selection; In files: prefs.py:706; */
"Theme" = "Tema";
/* Help text in settings. [prefs.py] */
"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 for 'Dark' theme radio button; In files: prefs.py:717; */
"Dark" = "Mörk";
/* Ranking. [stats.py] */
"Trade" = "Trade";
/* Explorer rank. [stats.py] */
"Trailblazer" = "Trailblazer";
/* Appearance theme setting. [prefs.py] */
/* prefs.py: Label for 'Transparent' theme radio button; In files: prefs.py:724; */
"Transparent" = "Transparent";
/* Trade rank. [stats.py] */
/* prefs.py: Label for Settings > Appearance tab; In files: prefs.py:860; */
"Appearance" = "Utseende";
/* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:875; */
"Plugins folder" = "Mapp för plugins";
/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:882; */
"Open" = "Öppna";
/* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:890; */
"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; */
"Enabled Plugins" = "Aktiverade plugins";
/* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:929; */
"Information on migrating plugins" = "Information om migrering av plugins";
/* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:944; */
"Disabled Plugins" = "Avaktiverade plugins";
/* stats.py: Cmdr stats; In files: stats.py:51; */
"Balance" = "Balance";
/* stats.py: Cmdr stats; In files: stats.py:52; */
"Loan" = "Lån";
/* stats.py: Ranking; In files: stats.py:57; */
"Combat" = "Combat";
/* stats.py: Ranking; In files: stats.py:58; */
"Trade" = "Trade";
/* stats.py: Ranking; In files: stats.py:59; */
"Explorer" = "Explorer";
/* stats.py: Ranking; In files: stats.py:60; */
"CQC" = "CQC";
/* stats.py: Ranking; In files: stats.py:61; */
"Federation" = "Federation";
/* stats.py: Ranking; In files: stats.py:62; */
"Empire" = "Empire";
/* stats.py: Ranking; In files: stats.py:63; */
"Powerplay" = "Powerplay";
/* stats.py: Combat rank; In files: stats.py:71; */
"Harmless" = "Harmless";
/* stats.py: Combat rank; In files: stats.py:72; */
"Mostly Harmless" = "Mostly Harmless";
/* stats.py: Combat rank; In files: stats.py:73; */
"Novice" = "Novice";
/* stats.py: Combat rank; In files: stats.py:74; */
"Competent" = "Competent";
/* stats.py: Combat rank; In files: stats.py:75; */
"Expert" = "Expert";
/* stats.py: Combat rank; stats.py: Empire rank; In files: stats.py:76; stats.py:139; */
"Master" = "Master";
/* stats.py: Combat rank; In files: stats.py:77; */
"Dangerous" = "Dangerous";
/* stats.py: Combat rank; In files: stats.py:78; */
"Deadly" = "Deadly";
/* stats.py: Top rank; In files: stats.py:79; stats.py:90; stats.py:101; stats.py:112; */
"Elite" = "Elite";
/* stats.py: Trade rank; In files: stats.py:82; */
"Penniless" = "Penniless";
/* stats.py: Trade rank; In files: stats.py:83; */
"Mostly Penniless" = "Mostly Penniless";
/* stats.py: Trade rank; In files: stats.py:84; */
"Peddler" = "Peddler";
/* stats.py: Trade rank; In files: stats.py:85; */
"Dealer" = "Dealer";
/* stats.py: Trade rank; In files: stats.py:86; */
"Merchant" = "Merchant";
/* stats.py: Trade rank; In files: stats.py:87; */
"Broker" = "Broker";
/* stats.py: Trade rank; In files: stats.py:88; */
"Entrepreneur" = "Entrepreneur";
/* stats.py: Trade rank; In files: stats.py:89; */
"Tycoon" = "Tycoon";
/* Update button in main window. [EDMarketConnector.py] */
"Update" = "Uppdatera";
/* stats.py: Explorer rank; In files: stats.py:93; */
"Aimless" = "Aimless";
/* Status dialog subtitle - CR value of ship. [stats.py] */
"Value" = "Värde";
/* stats.py: Explorer rank; In files: stats.py:94; */
"Mostly Aimless" = "Mostly Aimless";
/* Federation rank. [stats.py] */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Explorer rank; In files: stats.py:95; */
"Scout" = "Scout";
/* Menu title on OSX. [EDMarketConnector.py] */
"View" = "View";
/* stats.py: Explorer rank; In files: stats.py:96; */
"Surveyor" = "Surveyor";
/* Empire rank. [stats.py] */
"Viscount" = "Viscount";
/* stats.py: Explorer rank; In files: stats.py:97; */
"Trailblazer" = "Trailblazer";
/* Federation rank. [stats.py] */
/* stats.py: Explorer rank; In files: stats.py:98; */
"Pathfinder" = "Pathfinder";
/* stats.py: Explorer rank; In files: stats.py:99; */
"Ranger" = "Ranger";
/* stats.py: Explorer rank; In files: stats.py:100; */
"Pioneer" = "Pioneer";
/* stats.py: CQC rank; In files: stats.py:104; */
"Helpless" = "Helpless";
/* stats.py: CQC rank; In files: stats.py:105; */
"Mostly Helpless" = "Mostly Helpless";
/* stats.py: CQC rank; In files: stats.py:106; */
"Amateur" = "Amatör";
/* stats.py: CQC rank; In files: stats.py:107; */
"Semi Professional" = "Semi Professional";
/* stats.py: CQC rank; In files: stats.py:108; */
"Professional" = "Professional";
/* stats.py: CQC rank; In files: stats.py:109; */
"Champion" = "Champion";
/* stats.py: CQC rank; In files: stats.py:110; */
"Hero" = "Hero";
/* stats.py: CQC rank; In files: stats.py:111; */
"Gladiator" = "Gladiator";
/* stats.py: Federation rank; In files: stats.py:118; */
"Recruit" = "Recruit";
/* stats.py: Federation rank; In files: stats.py:119; */
"Cadet" = "Cadet";
/* stats.py: Federation rank; In files: stats.py:120; */
"Midshipman" = "Midshipman";
/* stats.py: Federation rank; In files: stats.py:121; */
"Petty Officer" = "Petty Officer";
/* stats.py: Federation rank; In files: stats.py:122; */
"Chief Petty Officer" = "Chief Petty Officer";
/* stats.py: Federation rank; In files: stats.py:123; */
"Warrant Officer" = "Warrant Officer";
/* Shouldn't happen. [EDMarketConnector.py] */
"What are you flying?!" = "Okänt skepp? (felmeddelande)";
/* stats.py: Federation rank; In files: stats.py:124; */
"Ensign" = "Ensign";
/* Shouldn't happen. [EDMarketConnector.py] */
"Where are you?!" = "Vart är du? (felmeddelande)";
/* stats.py: Federation rank; In files: stats.py:125; */
"Lieutenant" = "Lieutenant";
/* Shouldn't happen. [EDMarketConnector.py] */
"Who are you?!" = "Vem är du? (felmeddelande)";
/* stats.py: Federation rank; In files: stats.py:126; */
"Lieutenant Commander" = "Lieutenant Commander";
/* Menu title on OSX. [EDMarketConnector.py] */
"Window" = "Fönster";
/* stats.py: Federation rank; In files: stats.py:127; */
"Post Commander" = "Post Commander";
/* [EDMarketConnector.py] */
"You're not docked at a station!" = "Du är inte dockad vid en station!";
/* stats.py: Federation rank; In files: stats.py:128; */
"Post Captain" = "Post Captain";
/* Shortcut settings prompt on OSX. [prefs.py] */
"{APP} needs permission to use shortcuts" = "{APP} behöver rättigheter för att använda genvägar";
/* stats.py: Federation rank; In files: stats.py:129; */
"Rear Admiral" = "Rear Admiral";
/* stats.py: Federation rank; In files: stats.py:130; */
"Vice Admiral" = "Vice Admiral";
/* stats.py: Federation rank; In files: stats.py:131; */
"Admiral" = "Admiral";
/* stats.py: Empire rank; In files: stats.py:137; */
"Outsider" = "Outsider";
/* stats.py: Empire rank; In files: stats.py:138; */
"Serf" = "Serf";
/* stats.py: Empire rank; In files: stats.py:140; */
"Squire" = "Squire";
/* stats.py: Empire rank; In files: stats.py:141; */
"Knight" = "Knight";
/* stats.py: Empire rank; In files: stats.py:142; */
"Lord" = "Lord";
/* stats.py: Empire rank; In files: stats.py:143; */
"Baron" = "Baron";
/* stats.py: Empire rank; In files: stats.py:144; */
"Viscount" = "Viscount";
/* stats.py: Empire rank; In files: stats.py:145; */
"Count" = "Count";
/* stats.py: Empire rank; In files: stats.py:146; */
"Earl" = "Earl";
/* stats.py: Empire rank; In files: stats.py:147; */
"Marquis" = "Marquis";
/* stats.py: Empire rank; In files: stats.py:148; */
"Duke" = "Duke";
/* stats.py: Empire rank; In files: stats.py:149; */
"Prince" = "Prince";
/* stats.py: Empire rank; In files: stats.py:150; */
"King" = "King";
/* stats.py: Power rank; In files: stats.py:156; */
"Rating 1" = "Rating 1";
/* stats.py: Power rank; In files: stats.py:157; */
"Rating 2" = "Rating 2";
/* stats.py: Power rank; In files: stats.py:158; */
"Rating 3" = "Rating 3";
/* stats.py: Power rank; In files: stats.py:159; */
"Rating 4" = "Rating 4";
/* stats.py: Power rank; In files: stats.py:160; */
"Rating 5" = "Rating 5";
/* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:367; */
"Value" = "Värde";
/* stats.py: Status dialog title; In files: stats.py:376; */
"Ships" = "Skepp";

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -603,7 +603,7 @@ Content of `state` (updated to the current journal entry):
| `Data` | `dict` | 'Data' MicroResources in Odyssey, `int` count each. |
| `BackPack` | `dict` | `dict` of Odyssey MicroResources in backpack. |
| `BackpackJSON` | `dict` | Content of Backpack.json as of last read. |
| `ShipLockerJSON` | `dict` | Content of ShipLocker.json as of last read. |
| `ShipLockerJSON` | `dict` | Content of ShipLocker.json as of last read. |
| `SuitCurrent` | `dict` | CAPI-returned data of currently worn suit. NB: May be `None` if no data. |
| `Suits` | `dict`[1] | CAPI-returned data of owned suits. NB: May be `None` if no data. |
| `SuitLoadoutCurrent` | `dict` | CAPI-returned data of current Suit Loadout. NB: May be `None` if no data. |
@ -1043,6 +1043,39 @@ step for the extra module(s) until it works.
---
## Debug HTTP POST requests
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.
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`.
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.
The simplest way to go about adding support is:
```py
from edmc_data import DEBUG_WEBSERVER_HOST, DEBUG_WEBSERVER_PORT
from config import debug_senders
TARGET_URL = "https://host.tld/path/to/api/magic"
if 'my_plugin' in debug_senders:
TARGET_URL = f'http://{DEBUG_WEBSERVER_HOST}:{DEBUG_WEBSERVER_PORT}/my_plugin'
# Code that uses TARGET_URL to post info from your plugin below.
```
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

View File

@ -167,6 +167,7 @@ class ServerError(Exception):
# Raised when cannot contact the Companion API server
self.args = args
if not args:
# LANG: Frontier CAPI didn't respond
self.args = (_("Error: Frontier CAPI didn't respond"),)
@ -175,7 +176,8 @@ class ServerConnectionError(ServerError):
class ServerLagging(Exception):
"""Exception Class for CAPI Server lagging.
"""
Exception Class for CAPI Server lagging.
Raised when Companion API server is returning old data, e.g. when the
servers are too busy.
@ -184,20 +186,24 @@ class ServerLagging(Exception):
def __init__(self, *args) -> None:
self.args = args
if not args:
# LANG: Frontier CAPI data doesn't agree with latest Journal game location
self.args = (_('Error: Frontier server is lagging'),)
class SKUError(Exception):
"""Exception Class for CAPI SKU error.
class NoMonitorStation(Exception):
"""
Exception Class for being docked, but not knowing where in monitor.
Raised when the Companion API server thinks that the user has not
purchased E:D i.e. doesn't have the correct 'SKU'.
Raised when CAPI says we're docked but we forgot where we were at an EDO
Settlement, Disembarked, re-Embarked and then user hit 'Update'.
As of 4.0.0.401 both Disembark and Embark say `"Onstation": false`.
"""
def __init__(self, *args) -> None:
self.args = args
if not args:
self.args = (_('Error: Frontier server SKU problem'),)
# LANG: Commander is docked at an EDO settlement, got out and back in, we forgot the station
self.args = (_("Docked but unknown station: EDO Settlement?"),)
class CredentialsError(Exception):
@ -206,6 +212,7 @@ class CredentialsError(Exception):
def __init__(self, *args) -> None:
self.args = args
if not args:
# LANG: Generic "something went wrong with Frontier Auth" error
self.args = (_('Error: Invalid Credentials'),)
@ -221,6 +228,7 @@ class CmdrError(Exception):
def __init__(self, *args) -> None:
self.args = args
if not args:
# LANG: Frontier CAPI authorisation not for currently game-active commander
self.args = (_('Error: Wrong Cmdr'),)
@ -331,6 +339,7 @@ class Auth(object):
(data[k] for k in ('error_description', 'error', 'message') if k in data),
'<unknown error>'
)
# LANG: Generic error prefix - following text is from Frontier auth service
raise CredentialsError(f'{_("Error")}: {error!r}')
r = None
@ -369,15 +378,18 @@ class Auth(object):
if (usr := data_decode.get('usr')) is None:
logger.error('No "usr" in /decode data')
# LANG: Frontier auth, no 'usr' section in returned data
raise CredentialsError(_("Error: Couldn't check token customer_id"))
if (customer_id := usr.get('customer_id')) is None:
logger.error('No "usr"->"customer_id" in /decode data')
# LANG: Frontier auth, no 'customer_id' in 'usr' section in returned data
raise CredentialsError(_("Error: Couldn't check token customer_id"))
# All 'FID' seen in Journals so far have been 'F<id>'
# Frontier, Steam and Epic
if f'F{customer_id}' != monitor.state.get('FID'):
# LANG: Frontier auth customer_id doesn't match game session FID
raise CredentialsError(_("Error: customer_id doesn't match!"))
logger.info(f'Frontier CAPI Auth: New token for \"{self.cmdr}\"')
@ -399,6 +411,7 @@ class Auth(object):
if r:
self.dump(r)
# LANG: Failed to get Access Token from Frontier Auth service
raise CredentialsError(_('Error: unable to get token')) from e
logger.error(f"Frontier CAPI Auth: Can't get token for \"{self.cmdr}\"")
@ -407,18 +420,31 @@ class Auth(object):
(data[k] for k in ('error_description', 'error', 'message') if k in data),
'<unknown error>'
)
# LANG: Generic error prefix - following text is from Frontier auth service
raise CredentialsError(f'{_("Error")}: {error!r}')
@staticmethod
def invalidate(cmdr: str) -> None:
def invalidate(cmdr: Optional[str]) -> None:
"""Invalidate Refresh Token for specified Commander."""
logger.info(f'Frontier CAPI Auth: Invalidated token for "{cmdr}"')
cmdrs = config.get_list('cmdrs', default=[])
idx = cmdrs.index(cmdr)
tokens = config.get_list('fdev_apikeys', default=[])
tokens = tokens + [''] * (len(cmdrs) - len(tokens))
tokens[idx] = ''
config.set('fdev_apikeys', tokens)
to_set: Optional[list] = None
if cmdr is None:
logger.info('Frontier CAPI Auth: Invalidating ALL tokens!')
cmdrs = config.get_list('cmdrs', default=[])
to_set = [''] * len(cmdrs)
else:
logger.info(f'Frontier CAPI Auth: Invalidated token for "{cmdr}"')
cmdrs = config.get_list('cmdrs', default=[])
idx = cmdrs.index(cmdr)
to_set = config.get_list('fdev_apikeys', default=[])
to_set = to_set + [''] * (len(cmdrs) - len(to_set))
to_set[idx] = ''
if to_set is None:
logger.error('REFUSING TO SET NONE AS TOKENS!')
raise ValueError('Unexpected None for tokens while resetting')
config.set('fdev_apikeys', to_set)
config.save() # Save settings now for use by command-line app
# noinspection PyMethodMayBeStatic
@ -526,7 +552,7 @@ class Session(object):
self.session.headers['User-Agent'] = USER_AGENT
self.state = Session.STATE_OK
def query(self, endpoint: str) -> CAPIData:
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:
@ -547,6 +573,7 @@ class Session(object):
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
if r.url.startswith(SERVER_AUTH):
@ -562,6 +589,7 @@ class Session(object):
# 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}')
try:
@ -581,7 +609,7 @@ class Session(object):
raise CredentialsError('query failed after refresh') from e
elif self.login(): # Maybe our token expired. Re-authorize in any case
logger.debug('Maybe our token expired.')
logger.debug('Initial query failed, but login() just worked, trying again...')
self.retrying = True
return self.query(endpoint)
@ -660,6 +688,8 @@ class Session(object):
if services.get('commodities'):
marketdata = self.query(URL_MARKET)
if last_starport_name != marketdata['name'] or last_starport_id != int(marketdata['id']):
logger.warning(f"{last_starport_name!r} != {marketdata['name']!r}"
f" or {last_starport_id!r} != {int(marketdata['id'])!r}")
raise ServerLagging()
else:
@ -668,6 +698,8 @@ class Session(object):
if services.get('outfitting') or services.get('shipyard'):
shipdata = self.query(URL_SHIPYARD)
if last_starport_name != shipdata['name'] or last_starport_id != int(shipdata['id']):
logger.warning(f"{last_starport_name!r} != {shipdata['name']!r} or "
f"{last_starport_id!r} != {int(shipdata['id'])!r}")
raise ServerLagging()
else:

View File

@ -33,11 +33,14 @@ 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.1'
_static_appversion = '5.1.2'
_cached_version: Optional[semantic_version.Version] = None
copyright = '© 2015-2019 Jonathan Harris, 2020-2021 EDCD'
update_feed = 'https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/edmarketconnector.xml'
update_interval = 8*60*60
# Providers marked to be in debug mode. Generally this is expected to switch to sending data to a log file
debug_senders: List[str] = []
# This must be done here in order to avoid an import cycle with EDMCLogging.
# Other code should use EDMCLogging.get_main_logger
@ -136,6 +139,10 @@ def appversion() -> semantic_version.Version:
:return: The augmented app version.
"""
global _cached_version
if _cached_version is not None:
return _cached_version
if getattr(sys, 'frozen', False):
# Running frozen, so we should have a .gitversion file
# Yes, .parent because if frozen we're inside library.zip
@ -148,7 +155,8 @@ def appversion() -> semantic_version.Version:
if shorthash is None:
shorthash = 'UNKNOWN'
return semantic_version.Version(f'{_static_appversion}+{shorthash}')
_cached_version = semantic_version.Version(f'{_static_appversion}+{shorthash}')
return _cached_version
def appversion_nobuild() -> semantic_version.Version:

147
debug_webserver.py Normal file
View File

@ -0,0 +1,147 @@
"""Simple HTTP listener to be used with debugging various EDMC sends."""
import json
import pathlib
import tempfile
import threading
from http import server
from typing import Any, Callable, Tuple, Union
from urllib.parse import parse_qs
from config import appname
from EDMCLogging import get_main_logger
logger = get_main_logger()
output_lock = threading.Lock()
output_data_path = pathlib.Path(tempfile.gettempdir()) / f'{appname}' / 'http_debug'
SAFE_TRANSLATE = str.maketrans({x: '_' for x in "!@#$%^&*()./\\\r\n[]-+='\";:?<>,~`"})
class LoggingHandler(server.BaseHTTPRequestHandler):
"""HTTP Handler implementation that logs to EDMCs logger and writes data to files on disk."""
def __init__(self, request: bytes, client_address: Tuple[str, int], server) -> None:
super().__init__(request, client_address, server)
def log_message(self, format: str, *args: Any) -> None:
"""Override default handler logger with EDMC logger."""
logger.info(format % args)
def do_POST(self) -> None: # noqa: N802 # I cant change it
"""Handle POST."""
logger.info(f"Received a POST for {self.path!r}!")
data = self.rfile.read(int(self.headers['Content-Length'])).decode('utf-8', errors='replace')
to_save = data
target_path = self.path
if len(target_path) > 1 and target_path[0] == '/':
target_path = target_path[1:]
elif len(target_path) == 1 and target_path[0] == '/':
target_path = 'WEB_ROOT'
response: Union[Callable[[str], str], str, None] = DEFAULT_RESPONSES.get(target_path)
if callable(response):
response = response(data)
self.send_response_only(200, "OK")
if response is not None:
self.send_header('Content-Length', str(len(response)))
self.end_headers() # This is needed because send_response_only DOESN'T ACTUALLY SEND THE RESPONSE </rant>
if response is not None:
self.wfile.write(response.encode())
self.wfile.flush()
if target_path == 'edsm':
# attempt to extract data from urlencoded stream
try:
edsm_data = extract_edsm_data(data)
data = data + "\n" + json.dumps(edsm_data)
except Exception:
pass
target_file = output_data_path / (safe_file_name(target_path) + '.log')
if target_file.parent != output_data_path:
logger.warning(f"REFUSING TO WRITE FILE THAT ISN'T IN THE RIGHT PLACE! {target_file=}")
logger.warning(f'DATA FOLLOWS\n{data}')
return
with output_lock, target_file.open('a') as f:
f.write(to_save + "\n\n")
def safe_file_name(name: str):
"""
Escape special characters out of a file name.
This is a nicety. Don't rely on it to be ultra secure.
"""
return name.translate(SAFE_TRANSLATE)
def generate_inara_response(raw_data: str) -> str:
"""Generate nonstatic data for inara plugin."""
try:
data = json.loads(raw_data)
except json.JSONDecodeError:
return "UNKNOWN REQUEST"
out = {
'header': {
'eventStatus': 200
},
'events': [
{
'eventName': e['eventName'], 'eventStatus': 200, 'eventStatusText': "DEBUG STUFF"
} for e in data.get('events')
]
}
return json.dumps(out)
def extract_edsm_data(data: str) -> dict[str, Any]:
res = parse_qs(data)
return {name: data[0] for name, data in res.items()}
def generate_edsm_response(raw_data: str) -> str:
"""Generate nonstatic data for edsm plugin."""
try:
data = extract_edsm_data(raw_data)
events = json.loads(data['message'])
except (json.JSONDecodeError, Exception):
logger.exception("????")
return "UNKNOWN REQUEST"
out = {
'msgnum': 100, # Ok
'msg': 'debug stuff',
'events': [
{'event': e['event'], 'msgnum': 100, 'msg': 'debug stuff'} for e in events
]
}
return json.dumps(out)
DEFAULT_RESPONSES = {
'inara': generate_inara_response,
'edsm': generate_edsm_response
}
def run_listener(host: str = "127.0.0.1", port: int = 9090) -> None:
"""Run a listener thread."""
output_data_path.mkdir(exist_ok=True)
logger.info(f'Starting HTTP listener on {host=} {port=}!')
listener = server.HTTPServer((host, port), LoggingHandler)
logger.info(listener)
threading.Thread(target=listener.serve_forever, daemon=True).start()
if __name__ == "__main__":
output_data_path.mkdir(exist_ok=True)
server.HTTPServer(("127.0.0.1", 9090), LoggingHandler).serve_forever()

View File

@ -240,7 +240,7 @@ 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](docs/Killswitches.md).
be commited to the `releases` branch!!!** See [docs/Killswitches.md](Killswitches.md).
# Packaging & Installer Generation

View File

@ -570,3 +570,21 @@ edmc_suit_symbol_localised = {
'utilitysuit': 'Traje Maverick',
},
}
# WORKAROUND 2021-07-03 | 4.0.0.600 Update 5: duplicates of `fileheader` keys in `LoadGame`,
# but the GameLanguage in the latter has doubled up the `\`, so cater for either here.
# This is sourced from what the game is passed by the launcher, caveat emptor. It was mentioned that / is also
# an option
# This is only run once when this file is imported by something, no runtime cost or repeated expansions will occur
__keys = list(edmc_suit_symbol_localised.keys())
for lang in __keys:
new_lang = lang.replace('\\', r'\\')
new_lang_2 = lang.replace('\\', '/')
edmc_suit_symbol_localised[new_lang] = edmc_suit_symbol_localised[lang]
edmc_suit_symbol_localised[new_lang_2] = edmc_suit_symbol_localised[lang]
# Local webserver for debugging. See implementation in debug_webserver.py
DEBUG_WEBSERVER_HOST = '127.0.0.1'
DEBUG_WEBSERVER_PORT = 9090

View File

@ -202,6 +202,7 @@ class JournalLock:
self.parent = parent
self.callback = callback
# LANG: Title text on popup when Journal directory already locked
self.title(_('Journal directory already locked'))
# remove decoration
@ -218,13 +219,16 @@ class JournalLock:
frame.grid(sticky=tk.NSEW)
self.blurb = tk.Label(frame)
# LANG: Text for when newly selected Journal directory is already locked
self.blurb['text'] = _("The new Journal Directory location is already locked.{CR}"
"You can either attempt to resolve this and then Retry, or choose to Ignore this.")
self.blurb.grid(row=1, column=0, columnspan=2, sticky=tk.NSEW)
# LANG: Generic 'Retry' button label
self.retry_button = ttk.Button(frame, text=_('Retry'), command=self.retry)
self.retry_button.grid(row=2, column=0, sticky=tk.EW)
# LANG: Generic 'Ignore' button label
self.ignore_button = ttk.Button(frame, text=_('Ignore'), command=self.ignore)
self.ignore_button.grid(row=2, column=1, sticky=tk.EW)
self.protocol("WM_DELETE_WINDOW", self._destroy)

View File

@ -182,9 +182,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
if journal_dir == '' or journal_dir is None:
journal_dir = config.default_journal_dir
# TODO(A_D): this is ignored for type checking due to all the different types config.get returns
# When that is refactored, remove the magic comment
logdir = expanduser(journal_dir) # type: ignore # config is weird
logdir = expanduser(journal_dir)
if not logdir or not isdir(logdir):
logger.error(f'Journal Directory is invalid: "{logdir}"')
@ -201,11 +199,11 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
# Do this before setting up the observer in case the journal directory has gone away
try: # TODO: This should be replaced with something specific ONLY wrapping listdir
logfiles = sorted(
(x for x in listdir(self.currentdir) if self._RE_LOGFILE.search(x)), # type: ignore # config is weird
(x for x in listdir(self.currentdir) if self._RE_LOGFILE.search(x)),
key=lambda x: x.split('.')[1:]
)
self.logfile = join(self.currentdir, logfiles[-1]) if logfiles else None # type: ignore # config is weird
self.logfile = join(self.currentdir, logfiles[-1]) if logfiles else None
except Exception:
logger.exception('Failed to find latest logfile')
@ -489,11 +487,9 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
entry: MutableMapping[str, Any] = json.loads(line, object_pairs_hook=OrderedDict)
entry['timestamp'] # we expect this to exist # TODO: replace with assert? or an if key in check
event_type = entry['event']
if event_type == 'Fileheader':
event_type = entry['event'].lower()
if event_type == 'fileheader':
self.live = False
self.version = entry['gameversion']
self.is_beta = any(v in entry['gameversion'].lower() for v in ('alpha', 'beta'))
self.cmdr = None
self.mode = None
@ -508,15 +504,19 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.systemaddress = None
self.started = None
self.__init_state()
# In self.state as well, as that's what plugins get
self.state['GameLanguage'] = entry['language']
self.state['GameVersion'] = entry['gameversion']
self.state['GameBuild'] = entry['build']
elif event_type == 'Commander':
# Do this AFTER __init_state() lest our nice new state entries be None
self.populate_version_info(entry)
elif event_type == 'commander':
self.live = True # First event in 3.0
elif event_type == 'LoadGame':
elif event_type == 'loadgame':
# Odyssey Release Update 5 -- This contains data that doesn't match the format used in FileHeader above
self.populate_version_info(entry, suppress=True)
# alpha4
# Odyssey: bool
self.cmdr = entry['Commander']
# 'Open', 'Solo', 'Group', or None for CQC (and Training - but no LoadGame event)
self.mode = entry.get('GameMode')
@ -551,11 +551,11 @@ 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
elif event_type == 'NewCommander':
elif event_type == 'newcommander':
self.cmdr = entry['Name']
self.group = None
elif event_type == 'SetUserShipName':
elif event_type == 'setusershipname':
self.state['ShipID'] = entry['ShipID']
if 'UserShipId' in entry: # Only present when changing the ship's ident
self.state['ShipIdent'] = entry['UserShipId']
@ -563,7 +563,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.state['ShipName'] = entry.get('UserShipName')
self.state['ShipType'] = self.canonicalise(entry['Ship'])
elif event_type == 'ShipyardBuy':
elif event_type == 'shipyardbuy':
self.state['ShipID'] = None
self.state['ShipIdent'] = None
self.state['ShipName'] = None
@ -575,7 +575,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.state['Credits'] -= entry.get('ShipPrice', 0)
elif event_type == 'ShipyardSwap':
elif event_type == 'shipyardswap':
self.state['ShipID'] = entry['ShipID']
self.state['ShipIdent'] = None
self.state['ShipName'] = None
@ -585,9 +585,11 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.state['Rebuy'] = None
self.state['Modules'] = None
elif (event_type == 'Loadout' and
'fighter' not in self.canonicalise(entry['Ship']) and
'buggy' not in self.canonicalise(entry['Ship'])):
elif (
event_type == 'loadout' and
'fighter' not in self.canonicalise(entry['Ship']) and
'buggy' not in self.canonicalise(entry['Ship'])
):
self.state['ShipID'] = entry['ShipID']
self.state['ShipIdent'] = entry['ShipIdent']
@ -615,7 +617,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.state['Modules'][module['Slot']] = module
elif event_type == 'ModuleBuy':
elif event_type == 'modulebuy':
self.state['Modules'][entry['Slot']] = {
'Slot': entry['Slot'],
'Item': self.canonicalise(entry['BuyItem']),
@ -627,21 +629,21 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.state['Credits'] -= entry.get('BuyPrice', 0)
elif event_type == 'ModuleRetrieve':
elif event_type == 'moduleretrieve':
self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'ModuleSell':
elif event_type == 'modulesell':
self.state['Modules'].pop(entry['Slot'], None)
self.state['Credits'] += entry.get('SellPrice', 0)
elif event_type == 'ModuleSellRemote':
elif event_type == 'modulesellremote':
self.state['Credits'] += entry.get('SellPrice', 0)
elif event_type == 'ModuleStore':
elif event_type == 'modulestore':
self.state['Modules'].pop(entry['Slot'], None)
self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'ModuleSwap':
elif event_type == 'moduleswap':
to_item = self.state['Modules'].get(entry['ToSlot'])
to_slot = entry['ToSlot']
from_slot = entry['FromSlot']
@ -653,13 +655,13 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
else:
modules.pop(from_slot, None)
elif event_type == 'Undocked':
elif event_type == 'undocked':
self.station = None
self.station_marketid = None
self.stationtype = None
self.stationservices = None
elif event_type == 'Embark':
elif event_type == 'embark':
# This event is logged when a player (on foot) gets into a ship or SRV
# Parameters:
# • SRV: true if getting into SRV, false if getting into a ship
@ -686,7 +688,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
# ShipLocker.
self.backpack_set_empty()
elif event_type == 'Disembark':
elif event_type == 'disembark':
# This event is logged when the player steps out of a ship or SRV
#
# Parameters:
@ -717,13 +719,13 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.state['Taxi'] = False
self.state['Dropship'] = False
elif event_type == 'DropshipDeploy':
elif event_type == 'dropshipdeploy':
# We're definitely on-foot now
self.state['OnFoot'] = True
self.state['Taxi'] = False
self.state['Dropship'] = False
elif event_type == 'Docked':
elif event_type == 'docked':
self.station = entry.get('StationName') # May be None
self.station_marketid = entry.get('MarketID') # May be None
self.stationtype = entry.get('StationType') # May be None
@ -731,7 +733,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
# No need to set self.state['Taxi'] or Dropship here, if its those, the next event is a Disembark anyway
elif event_type in ('Location', 'FSDJump', 'CarrierJump'):
elif event_type in ('location', 'fsdjump', 'carrierjump'):
# alpha4 - any changes ?
# Location:
# New in Odyssey:
@ -739,15 +741,15 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
# • Multicrew: bool
# • InSRV: bool
# • OnFoot: bool
if event_type in ('Location', 'CarrierJump'):
if event_type in ('location', 'carrierjump'):
self.planet = entry.get('Body') if entry.get('BodyType') == 'Planet' else None
self.state['Body'] = entry.get('Body')
self.state['BodyType'] = entry.get('BodyType')
# if event_type == 'Location':
# if event_type == 'location':
# logger.trace('"Location" event')
elif event_type == 'FSDJump':
elif event_type == 'fsdjump':
self.planet = None
self.state['Body'] = None
self.state['BodyType'] = None
@ -776,37 +778,38 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
if not self.state['Taxi']:
self.state['Dropship'] = None
elif event_type == 'ApproachBody':
elif event_type == 'approachbody':
self.planet = entry['Body']
self.state['Body'] = entry['Body']
self.state['BodyType'] = 'Planet' # Best guess. Journal says always planet.
elif event_type in ('LeaveBody', 'SupercruiseEntry'):
elif event_type in ('leavebody', 'supercruiseentry'):
self.planet = None
self.state['Body'] = None
self.state['BodyType'] = None
elif event_type in ('Rank', 'Promotion'):
elif event_type in ('rank', 'promotion'):
payload = dict(entry)
payload.pop('event')
payload.pop('timestamp')
self.state['Rank'].update({k: (v, 0) for k, v in payload.items()})
elif event_type == 'Progress':
elif event_type == 'progress':
rank = self.state['Rank']
for k, v in entry.items():
if k in rank:
# perhaps not taken promotion mission yet
rank[k] = (rank[k][0], min(v, 100))
elif event_type in ('Reputation', 'Statistics'):
elif event_type in ('reputation', 'statistics'):
payload = OrderedDict(entry)
payload.pop('event')
payload.pop('timestamp')
self.state[event_type] = payload
# NB: We need the original casing for these keys
self.state[entry['event']] = payload
elif event_type == 'EngineerProgress':
elif event_type == 'engineerprogress':
# Sanity check - at least once the 'Engineer' (name) was missing from this in early
# Odyssey 4.0.0.100. Might only have been a server issue causing incomplete data.
@ -826,7 +829,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
else:
engineers[engineer] = entry['Progress']
elif event_type == 'Cargo' and entry.get('Vessel') == 'Ship':
elif event_type == 'cargo' and entry.get('Vessel') == 'Ship':
self.state['Cargo'] = defaultdict(int)
# From 3.3 full Cargo event (after the first one) is written to a separate file
if 'Inventory' not in entry:
@ -838,7 +841,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.state['Cargo'].update({self.canonicalise(x['Name']): x['Count'] for x in clean})
elif event_type == 'CargoTransfer':
elif event_type == 'cargotransfer':
for c in entry['Transfers']:
name = self.canonicalise(c['Type'])
if c['Direction'] == 'toship':
@ -848,7 +851,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
# So it's *from* the ship
self.state['Cargo'][name] -= c['Count']
elif event_type == 'ShipLocker':
elif event_type == 'shiplocker':
# As of 4.0.0.400 (2021-06-10)
# "ShipLocker" will be a full list written to the journal at startup/boarding/disembarking, and also
# written to a separate shiplocker.json file - other updates will just update that file and mention it
@ -904,12 +907,16 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
)
# Journal v31 implies this was removed before Odyssey launch
elif event_type == 'BackPackMaterials':
elif event_type == 'backpackmaterials':
# Last seen in a 4.0.0.102 journal file.
logger.warning(f'We have a BackPackMaterials event, defunct since > 4.0.0.102 ?:\n{entry}\n')
pass
elif event_type in ('BackPack', 'Backpack'): # WORKAROUND 4.0.0.200: BackPack becomes Backpack
elif event_type in ('backpack', 'resupply'):
# as of v4.0.0.600, a `resupply` event is dropped when resupplying your suit at your ship.
# This event writes the same data as a backpack event. It will also be followed by a ShipLocker
# but that follows normal behaviour in its handler.
# TODO: v31 doc says this is`backpack.json` ... but Howard Chalkley
# said it's `Backpack.json`
backpack_file = pathlib.Path(str(self.currentdir)) / 'Backpack.json'
@ -964,7 +971,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
{self.canonicalise(x['Name']): x['Count'] for x in clean_data}
)
elif event_type == 'BackpackChange':
elif event_type == 'backpackchange':
# Changes to Odyssey Backpack contents *other* than from a Transfer
# See TransferMicroResources event for that.
@ -997,36 +1004,35 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
if self.state['BackPack'][c][m] < 0:
self.state['BackPack'][c][m] = 0
elif event_type == 'BuyMicroResources':
elif event_type == 'buymicroresources':
# From 4.0.0.400 we get an empty (see file) `ShipLocker` event,
# so we can ignore this for inventory purposes.
# But do record the credits balance change.
self.state['Credits'] -= entry.get('Price', 0)
elif event_type == 'SellMicroResources':
elif event_type == 'sellmicroresources':
# As of 4.0.0.400 we can ignore this as an empty (see file)
# `ShipLocker` event is written for the full new inventory.
# But still record the credits balance change.
self.state['Credits'] += entry.get('Price', 0)
elif event_type in ('TradeMicroResources', 'CollectItems', 'DropItems', 'UseConsumable'):
elif event_type in ('tradeMicroResources', 'collectitems', 'dropitems', 'useconsumable'):
# As of 4.0.0.400 we can ignore these as an empty (see file)
# `ShipLocker` event and/or a `BackpackChange` is also written.
pass
# TODO:
# <https://forums.frontier.co.uk/threads/575010/>
# also there's one additional journal event that was missed out from
# this version of the docs: "SuitLoadout": # when starting on foot, or
# when disembarking from a ship, with the same info as found in "CreateSuitLoadout"
elif event_type == 'SuitLoadout':
elif event_type == 'suitloadout':
suit_slotid, suitloadout_slotid = self.suitloadout_store_from_event(entry)
if not self.suit_and_loadout_setcurrent(suit_slotid, suitloadout_slotid):
logger.error(f"Event was: {entry}")
elif event_type == 'SwitchSuitLoadout':
elif event_type == 'switchsuitloadout':
# 4.0.0.101
#
# { "timestamp":"2021-05-21T10:39:43Z", "event":"SwitchSuitLoadout",
@ -1044,7 +1050,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
if not self.suit_and_loadout_setcurrent(suitid, suitloadout_slotid):
logger.error(f"Event was: {entry}")
elif event_type == 'CreateSuitLoadout':
elif event_type == 'createsuitloadout':
# 4.0.0.101
#
# { "timestamp":"2021-05-21T11:13:15Z", "event":"CreateSuitLoadout", "SuitID":1700216165682989,
@ -1061,7 +1067,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
# if not self.suit_and_loadout_setcurrent(suitid, suitloadout_slotid):
# logger.error(f"Event was: {entry}")
elif event_type == 'DeleteSuitLoadout':
elif event_type == 'deletesuitloadout':
# alpha4:
# { "timestamp":"2021-04-29T10:32:27Z", "event":"DeleteSuitLoadout", "SuitID":1698365752966423,
# "SuitName":"explorationsuit_class1", "SuitName_Localised":"Artemis Suit", "LoadoutID":4293000003,
@ -1076,7 +1082,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
# This should no longer happen, as we're now handling CreateSuitLoadout properly
logger.debug(f"loadout slot id {loadout_id} doesn't exist, not in last CAPI pull ?")
elif event_type == 'RenameSuitLoadout':
elif event_type == 'renamesuitloadout':
# alpha4
# Parameters:
# • SuitID
@ -1095,7 +1101,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
except KeyError:
logger.debug(f"loadout slot id {loadout_id} doesn't exist, not in last CAPI pull ?")
elif event_type == 'BuySuit':
elif event_type == 'buysuit':
# alpha4 :
# { "timestamp":"2021-04-29T09:03:37Z", "event":"BuySuit", "Name":"UtilitySuit_Class1",
# "Name_Localised":"Maverick Suit", "Price":150000, "SuitID":1698364934364699 }
@ -1106,7 +1112,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
'edmcName': self.suit_sane_name(loc_name),
'id': None, # Is this an FDev ID for suit type ?
'suitId': entry['SuitID'],
'slots': [],
'mods': entry['SuitMods'], # Suits can (rarely) be bought with modules installed
}
# update credits
@ -1116,7 +1122,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
else:
self.state['Credits'] -= price
elif event_type == 'SellSuit':
elif event_type == 'sellsuit':
# Remove from known suits
# As of Odyssey Alpha Phase 2, Hotfix 5 (4.0.0.13) this isn't possible as this event
# doesn't contain the specific suit ID as per CAPI `suits` dict.
@ -1144,7 +1150,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
else:
self.state['Credits'] += price
elif event_type == 'UpgradeSuit':
elif event_type == 'upgradesuit':
# alpha4
# This event is logged when the player upgrades their flight suit
#
@ -1156,7 +1162,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
# TODO: Update self.state['Suits'] when we have an example to work from
self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'LoadoutEquipModule':
elif event_type == 'loadoutequipmodule':
# alpha4:
# { "timestamp":"2021-04-29T11:11:13Z", "event":"LoadoutEquipModule", "LoadoutName":"Dom L/K/K",
# "SuitID":1698364940285172, "SuitName":"tacticalsuit_class1", "SuitName_Localised":"Dominator Suit",
@ -1171,12 +1177,14 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
'id': None,
'weaponrackId': entry['SuitModuleID'],
'locDescription': '',
'class': entry['Class'],
'mods': entry['WeaponMods']
}
except KeyError:
logger.error(f"LoadoutEquipModule: {entry}")
elif event_type == 'LoadoutRemoveModule':
elif event_type == 'loadoutremovemodule':
# alpha4 - triggers if selecting an already-equipped weapon into a different slot
# { "timestamp":"2021-04-29T11:11:13Z", "event":"LoadoutRemoveModule", "LoadoutName":"Dom L/K/K",
# "SuitID":1698364940285172, "SuitName":"tacticalsuit_class1", "SuitName_Localised":"Dominator Suit",
@ -1190,7 +1198,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
except KeyError:
logger.error(f"LoadoutRemoveModule: {entry}")
elif event_type == 'BuyWeapon':
elif event_type == 'buyweapon':
# alpha4
# { "timestamp":"2021-04-29T11:10:51Z", "event":"BuyWeapon", "Name":"Wpn_M_AssaultRifle_Laser_FAuto",
# "Name_Localised":"TK Aphelion", "Price":125000, "SuitModuleID":1698372938719590 }
@ -1201,7 +1209,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
else:
self.state['Credits'] -= price
elif event_type == 'SellWeapon':
elif event_type == 'sellweapon':
# We're not actually keeping track of all owned weapons, only those in
# Suit Loadouts.
# alpha4:
@ -1225,20 +1233,20 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
else:
self.state['Credits'] += price
elif event_type == 'UpgradeWeapon':
elif event_type == 'upgradeweapon':
# We're not actually keeping track of all owned weapons, only those in
# Suit Loadouts.
self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'ScanOrganic':
elif event_type == 'scanorganic':
# Nothing of interest to our state.
pass
elif event_type == 'SellOrganicData':
elif event_type == 'sellorganicdata':
for bd in entry['BioData']:
self.state['Credits'] += bd.get('Value', 0) + bd.get('Bonus', 0)
elif event_type == 'BookDropship':
elif event_type == 'bookdropship':
self.state['Credits'] -= entry.get('Cost', 0)
self.state['Dropship'] = True
# Technically we *might* now not be OnFoot.
@ -1252,20 +1260,20 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
# not still on-foot, BUT it doesn't really matter as the next significant
# event is going to be Disembark to on-foot anyway.
elif event_type == 'BookTaxi':
elif event_type == 'booktaxi':
self.state['Credits'] -= entry.get('Cost', 0)
# Dont set taxi state here, as we're not IN a taxi yet. Set it on Embark
elif event_type == 'CancelDropship':
elif event_type == 'canceldropship':
self.state['Credits'] += entry.get('Refund', 0)
self.state['Dropship'] = False
self.state['Taxi'] = False
elif event_type == 'CancelTaxi':
elif event_type == 'canceltaxi':
self.state['Credits'] += entry.get('Refund', 0)
self.state['Taxi'] = False
elif event_type == 'NavRoute':
elif event_type == 'navroute':
# Added in ED 3.7 - multi-hop route details in NavRoute.json
with open(join(self.currentdir, 'NavRoute.json'), 'rb') as rf: # type: ignore
try:
@ -1277,7 +1285,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
else:
self.state['NavRoute'] = entry
elif event_type == 'ModuleInfo':
elif event_type == 'moduleinfo':
with open(join(self.currentdir, 'ModulesInfo.json'), 'rb') as mf: # type: ignore
try:
entry = json.load(mf)
@ -1288,30 +1296,30 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
else:
self.state['ModuleInfo'] = entry
elif event_type in ('CollectCargo', 'MarketBuy', 'BuyDrones', 'MiningRefined'):
elif event_type in ('collectcargo', 'marketbuy', 'buydrones', 'miningrefined'):
commodity = self.canonicalise(entry['Type'])
self.state['Cargo'][commodity] += entry.get('Count', 1)
if event_type == 'BuyDrones':
if event_type == 'buydrones':
self.state['Credits'] -= entry.get('TotalCost', 0)
elif event_type == 'MarketBuy':
elif event_type == 'marketbuy':
self.state['Credits'] -= entry.get('TotalCost', 0)
elif event_type in ('EjectCargo', 'MarketSell', 'SellDrones'):
elif event_type in ('ejectcargo', 'marketsell', 'selldrones'):
commodity = self.canonicalise(entry['Type'])
cargo = self.state['Cargo']
cargo[commodity] -= entry.get('Count', 1)
if cargo[commodity] <= 0:
cargo.pop(commodity)
if event_type == 'MarketSell':
if event_type == 'marketsell':
self.state['Credits'] += entry.get('TotalSale', 0)
elif event_type == 'SellDrones':
elif event_type == 'selldrones':
self.state['Credits'] += entry.get('TotalSale', 0)
elif event_type == 'SearchAndRescue':
elif event_type == 'searchandrescue':
for item in entry.get('Items', []):
commodity = self.canonicalise(item['Name'])
cargo = self.state['Cargo']
@ -1319,25 +1327,25 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
if cargo[commodity] <= 0:
cargo.pop(commodity)
elif event_type == 'Materials':
elif event_type == 'materials':
for category in ('Raw', 'Manufactured', 'Encoded'):
self.state[category] = defaultdict(int)
self.state[category].update({
self.canonicalise(x['Name']): x['Count'] for x in entry.get(category, [])
})
elif event_type == 'MaterialCollected':
elif event_type == 'materialcollected':
material = self.canonicalise(entry['Name'])
self.state[entry['Category']][material] += entry['Count']
elif event_type in ('MaterialDiscarded', 'ScientificResearch'):
elif event_type in ('materialdiscarded', 'scientificresearch'):
material = self.canonicalise(entry['Name'])
state_category = self.state[entry['Category']]
state_category[material] -= entry['Count']
if state_category[material] <= 0:
state_category.pop(material)
elif event_type == 'Synthesis':
elif event_type == 'synthesis':
for category in ('Raw', 'Manufactured', 'Encoded'):
for x in entry['Materials']:
material = self.canonicalise(x['Name'])
@ -1346,7 +1354,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
if self.state[category][material] <= 0:
self.state[category].pop(material)
elif event_type == 'MaterialTrade':
elif event_type == 'materialtrade':
category = self.category(entry['Paid']['Category'])
state_category = self.state[category]
paid = entry['Paid']
@ -1360,7 +1368,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
state_category[received['Material']] += received['Quantity']
elif event_type == 'EngineerCraft' or (
event_type == 'EngineerLegacyConvert' and not entry.get('IsPreview')
event_type == 'engineerlegacyconvert' and not entry.get('IsPreview')
):
for category in ('Raw', 'Manufactured', 'Encoded'):
@ -1391,7 +1399,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
module['Engineering'].pop('ExperimentalEffect', None)
module['Engineering'].pop('ExperimentalEffect_Localised', None)
elif event_type == 'MissionCompleted':
elif event_type == 'missioncompleted':
self.state['Credits'] += entry.get('Reward', 0)
for reward in entry.get('CommodityReward', []):
@ -1404,7 +1412,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
material = self.canonicalise(reward['Name'])
self.state[category][material] += reward.get('Count', 1)
elif event_type == 'EngineerContribution':
elif event_type == 'engineercontribution':
commodity = self.canonicalise(entry.get('Commodity'))
if commodity:
self.state['Cargo'][commodity] -= entry['Quantity']
@ -1419,7 +1427,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
if self.state[category][material] <= 0:
self.state[category].pop(material)
elif event_type == 'TechnologyBroker':
elif event_type == 'technologybroker':
for thing in entry.get('Ingredients', []): # 3.01
for category in ('Cargo', 'Raw', 'Manufactured', 'Encoded'):
item = self.canonicalise(thing['Name'])
@ -1441,7 +1449,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
if self.state[category][material] <= 0:
self.state[category].pop(material)
elif event_type == 'JoinACrew':
elif event_type == 'joinacrew':
self.state['Captain'] = entry['Captain']
self.state['Role'] = 'Idle'
self.planet = None
@ -1457,10 +1465,10 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.state['Body'] = None
self.state['BodyType'] = None
elif event_type == 'ChangeCrewRole':
elif event_type == 'changecrewrole':
self.state['Role'] = entry['Role']
elif event_type == 'QuitACrew':
elif event_type == 'quitacrew':
self.state['Captain'] = None
self.state['Role'] = None
self.planet = None
@ -1476,7 +1484,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.state['BodyType'] = None
# TODO: on_foot: Will we get an event after this to know ?
elif event_type == 'Friends':
elif event_type == 'friends':
if entry['Status'] in ('Online', 'Added'):
self.state['Friends'].add(entry['Name'])
@ -1484,75 +1492,75 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.state['Friends'].discard(entry['Name'])
# Try to keep Credits total updated
elif event_type in ('MultiSellExplorationData', 'SellExplorationData'):
elif event_type in ('multisellexplorationdata', 'sellexplorationdata'):
self.state['Credits'] += entry.get('TotalEarnings', 0)
elif event_type == 'BuyExplorationData':
elif event_type == 'buyexplorationdata':
self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'BuyTradeData':
elif event_type == 'buytradedata':
self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'BuyAmmo':
elif event_type == 'buyammo':
self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'CommunityGoalReward':
elif event_type == 'communitygoalreward':
self.state['Credits'] += entry.get('Reward', 0)
elif event_type == 'CrewHire':
elif event_type == 'crewhire':
self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'FetchRemoteModule':
elif event_type == 'fetchremotemodule':
self.state['Credits'] -= entry.get('TransferCost', 0)
elif event_type == 'MissionAbandoned':
elif event_type == 'missionabandoned':
# Is this paid at this point, or just a fine to pay later ?
# self.state['Credits'] -= entry.get('Fine', 0)
pass
elif event_type in ('PayBounties', 'PayFines', 'PayLegacyFines'):
elif event_type in ('paybounties', 'payfines', 'paylegacyfines'):
self.state['Credits'] -= entry.get('Amount', 0)
elif event_type == 'RedeemVoucher':
elif event_type == 'redeemvoucher':
self.state['Credits'] += entry.get('Amount', 0)
elif event_type in ('RefuelAll', 'RefuelPartial', 'Repair', 'RepairAll', 'RestockVehicle'):
elif event_type in ('refuelall', 'refuelpartial', 'repair', 'repairall', 'restockvehicle'):
self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'SellShipOnRebuy':
elif event_type == 'sellshiponrebuy':
self.state['Credits'] += entry.get('ShipPrice', 0)
elif event_type == 'ShipyardSell':
elif event_type == 'shipyardsell':
self.state['Credits'] += entry.get('ShipPrice', 0)
elif event_type == 'ShipyardTransfer':
elif event_type == 'shipyardtransfer':
self.state['Credits'] -= entry.get('TransferPrice', 0)
elif event_type == 'PowerplayFastTrack':
elif event_type == 'powerplayfasttrack':
self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'PowerplaySalary':
elif event_type == 'powerplaysalary':
self.state['Credits'] += entry.get('Amount', 0)
elif event_type == 'SquadronCreated':
elif event_type == 'squadroncreated':
# v30 docs don't actually say anything about credits cost
pass
elif event_type == 'CarrierBuy':
elif event_type == 'carrierbuy':
self.state['Credits'] -= entry.get('Price', 0)
elif event_type == 'CarrierBankTransfer':
elif event_type == 'carrierbanktransfer':
if (newbal := entry.get('PlayerBalance')):
self.state['Credits'] = newbal
elif event_type == 'CarrierDecommission':
elif event_type == 'carrierdecommission':
# v30 doc says nothing about citing the refund amount
pass
elif event_type == 'NpcCrewPaidWage':
elif event_type == 'npccrewpaidwage':
self.state['Credits'] -= entry.get('Amount', 0)
elif event_type == 'Resurrect':
elif event_type == 'resurrect':
self.state['Credits'] -= entry.get('Cost', 0)
# There should be a `Backpack` event as you 'come to' in the
@ -1569,6 +1577,22 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
logger.debug(f'Invalid journal entry:\n{line!r}\n', exc_info=ex)
return {'event': None}
def populate_version_info(self, entry: MutableMapping[str, str], suppress: bool = False):
"""
Update game version information stored locally.
:param entry: Either a Fileheader or LoadGame event
"""
try:
self.state['GameLanguage'] = entry['language']
self.state['GameVersion'] = entry['gameversion']
self.state['GameBuild'] = entry['build']
self.version = self.state['GameVersion']
self.is_beta = any(v in self.version.lower() for v in ('alpha', 'beta'))
except KeyError:
if not suppress:
raise
def backpack_set_empty(self):
"""Set the BackPack contents to be empty."""
self.state['BackPack']['Component'] = defaultdict(int)
@ -1643,10 +1667,14 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
suit = {
'edmcName': edmc_suitname,
'locName': suitname,
'suitId': entry['SuitID'],
'name': entry['SuitName'],
}
# Overwrite with latest data, just in case, as this can be from CAPI which may or may not have had
# all the data we wanted
suit['suitId'] = entry['SuitID']
suit['name'] = entry['SuitName']
suit['mods'] = entry['SuitMods']
suitloadout_slotid = self.suit_loadout_id_from_loadoutid(entry['LoadoutID'])
# Make the new loadout, in the CAPI format
new_loadout = {
@ -1660,7 +1688,6 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
# Now add in the extra fields for new_suit to be a 'full' Suit structure
suit['id'] = suit.get('id') # Not available in 4.0.0.100 journal event
suit['slots'] = new_loadout['slots'] # 'slots', not 'Modules', to match CAPI
# Ensure the suit is in self.state['Suits']
self.state['Suits'][f"{suitid}"] = suit
@ -2093,6 +2120,8 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
'weaponrackId': loadout_slots[s]['SuitModuleID'],
'locName': loadout_slots[s].get('ModuleName_Localised', loadout_slots[s]['ModuleName']),
'locDescription': '',
'class': loadout_slots[s]['Class'],
'mods': loadout_slots[s]['WeaponMods'],
}
return slots

View File

@ -48,7 +48,11 @@ def plugin_start3(path: str) -> str:
normal_textvar.set(value=normal_url)
beta_textvar.set(value=beta_url)
override_textvar.set(
value={'auto': _('Auto'), 'normal': _('Normal'), 'beta': _('Beta')}.get(override_mode, _('Auto'))
value={
'auto': _('Auto'), # LANG: 'Auto' label for Coriolis site override selection
'normal': _('Normal'), # LANG: 'Normal' label for Coriolis site override selection
'beta': _('Beta') # LANG: 'Beta' label for Coriolis site override selection
}.get(override_mode, _('Auto')) # LANG: 'Auto' label for Coriolis site override selection
)
return 'Coriolis'
@ -61,31 +65,40 @@ def plugin_prefs(parent: tk.Widget, cmdr: str, is_beta: bool) -> tk.Frame:
conf_frame = nb.Frame(parent)
conf_frame.columnconfigure(index=1, weight=1)
cur_row = 0
# LANG: Settings>Coriolis: Help/hint for changing coriolis URLs
nb.Label(conf_frame, text=_(
"Set the URL to use with coriolis.io ship loadouts. Note that this MUST end with '/import?data='"
)).grid(sticky=tk.EW, row=cur_row, column=0, columnspan=3)
cur_row += 1
# LANG: Settings>Coriolis: Label for 'NOT alpha/beta game version' URL
nb.Label(conf_frame, text=_('Normal URL')).grid(sticky=tk.W, row=cur_row, column=0, padx=PADX)
nb.Entry(conf_frame, textvariable=normal_textvar).grid(sticky=tk.EW, row=cur_row, column=1, padx=PADX)
# LANG: Generic 'Reset' button label
nb.Button(conf_frame, text=_("Reset"), command=lambda: normal_textvar.set(value=DEFAULT_NORMAL_URL)).grid(
sticky=tk.W, row=cur_row, column=2, padx=PADX
)
cur_row += 1
# LANG: Settings>Coriolis: Label for 'alpha/beta game version' URL
nb.Label(conf_frame, text=_('Beta URL')).grid(sticky=tk.W, row=cur_row, column=0, padx=PADX)
nb.Entry(conf_frame, textvariable=beta_textvar).grid(sticky=tk.EW, row=cur_row, column=1, padx=PADX)
# LANG: Generic 'Reset' button label
nb.Button(conf_frame, text=_('Reset'), command=lambda: beta_textvar.set(value=DEFAULT_BETA_URL)).grid(
sticky=tk.W, row=cur_row, column=2, padx=PADX
)
cur_row += 1
# TODO: This needs a help/hint text to be sure users know what it's for.
# LANG: Settings>Coriolis: Label for selection of using Normal, Beta or 'auto' Coriolis URL
nb.Label(conf_frame, text=_('Override Beta/Normal Selection')).grid(sticky=tk.W, row=cur_row, column=0, padx=PADX)
nb.OptionMenu(
conf_frame,
override_textvar,
override_textvar.get(),
_('Normal'), _('Beta'), _('Auto')
_('Normal'), # LANG: 'Normal' label for Coriolis site override selection
_('Beta'), # LANG: 'Beta' label for Coriolis site override selection
_('Auto') # LANG: 'Auto' label for Coriolis site override selection
).grid(sticky=tk.W, row=cur_row, column=1, padx=PADX)
cur_row += 1
@ -107,7 +120,7 @@ def prefs_changed(cmdr: str, is_beta: bool) -> None:
if override_mode not in ('beta', 'normal', 'auto'):
logger.warning(f'Unexpected value {override_mode=!r}. defaulting to "auto"')
override_mode = 'auto'
override_textvar.set(value=_('Auto'))
override_textvar.set(value=_('Auto')) # LANG: 'Auto' label for Coriolis site override selection
config.set('coriolis_normal_url', normal_url)
config.set('coriolis_beta_url', beta_url)
@ -117,6 +130,7 @@ def prefs_changed(cmdr: str, is_beta: bool) -> None:
def _get_target_url(is_beta: bool) -> str:
global override_mode
if override_mode not in ('auto', 'normal', 'beta'):
# LANG: Settings>Coriolis - invalid override mode found
show_error(_('Invalid Coriolis override mode!'))
logger.warning(f'Unexpected override mode {override_mode!r}! defaulting to auto!')
override_mode = 'auto'

View File

@ -96,6 +96,7 @@ 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}')
# LANG: Journal Processing disabled due to an active killswitch
plug.show_error(_('EDDB Journal processing disabled. See Log.'))
return

View File

@ -16,11 +16,12 @@ from typing import TextIO, Tuple
import requests
import edmc_data
import killswitch
import myNotebook as nb # noqa: N813
import plug
from companion import CAPIData, category_map
from config import applongname, appversion_nobuild, config
from config import applongname, appversion_nobuild, config, debug_senders
from EDMCLogging import get_main_logger
from monitor import monitor
from myNotebook import Frame
@ -86,10 +87,15 @@ HORIZ_SKU = 'ELITE_HORIZONS_V_PLANETARY_LANDINGS'
class EDDN:
"""EDDN Data export."""
# SERVER = 'http://localhost:8081' # testing
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'
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
@ -212,7 +218,7 @@ Msg:\n{msg}'''
status['text'] = ''
return
localized: str = _('Sending data to EDDN...')
localized: str = _('Sending data to EDDN...') # LANG: Status text shown while attempting to send data
if len(self.replaylog) == 1:
status['text'] = localized
@ -260,6 +266,7 @@ Msg:\n{msg}'''
except requests.exceptions.RequestException as e:
logger.debug('Failed sending', exc_info=e)
# LANG: Error while trying to send data to EDDN
status['text'] = _("Error: Can't connect to EDDN")
return # stop sending
@ -277,15 +284,18 @@ Msg:\n{msg}'''
if status_code == 429: # HTTP UPGRADE REQUIRED
logger.warning('EDMC is sending schemas that are too old')
# LANG: EDDN has banned this version of our client
return _('EDDN Error: EDMC is too old for EDDN. Please update.')
elif status_code == 400:
# we a validation check or something else.
logger.warning(f'EDDN Error: {status_code} -- {exception.response}')
# LANG: EDDN returned an error that indicates something about what we sent it was wrong
return _('EDDN Error: Validation Failed (EDMC Too Old?). See Log')
else:
logger.warning(f'Unknown status code from EDDN: {status_code} -- {exception.response}')
# 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
@ -611,7 +621,8 @@ Msg:\n{msg}'''
else:
# Can't access replay file! Send immediately.
self.parent.children['status']['text'] = _('Sending data to EDDN...') # LANG: Data is being sent to EDDN
# LANG: Status text shown while attempting to send data
self.parent.children['status']['text'] = _('Sending data to EDDN...')
self.parent.update_idletasks()
self.send(cmdr, msg)
self.parent.children['status']['text'] = ''
@ -690,6 +701,7 @@ def plugin_prefs(parent, cmdr: str, is_beta: bool) -> Frame:
this.eddn_station = tk.IntVar(value=(output & config.OUT_MKT_EDDN) and 1)
this.eddn_station_button = nb.Checkbutton(
eddnframe,
# LANG: Enable EDDN support for station data checkbox label
text=_('Send station data to the Elite Dangerous Data Network'),
variable=this.eddn_station,
command=prefsvarchanged
@ -700,6 +712,7 @@ def plugin_prefs(parent, cmdr: str, is_beta: bool) -> Frame:
# Output setting new in E:D 2.2
this.eddn_system_button = nb.Checkbutton(
eddnframe,
# LANG: Enable EDDN support for system and other scan data checkbox label
text=_('Send system and scan data to the Elite Dangerous Data Network'),
variable=this.eddn_system,
command=prefsvarchanged
@ -710,6 +723,7 @@ def plugin_prefs(parent, cmdr: str, is_beta: bool) -> Frame:
# Output setting under 'Send system and scan data to the Elite Dangerous Data Network' new in E:D 2.2
this.eddn_delay_button = nb.Checkbutton(
eddnframe,
# LANG: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this
text=_('Delay sending until docked'),
variable=this.eddn_delay
)
@ -774,7 +788,7 @@ def journal_entry( # noqa: C901, CCR001
"""
if (ks := killswitch.get_disabled("plugins.eddn.journal")).disabled:
logger.warning(f'EDDN journal handler has been disabled via killswitch: {ks.reason}')
plug.show_error(_('EDDN journal handler disabled. See Log.'))
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:
@ -896,7 +910,7 @@ def journal_entry( # noqa: C901, CCR001
except requests.exceptions.RequestException as e:
logger.debug('Failed in export_journal_entry', exc_info=e)
return _("Error: Can't connect to EDDN")
return _("Error: Can't connect to EDDN") # LANG: Error while trying to send data to EDDN
except Exception as e:
logger.debug('Failed in export_journal_entry', exc_info=e)
@ -931,7 +945,7 @@ def journal_entry( # noqa: C901, CCR001
except requests.exceptions.RequestException as e:
logger.debug(f'Failed exporting {entry["event"]}', exc_info=e)
return _("Error: Can't connect to EDDN")
return _("Error: Can't connect to EDDN") # LANG: Error while trying to send data to EDDN
except Exception as e:
logger.debug(f'Failed exporting {entry["event"]}', exc_info=e)
@ -958,7 +972,7 @@ def cmdr_data(data: CAPIData, is_beta: bool) -> Optional[str]: # noqa: CCR001
status = this.parent.children['status']
old_status = status['text']
if not old_status:
status['text'] = _('Sending data to EDDN...')
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)
@ -970,7 +984,7 @@ def cmdr_data(data: CAPIData, is_beta: bool) -> Optional[str]: # noqa: CCR001
except requests.RequestException as e:
logger.debug('Failed exporting data', exc_info=e)
return _("Error: Can't connect to EDDN")
return _("Error: Can't connect to EDDN") # LANG: Error while trying to send data to EDDN
except Exception as e:
logger.debug('Failed exporting data', exc_info=e)

View File

@ -22,7 +22,8 @@ import killswitch
import myNotebook as nb # noqa: N813
import plug
from companion import CAPIData
from config import applongname, appversion, config
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
@ -194,6 +195,7 @@ def plugin_prefs(parent: tk.Tk, cmdr: str, is_beta: bool) -> tk.Frame:
this.log = tk.IntVar(value=config.get_int('edsm_out') and 1)
this.log_button = nb.Checkbutton(
# LANG: Settings>EDSM - Label on checkbox for 'send data'
frame, text=_('Send flight log and Cmdr status to EDSM'), variable=this.log, command=prefsvarchanged
)
@ -203,6 +205,7 @@ def plugin_prefs(parent: tk.Tk, cmdr: str, is_beta: bool) -> tk.Frame:
# Section heading in settings
this.label = HyperlinkLabel(
frame,
# LANG: Settings>EDSM - Label on header/URL to EDSM API key page
text=_('Elite Dangerous Star Map credentials'),
background=nb.Label().cget('background'),
url='https://www.edsm.net/settings/api',
@ -352,6 +355,7 @@ def journal_entry(
"""Journal Entry hook."""
if (ks := killswitch.get_disabled('plugins.edsm.journal')).disabled:
logger.warning(f'EDSM Journal handler disabled via killswitch: {ks.reason}')
# LANG: EDSM plugin - Journal handling disabled by killswitch
plug.show_error(_('EDSM Handler disabled. See Log.'))
return
@ -525,8 +529,14 @@ def cmdr_data(data: CAPIData, is_beta: bool) -> None:
this.system_link.update_idletasks()
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'
# Worker thread
def worker() -> None:
def worker() -> None: # noqa: CCR001 C901 # Cant be broken up currently
"""
Handle uploading events to EDSM API.
@ -620,9 +630,10 @@ def worker() -> None:
# logger.trace(f'Overall POST data (elided) is:\n{data_elided}')
r = this.session.post('https://www.edsm.net/api-journal-v1', data=data, timeout=_TIMEOUT)
r = this.session.post(TARGET_URL, data=data, timeout=_TIMEOUT)
# logger.trace(f'API response content: {r.content}')
r.raise_for_status()
reply = r.json()
msg_num = reply['msgnum']
msg = reply['msg']
@ -633,6 +644,7 @@ def worker() -> None:
if msg_num // 100 == 2:
logger.warning(f'EDSM\t{msg_num} {msg}\t{json.dumps(pending, separators=(",", ": "))}')
# LANG: EDSM Plugin - Error message from EDSM API
plug.show_error(_('Error: EDSM {MSG}').format(MSG=msg))
else:
@ -669,6 +681,7 @@ def worker() -> None:
retrying += 1
else:
# LANG: EDSM Plugin - Error connecting to EDSM API
plug.show_error(_("Error: Can't connect to EDSM"))
if closing:
@ -731,10 +744,12 @@ def edsm_notify_system(reply: Mapping[str, Any]) -> None:
"""Update the image next to the system link."""
if not reply:
this.system_link['image'] = this._IMG_ERROR
# LANG: EDSM Plugin - Error connecting to EDSM API
plug.show_error(_("Error: Can't connect to EDSM"))
elif reply['msgnum'] // 100 not in (1, 4):
this.system_link['image'] = this._IMG_ERROR
# LANG: EDSM Plugin - Error message from EDSM API
plug.show_error(_('Error: EDSM {MSG}').format(MSG=reply['msg']))
elif reply.get('systemCreated'):

View File

@ -13,12 +13,13 @@ from typing import Sequence, Union, cast
import requests
import edmc_data
import killswitch
import myNotebook as nb # noqa: N813
import plug
import timeout_session
from companion import CAPIData
from config import applongname, appversion, config
from config import applongname, appversion, config, debug_senders
from EDMCLogging import get_main_logger
from ttkHyperlinkLabel import HyperlinkLabel
@ -126,6 +127,9 @@ STATION_UNDOCKED: str = '×' # "Station" name to display when not docked = U+00
TARGET_URL = 'https://inara.cz/inapi/v1/'
DEBUG = 'inara' in debug_senders
if DEBUG:
TARGET_URL = f'http://{edmc_data.DEBUG_WEBSERVER_HOST}:{edmc_data.DEBUG_WEBSERVER_PORT}/inara'
def system_url(system_name: str) -> str:
@ -212,7 +216,10 @@ def plugin_prefs(parent: tk.Tk, cmdr: str, is_beta: bool) -> tk.Frame:
this.log = tk.IntVar(value=config.get_int('inara_out') and 1)
this.log_button = nb.Checkbutton(
frame, text=_('Send flight log and Cmdr status to Inara'), variable=this.log, command=prefsvarchanged
frame,
text=_('Send flight log and Cmdr status to Inara'), # LANG: Checkbox to enable INARA API Usage
variable=this.log,
command=prefsvarchanged
)
this.log_button.grid(columnspan=2, padx=x_button_padding, pady=(5, 0), sticky=tk.W)
@ -222,7 +229,7 @@ def plugin_prefs(parent: tk.Tk, cmdr: str, is_beta: bool) -> tk.Frame:
# Section heading in settings
this.label = HyperlinkLabel(
frame,
text=_('Inara credentials'),
text=_('Inara credentials'), # LANG: Text for INARA API keys link ( goes to https://inara.cz/settings-api )
background=nb.Label().cget('background'),
url='https://inara.cz/settings-api',
underline=True
@ -329,11 +336,13 @@ def journal_entry( # noqa: C901, CCR001
"""
if (ks := killswitch.get_disabled('plugins.inara.journal')).disabled:
logger.warning(f'Inara support has been disabled via killswitch: {ks.reason}')
plug.show_error(_('Inara disabled. See Log.'))
plug.show_error(_('Inara disabled. See Log.')) # LANG: INARA support disabled via killswitch
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}')
# this can and WILL break state, but if we're concerned about it sending bad data, we'd disable globally anyway
return ''
this.on_foot = state['OnFoot']
event_name: str = entry['event']
@ -1542,6 +1551,7 @@ def send_data(url: str, data: Mapping[str, Any]) -> bool: # noqa: CCR001
# Log fatal errors
logger.warning(f'Inara\t{status} {reply["header"].get("eventStatusText", "")}')
logger.debug(f'JSON data:\n{json.dumps(data, indent=2, separators = (",", ": "))}')
# LANG: INARA API returned some kind of error (error message will be contained in {MSG})
plug.show_error(_('Error: Inara {MSG}').format(MSG=reply['header'].get('eventStatusText', status)))
else:
@ -1554,6 +1564,7 @@ def send_data(url: str, data: Mapping[str, Any]) -> bool: # noqa: CCR001
logger.debug(f'JSON data:\n{json.dumps(data_event)}')
if reply_event['eventStatus'] // 100 != 2:
# LANG: INARA API returned some kind of error (error message will be contained in {MSG})
plug.show_error(_('Error: Inara {MSG}').format(
MSG=f'{data_event["eventName"]},'
f'{reply_event.get("eventStatusText", reply_event["eventStatus"])}'

View File

@ -245,7 +245,13 @@ class PreferencesDialog(tk.Toplevel):
self.parent = parent
self.callback = callback
self.title(_('Preferences') if platform == 'darwin' else _('Settings'))
if platform == 'darwin':
# LANG: File > Preferences menu entry for macOS
self.title(_('Preferences'))
else:
# LANG: File > Settings (macOS)
self.title(_('Settings'))
if parent.winfo_viewable():
self.transient(parent)
@ -336,13 +342,14 @@ class PreferencesDialog(tk.Toplevel):
row = AutoInc(start=1)
# LANG: Settings > Output - choosing what data to save to files
self.out_label = nb.Label(output_frame, text=_('Please choose what data to save'))
self.out_label.grid(columnspan=2, padx=self.PADX, sticky=tk.W, row=row.get())
self.out_csv = tk.IntVar(value=1 if (output & config.OUT_MKT_CSV) else 0)
self.out_csv_button = nb.Checkbutton(
output_frame,
text=_('Market data in CSV format file'),
text=_('Market data in CSV format file'), # LANG: Settings > Output option
variable=self.out_csv,
command=self.outvarchanged
)
@ -351,7 +358,7 @@ class PreferencesDialog(tk.Toplevel):
self.out_td = tk.IntVar(value=1 if (output & config.OUT_MKT_TD) else 0)
self.out_td_button = nb.Checkbutton(
output_frame,
text=_('Market data in Trade Dangerous format file'),
text=_('Market data in Trade Dangerous format file'), # LANG: Settings > Output option
variable=self.out_td,
command=self.outvarchanged
)
@ -361,7 +368,7 @@ class PreferencesDialog(tk.Toplevel):
# Output setting
self.out_ship_button = nb.Checkbutton(
output_frame,
text=_('Ship loadout'),
text=_('Ship loadout'), # LANG: Settings > Output option
variable=self.out_ship,
command=self.outvarchanged
)
@ -371,7 +378,7 @@ class PreferencesDialog(tk.Toplevel):
# Output setting
self.out_auto_button = nb.Checkbutton(
output_frame,
text=_('Automatically update on docking'),
text=_('Automatically update on docking'), # LANG: Settings > Output option
variable=self.out_auto,
command=self.outvarchanged
)
@ -379,7 +386,7 @@ class PreferencesDialog(tk.Toplevel):
self.outdir = tk.StringVar()
self.outdir.set(str(config.get_str('outdir')))
# LANG: Label for "where files are located"
# LANG: Settings > Output - Label for "where files are located"
self.outdir_label = nb.Label(output_frame, text=_('File location')+':') # Section heading in settings
# Type ignored due to incorrect type annotation. a 2 tuple does padding for each side
self.outdir_label.grid(padx=self.PADX, pady=(5, 0), sticky=tk.W, row=row.get()) # type: ignore
@ -387,16 +394,25 @@ class PreferencesDialog(tk.Toplevel):
self.outdir_entry = nb.Entry(output_frame, takefocus=False)
self.outdir_entry.grid(columnspan=2, padx=self.PADX, pady=(0, self.PADY), sticky=tk.EW, row=row.get())
if platform == 'darwin':
text = (_('Change...')) # LANG: macOS Preferences - files location selection button
else:
text = (_('Browse...')) # LANG: NOT-macOS Settings - files location selection button
self.outbutton = nb.Button(
output_frame,
text=(_('Change...') if platform == 'darwin' else _('Browse...')),
text=text,
# Technically this is different from the label in Settings > Output, as *this* is used
# as the title of the popup folder selection window.
# LANG: Settings > Output - Label for "where files are located"
command=lambda: self.filebrowse(_('File location'), self.outdir)
)
self.outbutton.grid(column=1, padx=self.PADX, pady=self.PADY, sticky=tk.NSEW, row=row.get())
nb.Frame(output_frame).grid(row=row.get()) # bottom spacer # TODO: does nothing?
# LANG: Label for 'Output' Settings tab
# LANG: Label for 'Output' Settings/Preferences tab
root_notebook.add(output_frame, text=_('Output')) # Tab heading in settings
def __setup_plugin_tabs(self, notebook: Notebook) -> None:
@ -419,17 +435,25 @@ class PreferencesDialog(tk.Toplevel):
self.logdir.set(logdir)
self.logdir_entry = nb.Entry(config_frame, takefocus=False)
# Location of the new Journal file in E:D 2.2
# Location of the Journal files
nb.Label(
config_frame,
# LANG: Settings > Configuration - Label for Journal files location
text=_('E:D journal file location')+':'
).grid(columnspan=4, padx=self.PADX, sticky=tk.W, row=row.get())
self.logdir_entry.grid(columnspan=4, padx=self.PADX, pady=(0, self.PADY), sticky=tk.EW, row=row.get())
if platform == 'darwin':
text = (_('Change...')) # LANG: macOS Preferences - files location selection button
else:
text = (_('Browse...')) # LANG: NOT-macOS Setting - files location selection button
self.logbutton = nb.Button(
config_frame,
text=(_('Change...') if platform == 'darwin' else _('Browse...')),
text=text,
# LANG: Settings > Configuration - Label for Journal files location
command=lambda: self.filebrowse(_('E:D journal file location'), self.logdir)
)
self.logbutton.grid(column=3, padx=self.PADX, pady=self.PADY, sticky=tk.EW, row=row.get())
@ -438,6 +462,7 @@ class PreferencesDialog(tk.Toplevel):
# Appearance theme and language setting
nb.Button(
config_frame,
# LANG: Settings > Configuration - Label on 'reset journal files location to default' button
text=_('Default'),
command=self.logdir_reset,
state=tk.NORMAL if config.get_str('journaldir') else tk.DISABLED
@ -464,6 +489,7 @@ class PreferencesDialog(tk.Toplevel):
# Shortcut settings prompt on OSX
nb.Label(
config_frame,
# LANG: macOS Preferences > Configuration - restart the app message
text=_('Re-start {APP} to use shortcuts').format(APP=applongname),
foreground='firebrick'
).grid(padx=self.PADX, sticky=tk.W, row=row.get())
@ -472,6 +498,7 @@ class PreferencesDialog(tk.Toplevel):
# Shortcut settings prompt on OSX
nb.Label(
config_frame,
# LANG: macOS - Configuration - need to grant the app permission for keyboard shortcuts
text=_('{APP} needs permission to use shortcuts').format(APP=applongname),
foreground='firebrick'
).grid(columnspan=4, padx=self.PADX, sticky=tk.W, row=row.get())
@ -498,6 +525,7 @@ class PreferencesDialog(tk.Toplevel):
# Hotkey/Shortcut setting
self.hotkey_only_btn = nb.Checkbutton(
config_frame,
# LANG: Configuration - Act on hotkey only when ED is in foreground
text=_('Only when Elite: Dangerous is the active app'),
variable=self.hotkey_only,
state=tk.NORMAL if self.hotkey_code else tk.DISABLED
@ -508,6 +536,7 @@ class PreferencesDialog(tk.Toplevel):
# Hotkey/Shortcut setting
self.hotkey_play_btn = nb.Checkbutton(
config_frame,
# LANG: Configuration - play sound when hotkey used
text=_('Play sound'),
variable=self.hotkey_play,
state=tk.NORMAL if self.hotkey_code else tk.DISABLED
@ -522,6 +551,7 @@ class PreferencesDialog(tk.Toplevel):
self.disable_autoappupdatecheckingame = tk.IntVar(value=config.get_int('disable_autoappupdatecheckingame'))
self.disable_autoappupdatecheckingame_btn = nb.Checkbutton(
config_frame,
# LANG: Configuration - disable checks for app updates when in-game
text=_('Disable Automatic Application Updates Check when in-game'),
variable=self.disable_autoappupdatecheckingame,
command=self.disable_autoappupdatecheckingame_changed
@ -571,6 +601,7 @@ class PreferencesDialog(tk.Toplevel):
value=str(system_provider if system_provider in plug.provides('system_url') else 'EDSM')
)
# LANG: Configuration - Label for selection of 'System' provider website
nb.Label(config_frame, text=_('System')).grid(padx=self.PADX, pady=2*self.PADY, sticky=tk.W, row=cur_row)
self.system_button = nb.OptionMenu(
config_frame,
@ -588,6 +619,7 @@ class PreferencesDialog(tk.Toplevel):
value=str(station_provider if station_provider in plug.provides('station_url') else 'eddb')
)
# LANG: Configuration - Label for selection of 'Station' provider website
nb.Label(config_frame, text=_('Station')).grid(padx=self.PADX, pady=2*self.PADY, sticky=tk.W, row=cur_row)
self.station_button = nb.OptionMenu(
config_frame,
@ -608,6 +640,7 @@ class PreferencesDialog(tk.Toplevel):
# Set the current loglevel
nb.Label(
config_frame,
# LANG: Configuration - Label for selection of Log Level
text=_('Log Level')
).grid(padx=self.PADX, pady=2*self.PADY, sticky=tk.W, row=cur_row)
@ -659,6 +692,7 @@ class PreferencesDialog(tk.Toplevel):
appearance_frame = nb.Frame(notebook)
appearance_frame.columnconfigure(2, weight=1)
with row as cur_row:
# LANG: Appearance - Label for selection of application display language
nb.Label(appearance_frame, text=_('Language')).grid(padx=self.PADX, sticky=tk.W, row=cur_row)
self.lang_button = nb.OptionMenu(appearance_frame, self.lang, self.lang.get(), *self.languages.values())
self.lang_button.grid(column=1, columnspan=2, padx=self.PADX, sticky=tk.W, row=cur_row)
@ -700,6 +734,7 @@ class PreferencesDialog(tk.Toplevel):
# Main window
self.theme_button_0 = nb.ColoredButton(
appearance_frame,
# LANG: Appearance - Example 'Normal' text
text=_('Station'),
background='grey4',
command=lambda: self.themecolorbrowse(0)
@ -731,6 +766,7 @@ class PreferencesDialog(tk.Toplevel):
columnspan=4, padx=self.PADX, pady=self.PADY*4, sticky=tk.EW, row=row.get()
)
with row as cur_row:
# LANG: Appearance - Label for selection of UI scaling
nb.Label(appearance_frame, text=_('UI Scale Percentage')).grid(
padx=self.PADX, pady=2*self.PADY, sticky=tk.W, row=cur_row
)
@ -751,6 +787,7 @@ class PreferencesDialog(tk.Toplevel):
self.uiscale_bar.grid(column=1, sticky=tk.W, row=cur_row)
self.ui_scaling_defaultis = nb.Label(
appearance_frame,
# LANG: Appearance - Help/hint text for UI scaling selection
text=_('100 means Default{CR}Restart Required for{CR}changes to take effect!')
).grid(column=3, padx=self.PADX, pady=2*self.PADY, sticky=tk.E, row=cur_row)
@ -760,6 +797,7 @@ class PreferencesDialog(tk.Toplevel):
)
with row as cur_row:
# LANG: Appearance - Label for selection of main window transparency
nb.Label(appearance_frame, text=_("Main window transparency")).grid(
padx=self.PADX, pady=self.PADY*2, sticky=tk.W, row=cur_row
)
@ -779,6 +817,7 @@ class PreferencesDialog(tk.Toplevel):
nb.Label(
appearance_frame,
# LANG: Appearance - Help/hint text for Main window transparency selection
text=_(
"100 means fully opaque.{CR}"
"Window is updated in real time"
@ -800,6 +839,7 @@ class PreferencesDialog(tk.Toplevel):
self.ontop_button = nb.Checkbutton(
appearance_frame,
# LANG: Appearance - Label for checkbox to select if application always on top
text=_('Always on top'),
variable=self.always_ontop,
command=self.themevarchanged
@ -877,6 +917,7 @@ class PreferencesDialog(tk.Toplevel):
ttk.Separator(plugins_frame, orient=tk.HORIZONTAL).grid(
columnspan=3, padx=self.PADX, pady=self.PADY * 8, sticky=tk.EW, row=row.get()
)
# LANG: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x
nb.Label(plugins_frame, text=_('Plugins Without Python 3.x Support:')+':').grid(padx=self.PADX, sticky=tk.W)
for plugin in plug.PLUGINS_not_py3:
@ -884,9 +925,10 @@ class PreferencesDialog(tk.Toplevel):
nb.Label(plugins_frame, text=plugin.name).grid(columnspan=2, padx=self.PADX*2, sticky=tk.W)
HyperlinkLabel(
# LANG: Plugins - Label on URL to documentation about migrating plugins from Python 2.7
plugins_frame, text=_('Information on migrating plugins'),
background=nb.Label().cget('background'),
url='https://github.com/EDCD/EDMarketConnector/blob/main/PLUGINS.md#migration-to-python-37',
url='https://github.com/EDCD/EDMarketConnector/blob/main/PLUGINS.md#migration-from-python-27',
underline=True
).grid(columnspan=2, padx=self.PADX, sticky=tk.W)
############################################################

View File

@ -50,7 +50,7 @@ class GenericProtocolHandler:
logger.trace(f'Payload: {self.lastpayload}')
if not config.shutting_down:
logger.debug('event_generate("<<CompanionAuthEvent>>"')
logger.debug('event_generate("<<CompanionAuthEvent>>")')
self.master.event_generate('<<CompanionAuthEvent>>', when="tail")

View File

@ -8,17 +8,17 @@ flake8-annotations-coverage==0.0.5
flake8-cognitive-complexity==0.1.0
flake8-comprehensions==3.5.0
flake8-docstrings==1.6.0
isort==5.8.0
isort==5.9.2
flake8-isort==4.0.0
flake8-json==21.1.0
flake8-json==21.7.0
flake8-noqa==1.1.0
flake8-polyfill==1.0.2
flake8-use-fstring==1.1
mypy==0.901
pep8-naming==0.11.1
mypy==0.910
pep8-naming==0.12.0
safety==1.10.3
types-requests==0.1.9
types-requests==2.25.0
# Code formatting tools
autopep8==1.5.7

View File

@ -1,6 +1,6 @@
certifi==2021.5.30
requests==2.25.1
watchdog==2.1.2
requests==2.26.0
watchdog==2.1.3
# Commented out because this doesn't package well with py2exe
# infi.systray==0.1.12; sys_platform == 'win32'
# argh==0.26.2 watchdog dep

View File

@ -49,10 +49,20 @@ def find_calls_in_stmt(statement: ast.AST) -> list[ast.Call]:
return out
COMMENT_RE = re.compile(r'^.*?(#.*)$')
"""
Regular expressions for finding comments.
COMMENT_SAME_LINE_RE is for an in-line comment on the end of code.
COMMENT_OWN_LINE_RE is for a comment on its own line.
The difference is necessary in order to tell if a 'above' LANG comment is for
its own line (SAME_LINE), or meant to be for this following line (OWN_LINE).
"""
COMMENT_SAME_LINE_RE = re.compile(r'^.*?(#.*)$')
COMMENT_OWN_LINE_RE = re.compile(r'^\s*?(#.*)$')
def extract_comments(call: ast.Call, lines: list[str], file: pathlib.Path) -> Optional[str]:
def extract_comments(call: ast.Call, lines: list[str], file: pathlib.Path) -> Optional[str]: # noqa: CCR001
"""
Extract comments from source code based on the given call.
@ -69,32 +79,44 @@ def extract_comments(call: ast.Call, lines: list[str], file: pathlib.Path) -> Op
current = call.lineno - 1
above_line = lines[above].strip() if len(lines) >= above else None
above_comment: Optional[str] = None
current_line = lines[current].strip()
current_comment: Optional[str] = None
bad_comment: Optional[str] = None
for line in (above_line, current_line):
if line is None or '#' not in line:
continue
if above_line is not None:
match = COMMENT_OWN_LINE_RE.match(above_line)
if match:
above_comment = match.group(1).strip()
if not above_comment.startswith('# LANG:'):
bad_comment = f'Unknown comment for {file}:{call.lineno} {above_line}'
above_comment = None
match = COMMENT_RE.match(line)
if not match:
print(line)
continue
else:
above_comment = above_comment.replace('# LANG:', '').strip()
comment = match.group(1).strip()
if not comment.startswith('# LANG:'):
bad_comment = f'Unknown comment for {file}:{current} {line}'
continue
if current_line is not None:
match = COMMENT_SAME_LINE_RE.match(current_line)
if match:
current_comment = match.group(1).strip()
if not current_comment.startswith('# LANG:'):
bad_comment = f'Unknown comment for {file}:{call.lineno} {current_line}'
current_comment = None
out = comment.replace('# LANG:', '').strip()
bad_comment = None
break
else:
current_comment = current_comment.replace('# LANG:', '').strip()
if bad_comment is not None:
if current_comment is not None:
out = current_comment
elif above_comment is not None:
out = above_comment
elif bad_comment is not None:
print(bad_comment, file=sys.stderr)
if out is None:
print(f'No comment for {file}:{current} {line}', file=sys.stderr)
print(f'No comment for {file}:{call.lineno} {current_line}', file=sys.stderr)
return out

View File

@ -35,7 +35,7 @@ if platform == 'win32':
GetWindowRect.argtypes = [HWND, ctypes.POINTER(RECT)]
except Exception: # Not supported under Wine 4.0
CalculatePopupWindowPosition = None
CalculatePopupWindowPosition = None # type: ignore
def status(data: Dict[str, Any]) -> List[List[str]]:
@ -275,6 +275,7 @@ class StatsDialog():
if not monitor.cmdr:
return
# LANG: Fetching data from Frontier CAPI in order to display on File > Status
self.status['text'] = _('Fetching data...')
self.parent.update_idletasks()