如何让pygame-ce游戏在pygbag网页与桌面端获取语言代码?
适配Pygame-CE桌面端与Pygbag网页端的多语言解决方案
方案1:跨环境自动检测语言(推荐)
直接在Python代码中判断运行环境,分别采用对应方式获取语言:
- 桌面端沿用原有的
locale.getdefaultlocale()逻辑 - 网页端通过pygbag提供的
js模块调用浏览器API获取用户语言,再转换为游戏所需的xx_XX格式
代码实现:
import locale import sys import json def get_user_language(): # 判断是否处于pygbag网页环境(emscripten是pygbag的编译后端) if sys.platform == 'emscripten': import js # 优先取浏览器首选语言数组的第一项,无则取单语言值 raw_lang = js.navigator.languages[0] if hasattr(js.navigator, 'languages') else js.navigator.language # 把en-US格式转为en_US,适配JSON文件命名 lang_code = raw_lang.replace('-', '_') # 补全缩写格式(如en → en_US) if '_' not in lang_code: lang_code += '_US' if lang_code == 'en' else '_' + lang_code.upper() return lang_code else: # 桌面端逻辑,获取失败则返回默认值 default_locale = locale.getdefaultlocale()[0] return default_locale if default_locale else 'en_US' def load_language_pack(lang_code): try: with open(f'languages/{lang_code}.json', 'r', encoding='utf-8') as f: return json.load(f) except FileNotFoundError: # 语言文件不存在时加载默认英文包 with open('languages/en_US.json', 'r', encoding='utf-8') as f: return json.load(f) # 初始化语言包 current_lang = load_language_pack(get_user_language())
方案2:修改index.html提前传递语言
如果需要在Python代码执行前就获取语言(比如预加载资源),可以修改pygbag生成的index.html:
- 在页面的
<script>标签中添加语言获取逻辑,存到全局变量:
<script> function getBrowserLanguage() { const lang = navigator.languages ? navigator.languages[0] : navigator.language; let formattedLang = lang.replace('-', '_'); if (!formattedLang.includes('_')) { formattedLang = formattedLang === 'en' ? 'en_US' : `${formattedLang}_${formattedLang.toUpperCase()}`; } return formattedLang; } // 挂载到window全局对象供Python调用 window.gameUserLang = getBrowserLanguage(); </script>
- 在Python代码中读取全局变量:
import sys import locale import json def get_user_language(): if sys.platform == 'emscripten': import js return js.window.gameUserLang else: default_locale = locale.getdefaultlocale()[0] return default_locale if default_locale else 'en_US' # 后续加载语言包逻辑同方案1
方案3:添加手动语言选择作为 fallback
自动检测可能存在偏差,可在游戏设置中加入手动切换功能,兼容所有环境:
# 定义支持的语言列表(键为JSON文件名,值为显示名称) SUPPORTED_LANGUAGES = { 'en_US': 'English', 'zh_CN': '简体中文', 'ja_JP': '日本語' } current_language = {} def switch_language(lang_code): global current_language if lang_code in SUPPORTED_LANGUAGES: try: with open(f'languages/{lang_code}.json', 'r', encoding='utf-8') as f: current_language = json.load(f) except FileNotFoundError: load_default_language() else: load_default_language() def load_default_language(): global current_language with open('languages/en_US.json', 'r', encoding='utf-8') as f: current_language = json.load(f) # 初始化时加载自动检测的语言 switch_language(get_user_language())
内容的提问来源于stack exchange,提问作者Vinicius
相关产品推荐
相关产品推荐

