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,
Dictionary<string, string> textList,
Dictionary<int, 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();
查询当前 Locale:
string 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 的多语言使用流程主要分为四步:
- 设置 setReloadLanguageCallback
- 调用 setCurrentLanguage 加载当前语言
- 静态文本挂 LocalizationText
- 动态文本使用 setText(..., this) 注册
动态图片使用:
setLocalizationImage(
"StartButton_Chinese",
this);
LocalizationManager 的核心作用,是让 UI 只关心自己的中文原文或文本 ID,而不用分别处理每一种语言:
语言数据由外部提供
LocalizationManager 统一查询
UI 注册需要显示的内容
语言切换后自动刷新
这样新增语言时,主要工作集中在翻译数据和图片资源中,不需要逐个修改界面的业务逻辑。
游戏接入多语言后,不能只在切换语言时重新打开所有界面。已经显示的文本、动态数量提示和本地化图片,都应该立即刷新。
MyFramework 使用 LocalizationManager 保存当前语言数据,并统一管理已经注册的 UI 对象。
浙公网安备 33010602011771号