Files
PortProtonQt/portprotonqt/localization.py
2025-07-06 13:10:37 +05:00

105 lines
4.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import gettext
from pathlib import Path
import locale
import os
from babel import Locale
LOCALE_MAP = {
'ru': 'russian',
'en': 'english',
'fr': 'french',
'de': 'german',
'es': 'spanish',
'it': 'italian',
'zh': 'schinese',
'zh_Hant': 'tchinese',
'ja': 'japanese',
'ko': 'koreana',
'pt': 'brazilian',
'pl': 'polish',
'nl': 'dutch',
'sv': 'swedish',
'no': 'norwegian',
'da': 'danish',
'fi': 'finnish',
'cs': 'czech',
'hu': 'hungarian',
'tr': 'turkish',
'ro': 'romanian',
'th': 'thai',
'uk': 'ukrainian',
'bg': 'bulgarian',
'el': 'greek',
}
translate = gettext.translation(
domain="messages",
localedir = Path(__file__).parent / "locales",
fallback=True,
)
_ = translate.gettext
def get_system_locale():
"""Возвращает системную локаль, например, 'ru_RU'. Если не удаётся определить возвращает 'en'."""
loc = locale.getdefaultlocale()[0]
return loc if loc else 'en'
def get_steam_language():
try:
# Babel автоматически разбирает сложные локали, например, 'zh_Hant_HK' → 'zh_Hant'
system_locale = get_system_locale()
if system_locale:
locale = Locale.parse(system_locale)
# Используем только языковой код ('ru', 'en', и т.д.)
language_code = locale.language
return LOCALE_MAP.get(language_code, 'english')
except Exception as e:
print(f"Failed to detect locale: {e}")
# Если что-то пошло не так — используем английский по умолчанию
return 'english'
def get_egs_language():
try:
# Babel автоматически разбирает сложные локали, например, 'zh_Hant_HK' → 'zh_Hant'
system_locale = get_system_locale()
if system_locale:
locale = Locale.parse(system_locale)
# Используем только языковой код ('ru', 'en', и т.д.)
language_code = locale.language
return language_code
except Exception as e:
print(f"Failed to detect locale: {e}")
# Если что-то пошло не так — используем английский по умолчанию
return 'en'
def read_metadata_translations(metadata_file, language_code):
"""
Читает переводы из metadata.txt для указанного языка.
Возвращает словарь с полями name и description.
Для name: использует name_<language_code>, затем name_en, затем name, и наконец _('Unknown Game').
Для description: использует description_<language_code>, затем description_en, затем description.
"""
translations = {'name': _('Unknown Game'), 'description': ''}
if not os.path.exists(metadata_file):
return translations
with open(metadata_file, encoding='utf-8') as f:
for line in f:
line = line.strip()
if line.startswith(f'name_{language_code}='):
translations['name'] = line[len(f'name_{language_code}='):].strip()
elif line.startswith('name_en=') and translations['name'] == _('Unknown Game'):
translations['name'] = line[len('name_en='):].strip()
elif line.startswith('name=') and translations['name'] == _('Unknown Game'):
translations['name'] = line[len('name='):].strip()
elif line.startswith(f'description_{language_code}='):
translations['description'] = line[len(f'description_{language_code}='):].strip()
elif line.startswith('description_en=') and not translations['description']:
translations['description'] = line[len('description_en='):].strip()
elif line.startswith('description=') and not translations['description']:
translations['description'] = line[len('description='):].strip()
return translations