You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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:

  1. 在页面的<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>
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:13:20