Unity MyFramework 用法说明(十八):使用 LocalizationManager 统一管理多语言文本与图片

📅 2026/7/27 2:58:24
Unity MyFramework 用法说明(十八):使用 LocalizationManager 统一管理多语言文本与图片
游戏接入多语言后不能只在切换语言时重新打开所有界面。已经显示的文本、动态数量提示和本地化图片都应该立即刷新。MyFramework 使用LocalizationManager保存当前语言数据并统一管理已经注册的 UI 对象。项目地址https://github.com/ZHOURUIH/MyFramework一、LocalizationManager 负责什么框架中的本地化流程可以概括为外部读取语言表 ↓ 填充当前语言字典 ↓ UI 注册中文原文或文本ID ↓ 切换语言 ↓ 所有已注册文本和图片自动刷新LocalizationManager不限制语言数据来自哪里可以使用Excel JSON SQLite 服务器配置它主要负责保存当前语言 查询翻译文本 刷新已注册的UI 处理带参数文本 切换本地化图片二、为框架提供语言数据首先设置语言数据刷新回调using System.Collections.Generic; using static FrameBaseDefine; using static FrameBaseHotFix; public static class GameLocalization { public static void init() { mLocalizationManager.setReloadLanguageCallback( reloadLanguage); mLocalizationManager.setCurrentLanguage( LANGUAGE_CHINESE); } private static void reloadLanguage( string language, Dictionarystring, string textList, Dictionaryint, string idList) { if (language LANGUAGE_ENGLISH) { textList[开始游戏] Start Game; textList[退出游戏] Exit Game; textList[获得{0}个{1}] Received {0} {1}; textList[金币] Gold; idList[1001] Start Game; idList[1002] Exit Game; } else { textList[开始游戏] 开始游戏; textList[退出游戏] 退出游戏; textList[获得{0}个{1}] 获得{0}个{1}; textList[金币] 金币; idList[1001] 开始游戏; idList[1002] 退出游戏; } } }实际项目中不需要手动填写这些内容只要在reloadLanguage()中读取对应语言的表格即可。框架支持两种查询方式以中文原文为Key 以整数ID为Key中文原文更直观整数 ID 更适合由配置表统一管理。三、切换当前语言切换为英文mLocalizationManager.setCurrentLanguage( LANGUAGE_ENGLISH);切换为简体中文mLocalizationManager.setCurrentLanguage( LANGUAGE_CHINESE);调用setCurrentLanguage()后框架会依次完成清空旧语言数据 调用外部回调加载新语言 记录当前语言 刷新所有语言切换回调 刷新已注册文本 刷新已注册图片查询当前语言string language mLocalizationManager.getCurrentLanguage();查询当前 Localestring locale mLocalizationManager.getCurrentLocale();框架默认提供的对应关系包括Chinese zh_CN ChineseTraditional zh_TW English en-US四、静态文本使用 LocalizationText有些文本只负责显示不会在代码中修改例如开始游戏 设置 退出游戏 角色信息这类节点可以直接挂Text LocalizationText在Text中填写中文原文开始游戏运行后LocalizationText会自动保存中文原文 注册语言切换回调 根据当前语言设置文本 对象销毁时注销回调切换语言时不需要业务代码重新寻找这些节点。LocalizationText还可以为不同语言配置不同字体大小避免英文或繁体文本显示不完整。五、动态文本通过代码注册需要在代码中访问和修改的文本不应该挂LocalizationText而是通过myUGUIText.setText()注册。例如主菜单public class UIMain : LayoutScript { protected myUGUIText mStartText; protected myUGUIText mExitText; public override void assignWindow() { newObject(out mStartText, StartButton/Text); newObject(out mExitText, ExitButton/Text); } public override void onGameState() { base.onGameState(); mStartText.setText(开始游戏, this); mExitText.setText(退出游戏, this); } }这里的this是当前LayoutScript用于收集本界面注册的本地化对象。界面隐藏时LayoutScript会自动注销这些对象界面显示 ↓ onGameState 注册本地化文本 ↓ 语言切换时自动刷新 ↓ 界面隐藏 ↓ 自动注销本地化对象所以动态文本通常应在onGameState()中注册而不是只在init()中注册一次。六、使用带参数文本数量、名称等动态内容可以使用占位符mRewardText.setText( 获得{0}个{1}, rewardCount.IToS(), 金币, this);英文语言表中配置textList[获得{0}个{1}] Received {0} {1}; textList[金币] Gold;最终显示结果中文获得10个金币 英文Received 10 Gold框架不仅会翻译主文本也会尝试翻译传入的字符串参数。因此参数既可以是普通数值也可以是另一个需要翻译的文本。七、使用文本 ID通过文本 ID 注册mStartText.setText(1001, this); mExitText.setText(1002, this);直接获取翻译结果string text mLocalizationManager.getLocalize(1001);找不到指定 ID 时框架会返回Localization:1001这样可以比较直观地发现缺失的语言配置。中文原文和整数 ID 可以同时使用但同一类文本最好保持统一规则避免语言表难以维护。八、动态文本的字体适配代码中动态访问的文本不要再挂LocalizationText。需要根据语言调整字号时可以挂LocalizationRuntimeText它不会负责翻译文本只负责记录不同语言的字号 监听语言切换 调整当前Text字号 协助编辑器检查动态文本同一个节点不能同时挂LocalizationText LocalizationRuntimeText框架检测到后会直接输出错误。九、本地化图片某些图片中直接包含文字例如开始按钮 活动标题 新手引导提示 排行榜标签可以准备同一套命名StartButton_Chinese StartButton_English StartButton_ChineseTraditional动态访问的图片通过代码注册mStartButton.setLocalizationImage( StartButton_Chinese, this);框架会去掉末尾的语言名称再拼接当前语言StartButton_ English ↓ StartButton_English切换语言后已经注册的图片会自动调用setSpriteName()更新。这些图片应放在同一个图集中并保持除语言后缀外的名称完全一致。十、直接获取翻译文本并不是所有翻译内容都用于 UI。普通业务代码也可以直接查询string startText mLocalizationManager.getLocalize(开始游戏); string exitText mLocalizationManager.getLocalize(1002);带参数查询string rewardText mLocalizationManager.getLocalize( 获得{0}个{1}, rewardCount.IToS(), 金币);适合用于系统提示 聊天文本 日志显示 通知内容 动态拼接描述十一、总结MyFramework 的多语言使用流程主要分为四步1. 设置 setReloadLanguageCallback 2. 调用 setCurrentLanguage 加载当前语言 3. 静态文本挂 LocalizationText 4. 动态文本使用 setText(..., this) 注册动态图片使用setLocalizationImage( StartButton_Chinese, this);LocalizationManager的核心作用是让 UI 只关心自己的中文原文或文本 ID而不用分别处理每一种语言语言数据由外部提供 LocalizationManager 统一查询 UI 注册需要显示的内容 语言切换后自动刷新这样新增语言时主要工作集中在翻译数据和图片资源中不需要逐个修改界面的业务逻辑。