如何用Unity Localization翻译脚本中带数值的TextMeshPro文本?
Unity TextMeshPro 动态数值文本本地化实现方案
针对你脚本中带动态数值的文本(如「Coins」「DEATH COUNT」拼接数值),核心思路是将静态文本部分存入本地化表,通过占位符标记变量位置,再在脚本中结合动态数值格式化字符串,以下是具体实现步骤:
1. 配置本地化字符串表
不管你使用Unity官方的Localization Package还是第三方本地化工具,先添加两个本地化键值对:
- 键:
SaveSlot_Coins,对应多语言值示例:- 英文:
"Coins: {0}" - 中文:
"金币: {0}"
- 英文:
- 键:
SaveSlot_DeathCount,对应多语言值示例:- 英文:
"DEATH COUNT: {0}" - 中文:
"死亡次数: {0}"
- 英文:
注:
{0}是占位符,用来后续插入动态数值
2. 修改SaveSlot脚本
替换原脚本中直接拼接文本的代码,根据你使用的本地化工具选择对应实现:
方案一:使用Unity官方Localization Package
确保已导入Unity Localization Package,然后修改SetData方法中的文本赋值部分:
// 替换原来的CoinText和deathCountText赋值代码 CoinText.text = LocalizationSettings.StringDatabase.GetLocalizedString("你的字符串表名称", "SaveSlot_Coins", data.coin); deathCountText.text = LocalizationSettings.StringDatabase.GetLocalizedString("你的字符串表名称", "SaveSlot_DeathCount", data.deathCount);
提示:
"你的字符串表名称"替换为你在本地化系统中创建的字符串表名称
方案二:通用兼容(适配第三方本地化工具)
如果使用I2 Localization等第三方工具,或自己实现的本地化逻辑,可通过string.Format完成拼接:
// 先获取本地化静态文本,再格式化插入数值 string coinsLocalized = 你的本地化工具.GetTranslation("SaveSlot_Coins"); CoinText.text = string.Format(coinsLocalized, data.coin); string deathCountLocalized = 你的本地化工具.GetTranslation("SaveSlot_DeathCount"); deathCountText.text = string.Format(deathCountLocalized, data.deathCount);
修改后的完整SaveSlot脚本(以官方Localization Package为例)
using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; using UnityEngine.UI; using UnityEngine.Localization; using UnityEngine.Localization.Settings; // 引入本地化命名空间 public class SaveSlot : MonoBehaviour { [Header("Profile")] [SerializeField] private string profileId = ""; [Header("Content")] [SerializeField] private GameObject noDataContent; [SerializeField] private GameObject hasDataContent; [SerializeField] private TextMeshProUGUI CoinText; [SerializeField] private TextMeshProUGUI deathCountText; [Header("Clear Data Button")] [SerializeField] private Button clearButton; public bool hasData { get; private set; } = false; private Button saveSlotButton; private void Awake() { saveSlotButton = this.GetComponent<Button>(); } public void SetData(GameData data) { if (data == null) { hasData = false; noDataContent.SetActive(true); hasDataContent.SetActive(false); clearButton.gameObject.SetActive(false); } else { hasData = true; noDataContent.SetActive(false); hasDataContent.SetActive(true); clearButton.gameObject.SetActive(true); // 本地化赋值代码 CoinText.text = LocalizationSettings.StringDatabase.GetLocalizedString("SaveSlotTable", "SaveSlot_Coins", data.coin); deathCountText.text = LocalizationSettings.StringDatabase.GetLocalizedString("SaveSlotTable", "SaveSlot_DeathCount", data.deathCount); } } public string GetProfileId() { return this.profileId; } public void SetInteractable(bool interactable) { saveSlotButton.interactable = interactable; clearButton.interactable = interactable; } }
关键说明
- 占位符支持多个变量:如果需要插入多个数值,可使用
{0}``{1}等依次标记,格式化时传入对应参数即可 - 数值格式化:如果需要对数值做格式处理(如保留小数、千分位),可在占位符中指定格式,比如
"金币: {0:N0}"表示整数格式,本地化后再格式化即可
内容的提问来源于stack exchange,提问作者CookieM_2019
相关产品推荐
相关产品推荐

