mirror of
https://github.com/derrod/legendary.git
synced 2024-12-22 01:45:28 +00:00
[cli/core/api] Allow setting locale/language
Fixes #35 as far as I can tell
This commit is contained in:
parent
812590db7c
commit
39f0d4c831
|
@ -302,6 +302,8 @@ log_level = debug
|
||||||
max_memory = 1024
|
max_memory = 1024
|
||||||
; default install directory
|
; default install directory
|
||||||
install_dir = /mnt/tank/games
|
install_dir = /mnt/tank/games
|
||||||
|
; locale override, must be in RFC 1766 format (e.g. "en-US")
|
||||||
|
locale = en-US
|
||||||
|
|
||||||
; default settings to use (currently limited to WINE executable)
|
; default settings to use (currently limited to WINE executable)
|
||||||
[default]
|
[default]
|
||||||
|
@ -321,6 +323,8 @@ skip_update_check = true
|
||||||
; start parameters to use (in addition to the required ones)
|
; start parameters to use (in addition to the required ones)
|
||||||
start_params = -windowed
|
start_params = -windowed
|
||||||
wine_executable = /path/to/proton/wine64
|
wine_executable = /path/to/proton/wine64
|
||||||
|
; override language with two-letter language code
|
||||||
|
language = fr
|
||||||
|
|
||||||
[AppName.env]
|
[AppName.env]
|
||||||
; environment variables to set for this game (mostly useful on linux)
|
; environment variables to set for this game (mostly useful on linux)
|
||||||
|
|
|
@ -22,7 +22,7 @@ class EPCAPI:
|
||||||
_ecommerce_host = 'ecommerceintegration-public-service-ecomprod02.ol.epicgames.com'
|
_ecommerce_host = 'ecommerceintegration-public-service-ecomprod02.ol.epicgames.com'
|
||||||
_datastorage_host = 'datastorage-public-service-liveegs.live.use1a.on.epicgames.com'
|
_datastorage_host = 'datastorage-public-service-liveegs.live.use1a.on.epicgames.com'
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, lc='en', cc='US'):
|
||||||
self.session = requests.session()
|
self.session = requests.session()
|
||||||
self.log = logging.getLogger('EPCAPI')
|
self.log = logging.getLogger('EPCAPI')
|
||||||
self.unauth_session = requests.session()
|
self.unauth_session = requests.session()
|
||||||
|
@ -33,6 +33,9 @@ class EPCAPI:
|
||||||
self.access_token = None
|
self.access_token = None
|
||||||
self.user = None
|
self.user = None
|
||||||
|
|
||||||
|
self.language_code = lc
|
||||||
|
self.country_code = cc
|
||||||
|
|
||||||
def resume_session(self, session):
|
def resume_session(self, session):
|
||||||
self.session.headers['Authorization'] = f'bearer {session["access_token"]}'
|
self.session.headers['Authorization'] = f'bearer {session["access_token"]}'
|
||||||
r = self.session.get(f'https://{self._oauth_host}/account/api/oauth/verify')
|
r = self.session.get(f'https://{self._oauth_host}/account/api/oauth/verify')
|
||||||
|
@ -115,7 +118,7 @@ class EPCAPI:
|
||||||
def get_game_info(self, namespace, catalog_item_id):
|
def get_game_info(self, namespace, catalog_item_id):
|
||||||
r = self.session.get(f'https://{self._catalog_host}/catalog/api/shared/namespace/{namespace}/bulk/items',
|
r = self.session.get(f'https://{self._catalog_host}/catalog/api/shared/namespace/{namespace}/bulk/items',
|
||||||
params=dict(id=catalog_item_id, includeDLCDetails=True, includeMainGameDetails=True,
|
params=dict(id=catalog_item_id, includeDLCDetails=True, includeMainGameDetails=True,
|
||||||
country='US', locale='en'))
|
country=self.country_code, locale=self.language_code))
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
return r.json().get(catalog_item_id, None)
|
return r.json().get(catalog_item_id, None)
|
||||||
|
|
||||||
|
|
|
@ -370,7 +370,8 @@ class LegendaryCLI:
|
||||||
|
|
||||||
params, cwd, env = self.core.get_launch_parameters(app_name=app_name, offline=args.offline,
|
params, cwd, env = self.core.get_launch_parameters(app_name=app_name, offline=args.offline,
|
||||||
extra_args=extra, user=args.user_name_override,
|
extra_args=extra, user=args.user_name_override,
|
||||||
wine_bin=args.wine_bin, wine_pfx=args.wine_pfx)
|
wine_bin=args.wine_bin, wine_pfx=args.wine_pfx,
|
||||||
|
language=args.language)
|
||||||
|
|
||||||
logger.info(f'Launching {app_name}...')
|
logger.info(f'Launching {app_name}...')
|
||||||
if args.dry_run:
|
if args.dry_run:
|
||||||
|
@ -679,6 +680,8 @@ def main():
|
||||||
help='Override username used when launching the game (only works with some titles)')
|
help='Override username used when launching the game (only works with some titles)')
|
||||||
launch_parser.add_argument('--dry-run', dest='dry_run', action='store_true',
|
launch_parser.add_argument('--dry-run', dest='dry_run', action='store_true',
|
||||||
help='Print the command line that would have been used to launch the game and exit')
|
help='Print the command line that would have been used to launch the game and exit')
|
||||||
|
launch_parser.add_argument('--language', dest='language', action='store', metavar='<two letter language code>',
|
||||||
|
help='Override language for game launch (defaults to system settings)')
|
||||||
if os.name != 'nt':
|
if os.name != 'nt':
|
||||||
launch_parser.add_argument('--wine', dest='wine_bin', action='store', metavar='<wine binary>',
|
launch_parser.add_argument('--wine', dest='wine_bin', action='store', metavar='<wine binary>',
|
||||||
default=os.environ.get('LGDRY_WINE_BINARY', None),
|
default=os.environ.get('LGDRY_WINE_BINARY', None),
|
||||||
|
|
|
@ -9,6 +9,7 @@ import shutil
|
||||||
from base64 import b64decode
|
from base64 import b64decode
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
|
from locale import getdefaultlocale
|
||||||
from multiprocessing import Queue
|
from multiprocessing import Queue
|
||||||
from random import choice as randchoice
|
from random import choice as randchoice
|
||||||
from requests.exceptions import HTTPError
|
from requests.exceptions import HTTPError
|
||||||
|
@ -46,6 +47,7 @@ class LegendaryCore:
|
||||||
self.lgd = LGDLFS()
|
self.lgd = LGDLFS()
|
||||||
|
|
||||||
self.local_timezone = datetime.now().astimezone().tzinfo
|
self.local_timezone = datetime.now().astimezone().tzinfo
|
||||||
|
self.language_code, self.country_code = ('en', 'US')
|
||||||
|
|
||||||
# epic lfs only works on Windows right now
|
# epic lfs only works on Windows right now
|
||||||
if os.name == 'nt':
|
if os.name == 'nt':
|
||||||
|
@ -53,6 +55,22 @@ class LegendaryCore:
|
||||||
else:
|
else:
|
||||||
self.egl = None
|
self.egl = None
|
||||||
|
|
||||||
|
def get_locale(self):
|
||||||
|
locale = self.lgd.config.get('Legendary', 'locale', fallback=getdefaultlocale()[0])
|
||||||
|
|
||||||
|
if locale:
|
||||||
|
try:
|
||||||
|
self.language_code, self.country_code = locale.split('-' if '-' in locale else '_')
|
||||||
|
self.log.debug(f'Set locale to {self.language_code}-{self.country_code}')
|
||||||
|
|
||||||
|
# if egs is loaded make sure to override its language setting as well
|
||||||
|
if self.egs:
|
||||||
|
self.egs.language_code, self.egs.country_code = self.language_code, self.country_code
|
||||||
|
except Exception as e:
|
||||||
|
self.log.warning(f'Getting locale failed: {e!r}, falling back to using en-US.')
|
||||||
|
else:
|
||||||
|
self.log.warning(f'Could not determine locale, falling back to en-US')
|
||||||
|
|
||||||
def auth(self, username, password):
|
def auth(self, username, password):
|
||||||
"""
|
"""
|
||||||
Attempts direct non-web login, raises CaptchaError if manual login is required
|
Attempts direct non-web login, raises CaptchaError if manual login is required
|
||||||
|
@ -158,6 +176,8 @@ class LegendaryCore:
|
||||||
def get_game_and_dlc_list(self, update_assets=True,
|
def get_game_and_dlc_list(self, update_assets=True,
|
||||||
platform_override=None,
|
platform_override=None,
|
||||||
skip_ue=True) -> (List[Game], Dict[str, Game]):
|
skip_ue=True) -> (List[Game], Dict[str, Game]):
|
||||||
|
# resolve locale
|
||||||
|
self.get_locale()
|
||||||
_ret = []
|
_ret = []
|
||||||
_dlc = defaultdict(list)
|
_dlc = defaultdict(list)
|
||||||
|
|
||||||
|
@ -209,7 +229,8 @@ class LegendaryCore:
|
||||||
|
|
||||||
def get_launch_parameters(self, app_name: str, offline: bool = False,
|
def get_launch_parameters(self, app_name: str, offline: bool = False,
|
||||||
user: str = None, extra_args: list = None,
|
user: str = None, extra_args: list = None,
|
||||||
wine_bin: str = None, wine_pfx: str = None) -> (list, str, dict):
|
wine_bin: str = None, wine_pfx: str = None,
|
||||||
|
language: str = None) -> (list, str, dict):
|
||||||
install = self.lgd.get_installed_game(app_name)
|
install = self.lgd.get_installed_game(app_name)
|
||||||
game = self.lgd.get_game_meta(app_name)
|
game = self.lgd.get_game_meta(app_name)
|
||||||
|
|
||||||
|
@ -260,11 +281,16 @@ class LegendaryCore:
|
||||||
f.write(ovt)
|
f.write(ovt)
|
||||||
params.append(f'-epicovt={ovt_path}')
|
params.append(f'-epicovt={ovt_path}')
|
||||||
|
|
||||||
|
language_code = self.lgd.config.get(app_name, 'language', fallback=language)
|
||||||
|
if not language_code: # fall back to system or config language
|
||||||
|
self.get_locale()
|
||||||
|
language_code = self.language_code
|
||||||
|
|
||||||
params.extend([
|
params.extend([
|
||||||
'-EpicPortal',
|
'-EpicPortal',
|
||||||
f'-epicusername={user_name}',
|
f'-epicusername={user_name}',
|
||||||
f'-epicuserid={account_id}',
|
f'-epicuserid={account_id}',
|
||||||
'-epiclocale=en'
|
f'-epiclocale={language_code}'
|
||||||
])
|
])
|
||||||
|
|
||||||
if extra_args:
|
if extra_args:
|
||||||
|
|
Loading…
Reference in a new issue