AIGC标识 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 的多语言使用流程主要分为四步:

  1. 设置 setReloadLanguageCallback
  2. 调用 setCurrentLanguage 加载当前语言
  3. 静态文本挂 LocalizationText
  4. 动态文本使用 setText(..., this) 注册

动态图片使用:

setLocalizationImage(
	"StartButton_Chinese",
	this);

LocalizationManager 的核心作用,是让 UI 只关心自己的中文原文或文本 ID,而不用分别处理每一种语言:

语言数据由外部提供
LocalizationManager 统一查询
UI 注册需要显示的内容
语言切换后自动刷新

这样新增语言时,主要工作集中在翻译数据和图片资源中,不需要逐个修改界面的业务逻辑。

posted @ 2026-07-27 00:50  _zhourui_h  阅读(3)  评论(0)    收藏  举报