Unity WebGL项目语言本地化:实现浏览器跟随Windows系统语言
解决Unity WebGL项目跟随Windows系统语言的问题
问题原因
在WebGL环境中,Unity的Application.systemLanguage会读取浏览器的语言设置,而非Windows系统原生语言,这就导致浏览器端和编辑器的语言切换行为不一致。要获取系统语言,需要借助JavaScript来读取系统的语言偏好。
实现方案
1. 编写JS桥接文件
在Unity项目的Assets/Plugins/WebGL目录下新建一个SystemLanguage.jslib文件,代码如下:
mergeInto(LibraryManager.library, { GetSystemLanguage: function() { // 优先获取Windows系统语言,兼容不同浏览器 var systemLang = navigator.userLanguage || navigator.language; return Pointer_stringify(UTF8ToString(systemLang)); } });
2. 修改C#本地化逻辑
更新你的语言管理脚本,替换原有的系统语言识别逻辑,改为调用JS获取系统语言:
using UnityEngine; using UnityEngine.UI; using System.Runtime.InteropServices; public class LanguageManager : MonoBehaviour { [SerializeField] private Dropdown dropdown; // 导入JS方法 [DllImport("__Internal")] private static extern string GetSystemLanguage(); public void SetLanguage(int value) { Lean.Localization.LeanLocalization.CurrentLanguage = value == 0 ? "Russian" : "English"; } private string DefineCurrentLanguage() { string systemLangCode = ""; // WebGL环境调用JS,编辑器环境保留原有逻辑 #if UNITY_WEBGL && !UNITY_EDITOR systemLangCode = GetSystemLanguage().ToLower(); #else systemLangCode = Application.systemLanguage.ToString().ToLower(); #endif if (systemLangCode.StartsWith("ru")) { Debug.Log("系统语言为俄语"); return "Russian"; } else if (systemLangCode.StartsWith("en")) { Debug.Log("系统语言为英语"); return "English"; } else { Debug.Log("未识别系统语言,默认使用英语"); return "English"; } } private void SetLanguage(string lang) { Lean.Localization.LeanLocalization.CurrentLanguage = lang; } private void Awake() { SetLanguage(DefineCurrentLanguage()); dropdown.value = Lean.Localization.LeanLocalization.CurrentLanguage == "Russian" ? 0 : 1; } }
3. 关键说明
navigator.userLanguage是针对Windows系统的浏览器属性,能直接获取系统语言;navigator.language作为兼容兜底,覆盖更多浏览器场景。- 通过宏判断区分WebGL和编辑器环境,保证两端逻辑各自正常运行。
- 用
StartsWith判断语言代码,兼容带地区后缀的格式(如ru-RU、en-US)。
内容的提问来源于stack exchange,提问作者gojim
相关产品推荐
相关产品推荐

