Localization 本地化组件 - 提供完整的多语言本地化解决方案,支持动态语言切换、字符串格式化和系统语言检测。
https://github.com/AlianBlank/com.gameframex.unity.localization.git
在项目的 Packages/manifest.json 文件中添加:
{
"dependencies": {
"com.gameframex.unity.localization": "https://github.com/AlianBlank/com.gameframex.unity.localization.git"
}
}
Packages 目录下本组件依赖以下 GameFrameX 模块:
GameFrameX.Runtime - 核心运行时模块GameFrameX.Event.Runtime - 事件系统模块GameFrameX.Asset.Runtime - 资源管理模块GameFrameX.Setting.Runtime - 设置管理模块在场景中的 GameFrameX 管理器上添加 LocalizationComponent 组件:
// 组件会自动初始化,无需手动代码
// 获取本地化组件
var localization = GameEntry.GetComponent<LocalizationComponent>();
// 设置语言
localization.Language = "zh_CN"; // 中文
localization.Language = "en_US"; // 英文
// 获取本地化字符串
string text = localization.GetString("UI.Button.OK");
// 带参数的本地化字符串
string message = localization.GetString("UI.Message.Welcome", playerName);
string info = localization.GetString("UI.Info.Score", score, level);
// 检查字典是否存在
bool exists = localization.HasRawString("UI.Button.Cancel");
// 获取原始字符串
string rawText = localization.GetRawString("UI.Button.Cancel");
// 添加字典项
localization.AddRawString("UI.Button.NewButton", "新按钮");
// 移除字典项
bool removed = localization.RemoveRawString("UI.Button.Cancel");
// 清空所有字典
localization.RemoveAllRawStrings();
// 订阅语言变化事件
GameEntry.GetComponent<EventComponent>().Subscribe(
LocalizationLanguageChangeEventArgs.EventId,
OnLanguageChanged);
private void OnLanguageChanged(object sender, GameEventArgs e)
{
var args = (LocalizationLanguageChangeEventArgs)e;
Debug.Log($"语言从 {args.OldLanguage} 切换到 {args.Language}");
// 更新UI显示
RefreshUI();
}
创建自定义的本地化辅助器来扩展功能:
public class CustomLocalizationHelper : LocalizationHelperBase
{
public override string SystemLanguage
{
get
{
// 自定义系统语言检测逻辑
return GetCustomSystemLanguage();
}
}
private string GetCustomSystemLanguage()
{
// 实现自定义的系统语言检测
// 例如:从服务器获取、用户偏好设置等
return "zh_CN";
}
}
在 Inspector 面板中可以配置以下选项:
| 方法 | 描述 |
|---|---|
GetString(string key) | 获取本地化字符串 |
GetString<T>(string key, T arg) | 获取带1个参数的本地化字符串 |
GetString<T1,T2>(string key, T1 arg1, T2 arg2) | 获取带2个参数的本地化字符串 |
HasRawString(string key) | 检查字典项是否存在 |
GetRawString(string key) | 获取原始字典值 |
AddRawString(string key, string value) | 添加字典项 |
RemoveRawString(string key) | 移除字典项 |
RemoveAllRawStrings() | 清空所有字典 |
| 属性 | 类型 | 描述 |
|---|---|---|
Language | string | 当前语言 |
DefaultLanguage | string | 默认语言 |
SystemLanguage | string | 系统语言(只读) |
DictionaryCount | int | 字典项数量(只读) |
| 事件 | 描述 |
|---|---|
LocalizationLanguageChangeEventArgs | 语言变化事件 |
本组件遵循 RFC 5646 语言标签标准:
zh_CN - 简体中文zh_TW - 繁体中文en_US - 美式英语en_GB - 英式英语ja_JP - 日语ko_KR - 韩语建议使用层级化的命名方式:
// UI相关
"UI.Button.OK"
"UI.Button.Cancel"
"UI.Message.Welcome"
// 游戏内容相关
"Game.Item.Sword"
"Game.Skill.Fireball"
"Game.Achievement.FirstWin"
// 错误信息相关
"Error.Network.Timeout"
"Error.Login.InvalidPassword"
合理使用参数化字符串,避免字符串拼接:
// 推荐
"UI.Message.PlayerLevel" = "玩家等级:{0}"
localization.GetString("UI.Message.PlayerLevel", level);
// 不推荐
"UI.Message.PlayerLevel" = "玩家等级:"
text = localization.GetString("UI.Message.PlayerLevel") + level;
在合适的时机进行语言切换,避免频繁切换:
// 在游戏启动时设置
private void Start()
{
var savedLanguage = PlayerPrefs.GetString("Language", "");
if (string.IsNullOrEmpty(savedLanguage))
{
// 使用系统语言
localization.Language = localization.SystemLanguage;
}
else
{
localization.Language = savedLanguage;
}
}
// 保存用户选择的语言
private void SaveLanguagePreference(string language)
{
PlayerPrefs.SetString("Language", language);
PlayerPrefs.Save();
}
zh_CN),而不是连字符格式本项目采用 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。详细信息请查看 LICENSE 文件。
GameFrameX - 让游戏开发更简单!